| Index: src/gpu/vk/GrVkCommandBuffer.h
|
| diff --git a/src/gpu/vk/GrVkCommandBuffer.h b/src/gpu/vk/GrVkCommandBuffer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..33867abc5acc23c09af4087c17393ed5f26d8974
|
| --- /dev/null
|
| +++ b/src/gpu/vk/GrVkCommandBuffer.h
|
| @@ -0,0 +1,206 @@
|
| +/*
|
| +* Copyright 2015 Google Inc.
|
| +*
|
| +* Use of this source code is governed by a BSD-style license that can be
|
| +* found in the LICENSE file.
|
| +*/
|
| +
|
| +#ifndef GrVkCommandBuffer_DEFINED
|
| +#define GrVkCommandBuffer_DEFINED
|
| +
|
| +#include "GrVkGpu.h"
|
| +#include "GrVkPipeline.h"
|
| +#include "GrVkResource.h"
|
| +#include "GrVkUtil.h"
|
| +#include "vulkan/vulkan.h"
|
| +
|
| +class GrVkRenderPass;
|
| +class GrVkRenderTarget;
|
| +class GrVkTransferBuffer;
|
| +
|
| +class GrVkCommandBuffer : public GrVkResource {
|
| +public:
|
| + static GrVkCommandBuffer* Create(const GrVkGpu* gpu, VkCommandPool cmdPool);
|
| + ~GrVkCommandBuffer() override;
|
| +
|
| + void begin(const GrVkGpu* gpu);
|
| + void end(const GrVkGpu* gpu);
|
| +
|
| + void invalidateState();
|
| +
|
| + // Begins render pass on this command buffer. The framebuffer from GrVkRenderTarget will be used
|
| + // in the render pass.
|
| + void beginRenderPass(const GrVkGpu* gpu,
|
| + const GrVkRenderPass* renderPass,
|
| + const GrVkRenderTarget& target);
|
| + void endRenderPass(const GrVkGpu* gpu);
|
| +
|
| + void submitToQueue(const GrVkGpu* gpu, VkQueue queue, GrVkGpu::SyncQueue sync);
|
| + bool finished(const GrVkGpu* gpu) const;
|
| +
|
| + ////////////////////////////////////////////////////////////////////////////
|
| + // CommandBuffer State/Object bindings
|
| + ////////////////////////////////////////////////////////////////////////////
|
| +#if 0
|
| + void bindPipeline(const GrVkGpu* gpu) const;
|
| + void bindDynamicState(const GrVkGpu* gpu) const;
|
| + void bindDescriptorSet(const GrVkGpu* gpu) const;
|
| +#endif
|
| +
|
| + ////////////////////////////////////////////////////////////////////////////
|
| + // CommandBuffer commands
|
| + ////////////////////////////////////////////////////////////////////////////
|
| + enum BarrierType {
|
| + kMemory_BarrierType,
|
| + kBufferMemory_BarrierType,
|
| + kImageMemory_BarrierType
|
| + };
|
| +
|
| + void pipelineBarrier(const GrVkGpu* gpu,
|
| + VkPipelineStageFlags srcStageMask,
|
| + VkPipelineStageFlags dstStageMask,
|
| + bool byRegion,
|
| + BarrierType barrierType,
|
| + void* barrier) const;
|
| +
|
| + void bindVertexBuffer(GrVkGpu* gpu, GrVkVertexBuffer* vbuffer) {
|
| + VkBuffer vkBuffer = vbuffer->buffer();
|
| + if (!fBoundVertexBufferIsValid || vkBuffer != fBoundVertexBuffer) {
|
| + VkDeviceSize offset = 0;
|
| + GR_VK_CALL(gpu->vkInterface(), CmdBindVertexBuffers(fCmdBuffer,
|
| + 0,
|
| + 1,
|
| + &vkBuffer,
|
| + &offset));
|
| + fBoundVertexBufferIsValid = true;
|
| + fBoundVertexBuffer = vkBuffer;
|
| + addResource(vbuffer->resource());
|
| + }
|
| + }
|
| +
|
| + void bindIndexBuffer(GrVkGpu* gpu, GrVkIndexBuffer* ibuffer) {
|
| + VkBuffer vkBuffer = ibuffer->buffer();
|
| + if (!fBoundIndexBufferIsValid || vkBuffer != fBoundIndexBuffer) {
|
| + GR_VK_CALL(gpu->vkInterface(), CmdBindIndexBuffer(fCmdBuffer,
|
| + vkBuffer,
|
| + 0,
|
| + VK_INDEX_TYPE_UINT16));
|
| + fBoundIndexBufferIsValid = true;
|
| + fBoundIndexBuffer = vkBuffer;
|
| + addResource(ibuffer->resource());
|
| + }
|
| + }
|
| +
|
| + void bindPipeline(const GrVkGpu* gpu, const GrVkPipeline* pipeline) {
|
| + GR_VK_CALL(gpu->vkInterface(), CmdBindPipeline(fCmdBuffer,
|
| + VK_PIPELINE_BIND_POINT_GRAPHICS,
|
| + pipeline->pipeline()));
|
| + addResource(pipeline);
|
| + }
|
| +
|
| + void bindDescriptorSets(const GrVkGpu* gpu,
|
| + GrVkProgram*,
|
| + VkPipelineLayout layout,
|
| + uint32_t firstSet,
|
| + uint32_t setCount,
|
| + const VkDescriptorSet* descriptorSets,
|
| + uint32_t dynamicOffsetCount,
|
| + const uint32_t* dynamicOffsets);
|
| +
|
| + // Commands that only work outside of a render pass
|
| + void clearColorImage(const GrVkGpu* gpu,
|
| + GrVkImage* image,
|
| + const VkClearColorValue* color,
|
| + uint32_t subRangeCount,
|
| + const VkImageSubresourceRange* subRanges);
|
| +
|
| + void copyImage(const GrVkGpu* gpu,
|
| + GrVkImage* srcImage,
|
| + VkImageLayout srcLayout,
|
| + GrVkImage* dstImage,
|
| + VkImageLayout dstLayout,
|
| + uint32_t copyRegionCount,
|
| + const VkImageCopy* copyRegions);
|
| +
|
| + void copyImageToBuffer(const GrVkGpu* gpu,
|
| + GrVkImage* srcImage,
|
| + VkImageLayout srcLayout,
|
| + GrVkTransferBuffer* dstBuffer,
|
| + uint32_t copyRegionCount,
|
| + const VkBufferImageCopy* copyRegions);
|
| +
|
| + void copyBufferToImage(const GrVkGpu* gpu,
|
| + GrVkTransferBuffer* srcBuffer,
|
| + GrVkImage* dstImage,
|
| + VkImageLayout dstLayout,
|
| + uint32_t copyRegionCount,
|
| + const VkBufferImageCopy* copyRegions);
|
| +
|
| + // Commands that only work inside of a render pass
|
| + void clearAttachments(const GrVkGpu* gpu,
|
| + int numAttachments,
|
| + const VkClearAttachment* attachments,
|
| + int numRects,
|
| + const VkClearRect* clearRects) const;
|
| +
|
| + void drawIndexed(const GrVkGpu* gpu,
|
| + uint32_t indexCount,
|
| + uint32_t instanceCount,
|
| + uint32_t firstIndex,
|
| + int32_t vertexOffset,
|
| + uint32_t firstInstance) const;
|
| +
|
| + void draw(const GrVkGpu* gpu,
|
| + uint32_t vertexCount,
|
| + uint32_t instanceCount,
|
| + uint32_t firstVertex,
|
| + uint32_t firstInstance) const;
|
| +
|
| + // Add ref-counted resource that will be tracked and released when this
|
| + // command buffer finishes execution
|
| + void addResource(const GrVkResource* resource) {
|
| + resource->ref();
|
| + fTrackedResources.push_back(resource);
|
| + }
|
| +
|
| +private:
|
| + static const int kInitialTrackedResourcesCount = 32;
|
| +
|
| + explicit GrVkCommandBuffer(VkCommandBuffer cmdBuffer)
|
| + : fTrackedResources(kInitialTrackedResourcesCount)
|
| + , fCmdBuffer(cmdBuffer)
|
| + , fSubmitFence(VK_NULL_HANDLE)
|
| + , fBoundVertexBufferIsValid(false)
|
| + , fBoundIndexBufferIsValid(false)
|
| + , fIsActive(false)
|
| + , fActiveRenderPass(nullptr) {
|
| + this->invalidateState();
|
| + }
|
| +
|
| + void freeGPUData(const GrVkGpu* gpu) const override;
|
| + void abandonSubResources() const override;
|
| +
|
| + SkTArray<const GrVkResource*, true> fTrackedResources;
|
| +
|
| + VkCommandBuffer fCmdBuffer;
|
| + VkFence fSubmitFence;
|
| +
|
| + VkBuffer fBoundVertexBuffer;
|
| + bool fBoundVertexBufferIsValid;
|
| +
|
| + VkBuffer fBoundIndexBuffer;
|
| + bool fBoundIndexBufferIsValid;
|
| +
|
| + // Tracks whether we are in the middle of a command buffer begin/end calls and thus can add new
|
| + // commands to the buffer;
|
| + bool fIsActive;
|
| +
|
| + // Stores a pointer to the current active render pass (i.e. begin has been called but not end).
|
| + // A nullptr means there is no active render pass. The GrVKCommandBuffer does not own the render
|
| + // pass.
|
| + const GrVkRenderPass* fActiveRenderPass;
|
| +};
|
| +
|
| +
|
| +#endif
|
| +
|
|
|