1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_GraphicsPipeline_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_GraphicsPipeline_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Resource.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/UniquePaintParamsID.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class ShaderInfo; 18*c8dee2aaSAndroid Build Coastguard Worker class RenderStep; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker enum class PipelineCreationFlags : uint8_t { 21*c8dee2aaSAndroid Build Coastguard Worker kNone = 0b000, 22*c8dee2aaSAndroid Build Coastguard Worker // For Dawn, this flag overrides the DawnCaps::fUseAsyncPipelineCreation 23*c8dee2aaSAndroid Build Coastguard Worker // parameter and forces Synchronous Pipeline creation. 24*c8dee2aaSAndroid Build Coastguard Worker kForPrecompilation = 0b001, 25*c8dee2aaSAndroid Build Coastguard Worker }; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** 28*c8dee2aaSAndroid Build Coastguard Worker * GraphicsPipeline corresponds to a backend specific pipeline used for rendering (vs. compute), 29*c8dee2aaSAndroid Build Coastguard Worker * e.g. MTLRenderPipelineState (Metal), 30*c8dee2aaSAndroid Build Coastguard Worker * CreateRenderPipeline (Dawn), 31*c8dee2aaSAndroid Build Coastguard Worker * CreateGraphicsPipelineState (D3D12), 32*c8dee2aaSAndroid Build Coastguard Worker * or VkGraphicsPipelineCreateInfo (Vulkan). 33*c8dee2aaSAndroid Build Coastguard Worker * 34*c8dee2aaSAndroid Build Coastguard Worker * A GraphicsPipeline is created from the combination of a GraphicsPipelineDesc (representing draw 35*c8dee2aaSAndroid Build Coastguard Worker * specific configuration) and a RenderPassDesc (representing the target of the draw). 36*c8dee2aaSAndroid Build Coastguard Worker */ 37*c8dee2aaSAndroid Build Coastguard Worker class GraphicsPipeline : public Resource { 38*c8dee2aaSAndroid Build Coastguard Worker public: 39*c8dee2aaSAndroid Build Coastguard Worker ~GraphicsPipeline() override; 40*c8dee2aaSAndroid Build Coastguard Worker getResourceType()41*c8dee2aaSAndroid Build Coastguard Worker const char* getResourceType() const override { return "Graphics Pipeline"; } 42*c8dee2aaSAndroid Build Coastguard Worker dstReadRequirement()43*c8dee2aaSAndroid Build Coastguard Worker DstReadRequirement dstReadRequirement() const { return fPipelineInfo.fDstReadReq; } 44*c8dee2aaSAndroid Build Coastguard Worker numFragTexturesAndSamplers()45*c8dee2aaSAndroid Build Coastguard Worker int numFragTexturesAndSamplers() const { return fPipelineInfo.fNumFragTexturesAndSamplers; } hasPaintUniforms()46*c8dee2aaSAndroid Build Coastguard Worker bool hasPaintUniforms() const { return fPipelineInfo.fHasPaintUniforms; } hasStepUniforms()47*c8dee2aaSAndroid Build Coastguard Worker bool hasStepUniforms() const { return fPipelineInfo.fHasStepUniforms; } hasGradientBuffer()48*c8dee2aaSAndroid Build Coastguard Worker bool hasGradientBuffer() const { return fPipelineInfo.fHasGradientBuffer; } 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker struct PipelineInfo { 51*c8dee2aaSAndroid Build Coastguard Worker PipelineInfo() = default; 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker // NOTE: Subclasses must manually fill in native shader code in GPU_TEST_UTILS builds. 54*c8dee2aaSAndroid Build Coastguard Worker PipelineInfo(const ShaderInfo&, SkEnumBitMask<PipelineCreationFlags>); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker DstReadRequirement fDstReadReq = DstReadRequirement::kNone; 57*c8dee2aaSAndroid Build Coastguard Worker int fNumFragTexturesAndSamplers = 0; 58*c8dee2aaSAndroid Build Coastguard Worker bool fHasPaintUniforms = false; 59*c8dee2aaSAndroid Build Coastguard Worker bool fHasStepUniforms = false; 60*c8dee2aaSAndroid Build Coastguard Worker bool fHasGradientBuffer = false; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker // In test-enabled builds, we preserve the generated shader code to display in the viewer 63*c8dee2aaSAndroid Build Coastguard Worker // slide UI. This is not quite enough information to fully recreate the pipeline, as the 64*c8dee2aaSAndroid Build Coastguard Worker // RenderPassDesc used to make the pipeline is not preserved. 65*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 66*c8dee2aaSAndroid Build Coastguard Worker std::string fLabel; 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker std::string fSkSLVertexShader; 69*c8dee2aaSAndroid Build Coastguard Worker std::string fSkSLFragmentShader; 70*c8dee2aaSAndroid Build Coastguard Worker std::string fNativeVertexShader; 71*c8dee2aaSAndroid Build Coastguard Worker std::string fNativeFragmentShader; 72*c8dee2aaSAndroid Build Coastguard Worker #endif 73*c8dee2aaSAndroid Build Coastguard Worker #if SK_HISTOGRAMS_ENABLED 74*c8dee2aaSAndroid Build Coastguard Worker bool fFromPrecompile = false; 75*c8dee2aaSAndroid Build Coastguard Worker #endif 76*c8dee2aaSAndroid Build Coastguard Worker }; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) getPipelineInfo()79*c8dee2aaSAndroid Build Coastguard Worker const PipelineInfo& getPipelineInfo() const { 80*c8dee2aaSAndroid Build Coastguard Worker return fPipelineInfo; 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker #endif 83*c8dee2aaSAndroid Build Coastguard Worker #if SK_HISTOGRAMS_ENABLED fromPrecompile()84*c8dee2aaSAndroid Build Coastguard Worker bool fromPrecompile() const { return fPipelineInfo.fFromPrecompile; } 85*c8dee2aaSAndroid Build Coastguard Worker #endif 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker protected: 88*c8dee2aaSAndroid Build Coastguard Worker GraphicsPipeline(const SharedContext*, const PipelineInfo&); 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker private: 91*c8dee2aaSAndroid Build Coastguard Worker PipelineInfo fPipelineInfo; 92*c8dee2aaSAndroid Build Coastguard Worker }; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_GraphicsPipeline_DEFINED 97