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

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

Issue 759713002: Make all blending up to GrOptDrawState be handled by the xp/xp factory. (Closed) Base URL: https://skia.googlesource.com/skia.git@xferFactorySolo
Patch Set: Update from review comments 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
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 11
12 #include "GrBlend.h" 12 #include "GrBlend.h"
13 #include "GrDrawTargetCaps.h" 13 #include "GrDrawTargetCaps.h"
14 #include "GrGeometryProcessor.h" 14 #include "GrGeometryProcessor.h"
15 #include "GrGpuResourceRef.h" 15 #include "GrGpuResourceRef.h"
16 #include "GrFragmentStage.h" 16 #include "GrFragmentStage.h"
17 #include "GrProcOptInfo.h" 17 #include "GrProcOptInfo.h"
18 #include "GrRenderTarget.h" 18 #include "GrRenderTarget.h"
19 #include "GrStencil.h" 19 #include "GrStencil.h"
20 #include "GrXferProcessor.h"
20 #include "SkMatrix.h" 21 #include "SkMatrix.h"
22 #include "effects/GrPorterDuffXferProcessor.h"
21 #include "effects/GrSimpleTextureEffect.h" 23 #include "effects/GrSimpleTextureEffect.h"
22 24
23 class GrDrawTargetCaps; 25 class GrDrawTargetCaps;
24 class GrPaint; 26 class GrPaint;
25 class GrTexture; 27 class GrTexture;
26 28
27 class GrDrawState { 29 class GrDrawState {
28 public: 30 public:
29 GrDrawState() { 31 GrDrawState() {
30 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 32 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 const GrXPFactory* getXPFactory() const { return fXPFactory.get(); } 209 const GrXPFactory* getXPFactory() const { return fXPFactory.get(); }
208 210
209 const GrFragmentStage& getColorStage(int idx) const { return fColorStages[id x]; } 211 const GrFragmentStage& getColorStage(int idx) const { return fColorStages[id x]; }
210 const GrFragmentStage& getCoverageStage(int idx) const { return fCoverageSta ges[idx]; } 212 const GrFragmentStage& getCoverageStage(int idx) const { return fCoverageSta ges[idx]; }
211 213
212 /** 214 /**
213 * Checks whether any of the effects will read the dst pixel color. 215 * Checks whether any of the effects will read the dst pixel color.
214 */ 216 */
215 bool willEffectReadDstColor() const; 217 bool willEffectReadDstColor() const;
216 218
219 /**
220 * The xfer processor factory.
221 */
222 const GrXPFactory* setXPFactory(const GrXPFactory* xpFactory) {
223 fXPFactory.reset(SkRef(xpFactory));
224 return xpFactory;
225 }
226
227 void setPorterDuffXPFactory(SkXfermode::Mode mode) {
228 fXPFactory.reset(GrPorterDuffXPFactory::Create(mode));
229 }
230
231 void setPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst) {
232 fXPFactory.reset(GrPorterDuffXPFactory::Create(src, dst));
233 }
234
235
bsalomon 2014/12/08 15:38:51 extra \n
egdaniel 2014/12/08 16:24:01 Done.
217 const GrFragmentProcessor* addColorProcessor(const GrFragmentProcessor* effe ct) { 236 const GrFragmentProcessor* addColorProcessor(const GrFragmentProcessor* effe ct) {
218 SkASSERT(effect); 237 SkASSERT(effect);
219 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrFragmentStage, (effect)); 238 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrFragmentStage, (effect));
220 fColorProcInfoValid = false; 239 fColorProcInfoValid = false;
221 return effect; 240 return effect;
222 } 241 }
223 242
224 const GrFragmentProcessor* addCoverageProcessor(const GrFragmentProcessor* e ffect) { 243 const GrFragmentProcessor* addCoverageProcessor(const GrFragmentProcessor* e ffect) {
225 SkASSERT(effect); 244 SkASSERT(effect);
226 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrFragmentStage, (effect)); 245 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrFragmentStage, (effect));
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 GrDrawState* fDrawState; 344 GrDrawState* fDrawState;
326 GrStencilSettings fStencilSettings; 345 GrStencilSettings fStencilSettings;
327 }; 346 };
328 347
329 /// @} 348 /// @}
330 349
331 /////////////////////////////////////////////////////////////////////////// 350 ///////////////////////////////////////////////////////////////////////////
332 /// @name Blending 351 /// @name Blending
333 //// 352 ////
334 353
335 GrBlendCoeff getSrcBlendCoeff() const { return fSrcBlend; }
336 GrBlendCoeff getDstBlendCoeff() const { return fDstBlend; }
337
338 /**
339 * Retrieves the last value set by setBlendConstant()
340 * @return the blending constant value
341 */
342 GrColor getBlendConstant() const { return fBlendConstant; }
343
344 /** 354 /**
345 * Determines whether multiplying the computed per-pixel color by the pixel' s fractional 355 * Determines whether multiplying the computed per-pixel color by the pixel' s fractional
346 * coverage before the blend will give the correct final destination color. In general it 356 * coverage before the blend will give the correct final destination color. In general it
347 * will not as coverage is applied after blending. 357 * will not as coverage is applied after blending.
348 */ 358 */
349 bool canTweakAlphaForCoverage() const; 359 bool canTweakAlphaForCoverage() const;
350 360
351 /**
352 * Sets the blending function coefficients.
353 *
354 * The blend function will be:
355 * D' = sat(S*srcCoef + D*dstCoef)
356 *
357 * where D is the existing destination color, S is the incoming source
358 * color, and D' is the new destination color that will be written. sat()
359 * is the saturation function.
360 *
361 * @param srcCoef coefficient applied to the src color.
362 * @param dstCoef coefficient applied to the dst color.
363 */
364 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) {
365 fSrcBlend = srcCoeff;
366 fDstBlend = dstCoeff;
367 #ifdef SK_DEBUG
368 if (GrBlendCoeffRefsDst(dstCoeff)) {
369 SkDebugf("Unexpected dst blend coeff. Won't work correctly with cove rage stages.\n");
370 }
371 if (GrBlendCoeffRefsSrc(srcCoeff)) {
372 SkDebugf("Unexpected src blend coeff. Won't work correctly with cove rage stages.\n");
373 }
374 #endif
375 }
376
377 /**
378 * Sets the blending function constant referenced by the following blending
379 * coefficients:
380 * kConstC_GrBlendCoeff
381 * kIConstC_GrBlendCoeff
382 * kConstA_GrBlendCoeff
383 * kIConstA_GrBlendCoeff
384 *
385 * @param constant the constant to set
386 */
387 void setBlendConstant(GrColor constant) { fBlendConstant = constant; }
388
389 /// @} 361 /// @}
390 362
391 /////////////////////////////////////////////////////////////////////////// 363 ///////////////////////////////////////////////////////////////////////////
392 /// @name View Matrix 364 /// @name View Matrix
393 //// 365 ////
394 366
395 /** 367 /**
396 * Retrieves the current view matrix 368 * Retrieves the current view matrix
397 * @return the current view matrix. 369 * @return the current view matrix.
398 */ 370 */
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 602
631 /// @} 603 /// @}
632 604
633 /////////////////////////////////////////////////////////////////////////// 605 ///////////////////////////////////////////////////////////////////////////
634 606
635 GrDrawState& operator= (const GrDrawState& that); 607 GrDrawState& operator= (const GrDrawState& that);
636 608
637 private: 609 private:
638 bool isEqual(const GrDrawState& that) const; 610 bool isEqual(const GrDrawState& that) const;
639 611
640 /**
641 * Optimizations for blending / coverage to that can be applied based on the current state.
642 */
643 enum BlendOpt {
644 /**
645 * No optimization
646 */
647 kNone_BlendOpt,
648 /**
649 * Don't draw at all
650 */
651 kSkipDraw_BlendOpt,
652 /**
653 * The coverage value does not have to be computed separately from alpha , the the output
654 * color can be the modulation of the two.
655 */
656 kCoverageAsAlpha_BlendOpt,
657 /**
658 * Instead of emitting a src color, emit coverage in the alpha channel a nd r,g,b are
659 * "don't cares".
660 */
661 kEmitCoverage_BlendOpt,
662 /**
663 * Emit transparent black instead of the src color, no need to compute c overage.
664 */
665 kEmitTransBlack_BlendOpt
666 };
667
668 /**
669 * Determines what optimizations can be applied based on the blend. The coef ficients may have
670 * to be tweaked in order for the optimization to work. srcCoeff and dstCoef f are optional
671 * params that receive the tweaked coefficients. Normally the function looks at the current
672 * state to see if coverage is enabled. By setting forceCoverage the caller can speculatively
673 * determine the blend optimizations that would be used if there was partial pixel coverage.
674 *
675 * This is used internally and when constructing a GrOptDrawState.
676 */
677 BlendOpt getBlendOpt(bool forceCoverage = false,
678 GrBlendCoeff* srcCoeff = NULL,
679 GrBlendCoeff* dstCoeff = NULL) const;
680
681 const GrProcOptInfo& colorProcInfo() const { 612 const GrProcOptInfo& colorProcInfo() const {
682 this->calcColorInvariantOutput(); 613 this->calcColorInvariantOutput();
683 return fColorProcInfo; 614 return fColorProcInfo;
684 } 615 }
685 616
686 const GrProcOptInfo& coverageProcInfo() const { 617 const GrProcOptInfo& coverageProcInfo() const {
687 this->calcCoverageInvariantOutput(); 618 this->calcCoverageInvariantOutput();
688 return fCoverageProcInfo; 619 return fCoverageProcInfo;
689 } 620 }
690 621
(...skipping 18 matching lines...) Expand all
709 640
710 // Some of the auto restore objects assume that no effects are removed durin g their lifetime. 641 // Some of the auto restore objects assume that no effects are removed durin g their lifetime.
711 // This is used to assert that this condition holds. 642 // This is used to assert that this condition holds.
712 SkDEBUGCODE(int fBlockEffectRemovalCnt;) 643 SkDEBUGCODE(int fBlockEffectRemovalCnt;)
713 644
714 typedef SkSTArray<4, GrFragmentStage> FragmentStageArray; 645 typedef SkSTArray<4, GrFragmentStage> FragmentStageArray;
715 646
716 SkAutoTUnref<GrRenderTarget> fRenderTarget; 647 SkAutoTUnref<GrRenderTarget> fRenderTarget;
717 GrColor fColor; 648 GrColor fColor;
718 SkMatrix fViewMatrix; 649 SkMatrix fViewMatrix;
719 GrColor fBlendConstant;
720 uint32_t fFlagBits; 650 uint32_t fFlagBits;
721 GrStencilSettings fStencilSettings; 651 GrStencilSettings fStencilSettings;
722 uint8_t fCoverage; 652 uint8_t fCoverage;
723 DrawFace fDrawFace; 653 DrawFace fDrawFace;
724 GrBlendCoeff fSrcBlend;
725 GrBlendCoeff fDstBlend;
726 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; 654 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor;
727 SkAutoTUnref<const GrXPFactory> fXPFactory; 655 SkAutoTUnref<const GrXPFactory> fXPFactory;
728 FragmentStageArray fColorStages; 656 FragmentStageArray fColorStages;
729 FragmentStageArray fCoverageStages; 657 FragmentStageArray fCoverageStages;
730 uint32_t fHints; 658 uint32_t fHints;
731 659
732 mutable GrProcOptInfo fColorProcInfo; 660 mutable GrProcOptInfo fColorProcInfo;
733 mutable GrProcOptInfo fCoverageProcInfo; 661 mutable GrProcOptInfo fCoverageProcInfo;
734 mutable bool fColorProcInfoValid; 662 mutable bool fColorProcInfoValid;
735 mutable bool fCoverageProcInfoValid; 663 mutable bool fCoverageProcInfoValid;
736 664
737 friend class GrOptDrawState; 665 friend class GrOptDrawState;
738 }; 666 };
739 667
740 #endif 668 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698