Index: src/gpu/vk/GrVkCommandBuffer.cpp |
diff --git a/src/gpu/vk/GrVkCommandBuffer.cpp b/src/gpu/vk/GrVkCommandBuffer.cpp |
index f076c0b6f1d14dbe6108e9ff7181786960a887b8..7fb143ed987065b4d2697a49ddf16cada071d3ed 100644 |
--- a/src/gpu/vk/GrVkCommandBuffer.cpp |
+++ b/src/gpu/vk/GrVkCommandBuffer.cpp |
@@ -52,6 +52,22 @@ void GrVkCommandBuffer::abandonSubResources() const { |
} |
} |
+void GrVkCommandBuffer::reset(GrVkGpu* gpu) { |
+ SkASSERT(!fIsActive); |
+ for (int i = 0; i < fTrackedResources.count(); ++i) { |
+ fTrackedResources[i]->unref(gpu); |
+ } |
+ fTrackedResources.reset(); |
+ |
+ this->invalidateState(); |
+ |
+ // we will retain resources for later use |
+ VkCommandBufferResetFlags flags = 0; |
+ GR_VK_CALL(gpu->vkInterface(), ResetCommandBuffer(fCmdBuffer, flags)); |
+ |
+ this->onReset(gpu); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// CommandBuffer commands |
//////////////////////////////////////////////////////////////////////////////// |
@@ -320,13 +336,14 @@ void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { |
} |
void GrVkPrimaryCommandBuffer::executeCommands(const GrVkGpu* gpu, |
- const GrVkSecondaryCommandBuffer* buffer) { |
+ GrVkSecondaryCommandBuffer* buffer) { |
SkASSERT(fIsActive); |
SkASSERT(fActiveRenderPass); |
SkASSERT(fActiveRenderPass->isCompatible(*buffer->fActiveRenderPass)); |
GR_VK_CALL(gpu->vkInterface(), CmdExecuteCommands(fCmdBuffer, 1, &buffer->fCmdBuffer)); |
- this->addResource(buffer); |
+ buffer->ref(); |
+ fSecondaryCommandBuffers.push_back(buffer); |
// When executing a secondary command buffer all state (besides render pass state) becomes |
// invalidated and must be reset. This includes bound buffers, pipelines, dynamic state, etc. |
this->invalidateState(); |
@@ -338,12 +355,16 @@ void GrVkPrimaryCommandBuffer::submitToQueue(const GrVkGpu* gpu, |
SkASSERT(!fIsActive); |
VkResult err; |
- VkFenceCreateInfo fenceInfo; |
- memset(&fenceInfo, 0, sizeof(VkFenceCreateInfo)); |
- fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; |
- err = GR_VK_CALL(gpu->vkInterface(), CreateFence(gpu->device(), &fenceInfo, nullptr, |
- &fSubmitFence)); |
- SkASSERT(!err); |
+ if (VK_NULL_HANDLE == fSubmitFence) { |
+ VkFenceCreateInfo fenceInfo; |
+ memset(&fenceInfo, 0, sizeof(VkFenceCreateInfo)); |
+ fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; |
+ err = GR_VK_CALL(gpu->vkInterface(), CreateFence(gpu->device(), &fenceInfo, nullptr, |
+ &fSubmitFence)); |
+ SkASSERT(!err); |
+ } else { |
+ GR_VK_CALL(gpu->vkInterface(), ResetFences(gpu->device(), 1, &fSubmitFence)); |
+ } |
VkSubmitInfo submitInfo; |
memset(&submitInfo, 0, sizeof(VkSubmitInfo)); |
@@ -395,6 +416,13 @@ bool GrVkPrimaryCommandBuffer::finished(const GrVkGpu* gpu) const { |
return false; |
} |
+void GrVkPrimaryCommandBuffer::onReset(GrVkGpu* gpu) { |
+ for (int i = 0; i < fSecondaryCommandBuffers.count(); ++i) { |
+ gpu->resourceProvider().recycleSecondaryCommandBuffer(fSecondaryCommandBuffers[i]); |
+ } |
+ fSecondaryCommandBuffers.reset(); |
+} |
+ |
void GrVkPrimaryCommandBuffer::copyImage(const GrVkGpu* gpu, |
GrVkImage* srcImage, |
VkImageLayout srcLayout, |
@@ -538,10 +566,8 @@ void GrVkPrimaryCommandBuffer::onFreeGPUData(const GrVkGpu* gpu) const { |
// SecondaryCommandBuffer |
//////////////////////////////////////////////////////////////////////////////// |
-GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( |
- const GrVkGpu* gpu, |
- VkCommandPool cmdPool, |
- const GrVkRenderPass* compatibleRenderPass) { |
+GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create(const GrVkGpu* gpu, |
+ VkCommandPool cmdPool) { |
const VkCommandBufferAllocateInfo cmdInfo = { |
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
NULL, // pNext |
@@ -557,13 +583,15 @@ GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( |
if (err) { |
return nullptr; |
} |
- return new GrVkSecondaryCommandBuffer(cmdBuffer, compatibleRenderPass); |
+ return new GrVkSecondaryCommandBuffer(cmdBuffer); |
} |
-void GrVkSecondaryCommandBuffer::begin(const GrVkGpu* gpu, const GrVkFramebuffer* framebuffer) { |
+void GrVkSecondaryCommandBuffer::begin(const GrVkGpu* gpu, const GrVkFramebuffer* framebuffer, |
+ const GrVkRenderPass* compatibleRenderPass) { |
SkASSERT(!fIsActive); |
- SkASSERT(fActiveRenderPass); |
+ SkASSERT(compatibleRenderPass); |
+ fActiveRenderPass = compatibleRenderPass; |
VkCommandBufferInheritanceInfo inheritanceInfo; |
memset(&inheritanceInfo, 0, sizeof(VkCommandBufferInheritanceInfo)); |