Commit 49211c31 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Fix Overlay for prerotation

Bug: angleproject:5690 Change-Id: I906a259767c54e3ac9f3ac822b6d5ed5dcaa0bd5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2725768 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarIan Elliott <ianelliott@google.com>
parent 90db6049
......@@ -276,9 +276,9 @@
"src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc":
"83626be8291a8a4364076cf82e714507",
"src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000000.inc":
"4ea9b8189c0c40408ec99d0720786ba9",
"c90e21e33a7daf11c63827936ced29ef",
"src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000001.inc":
"93ac001b7536d17fe7a1b2ccee195ee7",
"b4dec496fa2f6ab0c07806f80a33cf8f",
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag":
"0b16d3ad95d7dbc2ce7175462152e4f9",
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag.json":
......@@ -322,7 +322,7 @@
"src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json":
"e5fd5bb63707753601e197635316430e",
"src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp":
"1b748944a5b8d37317b7d0e6a6ad5795",
"ff28c3ff9b8c0f990afe5407b18c7baa",
"src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json":
"af79e5153c99cdb1e6b551b11bbf7f6b",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
......
......@@ -22,7 +22,8 @@ OverlayVk::OverlayVk(const gl::OverlayState &state)
: OverlayImpl(state),
mSupportsSubgroupBallot(false),
mSupportsSubgroupArithmetic(false),
mRefreshCulledWidgets(false)
mRefreshCulledWidgets(false),
mPresentImageExtent{}
{}
OverlayVk::~OverlayVk() = default;
......@@ -206,7 +207,8 @@ angle::Result OverlayVk::cullWidgets(ContextVk *contextVk)
angle::Result OverlayVk::onPresent(ContextVk *contextVk,
vk::ImageHelper *imageToPresent,
const vk::ImageView *imageToPresentView)
const vk::ImageView *imageToPresentView,
bool is90DegreeRotation)
{
if (mState.getEnabledWidgetCount() == 0)
{
......@@ -272,6 +274,7 @@ angle::Result OverlayVk::onPresent(ContextVk *contextVk,
UtilsVk::OverlayDrawParameters params;
params.subgroupSize[0] = mSubgroupSize[0];
params.subgroupSize[1] = mSubgroupSize[1];
params.rotateXY = is90DegreeRotation;
return contextVk->getUtils().drawOverlay(
contextVk, &textDataBuffer.get(), &graphDataBuffer.get(), &mFontImage, &mFontImageView,
......
......@@ -30,7 +30,8 @@ class OverlayVk : public OverlayImpl
angle::Result onPresent(ContextVk *contextVk,
vk::ImageHelper *imageToPresent,
const vk::ImageView *imageToPresentView);
const vk::ImageView *imageToPresentView,
bool is90DegreeRotation);
uint32_t getEnabledWidgetCount() const { return mState.getEnabledWidgetCount(); }
......
......@@ -1897,7 +1897,8 @@ angle::Result WindowSurfaceVk::drawOverlay(ContextVk *contextVk, SwapchainImage
const vk::ImageView *imageView = nullptr;
ANGLE_TRY(image->imageViews.getLevelLayerDrawImageView(contextVk, image->image,
vk::LevelIndex(0), 0, &imageView));
ANGLE_TRY(overlayVk->onPresent(contextVk, &image->image, imageView));
ANGLE_TRY(overlayVk->onPresent(contextVk, &image->image, imageView,
Is90DegreeRotation(getPreTransform())));
return angle::Result::Continue;
}
......
......@@ -235,7 +235,7 @@ class WindowSurfaceVk : public SurfaceVk
vk::Semaphore getAcquireImageSemaphore();
VkSurfaceTransformFlagBitsKHR getPreTransform()
VkSurfaceTransformFlagBitsKHR getPreTransform() const
{
if (mEmulatedPreTransform != VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)
{
......
......@@ -2842,6 +2842,7 @@ angle::Result UtilsVk::cullOverlayWidgets(ContextVk *contextVk,
ANGLE_TRY(setupProgram(contextVk, Function::OverlayCull, shader, nullptr,
&mOverlayCullPrograms[flags], nullptr, descriptorSet, nullptr, 0,
commandBuffer));
commandBuffer->dispatch(dest->getExtents().width, dest->getExtents().height, 1);
descriptorPoolBinding.reset();
......@@ -2864,6 +2865,7 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk,
OverlayDrawShaderParams shaderParams;
shaderParams.outputSize[0] = dest->getExtents().width;
shaderParams.outputSize[1] = dest->getExtents().height;
shaderParams.rotateXY = params.rotateXY;
ASSERT(params.subgroupSize[0] == 8 &&
(params.subgroupSize[1] == 8 || params.subgroupSize[1] == 4));
......
......@@ -162,6 +162,7 @@ class UtilsVk : angle::NonCopyable
struct OverlayDrawParameters
{
uint32_t subgroupSize[2];
bool rotateXY;
};
struct GenerateMipmapParameters
......@@ -411,6 +412,7 @@ class UtilsVk : angle::NonCopyable
{
// Structure matching PushConstants in OverlayDraw.comp
uint32_t outputSize[2] = {};
uint32_t rotateXY;
};
struct GenerateMipmapShaderParams
......
......@@ -69,6 +69,8 @@ layout(set = 0, binding = 4) uniform texture2DArray font;
layout (push_constant) uniform PushConstants
{
uvec2 outputSize;
// Prerotation support
bool rotateXY;
} params;
bool intersects(const uvec2 imageCoords, const uvec4 widgetCoords)
......@@ -168,7 +170,7 @@ vec4 blend(const vec4 blendedSoFar, const vec4 color)
void main()
{
const uvec2 imageCoords = gl_GlobalInvocationID.xy;
uvec2 imageCoords = gl_GlobalInvocationID.xy;
if (any(greaterThanEqual(imageCoords, params.outputSize)))
{
return;
......@@ -257,6 +259,14 @@ void main()
if (blendedWidgets.a < 1)
{
// Account for pre-rotation
if (params.rotateXY)
{
// Rotate by 90 degrees
imageCoords.xy = imageCoords.yx;
imageCoords.x = params.outputSize.y - 1 - imageCoords.x;
}
vec3 blendedColor = blendedWidgets.rgb;
if (blendedWidgets.a > 0)
{
......@@ -266,6 +276,7 @@ void main()
// in the alpha channel.
blendedColor += color.rgb * blendedWidgets.a;
}
imageStore(blendOutput, ivec2(imageCoords), vec4(blendedColor, 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