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