Commit d9818fd6 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Improve RenderTargetVk's getImage interface

Prior to this change, RenderTargetVk had getImage() and getImageForWrite(). This change introduces getImageForCopy() and renames getImage() to getImageForRenderPass(). Currently, all three functions do the same thing. However, with upcoming changes the semantics will be different: - getImageForRenderPass(): This is the image used as the non-resolve attachment. When resolve attachments are introduced, there will be a corresponding getResolveImageForRenderPass(). - getImageForCopy(): When GL_EXT_multisampled_render_to_texture is implemented, this will return the image that owns the data. - getImageForWrite(): Similar to getImageForCopy(), but should set mContentDefined. This is currently missing, and is a bug that will be resolved in a follow up. This split change gets the mechanical rename out of the way to make future changes simpler. Bug: angleproject:4836 Bug: angleproject:4859 Change-Id: I5f7657cc049c0e1772a7c510e74289e685ba93c3 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2306516 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent 20eb9be5
......@@ -2397,7 +2397,7 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle)
}
// Use finalLayout instead of extra barrier for layout change to present
vk::ImageHelper &image = color0RenderTarget->getImage();
vk::ImageHelper &image = color0RenderTarget->getImageForWrite();
image.setCurrentImageLayout(vk::ImageLayout::Present);
mRenderPassCommands->updateRenderPassAttachmentFinalLayout(0, image.getCurrentImageLayout());
}
......
......@@ -328,21 +328,21 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context,
ANGLE_VK_CHECK(contextVk, !scissoredClear, VK_ERROR_INCOMPATIBLE_DRIVER);
RenderTargetVk *depthStencilRT = mRenderTargetCache.getDepthStencil(true);
vk::ImageHelper &image = depthStencilRT->getImage();
vk::ImageHelper *image = &depthStencilRT->getImageForWrite();
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(
contextVk->onImageWrite(image.getAspectFlags(), vk::ImageLayout::TransferDst, &image));
contextVk->onImageWrite(image->getAspectFlags(), vk::ImageLayout::TransferDst, image));
ANGLE_TRY(contextVk->endRenderPassAndGetCommandBuffer(&commandBuffer));
VkImageSubresourceRange range;
range.aspectMask = image.getAspectFlags();
range.aspectMask = image->getAspectFlags();
range.baseMipLevel = depthStencilRT->getLevelIndex();
range.levelCount = 1;
range.baseArrayLayer = depthStencilRT->getLayerIndex();
range.layerCount = 1;
commandBuffer->clearDepthStencilImage(image.getImage(),
commandBuffer->clearDepthStencilImage(image->getImage(),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
clearDepthStencilValue, 1, &range);
clearDepth = false;
......@@ -616,14 +616,14 @@ RenderTargetVk *FramebufferVk::getDepthStencilRenderTarget() const
RenderTargetVk *FramebufferVk::getColorDrawRenderTarget(size_t colorIndex) const
{
RenderTargetVk *renderTarget = mRenderTargetCache.getColorDraw(mState, colorIndex);
ASSERT(renderTarget && renderTarget->getImage().valid());
ASSERT(renderTarget && renderTarget->getImageForRenderPass().valid());
return renderTarget;
}
RenderTargetVk *FramebufferVk::getColorReadRenderTarget() const
{
RenderTargetVk *renderTarget = mRenderTargetCache.getColorRead(mState);
ASSERT(renderTarget && renderTarget->getImage().valid());
ASSERT(renderTarget && renderTarget->getImageForRenderPass().valid());
return renderTarget;
}
......@@ -669,8 +669,8 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
// at the same time.
ASSERT(colorBlit != (depthBlit || stencilBlit));
vk::ImageHelper *srcImage = &readRenderTarget->getImage();
vk::ImageHelper *dstImage = drawRenderTarget->getImageForWrite(contextVk);
vk::ImageHelper *srcImage = &readRenderTarget->getImageForCopy();
vk::ImageHelper *dstImage = &drawRenderTarget->getImageForWrite();
VkImageAspectFlags imageAspectMask = srcImage->getAspectFlags();
VkImageAspectFlags blitAspectMask = imageAspectMask;
......@@ -1037,16 +1037,16 @@ angle::Result FramebufferVk::blit(const gl::Context *context,
else if (isResolve && !flipX && !flipY && areChannelsBlitCompatible &&
(rotation == SurfaceRotation::Identity))
{
ANGLE_TRY(resolveColorWithCommand(contextVk, params, &readRenderTarget->getImage()));
ANGLE_TRY(
resolveColorWithCommand(contextVk, params, &readRenderTarget->getImageForCopy()));
}
// Otherwise use a shader to do blit or resolve.
else
{
const vk::ImageView *readImageView = nullptr;
ANGLE_TRY(readRenderTarget->getImageView(contextVk, &readImageView));
readRenderTarget->retainImageViews(contextVk);
ANGLE_TRY(utilsVk.colorBlitResolve(contextVk, this, &readRenderTarget->getImage(),
readImageView, params));
const vk::ImageView *copyImageView = nullptr;
ANGLE_TRY(readRenderTarget->getAndRetainCopyImageView(contextVk, &copyImageView));
ANGLE_TRY(utilsVk.colorBlitResolve(
contextVk, this, &readRenderTarget->getImageForCopy(), copyImageView, params));
}
}
......@@ -1080,7 +1080,7 @@ angle::Result FramebufferVk::blit(const gl::Context *context,
vk::DeviceScoped<vk::ImageView> depthView(contextVk->getDevice());
vk::DeviceScoped<vk::ImageView> stencilView(contextVk->getDevice());
vk::ImageHelper *depthStencilImage = &readRenderTarget->getImage();
vk::ImageHelper *depthStencilImage = &readRenderTarget->getImageForCopy();
uint32_t levelIndex = readRenderTarget->getLevelIndex();
uint32_t layerIndex = readRenderTarget->getLayerIndex();
gl::TextureType textureType = vk::Get2DTextureType(depthStencilImage->getLayerCount(),
......@@ -1162,13 +1162,13 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk,
{
RenderTargetVk *drawRenderTarget = mRenderTargetCache.getColors()[colorIndexGL];
ANGLE_TRY(contextVk->onImageWrite(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst,
&drawRenderTarget->getImage()));
&drawRenderTarget->getImageForWrite()));
ANGLE_TRY(contextVk->endRenderPassAndGetCommandBuffer(&commandBuffer));
resolveRegion.dstSubresource.mipLevel = drawRenderTarget->getLevelIndex();
resolveRegion.dstSubresource.baseArrayLayer = drawRenderTarget->getLayerIndex();
srcImage->resolve(&drawRenderTarget->getImage(), resolveRegion, commandBuffer);
srcImage->resolve(&drawRenderTarget->getImageForWrite(), resolveRegion, commandBuffer);
}
return angle::Result::Continue;
......@@ -1525,7 +1525,8 @@ void FramebufferVk::updateRenderPassDesc()
RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndexGL];
ASSERT(colorRenderTarget);
mRenderPassDesc.packColorAttachment(
colorIndexGL, colorRenderTarget->getImage().getFormat().intendedFormatID);
colorIndexGL,
colorRenderTarget->getImageForRenderPass().getFormat().intendedFormatID);
}
else
{
......@@ -1537,7 +1538,7 @@ void FramebufferVk::updateRenderPassDesc()
if (depthStencilRenderTarget)
{
mRenderPassDesc.packDepthStencilAttachment(
depthStencilRenderTarget->getImage().getFormat().intendedFormatID);
depthStencilRenderTarget->getImageForRenderPass().getFormat().intendedFormatID);
}
}
......@@ -1704,7 +1705,8 @@ angle::Result FramebufferVk::clearWithDraw(ContextVk *contextVk,
const RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndexGL];
ASSERT(colorRenderTarget);
params.colorFormat = &colorRenderTarget->getImage().getFormat().actualImageFormat();
params.colorFormat =
&colorRenderTarget->getImageForRenderPass().getFormat().actualImageFormat();
params.colorAttachmentIndexGL = static_cast<uint32_t>(colorIndexGL);
params.colorMaskFlags = colorMaskFlags;
if (mEmulatedAlphaAttachmentMask[colorIndexGL])
......@@ -1775,7 +1777,8 @@ void FramebufferVk::clearWithRenderPassOp(gl::DrawBufferMask clearColorBuffers,
RenderTargetVk *renderTarget = getColorDrawRenderTarget(colorIndexGL);
VkClearValue clearValue = getCorrectedColorClearValue(colorIndexGL, clearColorValue);
gl::ImageIndex imageIndex = renderTarget->getImageIndex();
renderTarget->getImage().stageClear(imageIndex, VK_IMAGE_ASPECT_COLOR_BIT, clearValue);
renderTarget->getImageForWrite().stageClear(imageIndex, VK_IMAGE_ASPECT_COLOR_BIT,
clearValue);
}
// Set the appropriate loadOp and clear values for depth and stencil.
......@@ -1799,7 +1802,7 @@ void FramebufferVk::clearWithRenderPassOp(gl::DrawBufferMask clearColorBuffers,
clearValue.depthStencil = clearDepthStencilValue;
gl::ImageIndex imageIndex = renderTarget->getImageIndex();
renderTarget->getImage().stageClear(imageIndex, dsAspectFlags, clearValue);
renderTarget->getImageForWrite().stageClear(imageIndex, dsAspectFlags, clearValue);
}
}
......@@ -1962,8 +1965,9 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
ANGLE_TRACE_EVENT0("gpu.angle", "FramebufferVk::readPixelsImpl");
uint32_t levelGL = renderTarget->getLevelIndex();
uint32_t layer = renderTarget->getLayerIndex();
return renderTarget->getImage().readPixels(contextVk, area, packPixelsParams, copyAspectFlags,
levelGL, layer, pixels, &mReadPixelBuffer);
return renderTarget->getImageForCopy().readPixels(contextVk, area, packPixelsParams,
copyAspectFlags, levelGL, layer, pixels,
&mReadPixelBuffer);
}
gl::Extents FramebufferVk::getReadImageExtents() const
......@@ -2033,7 +2037,7 @@ RenderTargetVk *FramebufferVk::getFirstRenderTarget() const
GLint FramebufferVk::getSamples() const
{
RenderTargetVk *firstRT = getFirstRenderTarget();
return firstRT ? firstRT->getImage().getSamples() : 1;
return firstRT ? firstRT->getImageForRenderPass().getSamples() : 1;
}
angle::Result FramebufferVk::flushDeferredClears(ContextVk *contextVk,
......
......@@ -44,8 +44,8 @@ void RenderTargetVk::init(vk::ImageHelper *image,
mImageViews = imageViews;
mLevelIndexGL = levelIndexGL;
mLayerIndex = layerIndex;
// We are being conservative here since our targeted optimization is to skip surfaceVK's depth
// buffer load after swap call.
// Conservatively assume the content is defined.
mContentDefined = true;
}
......@@ -58,7 +58,7 @@ void RenderTargetVk::reset()
mContentDefined = false;
}
ImageViewSerial RenderTargetVk::getAssignImageViewSerial(ContextVk *contextVk)
ImageViewSerial RenderTargetVk::getAssignImageViewSerial(ContextVk *contextVk) const
{
ASSERT(mImageViews);
ASSERT(mLayerIndex < std::numeric_limits<uint16_t>::max());
......@@ -96,13 +96,13 @@ angle::Result RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk)
return angle::Result::Continue;
}
vk::ImageHelper &RenderTargetVk::getImage()
vk::ImageHelper &RenderTargetVk::getImageForRenderPass()
{
ASSERT(mImage && mImage->valid());
return *mImage;
}
const vk::ImageHelper &RenderTargetVk::getImage() const
const vk::ImageHelper &RenderTargetVk::getImageForRenderPass() const
{
ASSERT(mImage && mImage->valid());
return *mImage;
......@@ -125,8 +125,8 @@ angle::Result RenderTargetVk::getAndRetainCopyImageView(ContextVk *contextVk,
const vk::ImageViewHelper *imageViews = mImageViews;
const vk::ImageView &copyView = imageViews->getCopyImageView();
// If the source of render target is the texture, this will always be valid. This is also where
// 3D or 2DArray images could be the source of the render target.
// If the source of render target is a texture or renderbuffer, this will always be valid. This
// is also where 3D or 2DArray images could be the source of the render target.
if (copyView.valid())
{
*imageViewOut = &copyView;
......@@ -158,11 +158,16 @@ void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageViewH
mImageViews = imageViews;
}
vk::ImageHelper *RenderTargetVk::getImageForWrite(ContextVk *contextVk) const
vk::ImageHelper &RenderTargetVk::getImageForCopy() const
{
ASSERT(mImage && mImage->valid());
retainImageViews(contextVk);
return mImage;
return *mImage;
}
vk::ImageHelper &RenderTargetVk::getImageForWrite() const
{
ASSERT(mImage && mImage->valid());
return *mImage;
}
angle::Result RenderTargetVk::flushStagedUpdates(ContextVk *contextVk,
......
......@@ -48,16 +48,17 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
uint32_t layerIndex);
void reset();
// This returns the serial from underlying ImageViewHelper, first assigning one if required
ImageViewSerial getAssignImageViewSerial(ContextVk *contextVk);
ImageViewSerial getAssignImageViewSerial(ContextVk *contextVk) const;
// Note: RenderTargets should be called in order, with the depth/stencil onRender last.
angle::Result onColorDraw(ContextVk *contextVk);
angle::Result onDepthStencilDraw(ContextVk *contextVk);
vk::ImageHelper &getImage();
const vk::ImageHelper &getImage() const;
vk::ImageHelper &getImageForRenderPass();
const vk::ImageHelper &getImageForRenderPass() const;
vk::ImageHelper *getImageForWrite(ContextVk *contextVk) const;
vk::ImageHelper &getImageForCopy() const;
vk::ImageHelper &getImageForWrite() const;
// For cube maps we use single-level single-layer 2D array views.
angle::Result getImageView(ContextVk *contextVk, const vk::ImageView **imageViewOut) const;
......@@ -85,7 +86,8 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
void retainImageViews(ContextVk *contextVk) const;
bool hasDefinedContent() const { return mContentDefined; }
// mark content as undefined so that certain optimizations are possible
// mark content as undefined so that certain optimizations are possible such as using DONT_CARE
// as loadOp of the render target in the next renderpass.
void invalidateContent() { mContentDefined = false; }
private:
......@@ -93,8 +95,9 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
vk::ImageViewHelper *mImageViews;
uint32_t mLevelIndexGL;
uint32_t mLayerIndex;
// Right now we are only tracking depth/stencil buffer. We could expand it to cover color
// buffers if needed in future.
// Whether the render target has been invalidated. If so, DONT_CARE is used instead of LOAD for
// loadOp of this attachment.
bool mContentDefined;
};
......
......@@ -535,7 +535,7 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
RenderTargetVk *colorReadRT = framebufferVk->getColorReadRenderTarget();
const vk::Format &srcFormat = colorReadRT->getImageFormat();
VkImageTiling srcTilingMode = colorReadRT->getImage().getTilingMode();
VkImageTiling srcTilingMode = colorReadRT->getImageForCopy().getTilingMode();
const vk::Format &destFormat = renderer->getFormat(internalFormat.sizedInternalFormat);
VkImageTiling destTilingMode = getTilingMode();
......@@ -551,7 +551,7 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
return copySubImageImplWithTransfer(contextVk, offsetImageIndex, modifiedDestOffset,
destFormat, colorReadRT->getLevelIndex(),
colorReadRT->getLayerIndex(), clippedSourceBox,
&colorReadRT->getImage());
&colorReadRT->getImageForCopy());
}
bool forceCPUPath = ForceCPUPathForCopy(renderer, *mImage);
......@@ -566,10 +566,11 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
const vk::ImageView *copyImageView = nullptr;
ANGLE_TRY(colorReadRT->getAndRetainCopyImageView(contextVk, &copyImageView));
return copySubImageImplWithDraw(
contextVk, offsetImageIndex, modifiedDestOffset, destFormat,
colorReadRT->getLevelIndex(), clippedSourceBox, isViewportFlipY, false, false, false,
&colorReadRT->getImage(), copyImageView, contextVk->getRotationReadFramebuffer());
return copySubImageImplWithDraw(contextVk, offsetImageIndex, modifiedDestOffset, destFormat,
colorReadRT->getLevelIndex(), clippedSourceBox,
isViewportFlipY, false, false, false,
&colorReadRT->getImageForCopy(), copyImageView,
contextVk->getRotationReadFramebuffer());
}
// Do a CPU readback that does the conversion, and then stage the change to the pixel buffer.
......@@ -1752,7 +1753,9 @@ angle::Result TextureVk::initRenderTargets(ContextVk *contextVk,
// Lazy init. Check if already initialized.
if (!mRenderTargets[levelIndex].empty())
{
return angle::Result::Continue;
}
mRenderTargets[levelIndex].resize(layerCount);
......
......@@ -1507,7 +1507,7 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
RenderTargetVk *depthStencilRenderTarget = framebuffer->getDepthStencilRenderTarget();
ASSERT(depthStencilRenderTarget != nullptr);
vk::ImageHelper *depthStencilImage = &depthStencilRenderTarget->getImage();
vk::ImageHelper *depthStencilImage = &depthStencilRenderTarget->getImageForWrite();
vk::CommandBuffer *commandBuffer;
// Change source layout prior to computation.
......
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