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 @@
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000017.inc":
"b1f8eeae6d43c6270ec9733045f28409",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000000.inc":
"4b02664d4a0cd3ac463f88c69f2a7ede",
"641198afcc60eeaafb20cf46034cda43",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000001.inc":
"08516850eeb3b660fe7305d688c09ada",
"47cf2bcb705cbafd13992c65b75d97de",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000002.inc":
"109b59847ca22179c0b0dc6d9125327b",
"accf3f9f9da6376039cf80e6e8e7cee6",
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000003.inc":
"0187be6a493b8db2c5f82c36597ea3bd",
"056c8ff270ac0bd1f600ec89777cb341",
"src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc":
"8338c6fdde47f6a7ee8423690691e868",
"src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc":
......@@ -238,7 +238,7 @@
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag.json":
"353929c45304fe9c327b50a53c5f1918",
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp":
"3080e264f932ce3a219bb63c79b86636",
"e4b03e5d1d1b0c0336453e98675bbb40",
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp.json":
"8a3e9ff34eba0386edb98048547a272b",
"src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp":
......
......@@ -776,8 +776,10 @@ angle::Result FramebufferVk::blit(const gl::Context *context,
gl::Rectangle srcClippedDestArea;
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;
AdjustBlitAreaForPreRotation(destFramebufferRotation, clippedSourceArea,
destFramebufferDimensions, &srcClippedDestArea);
}
else if (clippedSourceArea == absSourceArea)
{
......
......@@ -1537,6 +1537,8 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
blitBuffer.get().retain(&contextVk->getResourceUseList());
BlitResolveStencilNoExportShaderParams shaderParams;
// Note: adjustments made for pre-rotatation in FramebufferVk::blit() affect these
// Calculate*Offset() functions.
if (isResolve)
{
CalculateResolveOffset(params, shaderParams.offset.resolve);
......@@ -1558,6 +1560,46 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
shaderParams.blitArea[3] = params.blitArea.height;
shaderParams.flipX = params.flipX;
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.
ASSERT(!params.linear);
......@@ -1651,6 +1693,12 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk,
region.imageExtent.width = params.blitArea.width;
region.imageExtent.height = params.blitArea.height;
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(),
depthStencilImage->getImage(),
......
......@@ -365,6 +365,7 @@ class UtilsVk : angle::NonCopyable
int32_t destPitch = 0;
uint32_t flipX = 0;
uint32_t flipY = 0;
uint32_t rotateXY = 0;
};
struct OverlayDrawShaderParams
......
......@@ -54,6 +54,7 @@ layout(push_constant) uniform PushConstants {
// Flip control.
bool flipX;
bool flipY;
bool rotateXY;
} params;
layout (set = 0, binding = 0) buffer dest
......@@ -98,6 +99,8 @@ void main()
srcImageCoords.x = -srcImageCoords.x;
if (params.flipY)
srcImageCoords.y = -srcImageCoords.y;
if (params.rotateXY)
srcImageCoords.xy = srcImageCoords.yx;
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