GrPipelineBuilder.h revision 6be6f7cb66b277e7b1ce13d09b635fb8e09a2f68
19381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com/* 28dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * Copyright 2015 Google Inc. 39381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * 49381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * Use of this source code is governed by a BSD-style license that can be 59381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * found in the LICENSE file. 69381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com */ 79381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 88dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#ifndef GrPipelineBuilder_DEFINED 98dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#define GrPipelineBuilder_DEFINED 109381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 114d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt#include "GrBatch.h" 1224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org#include "GrBlend.h" 1344701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt#include "GrClip.h" 14c06482494d2be6481a3666a66254b6c66890f994egdaniel#include "GrDrawTargetCaps.h" 15f96ba02513eadd9fa24d75396ec9f2d6682e464cbsalomon#include "GrGpuResourceRef.h" 16ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "GrFragmentStage.h" 17b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel#include "GrProcOptInfo.h" 1889af44a0f1323dc136b238c00ccf143e15abb243egdaniel#include "GrRenderTarget.h" 1989af44a0f1323dc136b238c00ccf143e15abb243egdaniel#include "GrStencil.h" 209513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "GrXferProcessor.h" 2189af44a0f1323dc136b238c00ccf143e15abb243egdaniel#include "SkMatrix.h" 228750924a1470e8215b2a344155259b93062d3fa2egdaniel#include "effects/GrCoverageSetOpXP.h" 23080e673b10ac607305f140ddb245e140ccde40c6egdaniel#include "effects/GrDisableColorXP.h" 249513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "effects/GrPorterDuffXferProcessor.h" 2568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "effects/GrSimpleTextureEffect.h" 269381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 2789af44a0f1323dc136b238c00ccf143e15abb243egdanielclass GrDrawTargetCaps; 2889af44a0f1323dc136b238c00ccf143e15abb243egdanielclass GrPaint; 2989af44a0f1323dc136b238c00ccf143e15abb243egdanielclass GrTexture; 30170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel 318dd688b7569df569a672a8a67b2db86a9d376cfcegdanielclass GrPipelineBuilder { 322e3d144dfdbc4596d33baef7396316f88f412cc8bsalomon@google.compublic: 338dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel GrPipelineBuilder(); 348dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel 358dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel GrPipelineBuilder(const GrPipelineBuilder& pipelineBuilder) { 361acc3d7cc28c5631b5300578ab13439bdefd4e33commit-bot@chromium.org SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 378dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel *this = pipelineBuilder; 3846f7afb9867200b568c21736da8a8bbb56b20e30bsalomon@google.com } 3946f7afb9867200b568c21736da8a8bbb56b20e30bsalomon@google.com 408dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel virtual ~GrPipelineBuilder(); 41137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com 4252a5dcb43b5acbde377f664807b0f75af8bb1666bsalomon@google.com /** 438dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * Initializes the GrPipelineBuilder based on a GrPaint, view matrix and render target. Note 448dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * that GrPipelineBuilder encompasses more than GrPaint. Aspects of GrPipelineBuilder that have 458dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * no GrPaint equivalents are set to default values with the exception of vertex attribute state 468dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * which is unmodified by this function and clipping which will be enabled. 47af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com */ 48570d2f81a65fc868d6300a7edf34c0d5d048c5d6joshualitt void setFromPaint(const GrPaint&, GrRenderTarget*, const GrClip&); 498f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 502401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 516be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// @name Fragment Processors 52eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com /// 536be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// GrFragmentProcessors are used to compute per-pixel color and per-pixel fractional coverage. 546be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// There are two chains of FPs, one for color and one for coverage. The first FP in each 556be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// chain gets the initial color/coverage from the GrPrimitiveProcessor. It computes an output 566be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// color/coverage which is fed to the next FP in the chain. The last color and coverage FPs 576be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// feed their output to the GrXferProcessor which controls blending. 588f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 598f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 606be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon int numColorFragmentStages() const { return fColorStages.count(); } 616be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon int numCoverageFragmentStages() const { return fCoverageStages.count(); } 626be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon int numFragmentStages() const { return this->numColorFragmentStages() + 636be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon this->numCoverageFragmentStages(); } 64378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel 656be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon const GrFragmentStage& getColorFragmentStage(int idx) const { return fColorStages[idx]; } 666be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon const GrFragmentStage& getCoverageFragmentStage(int idx) const { return fCoverageStages[idx]; } 67080e673b10ac607305f140ddb245e140ccde40c6egdaniel 68b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor* addColorProcessor(const GrFragmentProcessor* effect) { 6949f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(effect); 70b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkNEW_APPEND_TO_TARRAY(&fColorStages, GrFragmentStage, (effect)); 71b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fColorProcInfoValid = false; 7265eb4d5a210884cc92c43a8582cbd1ccbddcab57jvanverth@google.com return effect; 7365eb4d5a210884cc92c43a8582cbd1ccbddcab57jvanverth@google.com } 7401c34ee59906f729f6ca7d35f0c0e5e2f5e693feskia.committer@gmail.com 75b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor* addCoverageProcessor(const GrFragmentProcessor* effect) { 7649f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(effect); 77b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrFragmentStage, (effect)); 78b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fCoverageProcInfoValid = false; 79adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com return effect; 80adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com } 81adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com 828f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 83c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com * Creates a GrSimpleTextureEffect that uses local coords as texture coordinates. 841e8f016305805d4d8cad74aba3a21b78486f9d6ftomhudson@google.com */ 85b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt void addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { 86b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); 871ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 881ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 89b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt void addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { 90b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); 917d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com } 92676e66096c60615bac52f365111596de5c4ca8a6tomhudson@google.com 93b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt void addColorTextureProcessor(GrTexture* texture, 94eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com const SkMatrix& matrix, 95eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com const GrTextureParams& params) { 96b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref(); 97b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } 98b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 99b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt void addCoverageTextureProcessor(GrTexture* texture, 100b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkMatrix& matrix, 101b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrTextureParams& params) { 102b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref(); 103ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org } 104676e66096c60615bac52f365111596de5c4ca8a6tomhudson@google.com 105972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com /** 1066be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * When this object is destroyed it will remove any color/coverage FPs from the pipeline builder 1076be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * that were added after its constructor. 108972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com */ 1096be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon class AutoRestoreFragmentProcessors : public ::SkNoncopyable { 110972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com public: 1116be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon AutoRestoreFragmentProcessors() 1128dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel : fPipelineBuilder(NULL) 1139b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon , fColorEffectCnt(0) 1149b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon , fCoverageEffectCnt(0) {} 1159b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon 1166be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon AutoRestoreFragmentProcessors(GrPipelineBuilder* ds) 1178dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel : fPipelineBuilder(NULL) 1189b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon , fColorEffectCnt(0) 1199b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon , fCoverageEffectCnt(0) { 1205c493d5b3dc753fccba47c8250fb38713bac3cb8skia.committer@gmail.com this->set(ds); 121f09b87dda39df1315f26afb663aeaf8048330725robertphillips@google.com } 122eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com 1236be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon ~AutoRestoreFragmentProcessors() { this->set(NULL); } 124eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com 1258dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void set(GrPipelineBuilder* ds); 126eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com 1278dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel bool isSet() const { return SkToBool(fPipelineBuilder); } 1288af0523b38f25993c8b1ba3a3562b9f9ac87162dbsalomon 129972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com private: 1308dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel GrPipelineBuilder* fPipelineBuilder; 1319b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon int fColorEffectCnt; 1329b536523cae9787f6b24ed9234c50cdf2710d67ebsalomon int fCoverageEffectCnt; 133972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com }; 134972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com 1358f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 1368f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1378f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 1388f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Blending 1398f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 1408f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 14189af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 14289af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Determines whether multiplying the computed per-pixel color by the pixel's fractional 14389af44a0f1323dc136b238c00ccf143e15abb243egdaniel * coverage before the blend will give the correct final destination color. In general it 14489af44a0f1323dc136b238c00ccf143e15abb243egdaniel * will not as coverage is applied after blending. 14589af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 14689af44a0f1323dc136b238c00ccf143e15abb243egdaniel bool canTweakAlphaForCoverage() const; 14789af44a0f1323dc136b238c00ccf143e15abb243egdaniel 1486be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /** 1496be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * This function returns true if the render target destination pixel values will be read for 1506be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * blending during draw. 1516be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon */ 1526be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon bool willBlendWithDst(const GrPrimitiveProcessor*) const; 1536be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 1546be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /** 1556be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * Installs a GrXPFactory. This object controls how src color, fractional pixel coverage, 1566be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * and the dst color are blended. 1576be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon */ 1586be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon const GrXPFactory* setXPFactory(const GrXPFactory* xpFactory) { 1596be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fXPFactory.reset(SkRef(xpFactory)); 1606be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon return xpFactory; 1616be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 1628f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1636be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /** 1646be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * Sets a GrXPFactory that will ignore src color and perform a set operation between the draws 1656be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * output coverage and the destination. This is useful to render coverage masks as CSG. 1666be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon */ 1676be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon void setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage = false) { 1686be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fXPFactory.reset(GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage)); 1696be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 1706be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 1716be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /** 1726be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * Sets a GrXPFactory that disables color writes to the destination. This is useful when 1736be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * rendering to the stencil buffer. 1746be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon */ 1756be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon void setDisableColorXPFactory() { 1766be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fXPFactory.reset(GrDisableColorXPFactory::Create()); 1776be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 1786be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 1796be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon const GrXPFactory* getXPFactory() const { 1806be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon if (!fXPFactory) { 1816be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fXPFactory.reset(GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode)); 1826be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 1836be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon return fXPFactory.get(); 1846be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 1856be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 1866be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /** 1876be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * Checks whether the xp will need a copy of the destination to correctly blend. 1886be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon */ 1896be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon bool willXPNeedDstCopy(const GrDrawTargetCaps& caps, const GrProcOptInfo& colorPOI, 1906be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon const GrProcOptInfo& coveragePOI) const; 191d27f73ef27ff65a6a0a5d00aa8e5b784b1a0b47ejoshualitt 1928f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 1938f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1946be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 1958f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 1968f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Render Target 1978f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 1988f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1998f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 20089af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Retrieves the currently set render-target. 20189af44a0f1323dc136b238c00ccf143e15abb243egdaniel * 20289af44a0f1323dc136b238c00ccf143e15abb243egdaniel * @return The currently set render target. 20389af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 20437dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } 20589af44a0f1323dc136b238c00ccf143e15abb243egdaniel 20689af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 207ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * Sets the render-target used at the next drawing call 2088f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 2098f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param target The render target to set. 2108f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 211ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon void setRenderTarget(GrRenderTarget* target) { fRenderTarget.reset(SkSafeRef(target)); } 2128f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 2138f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 2148f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 2158f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 2168f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Stencil 2178f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 2188f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 21989af44a0f1323dc136b238c00ccf143e15abb243egdaniel const GrStencilSettings& getStencil() const { return fStencilSettings; } 22089af44a0f1323dc136b238c00ccf143e15abb243egdaniel 2218f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 2228f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Sets the stencil settings to use for the next draw. 2238f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Changing the clip has the side-effect of possibly zeroing 2248f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * out the client settable stencil bits. So multipass algorithms 2258f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * using stencil should not change the clip between passes. 2268f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param settings the stencil settings to use. 2278f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 22804ddf89627077ea8f2b447e7cd5e902956341a32bsalomon void setStencil(const GrStencilSettings& settings) { fStencilSettings = settings; } 2298f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 2308f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 2318f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Shortcut to disable stencil testing and ops. 2328f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 23304ddf89627077ea8f2b447e7cd5e902956341a32bsalomon void disableStencil() { fStencilSettings.setDisabled(); } 2348f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 2352ed5ef84a5609089ad9d8a8f3a52bf77e76476dbbsalomon GrStencilSettings* stencil() { return &fStencilSettings; } 2368f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 2376be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /** 2386be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * AutoRestoreStencil 2396be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * 2406be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * This simple struct saves and restores the stencil settings 2416be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon */ 2426be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon class AutoRestoreStencil : public ::SkNoncopyable { 2436be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon public: 2446be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon AutoRestoreStencil() : fPipelineBuilder(NULL) {} 2456be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2466be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon AutoRestoreStencil(GrPipelineBuilder* ds) : fPipelineBuilder(NULL) { this->set(ds); } 2476be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2486be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon ~AutoRestoreStencil() { this->set(NULL); } 2496be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2506be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon void set(GrPipelineBuilder* ds) { 2516be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon if (fPipelineBuilder) { 2526be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fPipelineBuilder->setStencil(fStencilSettings); 2536be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 2546be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fPipelineBuilder = ds; 2556be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon if (ds) { 2566be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon fStencilSettings = ds->getStencil(); 2576be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 2586be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon } 2596be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2606be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon bool isSet() const { return SkToBool(fPipelineBuilder); } 2616be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2626be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon private: 2636be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrPipelineBuilder* fPipelineBuilder; 2646be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrStencilSettings fStencilSettings; 2656be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon }; 2666be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2676be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 2688f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 2698f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 2708f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 2718f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name State Flags 2728f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 2738f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 27489af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 27589af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Flags that affect rendering. Controlled using enable/disableState(). All 27689af44a0f1323dc136b238c00ccf143e15abb243egdaniel * default to disabled. 27789af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 27889af44a0f1323dc136b238c00ccf143e15abb243egdaniel enum StateBits { 27989af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 28089af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Perform dithering. TODO: Re-evaluate whether we need this bit 28189af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 28289af44a0f1323dc136b238c00ccf143e15abb243egdaniel kDither_StateBit = 0x01, 28389af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 28489af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target, 28589af44a0f1323dc136b238c00ccf143e15abb243egdaniel * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by 28689af44a0f1323dc136b238c00ccf143e15abb243egdaniel * the 3D API. 28789af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 28889af44a0f1323dc136b238c00ccf143e15abb243egdaniel kHWAntialias_StateBit = 0x02, 28989af44a0f1323dc136b238c00ccf143e15abb243egdaniel 29044701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt kLast_StateBit = kHWAntialias_StateBit, 29189af44a0f1323dc136b238c00ccf143e15abb243egdaniel }; 29289af44a0f1323dc136b238c00ccf143e15abb243egdaniel 29304ddf89627077ea8f2b447e7cd5e902956341a32bsalomon bool isDither() const { return 0 != (fFlagBits & kDither_StateBit); } 29404ddf89627077ea8f2b447e7cd5e902956341a32bsalomon bool isHWAntialias() const { return 0 != (fFlagBits & kHWAntialias_StateBit); } 2950fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 2968f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 2978f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Enable render state settings. 2988f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 2991e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param stateBits bitfield of StateBits specifying the states to enable 3008f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 30104ddf89627077ea8f2b447e7cd5e902956341a32bsalomon void enableState(uint32_t stateBits) { fFlagBits |= stateBits; } 3020fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 3038f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 3048f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Disable render state settings. 3058f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 3061e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param stateBits bitfield of StateBits specifying the states to disable 3078f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 30804ddf89627077ea8f2b447e7cd5e902956341a32bsalomon void disableState(uint32_t stateBits) { fFlagBits &= ~(stateBits); } 3090fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 310d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com /** 311d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com * Enable or disable stateBits based on a boolean. 312d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com * 3131e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param stateBits bitfield of StateBits to enable or disable 314d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com * @param enable if true enable stateBits, otherwise disable 315d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com */ 316d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com void setState(uint32_t stateBits, bool enable) { 317d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com if (enable) { 318d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com this->enableState(stateBits); 319d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com } else { 320d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com this->disableState(stateBits); 321d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com } 322d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com } 323d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com 3248f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 3258f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 3268f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 3278f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Face Culling 3288f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 3298f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 33089af44a0f1323dc136b238c00ccf143e15abb243egdaniel enum DrawFace { 33189af44a0f1323dc136b238c00ccf143e15abb243egdaniel kInvalid_DrawFace = -1, 33289af44a0f1323dc136b238c00ccf143e15abb243egdaniel 33389af44a0f1323dc136b238c00ccf143e15abb243egdaniel kBoth_DrawFace, 33489af44a0f1323dc136b238c00ccf143e15abb243egdaniel kCCW_DrawFace, 33589af44a0f1323dc136b238c00ccf143e15abb243egdaniel kCW_DrawFace, 33689af44a0f1323dc136b238c00ccf143e15abb243egdaniel }; 33789af44a0f1323dc136b238c00ccf143e15abb243egdaniel 33889af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 33989af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Gets whether the target is drawing clockwise, counterclockwise, 34089af44a0f1323dc136b238c00ccf143e15abb243egdaniel * or both faces. 34189af44a0f1323dc136b238c00ccf143e15abb243egdaniel * @return the current draw face(s). 34289af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 34389af44a0f1323dc136b238c00ccf143e15abb243egdaniel DrawFace getDrawFace() const { return fDrawFace; } 34489af44a0f1323dc136b238c00ccf143e15abb243egdaniel 3458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 3468f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Controls whether clockwise, counterclockwise, or both faces are drawn. 3478f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param face the face(s) to draw. 3488f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 3498f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setDrawFace(DrawFace face) { 350f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kInvalid_DrawFace != face); 3512ed5ef84a5609089ad9d8a8f3a52bf77e76476dbbsalomon fDrawFace = face; 3528f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 3538f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 3548f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 3558f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 3568f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 35762b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com 3586be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrPipelineBuilder& operator=(const GrPipelineBuilder& that); 35962b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com 3604d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt // TODO delete when we have Batch 36156995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt const GrProcOptInfo& colorProcInfo(const GrPrimitiveProcessor* pp) const { 36256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt this->calcColorInvariantOutput(pp); 363912b3d24a0e214e46a211da40cc01fe30238386cegdaniel return fColorProcInfo; 364912b3d24a0e214e46a211da40cc01fe30238386cegdaniel } 365912b3d24a0e214e46a211da40cc01fe30238386cegdaniel 36656995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt const GrProcOptInfo& coverageProcInfo(const GrPrimitiveProcessor* pp) const { 36756995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt this->calcCoverageInvariantOutput(pp); 368912b3d24a0e214e46a211da40cc01fe30238386cegdaniel return fCoverageProcInfo; 369912b3d24a0e214e46a211da40cc01fe30238386cegdaniel } 370912b3d24a0e214e46a211da40cc01fe30238386cegdaniel 3714d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt const GrProcOptInfo& colorProcInfo(const GrBatch* batch) const { 3724d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt this->calcColorInvariantOutput(batch); 3734d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt return fColorProcInfo; 3744d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt } 3754d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt 3764d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt const GrProcOptInfo& coverageProcInfo(const GrBatch* batch) const { 3774d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt this->calcCoverageInvariantOutput(batch); 3784d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt return fCoverageProcInfo; 3794d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt } 38044701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt 38144701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt void setClip(const GrClip& clip) { fClip = clip; } 38244701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt const GrClip& clip() const { return fClip; } 38344701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt 384e36914cb205699526988127a827d1a76c9a98d39egdanielprivate: 385e36914cb205699526988127a827d1a76c9a98d39egdaniel // Calculating invariant color / coverage information is expensive, so we partially cache the 386e36914cb205699526988127a827d1a76c9a98d39egdaniel // results. 387e36914cb205699526988127a827d1a76c9a98d39egdaniel // 388e36914cb205699526988127a827d1a76c9a98d39egdaniel // canUseFracCoveragePrimProc() - Called in regular skia draw, caches results but only for a 389e36914cb205699526988127a827d1a76c9a98d39egdaniel // specific color and coverage. May be called multiple times 390e36914cb205699526988127a827d1a76c9a98d39egdaniel // willBlendWithDst() - only called by Nvpr, does not cache results 391e36914cb205699526988127a827d1a76c9a98d39egdaniel // GrOptDrawState constructor - never caches results 3924d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt 39389af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 3944d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt * Primproc variants of the calc functions 3954d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt * TODO remove these when batch is everywhere 39656995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt */ 39756995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt void calcColorInvariantOutput(const GrPrimitiveProcessor*) const; 3984d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void calcCoverageInvariantOutput(const GrPrimitiveProcessor*) const; 39956995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt 40056995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt /** 4014d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt * GrBatch provides the initial seed for these loops based off of its initial geometry data 40289af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 4034d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void calcColorInvariantOutput(const GrBatch*) const; 4044d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void calcCoverageInvariantOutput(const GrBatch*) const; 40589af44a0f1323dc136b238c00ccf143e15abb243egdaniel 406b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel /** 407b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * If fColorProcInfoValid is false, function calculates the invariant output for the color 4086be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * processors and results are stored in fColorProcInfo. 409b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel */ 4102e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt void calcColorInvariantOutput(GrColor) const; 411b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 412b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel /** 413b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * If fCoverageProcInfoValid is false, function calculates the invariant output for the coverage 4146be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon * processors and results are stored in fCoverageProcInfo. 415b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel */ 4162e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt void calcCoverageInvariantOutput(GrColor) const; 417b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 418eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com // Some of the auto restore objects assume that no effects are removed during their lifetime. 419eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com // This is used to assert that this condition holds. 4201acc3d7cc28c5631b5300578ab13439bdefd4e33commit-bot@chromium.org SkDEBUGCODE(int fBlockEffectRemovalCnt;) 4218f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 422a5305a110ab5201d5dadd40cbe711582d5ac4996joshualitt typedef SkSTArray<4, GrFragmentStage> FragmentStageArray; 42389af44a0f1323dc136b238c00ccf143e15abb243egdaniel 424ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon SkAutoTUnref<GrRenderTarget> fRenderTarget; 425ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon uint32_t fFlagBits; 426ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon GrStencilSettings fStencilSettings; 427ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon DrawFace fDrawFace; 4282fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt mutable SkAutoTUnref<const GrXPFactory> fXPFactory; 429ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon FragmentStageArray fColorStages; 430ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon FragmentStageArray fCoverageStages; 43144701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt GrClip fClip; 43289af44a0f1323dc136b238c00ccf143e15abb243egdaniel 433b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel mutable GrProcOptInfo fColorProcInfo; 434b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel mutable GrProcOptInfo fCoverageProcInfo; 435b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel mutable bool fColorProcInfoValid; 436b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel mutable bool fCoverageProcInfoValid; 4372e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt mutable GrColor fColorCache; 4382e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt mutable GrColor fCoverageCache; 439b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 4408dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel friend class GrPipeline; 4419381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com}; 4429381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 4439381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#endif 444