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) ...@@ -110,7 +110,6 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
{ {
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
Serial currentSerial = renderer->getCurrentQueueSerial();
// This command buffer is only started once. // This command buffer is only started once.
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
...@@ -180,7 +179,7 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask) ...@@ -180,7 +179,7 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
const angle::Format &format = renderTarget->getImageFormat().textureFormat(); const angle::Format &format = renderTarget->getImageFormat().textureFormat();
const VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format); const VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
vk::ImageHelper *image = renderTarget->getImageForWrite(currentSerial, this); vk::ImageHelper *image = renderTarget->getImageForWrite(this);
image->clearDepthStencil(aspectFlags, clearDepthStencilValue, commandBuffer); image->clearDepthStencil(aspectFlags, clearDepthStencilValue, commandBuffer);
} }
...@@ -214,7 +213,7 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask) ...@@ -214,7 +213,7 @@ gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
} }
ASSERT(colorRenderTarget); ASSERT(colorRenderTarget);
vk::ImageHelper *image = colorRenderTarget->getImageForWrite(currentSerial, this); vk::ImageHelper *image = colorRenderTarget->getImageForWrite(this);
GLint mipLevelToClear = (attachment->type() == GL_TEXTURE) ? attachment->mipLevel() : 0; GLint mipLevelToClear = (attachment->type() == GL_TEXTURE) ? attachment->mipLevel() : 0;
image->clearColor(modifiedClearColorValue, mipLevelToClear, 1, commandBuffer); image->clearColor(modifiedClearColorValue, mipLevelToClear, 1, commandBuffer);
} }
...@@ -797,9 +796,8 @@ gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context, ...@@ -797,9 +796,8 @@ gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context,
RenderTargetVk *renderTarget = getColorReadRenderTarget(); RenderTargetVk *renderTarget = getColorReadRenderTarget();
// Note that although we're reading from the image, we need to update the layout below. // 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->getImageForRead(
vk::ImageHelper *srcImage = this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT, commandBuffer);
renderTarget->getImageForWrite(renderer->getCurrentQueueSerial(), this);
const angle::Format &angleFormat = srcImage->getFormat().textureFormat(); const angle::Format &angleFormat = srcImage->getFormat().textureFormat();
VkBuffer bufferHandle = VK_NULL_HANDLE; VkBuffer bufferHandle = VK_NULL_HANDLE;
...@@ -826,10 +824,6 @@ gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context, ...@@ -826,10 +824,6 @@ gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context,
region.imageSubresource.layerCount = 1; region.imageSubresource.layerCount = 1;
region.imageSubresource.mipLevel = 0; 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(), commandBuffer->copyImageToBuffer(srcImage->getImage(), srcImage->getCurrentLayout(),
bufferHandle, 1, &region); bufferHandle, 1, &region);
......
...@@ -104,8 +104,23 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView ...@@ -104,8 +104,23 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView
mImageView = imageView; mImageView = imageView;
} }
vk::ImageHelper *RenderTargetVk::getImageForWrite(Serial currentSerial, vk::ImageHelper *RenderTargetVk::getImageForRead(vk::CommandGraphResource *readingResource,
vk::CommandGraphResource *writingResource) const 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()); ASSERT(mImage && mImage->valid());
mResource->addWriteDependency(writingResource); mResource->addWriteDependency(writingResource);
......
...@@ -48,8 +48,12 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -48,8 +48,12 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
const vk::ImageHelper &getImage() const; const vk::ImageHelper &getImage() const;
vk::ImageHelper *getImageForWrite(Serial currentSerial, // getImageForRead will also transition the resource to the given layout.
vk::CommandGraphResource *writingResource) const; 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::ImageView *getImageView() const;
vk::CommandGraphResource *getResource() 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