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 GraphicsPipelineDesc& pipelineDesc, 62 const RenderPassDesc& renderPassDesc, 63 SkEnumBitMask<PipelineCreationFlags>); 64 65 ~DawnGraphicsPipeline() override; 66 stencilReferenceValue()67 uint32_t stencilReferenceValue() const { return fStencilReferenceValue; } primitiveType()68 PrimitiveType primitiveType() const { return fPrimitiveType; } 69 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 const PipelineInfo& pipelineInfo, 80 std::unique_ptr<AsyncPipelineCreation> pipelineCreationInfo, 81 BindGroupLayouts groupLayouts, 82 PrimitiveType primitiveType, 83 uint32_t refValue, 84 skia_private::TArray<sk_sp<DawnSampler>> immutableSamplers); 85 86 void freeGpuData() override; 87 88 std::unique_ptr<AsyncPipelineCreation> fAsyncPipelineCreation; 89 BindGroupLayouts fGroupLayouts; 90 const PrimitiveType fPrimitiveType; 91 const uint32_t fStencilReferenceValue; 92 93 // Hold a ref to immutable samplers used such that their lifetime is properly managed. 94 const skia_private::TArray<sk_sp<DawnSampler>> fImmutableSamplers; 95 }; 96 97 } // namespace skgpu::graphite 98 99 #endif // skgpu_graphite_DawnGraphicsPipeline_DEFINED 100