Commit c68e7cbc by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Fix image copy flipping

The draw framebuffer was consulted for flipping instead of the read framebuffer. Revealed a bug with copy-with-transfer not taking source render target's level/layer into account. This test was failing on Linux/Intel because there the framebuffer is not flipped, so the transfer path was taken. Bug: angleproject:2954 Bug: angleproject:3723 Change-Id: If95bf97b8e0536302ed39999be47bf904283c9e4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1718784 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarMohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent bbffb779
...@@ -339,9 +339,9 @@ angle::Result TextureVk::copyCompressedTexture(const gl::Context *context, ...@@ -339,9 +339,9 @@ angle::Result TextureVk::copyCompressedTexture(const gl::Context *context,
ANGLE_TRY(sourceVk->ensureImageInitialized(contextVk)); ANGLE_TRY(sourceVk->ensureImageInitialized(contextVk));
return copySubImageImplWithTransfer(contextVk, destIndex, gl::Offset(0, 0, 0), vkFormat, return copySubImageImplWithTransfer(
sourceLevel, gl::Rectangle(0, 0, size.width, size.height), contextVk, destIndex, gl::Offset(0, 0, 0), vkFormat, sourceLevel, 0,
&sourceVk->getImage()); gl::Rectangle(0, 0, size.width, size.height), &sourceVk->getImage());
} }
angle::Result TextureVk::copySubImageImpl(const gl::Context *context, angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
...@@ -376,13 +376,14 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context, ...@@ -376,13 +376,14 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
const vk::Format &srcFormat = colorReadRT->getImageFormat(); const vk::Format &srcFormat = colorReadRT->getImageFormat();
const vk::Format &destFormat = renderer->getFormat(internalFormat.sizedInternalFormat); const vk::Format &destFormat = renderer->getFormat(internalFormat.sizedInternalFormat);
bool isViewportFlipY = contextVk->isViewportFlipEnabledForDrawFBO(); bool isViewportFlipY = contextVk->isViewportFlipEnabledForReadFBO();
// If it's possible to perform the copy with a transfer, that's the best option. // If it's possible to perform the copy with a transfer, that's the best option.
if (!isViewportFlipY && CanCopyWithTransfer(renderer, srcFormat, destFormat)) if (!isViewportFlipY && CanCopyWithTransfer(renderer, srcFormat, destFormat))
{ {
return copySubImageImplWithTransfer(contextVk, offsetImageIndex, modifiedDestOffset, return copySubImageImplWithTransfer(contextVk, offsetImageIndex, modifiedDestOffset,
destFormat, 0, clippedSourceArea, destFormat, colorReadRT->getLevelIndex(),
colorReadRT->getLayerIndex(), clippedSourceArea,
&colorReadRT->getImage()); &colorReadRT->getImage());
} }
...@@ -435,7 +436,7 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk, ...@@ -435,7 +436,7 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk,
CanCopyWithTransfer(renderer, sourceVkFormat, destVkFormat)) CanCopyWithTransfer(renderer, sourceVkFormat, destVkFormat))
{ {
return copySubImageImplWithTransfer(contextVk, offsetImageIndex, destOffset, destVkFormat, return copySubImageImplWithTransfer(contextVk, offsetImageIndex, destOffset, destVkFormat,
sourceLevel, sourceArea, &source->getImage()); sourceLevel, 0, sourceArea, &source->getImage());
} }
bool forceCpuPath = ForceCpuPathForCopy(renderer, mImage); bool forceCpuPath = ForceCpuPathForCopy(renderer, mImage);
...@@ -504,6 +505,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -504,6 +505,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
const gl::Offset &destOffset, const gl::Offset &destOffset,
const vk::Format &destFormat, const vk::Format &destFormat,
size_t sourceLevel, size_t sourceLevel,
size_t sourceLayer,
const gl::Rectangle &sourceArea, const gl::Rectangle &sourceArea,
vk::ImageHelper *srcImage) vk::ImageHelper *srcImage)
{ {
...@@ -527,7 +529,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -527,7 +529,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
VkImageSubresourceLayers srcSubresource = {}; VkImageSubresourceLayers srcSubresource = {};
srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
srcSubresource.mipLevel = sourceLevel; srcSubresource.mipLevel = sourceLevel;
srcSubresource.baseArrayLayer = 0; srcSubresource.baseArrayLayer = sourceLayer;
srcSubresource.layerCount = layerCount; srcSubresource.layerCount = layerCount;
// If destination is valid, copy the source directly into it. // If destination is valid, copy the source directly into it.
...@@ -576,6 +578,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, ...@@ -576,6 +578,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk,
VkImageSubresourceLayers destSubresource = srcSubresource; VkImageSubresourceLayers destSubresource = srcSubresource;
destSubresource.mipLevel = 0; destSubresource.mipLevel = 0;
destSubresource.baseArrayLayer = 0;
vk::ImageHelper::Copy(srcImage, stagingImage.get(), srcOffset, gl::Offset(), extents, vk::ImageHelper::Copy(srcImage, stagingImage.get(), srcOffset, gl::Offset(), extents,
srcSubresource, destSubresource, commandBuffer); srcSubresource, destSubresource, commandBuffer);
......
...@@ -250,6 +250,7 @@ class TextureVk : public TextureImpl ...@@ -250,6 +250,7 @@ class TextureVk : public TextureImpl
const gl::Offset &destOffset, const gl::Offset &destOffset,
const vk::Format &destFormat, const vk::Format &destFormat,
size_t sourceLevel, size_t sourceLevel,
size_t sourceLayer,
const gl::Rectangle &sourceArea, const gl::Rectangle &sourceArea,
vk::ImageHelper *srcImage); vk::ImageHelper *srcImage);
......
...@@ -371,9 +371,6 @@ TEST_P(CopyTexImageTest, SubDefaultFramebuffer) ...@@ -371,9 +371,6 @@ TEST_P(CopyTexImageTest, SubDefaultFramebuffer)
// Calling CopyTexSubImage from cubeMap texture. // Calling CopyTexSubImage from cubeMap texture.
TEST_P(CopyTexImageTest, CopyTexSubImageFromCubeMap) TEST_P(CopyTexImageTest, CopyTexSubImageFromCubeMap)
{ {
// TODO: Diagnose and fix. http://anglebug.com/2954
ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel());
constexpr GLsizei kCubeMapFaceCount = 6; constexpr GLsizei kCubeMapFaceCount = 6;
// The framebuffer will be a face of a cube map with a different colors for each face. Each // The framebuffer will be a face of a cube map with a different colors for each face. Each
......
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