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 "include/private/base/SkTArray.h" 15 #include "src/gpu/graphite/DrawTypes.h" 16 #include "src/gpu/graphite/GraphicsPipeline.h" 17 #include "src/gpu/graphite/dawn/DawnAsyncWait.h" 18 #include "src/gpu/graphite/dawn/DawnSampler.h" 19 20 #include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE 21 22 class SkUniform; 23 24 namespace SkSL { 25 class Compiler; 26 } 27 namespace skgpu { 28 struct BlendInfo; 29 } 30 31 namespace skgpu::graphite { 32 33 class Attribute; 34 class Context; 35 class GraphicsPipelineDesc; 36 class DawnResourceProvider; 37 class DawnSharedContext; 38 struct DepthStencilSettings; 39 struct RenderPassDesc; 40 class RuntimeEffectDictionary; 41 42 class DawnGraphicsPipeline final : public GraphicsPipeline { 43 public: 44 inline static constexpr unsigned int kUniformBufferBindGroupIndex = 0; 45 inline static constexpr unsigned int kTextureBindGroupIndex = 1; 46 inline static constexpr unsigned int kBindGroupCount = 2; 47 48 inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0; 49 inline static constexpr unsigned int kRenderStepUniformBufferIndex = 1; 50 inline static constexpr unsigned int kPaintUniformBufferIndex = 2; 51 inline static constexpr unsigned int kGradientBufferIndex = 3; 52 inline static constexpr unsigned int kNumUniformBuffers = 4; 53 54 inline static constexpr unsigned int kVertexBufferIndex = 0; 55 inline static constexpr unsigned int kInstanceBufferIndex = 1; 56 inline static constexpr unsigned int kNumVertexBuffers = 2; 57 58 static sk_sp<DawnGraphicsPipeline> Make(const DawnSharedContext* sharedContext, 59 DawnResourceProvider* resourceProvider, 60 const RuntimeEffectDictionary* runtimeDict, 61 const UniqueKey& pipelineKey, 62 const GraphicsPipelineDesc& pipelineDesc, 63 const RenderPassDesc& renderPassDesc, 64 SkEnumBitMask<PipelineCreationFlags>, 65 uint32_t compilationID); 66 67 ~DawnGraphicsPipeline() override; 68 stencilReferenceValue()69 uint32_t stencilReferenceValue() const { return fStencilReferenceValue; } primitiveType()70 PrimitiveType primitiveType() const { return fPrimitiveType; } 71 72 const wgpu::RenderPipeline& dawnRenderPipeline() const; 73 74 using BindGroupLayouts = std::array<wgpu::BindGroupLayout, kBindGroupCount>; dawnGroupLayouts()75 const BindGroupLayouts& dawnGroupLayouts() const { return fGroupLayouts; } 76 77 private: 78 struct AsyncPipelineCreation; 79 80 DawnGraphicsPipeline(const skgpu::graphite::SharedContext* sharedContext, 81 const PipelineInfo& pipelineInfo, 82 std::unique_ptr<AsyncPipelineCreation> pipelineCreationInfo, 83 BindGroupLayouts groupLayouts, 84 PrimitiveType primitiveType, 85 uint32_t refValue, 86 skia_private::TArray<sk_sp<DawnSampler>> immutableSamplers); 87 88 void freeGpuData() override; 89 90 std::unique_ptr<AsyncPipelineCreation> fAsyncPipelineCreation; 91 BindGroupLayouts fGroupLayouts; 92 const PrimitiveType fPrimitiveType; 93 const uint32_t fStencilReferenceValue; 94 95 // Hold a ref to immutable samplers used such that their lifetime is properly managed. 96 const skia_private::TArray<sk_sp<DawnSampler>> fImmutableSamplers; 97 }; 98 99 } // namespace skgpu::graphite 100 101 #endif // skgpu_graphite_DawnGraphicsPipeline_DEFINED 102