Vulkan: Bugfix in MSRTT and sRGB interaction When updating color attachment colorspace make sure to update the colorspace of the resolve attachment as well Bug: angleproject:42264452 Tests: MSRTTSRGBES3Test.Basic* Change-Id: I300da7414c3baadc94ab25907c6f394383dcf673 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7542410 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: mohan maiya <m.maiya@samsung.com> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
diff --git a/src/libANGLE/renderer/vulkan/RenderTargetVk.h b/src/libANGLE/renderer/vulkan/RenderTargetVk.h index 925b7d0..18c20c8 100644 --- a/src/libANGLE/renderer/vulkan/RenderTargetVk.h +++ b/src/libANGLE/renderer/vulkan/RenderTargetVk.h
@@ -189,6 +189,11 @@ { ASSERT(mImage && mImage->valid() && mImageViews); mImageViews->updateSrgbWriteControlMode(*mImage, srgbWriteControlMode); + if (hasResolveAttachment() && !isYuvResolve()) + { + ASSERT(mResolveImage && mResolveImage->valid() && mResolveImageViews); + mResolveImageViews->updateSrgbWriteControlMode(*mResolveImage, srgbWriteControlMode); + } } bool hasColorspaceOverrideForRead() const {
diff --git a/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp b/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp index 29aca9d..86ed434 100644 --- a/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp +++ b/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp
@@ -4498,6 +4498,49 @@ ASSERT_GL_NO_ERROR(); } +class MSRTTSRGBES3Test : public MSRTTES3Test +{}; + +// Test interaction between MSRTT and sRGB write control +TEST_P(MSRTTSRGBES3Test, Basic) +{ + ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); + ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB_write_control")); + + GLTexture texture; + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, + nullptr); + + GLFramebuffer fboMS; + glBindFramebuffer(GL_FRAMEBUFFER, fboMS); + glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + texture, 0, 4); + + constexpr GLColor uniformColor(13, 54, 133, 255); + constexpr GLColor linearColor = uniformColor; + constexpr GLColor srgbColor(64, 127, 191, 255); + + // Setup program and uniforms + ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); + glUseProgram(program); + GLint colorLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform()); + ASSERT_NE(-1, colorLocation); + glUniform4fv(colorLocation, 1, uniformColor.toNormalizedVector().data()); + + // Enable sRGB encoding and render + glEnable(GL_FRAMEBUFFER_SRGB_EXT); + drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_NEAR(0, 0, srgbColor, 1.0); + + // Disable sRGB encoding and render + glDisable(GL_FRAMEBUFFER_SRGB_EXT); + drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_NEAR(0, 0, linearColor, 1.0); +} + class MultisampledRenderToTextureWithAdvancedBlendTest : public MSRTTES3Test { protected: @@ -4645,6 +4688,14 @@ ES3_VULKAN().disable(Feature::SupportsSPIRV14), ES3_VULKAN_SWIFTSHADER().enable(Feature::EnableMultisampledRenderToTexture)); +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MSRTTSRGBES3Test); +ANGLE_INSTANTIATE_TEST_COMBINE_1( + MSRTTSRGBES3Test, + PrintToStringParamName, + testing::Bool(), + ANGLE_ALL_TEST_PLATFORMS_ES3, + ES3_VULKAN().enable(Feature::AllowMultisampledRenderToTextureEmulation)); + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MSRTTES31Test); ANGLE_INSTANTIATE_TEST_COMBINE_1( MSRTTES31Test,