Vulkan: Add RenderTargetVk::getImageForRead.
This helper method will also transition the Image to the correct read
layout. We will need to revisit the implementation when working on
simulatenous read.
Bug: angleproject:2539
Change-Id: Id61404460f3ef0dbb054e6ac2dfc0b59adb78402
Reviewed-on: https://chromium-review.googlesource.com/1108378
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index e879569..e5f2873 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -110,7 +110,6 @@
{
ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer();
- Serial currentSerial = renderer->getCurrentQueueSerial();
// This command buffer is only started once.
vk::CommandBuffer *commandBuffer = nullptr;
@@ -180,7 +179,7 @@
const angle::Format &format = renderTarget->getImageFormat().textureFormat();
const VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
- vk::ImageHelper *image = renderTarget->getImageForWrite(currentSerial, this);
+ vk::ImageHelper *image = renderTarget->getImageForWrite(this);
image->clearDepthStencil(aspectFlags, clearDepthStencilValue, commandBuffer);
}
@@ -214,7 +213,7 @@
}
ASSERT(colorRenderTarget);
- vk::ImageHelper *image = colorRenderTarget->getImageForWrite(currentSerial, this);
+ vk::ImageHelper *image = colorRenderTarget->getImageForWrite(this);
GLint mipLevelToClear = (attachment->type() == GL_TEXTURE) ? attachment->mipLevel() : 0;
image->clearColor(modifiedClearColorValue, mipLevelToClear, 1, commandBuffer);
}
@@ -797,9 +796,8 @@
RenderTargetVk *renderTarget = getColorReadRenderTarget();
// Note that although we're reading from the image, we need to update the layout below.
- // TODO(jmadill): Clearify read/write semantics. http://anglebug.com/2539
- vk::ImageHelper *srcImage =
- renderTarget->getImageForWrite(renderer->getCurrentQueueSerial(), this);
+ vk::ImageHelper *srcImage = renderTarget->getImageForRead(
+ this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT, commandBuffer);
const angle::Format &angleFormat = srcImage->getFormat().textureFormat();
VkBuffer bufferHandle = VK_NULL_HANDLE;
@@ -826,10 +824,6 @@
region.imageSubresource.layerCount = 1;
region.imageSubresource.mipLevel = 0;
- srcImage->changeLayoutWithStages(
- VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, commandBuffer);
-
commandBuffer->copyImageToBuffer(srcImage->getImage(), srcImage->getCurrentLayout(),
bufferHandle, 1, ®ion);