Index: src/gpu/vk/GrVkCommandBuffer.cpp |
diff --git a/src/gpu/vk/GrVkCommandBuffer.cpp b/src/gpu/vk/GrVkCommandBuffer.cpp |
index 2b636edf20e6f68fdbe58eb2cf1e727c13ad3bd3..4a469fe42ef0f0262529eabc34af83cf9ae9ed8b 100644 |
--- a/src/gpu/vk/GrVkCommandBuffer.cpp |
+++ b/src/gpu/vk/GrVkCommandBuffer.cpp |
@@ -15,12 +15,7 @@ |
#include "GrVkPipelineState.h" |
#include "GrVkTransferBuffer.h" |
#include "GrVkUtil.h" |
- |
- |
-GrVkCommandBuffer::~GrVkCommandBuffer() { |
- // Should have ended any render pass we're in the middle of |
- SkASSERT(!fActiveRenderPass); |
-} |
+#include "SkRect.h" |
void GrVkCommandBuffer::invalidateState() { |
fBoundVertexBuffer = VK_NULL_HANDLE; |
@@ -41,18 +36,14 @@ void GrVkCommandBuffer::invalidateState() { |
void GrVkCommandBuffer::freeGPUData(const GrVkGpu* gpu) const { |
SkASSERT(!fIsActive); |
- SkASSERT(!fActiveRenderPass); |
for (int i = 0; i < fTrackedResources.count(); ++i) { |
fTrackedResources[i]->unref(gpu); |
} |
- // Destroy the fence, if any |
- if (VK_NULL_HANDLE != fSubmitFence) { |
- GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence, nullptr)); |
- } |
- |
GR_VK_CALL(gpu->vkInterface(), FreeCommandBuffers(gpu->device(), gpu->cmdPool(), |
1, &fCmdBuffer)); |
+ |
+ this->onFreeGPUData(gpu); |
} |
void GrVkCommandBuffer::abandonSubResources() const { |
@@ -240,6 +231,11 @@ void GrVkCommandBuffer::setBlendConstants(const GrVkGpu* gpu, |
/////////////////////////////////////////////////////////////////////////////// |
// PrimaryCommandBuffer |
//////////////////////////////////////////////////////////////////////////////// |
+GrVkPrimaryCommandBuffer::~GrVkPrimaryCommandBuffer() { |
+ // Should have ended any render pass we're in the middle of |
+ SkASSERT(!fActiveRenderPass); |
+} |
+ |
GrVkPrimaryCommandBuffer* GrVkPrimaryCommandBuffer::Create(const GrVkGpu* gpu, |
VkCommandPool cmdPool) { |
const VkCommandBufferAllocateInfo cmdInfo = { |
@@ -283,13 +279,33 @@ void GrVkPrimaryCommandBuffer::end(const GrVkGpu* gpu) { |
} |
void GrVkPrimaryCommandBuffer::beginRenderPass(const GrVkGpu* gpu, |
- const GrVkRenderPass* renderPass, |
- const GrVkRenderTarget& target) { |
+ const GrVkRenderPass* renderPass, |
+ uint32_t clearCount, |
+ const VkClearValue* clearValues, |
+ const GrVkRenderTarget& target, |
+ const SkIRect& bounds, |
+ bool forSecondaryCB) { |
SkASSERT(fIsActive); |
SkASSERT(!fActiveRenderPass); |
+ SkASSERT(renderPass->isCompatible(target)); |
+ |
VkRenderPassBeginInfo beginInfo; |
- VkSubpassContents contents; |
- renderPass->getBeginInfo(target, &beginInfo, &contents); |
+ VkRect2D renderArea; |
+ renderArea.offset = { bounds.fLeft , bounds.fTop }; |
+ renderArea.extent = { (uint32_t)bounds.width(), (uint32_t)bounds.height() }; |
+ |
+ memset(&beginInfo, 0, sizeof(VkRenderPassBeginInfo)); |
+ beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; |
+ beginInfo.pNext = nullptr; |
+ beginInfo.renderPass = renderPass->vkRenderPass(); |
+ beginInfo.framebuffer = target.framebuffer()->framebuffer(); |
+ beginInfo.renderArea = renderArea; |
+ beginInfo.clearValueCount = clearCount; |
+ beginInfo.pClearValues = clearValues; |
+ |
+ VkSubpassContents contents = forSecondaryCB ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS |
+ : VK_SUBPASS_CONTENTS_INLINE; |
+ |
GR_VK_CALL(gpu->vkInterface(), CmdBeginRenderPass(fCmdBuffer, &beginInfo, contents)); |
fActiveRenderPass = renderPass; |
this->addResource(renderPass); |
@@ -491,6 +507,14 @@ void GrVkPrimaryCommandBuffer::clearDepthStencilImage(const GrVkGpu* gpu, |
subRanges)); |
} |
+void GrVkPrimaryCommandBuffer::onFreeGPUData(const GrVkGpu* gpu) const { |
+ SkASSERT(!fActiveRenderPass); |
+ // Destroy the fence, if any |
+ if (VK_NULL_HANDLE != fSubmitFence) { |
+ GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence, nullptr)); |
+ } |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// SecondaryCommandBuffer |
//////////////////////////////////////////////////////////////////////////////// |