/* * 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_DawnCommandBuffer_DEFINED #define skgpu_graphite_DawnCommandBuffer_DEFINED #include "src/gpu/graphite/CommandBuffer.h" #include "src/gpu/graphite/DrawPass.h" #include "src/gpu/graphite/GpuWorkSubmission.h" #include "src/gpu/graphite/Log.h" #include "src/gpu/graphite/dawn/DawnGraphicsPipeline.h" #include "webgpu/webgpu_cpp.h" namespace skgpu::graphite { class DawnBuffer; class DawnQueueManager; class DawnResourceProvider; class DawnSharedContext; class DawnTexture; class DawnCommandBuffer final : public CommandBuffer { public: static std::unique_ptr Make(const DawnSharedContext*, DawnResourceProvider*); ~DawnCommandBuffer() override; wgpu::CommandBuffer finishEncoding(); private: DawnCommandBuffer(const DawnSharedContext* sharedContext, DawnResourceProvider* resourceProvider); void onResetCommandBuffer() override; bool setNewCommandBufferResources() override; bool onAddRenderPass(const RenderPassDesc&, const Texture* colorTexture, const Texture* resolveTexture, const Texture* depthStencilTexture, SkRect viewport, const std::vector>& drawPasses) override; bool onAddComputePass(const ComputePassDesc&, const ComputePipeline*, const std::vector& bindings) override; // Methods for populating a Dawn RenderPassEncoder: bool beginRenderPass(const RenderPassDesc&, const Texture* colorTexture, const Texture* resolveTexture, const Texture* depthStencilTexture); bool loadMSAAFromResolveAndBeginRenderPassEncoder( const RenderPassDesc& frontendRenderPassDesc, const wgpu::RenderPassDescriptor& wgpuRenderPassDesc, const DawnTexture* msaaTexture); bool doBlitWithDraw(const RenderPassDesc& frontendRenderPassDesc, const wgpu::TextureView& sourceTextureView, int width, int height); void endRenderPass(); void addDrawPass(const DrawPass*); void bindGraphicsPipeline(const GraphicsPipeline*); void setBlendConstants(float* blendConstants); void bindUniformBuffer(const BindBufferInfo& info, UniformSlot); void bindDrawBuffers(const BindBufferInfo& vertices, const BindBufferInfo& instances, const BindBufferInfo& indices, const BindBufferInfo& indirect); void bindTextureAndSamplers(const DrawPass& drawPass, const DrawPassCommands::BindTexturesAndSamplers& command); void setScissor(unsigned int left, unsigned int top, unsigned int width, unsigned int height); void preprocessViewport(const SkRect& viewport); void setViewport(const SkRect& viewport); void draw(PrimitiveType type, unsigned int baseVertex, unsigned int vertexCount); void drawIndexed(PrimitiveType type, unsigned int baseIndex, unsigned int indexCount, unsigned int baseVertex); void drawInstanced(PrimitiveType type, unsigned int baseVertex, unsigned int vertexCount, unsigned int baseInstance, unsigned int instanceCount); void drawIndexedInstanced(PrimitiveType type, unsigned int baseIndex, unsigned int indexCount, unsigned int baseVertex, unsigned int baseInstance, unsigned int instanceCount); void drawIndirect(PrimitiveType type); void drawIndexedIndirect(PrimitiveType type); // Methods for populating a Dawn ComputePassEncoder: void beginComputePass(); void bindComputePipeline(const ComputePipeline*); void bindBuffer(const Buffer* buffer, unsigned int offset, unsigned int index); void dispatchThreadgroups(const WorkgroupSize& globalSize, const WorkgroupSize& localSize); void endComputePass(); // Methods for doing texture/buffer to texture/buffer copying: bool onCopyBufferToBuffer(const Buffer* srcBuffer, size_t srcOffset, const Buffer* dstBuffer, size_t dstOffset, size_t size) override; bool onCopyTextureToBuffer(const Texture*, SkIRect srcRect, const Buffer*, size_t bufferOffset, size_t bufferRowBytes) override; bool onCopyBufferToTexture(const Buffer*, const Texture*, const BufferTextureCopyData* copyData, int count) override; bool onCopyTextureToTexture(const Texture* src, SkIRect srcRect, const Texture* dst, SkIPoint dstPoint) override; bool onSynchronizeBufferToCpu(const Buffer*, bool* outDidResultInWork) override; bool onClearBuffer(const Buffer*, size_t offset, size_t size) override; // Commiting uniform buffers' changes if any before drawing void syncUniformBuffers(); bool fBoundUniformBuffersDirty = false; std::array fBoundUniformBuffers; std::array fBoundUniformBufferOffsets; wgpu::CommandEncoder fCommandEncoder; wgpu::RenderPassEncoder fActiveRenderPassEncoder; wgpu::ComputePassEncoder fActiveComputePassEncoder; wgpu::Buffer fCurrentIndirectBuffer; size_t fCurrentIndirectBufferOffset = 0; wgpu::Buffer fInstrinsicConstantBuffer; const DawnGraphicsPipeline* fActiveGraphicsPipeline = nullptr; const DawnSharedContext* fSharedContext; DawnResourceProvider* fResourceProvider; }; } // namespace skgpu::graphite #endif // skgpu_graphite_DawnCommandBuffer_DEFINED