GrPipeline.h revision 611572ce3ef9b477e15471c3f5bacb66260e4913
13658f382cc129e463d7f40a7e68214d04d50fe14egdaniel/* 28dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * Copyright 2015 Google Inc. 33658f382cc129e463d7f40a7e68214d04d50fe14egdaniel * 43658f382cc129e463d7f40a7e68214d04d50fe14egdaniel * Use of this source code is governed by a BSD-style license that can be 53658f382cc129e463d7f40a7e68214d04d50fe14egdaniel * found in the LICENSE file. 63658f382cc129e463d7f40a7e68214d04d50fe14egdaniel */ 73658f382cc129e463d7f40a7e68214d04d50fe14egdaniel 88dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#ifndef GrPipeline_DEFINED 98dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#define GrPipeline_DEFINED 103658f382cc129e463d7f40a7e68214d04d50fe14egdaniel 11b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel#include "GrColor.h" 12ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon#include "GrFragmentProcessor.h" 13dbe1e6f0c32bd07b7669b1b1ac3c7f58c9b8d773joshualitt#include "GrNonAtomicRef.h" 14ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon#include "GrPendingProgramElement.h" 155298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon#include "GrProcessorSet.h" 1679f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt#include "GrProgramDesc.h" 17bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton#include "GrScissorState.h" 18c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton#include "GrUserStencilSettings.h" 19bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton#include "GrWindowRectsState.h" 20b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel#include "SkMatrix.h" 21b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel#include "SkRefCnt.h" 225fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrCoverageSetOpXP.h" 235fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrDisableColorXP.h" 245fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrPorterDuffXferProcessor.h" 255fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrSimpleTextureEffect.h" 265fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips 27652ecb51624941545aaedcea47bf51b314738c9cBrian Salomonclass GrAppliedClip; 2879f8faeea2692d2948c0f634e956d1e7fc8333e0joshualittclass GrDeviceCoordTexture; 2925a880960a9a689a745a01071ecba3fe494b5940Brian Salomonclass GrOp; 308dd688b7569df569a672a8a67b2db86a9d376cfcegdanielclass GrPipelineBuilder; 3125a880960a9a689a745a01071ecba3fe494b5940Brian Salomonclass GrRenderTargetContext; 323658f382cc129e463d7f40a7e68214d04d50fe14egdaniel 3392aee3d6857386f2b5b8e1148e680a7b58e9b1fcBrian Salomon/** 348dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * Class that holds an optimized version of a GrPipelineBuilder. It is meant to be an immutable 358dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * class, and contains all data needed to set the state for a gpu draw. 363658f382cc129e463d7f40a7e68214d04d50fe14egdaniel */ 374833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdaltonclass GrPipeline : public GrNonAtomicRef<GrPipeline> { 383658f382cc129e463d7f40a7e68214d04d50fe14egdanielpublic: 39cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /////////////////////////////////////////////////////////////////////////// 40cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /// @name Creation 41cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon 42189098e70967c05c8810299b4afa325736a6565eBrian Salomon enum Flags { 43189098e70967c05c8810299b4afa325736a6565eBrian Salomon /** 44189098e70967c05c8810299b4afa325736a6565eBrian Salomon * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target, 45189098e70967c05c8810299b4afa325736a6565eBrian Salomon * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by 46189098e70967c05c8810299b4afa325736a6565eBrian Salomon * the 3D API. 47189098e70967c05c8810299b4afa325736a6565eBrian Salomon */ 48189098e70967c05c8810299b4afa325736a6565eBrian Salomon kHWAntialias_Flag = 0x1, 49189098e70967c05c8810299b4afa325736a6565eBrian Salomon /** 50189098e70967c05c8810299b4afa325736a6565eBrian Salomon * Modifies the vertex shader so that vertices will be positioned at pixel centers. 51189098e70967c05c8810299b4afa325736a6565eBrian Salomon */ 52189098e70967c05c8810299b4afa325736a6565eBrian Salomon kSnapVerticesToPixelCenters_Flag = 0x2, 53611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon /** Disables conversion to sRGB from linear when writing to a sRGB destination. */ 54611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon kDisableOutputConversionToSRGB_Flag = 0x4, 55611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon /** Allows conversion from sRGB to linear when reading from processor's sRGB texture. */ 56611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon kAllowSRGBInputs_Flag = 0x8, 57189098e70967c05c8810299b4afa325736a6565eBrian Salomon }; 58189098e70967c05c8810299b4afa325736a6565eBrian Salomon 59611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon static uint32_t SRGBFlagsFromPaint(const GrPaint& paint) { 60611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon uint32_t flags = 0; 61611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon if (paint.getAllowSRGBInputs()) { 62611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon flags |= kAllowSRGBInputs_Flag; 63611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon } 64611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon if (paint.getDisableOutputConversionToSRGB()) { 65611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon flags |= kDisableOutputConversionToSRGB_Flag; 66611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon } 67611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon return flags; 68611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon } 69611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon 70b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon struct InitArgs { 71189098e70967c05c8810299b4afa325736a6565eBrian Salomon uint32_t fFlags = 0; 72189098e70967c05c8810299b4afa325736a6565eBrian Salomon GrDrawFace fDrawFace = GrDrawFace::kBoth; 7348d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon const GrProcessorSet* fProcessors = nullptr; // Must be finalized 74189098e70967c05c8810299b4afa325736a6565eBrian Salomon const GrUserStencilSettings* fUserStencil = &GrUserStencilSettings::kUnused; 75b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon const GrAppliedClip* fAppliedClip = nullptr; 76b16e8ac7f37b30ca9a51367e49c5815f36774120Brian Salomon GrRenderTarget* fRenderTarget = nullptr; 77189098e70967c05c8810299b4afa325736a6565eBrian Salomon const GrCaps* fCaps = nullptr; 78a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon GrXferProcessor::DstTexture fDstTexture; 79a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon }; 80a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon 81b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon /** 82b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon * A Default constructed pipeline is unusable until init() is called. 83b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon **/ 84b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon GrPipeline() = default; 85b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel 86119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton /** 87119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton * Creates a simple pipeline with default settings and no processors. The provided blend mode 88b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon * must be "Porter Duff" (<= kLastCoeffMode). This pipeline is initialized without requiring 89b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon * a call to init(). 90119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton **/ 91119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton GrPipeline(GrRenderTarget*, SkBlendMode); 92119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton 93b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon /** (Re)initializes a pipeline. After initialization the pipeline can be used. */ 94e7d30484ea8a5677a9403ccd23a9c0961df62ccdBrian Salomon void init(const InitArgs&); 95b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon 96b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon /** True if the pipeline has been initialized. */ 97b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon bool isInitialized() const { return SkToBool(fRenderTarget.get()); } 98b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon 99cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /// @} 100cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon 101cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /////////////////////////////////////////////////////////////////////////// 102cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /// @name Comparisons 103cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon 104cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /** 1052fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt * Returns true if these pipelines are equivalent. Coord transforms may be applied either on 1062fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt * the GPU or the CPU. When we apply them on the CPU then the matrices need not agree in order 1072fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt * to combine draws. Therefore we take a param that indicates whether coord transforms should be 1082fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt * compared." 1099b98932adaceb7ad0a617ade16616923f6bffe84joshualitt */ 1107312ff87f64f31d741989a60d993bcaa4bb20523bsalomon static bool AreEqual(const GrPipeline& a, const GrPipeline& b); 111cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon 112cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon /** 11309d994ecb30de2e62a31af2c16307af31fe0e0b3Brian Salomon * Allows a GrOp subclass to determine whether two GrOp instances can combine. This is a 11409d994ecb30de2e62a31af2c16307af31fe0e0b3Brian Salomon * stricter test than isEqual because it also considers blend barriers when the two ops' 11509d994ecb30de2e62a31af2c16307af31fe0e0b3Brian Salomon * bounds overlap 116cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon */ 117cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon static bool CanCombine(const GrPipeline& a, const SkRect& aBounds, 118cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon const GrPipeline& b, const SkRect& bBounds, 1197312ff87f64f31d741989a60d993bcaa4bb20523bsalomon const GrCaps& caps) { 1207312ff87f64f31d741989a60d993bcaa4bb20523bsalomon if (!AreEqual(a, b)) { 121cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon return false; 122cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon } 123cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon if (a.xferBarrierType(caps)) { 124cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon return aBounds.fRight <= bBounds.fLeft || 125cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon aBounds.fBottom <= bBounds.fTop || 126cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon bBounds.fRight <= aBounds.fLeft || 127cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon bBounds.fBottom <= aBounds.fTop; 128cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon } 129cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon return true; 130cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon } 13189af44a0f1323dc136b238c00ccf143e15abb243egdaniel 13289af44a0f1323dc136b238c00ccf143e15abb243egdaniel /// @} 13389af44a0f1323dc136b238c00ccf143e15abb243egdaniel 13489af44a0f1323dc136b238c00ccf143e15abb243egdaniel /////////////////////////////////////////////////////////////////////////// 1356be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon /// @name GrFragmentProcessors 1366be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 137f2361d2d93c200cd4555b5e8ecea4531801abaaaRobert Phillips // Make the renderTarget's GrOpList (if it exists) be dependent on any 138f2361d2d93c200cd4555b5e8ecea4531801abaaaRobert Phillips // GrOpLists in this pipeline 139c589b0b5c0235c3adedc574c8846fb62414ed93cRobert Phillips void addDependenciesTo(GrRenderTargetProxy*) const; 1406be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon 141ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon int numColorFragmentProcessors() const { return fNumColorProcessors; } 142ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon int numCoverageFragmentProcessors() const { 143ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon return fFragmentProcessors.count() - fNumColorProcessors; 144ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon } 145ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon int numFragmentProcessors() const { return fFragmentProcessors.count(); } 14689af44a0f1323dc136b238c00ccf143e15abb243egdaniel 1472047b7855546b21f7956c398592c070b3f91a9dbbsalomon const GrXferProcessor& getXferProcessor() const { 148d61c9d93b126dca0af17eff89be8536944dadf81Brian Salomon if (fXferProcessor) { 1492047b7855546b21f7956c398592c070b3f91a9dbbsalomon return *fXferProcessor.get(); 1502047b7855546b21f7956c398592c070b3f91a9dbbsalomon } else { 1512047b7855546b21f7956c398592c070b3f91a9dbbsalomon // A null xp member means the common src-over case. GrXferProcessor's ref'ing 1522047b7855546b21f7956c398592c070b3f91a9dbbsalomon // mechanism is not thread safe so we do not hold a ref on this global. 1532047b7855546b21f7956c398592c070b3f91a9dbbsalomon return GrPorterDuffXPFactory::SimpleSrcOverXP(); 1542047b7855546b21f7956c398592c070b3f91a9dbbsalomon } 1552047b7855546b21f7956c398592c070b3f91a9dbbsalomon } 156378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel 15718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon /** 15818dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon * If the GrXferProcessor uses a texture to access the dst color, then this returns that 15918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon * texture and the offset to the dst contents within that texture. 16018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon */ 16118dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon GrTexture* dstTexture(SkIPoint* offset = nullptr) const { 16218dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon if (offset) { 16318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon *offset = fDstTextureOffset; 16418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon } 16518dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon return fDstTexture.get(); 16618dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon } 16718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon 168ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon const GrFragmentProcessor& getColorFragmentProcessor(int idx) const { 169ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon SkASSERT(idx < this->numColorFragmentProcessors()); 170ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon return *fFragmentProcessors[idx].get(); 171d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel } 172ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon 173ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon const GrFragmentProcessor& getCoverageFragmentProcessor(int idx) const { 174ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon SkASSERT(idx < this->numCoverageFragmentProcessors()); 175ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon return *fFragmentProcessors[fNumColorProcessors + idx].get(); 176d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel } 177ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon 178ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon const GrFragmentProcessor& getFragmentProcessor(int idx) const { 179ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon return *fFragmentProcessors[idx].get(); 180ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon } 18189af44a0f1323dc136b238c00ccf143e15abb243egdaniel 18289af44a0f1323dc136b238c00ccf143e15abb243egdaniel /// @} 18389af44a0f1323dc136b238c00ccf143e15abb243egdaniel 18489af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 18589af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Retrieves the currently set render-target. 18689af44a0f1323dc136b238c00ccf143e15abb243egdaniel * 18789af44a0f1323dc136b238c00ccf143e15abb243egdaniel * @return The currently set render target. 18889af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 18937dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } 19089af44a0f1323dc136b238c00ccf143e15abb243egdaniel 191c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton const GrUserStencilSettings* getUserStencil() const { return fUserStencilSettings; } 19289af44a0f1323dc136b238c00ccf143e15abb243egdaniel 1933e79124a69d4806f0a1a776090bff718e1b90970bsalomon const GrScissorState& getScissorState() const { return fScissorState; } 19454e0c12a5ab2d83fe249dd199d6879e8c0f04404joshualitt 195bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton const GrWindowRectsState& getWindowRectsState() const { return fWindowRectsState; } 19628341fad8438b294ed7311edbc68d8cb34a990abcsmartdalton 197189098e70967c05c8810299b4afa325736a6565eBrian Salomon bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAntialias_Flag); } 198189098e70967c05c8810299b4afa325736a6565eBrian Salomon bool snapVerticesToPixelCenters() const { 199189098e70967c05c8810299b4afa325736a6565eBrian Salomon return SkToBool(fFlags & kSnapVerticesToPixelCenters_Flag); 200189098e70967c05c8810299b4afa325736a6565eBrian Salomon } 20164d094d7756534a9b9b0997aab225d9ceba098b6brianosman bool getDisableOutputConversionToSRGB() const { 20264d094d7756534a9b9b0997aab225d9ceba098b6brianosman return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag); 20364d094d7756534a9b9b0997aab225d9ceba098b6brianosman } 204898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman bool getAllowSRGBInputs() const { 205898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman return SkToBool(fFlags & kAllowSRGBInputs_Flag); 206898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman } 2079b03e7b29d963ea333a66dc5353e94f6391eb899dvonbeck bool usesDistanceVectorField() const { 2089b03e7b29d963ea333a66dc5353e94f6391eb899dvonbeck return SkToBool(fFlags & kUsesDistanceVectorField_Flag); 2099b03e7b29d963ea333a66dc5353e94f6391eb899dvonbeck } 210193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton bool hasStencilClip() const { 211193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton return SkToBool(fFlags & kHasStencilClip_Flag); 212193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton } 213c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton bool isStencilEnabled() const { 214c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton return SkToBool(fFlags & kStencilEnabled_Flag); 215c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton } 21689af44a0f1323dc136b238c00ccf143e15abb243egdaniel 217cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon GrXferBarrierType xferBarrierType(const GrCaps& caps) const { 21818dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon if (fDstTexture.get() && fDstTexture.get() == fRenderTarget.get()->asTexture()) { 21918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon return kTexture_GrXferBarrierType; 22018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon } 22118dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon return this->getXferProcessor().xferBarrierType(caps); 222cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon } 223cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon 22489af44a0f1323dc136b238c00ccf143e15abb243egdaniel /** 22589af44a0f1323dc136b238c00ccf143e15abb243egdaniel * Gets whether the target is drawing clockwise, counterclockwise, 22689af44a0f1323dc136b238c00ccf143e15abb243egdaniel * or both faces. 22789af44a0f1323dc136b238c00ccf143e15abb243egdaniel * @return the current draw face(s). 22889af44a0f1323dc136b238c00ccf143e15abb243egdaniel */ 229189098e70967c05c8810299b4afa325736a6565eBrian Salomon GrDrawFace getDrawFace() const { return static_cast<GrDrawFace>(fDrawFace); } 23089af44a0f1323dc136b238c00ccf143e15abb243egdaniel 231dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualittprivate: 232f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon /** This is a continuation of the public "Flags" enum. */ 233189098e70967c05c8810299b4afa325736a6565eBrian Salomon enum PrivateFlags { 234189098e70967c05c8810299b4afa325736a6565eBrian Salomon kUsesDistanceVectorField_Flag = 0x10, 235189098e70967c05c8810299b4afa325736a6565eBrian Salomon kHasStencilClip_Flag = 0x20, 236189098e70967c05c8810299b4afa325736a6565eBrian Salomon kStencilEnabled_Flag = 0x40, 23704ddf89627077ea8f2b447e7cd5e902956341a32bsalomon }; 23804ddf89627077ea8f2b447e7cd5e902956341a32bsalomon 23918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon using RenderTarget = GrPendingIOResource<GrRenderTarget, kWrite_GrIOType>; 24018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon using DstTexture = GrPendingIOResource<GrTexture, kRead_GrIOType>; 24118dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon using PendingFragmentProcessor = GrPendingProgramElement<const GrFragmentProcessor>; 24218dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon using FragmentProcessorArray = SkAutoSTArray<8, PendingFragmentProcessor>; 24318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon 24418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon DstTexture fDstTexture; 24518dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon SkIPoint fDstTextureOffset; 24618dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon RenderTarget fRenderTarget; 24718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon GrScissorState fScissorState; 24818dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon GrWindowRectsState fWindowRectsState; 24918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon const GrUserStencilSettings* fUserStencilSettings; 25018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon uint16_t fDrawFace; 25118dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon uint16_t fFlags; 252d61c9d93b126dca0af17eff89be8536944dadf81Brian Salomon sk_sp<const GrXferProcessor> fXferProcessor; 25318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon FragmentProcessorArray fFragmentProcessors; 254d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel 255ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon // This value is also the index in fFragmentProcessors where coverage processors begin. 25618dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon int fNumColorProcessors; 25789af44a0f1323dc136b238c00ccf143e15abb243egdaniel 25889af44a0f1323dc136b238c00ccf143e15abb243egdaniel typedef SkRefCnt INHERITED; 2593658f382cc129e463d7f40a7e68214d04d50fe14egdaniel}; 2603658f382cc129e463d7f40a7e68214d04d50fe14egdaniel 2613658f382cc129e463d7f40a7e68214d04d50fe14egdaniel#endif 262