Commit 16c20140 by Jamie Madill Committed by Commit Bot

Vulkan: Record blit commands inside blit methods.

Instead of starting recording blit commands immediately we can record them closer to where we write to the Image directly. This makes it a bit easier to move towards hiding the command buffers. And easier to move to using implicitly generated barriers. Bug: angleproject:2828 Change-Id: Ida7d4081dd41c8ee19c7dc3fb234df1bb065794d Reviewed-on: https://chromium-review.googlesource.com/1254382 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarFrank Henigman <fjhenigman@chromium.org>
parent def1ba96
...@@ -394,29 +394,27 @@ RenderTargetVk *FramebufferVk::getDepthStencilRenderTarget() const ...@@ -394,29 +394,27 @@ RenderTargetVk *FramebufferVk::getDepthStencilRenderTarget() const
return mRenderTargetCache.getDepthStencil(); return mRenderTargetCache.getDepthStencil();
} }
void FramebufferVk::blitWithCopy(vk::CommandBuffer *commandBuffer, angle::Result FramebufferVk::blitWithCopy(ContextVk *contextVk,
const gl::Rectangle &copyArea, const gl::Rectangle &copyArea,
RenderTargetVk *readRenderTarget, RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget, RenderTargetVk *drawRenderTarget,
bool blitDepthBuffer, bool blitDepthBuffer,
bool blitStencilBuffer) bool blitStencilBuffer)
{ {
VkFlags aspectFlags = vk::ImageHelper *writeImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
vk::GetDepthStencilAspectFlags(readRenderTarget->getImageFormat().textureFormat());
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
vk::ImageHelper *readImage = readRenderTarget->getImageForRead( vk::ImageHelper *readImage = readRenderTarget->getImageForRead(
&mFramebuffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, commandBuffer); &mFramebuffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, commandBuffer);
vk::ImageHelper *writeImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
// Requirement of the copyImageToBuffer, the dst image must be in
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL layout.
writeImage->changeLayoutWithStages(aspectFlags, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, commandBuffer);
VkImageAspectFlags aspectMask = VkImageAspectFlags aspectMask =
vk::GetDepthStencilAspectFlagsForCopy(blitDepthBuffer, blitStencilBuffer); vk::GetDepthStencilAspectFlagsForCopy(blitDepthBuffer, blitStencilBuffer);
vk::ImageHelper::Copy(readImage, writeImage, gl::Offset(), gl::Offset(), vk::ImageHelper::Copy(readImage, writeImage, gl::Offset(), gl::Offset(),
gl::Extents(copyArea.width, copyArea.height, 1), aspectMask, gl::Extents(copyArea.width, copyArea.height, 1), aspectMask,
commandBuffer); commandBuffer);
return angle::Result::Continue();
} }
RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const
...@@ -429,7 +427,6 @@ RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const ...@@ -429,7 +427,6 @@ RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const
angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk, angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk,
const gl::Rectangle &copyArea, const gl::Rectangle &copyArea,
VkImageAspectFlagBits aspect, VkImageAspectFlagBits aspect,
vk::CommandBuffer *commandBuffer,
RenderTargetVk *readRenderTarget, RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget) RenderTargetVk *drawRenderTarget)
{ {
...@@ -482,6 +479,7 @@ angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk, ...@@ -482,6 +479,7 @@ angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk,
// Reinitialize the commandBuffer after a read pixels because it calls // Reinitialize the commandBuffer after a read pixels because it calls
// renderer->finish which makes command buffers obsolete. // renderer->finish which makes command buffers obsolete.
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer)); ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
// We read the bytes of the image in a buffer, now we have to copy them into the // We read the bytes of the image in a buffer, now we have to copy them into the
...@@ -515,8 +513,6 @@ gl::Error FramebufferVk::blit(const gl::Context *context, ...@@ -515,8 +513,6 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
bool blitDepthBuffer = (mask & GL_DEPTH_BUFFER_BIT) != 0; bool blitDepthBuffer = (mask & GL_DEPTH_BUFFER_BIT) != 0;
bool blitStencilBuffer = (mask & GL_STENCIL_BUFFER_BIT) != 0; bool blitStencilBuffer = (mask & GL_STENCIL_BUFFER_BIT) != 0;
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
FramebufferVk *sourceFramebufferVk = vk::GetImpl(sourceFramebuffer); FramebufferVk *sourceFramebufferVk = vk::GetImpl(sourceFramebuffer);
bool flipSource = contextVk->isViewportFlipEnabledForReadFBO(); bool flipSource = contextVk->isViewportFlipEnabledForReadFBO();
bool flipDest = contextVk->isViewportFlipEnabledForDrawFBO(); bool flipDest = contextVk->isViewportFlipEnabledForDrawFBO();
...@@ -563,9 +559,9 @@ gl::Error FramebufferVk::blit(const gl::Context *context, ...@@ -563,9 +559,9 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
return gl::NoError(); return gl::NoError();
} }
blitWithCommand(commandBuffer, readRenderTargetRect, drawRenderTargetRect, ANGLE_TRY(blitWithCommand(contextVk, readRenderTargetRect, drawRenderTargetRect,
readRenderTarget, drawRenderTarget, filter, true, false, false, readRenderTarget, drawRenderTarget, filter, true, false,
flipSource, flipDest); false, flipSource, flipDest));
} }
} }
...@@ -595,9 +591,9 @@ gl::Error FramebufferVk::blit(const gl::Context *context, ...@@ -595,9 +591,9 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
if (HasSrcAndDstBlitProperties(renderer->getPhysicalDevice(), readRenderTarget, if (HasSrcAndDstBlitProperties(renderer->getPhysicalDevice(), readRenderTarget,
drawRenderTarget)) drawRenderTarget))
{ {
blitWithCommand(commandBuffer, readRenderTargetRect, drawRenderTargetRect, ANGLE_TRY(blitWithCommand(contextVk, readRenderTargetRect, drawRenderTargetRect,
readRenderTarget, drawRenderTarget, filter, false, blitDepthBuffer, readRenderTarget, drawRenderTarget, filter, false,
blitStencilBuffer, flipSource, flipDest); blitDepthBuffer, blitStencilBuffer, flipSource, flipDest));
} }
else else
{ {
...@@ -606,20 +602,20 @@ gl::Error FramebufferVk::blit(const gl::Context *context, ...@@ -606,20 +602,20 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
if (blitDepthBuffer) if (blitDepthBuffer)
{ {
ANGLE_TRY(blitWithReadback(contextVk, readRenderTargetRect, ANGLE_TRY(blitWithReadback(contextVk, readRenderTargetRect,
VK_IMAGE_ASPECT_DEPTH_BIT, commandBuffer, VK_IMAGE_ASPECT_DEPTH_BIT, readRenderTarget,
readRenderTarget, drawRenderTarget)); drawRenderTarget));
} }
if (blitStencilBuffer) if (blitStencilBuffer)
{ {
ANGLE_TRY(blitWithReadback(contextVk, readRenderTargetRect, ANGLE_TRY(blitWithReadback(contextVk, readRenderTargetRect,
VK_IMAGE_ASPECT_STENCIL_BIT, commandBuffer, VK_IMAGE_ASPECT_STENCIL_BIT, readRenderTarget,
readRenderTarget, drawRenderTarget)); drawRenderTarget));
} }
} }
else else
{ {
blitWithCopy(commandBuffer, readRenderTargetRect, readRenderTarget, ANGLE_TRY(blitWithCopy(contextVk, readRenderTargetRect, readRenderTarget,
drawRenderTarget, blitDepthBuffer, blitStencilBuffer); drawRenderTarget, blitDepthBuffer, blitStencilBuffer));
} }
} }
} }
...@@ -627,23 +623,28 @@ gl::Error FramebufferVk::blit(const gl::Context *context, ...@@ -627,23 +623,28 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
return gl::NoError(); return gl::NoError();
} }
void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer, angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
const gl::Rectangle &readRectIn, const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn, const gl::Rectangle &drawRectIn,
RenderTargetVk *readRenderTarget, RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget, RenderTargetVk *drawRenderTarget,
GLenum filter, GLenum filter,
bool colorBlit, bool colorBlit,
bool depthBlit, bool depthBlit,
bool stencilBlit, bool stencilBlit,
bool flipSource, bool flipSource,
bool flipDest) bool flipDest)
{ {
// Since blitRenderbufferRect is called for each render buffer that needs to be blitted, // Since blitRenderbufferRect is called for each render buffer that needs to be blitted,
// it should never be the case that both color and depth/stencil need to be blitted at // it should never be the case that both color and depth/stencil need to be blitted at
// at the same time. // at the same time.
ASSERT(colorBlit != (depthBlit || stencilBlit)); ASSERT(colorBlit != (depthBlit || stencilBlit));
vk::ImageHelper *dstImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
const vk::Format &readImageFormat = readRenderTarget->getImageFormat(); const vk::Format &readImageFormat = readRenderTarget->getImageFormat();
VkImageAspectFlags aspectMask = VkImageAspectFlags aspectMask =
colorBlit ? VK_IMAGE_ASPECT_COLOR_BIT colorBlit ? VK_IMAGE_ASPECT_COLOR_BIT
...@@ -682,8 +683,6 @@ void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer, ...@@ -682,8 +683,6 @@ void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer,
blit.dstOffsets[0] = {drawRect.x0(), flipDest ? drawRect.y1() : drawRect.y0(), 0}; blit.dstOffsets[0] = {drawRect.x0(), flipDest ? drawRect.y1() : drawRect.y0(), 0};
blit.dstOffsets[1] = {drawRect.x1(), flipDest ? drawRect.y0() : drawRect.y1(), 1}; blit.dstOffsets[1] = {drawRect.x1(), flipDest ? drawRect.y0() : drawRect.y1(), 1};
vk::ImageHelper *dstImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
// Requirement of the copyImageToBuffer, the dst image must be in // Requirement of the copyImageToBuffer, the dst image must be in
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL layout. // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL layout.
dstImage->changeLayoutWithStages(aspectMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, dstImage->changeLayoutWithStages(aspectMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
...@@ -693,6 +692,8 @@ void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer, ...@@ -693,6 +692,8 @@ void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer,
commandBuffer->blitImage(srcImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, commandBuffer->blitImage(srcImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
dstImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, dstImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit,
gl_vk::GetFilter(filter)); gl_vk::GetFilter(filter));
return angle::Result::Continue();
} }
bool FramebufferVk::checkStatus(const gl::Context *context) const bool FramebufferVk::checkStatus(const gl::Context *context) const
......
...@@ -125,30 +125,29 @@ class FramebufferVk : public FramebufferImpl ...@@ -125,30 +125,29 @@ class FramebufferVk : public FramebufferImpl
vk::RecordingMode *modeOut); vk::RecordingMode *modeOut);
// The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'. // The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'.
void blitWithCommand(vk::CommandBuffer *commandBuffer, angle::Result blitWithCommand(ContextVk *contextVk,
const gl::Rectangle &readRectIn, const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn, const gl::Rectangle &drawRectIn,
RenderTargetVk *readRenderTarget, RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget, RenderTargetVk *drawRenderTarget,
GLenum filter, GLenum filter,
bool colorBlit, bool colorBlit,
bool depthBlit, bool depthBlit,
bool stencilBlit, bool stencilBlit,
bool flipSource, bool flipSource,
bool flipDest); bool flipDest);
// Note that 'copyArea' must be clipped to the scissor and FBO. The clipping is done in 'blit'. // Note that 'copyArea' must be clipped to the scissor and FBO. The clipping is done in 'blit'.
void blitWithCopy(vk::CommandBuffer *commandBuffer, angle::Result blitWithCopy(ContextVk *contextVk,
const gl::Rectangle &copyArea, const gl::Rectangle &copyArea,
RenderTargetVk *readRenderTarget, RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget, RenderTargetVk *drawRenderTarget,
bool blitDepthBuffer, bool blitDepthBuffer,
bool blitStencilBuffer); bool blitStencilBuffer);
angle::Result blitWithReadback(ContextVk *contextVk, angle::Result blitWithReadback(ContextVk *contextVk,
const gl::Rectangle &copyArea, const gl::Rectangle &copyArea,
VkImageAspectFlagBits aspect, VkImageAspectFlagBits aspect,
vk::CommandBuffer *commandBuffer,
RenderTargetVk *readRenderTarget, RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget); RenderTargetVk *drawRenderTarget);
......
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