/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_DawnGraphicsPipeline_DEFINED #define skgpu_graphite_DawnGraphicsPipeline_DEFINED #include "include/core/SkRefCnt.h" #include "include/core/SkSpan.h" #include "include/private/SkTArray.h" #include "src/gpu/graphite/DrawTypes.h" #include "src/gpu/graphite/GraphicsPipeline.h" #include "src/gpu/graphite/dawn/DawnAsyncWait.h" #include "src/gpu/graphite/dawn/DawnSampler.h" #include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE class SkUniform; namespace SkSL { class Compiler; } namespace skgpu { struct BlendInfo; } namespace skgpu::graphite { class Attribute; class Context; class DawnResourceProvider; class DawnSharedContext; class GraphicsPipelineDesc; class RuntimeEffectDictionary; struct RenderPassDesc; class DawnGraphicsPipeline final : public GraphicsPipeline { public: inline static constexpr unsigned int kUniformBufferBindGroupIndex = 0; inline static constexpr unsigned int kTextureBindGroupIndex = 1; inline static constexpr unsigned int kBindGroupCount = 2; // TODO(b/512814646): WASM does not support push constant usage, meaning that we often have 2 // uniform buffers within one BindGroup. This is unideal since we can store single-uniform // BindGroups on DawnBuffers. Consider reorganizing uniform buffers such that we can more often // only have one uniform buffer per BindGroup. inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0; inline static constexpr unsigned int kCombinedUniformIndex = 1; inline static constexpr unsigned int kStorageBufferIndex = 2; inline static constexpr unsigned int kMaxNumUniformBuffers = 3; inline static constexpr unsigned int kIntrinsicUniformSize = 32; inline static constexpr unsigned int kStaticDataBufferIndex = 0; inline static constexpr unsigned int kAppendDataBufferIndex = 1; inline static constexpr unsigned int kNumVertexBuffers = 2; static sk_sp Make(const DawnSharedContext* sharedContext, const RuntimeEffectDictionary* runtimeDict, const UniqueKey& pipelineKey, const GraphicsPipelineDesc& pipelineDesc, const RenderPassDesc& renderPassDesc, SkEnumBitMask, uint32_t compilationID); ~DawnGraphicsPipeline() override; std::optional didAsyncCompilationFail() const override; uint32_t stencilReferenceValue() const { return fStencilReferenceValue; } PrimitiveType primitiveType() const { return fPrimitiveType; } const wgpu::RenderPipeline& dawnRenderPipeline() const; using BindGroupLayouts = std::array; const BindGroupLayouts& dawnGroupLayouts() const { return fGroupLayouts; } // Returns null if the ith sampler is not an immutable sampler. const DawnSampler* immutableSampler(int32_t index) const { return fImmutableSamplers[index].get(); } private: struct AsyncPipelineCreation; DawnGraphicsPipeline(const skgpu::graphite::SharedContext* sharedContext, const PipelineInfo& pipelineInfo, std::string_view pipelineLabel, std::unique_ptr pipelineCreationInfo, BindGroupLayouts groupLayouts, PrimitiveType primitiveType, uint32_t refValue, skia_private::TArray> immutableSamplers); void freeGpuData() override; std::unique_ptr fAsyncPipelineCreation; BindGroupLayouts fGroupLayouts; const PrimitiveType fPrimitiveType; const uint32_t fStencilReferenceValue; // Hold a ref to immutable samplers used such that their lifetime is properly managed. const skia_private::TArray> fImmutableSamplers; }; } // namespace skgpu::graphite #endif // skgpu_graphite_DawnGraphicsPipeline_DEFINED