1 /* 2 * Copyright 2022 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef skgpu_graphite_DawnGraphicsPipeline_DEFINED 9 #define skgpu_graphite_DawnGraphicsPipeline_DEFINED 10 11 #include "include/core/SkRefCnt.h" 12 #include "include/core/SkSpan.h" 13 #include "include/ports/SkCFObject.h" 14 #include "src/gpu/graphite/DrawTypes.h" 15 #include "src/gpu/graphite/GraphicsPipeline.h" 16 #include "src/gpu/graphite/dawn/DawnAsyncWait.h" 17 18 #include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE 19 20 class SkUniform; 21 22 namespace SkSL { 23 class Compiler; 24 } 25 namespace skgpu { 26 struct BlendInfo; 27 } 28 29 namespace skgpu::graphite { 30 31 class Attribute; 32 class Context; 33 class GraphicsPipelineDesc; 34 class DawnResourceProvider; 35 class DawnSharedContext; 36 struct DepthStencilSettings; 37 struct RenderPassDesc; 38 class RuntimeEffectDictionary; 39 40 class DawnGraphicsPipeline final : public GraphicsPipeline { 41 public: 42 inline static constexpr unsigned int kUniformBufferBindGroupIndex = 0; 43 inline static constexpr unsigned int kTextureBindGroupIndex = 1; 44 inline static constexpr unsigned int kBindGroupCount = 2; 45 46 inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0; 47 inline static constexpr unsigned int kRenderStepUniformBufferIndex = 1; 48 inline static constexpr unsigned int kPaintUniformBufferIndex = 2; 49 inline static constexpr unsigned int kGradientBufferIndex = 3; 50 inline static constexpr unsigned int kNumUniformBuffers = 4; 51 52 inline static constexpr unsigned int kVertexBufferIndex = 0; 53 inline static constexpr unsigned int kInstanceBufferIndex = 1; 54 inline static constexpr unsigned int kNumVertexBuffers = 2; 55 56 static sk_sp<DawnGraphicsPipeline> Make(const DawnSharedContext* sharedContext, 57 DawnResourceProvider* resourceProvider, 58 const RuntimeEffectDictionary* runtimeDict, 59 const GraphicsPipelineDesc& pipelineDesc, 60 const RenderPassDesc& renderPassDesc); 61 62 ~DawnGraphicsPipeline() override; 63 stencilReferenceValue()64 uint32_t stencilReferenceValue() const { return fStencilReferenceValue; } primitiveType()65 PrimitiveType primitiveType() const { return fPrimitiveType; } hasStepUniforms()66 bool hasStepUniforms() const { return fHasStepUniforms; } hasPaintUniforms()67 bool hasPaintUniforms() const { return fHasPaintUniforms; } hasGradientBuffer()68 bool hasGradientBuffer() const { return fHasGradientBuffer; } numTexturesAndSamplers()69 int numTexturesAndSamplers() const { return fNumFragmentTexturesAndSamplers; } 70 const wgpu::RenderPipeline& dawnRenderPipeline() const; 71 72 using BindGroupLayouts = std::array<wgpu::BindGroupLayout, kBindGroupCount>; dawnGroupLayouts()73 const BindGroupLayouts& dawnGroupLayouts() const { return fGroupLayouts; } 74 75 private: 76 struct AsyncPipelineCreation; 77 78 DawnGraphicsPipeline(const skgpu::graphite::SharedContext* sharedContext, 79 PipelineInfo* pipelineInfo, 80 std::unique_ptr<AsyncPipelineCreation> pipelineCreationInfo, 81 BindGroupLayouts groupLayouts, 82 PrimitiveType primitiveType, 83 uint32_t refValue, 84 bool hasStepUniforms, 85 bool hasPaintUniforms, 86 bool hasGradientBuffer, 87 int numFragmentTexturesAndSamplers); 88 89 void freeGpuData() override; 90 91 std::unique_ptr<AsyncPipelineCreation> fAsyncPipelineCreation; 92 BindGroupLayouts fGroupLayouts; 93 const PrimitiveType fPrimitiveType; 94 const uint32_t fStencilReferenceValue; 95 const bool fHasStepUniforms; 96 const bool fHasPaintUniforms; 97 const bool fHasGradientBuffer; 98 const int fNumFragmentTexturesAndSamplers; 99 }; 100 101 } // namespace skgpu::graphite 102 103 #endif // skgpu_graphite_DawnGraphicsPipeline_DEFINED 104