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

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

Issue 446953002: Add an opaqueness hint to GrDrawState. (Closed) Base URL: https://skia.googlesource.com/skia.git@greg
Patch Set: remove whitespace at end of line Created 6 years, 4 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
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 "GrBackendEffectFactory.h"
12 #include "GrBlend.h" 11 #include "GrBlend.h"
13 #include "GrColor.h" 12 #include "GrColor.h"
14 #include "GrEffectStage.h" 13 #include "GrEffectStage.h"
15 #include "GrPaint.h"
16 #include "GrRenderTarget.h"
17 #include "GrStencil.h" 14 #include "GrStencil.h"
18 #include "GrTemplates.h"
19 #include "GrTexture.h"
20 #include "GrTypesPriv.h"
21 #include "effects/GrSimpleTextureEffect.h" 15 #include "effects/GrSimpleTextureEffect.h"
22 16
23 #include "SkMatrix.h" 17 #include "SkMatrix.h"
24 #include "SkTypes.h" 18
25 #include "SkXfermode.h" 19 class GrDrawTargetCaps;
20 class GrPaint;
21 class GrRenderTarget;
22 class GrTexture;
26 23
27 class GrDrawState : public SkRefCnt { 24 class GrDrawState : public SkRefCnt {
28 public: 25 public:
29 SK_DECLARE_INST_COUNT(GrDrawState) 26 SK_DECLARE_INST_COUNT(GrDrawState)
30 27
31 GrDrawState() { 28 GrDrawState() {
32 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 29 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
33 this->reset(); 30 this->reset();
34 } 31 }
35 32
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 /** 151 /**
155 * Determines whether src alpha is guaranteed to be one for all src pixels 152 * Determines whether src alpha is guaranteed to be one for all src pixels
156 */ 153 */
157 bool srcAlphaWillBeOne() const; 154 bool srcAlphaWillBeOne() const;
158 155
159 /** 156 /**
160 * Determines whether the output coverage is guaranteed to be one for all pi xels hit by a draw. 157 * Determines whether the output coverage is guaranteed to be one for all pi xels hit by a draw.
161 */ 158 */
162 bool hasSolidCoverage() const; 159 bool hasSolidCoverage() const;
163 160
161 /**
162 * Depending on features available in the underlying 3D API and the color bl end mode requested
163 * it may or may not be possible to correctly blend with fractional pixel co verage generated by
164 * the fragment shader.
165 *
166 * This function considers the current draw state and the draw target's capa bilities to
167 * determine whether coverage can be handled correctly. This function assume s that the caller
168 * intends to specify fractional pixel coverage (via setCoverage(), through a coverage vertex
169 * attribute, or a coverage effect) but may not have specified it yet.
170 */
171 bool couldApplyCoverage(const GrDrawTargetCaps& caps) const;
172
164 /// @} 173 /// @}
165 174
166 /////////////////////////////////////////////////////////////////////////// 175 ///////////////////////////////////////////////////////////////////////////
167 /// @name Color 176 /// @name Color
168 //// 177 ////
169 178
170 /** 179 /**
171 * Sets color for next draw to a premultiplied-alpha color. 180 * Sets color for next draw to a premultiplied-alpha color.
172 * 181 *
173 * @param color the color to set. 182 * @param color the color to set.
174 */ 183 */
175 void setColor(GrColor color) { 184 void setColor(GrColor color) {
176 fColor = color; 185 fColor = color;
177 this->invalidateBlendOptFlags(); 186 this->invalidateBlendOptFlags();
178 } 187 }
179 188
180 GrColor getColor() const { return fColor; } 189 GrColor getColor() const { return fColor; }
181 190
182 /** 191 /**
183 * Sets the color to be used for the next draw to be 192 * Sets the color to be used for the next draw to be
184 * (r,g,b,a) = (alpha, alpha, alpha, alpha). 193 * (r,g,b,a) = (alpha, alpha, alpha, alpha).
185 * 194 *
186 * @param alpha The alpha value to set as the color. 195 * @param alpha The alpha value to set as the color.
187 */ 196 */
188 void setAlpha(uint8_t a) { 197 void setAlpha(uint8_t a) { this->setColor((a << 24) | (a << 16) | (a << 8) | a); }
189 this->setColor((a << 24) | (a << 16) | (a << 8) | a);
190 }
191 198
192 /// @} 199 /// @}
193 200
194 /////////////////////////////////////////////////////////////////////////// 201 ///////////////////////////////////////////////////////////////////////////
195 /// @name Coverage 202 /// @name Coverage
196 //// 203 ////
197 204
198 /** 205 /**
199 * Sets a constant fractional coverage to be applied to the draw. The 206 * Sets a constant fractional coverage to be applied to the draw. The
200 * initial value (after construction or reset()) is 0xff. The constant 207 * initial value (after construction or reset()) is 0xff. The constant
201 * coverage is ignored when per-vertex coverage is provided. 208 * coverage is ignored when per-vertex coverage is provided.
202 */ 209 */
203 void setCoverage(uint8_t coverage) { 210 void setCoverage(uint8_t coverage) {
204 fCoverage = GrColorPackRGBA(coverage, coverage, coverage, coverage); 211 fCoverage = GrColorPackRGBA(coverage, coverage, coverage, coverage);
205 this->invalidateBlendOptFlags(); 212 this->invalidateBlendOptFlags();
206 } 213 }
207 214
208 uint8_t getCoverage() const { 215 uint8_t getCoverage() const { return GrColorUnpackR(fCoverage); }
209 return GrColorUnpackR(fCoverage);
210 }
211 216
212 GrColor getCoverageColor() const { 217 GrColor getCoverageColor() const { return fCoverage; }
213 return fCoverage;
214 }
215 218
216 /// @} 219 /// @}
217 220
218 /** 221 /**
219 * This struct is here so that the GrDrawState can have multiple instances o f state information. 222 * This struct is here so that the GrDrawState can have multiple instances o f state information.
220 * The use of this will come in a future revision when we want to keep track of the original 223 * The use of this will come in a future revision when we want to keep track of the original
221 * draw state as well as an optimized version of it. 224 * draw state as well as an optimized version of it.
222 */ 225 */
223 struct State { 226 struct State {
224 State() { 227 State() {
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 557
555 /////////////////////////////////////////////////////////////////////////// 558 ///////////////////////////////////////////////////////////////////////////
556 /// @name Render Target 559 /// @name Render Target
557 //// 560 ////
558 561
559 /** 562 /**
560 * Sets the render-target used at the next drawing call 563 * Sets the render-target used at the next drawing call
561 * 564 *
562 * @param target The render target to set. 565 * @param target The render target to set.
563 */ 566 */
564 void setRenderTarget(GrRenderTarget* target) { 567 void setRenderTarget(GrRenderTarget* target) { fRenderTarget.reset(SkSafeRef (target)); }
565 fRenderTarget.reset(SkSafeRef(target));
566 }
567 568
568 /** 569 /**
569 * Retrieves the currently set render-target. 570 * Retrieves the currently set render-target.
570 * 571 *
571 * @return The currently set render target. 572 * @return The currently set render target.
572 */ 573 */
573 const GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } 574 const GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); }
574 GrRenderTarget* getRenderTarget() { return fRenderTarget.get(); } 575 GrRenderTarget* getRenderTarget() { return fRenderTarget.get(); }
575 576
576 class AutoRenderTargetRestore : public ::SkNoncopyable { 577 class AutoRenderTargetRestore : public ::SkNoncopyable {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 * @param enable if true enable stateBits, otherwise disable 716 * @param enable if true enable stateBits, otherwise disable
716 */ 717 */
717 void setState(uint32_t stateBits, bool enable) { 718 void setState(uint32_t stateBits, bool enable) {
718 if (enable) { 719 if (enable) {
719 this->enableState(stateBits); 720 this->enableState(stateBits);
720 } else { 721 } else {
721 this->disableState(stateBits); 722 this->disableState(stateBits);
722 } 723 }
723 } 724 }
724 725
725 bool isDitherState() const { 726 bool isStateFlagEnabled(uint32_t stateBit) const { return 0 != (stateBit & f FlagBits); }
726 return 0 != (fFlagBits & kDither_StateBit);
727 }
728 727
729 bool isHWAntialiasState() const { 728 bool isDitherState() const { return 0 != (fFlagBits & kDither_StateBit); }
730 return 0 != (fFlagBits & kHWAntialias_StateBit); 729 bool isHWAntialiasState() const { return 0 != (fFlagBits & kHWAntialias_Stat eBit); }
731 } 730 bool isClipState() const { return 0 != (fFlagBits & kClip_StateBit); }
732 731 bool isColorWriteDisabled() const { return 0 != (fFlagBits & kNoColorWrites_ StateBit); }
733 bool isClipState() const { 732 bool isCoverageDrawing() const { return 0 != (fFlagBits & kCoverageDrawing_S tateBit); }
734 return 0 != (fFlagBits & kClip_StateBit);
735 }
736
737 bool isColorWriteDisabled() const {
738 return 0 != (fFlagBits & kNoColorWrites_StateBit);
739 }
740
741 bool isCoverageDrawing() const {
742 return 0 != (fFlagBits & kCoverageDrawing_StateBit);
743 }
744
745 bool isStateFlagEnabled(uint32_t stateBit) const {
746 return 0 != (stateBit & fFlagBits);
747 }
748 733
749 /// @} 734 /// @}
750 735
751 /////////////////////////////////////////////////////////////////////////// 736 ///////////////////////////////////////////////////////////////////////////
752 /// @name Face Culling 737 /// @name Face Culling
753 //// 738 ////
754 739
755 enum DrawFace { 740 enum DrawFace {
756 kInvalid_DrawFace = -1, 741 kInvalid_DrawFace = -1,
757 742
(...skipping 14 matching lines...) Expand all
772 /** 757 /**
773 * Gets whether the target is drawing clockwise, counterclockwise, 758 * Gets whether the target is drawing clockwise, counterclockwise,
774 * or both faces. 759 * or both faces.
775 * @return the current draw face(s). 760 * @return the current draw face(s).
776 */ 761 */
777 DrawFace getDrawFace() const { return fDrawFace; } 762 DrawFace getDrawFace() const { return fDrawFace; }
778 763
779 /// @} 764 /// @}
780 765
781 /////////////////////////////////////////////////////////////////////////// 766 ///////////////////////////////////////////////////////////////////////////
767 /// @name Hints
robertphillips 2014/08/06 20:29:12 More info here?
bsalomon 2014/08/08 15:00:12 Done.
768 ////
769
770 enum Hints { kVertexColorsAreOpaque_Hint = 0x1, };
771
772 void setHint(Hints hint, bool value) { fHints = value ? (fHints | hint) : (f Hints & ~hint); }
773
774 /// @}
775
776 ///////////////////////////////////////////////////////////////////////////
782 777
783 /** Return type for CombineIfPossible. */ 778 /** Return type for CombineIfPossible. */
784 enum CombinedState { 779 enum CombinedState {
785 /** The GrDrawStates cannot be combined. */ 780 /** The GrDrawStates cannot be combined. */
786 kIncompatible_CombinedState, 781 kIncompatible_CombinedState,
787 /** Either draw state can be used in place of the other. */ 782 /** Either draw state can be used in place of the other. */
788 kAOrB_CombinedState, 783 kAOrB_CombinedState,
789 /** Use the first draw state. */ 784 /** Use the first draw state. */
790 kA_CombinedState, 785 kA_CombinedState,
791 /** Use the second draw state. */ 786 /** Use the second draw state. */
792 kB_CombinedState, 787 kB_CombinedState,
793 }; 788 };
794 789
795 /** This function determines whether the GrDrawStates used for two draws can be combined into 790 /** This function determines whether the GrDrawStates used for two draws can be combined into
796 a single GrDrawState. This is used to avoid storing redundant GrDrawStat es and to determine 791 a single GrDrawState. This is used to avoid storing redundant GrDrawStat es and to determine
797 if draws can be batched. The return value indicates whether combining is possible and, if 792 if draws can be batched. The return value indicates whether combining is possible and, if
798 so, which of the two inputs should be used. */ 793 so, which of the two inputs should be used. */
799 static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawSta te& b); 794 static CombinedState CombineIfPossible(const GrDrawState& a, const GrDrawSta te& b,
795 const GrDrawTargetCaps& caps);
800 796
801 GrDrawState& operator= (const GrDrawState& that); 797 GrDrawState& operator= (const GrDrawState& that);
802 798
803 private: 799 private:
804 void onReset(const SkMatrix* initialViewMatrix); 800 void onReset(const SkMatrix* initialViewMatrix);
805 801
806 BlendOptFlags calcBlendOpts(bool forceCoverage = false, 802 BlendOptFlags calcBlendOpts(bool forceCoverage = false,
807 GrBlendCoeff* srcCoeff = NULL, 803 GrBlendCoeff* srcCoeff = NULL,
808 GrBlendCoeff* dstCoeff = NULL) const; 804 GrBlendCoeff* dstCoeff = NULL) const;
809 805
810 // These fields are roughly sorted by decreasing likelihood of being differe nt in op== 806 // These fields are roughly sorted by decreasing likelihood of being differe nt in op==
811 SkAutoTUnref<GrRenderTarget> fRenderTarget; 807 SkAutoTUnref<GrRenderTarget> fRenderTarget;
812 GrColor fColor; 808 GrColor fColor;
813 SkMatrix fViewMatrix; 809 SkMatrix fViewMatrix;
814 GrColor fBlendConstant; 810 GrColor fBlendConstant;
815 uint32_t fFlagBits; 811 uint32_t fFlagBits;
816 const GrVertexAttrib* fVAPtr; 812 const GrVertexAttrib* fVAPtr;
817 int fVACount; 813 int fVACount;
818 GrStencilSettings fStencilSettings; 814 GrStencilSettings fStencilSettings;
819 GrColor fCoverage; 815 GrColor fCoverage;
820 DrawFace fDrawFace; 816 DrawFace fDrawFace;
821 817
822 State fState; 818 State fState;
819
820 uint32_t fHints;
823 821
824 mutable GrBlendCoeff fOptSrcBlend; 822 mutable GrBlendCoeff fOptSrcBlend;
825 mutable GrBlendCoeff fOptDstBlend; 823 mutable GrBlendCoeff fOptDstBlend;
826 mutable BlendOptFlags fBlendOptFlags; 824 mutable BlendOptFlags fBlendOptFlags;
827 825
828 // This is simply a different representation of info in fVertexAttribs and t hus does 826 // This is simply a different representation of info in fVertexAttribs and t hus does
829 // not need to be compared in op==. 827 // not need to be compared in op==.
830 int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt ]; 828 int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt ];
831 829
832 // Some of the auto restore objects assume that no effects are removed durin g their lifetime. 830 // Some of the auto restore objects assume that no effects are removed durin g their lifetime.
833 // This is used to assert that this condition holds. 831 // This is used to assert that this condition holds.
834 SkDEBUGCODE(int fBlockEffectRemovalCnt;) 832 SkDEBUGCODE(int fBlockEffectRemovalCnt;)
835 833
836 /** 834 /**
837 * Sets vertex attributes for next draw. 835 * Sets vertex attributes for next draw.
838 * 836 *
839 * @param attribs the array of vertex attributes to set. 837 * @param attribs the array of vertex attributes to set.
840 * @param count the number of attributes being set, limited to kMaxVer texAttribCnt. 838 * @param count the number of attributes being set, limited to kMaxVer texAttribCnt.
841 */ 839 */
842 void setVertexAttribs(const GrVertexAttrib attribs[], int count); 840 void setVertexAttribs(const GrVertexAttrib attribs[], int count);
843 841
844 typedef SkRefCnt INHERITED; 842 typedef SkRefCnt INHERITED;
845 }; 843 };
846 844
847 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); 845 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags);
848 846
849 #endif 847 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698