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