Commit 5921a040 by Jamie Madill Committed by Commit Bot

Vulkan: Refactor image dependency commands.

Uses commands similar to the Buffer APIs. Also updates docs. Bug: angleproject:4911 Change-Id: I1f2ec9bdd1d725d4ec3d6601e63bcb0c045e2121 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2342287 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarCharlie Lao <cclao@google.com>
parent bbfbea9d
...@@ -4520,13 +4520,6 @@ angle::Result ContextVk::endRenderPass() ...@@ -4520,13 +4520,6 @@ angle::Result ContextVk::endRenderPass()
return angle::Result::Continue; return angle::Result::Continue;
} }
void ContextVk::onRenderPassImageWrite(VkImageAspectFlags aspectFlags,
vk::ImageLayout imageLayout,
vk::ImageHelper *image)
{
mRenderPassCommands->imageWrite(&mResourceUseList, aspectFlags, imageLayout, image);
}
void ContextVk::getNextAvailableCommandBuffer(vk::CommandBufferHelper **commandBuffer, void ContextVk::getNextAvailableCommandBuffer(vk::CommandBufferHelper **commandBuffer,
bool hasRenderPass) bool hasRenderPass)
{ {
......
...@@ -503,17 +503,38 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -503,17 +503,38 @@ class ContextVk : public ContextImpl, public vk::Context
return onBufferWrite(VK_ACCESS_SHADER_WRITE_BIT, vk::PipelineStage::ComputeShader, buffer); return onBufferWrite(VK_ACCESS_SHADER_WRITE_BIT, vk::PipelineStage::ComputeShader, buffer);
} }
angle::Result onImageRead(VkImageAspectFlags aspectFlags, angle::Result onImageTransferRead(VkImageAspectFlags aspectFlags, vk::ImageHelper *image)
vk::ImageLayout imageLayout, {
vk::ImageHelper *image); return onImageRead(aspectFlags, vk::ImageLayout::TransferSrc, image);
}
angle::Result onImageTransferWrite(VkImageAspectFlags aspectFlags, vk::ImageHelper *image)
{
return onImageWrite(aspectFlags, vk::ImageLayout::TransferDst, image);
}
angle::Result onImageComputeShaderRead(VkImageAspectFlags aspectFlags, vk::ImageHelper *image)
{
return onImageRead(aspectFlags, vk::ImageLayout::ComputeShaderReadOnly, image);
}
angle::Result onImageComputeShaderWrite(VkImageAspectFlags aspectFlags, vk::ImageHelper *image)
{
return onImageWrite(aspectFlags, vk::ImageLayout::ComputeShaderWrite, image);
}
angle::Result onImageWrite(VkImageAspectFlags aspectFlags, void onImageRenderPassRead(VkImageAspectFlags aspectFlags,
vk::ImageLayout imageLayout, vk::ImageLayout imageLayout,
vk::ImageHelper *image); vk::ImageHelper *image)
{
ASSERT(mRenderPassCommands->started());
mRenderPassCommands->imageRead(&mResourceUseList, aspectFlags, imageLayout, image);
}
void onRenderPassImageWrite(VkImageAspectFlags aspectFlags, void onImageRenderPassWrite(VkImageAspectFlags aspectFlags,
vk::ImageLayout imageLayout, vk::ImageLayout imageLayout,
vk::ImageHelper *image); vk::ImageHelper *image)
{
ASSERT(mRenderPassCommands->started());
mRenderPassCommands->imageWrite(&mResourceUseList, aspectFlags, imageLayout, image);
}
angle::Result getOutsideRenderPassCommandBuffer(vk::CommandBuffer **commandBufferOut) angle::Result getOutsideRenderPassCommandBuffer(vk::CommandBuffer **commandBufferOut)
{ {
...@@ -877,6 +898,13 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -877,6 +898,13 @@ class ContextVk : public ContextImpl, public vk::Context
vk::PipelineStage writeStage, vk::PipelineStage writeStage,
vk::BufferHelper *buffer); vk::BufferHelper *buffer);
angle::Result onImageRead(VkImageAspectFlags aspectFlags,
vk::ImageLayout imageLayout,
vk::ImageHelper *image);
angle::Result onImageWrite(VkImageAspectFlags aspectFlags,
vk::ImageLayout imageLayout,
vk::ImageHelper *image);
void initIndexTypeMap(); void initIndexTypeMap();
// Pull an available CBH ptr from the CBH queue and set to specified hasRenderPass state // Pull an available CBH ptr from the CBH queue and set to specified hasRenderPass state
......
...@@ -419,8 +419,7 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context, ...@@ -419,8 +419,7 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context,
vk::ImageHelper *image = &depthStencilRT->getImageForWrite(); vk::ImageHelper *image = &depthStencilRT->getImageForWrite();
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY( ANGLE_TRY(contextVk->onImageTransferWrite(image->getAspectFlags(), image));
contextVk->onImageWrite(image->getAspectFlags(), vk::ImageLayout::TransferDst, image));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkImageSubresourceRange range; VkImageSubresourceRange range;
...@@ -796,8 +795,8 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk, ...@@ -796,8 +795,8 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
} }
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onImageRead(imageAspectMask, vk::ImageLayout::TransferSrc, srcImage)); ANGLE_TRY(contextVk->onImageTransferRead(imageAspectMask, srcImage));
ANGLE_TRY(contextVk->onImageWrite(imageAspectMask, vk::ImageLayout::TransferDst, dstImage)); ANGLE_TRY(contextVk->onImageTransferWrite(imageAspectMask, dstImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkImageBlit blit = {}; VkImageBlit blit = {};
...@@ -1204,8 +1203,7 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk, ...@@ -1204,8 +1203,7 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk,
vk::ImageHelper *srcImage) vk::ImageHelper *srcImage)
{ {
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY( ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, srcImage));
contextVk->onImageRead(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferSrc, srcImage));
VkImageResolve resolveRegion = {}; VkImageResolve resolveRegion = {};
resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
...@@ -1227,8 +1225,8 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk, ...@@ -1227,8 +1225,8 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk,
for (size_t colorIndexGL : mState.getEnabledDrawBuffers()) for (size_t colorIndexGL : mState.getEnabledDrawBuffers())
{ {
RenderTargetVk *drawRenderTarget = mRenderTargetCache.getColors()[colorIndexGL]; RenderTargetVk *drawRenderTarget = mRenderTargetCache.getColors()[colorIndexGL];
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst, ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT,
&drawRenderTarget->getImageForWrite())); &drawRenderTarget->getImageForWrite()));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
resolveRegion.dstSubresource.mipLevel = drawRenderTarget->getLevelIndex(); resolveRegion.dstSubresource.mipLevel = drawRenderTarget->getLevelIndex();
...@@ -2120,14 +2118,6 @@ angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk, ...@@ -2120,14 +2118,6 @@ angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk,
colorAttachmentCount++; colorAttachmentCount++;
} }
// Transition the images to the correct layout (through onColorDraw) after the
// resolve-to-multisampled copies are done.
for (size_t colorIndexGL : mState.getEnabledDrawBuffers())
{
RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndexGL];
ANGLE_TRY(colorRenderTarget->onColorDraw(contextVk));
}
// Depth/stencil attachment. // Depth/stencil attachment.
uint32_t depthStencilAttachmentIndex = vk::kInvalidAttachmentIndex; uint32_t depthStencilAttachmentIndex = vk::kInvalidAttachmentIndex;
RenderTargetVk *depthStencilRenderTarget = getDepthStencilRenderTarget(); RenderTargetVk *depthStencilRenderTarget = getDepthStencilRenderTarget();
...@@ -2208,17 +2198,30 @@ angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk, ...@@ -2208,17 +2198,30 @@ angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk,
renderPassAttachmentOps.setOps(depthStencilAttachmentIndex, depthLoadOp, depthStoreOp); renderPassAttachmentOps.setOps(depthStencilAttachmentIndex, depthLoadOp, depthStoreOp);
renderPassAttachmentOps.setStencilOps(depthStencilAttachmentIndex, stencilLoadOp, renderPassAttachmentOps.setStencilOps(depthStencilAttachmentIndex, stencilLoadOp,
stencilStoreOp); stencilStoreOp);
}
ANGLE_TRY(contextVk->flushAndBeginRenderPass(
*framebuffer, renderArea, mRenderPassDesc, renderPassAttachmentOps,
depthStencilAttachmentIndex, packedClearValues, commandBufferOut));
// Transition the images to the correct layout (through onColorDraw) after the
// resolve-to-multisampled copies are done.
for (size_t colorIndexGL : mState.getEnabledDrawBuffers())
{
RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndexGL];
colorRenderTarget->onColorDraw(contextVk);
}
if (depthStencilRenderTarget)
{
// This must be called after hasDefinedContent() since it will set content to valid. We are // This must be called after hasDefinedContent() since it will set content to valid. We are
// tracking content valid very loosely here that as long as it is attached, it assumes will // tracking content valid very loosely here that as long as it is attached, it assumes will
// have valid content. The only time it has undefined content is between swap and // have valid content. The only time it has undefined content is between swap and
// startNewRenderPass // startNewRenderPass
ANGLE_TRY(depthStencilRenderTarget->onDepthStencilDraw(contextVk)); depthStencilRenderTarget->onDepthStencilDraw(contextVk);
} }
return contextVk->flushAndBeginRenderPass(*framebuffer, renderArea, mRenderPassDesc, return angle::Result::Continue;
renderPassAttachmentOps, depthStencilAttachmentIndex,
packedClearValues, commandBufferOut);
} }
void FramebufferVk::updateActiveColorMasks(size_t colorIndexGL, bool r, bool g, bool b, bool a) void FramebufferVk::updateActiveColorMasks(size_t colorIndexGL, bool r, bool g, bool b, bool a)
......
...@@ -123,8 +123,7 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk) ...@@ -123,8 +123,7 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk)
// Copy font data from staging buffer. // Copy font data from staging buffer.
vk::CommandBuffer *fontDataUpload; vk::CommandBuffer *fontDataUpload;
ANGLE_TRY(contextVk->onBufferTransferRead(&fontDataBuffer.get())); ANGLE_TRY(contextVk->onBufferTransferRead(&fontDataBuffer.get()));
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst, ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, &mFontImage));
&mFontImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&fontDataUpload)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&fontDataUpload));
VkBufferImageCopy copy = {}; VkBufferImageCopy copy = {};
......
...@@ -26,25 +26,25 @@ of a front-end OpenGL Context. ContextVk processes state changes and handles act ...@@ -26,25 +26,25 @@ of a front-end OpenGL Context. ContextVk processes state changes and handles act
The back-end records commands into command buffers via the the following `ContextVk` APIs: The back-end records commands into command buffers via the the following `ContextVk` APIs:
* `endRenderPassAndGetCommandBuffer`: returns a secondary command buffer *outside* a RenderPass instance. * `getOutsideRenderPassCommandBuffer`: returns a secondary command buffer *outside* a RenderPass instance.
* `flushAndBeginRenderPass`: returns a secondary command buffer *inside* a RenderPass instance. * `flushAndBeginRenderPass`: returns a secondary command buffer *inside* a RenderPass instance.
* `flushAndGetPrimaryCommandBuffer`: returns the primary command buffer. You should rarely need this API.
*Note*: All of these commands may write out (aka flush) prior pending commands into a primary *Note*: All of these commands may write out (aka flush) prior pending commands into a primary
command buffer. When a RenderPass is open `endRenderPassAndGetCommandBuffer` will flush the command buffer. When a RenderPass is open `getOutsideRenderPassCommandBuffer` will flush the
pending RenderPass commands. `flushAndBeginRenderPass` will flush out pending commands outside a pending RenderPass commands. `flushAndBeginRenderPass` will flush out pending commands outside a
RenderPass to a primary buffer. On submit ANGLE submits the primary command buffer to a `VkQueue`. RenderPass to a primary buffer. On submit ANGLE submits the primary command buffer to a `VkQueue`.
If you need to record inside a RenderPass, use `flushAndBeginRenderPass`. Otherwise, use If you need to record inside a RenderPass, use `flushAndBeginRenderPass`. Otherwise, use
`endRenderPassAndGetCommandBuffer`. You should rarely need to call `flushAndGetPrimaryCommandBuffer`. `getOutsideRenderPassCommandBuffer`.
It's there for commands like debug labels, barriers and queries that need to be recorded serially on
the primary command buffer.
The back-end usually records Image and Buffer barriers through additional `ContextVk` APIs: The back-end (mostly) records Image and Buffer barriers through additional `ContextVk` APIs:
* `onBufferTransferRead/onBufferComputeShaderRead` and `onBufferTransferWrite/onBufferComputeShaderWrite` accumulate `VkBuffer` barriers. * `onBufferTransferRead` and `onBufferComputeShaderRead` accumulate `VkBuffer` read barriers.
* `onImageRead` and `onImageWrite` accumulate `VkImage` barriers. * `onBufferTransferWrite` and `onBufferComputeShaderWrite` accumulate `VkBuffer` write barriers.
* `onRenderPassImageWrite` is a special API for write barriers inside a RenderPass instance. * `onBuffferSelfCopy` is a special case for `VkBuffer` self copies. It behaves the same as write.
* `onImageTransferRead` and `onImageComputerShadeRead` accumulate `VkImage` read barriers.
* `onImageTransferWrite` and `onImageComputerShadeWrite` accumulate `VkImage` write barriers.
* `onImageRenderPassRead` and `onImageRenderPassWrite` accumulate `VkImage` barriers inside a started RenderPass.
After the back-end records commands to the primary buffer we flush (e.g. on swap) or when we call After the back-end records commands to the primary buffer we flush (e.g. on swap) or when we call
`ContextVk::finishToSerial`. `ContextVk::finishToSerial`.
...@@ -62,7 +62,7 @@ In this example we'll be recording a buffer copy command: ...@@ -62,7 +62,7 @@ In this example we'll be recording a buffer copy command:
# Get a pointer to a secondary command buffer for command recording. May "flush" the RP. # Get a pointer to a secondary command buffer for command recording. May "flush" the RP.
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->endRenderPassAndGetCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
# Record the copy command into the secondary buffer. We're done! # Record the copy command into the secondary buffer. We're done!
commandBuffer->copyBuffer(srcBuffer->getBuffer(), destBuffer->getBuffer(), copyCount, copies); commandBuffer->copyBuffer(srcBuffer->getBuffer(), destBuffer->getBuffer(), copyCount, copies);
......
...@@ -91,42 +91,38 @@ vk::ImageViewSubresourceSerial RenderTargetVk::getResolveSubresourceSerial() con ...@@ -91,42 +91,38 @@ vk::ImageViewSubresourceSerial RenderTargetVk::getResolveSubresourceSerial() con
return getSubresourceSerialImpl(mResolveImageViews); return getSubresourceSerialImpl(mResolveImageViews);
} }
angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk) void RenderTargetVk::onColorDraw(ContextVk *contextVk)
{ {
ASSERT(!mImage->getFormat().actualImageFormat().hasDepthOrStencilBits()); ASSERT(!mImage->getFormat().actualImageFormat().hasDepthOrStencilBits());
contextVk->onRenderPassImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment, contextVk->onImageRenderPassWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment,
mImage); mImage);
if (mResolveImage) if (mResolveImage)
{ {
contextVk->onRenderPassImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, contextVk->onImageRenderPassWrite(VK_IMAGE_ASPECT_COLOR_BIT,
vk::ImageLayout::ColorAttachment, mResolveImage); vk::ImageLayout::ColorAttachment, mResolveImage);
} }
retainImageViews(contextVk); retainImageViews(contextVk);
mContentDefined = true; mContentDefined = true;
return angle::Result::Continue;
} }
angle::Result RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk) void RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk)
{ {
ASSERT(mImage->getFormat().actualImageFormat().hasDepthOrStencilBits()); ASSERT(mImage->getFormat().actualImageFormat().hasDepthOrStencilBits());
const angle::Format &format = mImage->getFormat().actualImageFormat(); const angle::Format &format = mImage->getFormat().actualImageFormat();
VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format); VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
contextVk->onRenderPassImageWrite(aspectFlags, vk::ImageLayout::DepthStencilAttachment, mImage); contextVk->onImageRenderPassWrite(aspectFlags, vk::ImageLayout::DepthStencilAttachment, mImage);
if (mResolveImage) if (mResolveImage)
{ {
contextVk->onRenderPassImageWrite(aspectFlags, vk::ImageLayout::DepthStencilAttachment, contextVk->onImageRenderPassWrite(aspectFlags, vk::ImageLayout::DepthStencilAttachment,
mResolveImage); mResolveImage);
} }
retainImageViews(contextVk); retainImageViews(contextVk);
mContentDefined = true; mContentDefined = true;
return angle::Result::Continue;
} }
vk::ImageHelper &RenderTargetVk::getImageForRenderPass() vk::ImageHelper &RenderTargetVk::getImageForRenderPass()
......
...@@ -55,8 +55,8 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -55,8 +55,8 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
vk::ImageViewSubresourceSerial getResolveSubresourceSerial() const; vk::ImageViewSubresourceSerial getResolveSubresourceSerial() const;
// Note: RenderTargets should be called in order, with the depth/stencil onRender last. // Note: RenderTargets should be called in order, with the depth/stencil onRender last.
angle::Result onColorDraw(ContextVk *contextVk); void onColorDraw(ContextVk *contextVk);
angle::Result onDepthStencilDraw(ContextVk *contextVk); void onDepthStencilDraw(ContextVk *contextVk);
vk::ImageHelper &getImageForRenderPass(); vk::ImageHelper &getImageForRenderPass();
const vk::ImageHelper &getImageForRenderPass() const; const vk::ImageHelper &getImageForRenderPass() const;
......
...@@ -1170,10 +1170,8 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk, ...@@ -1170,10 +1170,8 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk,
if (mColorImageMS.valid()) if (mColorImageMS.valid())
{ {
// Transition the multisampled image to TRANSFER_SRC for resolve. // Transition the multisampled image to TRANSFER_SRC for resolve.
ANGLE_TRY(contextVk->onImageRead(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferSrc, ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, &mColorImageMS));
&mColorImageMS)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, &image.image));
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst,
&image.image));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkImageResolve resolveRegion = {}; VkImageResolve resolveRegion = {};
......
...@@ -757,8 +757,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -757,8 +757,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
gl::Extents extents = {sourceBox.width, sourceBox.height, sourceBox.depth}; gl::Extents extents = {sourceBox.width, sourceBox.height, sourceBox.depth};
// Change source layout if necessary // Change source layout if necessary
ANGLE_TRY( ANGLE_TRY(contextVk->onImageTransferRead(VK_IMAGE_ASPECT_COLOR_BIT, srcImage));
contextVk->onImageRead(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferSrc, srcImage));
VkImageSubresourceLayers srcSubresource = {}; VkImageSubresourceLayers srcSubresource = {};
srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
...@@ -797,8 +796,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -797,8 +796,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst, ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage));
mImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkImageSubresourceLayers destSubresource = srcSubresource; VkImageSubresourceLayers destSubresource = srcSubresource;
...@@ -832,8 +830,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -832,8 +830,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
destFormat, kTransferStagingImageFlags, layerCount)); destFormat, kTransferStagingImageFlags, layerCount));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst, ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, stagingImage.get()));
stagingImage.get()));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkImageSubresourceLayers destSubresource = srcSubresource; VkImageSubresourceLayers destSubresource = srcSubresource;
...@@ -1405,8 +1402,7 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, ...@@ -1405,8 +1402,7 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer));
ANGLE_TRY( ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage));
contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst, mImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkBufferImageCopy region = {}; VkBufferImageCopy region = {};
...@@ -1477,8 +1473,7 @@ angle::Result TextureVk::generateMipmapsWithCompute(ContextVk *contextVk) ...@@ -1477,8 +1473,7 @@ angle::Result TextureVk::generateMipmapsWithCompute(ContextVk *contextVk)
for (uint32_t destBaseLevel = 1; destBaseLevel < mImage->getLevelCount(); for (uint32_t destBaseLevel = 1; destBaseLevel < mImage->getLevelCount();
destBaseLevel += maxGenerateLevels) destBaseLevel += maxGenerateLevels)
{ {
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, ANGLE_TRY(contextVk->onImageComputeShaderWrite(VK_IMAGE_ASPECT_COLOR_BIT, mImage));
vk::ImageLayout::ComputeShaderWrite, mImage));
// Generate mipmaps for every layer separately. // Generate mipmaps for every layer separately.
for (uint32_t layer = 0; layer < mImage->getLayerCount(); ++layer) for (uint32_t layer = 0; layer < mImage->getLayerCount(); ++layer)
......
...@@ -1401,12 +1401,10 @@ angle::Result UtilsVk::blitResolveImpl(ContextVk *contextVk, ...@@ -1401,12 +1401,10 @@ angle::Result UtilsVk::blitResolveImpl(ContextVk *contextVk,
pipelineDesc.setScissor(gl_vk::GetRect(params.blitArea)); pipelineDesc.setScissor(gl_vk::GetRect(params.blitArea));
// Change source layout outside render pass
ANGLE_TRY(contextVk->onImageRead(src->getAspectFlags(), vk::ImageLayout::FragmentShaderReadOnly,
src));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(framebuffer->startNewRenderPass(contextVk, params.blitArea, &commandBuffer)); ANGLE_TRY(framebuffer->startNewRenderPass(contextVk, params.blitArea, &commandBuffer));
contextVk->onImageRenderPassRead(src->getAspectFlags(), vk::ImageLayout::FragmentShaderReadOnly,
src);
VkDescriptorImageInfo imageInfos[2] = {}; VkDescriptorImageInfo imageInfos[2] = {};
...@@ -1589,10 +1587,9 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk, ...@@ -1589,10 +1587,9 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
// Change source layout prior to computation. // Change source layout prior to computation.
ANGLE_TRY(contextVk->onImageComputeShaderRead(src->getAspectFlags(), src));
ANGLE_TRY( ANGLE_TRY(
contextVk->onImageRead(src->getAspectFlags(), vk::ImageLayout::ComputeShaderReadOnly, src)); contextVk->onImageTransferWrite(depthStencilImage->getAspectFlags(), depthStencilImage));
ANGLE_TRY(contextVk->onImageWrite(depthStencilImage->getAspectFlags(),
vk::ImageLayout::TransferDst, depthStencilImage));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
// Blit/resolve stencil into the buffer. // Blit/resolve stencil into the buffer.
...@@ -1819,16 +1816,16 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk, ...@@ -1819,16 +1816,16 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk,
VkRect2D scissor = gl_vk::GetRect(renderArea); VkRect2D scissor = gl_vk::GetRect(renderArea);
pipelineDesc.setScissor(scissor); pipelineDesc.setScissor(scissor);
// Change source layout outside render pass
ANGLE_TRY(contextVk->onImageRead(VK_IMAGE_ASPECT_COLOR_BIT,
vk::ImageLayout::FragmentShaderReadOnly, src));
ANGLE_TRY(
contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment, dest));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY( ANGLE_TRY(
startRenderPass(contextVk, dest, destView, renderPassDesc, renderArea, &commandBuffer)); startRenderPass(contextVk, dest, destView, renderPassDesc, renderArea, &commandBuffer));
// Change source layout inside render pass.
contextVk->onImageRenderPassRead(VK_IMAGE_ASPECT_COLOR_BIT,
vk::ImageLayout::FragmentShaderReadOnly, src);
contextVk->onImageRenderPassWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment,
dest);
VkDescriptorImageInfo imageInfo = {}; VkDescriptorImageInfo imageInfo = {};
imageInfo.imageView = srcView->getHandle(); imageInfo.imageView = srcView->getHandle();
imageInfo.imageLayout = src->getCurrentLayout(); imageInfo.imageLayout = src->getCurrentLayout();
...@@ -1971,8 +1968,7 @@ angle::Result UtilsVk::cullOverlayWidgets(ContextVk *contextVk, ...@@ -1971,8 +1968,7 @@ angle::Result UtilsVk::cullOverlayWidgets(ContextVk *contextVk,
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onBufferComputeShaderRead(enabledWidgetsBuffer)); ANGLE_TRY(contextVk->onBufferComputeShaderRead(enabledWidgetsBuffer));
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, ANGLE_TRY(contextVk->onImageComputeShaderWrite(VK_IMAGE_ASPECT_COLOR_BIT, dest));
vk::ImageLayout::ComputeShaderWrite, dest));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
VkDescriptorImageInfo imageInfo = {}; VkDescriptorImageInfo imageInfo = {};
...@@ -2041,12 +2037,9 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk, ...@@ -2041,12 +2037,9 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk,
&descriptorSet)); &descriptorSet));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, ANGLE_TRY(contextVk->onImageComputeShaderWrite(VK_IMAGE_ASPECT_COLOR_BIT, dest));
vk::ImageLayout::ComputeShaderWrite, dest)); ANGLE_TRY(contextVk->onImageComputeShaderRead(VK_IMAGE_ASPECT_COLOR_BIT, culledWidgets));
ANGLE_TRY(contextVk->onImageRead(VK_IMAGE_ASPECT_COLOR_BIT, ANGLE_TRY(contextVk->onImageComputeShaderRead(VK_IMAGE_ASPECT_COLOR_BIT, font));
vk::ImageLayout::ComputeShaderReadOnly, culledWidgets));
ANGLE_TRY(contextVk->onImageRead(VK_IMAGE_ASPECT_COLOR_BIT,
vk::ImageLayout::ComputeShaderReadOnly, font));
ANGLE_TRY(contextVk->onBufferComputeShaderRead(textWidgetsBuffer)); ANGLE_TRY(contextVk->onBufferComputeShaderRead(textWidgetsBuffer));
ANGLE_TRY(contextVk->onBufferComputeShaderRead(graphWidgetsBuffer)); ANGLE_TRY(contextVk->onBufferComputeShaderRead(graphWidgetsBuffer));
......
...@@ -3400,7 +3400,7 @@ void ImageHelper::Copy(ImageHelper *srcImage, ...@@ -3400,7 +3400,7 @@ void ImageHelper::Copy(ImageHelper *srcImage,
angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint maxLevel) angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint maxLevel)
{ {
CommandBuffer *commandBuffer = nullptr; CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, ImageLayout::TransferDst, this)); ANGLE_TRY(contextVk->onImageTransferWrite(VK_IMAGE_ASPECT_COLOR_BIT, this));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
// We are able to use blitImage since the image format we are using supports it. // We are able to use blitImage since the image format we are using supports it.
...@@ -4244,7 +4244,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4244,7 +4244,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
uint64_t subresourceUploadsInProgress = 0; uint64_t subresourceUploadsInProgress = 0;
// Start in TransferDst. // Start in TransferDst.
ANGLE_TRY(contextVk->onImageWrite(aspectFlags, ImageLayout::TransferDst, this)); ANGLE_TRY(contextVk->onImageTransferWrite(aspectFlags, this));
for (SubresourceUpdate &update : mSubresourceUpdates) for (SubresourceUpdate &update : mSubresourceUpdates)
{ {
...@@ -4342,8 +4342,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4342,8 +4342,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
} }
else else
{ {
ANGLE_TRY( ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, update.image.image));
contextVk->onImageRead(aspectFlags, ImageLayout::TransferSrc, update.image.image));
commandBuffer->copyImage(update.image.image->getImage(), commandBuffer->copyImage(update.image.image->getImage(),
update.image.image->getCurrentLayout(), mImage, update.image.image->getCurrentLayout(), mImage,
...@@ -4545,7 +4544,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, ...@@ -4545,7 +4544,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
nullptr)); nullptr));
CommandBuffer *commandBuffer = nullptr; CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(contextVk->onImageRead(aspectFlags, ImageLayout::TransferSrc, this)); ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, this));
ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut)); ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
...@@ -4749,10 +4748,9 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -4749,10 +4748,9 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
CommandBuffer *commandBuffer; CommandBuffer *commandBuffer;
if (isMultisampled) if (isMultisampled)
{ {
ANGLE_TRY(contextVk->onImageWrite(layoutChangeAspectFlags, ImageLayout::TransferDst, ANGLE_TRY(contextVk->onImageTransferWrite(layoutChangeAspectFlags, &resolvedImage.get()));
&resolvedImage.get()));
} }
ANGLE_TRY(contextVk->onImageRead(layoutChangeAspectFlags, ImageLayout::TransferSrc, this)); ANGLE_TRY(contextVk->onImageTransferRead(layoutChangeAspectFlags, this));
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(&commandBuffer));
const angle::Format *readFormat = &mFormat->actualImageFormat(); const angle::Format *readFormat = &mFormat->actualImageFormat();
...@@ -4800,8 +4798,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -4800,8 +4798,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
resolve(&resolvedImage.get(), resolveRegion, commandBuffer); resolve(&resolvedImage.get(), resolveRegion, commandBuffer);
ANGLE_TRY(contextVk->onImageRead(layoutChangeAspectFlags, ImageLayout::TransferSrc, ANGLE_TRY(contextVk->onImageTransferRead(layoutChangeAspectFlags, &resolvedImage.get()));
&resolvedImage.get()));
// Make the resolved image the target of buffer copy. // Make the resolved image the target of buffer copy.
src = &resolvedImage.get(); src = &resolvedImage.get();
......
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