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"
182890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips#include "GrRenderTargetProxy.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 */
391635146864586cb7caaccdbfeb8ba4906bf80c67Brian Salomonclass 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;
79189098e70967c05c8810299b4afa325736a6565eBrian Salomon        const GrUserStencilSettings* fUserStencil = &GrUserStencilSettings::kUnused;
802890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips        GrRenderTargetProxy* fProxy = nullptr;
81189098e70967c05c8810299b4afa325736a6565eBrian Salomon        const GrCaps* fCaps = nullptr;
829bee2e5894bb8dd374392f238bc429e16f239583Robert Phillips        GrResourceProvider* fResourceProvider = nullptr;
83bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        GrXferProcessor::DstProxy fDstProxy;
84a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon    };
85a387a11f9e10ee828fd0e0257cc3ee3f6262f7cabsalomon
86b5cb6835c449c1c292b1ab124691a45d3d113694Brian Salomon    /**
8746983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     *  Graphics state that can change dynamically without creating a new pipeline.
8846983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     **/
8946983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    struct DynamicState {
9046983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        // Overrides the scissor rectangle (if scissor is enabled in the pipeline).
9146983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        // TODO: eventually this should be the only way to specify a scissor rectangle, as is the
9246983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        // case with the simple constructor.
9346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        SkIRect fScissorRect;
9446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    };
9546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton
9646983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton    /**
97119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton     * Creates a simple pipeline with default settings and no processors. The provided blend mode
9846983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     * must be "Porter Duff" (<= kLastCoeffMode). If using ScissorState::kEnabled, the caller must
9946983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton     * specify a scissor rectangle through the DynamicState struct.
100119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton     **/
1012890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips    GrPipeline(GrRenderTargetProxy*, ScissorState, SkBlendMode);
102119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton
103bfd18cdd5421b6fac063bd07a96a5b9b1afa6a88Brian Salomon    GrPipeline(const InitArgs&, GrProcessorSet&&, GrAppliedClip&&);
1046d4b65e9dad972a09aa1928d28a1739ab6c77d4cBrian Salomon
1051635146864586cb7caaccdbfeb8ba4906bf80c67Brian Salomon    GrPipeline(const GrPipeline&) = delete;
1061635146864586cb7caaccdbfeb8ba4906bf80c67Brian Salomon    GrPipeline& operator=(const GrPipeline&) = delete;
1071635146864586cb7caaccdbfeb8ba4906bf80c67Brian Salomon
10889af44a0f1323dc136b238c00ccf143e15abb243egdaniel    /// @}
10989af44a0f1323dc136b238c00ccf143e15abb243egdaniel
11089af44a0f1323dc136b238c00ccf143e15abb243egdaniel    ///////////////////////////////////////////////////////////////////////////
1116be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon    /// @name GrFragmentProcessors
1126be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon
113d261e1075a93677442fdf7fe72aba7e583863664Robert Phillips    // Make the renderTargetContext's GrOpList be dependent on any GrOpLists in this pipeline
114d261e1075a93677442fdf7fe72aba7e583863664Robert Phillips    void addDependenciesTo(GrOpList* recipient, const GrCaps&) const;
1156be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon
116ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    int numColorFragmentProcessors() const { return fNumColorProcessors; }
117ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    int numCoverageFragmentProcessors() const {
118ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return fFragmentProcessors.count() - fNumColorProcessors;
119ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    }
120ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    int numFragmentProcessors() const { return fFragmentProcessors.count(); }
12189af44a0f1323dc136b238c00ccf143e15abb243egdaniel
1222047b7855546b21f7956c398592c070b3f91a9dbbsalomon    const GrXferProcessor& getXferProcessor() const {
123d61c9d93b126dca0af17eff89be8536944dadf81Brian Salomon        if (fXferProcessor) {
1242047b7855546b21f7956c398592c070b3f91a9dbbsalomon            return *fXferProcessor.get();
1252047b7855546b21f7956c398592c070b3f91a9dbbsalomon        } else {
1262047b7855546b21f7956c398592c070b3f91a9dbbsalomon            // A null xp member means the common src-over case. GrXferProcessor's ref'ing
1272047b7855546b21f7956c398592c070b3f91a9dbbsalomon            // mechanism is not thread safe so we do not hold a ref on this global.
1282047b7855546b21f7956c398592c070b3f91a9dbbsalomon            return GrPorterDuffXPFactory::SimpleSrcOverXP();
1292047b7855546b21f7956c398592c070b3f91a9dbbsalomon        }
1302047b7855546b21f7956c398592c070b3f91a9dbbsalomon    }
131378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
13218dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    /**
13318dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon     * If the GrXferProcessor uses a texture to access the dst color, then this returns that
13418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon     * texture and the offset to the dst contents within that texture.
13518dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon     */
136bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    GrTextureProxy* dstTextureProxy(SkIPoint* offset = nullptr) const {
13718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon        if (offset) {
13818dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon            *offset = fDstTextureOffset;
13918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon        }
140bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        return fDstTextureProxy.get();
141bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    }
142bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips
143bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    GrTexture* peekDstTexture(SkIPoint* offset = nullptr) const {
144bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        if (GrTextureProxy* dstProxy = this->dstTextureProxy(offset)) {
145bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips            return dstProxy->priv().peekTexture();
146bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        }
147bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips
148bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips        return nullptr;
14918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    }
15018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon
151ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    const GrFragmentProcessor& getColorFragmentProcessor(int idx) const {
152ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        SkASSERT(idx < this->numColorFragmentProcessors());
153ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return *fFragmentProcessors[idx].get();
154d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel    }
155ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon
156ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    const GrFragmentProcessor& getCoverageFragmentProcessor(int idx) const {
157ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        SkASSERT(idx < this->numCoverageFragmentProcessors());
158ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return *fFragmentProcessors[fNumColorProcessors + idx].get();
159d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel    }
160ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon
161ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    const GrFragmentProcessor& getFragmentProcessor(int idx) const {
162ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon        return *fFragmentProcessors[idx].get();
163ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
16489af44a0f1323dc136b238c00ccf143e15abb243egdaniel
16589af44a0f1323dc136b238c00ccf143e15abb243egdaniel    /// @}
16689af44a0f1323dc136b238c00ccf143e15abb243egdaniel
16789af44a0f1323dc136b238c00ccf143e15abb243egdaniel    /**
16889af44a0f1323dc136b238c00ccf143e15abb243egdaniel     * Retrieves the currently set render-target.
16989af44a0f1323dc136b238c00ccf143e15abb243egdaniel     *
17089af44a0f1323dc136b238c00ccf143e15abb243egdaniel     * @return    The currently set render target.
17189af44a0f1323dc136b238c00ccf143e15abb243egdaniel     */
1722890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips    GrRenderTargetProxy* proxy() const { return fProxy.get(); }
1732890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips    GrRenderTarget* renderTarget() const { return fProxy.get()->priv().peekRenderTarget(); }
17489af44a0f1323dc136b238c00ccf143e15abb243egdaniel
175c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton    const GrUserStencilSettings* getUserStencil() const { return fUserStencilSettings; }
17689af44a0f1323dc136b238c00ccf143e15abb243egdaniel
1773e79124a69d4806f0a1a776090bff718e1b90970bsalomon    const GrScissorState& getScissorState() const { return fScissorState; }
17854e0c12a5ab2d83fe249dd199d6879e8c0f04404joshualitt
179bf4a8f90c87dddf6290aa774536715e55e6a12f5csmartdalton    const GrWindowRectsState& getWindowRectsState() const { return fWindowRectsState; }
18028341fad8438b294ed7311edbc68d8cb34a990abcsmartdalton
181189098e70967c05c8810299b4afa325736a6565eBrian Salomon    bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAntialias_Flag); }
182189098e70967c05c8810299b4afa325736a6565eBrian Salomon    bool snapVerticesToPixelCenters() const {
183189098e70967c05c8810299b4afa325736a6565eBrian Salomon        return SkToBool(fFlags & kSnapVerticesToPixelCenters_Flag);
184189098e70967c05c8810299b4afa325736a6565eBrian Salomon    }
18564d094d7756534a9b9b0997aab225d9ceba098b6brianosman    bool getDisableOutputConversionToSRGB() const {
18664d094d7756534a9b9b0997aab225d9ceba098b6brianosman        return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag);
18764d094d7756534a9b9b0997aab225d9ceba098b6brianosman    }
188898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman    bool getAllowSRGBInputs() const {
189898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman        return SkToBool(fFlags & kAllowSRGBInputs_Flag);
190898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman    }
191193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton    bool hasStencilClip() const {
192193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton        return SkToBool(fFlags & kHasStencilClip_Flag);
193193d9cf8f2280cd4f8e509c6f3af6b47cea04935cdalton    }
194c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton    bool isStencilEnabled() const {
195c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton        return SkToBool(fFlags & kStencilEnabled_Flag);
196c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton    }
197a91e0b7cc2537dc57ccf67914638e13b4612ffd1Robert Phillips    bool isBad() const { return SkToBool(fFlags & kIsBad_Flag); }
19889af44a0f1323dc136b238c00ccf143e15abb243egdaniel
199c9c06d45863e64ae99ef54c8c56014c855f1ca65Robert Phillips    GrXferBarrierType xferBarrierType(const GrCaps& caps) const;
200cb02b38b2c48bfde333ce3c699dd0451e2d867fabsalomon
20182dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon    static SkString DumpFlags(uint32_t flags) {
20282dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon        if (flags) {
20382dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            SkString result;
20482dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kSnapVerticesToPixelCenters_Flag) {
20582dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("Snap vertices to pixel center.\n");
20682dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
20782dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kHWAntialias_Flag) {
20882dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("HW Antialiasing enabled.\n");
20982dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
21082dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kDisableOutputConversionToSRGB_Flag) {
21182dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("Disable output conversion to sRGB.\n");
21282dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
21382dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            if (flags & GrPipeline::kAllowSRGBInputs_Flag) {
21482dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon                result.append("Allow sRGB Inputs.\n");
21582dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            }
21682dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon            return result;
21782dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon        }
21882dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon        return SkString("No pipeline flags\n");
21982dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon    }
22082dfd3d1b2e173e10d2b4b7ac6c843554a1b229fBrian Salomon
221dafa4d09cbe66943b2414bdeaa0f6ef7f900dc4ajoshualittprivate:
222a91e0b7cc2537dc57ccf67914638e13b4612ffd1Robert Phillips    void markAsBad() { fFlags |= kIsBad_Flag; }
223a91e0b7cc2537dc57ccf67914638e13b4612ffd1Robert Phillips
224f87e2b95f098dd1b43f0704a95057818251d4b5cBrian Salomon    /** This is a continuation of the public "Flags" enum. */
225189098e70967c05c8810299b4afa325736a6565eBrian Salomon    enum PrivateFlags {
226e23bffd65b379aeeb6bb614de81369c130623e92Brian Salomon        kHasStencilClip_Flag = 0x10,
227e23bffd65b379aeeb6bb614de81369c130623e92Brian Salomon        kStencilEnabled_Flag = 0x20,
228e23bffd65b379aeeb6bb614de81369c130623e92Brian Salomon        kIsBad_Flag = 0x40,
22904ddf89627077ea8f2b447e7cd5e902956341a32bsalomon    };
23004ddf89627077ea8f2b447e7cd5e902956341a32bsalomon
2312890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips    using RenderTargetProxy = GrPendingIOResource<GrRenderTargetProxy, kWrite_GrIOType>;
232bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    using DstTextureProxy = GrPendingIOResource<GrTextureProxy, kRead_GrIOType>;
233aff329b8e9b239bca1d93b13a914fbef45ccf7feBrian Salomon    using FragmentProcessorArray = SkAutoSTArray<8, std::unique_ptr<const GrFragmentProcessor>>;
23418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon
235bb581ce30f55360fd3a12e7f5aa1fe324b16d085Robert Phillips    DstTextureProxy fDstTextureProxy;
23618dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    SkIPoint fDstTextureOffset;
23719e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips    // MDB TODO: do we still need the destination proxy here?
2382890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips    RenderTargetProxy fProxy;
23918dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    GrScissorState fScissorState;
24018dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    GrWindowRectsState fWindowRectsState;
24118dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    const GrUserStencilSettings* fUserStencilSettings;
24218dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    uint16_t fFlags;
243d61c9d93b126dca0af17eff89be8536944dadf81Brian Salomon    sk_sp<const GrXferProcessor> fXferProcessor;
24418dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    FragmentProcessorArray fFragmentProcessors;
245d9aa218e8152bb77dfa2efeb8843b61993e0dc56egdaniel
246ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon    // This value is also the index in fFragmentProcessors where coverage processors begin.
24718dfa980765bee6a1ce7c5f430cb32f487da6590Brian Salomon    int fNumColorProcessors;
24889af44a0f1323dc136b238c00ccf143e15abb243egdaniel
24989af44a0f1323dc136b238c00ccf143e15abb243egdaniel    typedef SkRefCnt INHERITED;
2503658f382cc129e463d7f40a7e68214d04d50fe14egdaniel};
2513658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2523658f382cc129e463d7f40a7e68214d04d50fe14egdaniel#endif
253