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"
17a4677b5db51fca9f2d1077a4d09dd8f7c80df3d1Brian Salomon#include "GrRect.h"
18c9c06d45863e64ae99ef54c8c56014c855f1ca65Robert Phillips#include "GrRenderTarget.h"
19bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton#include "GrScissorState.h"
20c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton#include "GrUserStencilSettings.h"
21bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton#include "GrWindowRectsState.h"
22b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel#include "SkMatrix.h"
23b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel#include "SkRefCnt.h"
245fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrCoverageSetOpXP.h"
255fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrDisableColorXP.h"
265fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrPorterDuffXferProcessor.h"
275fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips#include "effects/GrSimpleTextureEffect.h"
285fa7f30331585f78cf0f81ac185abbff1fee1152robertphillips
29652ecb51624941545aaedcea47bf51b314738c9cBrian Salomonclass GrAppliedClip;
3079f8faeea2692d2948c0f634e956d1e7fc8333e0joshualittclass GrDeviceCoordTexture;
3125a880960a9a689a745a01071ecba3fe494b5940Brian Salomonclass GrOp;
3225a880960a9a689a745a01071ecba3fe494b5940Brian Salomonclass GrRenderTargetContext;
333658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3492aee3d6857386f2b5b8e1148e680a7b58e9b1fcBrian Salomon/**
35e5b399ee69332e0d68a660d6695d1182a4cb16b1Brian Salomon * This immutable object contains information needed to set build a shader program and set API
36e5b399ee69332e0d68a660d6695d1182a4cb16b1Brian Salomon * state for a draw. It is used along with a GrPrimitiveProcessor and a source of geometric
37e5b399ee69332e0d68a660d6695d1182a4cb16b1Brian Salomon * data (GrMesh or GrPath) to draw.
383658f382cc129e463d7f40a7e68214d04d50fe14egdaniel */
394833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdaltonclass GrPipeline : public GrNonAtomicRef<GrPipeline> {
403658f382cc129e463d7f40a7e68214d04d50fe14egdanielpublic:
41cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    ///////////////////////////////////////////////////////////////////////////
42cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    /// @name Creation
43cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon
44189098e70967c05c8810299b4afa325736a6565eBrian Salomon    enum Flags {
45189098e70967c05c8810299b4afa325736a6565eBrian Salomon        /**
46189098e70967c05c8810299b4afa325736a6565eBrian Salomon         * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target,
47189098e70967c05c8810299b4afa325736a6565eBrian Salomon         * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by
48189098e70967c05c8810299b4afa325736a6565eBrian Salomon         * the 3D API.
49189098e70967c05c8810299b4afa325736a6565eBrian Salomon         */
50189098e70967c05c8810299b4afa325736a6565eBrian Salomon        kHWAntialias_Flag = 0x1,
51189098e70967c05c8810299b4afa325736a6565eBrian Salomon        /**
52189098e70967c05c8810299b4afa325736a6565eBrian Salomon         * Modifies the vertex shader so that vertices will be positioned at pixel centers.
53189098e70967c05c8810299b4afa325736a6565eBrian Salomon         */
54189098e70967c05c8810299b4afa325736a6565eBrian Salomon        kSnapVerticesToPixelCenters_Flag = 0x2,
55611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        /** Disables conversion to sRGB from linear when writing to a sRGB destination. */
56611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        kDisableOutputConversionToSRGB_Flag = 0x4,
57611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        /** Allows conversion from sRGB to linear when reading from processor's sRGB texture. */
58611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        kAllowSRGBInputs_Flag = 0x8,
59189098e70967c05c8810299b4afa325736a6565eBrian Salomon    };
60189098e70967c05c8810299b4afa325736a6565eBrian Salomon
61611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon    static uint32_t SRGBFlagsFromPaint(const GrPaint& paint) {
62611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        uint32_t flags = 0;
63611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        if (paint.getAllowSRGBInputs()) {
64611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon            flags |= kAllowSRGBInputs_Flag;
65611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        }
66611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        if (paint.getDisableOutputConversionToSRGB()) {
67611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon            flags |= kDisableOutputConversionToSRGB_Flag;
68611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        }
69611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon        return flags;
70611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon    }
71611572ce3ef9b477e15471c3f5bacb66260e4913Brian Salomon
7246983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    enum ScissorState : bool {
7346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        kEnabled = true,
7446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        kDisabled = false
7546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    };
7646983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton
77b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    struct InitArgs {
78189098e70967c05c8810299b4afa325736a6565eBrian Salomon        uint32_t fFlags = 0;
7948d1b4c2b2c0f41a10376ed657cde043d8f11979Brian Salomon        const GrProcessorSet* fProcessors = nullptr;  // Must be finalized
80189098e70967c05c8810299b4afa325736a6565eBrian Salomon        const GrUserStencilSettings* fUserStencil = &GrUserStencilSettings::kUnused;
81b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon        const GrAppliedClip* fAppliedClip = nullptr;
82b16e8ac7f37b30ca9a51367e49c5815f36774120Brian Salomon        GrRenderTarget* fRenderTarget = nullptr;
83189098e70967c05c8810299b4afa325736a6565eBrian Salomon        const GrCaps* fCaps = nullptr;
849bee2e5894bb8dd374392f238bc429e16f239583Robert Phillips        GrResourceProvider* fResourceProvider = nullptr;
85bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        GrXferProcessor::DstProxy fDstProxy;
86a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon    };
87a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon
88b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    /**
8946983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     *  Graphics state that can change dynamically without creating a new pipeline.
9046983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     **/
9146983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    struct DynamicState {
9246983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        // Overrides the scissor rectangle (if scissor is enabled in the pipeline).
9346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        // TODO: eventually this should be the only way to specify a scissor rectangle, as is the
9446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        // case with the simple constructor.
9546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        SkIRect fScissorRect;
9646983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    };
9746983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton
9846983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    /**
99b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon     * A Default constructed pipeline is unusable until init() is called.
100b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon     **/
101b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    GrPipeline() = default;
102b109ac22b4ec3ab3478f5304c96564a0e9df6170egdaniel
103119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton    /**
104119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton     * Creates a simple pipeline with default settings and no processors. The provided blend mode
10546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     * must be "Porter Duff" (<= kLastCoeffMode). If using ScissorState::kEnabled, the caller must
10646983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     * specify a scissor rectangle through the DynamicState struct.
107119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton     **/
10846983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    GrPipeline(GrRenderTarget*, ScissorState, SkBlendMode);
109119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton
1106d4b65e9dad972a09aa1928d28a1739ab6c77d4cBrian Salomon    GrPipeline(const InitArgs& args) { this->init(args); }
1116d4b65e9dad972a09aa1928d28a1739ab6c77d4cBrian Salomon
112b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    /** (Re)initializes a pipeline. After initialization the pipeline can be used. */
113e7d30484ea8a5677a9403ccd23a9c0961df62ccdBrian Salomon    void init(const InitArgs&);
114b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon
115b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    /** True if the pipeline has been initialized. */
116b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    bool isInitialized() const { return SkToBool(fRenderTarget.get()); }
117b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon
118cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    /// @}
119cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon
120cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    ///////////////////////////////////////////////////////////////////////////
121cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    /// @name Comparisons
122cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon
123cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    /**
1242fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt     * Returns true if these pipelines are equivalent.  Coord transforms may be applied either on
1252fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt     * the GPU or the CPU. When we apply them on the CPU then the matrices need not agree in order
1262fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt     * to combine draws. Therefore we take a param that indicates whether coord transforms should be
1272fe7923f7e74f901a17afba7609d71a1220bdc60joshualitt     * compared."
1289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt     */
1297312ff87f64f31d741989a60d993bcaa4bb20523bsalomon    static bool AreEqual(const GrPipeline& a, const GrPipeline& b);
130cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon
131cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    /**
13209d994ecb30de2e62a31af2c16307af31fe0e0b3Brian Salomon     * Allows a GrOp subclass to determine whether two GrOp instances can combine. This is a
13309d994ecb30de2e62a31af2c16307af31fe0e0b3Brian Salomon     * stricter test than isEqual because it also considers blend barriers when the two ops'
13409d994ecb30de2e62a31af2c16307af31fe0e0b3Brian Salomon     * bounds overlap
135cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon     */
136cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    static bool CanCombine(const GrPipeline& a, const SkRect& aBounds,
137cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon                           const GrPipeline& b, const SkRect& bBounds,
1387312ff87f64f31d741989a60d993bcaa4bb20523bsalomon                           const GrCaps& caps)  {
1397312ff87f64f31d741989a60d993bcaa4bb20523bsalomon        if (!AreEqual(a, b)) {
140cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon            return false;
141cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon        }
142cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon        if (a.xferBarrierType(caps)) {
143a4677b5db51fca9f2d1077a4d09dd8f7c80df3d1Brian Salomon            return !GrRectsTouchOrOverlap(aBounds, bBounds);
144cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon        }
145cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon        return true;
146cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon    }
14789af44a0f1323dc136b238c00ccf143e15abb243egdaniel
14889af44a0f1323dc136b238c00ccf143e15abb243egdaniel    /// @}
14989af44a0f1323dc136b238c00ccf143e15abb243egdaniel
15089af44a0f1323dc136b238c00ccf143e15abb243egdaniel    ///////////////////////////////////////////////////////////////////////////
1516be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon    /// @name GrFragmentProcessors
1526be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon
153d261e1075a93677442fdf7fe72aba7e583863664Robert Phillips    // Make the renderTargetContext's GrOpList be dependent on any GrOpLists in this pipeline
154d261e1075a93677442fdf7fe72aba7e583863664Robert Phillips    void addDependenciesTo(GrOpList* recipient, const GrCaps&) const;
1556be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon
156ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    int numColorFragmentProcessors() const { return fNumColorProcessors; }
157ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    int numCoverageFragmentProcessors() const {
158ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return fFragmentProcessors.count() - fNumColorProcessors;
159ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    }
160ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    int numFragmentProcessors() const { return fFragmentProcessors.count(); }
16189af44a0f1323dc136b238c00ccf143e15abb243egdaniel
1622047b7855546b21f7956c398592c070b3f91a9dbbsalomon    const GrXferProcessor& getXferProcessor() const {
163d61c9d93b126dca0af17eff89be8536944dadf81Brian Salomon        if (fXferProcessor) {
1642047b7855546b21f7956c398592c070b3f91a9dbbsalomon            return *fXferProcessor.get();
1652047b7855546b21f7956c398592c070b3f91a9dbbsalomon        } else {
1662047b7855546b21f7956c398592c070b3f91a9dbbsalomon            // A null xp member means the common src-over case. GrXferProcessor's ref'ing
1672047b7855546b21f7956c398592c070b3f91a9dbbsalomon            // mechanism is not thread safe so we do not hold a ref on this global.
1682047b7855546b21f7956c398592c070b3f91a9dbbsalomon            return GrPorterDuffXPFactory::SimpleSrcOverXP();
1692047b7855546b21f7956c398592c070b3f91a9dbbsalomon        }
1702047b7855546b21f7956c398592c070b3f91a9dbbsalomon    }
171378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
17218dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    /**
17318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon     * If the GrXferProcessor uses a texture to access the dst color, then this returns that
17418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon     * texture and the offset to the dst contents within that texture.
17518dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon     */
176bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    GrTextureProxy* dstTextureProxy(SkIPoint* offset = nullptr) const {
17718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon        if (offset) {
17818dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon            *offset = fDstTextureOffset;
17918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon        }
180bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        return fDstTextureProxy.get();
181bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    }
182bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips
183bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    GrTexture* peekDstTexture(SkIPoint* offset = nullptr) const {
184bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        if (GrTextureProxy* dstProxy = this->dstTextureProxy(offset)) {
185bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips            return dstProxy->priv().peekTexture();
186bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        }
187bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips
188bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        return nullptr;
18918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    }
19018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon
191ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    const GrFragmentProcessor& getColorFragmentProcessor(int idx) const {
192ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        SkASSERT(idx < this->numColorFragmentProcessors());
193ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return *fFragmentProcessors[idx].get();
194d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel    }
195ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon
196ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    const GrFragmentProcessor& getCoverageFragmentProcessor(int idx) const {
197ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        SkASSERT(idx < this->numCoverageFragmentProcessors());
198ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return *fFragmentProcessors[fNumColorProcessors + idx].get();
199d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel    }
200ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon
201ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    const GrFragmentProcessor& getFragmentProcessor(int idx) const {
202ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return *fFragmentProcessors[idx].get();
203ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
20489af44a0f1323dc136b238c00ccf143e15abb243egdaniel
20589af44a0f1323dc136b238c00ccf143e15abb243egdaniel    /// @}
20689af44a0f1323dc136b238c00ccf143e15abb243egdaniel
20789af44a0f1323dc136b238c00ccf143e15abb243egdaniel    /**
20889af44a0f1323dc136b238c00ccf143e15abb243egdaniel     * Retrieves the currently set render-target.
20989af44a0f1323dc136b238c00ccf143e15abb243egdaniel     *
21089af44a0f1323dc136b238c00ccf143e15abb243egdaniel     * @return    The currently set render target.
21189af44a0f1323dc136b238c00ccf143e15abb243egdaniel     */
21237dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon    GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); }
21389af44a0f1323dc136b238c00ccf143e15abb243egdaniel
214c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton    const GrUserStencilSettings* getUserStencil() const { return fUserStencilSettings; }
21589af44a0f1323dc136b238c00ccf143e15abb243egdaniel
2163e79124a69d4806f0a1a776090bff718e1b90970bsalomon    const GrScissorState& getScissorState() const { return fScissorState; }
21754e0c12a5ab2d83fe249dd199d6879e8c0f04404joshualitt
218bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton    const GrWindowRectsState& getWindowRectsState() const { return fWindowRectsState; }
21928341fad8438b294ed7311edbc68d8cb34a990abcsmartdalton
220189098e70967c05c8810299b4afa325736a6565eBrian Salomon    bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAntialias_Flag); }
221189098e70967c05c8810299b4afa325736a6565eBrian Salomon    bool snapVerticesToPixelCenters() const {
222189098e70967c05c8810299b4afa325736a6565eBrian Salomon        return SkToBool(fFlags & kSnapVerticesToPixelCenters_Flag);
223189098e70967c05c8810299b4afa325736a6565eBrian Salomon    }
22464d094d7756534a9b9b0997aab225d9ceba098b6brianosman    bool getDisableOutputConversionToSRGB() const {
22564d094d7756534a9b9b0997aab225d9ceba098b6brianosman        return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag);
22664d094d7756534a9b9b0997aab225d9ceba098b6brianosman    }
227898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman    bool getAllowSRGBInputs() const {
228898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman        return SkToBool(fFlags & kAllowSRGBInputs_Flag);
229898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman    }
230193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton    bool hasStencilClip() const {
231193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton        return SkToBool(fFlags & kHasStencilClip_Flag);
232193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton    }
233c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton    bool isStencilEnabled() const {
234c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton        return SkToBool(fFlags & kStencilEnabled_Flag);
235c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton    }
236a91e0b7cc2537dc57ccf67914638e13b4612ffd1Robert Phillips    bool isBad() const { return SkToBool(fFlags & kIsBad_Flag); }
23789af44a0f1323dc136b238c00ccf143e15abb243egdaniel
238c9c06d45863e64ae99ef54c8c56014c855f1ca65Robert Phillips    GrXferBarrierType xferBarrierType(const GrCaps& caps) const;
239cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon
24082dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon    static SkString DumpFlags(uint32_t flags) {
24182dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon        if (flags) {
24282dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            SkString result;
24382dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kSnapVerticesToPixelCenters_Flag) {
24482dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("Snap vertices to pixel center.\n");
24582dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
24682dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kHWAntialias_Flag) {
24782dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("HW Antialiasing enabled.\n");
24882dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
24982dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kDisableOutputConversionToSRGB_Flag) {
25082dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("Disable output conversion to sRGB.\n");
25182dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
25282dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kAllowSRGBInputs_Flag) {
25382dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("Allow sRGB Inputs.\n");
25482dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
25582dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            return result;
25682dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon        }
25782dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon        return SkString("No pipeline flags\n");
25882dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon    }
25982dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon
260dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualittprivate:
261a91e0b7cc2537dc57ccf67914638e13b4612ffd1Robert Phillips    void markAsBad() { fFlags |= kIsBad_Flag; }
262a91e0b7cc2537dc57ccf67914638e13b4612ffd1Robert Phillips
263f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    /** This is a continuation of the public "Flags" enum. */
264189098e70967c05c8810299b4afa325736a6565eBrian Salomon    enum PrivateFlags {
265e23bffd65b379aeeb6bb614de81369c130623e92Brian Salomon        kHasStencilClip_Flag = 0x10,
266e23bffd65b379aeeb6bb614de81369c130623e92Brian Salomon        kStencilEnabled_Flag = 0x20,
267e23bffd65b379aeeb6bb614de81369c130623e92Brian Salomon        kIsBad_Flag = 0x40,
26804ddf89627077ea8f2b447e7cd5e902956341a32bsalomon    };
26904ddf89627077ea8f2b447e7cd5e902956341a32bsalomon
27018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    using RenderTarget = GrPendingIOResource<GrRenderTarget, kWrite_GrIOType>;
271bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    using DstTextureProxy = GrPendingIOResource<GrTextureProxy, kRead_GrIOType>;
27218dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    using PendingFragmentProcessor = GrPendingProgramElement<const GrFragmentProcessor>;
27318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    using FragmentProcessorArray = SkAutoSTArray<8, PendingFragmentProcessor>;
27418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon
275bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    DstTextureProxy fDstTextureProxy;
27618dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    SkIPoint fDstTextureOffset;
27718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    RenderTarget fRenderTarget;
27818dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    GrScissorState fScissorState;
27918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    GrWindowRectsState fWindowRectsState;
28018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    const GrUserStencilSettings* fUserStencilSettings;
28118dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    uint16_t fFlags;
282d61c9d93b126dca0af17eff89be8536944dadf81Brian Salomon    sk_sp<const GrXferProcessor> fXferProcessor;
28318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    FragmentProcessorArray fFragmentProcessors;
284d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel
285ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    // This value is also the index in fFragmentProcessors where coverage processors begin.
28618dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    int fNumColorProcessors;
28789af44a0f1323dc136b238c00ccf143e15abb243egdaniel
28889af44a0f1323dc136b238c00ccf143e15abb243egdaniel    typedef SkRefCnt INHERITED;
2893658f382cc129e463d7f40a7e68214d04d50fe14egdaniel};
2903658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2913658f382cc129e463d7f40a7e68214d04d50fe14egdaniel#endif
292