Commit da3e6451 by Ian Elliott Committed by Commit Bot

Vulkan: Fix fbo_invalidate tests for pre-rotation

The BlitFramebuffer path wasn't properly supporting stencil and MSAA paths for pre-rotation: 1) The stencil path on Android isn't going through UtilsVk::blitResolveImpl, but requires changing UtilsVk::stencilBlitResolveNoShaderExport for rotation. 2) MSAA resolves requires rotating clippedSourceArea. Test: angle_deqp_gles3_tests --gtest_filter=dEQP.GLES3/functional_fbo_invalidate_\* Bug: b/158337857 Change-Id: I092cab302c247ff9b2e262b12de3d1a56a257f8e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2269499 Commit-Queue: Ian Elliott <ianelliott@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com>
parent d4874cb3
...@@ -50,13 +50,13 @@ ...@@ -50,13 +50,13 @@
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000017.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000017.inc":
"b1f8eeae6d43c6270ec9733045f28409", "b1f8eeae6d43c6270ec9733045f28409",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000000.inc":
"4b02664d4a0cd3ac463f88c69f2a7ede", "641198afcc60eeaafb20cf46034cda43",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000001.inc":
"08516850eeb3b660fe7305d688c09ada", "47cf2bcb705cbafd13992c65b75d97de",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000002.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000002.inc":
"109b59847ca22179c0b0dc6d9125327b", "accf3f9f9da6376039cf80e6e8e7cee6",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000003.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000003.inc":
"0187be6a493b8db2c5f82c36597ea3bd", "056c8ff270ac0bd1f600ec89777cb341",
"src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc":
"8338c6fdde47f6a7ee8423690691e868", "8338c6fdde47f6a7ee8423690691e868",
"src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc":
...@@ -238,7 +238,7 @@ ...@@ -238,7 +238,7 @@
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag.json": "src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag.json":
"353929c45304fe9c327b50a53c5f1918", "353929c45304fe9c327b50a53c5f1918",
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp": "src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp":
"3080e264f932ce3a219bb63c79b86636", "e4b03e5d1d1b0c0336453e98675bbb40",
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp.json": "src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp.json":
"8a3e9ff34eba0386edb98048547a272b", "8a3e9ff34eba0386edb98048547a272b",
"src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp": "src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp":
......
...@@ -776,8 +776,10 @@ angle::Result FramebufferVk::blit(const gl::Context *context, ...@@ -776,8 +776,10 @@ angle::Result FramebufferVk::blit(const gl::Context *context,
gl::Rectangle srcClippedDestArea; gl::Rectangle srcClippedDestArea;
if (isResolve) if (isResolve)
{ {
// Source and dest areas are identical in resolve. // Source and dest areas are identical in resolve (except rotate it, if appropriate).
srcClippedDestArea = clippedSourceArea; srcClippedDestArea = clippedSourceArea;
AdjustBlitAreaForPreRotation(destFramebufferRotation, clippedSourceArea,
destFramebufferDimensions, &srcClippedDestArea);
} }
else if (clippedSourceArea == absSourceArea) else if (clippedSourceArea == absSourceArea)
{ {
......
...@@ -1537,6 +1537,8 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk, ...@@ -1537,6 +1537,8 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
blitBuffer.get().retain(&contextVk->getResourceUseList()); blitBuffer.get().retain(&contextVk->getResourceUseList());
BlitResolveStencilNoExportShaderParams shaderParams; BlitResolveStencilNoExportShaderParams shaderParams;
// Note: adjustments made for pre-rotatation in FramebufferVk::blit() affect these
// Calculate*Offset() functions.
if (isResolve) if (isResolve)
{ {
CalculateResolveOffset(params, shaderParams.offset.resolve); CalculateResolveOffset(params, shaderParams.offset.resolve);
...@@ -1558,6 +1560,46 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk, ...@@ -1558,6 +1560,46 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
shaderParams.blitArea[3] = params.blitArea.height; shaderParams.blitArea[3] = params.blitArea.height;
shaderParams.flipX = params.flipX; shaderParams.flipX = params.flipX;
shaderParams.flipY = params.flipY; shaderParams.flipY = params.flipY;
shaderParams.rotateXY = 0;
// Potentially make adjustments for pre-rotatation. Depending on the angle some of the
// shaderParams need to be adjusted.
switch (params.rotation)
{
case SurfaceRotation::Identity:
break;
case SurfaceRotation::Rotated90Degrees:
shaderParams.rotateXY = 1;
break;
case SurfaceRotation::Rotated180Degrees:
if (isResolve)
{
shaderParams.offset.resolve[0] += params.rotatedOffsetFactor[0];
shaderParams.offset.resolve[1] += params.rotatedOffsetFactor[1];
}
else
{
shaderParams.offset.blit[0] += params.rotatedOffsetFactor[0];
shaderParams.offset.blit[1] += params.rotatedOffsetFactor[1];
}
break;
case SurfaceRotation::Rotated270Degrees:
if (isResolve)
{
shaderParams.offset.resolve[0] += params.rotatedOffsetFactor[0];
shaderParams.offset.resolve[1] += params.rotatedOffsetFactor[1];
}
else
{
shaderParams.offset.blit[0] += params.rotatedOffsetFactor[0];
shaderParams.offset.blit[1] += params.rotatedOffsetFactor[1];
}
shaderParams.rotateXY = 1;
break;
default:
UNREACHABLE();
break;
}
// Linear sampling is only valid with color blitting. // Linear sampling is only valid with color blitting.
ASSERT(!params.linear); ASSERT(!params.linear);
...@@ -1651,6 +1693,12 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk, ...@@ -1651,6 +1693,12 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
region.imageExtent.width = params.blitArea.width; region.imageExtent.width = params.blitArea.width;
region.imageExtent.height = params.blitArea.height; region.imageExtent.height = params.blitArea.height;
region.imageExtent.depth = 1; region.imageExtent.depth = 1;
if ((params.rotation == SurfaceRotation::Rotated270Degrees) && (params.blitArea.width > 32))
{
// TODO(ianelliott): Figure out why this adjustment is needed
// https://issuetracker.google.com/issues/159995959
region.imageOffset.x += 2;
}
commandBuffer->copyBufferToImage(blitBuffer.get().getBuffer().getHandle(), commandBuffer->copyBufferToImage(blitBuffer.get().getBuffer().getHandle(),
depthStencilImage->getImage(), depthStencilImage->getImage(),
......
...@@ -365,6 +365,7 @@ class UtilsVk : angle::NonCopyable ...@@ -365,6 +365,7 @@ class UtilsVk : angle::NonCopyable
int32_t destPitch = 0; int32_t destPitch = 0;
uint32_t flipX = 0; uint32_t flipX = 0;
uint32_t flipY = 0; uint32_t flipY = 0;
uint32_t rotateXY = 0;
}; };
struct OverlayDrawShaderParams struct OverlayDrawShaderParams
......
...@@ -54,6 +54,7 @@ layout(push_constant) uniform PushConstants { ...@@ -54,6 +54,7 @@ layout(push_constant) uniform PushConstants {
// Flip control. // Flip control.
bool flipX; bool flipX;
bool flipY; bool flipY;
bool rotateXY;
} params; } params;
layout (set = 0, binding = 0) buffer dest layout (set = 0, binding = 0) buffer dest
...@@ -98,6 +99,8 @@ void main() ...@@ -98,6 +99,8 @@ void main()
srcImageCoords.x = -srcImageCoords.x; srcImageCoords.x = -srcImageCoords.x;
if (params.flipY) if (params.flipY)
srcImageCoords.y = -srcImageCoords.y; srcImageCoords.y = -srcImageCoords.y;
if (params.rotateXY)
srcImageCoords.xy = srcImageCoords.yx;
int xDir = params.flipX ? -1 : 1; int xDir = params.flipX ? -1 : 1;
......
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