/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrPipeline_DEFINED #define GrPipeline_DEFINED #include "GrColor.h" #include "GrGpu.h" #include "GrPendingFragmentStage.h" #include "GrPrimitiveProcessor.h" #include "GrProgramDesc.h" #include "GrStencil.h" #include "GrTypesPriv.h" #include "SkMatrix.h" #include "SkRefCnt.h" class GrBatch; class GrDeviceCoordTexture; class GrPipelineBuilder; /** * Class that holds an optimized version of a GrPipelineBuilder. It is meant to be an immutable * class, and contains all data needed to set the state for a gpu draw. */ class GrPipeline { public: SK_DECLARE_INST_COUNT(GrPipeline) GrPipeline(const GrPipelineBuilder&, const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, const GrCaps&, const GrScissorState&, const GrXferProcessor::DstTexture*); /* * Returns true if these pipelines are equivalent. */ bool isEqual(const GrPipeline& that) const; /// @} /////////////////////////////////////////////////////////////////////////// /// @name GrFragmentProcessors int numColorFragmentStages() const { return fNumColorStages; } int numCoverageFragmentStages() const { return fFragmentStages.count() - fNumColorStages; } int numFragmentStages() const { return fFragmentStages.count(); } const GrXferProcessor* getXferProcessor() const { return fXferProcessor.get(); } const GrPendingFragmentStage& getColorStage(int idx) const { SkASSERT(idx < this->numColorFragmentStages()); return fFragmentStages[idx]; } const GrPendingFragmentStage& getCoverageStage(int idx) const { SkASSERT(idx < this->numCoverageFragmentStages()); return fFragmentStages[fNumColorStages + idx]; } const GrPendingFragmentStage& getFragmentStage(int idx) const { return fFragmentStages[idx]; } /// @} /** * Retrieves the currently set render-target. * * @return The currently set render target. */ GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } const GrStencilSettings& getStencil() const { return fStencilSettings; } const GrScissorState& getScissorState() const { return fScissorState; } bool isDitherState() const { return SkToBool(fFlags & kDither_Flag); } bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAA_Flag); } bool snapVerticesToPixelCenters() const { return SkToBool(fFlags & kSnapVertices_Flag); } // Skip any draws that refer to this pipeline (they should be a no-op). bool mustSkip() const { return NULL == this->getRenderTarget(); } /** * Gets whether the target is drawing clockwise, counterclockwise, * or both faces. * @return the current draw face(s). */ GrPipelineBuilder::DrawFace getDrawFace() const { return fDrawFace; } /////////////////////////////////////////////////////////////////////////// bool readsFragPosition() const { return fReadsFragPosition; } const GrPipelineInfo& getInitBatchTracker() const { return fInitBT; } private: /** * Alter the program desc and inputs (attribs and processors) based on the blend optimization. */ void adjustProgramFromOptimizations(const GrPipelineBuilder& ds, GrXferProcessor::OptFlags, const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, int* firstColorStageIdx, int* firstCoverageStageIdx); /** * Calculates the primary and secondary output types of the shader. For certain output types * the function may adjust the blend coefficients. After this function is called the src and dst * blend coeffs will represent those used by backend API. */ void setOutputStateInfo(const GrPipelineBuilder& ds, GrXferProcessor::OptFlags, const GrCaps&); enum Flags { kDither_Flag = 0x1, kHWAA_Flag = 0x2, kSnapVertices_Flag = 0x4, }; typedef GrPendingIOResource RenderTarget; typedef SkSTArray<8, GrPendingFragmentStage> FragmentStageArray; typedef GrPendingProgramElement ProgramXferProcessor; RenderTarget fRenderTarget; GrScissorState fScissorState; GrStencilSettings fStencilSettings; GrPipelineBuilder::DrawFace fDrawFace; uint32_t fFlags; ProgramXferProcessor fXferProcessor; FragmentStageArray fFragmentStages; bool fReadsFragPosition; GrPipelineInfo fInitBT; // This function is equivalent to the offset into fFragmentStages where coverage stages begin. int fNumColorStages; GrProgramDesc fDesc; typedef SkRefCnt INHERITED; }; #endif