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