| /* |
| * Copyright 2021 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_CommandBuffer_DEFINED |
| #define skgpu_graphite_CommandBuffer_DEFINED |
| |
| #include "include/core/SkColor.h" |
| #include "include/core/SkRect.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/private/base/SkTArray.h" |
| #include "src/gpu/graphite/AttachmentTypes.h" |
| #include "src/gpu/graphite/CommandTypes.h" |
| #include "src/gpu/graphite/ComputeTypes.h" |
| #include "src/gpu/graphite/DrawTypes.h" |
| #include "src/gpu/graphite/DrawWriter.h" |
| |
| namespace skgpu { |
| class RefCntedCallback; |
| } |
| |
| #ifdef SK_ENABLE_PIET_GPU |
| namespace skgpu::piet { |
| class Scene; |
| } |
| #endif |
| |
| namespace skgpu::graphite { |
| |
| class Buffer; |
| class ComputePipeline; |
| class DrawPass; |
| class SharedContext; |
| class GraphicsPipeline; |
| class Resource; |
| class Sampler; |
| class Texture; |
| class TextureProxy; |
| |
| class CommandBuffer { |
| public: |
| virtual ~CommandBuffer(); |
| |
| #ifdef SK_DEBUG |
| bool hasWork() { return fHasWork; } |
| #endif |
| |
| void trackResource(sk_sp<Resource> resource); |
| // Release all tracked Resources |
| void resetCommandBuffer(); |
| |
| // If any work is needed to create new resources for a fresh command buffer do that here. |
| virtual bool setNewCommandBufferResources() = 0; |
| |
| void addFinishedProc(sk_sp<RefCntedCallback> finishedProc); |
| void callFinishedProcs(bool success); |
| |
| bool addRenderPass(const RenderPassDesc&, |
| sk_sp<Texture> colorTexture, |
| sk_sp<Texture> resolveTexture, |
| sk_sp<Texture> depthStencilTexture, |
| SkRect viewport, |
| const std::vector<std::unique_ptr<DrawPass>>& drawPasses); |
| |
| bool addComputePass(const ComputePassDesc&, |
| sk_sp<ComputePipeline> pipeline, |
| const std::vector<ResourceBinding>& bindings); |
| |
| //--------------------------------------------------------------- |
| // Can only be used outside renderpasses |
| //--------------------------------------------------------------- |
| bool copyBufferToBuffer(sk_sp<Buffer> srcBuffer, |
| size_t srcOffset, |
| sk_sp<Buffer> dstBuffer, |
| size_t dstOffset, |
| size_t size); |
| bool copyTextureToBuffer(sk_sp<Texture>, |
| SkIRect srcRect, |
| sk_sp<Buffer>, |
| size_t bufferOffset, |
| size_t bufferRowBytes); |
| bool copyBufferToTexture(const Buffer*, |
| sk_sp<Texture>, |
| const BufferTextureCopyData*, |
| int count); |
| bool copyTextureToTexture(sk_sp<Texture> src, |
| SkIRect srcRect, |
| sk_sp<Texture> dst, |
| SkIPoint dstPoint); |
| bool synchronizeBufferToCpu(sk_sp<Buffer>); |
| bool clearBuffer(const Buffer* buffer, size_t offset, size_t size); |
| |
| #ifdef SK_ENABLE_PIET_GPU |
| void renderPietScene(const skgpu::piet::Scene& scene, sk_sp<Texture> target); |
| #endif |
| |
| protected: |
| CommandBuffer(); |
| |
| private: |
| // Release all tracked Resources |
| void releaseResources(); |
| |
| virtual void onResetCommandBuffer() = 0; |
| |
| virtual bool onAddRenderPass(const RenderPassDesc&, |
| const Texture* colorTexture, |
| const Texture* resolveTexture, |
| const Texture* depthStencilTexture, |
| SkRect viewport, |
| const std::vector<std::unique_ptr<DrawPass>>& drawPasses) = 0; |
| |
| virtual bool onAddComputePass(const ComputePassDesc&, |
| const ComputePipeline*, |
| const std::vector<ResourceBinding>& bindings) = 0; |
| |
| virtual bool onCopyBufferToBuffer(const Buffer* srcBuffer, |
| size_t srcOffset, |
| const Buffer* dstBuffer, |
| size_t dstOffset, |
| size_t size) = 0; |
| virtual bool onCopyTextureToBuffer(const Texture*, |
| SkIRect srcRect, |
| const Buffer*, |
| size_t bufferOffset, |
| size_t bufferRowBytes) = 0; |
| virtual bool onCopyBufferToTexture(const Buffer*, |
| const Texture*, |
| const BufferTextureCopyData*, |
| int count) = 0; |
| virtual bool onCopyTextureToTexture(const Texture* src, |
| SkIRect srcRect, |
| const Texture* dst, |
| SkIPoint dstPoint) = 0; |
| virtual bool onSynchronizeBufferToCpu(const Buffer*, bool* outDidResultInWork) = 0; |
| virtual bool onClearBuffer(const Buffer*, size_t offset, size_t size) = 0; |
| |
| #ifdef SK_ENABLE_PIET_GPU |
| virtual void onRenderPietScene(const skgpu::piet::Scene& scene, const Texture* target) = 0; |
| #endif |
| |
| #ifdef SK_DEBUG |
| bool fHasWork = false; |
| #endif |
| |
| inline static constexpr int kInitialTrackedResourcesCount = 32; |
| SkSTArray<kInitialTrackedResourcesCount, sk_sp<Resource>> fTrackedResources; |
| SkTArray<sk_sp<RefCntedCallback>> fFinishedProcs; |
| }; |
| |
| } // namespace skgpu::graphite |
| |
| #endif // skgpu_graphite_CommandBuffer_DEFINED |