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