From 2629c92a0026e0a95e7b1aba5a0521e6d413bf97 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 5 Feb 2022 00:35:59 +1000 Subject: [PATCH] GS/Vulkan: Fix HDR resolve to cleared target Fixes shadows in LOTR: Third Age. --- pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp | 31 ++++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp index d2dbb84c33..640d3c7de4 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp +++ b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp @@ -2863,11 +2863,32 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) EndRenderPass(); hdr_rt->TransitionToLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - OMSetRenderTargets(config.rt, draw_ds, config.scissor, pipe.feedback_loop); - BeginRenderPass( - GetTFXRenderPass(pipe.rt, pipe.ds, false, DATE_RENDER_PASS_NONE, pipe.feedback_loop, VK_ATTACHMENT_LOAD_OP_DONT_CARE, - pipe.ds ? VK_ATTACHMENT_LOAD_OP_LOAD : VK_ATTACHMENT_LOAD_OP_DONT_CARE), - render_area); + draw_rt = static_cast(config.rt); + OMSetRenderTargets(draw_rt, draw_ds, config.scissor, pipe.feedback_loop); + + // if this target was cleared and never drawn to, perform the clear as part of the resolve here. + if (draw_rt->GetState() == GSTexture::State::Cleared) + { + alignas(16) VkClearValue cvs[2]; + u32 cv_count = 0; + GSVector4::store(&cvs[cv_count++].color, draw_rt->GetClearColor()); + if (draw_ds) + cvs[cv_count++].depthStencil = {draw_ds->GetClearDepth(), 1}; + + BeginClearRenderPass( + GetTFXRenderPass(true, pipe.ds, false, DATE_RENDER_PASS_NONE, pipe.feedback_loop, VK_ATTACHMENT_LOAD_OP_CLEAR, + pipe.ds ? VK_ATTACHMENT_LOAD_OP_LOAD : VK_ATTACHMENT_LOAD_OP_DONT_CARE), + GSVector4i(0, 0, draw_rt->GetWidth(), draw_rt->GetHeight()), + cvs, cv_count); + draw_rt->SetState(GSTexture::State::Dirty); + } + else + { + BeginRenderPass( + GetTFXRenderPass(true, pipe.ds, false, DATE_RENDER_PASS_NONE, pipe.feedback_loop, VK_ATTACHMENT_LOAD_OP_DONT_CARE, + pipe.ds ? VK_ATTACHMENT_LOAD_OP_LOAD : VK_ATTACHMENT_LOAD_OP_DONT_CARE), + render_area); + } const GSVector4 sRect(GSVector4(render_area) / GSVector4(rtsize.x, rtsize.y).xyxy()); SetPipeline(m_hdr_finish_pipelines[pipe.ds][pipe.feedback_loop]);