Commit e4e2d0c5 by Jamie Madill Committed by Commit Bot

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: 's avatarLuc Ferron <lucferron@chromium.org>
parent 16f391d4
......@@ -110,7 +110,6 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
{
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 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
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 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
}
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 @@ gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context,
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 @@ gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context,
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, &region);
......
......@@ -104,8 +104,23 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView
mImageView = imageView;
}
vk::ImageHelper *RenderTargetVk::getImageForWrite(Serial currentSerial,
vk::CommandGraphResource *writingResource) const
vk::ImageHelper *RenderTargetVk::getImageForRead(vk::CommandGraphResource *readingResource,
VkImageLayout layout,
VkImageAspectFlags aspectFlags,
vk::CommandBuffer *commandBuffer)
{
ASSERT(mImage && mImage->valid());
// TODO(jmadill): Better simultaneous resource access. http://anglebug.com/2679
mResource->addWriteDependency(readingResource);
mImage->changeLayoutWithStages(aspectFlags, layout, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, commandBuffer);
return mImage;
}
vk::ImageHelper *RenderTargetVk::getImageForWrite(vk::CommandGraphResource *writingResource) const
{
ASSERT(mImage && mImage->valid());
mResource->addWriteDependency(writingResource);
......
......@@ -48,8 +48,12 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
const vk::ImageHelper &getImage() const;
vk::ImageHelper *getImageForWrite(Serial currentSerial,
vk::CommandGraphResource *writingResource) const;
// getImageForRead will also transition the resource to the given layout.
vk::ImageHelper *getImageForRead(vk::CommandGraphResource *readingResource,
VkImageLayout layout,
VkImageAspectFlags aspectFlags,
vk::CommandBuffer *commandBuffer);
vk::ImageHelper *getImageForWrite(vk::CommandGraphResource *writingResource) const;
vk::ImageView *getImageView() const;
vk::CommandGraphResource *getResource() const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment