From 88c6520b515f654f15b603dd33aae29963438309 Mon Sep 17 00:00:00 2001 From: Karol Suprynowicz Date: Mon, 6 Jan 2025 21:04:58 +0100 Subject: [PATCH] Fix bloom in Vulkan --- libraries/gpu-vk/src/gpu/vk/VKBackend.cpp | 16 ++++++++++++---- .../gpu/DrawTexcoordRectTransformUnitQuad.slv | 11 ++--------- libraries/gpu/src/gpu/DrawTransformUnitQuad.slv | 13 ++++--------- .../gpu/DrawViewportQuadTransformTexcoord.slv | 10 +--------- .../render-utils/src/ssao_bilateralBlur.slv | 9 --------- 5 files changed, 19 insertions(+), 40 deletions(-) diff --git a/libraries/gpu-vk/src/gpu/vk/VKBackend.cpp b/libraries/gpu-vk/src/gpu/vk/VKBackend.cpp index 8122c8a7143..d1f0b173eca 100644 --- a/libraries/gpu-vk/src/gpu/vk/VKBackend.cpp +++ b/libraries/gpu-vk/src/gpu/vk/VKBackend.cpp @@ -2737,6 +2737,7 @@ void VKBackend::do_clearFramebuffer(const Batch& batch, size_t paramOffset) { || ((masks & Framebuffer::BUFFER_DEPTH) && !formatHasStencil(attachment.format))) { attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; attachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + //Q_ASSERT(attachmentTexture->_vkImageLayout != VK_IMAGE_LAYOUT_GENERAL); // attachmentTexture->_vkImageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; } else { @@ -2764,6 +2765,7 @@ void VKBackend::do_clearFramebuffer(const Batch& batch, size_t paramOffset) { attachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // Texture state needs to be updated if (attachmentTexture) { + Q_ASSERT(attachmentTexture->_vkImageLayout != VK_IMAGE_LAYOUT_GENERAL); attachmentTexture->_vkImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; //Q_ASSERT(attachmentTexture->_gpuObject.isColorRenderTarget()); // isColorRenderTarget is broken } @@ -2842,6 +2844,7 @@ void VKBackend::do_clearFramebuffer(const Batch& batch, size_t paramOffset) { VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VKTODO: should be VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VKTODO VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, mipSubRange); // VKTODO: what stage mask for depth stencil? + Q_ASSERT(attachmentTexture->_vkImageLayout != VK_IMAGE_LAYOUT_GENERAL); attachmentTexture->_vkImageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; } else { VkImageSubresourceRange mipSubRange = {}; @@ -2852,7 +2855,7 @@ void VKBackend::do_clearFramebuffer(const Batch& batch, size_t paramOffset) { vks::tools::insertImageMemoryBarrier(_currentCommandBuffer, attachmentTexture->_vkImage, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VKTODO: should be VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VKTODO VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, mipSubRange); @@ -2881,14 +2884,19 @@ void VKBackend::do_clearFramebuffer(const Batch& batch, size_t paramOffset) { mipSubRange.baseMipLevel = 0; mipSubRange.levelCount = 1; mipSubRange.layerCount = 1; + VkImageLayout layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + if (attachmentTexture->_vkImageLayout == VK_IMAGE_LAYOUT_GENERAL) { + layout = VK_IMAGE_LAYOUT_GENERAL; + } vks::tools::insertImageMemoryBarrier(_currentCommandBuffer, attachmentTexture->_vkImage, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VKTODO: should be + layout, + layout, // VKTODO: should be VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VKTODO VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, mipSubRange); // VKTODO: what stage mask for depth stencil? - attachmentTexture->_vkImageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + + attachmentTexture->_vkImageLayout = layout; } /*VKuint glmask = 0; diff --git a/libraries/gpu/src/gpu/DrawTexcoordRectTransformUnitQuad.slv b/libraries/gpu/src/gpu/DrawTexcoordRectTransformUnitQuad.slv index ba0eed1a22a..9295b4185d9 100755 --- a/libraries/gpu/src/gpu/DrawTexcoordRectTransformUnitQuad.slv +++ b/libraries/gpu/src/gpu/DrawTexcoordRectTransformUnitQuad.slv @@ -32,21 +32,13 @@ UNIFORM_BUFFER(0, texcoordRectBuffer) { OUTPUT(0, vec2, varTexCoord0); void main(void) { -#ifdef VULKAN - const vec4 UNIT_QUAD[4] = vec4[4]( - vec4(-1.0, 1.0, 0.0, 1.0), - vec4(1.0, 1.0, 0.0, 1.0), - vec4(-1.0, -1.0, 0.0, 1.0), - vec4(1.0, -1.0, 0.0, 1.0) - ); -#else + const vec4 UNIT_QUAD[4] = vec4[4]( vec4(-1.0, -1.0, 0.0, 1.0), vec4(1.0, -1.0, 0.0, 1.0), vec4(-1.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0) ); -#endif vec4 pos = UNIT_QUAD[gl_VertexID]; // standard transform @@ -54,5 +46,6 @@ void main(void) { TransformObject obj = getTransformObject(); <$transformModelToClipPos(cam, obj, pos, gl_Position)$> + // VKTODO: texture coordinates might need to be inverted varTexCoord0 = ((pos.xy + 1.0) * 0.5) * params.texcoordRect.zw + params.texcoordRect.xy; } diff --git a/libraries/gpu/src/gpu/DrawTransformUnitQuad.slv b/libraries/gpu/src/gpu/DrawTransformUnitQuad.slv index 2f23299610c..eb0da722b0b 100755 --- a/libraries/gpu/src/gpu/DrawTransformUnitQuad.slv +++ b/libraries/gpu/src/gpu/DrawTransformUnitQuad.slv @@ -21,21 +21,12 @@ OUTPUT(0, vec2, varTexCoord0); void main(void) { -#ifdef VULKAN - const vec4 UNIT_QUAD[4] = vec4[4]( - vec4(-1.0, 1.0, 0.0, 1.0), - vec4(1.0, 1.0, 0.0, 1.0), - vec4(-1.0, -1.0, 0.0, 1.0), - vec4(1.0, -1.0, 0.0, 1.0) - ); -#else const vec4 UNIT_QUAD[4] = vec4[4]( vec4(-1.0, -1.0, 0.0, 1.0), vec4(1.0, -1.0, 0.0, 1.0), vec4(-1.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0) ); -#endif vec4 pos = UNIT_QUAD[gl_VertexID]; // standard transform @@ -43,5 +34,9 @@ void main(void) { TransformObject obj = getTransformObject(); <$transformModelToClipPos(cam, obj, pos, gl_Position)$> +#ifdef VULKAN + varTexCoord0 = vec2((pos.x + 1.0) * 0.5, (-pos.y + 1.0) * 0.5); +#else varTexCoord0 = (pos.xy + 1.0) * 0.5; +#endif } diff --git a/libraries/gpu/src/gpu/DrawViewportQuadTransformTexcoord.slv b/libraries/gpu/src/gpu/DrawViewportQuadTransformTexcoord.slv index 544ce6e75a6..fbeaaffcc85 100755 --- a/libraries/gpu/src/gpu/DrawViewportQuadTransformTexcoord.slv +++ b/libraries/gpu/src/gpu/DrawViewportQuadTransformTexcoord.slv @@ -21,21 +21,13 @@ OUTPUT(0, vec2, varTexCoord0); void main(void) { -#ifdef VULKAN - const vec4 UNIT_QUAD[4] = vec4[4]( - vec4(-1.0, 1.0, 0.0, 1.0), - vec4(1.0, 1.0, 0.0, 1.0), - vec4(-1.0, -1.0, 0.0, 1.0), - vec4(1.0, -1.0, 0.0, 1.0) - ); -#else + const vec4 UNIT_QUAD[4] = vec4[4]( vec4(-1.0, -1.0, 0.0, 1.0), vec4(1.0, -1.0, 0.0, 1.0), vec4(-1.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0) ); -#endif vec4 pos = UNIT_QUAD[gl_VertexID]; // standard transform but applied to the Texcoord diff --git a/libraries/render-utils/src/ssao_bilateralBlur.slv b/libraries/render-utils/src/ssao_bilateralBlur.slv index 67cd9f360ad..d45fdf83601 100644 --- a/libraries/render-utils/src/ssao_bilateralBlur.slv +++ b/libraries/render-utils/src/ssao_bilateralBlur.slv @@ -21,21 +21,12 @@ layout(location=0) out vec4 varTexCoord0; void main(void) { -#ifdef VULKAN - const vec4 UNIT_QUAD[4] = vec4[4]( - vec4(-1.0, 1.0, 0.0, 1.0), - vec4(1.0, 1.0, 0.0, 1.0), - vec4(-1.0, -1.0, 0.0, 1.0), - vec4(1.0, -1.0, 0.0, 1.0) - ); -#else const vec4 UNIT_QUAD[4] = vec4[4]( vec4(-1.0, -1.0, 0.0, 1.0), vec4(1.0, -1.0, 0.0, 1.0), vec4(-1.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0) ); -#endif vec4 pos = UNIT_QUAD[gl_VertexID]; // standard transform but applied to the Texcoord