Commit 6854940d by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Correct RenderTargetVk extents to image mip

RenderTargetVk::getImageExtents() was always returning the base level extents of the image it was viewing. This resulted in incorrect extents being provided to various framebuffer- and renderpass-related declarations. The function is renamed to `getExtents()` and returns the appropriate mip extents. Bug: angleproject:2361 Change-Id: I059a8d19fcb140c9095107d935aa3e5cb1852fc2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1537327 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent e18ff25d
...@@ -45,7 +45,7 @@ bool ClipToRenderTarget(const gl::Rectangle &area, ...@@ -45,7 +45,7 @@ bool ClipToRenderTarget(const gl::Rectangle &area,
RenderTargetVk *renderTarget, RenderTargetVk *renderTarget,
gl::Rectangle *rectOut) gl::Rectangle *rectOut)
{ {
const gl::Extents &renderTargetExtents = renderTarget->getImageExtents(); const gl::Extents renderTargetExtents = renderTarget->getExtents();
gl::Rectangle renderTargetRect(0, 0, renderTargetExtents.width, renderTargetExtents.height); gl::Rectangle renderTargetRect(0, 0, renderTargetExtents.width, renderTargetExtents.height);
return ClipRectangle(area, renderTargetRect, rectOut); return ClipRectangle(area, renderTargetRect, rectOut);
} }
...@@ -679,7 +679,7 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk, ...@@ -679,7 +679,7 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
vk::ImageHelper *srcImage = readRenderTarget->getImageForRead( vk::ImageHelper *srcImage = readRenderTarget->getImageForRead(
&mFramebuffer, vk::ImageLayout::TransferSrc, commandBuffer); &mFramebuffer, vk::ImageLayout::TransferSrc, commandBuffer);
const gl::Extents sourceFrameBufferExtents = readRenderTarget->getImageExtents(); const gl::Extents sourceFrameBufferExtents = readRenderTarget->getExtents();
gl::Rectangle readRect = readRectIn; gl::Rectangle readRect = readRectIn;
if (flipSource) if (flipSource)
...@@ -699,7 +699,7 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk, ...@@ -699,7 +699,7 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
blit.dstSubresource.baseArrayLayer = 0; blit.dstSubresource.baseArrayLayer = 0;
blit.dstSubresource.layerCount = 1; blit.dstSubresource.layerCount = 1;
const gl::Extents &drawFrameBufferExtents = drawRenderTarget->getImageExtents(); const gl::Extents drawFrameBufferExtents = drawRenderTarget->getExtents();
gl::Rectangle drawRect = drawRectIn; gl::Rectangle drawRect = drawRectIn;
if (flipDest) if (flipDest)
...@@ -858,8 +858,8 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe ...@@ -858,8 +858,8 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
ASSERT(colorRenderTarget); ASSERT(colorRenderTarget);
attachments.push_back(colorRenderTarget->getDrawImageView()->getHandle()); attachments.push_back(colorRenderTarget->getDrawImageView()->getHandle());
ASSERT(attachmentsSize.empty() || attachmentsSize == colorRenderTarget->getImageExtents()); ASSERT(attachmentsSize.empty() || attachmentsSize == colorRenderTarget->getExtents());
attachmentsSize = colorRenderTarget->getImageExtents(); attachmentsSize = colorRenderTarget->getExtents();
} }
RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil(); RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil();
...@@ -868,8 +868,8 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe ...@@ -868,8 +868,8 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
attachments.push_back(depthStencilRenderTarget->getDrawImageView()->getHandle()); attachments.push_back(depthStencilRenderTarget->getDrawImageView()->getHandle());
ASSERT(attachmentsSize.empty() || ASSERT(attachmentsSize.empty() ||
attachmentsSize == depthStencilRenderTarget->getImageExtents()); attachmentsSize == depthStencilRenderTarget->getExtents());
attachmentsSize = depthStencilRenderTarget->getImageExtents(); attachmentsSize = depthStencilRenderTarget->getExtents();
} }
ASSERT(!attachments.empty()); ASSERT(!attachments.empty());
...@@ -1167,9 +1167,9 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk, ...@@ -1167,9 +1167,9 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
return angle::Result::Continue; return angle::Result::Continue;
} }
const gl::Extents &FramebufferVk::getReadImageExtents() const gl::Extents FramebufferVk::getReadImageExtents() const
{ {
return getColorReadRenderTarget()->getImageExtents(); return getColorReadRenderTarget()->getExtents();
} }
RenderTargetVk *FramebufferVk::getFirstRenderTarget() const RenderTargetVk *FramebufferVk::getFirstRenderTarget() const
......
...@@ -100,7 +100,7 @@ class FramebufferVk : public FramebufferImpl ...@@ -100,7 +100,7 @@ class FramebufferVk : public FramebufferImpl
RenderTargetVk *renderTarget, RenderTargetVk *renderTarget,
void *pixels); void *pixels);
const gl::Extents &getReadImageExtents() const; gl::Extents getReadImageExtents() const;
const gl::DrawBufferMask &getEmulatedAlphaAttachmentMask() const; const gl::DrawBufferMask &getEmulatedAlphaAttachmentMask() const;
RenderTargetVk *getColorReadRenderTarget() const; RenderTargetVk *getColorReadRenderTarget() const;
......
...@@ -119,10 +119,10 @@ const vk::Format &RenderTargetVk::getImageFormat() const ...@@ -119,10 +119,10 @@ const vk::Format &RenderTargetVk::getImageFormat() const
return mImage->getFormat(); return mImage->getFormat();
} }
const gl::Extents &RenderTargetVk::getImageExtents() const gl::Extents RenderTargetVk::getExtents() const
{ {
ASSERT(mImage && mImage->valid()); ASSERT(mImage && mImage->valid());
return mImage->getExtents(); return mImage->getLevelExtents2D(mLevelIndex);
} }
void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView) void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView)
......
...@@ -71,7 +71,7 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -71,7 +71,7 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
vk::ImageView *getReadImageView() const; vk::ImageView *getReadImageView() const;
const vk::Format &getImageFormat() const; const vk::Format &getImageFormat() const;
const gl::Extents &getImageExtents() const; gl::Extents getExtents() const;
size_t getLevelIndex() const { return mLevelIndex; } size_t getLevelIndex() const { return mLevelIndex; }
size_t getLayerIndex() const { return mLayerIndex; } size_t getLayerIndex() const { return mLayerIndex; }
......
...@@ -970,12 +970,12 @@ void WindowSurfaceVk::setSwapInterval(EGLint interval) ...@@ -970,12 +970,12 @@ void WindowSurfaceVk::setSwapInterval(EGLint interval)
EGLint WindowSurfaceVk::getWidth() const EGLint WindowSurfaceVk::getWidth() const
{ {
return static_cast<EGLint>(mColorRenderTarget.getImageExtents().width); return static_cast<EGLint>(mColorRenderTarget.getExtents().width);
} }
EGLint WindowSurfaceVk::getHeight() const EGLint WindowSurfaceVk::getHeight() const
{ {
return static_cast<EGLint>(mColorRenderTarget.getImageExtents().height); return static_cast<EGLint>(mColorRenderTarget.getExtents().height);
} }
EGLint WindowSurfaceVk::isPostSubBufferSupported() const EGLint WindowSurfaceVk::isPostSubBufferSupported() const
...@@ -1023,7 +1023,7 @@ angle::Result WindowSurfaceVk::getCurrentFramebuffer(vk::Context *context, ...@@ -1023,7 +1023,7 @@ angle::Result WindowSurfaceVk::getCurrentFramebuffer(vk::Context *context,
VkFramebufferCreateInfo framebufferInfo = {}; VkFramebufferCreateInfo framebufferInfo = {};
const gl::Extents &extents = mColorRenderTarget.getImageExtents(); const gl::Extents extents = mColorRenderTarget.getExtents();
std::array<VkImageView, 2> imageViews = {{VK_NULL_HANDLE, mDepthStencilImageView.getHandle()}}; std::array<VkImageView, 2> imageViews = {{VK_NULL_HANDLE, mDepthStencilImageView.getHandle()}};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
......
...@@ -1546,6 +1546,14 @@ VkImageLayout ImageHelper::getCurrentLayout() const ...@@ -1546,6 +1546,14 @@ VkImageLayout ImageHelper::getCurrentLayout() const
return kImageMemoryBarrierData[mCurrentLayout].layout; return kImageMemoryBarrierData[mCurrentLayout].layout;
} }
gl::Extents ImageHelper::getLevelExtents2D(uint32_t level) const
{
int width = std::max(mExtents.width >> level, 1);
int height = std::max(mExtents.height >> level, 1);
return gl::Extents(width, height, 1);
}
bool ImageHelper::isLayoutChangeNecessary(ImageLayout newLayout) const bool ImageHelper::isLayoutChangeNecessary(ImageLayout newLayout) const
{ {
const ImageMemoryBarrierData &layoutData = kImageMemoryBarrierData[mCurrentLayout]; const ImageMemoryBarrierData &layoutData = kImageMemoryBarrierData[mCurrentLayout];
......
...@@ -610,6 +610,10 @@ class ImageHelper final : public CommandGraphResource ...@@ -610,6 +610,10 @@ class ImageHelper final : public CommandGraphResource
VkImageLayout getCurrentLayout() const; VkImageLayout getCurrentLayout() const;
// Helper function to calculate the extents of a render target created for a certain mip of the
// image.
gl::Extents getLevelExtents2D(uint32_t level) const;
void clearColor(const VkClearColorValue &color, void clearColor(const VkClearColorValue &color,
uint32_t baseMipLevel, uint32_t baseMipLevel,
uint32_t levelCount, uint32_t levelCount,
......
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