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
return mRenderTargetCache.getDepthStencil();
}
void FramebufferVk::blitWithCopy(vk::CommandBuffer *commandBuffer,
const gl::Rectangle &copyArea,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
bool blitDepthBuffer,
bool blitStencilBuffer)
angle::Result FramebufferVk::blitWithCopy(ContextVk *contextVk,
const gl::Rectangle &copyArea,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
bool blitDepthBuffer,
bool blitStencilBuffer)
{
VkFlags aspectFlags =
vk::GetDepthStencilAspectFlags(readRenderTarget->getImageFormat().textureFormat());
vk::ImageHelper *writeImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
vk::ImageHelper *readImage = readRenderTarget->getImageForRead(
&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 =
vk::GetDepthStencilAspectFlagsForCopy(blitDepthBuffer, blitStencilBuffer);
vk::ImageHelper::Copy(readImage, writeImage, gl::Offset(), gl::Offset(),
gl::Extents(copyArea.width, copyArea.height, 1), aspectMask,
commandBuffer);
return angle::Result::Continue();
}
RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const
......@@ -429,7 +427,6 @@ RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const
angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk,
const gl::Rectangle &copyArea,
VkImageAspectFlagBits aspect,
vk::CommandBuffer *commandBuffer,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget)
{
......@@ -482,6 +479,7 @@ angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk,
// Reinitialize the commandBuffer after a read pixels because it calls
// renderer->finish which makes command buffers obsolete.
vk::CommandBuffer *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
......@@ -515,8 +513,6 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
bool blitDepthBuffer = (mask & GL_DEPTH_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);
bool flipSource = contextVk->isViewportFlipEnabledForReadFBO();
bool flipDest = contextVk->isViewportFlipEnabledForDrawFBO();
......@@ -563,9 +559,9 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
return gl::NoError();
}
blitWithCommand(commandBuffer, readRenderTargetRect, drawRenderTargetRect,
readRenderTarget, drawRenderTarget, filter, true, false, false,
flipSource, flipDest);
ANGLE_TRY(blitWithCommand(contextVk, readRenderTargetRect, drawRenderTargetRect,
readRenderTarget, drawRenderTarget, filter, true, false,
false, flipSource, flipDest));
}
}
......@@ -595,9 +591,9 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
if (HasSrcAndDstBlitProperties(renderer->getPhysicalDevice(), readRenderTarget,
drawRenderTarget))
{
blitWithCommand(commandBuffer, readRenderTargetRect, drawRenderTargetRect,
readRenderTarget, drawRenderTarget, filter, false, blitDepthBuffer,
blitStencilBuffer, flipSource, flipDest);
ANGLE_TRY(blitWithCommand(contextVk, readRenderTargetRect, drawRenderTargetRect,
readRenderTarget, drawRenderTarget, filter, false,
blitDepthBuffer, blitStencilBuffer, flipSource, flipDest));
}
else
{
......@@ -606,20 +602,20 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
if (blitDepthBuffer)
{
ANGLE_TRY(blitWithReadback(contextVk, readRenderTargetRect,
VK_IMAGE_ASPECT_DEPTH_BIT, commandBuffer,
readRenderTarget, drawRenderTarget));
VK_IMAGE_ASPECT_DEPTH_BIT, readRenderTarget,
drawRenderTarget));
}
if (blitStencilBuffer)
{
ANGLE_TRY(blitWithReadback(contextVk, readRenderTargetRect,
VK_IMAGE_ASPECT_STENCIL_BIT, commandBuffer,
readRenderTarget, drawRenderTarget));
VK_IMAGE_ASPECT_STENCIL_BIT, readRenderTarget,
drawRenderTarget));
}
}
else
{
blitWithCopy(commandBuffer, readRenderTargetRect, readRenderTarget,
drawRenderTarget, blitDepthBuffer, blitStencilBuffer);
ANGLE_TRY(blitWithCopy(contextVk, readRenderTargetRect, readRenderTarget,
drawRenderTarget, blitDepthBuffer, blitStencilBuffer));
}
}
}
......@@ -627,23 +623,28 @@ gl::Error FramebufferVk::blit(const gl::Context *context,
return gl::NoError();
}
void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer,
const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
GLenum filter,
bool colorBlit,
bool depthBlit,
bool stencilBlit,
bool flipSource,
bool flipDest)
angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
GLenum filter,
bool colorBlit,
bool depthBlit,
bool stencilBlit,
bool flipSource,
bool flipDest)
{
// 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
// at the same time.
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();
VkImageAspectFlags aspectMask =
colorBlit ? VK_IMAGE_ASPECT_COLOR_BIT
......@@ -682,8 +683,6 @@ void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer,
blit.dstOffsets[0] = {drawRect.x0(), flipDest ? drawRect.y1() : drawRect.y0(), 0};
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
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL layout.
dstImage->changeLayoutWithStages(aspectMask, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
......@@ -693,6 +692,8 @@ void FramebufferVk::blitWithCommand(vk::CommandBuffer *commandBuffer,
commandBuffer->blitImage(srcImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
dstImage->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit,
gl_vk::GetFilter(filter));
return angle::Result::Continue();
}
bool FramebufferVk::checkStatus(const gl::Context *context) const
......
......@@ -125,30 +125,29 @@ class FramebufferVk : public FramebufferImpl
vk::RecordingMode *modeOut);
// The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'.
void blitWithCommand(vk::CommandBuffer *commandBuffer,
const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
GLenum filter,
bool colorBlit,
bool depthBlit,
bool stencilBlit,
bool flipSource,
bool flipDest);
angle::Result blitWithCommand(ContextVk *contextVk,
const gl::Rectangle &readRectIn,
const gl::Rectangle &drawRectIn,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
GLenum filter,
bool colorBlit,
bool depthBlit,
bool stencilBlit,
bool flipSource,
bool flipDest);
// Note that 'copyArea' must be clipped to the scissor and FBO. The clipping is done in 'blit'.
void blitWithCopy(vk::CommandBuffer *commandBuffer,
const gl::Rectangle &copyArea,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
bool blitDepthBuffer,
bool blitStencilBuffer);
angle::Result blitWithCopy(ContextVk *contextVk,
const gl::Rectangle &copyArea,
RenderTargetVk *readRenderTarget,
RenderTargetVk *drawRenderTarget,
bool blitDepthBuffer,
bool blitStencilBuffer);
angle::Result blitWithReadback(ContextVk *contextVk,
const gl::Rectangle &copyArea,
VkImageAspectFlagBits aspect,
vk::CommandBuffer *commandBuffer,
RenderTargetVk *readRenderTarget,
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