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

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

Issue 791743003: Remove GP from drawstate, revision of invariant output for GP (Closed) Base URL: https://skia.googlesource.com/skia.git@color-to-gp
Patch Set: more windows fix Created 6 years 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 | « src/gpu/GrDistanceFieldTextContext.cpp ('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
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 void reset(const SkMatrix& initialViewMatrix) { this->onReset(&initialViewMa trix); } 61 void reset(const SkMatrix& initialViewMatrix) { this->onReset(&initialViewMa trix); }
62 62
63 /** 63 /**
64 * Initializes the GrDrawState based on a GrPaint, view matrix and render ta rget. Note that 64 * Initializes the GrDrawState based on a GrPaint, view matrix and render ta rget. Note that
65 * GrDrawState encompasses more than GrPaint. Aspects of GrDrawState that ha ve no GrPaint 65 * GrDrawState encompasses more than GrPaint. Aspects of GrDrawState that ha ve no GrPaint
66 * equivalents are set to default values with the exception of vertex attrib ute state which 66 * equivalents are set to default values with the exception of vertex attrib ute state which
67 * is unmodified by this function and clipping which will be enabled. 67 * is unmodified by this function and clipping which will be enabled.
68 */ 68 */
69 void setFromPaint(const GrPaint& , const SkMatrix& viewMatrix, GrRenderTarge t*); 69 void setFromPaint(const GrPaint& , const SkMatrix& viewMatrix, GrRenderTarge t*);
70 70
71 ///////////////////////////////////////////////////////////////////////////
72 /// @name Vertex Attributes
73 ////
74
75 // TODO when we move this info off of GrGeometryProcessor, delete these
76 bool hasLocalCoordAttribute() const {
77 return this->hasGeometryProcessor() && this->getGeometryProcessor()->has LocalCoords();
78 }
79 bool hasColorVertexAttribute() const {
80 return this->hasGeometryProcessor() && this->getGeometryProcessor()->has VertexColor();
81 }
82 bool hasCoverageVertexAttribute() const {
83 return this->hasGeometryProcessor() && this->getGeometryProcessor()->has VertexCoverage();
84 }
85
86 /// @} 71 /// @}
87 72
88 /** 73 /**
89 * Depending on features available in the underlying 3D API and the color bl end mode requested 74 * Depending on features available in the underlying 3D API and the color bl end mode requested
90 * it may or may not be possible to correctly blend with fractional pixel co verage generated by 75 * it may or may not be possible to correctly blend with fractional pixel co verage generated by
91 * the fragment shader. 76 * the fragment shader.
92 * 77 *
93 * This function considers the current draw state and the draw target's capa bilities to 78 * This function considers the current draw state and the draw target's capa bilities to
94 * determine whether coverage can be handled correctly. This function assume s that the caller 79 * determine whether coverage can be handled correctly. This function assume s that the caller
95 * intends to specify fractional pixel coverage via a primitive processor bu t may not have 80 * intends to specify fractional pixel coverage via a primitive processor bu t may not have
96 * specified it yet. 81 * specified it yet.
97 */ 82 */
98 bool canUseFracCoveragePrimProc(GrColor color, const GrDrawTargetCaps& caps) const; 83 bool canUseFracCoveragePrimProc(GrColor color, const GrDrawTargetCaps& caps) const;
99 84
100 /** 85 /**
101 * Determines whether the output coverage is guaranteed to be one for all pi xels hit by a draw. 86 * Determines whether the output coverage is guaranteed to be one for all pi xels hit by a draw.
102 */ 87 */
103 bool hasSolidCoverage(GrColor coverage) const; 88 bool hasSolidCoverage(const GrPrimitiveProcessor*) const;
104 89
105 /** 90 /**
106 * This function returns true if the render target destination pixel values will be read for 91 * This function returns true if the render target destination pixel values will be read for
107 * blending during draw. 92 * blending during draw.
108 */ 93 */
109 bool willBlendWithDst(GrColor color, GrColor coverage) const; 94 bool willBlendWithDst(const GrPrimitiveProcessor*) const;
110
111 /// @}
112
113 /**
114 * The geometry processor is the sole element of the skia pipeline which can use the vertex,
115 * geometry, and tesselation shaders. The GP may also compute a coverage in its fragment shader
116 * but is never put in the color processing pipeline.
117 */
118
119 const GrGeometryProcessor* setGeometryProcessor(const GrGeometryProcessor* g eometryProcessor) {
120 SkASSERT(geometryProcessor);
121 SkASSERT(!this->hasGeometryProcessor());
122 fGeometryProcessor.reset(SkRef(geometryProcessor));
123 fCoverageProcInfoValid = false;
124 return geometryProcessor;
125 }
126 95
127 /////////////////////////////////////////////////////////////////////////// 96 ///////////////////////////////////////////////////////////////////////////
128 /// @name Effect Stages 97 /// @name Effect Stages
129 /// Each stage hosts a GrProcessor. The effect produces an output color or c overage in the 98 /// Each stage hosts a GrProcessor. The effect produces an output color or c overage in the
130 /// fragment shader. Its inputs are the output from the previous stage as we ll as some variables 99 /// fragment shader. Its inputs are the output from the previous stage as we ll as some variables
131 /// available to it in the fragment and vertex shader (e.g. the vertex posit ion, the dst color, 100 /// available to it in the fragment and vertex shader (e.g. the vertex posit ion, the dst color,
132 /// the fragment position, local coordinates). 101 /// the fragment position, local coordinates).
133 /// 102 ///
134 /// The stages are divided into two sets, color-computing and coverage-compu ting. The final 103 /// The stages are divided into two sets, color-computing and coverage-compu ting. The final
135 /// color stage produces the final pixel color. The coverage-computing stage s function exactly 104 /// color stage produces the final pixel color. The coverage-computing stage s function exactly
136 /// as the color-computing but the output of the final coverage stage is tre ated as a fractional 105 /// as the color-computing but the output of the final coverage stage is tre ated as a fractional
137 /// pixel coverage rather than as input to the src/dst color blend step. 106 /// pixel coverage rather than as input to the src/dst color blend step.
138 /// 107 ///
139 /// The input color to the first color-stage is either the constant color or interpolated 108 /// The input color to the first color-stage is either the constant color or interpolated
140 /// per-vertex colors. The input to the first coverage stage is either a con stant coverage 109 /// per-vertex colors. The input to the first coverage stage is either a con stant coverage
141 /// (usually full-coverage) or interpolated per-vertex coverage. 110 /// (usually full-coverage) or interpolated per-vertex coverage.
142 /// 111 ///
143 /// See the documentation of kCoverageDrawing_StateBit for information about disabling the 112 /// See the documentation of kCoverageDrawing_StateBit for information about disabling the
144 /// the color / coverage distinction. 113 /// the color / coverage distinction.
145 //// 114 ////
146 115
147 int numColorStages() const { return fColorStages.count(); } 116 int numColorStages() const { return fColorStages.count(); }
148 int numCoverageStages() const { return fCoverageStages.count(); } 117 int numCoverageStages() const { return fCoverageStages.count(); }
149 int numFragmentStages() const { return this->numColorStages() + this->numCov erageStages(); } 118 int numFragmentStages() const { return this->numColorStages() + this->numCov erageStages(); }
150 int numTotalStages() const {
151 return this->numFragmentStages() + (this->hasGeometryProcessor() ? 1 : 0);
152 }
153
154 bool hasGeometryProcessor() const { return SkToBool(fGeometryProcessor.get() ); }
155 const GrGeometryProcessor* getGeometryProcessor() const { return fGeometryPr ocessor.get(); }
156 119
157 const GrXPFactory* getXPFactory() const { return fXPFactory.get(); } 120 const GrXPFactory* getXPFactory() const { return fXPFactory.get(); }
158 121
159 const GrFragmentStage& getColorStage(int idx) const { return fColorStages[id x]; } 122 const GrFragmentStage& getColorStage(int idx) const { return fColorStages[id x]; }
160 const GrFragmentStage& getCoverageStage(int idx) const { return fCoverageSta ges[idx]; } 123 const GrFragmentStage& getCoverageStage(int idx) const { return fCoverageSta ges[idx]; }
161 124
162 /** 125 /**
163 * Checks whether any of the effects will read the dst pixel color. 126 * Checks whether any of the effects will read the dst pixel color.
164 * TODO remove when we have an XP 127 * TODO remove when we have an XP
165 */ 128 */
166 bool willEffectReadDstColor(GrColor color, GrColor coverage) const; 129 bool willEffectReadDstColor(const GrPrimitiveProcessor*) const;
167 130
168 /** 131 /**
169 * The xfer processor factory. 132 * The xfer processor factory.
170 */ 133 */
171 const GrXPFactory* setXPFactory(const GrXPFactory* xpFactory) { 134 const GrXPFactory* setXPFactory(const GrXPFactory* xpFactory) {
172 fXPFactory.reset(SkRef(xpFactory)); 135 fXPFactory.reset(SkRef(xpFactory));
173 return xpFactory; 136 return xpFactory;
174 } 137 }
175 138
176 void setPorterDuffXPFactory(SkXfermode::Mode mode) { 139 void setPorterDuffXPFactory(SkXfermode::Mode mode) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 * significant complexity to the multi-ref architecture for deferred drawing . Once GrDrawState 194 * significant complexity to the multi-ref architecture for deferred drawing . Once GrDrawState
232 * and GrOptDrawState are fully separated then GrDrawState will never be in the deferred 195 * and GrOptDrawState are fully separated then GrDrawState will never be in the deferred
233 * execution state and GrOptDrawState always will be (and will be immutable and therefore 196 * execution state and GrOptDrawState always will be (and will be immutable and therefore
234 * unable to have an ARE). At this point we can restore sanity and have the ARE save and restore 197 * unable to have an ARE). At this point we can restore sanity and have the ARE save and restore
235 * the GP. 198 * the GP.
236 */ 199 */
237 class AutoRestoreEffects : public ::SkNoncopyable { 200 class AutoRestoreEffects : public ::SkNoncopyable {
238 public: 201 public:
239 AutoRestoreEffects() 202 AutoRestoreEffects()
240 : fDrawState(NULL) 203 : fDrawState(NULL)
241 , fOriginalGPID(SK_InvalidUniqueID)
242 , fColorEffectCnt(0) 204 , fColorEffectCnt(0)
243 , fCoverageEffectCnt(0) {} 205 , fCoverageEffectCnt(0) {}
244 206
245 AutoRestoreEffects(GrDrawState* ds) 207 AutoRestoreEffects(GrDrawState* ds)
246 : fDrawState(NULL) 208 : fDrawState(NULL)
247 , fOriginalGPID(SK_InvalidUniqueID)
248 , fColorEffectCnt(0) 209 , fColorEffectCnt(0)
249 , fCoverageEffectCnt(0) { 210 , fCoverageEffectCnt(0) {
250 this->set(ds); 211 this->set(ds);
251 } 212 }
252 213
253 ~AutoRestoreEffects() { this->set(NULL); } 214 ~AutoRestoreEffects() { this->set(NULL); }
254 215
255 void set(GrDrawState* ds); 216 void set(GrDrawState* ds);
256 217
257 bool isSet() const { return SkToBool(fDrawState); } 218 bool isSet() const { return SkToBool(fDrawState); }
258 219
259 private: 220 private:
260 GrDrawState* fDrawState; 221 GrDrawState* fDrawState;
261 uint32_t fOriginalGPID;
262 int fColorEffectCnt; 222 int fColorEffectCnt;
263 int fCoverageEffectCnt; 223 int fCoverageEffectCnt;
264 }; 224 };
265 225
266 /** 226 /**
267 * AutoRestoreStencil 227 * AutoRestoreStencil
268 * 228 *
269 * This simple struct saves and restores the stencil settings 229 * This simple struct saves and restores the stencil settings
270 */ 230 */
271 class AutoRestoreStencil : public ::SkNoncopyable { 231 class AutoRestoreStencil : public ::SkNoncopyable {
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 * @param face the face(s) to draw. 488 * @param face the face(s) to draw.
529 */ 489 */
530 void setDrawFace(DrawFace face) { 490 void setDrawFace(DrawFace face) {
531 SkASSERT(kInvalid_DrawFace != face); 491 SkASSERT(kInvalid_DrawFace != face);
532 fDrawFace = face; 492 fDrawFace = face;
533 } 493 }
534 494
535 /// @} 495 /// @}
536 496
537 /////////////////////////////////////////////////////////////////////////// 497 ///////////////////////////////////////////////////////////////////////////
538 /// @name Hints
539 /// Hints that when provided can enable optimizations.
540 ////
541
542 enum Hints {
543 kVertexColorsAreOpaque_Hint = 0x1,
544 kLast_Hint = kVertexColorsAreOpaque_Hint
545 };
546
547 void setHint(Hints hint, bool value) { fHints = value ? (fHints | hint) : (f Hints & ~hint); }
548
549 bool vertexColorsAreOpaque() const { return kVertexColorsAreOpaque_Hint & fH ints; }
550
551 /// @}
552
553 ///////////////////////////////////////////////////////////////////////////
554 498
555 GrDrawState& operator= (const GrDrawState& that); 499 GrDrawState& operator= (const GrDrawState& that);
556 500
557 private: 501 private:
558 bool isEqual(const GrDrawState& that) const; 502 bool isEqual(const GrDrawState& that, bool explicitLocalCoords) const;
559 503
560 const GrProcOptInfo& colorProcInfo(GrColor color) const { 504 const GrProcOptInfo& colorProcInfo(const GrPrimitiveProcessor* pp) const {
561 this->calcColorInvariantOutput(color); 505 this->calcColorInvariantOutput(pp);
562 return fColorProcInfo; 506 return fColorProcInfo;
563 } 507 }
564 508
565 const GrProcOptInfo& coverageProcInfo(GrColor coverage) const { 509 const GrProcOptInfo& coverageProcInfo(const GrPrimitiveProcessor* pp) const {
566 this->calcCoverageInvariantOutput(coverage); 510 this->calcCoverageInvariantOutput(pp);
567 return fCoverageProcInfo; 511 return fCoverageProcInfo;
568 } 512 }
569 513
570 /** 514 /**
571 * Determines whether src alpha is guaranteed to be one for all src pixels 515 * If fColorProcInfoValid is false, function calculates the invariant output for the color
516 * stages and results are stored in fColorProcInfo.
572 */ 517 */
573 bool srcAlphaWillBeOne(GrColor color, GrColor coverage) const; 518 void calcColorInvariantOutput(const GrPrimitiveProcessor*) const;
519
520 /**
521 * If fCoverageProcInfoValid is false, function calculates the invariant out put for the coverage
522 * stages and results are stored in fCoverageProcInfo.
523 */
524 void calcCoverageInvariantOutput(const GrPrimitiveProcessor*) const;
574 525
575 /** 526 /**
576 * If fColorProcInfoValid is false, function calculates the invariant output for the color 527 * If fColorProcInfoValid is false, function calculates the invariant output for the color
577 * stages and results are stored in fColorProcInfo. 528 * stages and results are stored in fColorProcInfo.
578 */ 529 */
579 void calcColorInvariantOutput(GrColor) const; 530 void calcColorInvariantOutput(GrColor) const;
580 531
581 /** 532 /**
582 * If fCoverageProcInfoValid is false, function calculates the invariant out put for the coverage 533 * If fCoverageProcInfoValid is false, function calculates the invariant out put for the coverage
583 * stages and results are stored in fCoverageProcInfo. 534 * stages and results are stored in fCoverageProcInfo.
584 */ 535 */
585 void calcCoverageInvariantOutput(GrColor) const; 536 void calcCoverageInvariantOutput(GrColor) const;
586 537
587 void onReset(const SkMatrix* initialViewMatrix); 538 void onReset(const SkMatrix* initialViewMatrix);
588 539
589 // Some of the auto restore objects assume that no effects are removed durin g their lifetime. 540 // Some of the auto restore objects assume that no effects are removed durin g their lifetime.
590 // This is used to assert that this condition holds. 541 // This is used to assert that this condition holds.
591 SkDEBUGCODE(int fBlockEffectRemovalCnt;) 542 SkDEBUGCODE(int fBlockEffectRemovalCnt;)
592 543
593 typedef SkSTArray<4, GrFragmentStage> FragmentStageArray; 544 typedef SkSTArray<4, GrFragmentStage> FragmentStageArray;
594 545
595 SkAutoTUnref<GrRenderTarget> fRenderTarget; 546 SkAutoTUnref<GrRenderTarget> fRenderTarget;
596 SkMatrix fViewMatrix; 547 SkMatrix fViewMatrix;
597 uint32_t fFlagBits; 548 uint32_t fFlagBits;
598 GrStencilSettings fStencilSettings; 549 GrStencilSettings fStencilSettings;
599 DrawFace fDrawFace; 550 DrawFace fDrawFace;
600 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor;
601 SkAutoTUnref<const GrXPFactory> fXPFactory; 551 SkAutoTUnref<const GrXPFactory> fXPFactory;
602 FragmentStageArray fColorStages; 552 FragmentStageArray fColorStages;
603 FragmentStageArray fCoverageStages; 553 FragmentStageArray fCoverageStages;
604 uint32_t fHints;
605 554
606 mutable GrProcOptInfo fColorProcInfo; 555 mutable GrProcOptInfo fColorProcInfo;
607 mutable GrProcOptInfo fCoverageProcInfo; 556 mutable GrProcOptInfo fCoverageProcInfo;
608 mutable bool fColorProcInfoValid; 557 mutable bool fColorProcInfoValid;
609 mutable bool fCoverageProcInfoValid; 558 mutable bool fCoverageProcInfoValid;
610 mutable GrColor fColorCache; 559 mutable GrColor fColorCache;
611 mutable GrColor fCoverageCache; 560 mutable GrColor fCoverageCache;
561 mutable const GrPrimitiveProcessor* fColorPrimProc;
562 mutable const GrPrimitiveProcessor* fCoveragePrimProc;
612 563
613 friend class GrOptDrawState; 564 friend class GrOptDrawState;
614 }; 565 };
615 566
616 #endif 567 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrDistanceFieldTextContext.cpp ('k') | src/gpu/GrDrawState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698