Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(708)

Side by Side Diff: src/gpu/GrDrawState.h

Issue 508663002: Create an optimized draw state but not hooked in yet to gpu pipeline (Closed) Base URL: https://skia.googlesource.com/skia.git@drawBase
Patch Set: Nits Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gyp/gpu.gypi ('k') | src/gpu/GrDrawState.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrDrawState_DEFINED 8 #ifndef GrDrawState_DEFINED
9 #define GrDrawState_DEFINED 9 #define GrDrawState_DEFINED
10 10
11 #include "GrBlend.h" 11 #include "GrBlend.h"
12 #include "GrOptDrawState.h"
12 #include "GrProgramResource.h" 13 #include "GrProgramResource.h"
13 #include "GrRODrawState.h" 14 #include "GrRODrawState.h"
14 #include "effects/GrSimpleTextureEffect.h" 15 #include "effects/GrSimpleTextureEffect.h"
15 16
16 /** 17 /**
17 * Modifiable subclass derived from GrRODrawState. The majority of the data that represents a draw 18 * Modifiable subclass derived from GrRODrawState. The majority of the data that represents a draw
18 * state is stored in the parent class. GrDrawState contains methods for setting , adding to, etc. 19 * state is stored in the parent class. GrDrawState contains methods for setting , adding to, etc.
19 * various data members of the draw state. This class is used to configure the s tate used when 20 * various data members of the draw state. This class is used to configure the s tate used when
20 * issuing draws via GrDrawTarget. 21 * issuing draws via GrDrawTarget.
21 */ 22 */
22 class GrDrawState : public GrRODrawState { 23 class GrDrawState : public GrRODrawState {
23 public: 24 public:
24 SK_DECLARE_INST_COUNT(GrDrawState) 25 SK_DECLARE_INST_COUNT(GrDrawState)
25 26
26 GrDrawState() { 27 GrDrawState() : fCachedOptState(NULL) {
27 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 28 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
28 this->reset(); 29 this->reset();
29 } 30 }
30 31
31 GrDrawState(const SkMatrix& initialViewMatrix) { 32 GrDrawState(const SkMatrix& initialViewMatrix) : fCachedOptState(NULL) {
32 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 33 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
33 this->reset(initialViewMatrix); 34 this->reset(initialViewMatrix);
34 } 35 }
35 36
36 /** 37 /**
37 * Copies another draw state. 38 * Copies another draw state.
38 **/ 39 **/
39 GrDrawState(const GrDrawState& state) : INHERITED() { 40 GrDrawState(const GrDrawState& state) : INHERITED(), fCachedOptState(NULL) {
40 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 41 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
41 *this = state; 42 *this = state;
42 } 43 }
43 44
44 /** 45 /**
45 * Copies another draw state with a preconcat to the view matrix. 46 * Copies another draw state with a preconcat to the view matrix.
46 **/ 47 **/
47 GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix); 48 GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix);
48 49
49 virtual ~GrDrawState() { SkASSERT(0 == fBlockEffectRemovalCnt); } 50 virtual ~GrDrawState() {
51 SkSafeUnref(fCachedOptState);
52 SkASSERT(0 == fBlockEffectRemovalCnt);
53 }
50 54
51 /** 55 /**
52 * Resets to the default state. GrEffects will be removed from all stages. 56 * Resets to the default state. GrEffects will be removed from all stages.
53 */ 57 */
54 void reset() { this->onReset(NULL); } 58 void reset() { this->onReset(NULL); }
55 59
56 void reset(const SkMatrix& initialViewMatrix) { this->onReset(&initialViewMa trix); } 60 void reset(const SkMatrix& initialViewMatrix) { this->onReset(&initialViewMa trix); }
57 61
58 /** 62 /**
59 * Initializes the GrDrawState based on a GrPaint, view matrix and render ta rget. Note that 63 * Initializes the GrDrawState based on a GrPaint, view matrix and render ta rget. Note that
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 */ 97 */
94 void setDefaultVertexAttribs(); 98 void setDefaultVertexAttribs();
95 99
96 /** 100 /**
97 * Helper to save/restore vertex attribs 101 * Helper to save/restore vertex attribs
98 */ 102 */
99 class AutoVertexAttribRestore { 103 class AutoVertexAttribRestore {
100 public: 104 public:
101 AutoVertexAttribRestore(GrDrawState* drawState); 105 AutoVertexAttribRestore(GrDrawState* drawState);
102 106
103 ~AutoVertexAttribRestore() { fDrawState->internalSetVertexAttribs(fVAPt r, fVACount, fVAStride); } 107 ~AutoVertexAttribRestore() { fDrawState->internalSetVertexAttribs(fVAPt r, fVACount,
108 fVASt ride); }
104 109
105 private: 110 private:
106 GrDrawState* fDrawState; 111 GrDrawState* fDrawState;
107 const GrVertexAttrib* fVAPtr; 112 const GrVertexAttrib* fVAPtr;
108 int fVACount; 113 int fVACount;
109 size_t fVAStride; 114 size_t fVAStride;
110 }; 115 };
111 116
112 /// @} 117 /// @}
113 118
(...skipping 14 matching lines...) Expand all
128 /////////////////////////////////////////////////////////////////////////// 133 ///////////////////////////////////////////////////////////////////////////
129 /// @name Color 134 /// @name Color
130 //// 135 ////
131 136
132 /** 137 /**
133 * Sets color for next draw to a premultiplied-alpha color. 138 * Sets color for next draw to a premultiplied-alpha color.
134 * 139 *
135 * @param color the color to set. 140 * @param color the color to set.
136 */ 141 */
137 void setColor(GrColor color) { 142 void setColor(GrColor color) {
138 fColor = color; 143 if (color != fColor) {
139 this->invalidateBlendOptFlags(); 144 fColor = color;
145 this->invalidateOptState();
146 }
140 } 147 }
141 148
142 /** 149 /**
143 * Sets the color to be used for the next draw to be 150 * Sets the color to be used for the next draw to be
144 * (r,g,b,a) = (alpha, alpha, alpha, alpha). 151 * (r,g,b,a) = (alpha, alpha, alpha, alpha).
145 * 152 *
146 * @param alpha The alpha value to set as the color. 153 * @param alpha The alpha value to set as the color.
147 */ 154 */
148 void setAlpha(uint8_t a) { this->setColor((a << 24) | (a << 16) | (a << 8) | a); } 155 void setAlpha(uint8_t a) { this->setColor((a << 24) | (a << 16) | (a << 8) | a); }
149 156
150 /// @} 157 /// @}
151 158
152 /////////////////////////////////////////////////////////////////////////// 159 ///////////////////////////////////////////////////////////////////////////
153 /// @name Coverage 160 /// @name Coverage
154 //// 161 ////
155 162
156 /** 163 /**
157 * Sets a constant fractional coverage to be applied to the draw. The 164 * Sets a constant fractional coverage to be applied to the draw. The
158 * initial value (after construction or reset()) is 0xff. The constant 165 * initial value (after construction or reset()) is 0xff. The constant
159 * coverage is ignored when per-vertex coverage is provided. 166 * coverage is ignored when per-vertex coverage is provided.
160 */ 167 */
161 void setCoverage(uint8_t coverage) { 168 void setCoverage(uint8_t coverage) {
162 fCoverage = coverage; 169 if (coverage != fCoverage) {
163 this->invalidateBlendOptFlags(); 170 fCoverage = coverage;
171 this->invalidateOptState();
172 }
164 } 173 }
165 174
166 /// @} 175 /// @}
167 176
168 /** 177 /**
169 * The geometry processor is the sole element of the skia pipeline which can use the vertex, 178 * The geometry processor is the sole element of the skia pipeline which can use the vertex,
170 * geometry, and tesselation shaders. The GP may also compute a coverage in its fragment shader 179 * geometry, and tesselation shaders. The GP may also compute a coverage in its fragment shader
171 * but is never put in the color processing pipeline. 180 * but is never put in the color processing pipeline.
172 */ 181 */
173 182
174 const GrEffect* setGeometryProcessor(const GrEffect* effect, int attr0 = -1, int attr1 = -1) { 183 const GrEffect* setGeometryProcessor(const GrEffect* effect, int attr0 = -1, int attr1 = -1) {
175 SkASSERT(effect); 184 SkASSERT(effect);
176 SkASSERT(!this->hasGeometryProcessor()); 185 SkASSERT(!this->hasGeometryProcessor());
177 fGeometryProcessor.reset(new GrEffectStage(effect, attr0, attr1)); 186 fGeometryProcessor.reset(new GrEffectStage(effect, attr0, attr1));
178 this->invalidateBlendOptFlags(); 187 this->invalidateOptState();
179 return effect; 188 return effect;
180 } 189 }
181 190
182 /////////////////////////////////////////////////////////////////////////// 191 ///////////////////////////////////////////////////////////////////////////
183 /// @name Effect Stages 192 /// @name Effect Stages
184 /// Each stage hosts a GrEffect. The effect produces an output color or cove rage in the fragment 193 /// Each stage hosts a GrEffect. The effect produces an output color or cove rage in the fragment
185 /// shader. Its inputs are the output from the previous stage as well as som e variables 194 /// shader. Its inputs are the output from the previous stage as well as som e variables
186 /// available to it in the fragment and vertex shader (e.g. the vertex posit ion, the dst color, 195 /// available to it in the fragment and vertex shader (e.g. the vertex posit ion, the dst color,
187 /// the fragment position, local coordinates). 196 /// the fragment position, local coordinates).
188 /// 197 ///
189 /// The stages are divided into two sets, color-computing and coverage-compu ting. The final 198 /// The stages are divided into two sets, color-computing and coverage-compu ting. The final
190 /// color stage produces the final pixel color. The coverage-computing stage s function exactly 199 /// color stage produces the final pixel color. The coverage-computing stage s function exactly
191 /// as the color-computing but the output of the final coverage stage is tre ated as a fractional 200 /// as the color-computing but the output of the final coverage stage is tre ated as a fractional
192 /// pixel coverage rather than as input to the src/dst color blend step. 201 /// pixel coverage rather than as input to the src/dst color blend step.
193 /// 202 ///
194 /// The input color to the first color-stage is either the constant color or interpolated 203 /// The input color to the first color-stage is either the constant color or interpolated
195 /// per-vertex colors. The input to the first coverage stage is either a con stant coverage 204 /// per-vertex colors. The input to the first coverage stage is either a con stant coverage
196 /// (usually full-coverage) or interpolated per-vertex coverage. 205 /// (usually full-coverage) or interpolated per-vertex coverage.
197 /// 206 ///
198 /// See the documentation of kCoverageDrawing_StateBit for information about disabling the 207 /// See the documentation of kCoverageDrawing_StateBit for information about disabling the
199 /// the color / coverage distinction. 208 /// the color / coverage distinction.
200 //// 209 ////
201 210
202 const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int a ttr1 = -1) { 211 const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int a ttr1 = -1) {
203 SkASSERT(effect); 212 SkASSERT(effect);
204 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, att r1)); 213 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, att r1));
205 this->invalidateBlendOptFlags(); 214 this->invalidateOptState();
206 return effect; 215 return effect;
207 } 216 }
208 217
209 const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, in t attr1 = -1) { 218 const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, in t attr1 = -1) {
210 SkASSERT(effect); 219 SkASSERT(effect);
211 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0, attr1)); 220 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0, attr1));
212 this->invalidateBlendOptFlags(); 221 this->invalidateOptState();
213 return effect; 222 return effect;
214 } 223 }
215 224
216 /** 225 /**
217 * Creates a GrSimpleTextureEffect that uses local coords as texture coordin ates. 226 * Creates a GrSimpleTextureEffect that uses local coords as texture coordin ates.
218 */ 227 */
219 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) { 228 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) {
220 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->un ref(); 229 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->un ref();
221 } 230 }
222 231
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 * D' = sat(S*srcCoef + D*dstCoef) 303 * D' = sat(S*srcCoef + D*dstCoef)
295 * 304 *
296 * where D is the existing destination color, S is the incoming source 305 * where D is the existing destination color, S is the incoming source
297 * color, and D' is the new destination color that will be written. sat() 306 * color, and D' is the new destination color that will be written. sat()
298 * is the saturation function. 307 * is the saturation function.
299 * 308 *
300 * @param srcCoef coefficient applied to the src color. 309 * @param srcCoef coefficient applied to the src color.
301 * @param dstCoef coefficient applied to the dst color. 310 * @param dstCoef coefficient applied to the dst color.
302 */ 311 */
303 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { 312 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) {
304 fSrcBlend = srcCoeff; 313 if (srcCoeff != fSrcBlend || dstCoeff != fDstBlend) {
305 fDstBlend = dstCoeff; 314 fSrcBlend = srcCoeff;
306 this->invalidateBlendOptFlags(); 315 fDstBlend = dstCoeff;
316 this->invalidateOptState();
317 }
307 #ifdef SK_DEBUG 318 #ifdef SK_DEBUG
308 if (GrBlendCoeffRefsDst(dstCoeff)) { 319 if (GrBlendCoeffRefsDst(dstCoeff)) {
309 GrPrintf("Unexpected dst blend coeff. Won't work correctly with cove rage stages.\n"); 320 GrPrintf("Unexpected dst blend coeff. Won't work correctly with cove rage stages.\n");
310 } 321 }
311 if (GrBlendCoeffRefsSrc(srcCoeff)) { 322 if (GrBlendCoeffRefsSrc(srcCoeff)) {
312 GrPrintf("Unexpected src blend coeff. Won't work correctly with cove rage stages.\n"); 323 GrPrintf("Unexpected src blend coeff. Won't work correctly with cove rage stages.\n");
313 } 324 }
314 #endif 325 #endif
315 } 326 }
316 327
317 /** 328 /**
318 * Sets the blending function constant referenced by the following blending 329 * Sets the blending function constant referenced by the following blending
319 * coefficients: 330 * coefficients:
320 * kConstC_GrBlendCoeff 331 * kConstC_GrBlendCoeff
321 * kIConstC_GrBlendCoeff 332 * kIConstC_GrBlendCoeff
322 * kConstA_GrBlendCoeff 333 * kConstA_GrBlendCoeff
323 * kIConstA_GrBlendCoeff 334 * kIConstA_GrBlendCoeff
324 * 335 *
325 * @param constant the constant to set 336 * @param constant the constant to set
326 */ 337 */
327 void setBlendConstant(GrColor constant) { 338 void setBlendConstant(GrColor constant) {
328 fBlendConstant = constant; 339 if (constant != fBlendConstant) {
329 this->invalidateBlendOptFlags(); 340 fBlendConstant = constant;
341 this->invalidateOptState();
342 }
330 } 343 }
331 344
332 /**
333 * Determines what optimizations can be applied based on the blend. The coef ficients may have
334 * to be tweaked in order for the optimization to work. srcCoeff and dstCoef f are optional
335 * params that receive the tweaked coefficients. Normally the function looks at the current
336 * state to see if coverage is enabled. By setting forceCoverage the caller can speculatively
337 * determine the blend optimizations that would be used if there was partial pixel coverage.
338 *
339 * Subclasses of GrDrawTarget that actually draw (as opposed to those that j ust buffer for
340 * playback) must call this function and respect the flags that replace the output color.
341 *
342 * If the cached BlendOptFlags does not have the invalidate bit set, then ge tBlendOpts will
343 * simply returned the cached flags and coefficients. Otherwise it will calc ulate the values.
344 */
345 BlendOptFlags getBlendOpts(bool forceCoverage = false,
346 GrBlendCoeff* srcCoeff = NULL,
347 GrBlendCoeff* dstCoeff = NULL) const;
348
349 /**
350 * We don't use suplied vertex color attributes if our blend mode is EmitCov erage or
351 * EmitTransBlack
352 */
353 bool canIgnoreColorAttribute() const;
354
355
356 /// @} 345 /// @}
357 346
358 /////////////////////////////////////////////////////////////////////////// 347 ///////////////////////////////////////////////////////////////////////////
359 /// @name View Matrix 348 /// @name View Matrix
360 //// 349 ////
361 350
362 /** 351 /**
363 * Sets the view matrix to identity and updates any installed effects to com pensate for the 352 * Sets the view matrix to identity and updates any installed effects to com pensate for the
364 * coord system change. 353 * coord system change.
365 */ 354 */
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 /// @name Render Target 398 /// @name Render Target
410 //// 399 ////
411 400
412 /** 401 /**
413 * Sets the render-target used at the next drawing call 402 * Sets the render-target used at the next drawing call
414 * 403 *
415 * @param target The render target to set. 404 * @param target The render target to set.
416 */ 405 */
417 void setRenderTarget(GrRenderTarget* target) { 406 void setRenderTarget(GrRenderTarget* target) {
418 fRenderTarget.setResource(SkSafeRef(target), GrProgramResource::kWrite_I OType); 407 fRenderTarget.setResource(SkSafeRef(target), GrProgramResource::kWrite_I OType);
408 this->invalidateOptState();
419 } 409 }
420 410
421 /// @} 411 /// @}
422 412
423 /////////////////////////////////////////////////////////////////////////// 413 ///////////////////////////////////////////////////////////////////////////
424 /// @name Stencil 414 /// @name Stencil
425 //// 415 ////
426 416
427 /** 417 /**
428 * Sets the stencil settings to use for the next draw. 418 * Sets the stencil settings to use for the next draw.
429 * Changing the clip has the side-effect of possibly zeroing 419 * Changing the clip has the side-effect of possibly zeroing
430 * out the client settable stencil bits. So multipass algorithms 420 * out the client settable stencil bits. So multipass algorithms
431 * using stencil should not change the clip between passes. 421 * using stencil should not change the clip between passes.
432 * @param settings the stencil settings to use. 422 * @param settings the stencil settings to use.
433 */ 423 */
434 void setStencil(const GrStencilSettings& settings) { 424 void setStencil(const GrStencilSettings& settings) {
435 fStencilSettings = settings; 425 if (settings != fStencilSettings) {
436 this->invalidateBlendOptFlags(); 426 fStencilSettings = settings;
427 this->invalidateOptState();
428 }
437 } 429 }
438 430
439 /** 431 /**
440 * Shortcut to disable stencil testing and ops. 432 * Shortcut to disable stencil testing and ops.
441 */ 433 */
442 void disableStencil() { 434 void disableStencil() {
443 fStencilSettings.setDisabled(); 435 if (!fStencilSettings.isDisabled()) {
444 this->invalidateBlendOptFlags(); 436 fStencilSettings.setDisabled();
437 this->invalidateOptState();
438 }
445 } 439 }
446 440
447 GrStencilSettings* stencil() { return &fStencilSettings; } 441 GrStencilSettings* stencil() { return &fStencilSettings; }
448 442
449 /// @} 443 /// @}
450 444
451 /////////////////////////////////////////////////////////////////////////// 445 ///////////////////////////////////////////////////////////////////////////
452 /// @name State Flags 446 /// @name State Flags
453 //// 447 ////
454 448
455 void resetStateFlags() { 449 void resetStateFlags() {
456 fFlagBits = 0; 450 if (0 != fFlagBits) {
457 this->invalidateBlendOptFlags(); 451 fFlagBits = 0;
452 this->invalidateOptState();
453 }
458 } 454 }
459 455
460 /** 456 /**
461 * Enable render state settings. 457 * Enable render state settings.
462 * 458 *
463 * @param stateBits bitfield of StateBits specifying the states to enable 459 * @param stateBits bitfield of StateBits specifying the states to enable
464 */ 460 */
465 void enableState(uint32_t stateBits) { 461 void enableState(uint32_t stateBits) {
466 fFlagBits |= stateBits; 462 if (stateBits & ~fFlagBits) {
467 this->invalidateBlendOptFlags(); 463 fFlagBits |= stateBits;
464 this->invalidateOptState();
465 }
468 } 466 }
469 467
470 /** 468 /**
471 * Disable render state settings. 469 * Disable render state settings.
472 * 470 *
473 * @param stateBits bitfield of StateBits specifying the states to disable 471 * @param stateBits bitfield of StateBits specifying the states to disable
474 */ 472 */
475 void disableState(uint32_t stateBits) { 473 void disableState(uint32_t stateBits) {
476 fFlagBits &= ~(stateBits); 474 if (stateBits & fFlagBits) {
477 this->invalidateBlendOptFlags(); 475 fFlagBits &= ~(stateBits);
476 this->invalidateOptState();
477 }
478 } 478 }
479 479
480 /** 480 /**
481 * Enable or disable stateBits based on a boolean. 481 * Enable or disable stateBits based on a boolean.
482 * 482 *
483 * @param stateBits bitfield of StateBits to enable or disable 483 * @param stateBits bitfield of StateBits to enable or disable
484 * @param enable if true enable stateBits, otherwise disable 484 * @param enable if true enable stateBits, otherwise disable
485 */ 485 */
486 void setState(uint32_t stateBits, bool enable) { 486 void setState(uint32_t stateBits, bool enable) {
487 if (enable) { 487 if (enable) {
(...skipping 18 matching lines...) Expand all
506 fDrawFace = face; 506 fDrawFace = face;
507 } 507 }
508 508
509 /// @} 509 /// @}
510 510
511 /////////////////////////////////////////////////////////////////////////// 511 ///////////////////////////////////////////////////////////////////////////
512 /// @name Hints 512 /// @name Hints
513 /// Hints that when provided can enable optimizations. 513 /// Hints that when provided can enable optimizations.
514 //// 514 ////
515 515
516 enum Hints { kVertexColorsAreOpaque_Hint = 0x1, };
517
518 void setHint(Hints hint, bool value) { fHints = value ? (fHints | hint) : (f Hints & ~hint); } 516 void setHint(Hints hint, bool value) { fHints = value ? (fHints | hint) : (f Hints & ~hint); }
519 517
520 /// @} 518 /// @}
521 519
522 /////////////////////////////////////////////////////////////////////////// 520 ///////////////////////////////////////////////////////////////////////////
523 521
524 /** Return type for CombineIfPossible. */ 522 /** Return type for CombineIfPossible. */
525 enum CombinedState { 523 enum CombinedState {
526 /** The GrDrawStates cannot be combined. */ 524 /** The GrDrawStates cannot be combined. */
527 kIncompatible_CombinedState, 525 kIncompatible_CombinedState,
528 /** Either draw state can be used in place of the other. */ 526 /** Either draw state can be used in place of the other. */
529 kAOrB_CombinedState, 527 kAOrB_CombinedState,
530 /** Use the first draw state. */ 528 /** Use the first draw state. */
531 kA_CombinedState, 529 kA_CombinedState,
532 /** Use the second draw state. */ 530 /** Use the second draw state. */
533 kB_CombinedState, 531 kB_CombinedState,
534 }; 532 };
535 533
536 /** This function determines whether the GrDrawStates used for two draws can be combined into 534 /** This function determines whether the GrDrawStates used for two draws can be combined into
537 a single GrDrawState. This is used to avoid storing redundant GrDrawStat es and to determine 535 a single GrDrawState. This is used to avoid storing redundant GrDrawStat es and to determine
538 if draws can be batched. The return value indicates whether combining is possible and, if 536 if draws can be batched. The return value indicates whether combining is possible and, if
539 so, which of the two inputs should be used. */ 537 so, which of the two inputs should be used. */
540 static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawSta te& b, 538 static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawSta te& b,
541 const GrDrawTargetCaps& caps); 539 const GrDrawTargetCaps& caps);
542 540
543 GrDrawState& operator= (const GrDrawState& that); 541 GrDrawState& operator= (const GrDrawState& that);
544 542
543 /**
544 * Returns a snapshot of the current optimized state. If the current drawSta te has a valid
545 * cached optimiezed state it will simply return a pointer to it otherwise i t will create a new
546 * GrOptDrawState. In all cases the GrOptDrawState is reffed and ownership i s given to the
547 * caller.
548 */
549 GrOptDrawState* createOptState() const;
550
545 private: 551 private:
552 void invalidateOptState() const {
553 SkSafeSetNull(fCachedOptState);
554 fBlendOptFlags = kInvalid_BlendOptFlag;
555 }
556
546 void onReset(const SkMatrix* initialViewMatrix); 557 void onReset(const SkMatrix* initialViewMatrix);
547 558
548 /**
549 * Determines whether src alpha is guaranteed to be one for all src pixels
550 */
551 bool srcAlphaWillBeOne() const;
552
553 /**
554 * Helper function for getBlendOpts.
555 */
556 BlendOptFlags calcBlendOpts(bool forceCoverage = false,
557 GrBlendCoeff* srcCoeff = NULL,
558 GrBlendCoeff* dstCoeff = NULL) const;
559
560 void invalidateBlendOptFlags() { 559 void invalidateBlendOptFlags() {
561 fBlendOptFlags = kInvalid_BlendOptFlag; 560 fBlendOptFlags = kInvalid_BlendOptFlag;
562 } 561 }
563 562
564 uint32_t fHints;
565
566 // Some of the auto restore objects assume that no effects are removed durin g their lifetime. 563 // Some of the auto restore objects assume that no effects are removed durin g their lifetime.
567 // This is used to assert that this condition holds. 564 // This is used to assert that this condition holds.
568 SkDEBUGCODE(int fBlockEffectRemovalCnt;) 565 SkDEBUGCODE(int fBlockEffectRemovalCnt;)
569 566
570 void internalSetVertexAttribs(const GrVertexAttrib attribs[], int count, siz e_t stride); 567 void internalSetVertexAttribs(const GrVertexAttrib attribs[], int count, siz e_t stride);
571 568
569 mutable GrOptDrawState* fCachedOptState;
570
572 typedef GrRODrawState INHERITED; 571 typedef GrRODrawState INHERITED;
573 }; 572 };
574 573
575 #endif 574 #endif
OLDNEW
« no previous file with comments | « gyp/gpu.gypi ('k') | src/gpu/GrDrawState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698