mirror of https://github.com/PCSX2/pcsx2.git
GS/Vulkan: Ensure restarted render passes don't clear
We don't want to wipe out what's done, and we don't know the clear values anyway.
This commit is contained in:
parent
29da1bb9ef
commit
4a29fdb3f2
|
@ -2952,7 +2952,7 @@ void GSDeviceVK::ExecuteCommandBufferAndRestartRenderPass(bool wait_for_completi
|
||||||
OMSetRenderTargets(current_rt, current_ds, scissor, current_feedback_loop);
|
OMSetRenderTargets(current_rt, current_ds, scissor, current_feedback_loop);
|
||||||
|
|
||||||
// restart render pass
|
// restart render pass
|
||||||
BeginRenderPass(render_pass, render_pass_area);
|
BeginRenderPass(g_vulkan_context->GetRenderPassForRestarting(render_pass), render_pass_area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -933,6 +933,35 @@ bool VKContext::CreateTextureStreamBuffer()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkRenderPass VKContext::GetRenderPassForRestarting(VkRenderPass pass)
|
||||||
|
{
|
||||||
|
for (const auto& it : m_render_pass_cache)
|
||||||
|
{
|
||||||
|
if (it.second != pass)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
RenderPassCacheKey modified_key;
|
||||||
|
modified_key.key = it.first;
|
||||||
|
if (modified_key.color_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR)
|
||||||
|
modified_key.color_load_op = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||||
|
if (modified_key.depth_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR)
|
||||||
|
modified_key.depth_load_op = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||||
|
if (modified_key.stencil_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR)
|
||||||
|
modified_key.stencil_load_op = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||||
|
|
||||||
|
if (modified_key.key == it.first)
|
||||||
|
return pass;
|
||||||
|
|
||||||
|
auto fit = m_render_pass_cache.find(modified_key.key);
|
||||||
|
if (fit != m_render_pass_cache.end())
|
||||||
|
return fit->second;
|
||||||
|
|
||||||
|
return CreateCachedRenderPass(modified_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pass;
|
||||||
|
}
|
||||||
|
|
||||||
VkCommandBuffer VKContext::GetCurrentInitCommandBuffer()
|
VkCommandBuffer VKContext::GetCurrentInitCommandBuffer()
|
||||||
{
|
{
|
||||||
FrameResources& res = m_frame_resources[m_current_frame];
|
FrameResources& res = m_frame_resources[m_current_frame];
|
||||||
|
|
|
@ -157,6 +157,9 @@ public:
|
||||||
return CreateCachedRenderPass(key);
|
return CreateCachedRenderPass(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gets a non-clearing version of the specified render pass. Slow, don't call in hot path.
|
||||||
|
VkRenderPass GetRenderPassForRestarting(VkRenderPass pass);
|
||||||
|
|
||||||
// These command buffers are allocated per-frame. They are valid until the command buffer
|
// These command buffers are allocated per-frame. They are valid until the command buffer
|
||||||
// is submitted, after that you should call these functions again.
|
// is submitted, after that you should call these functions again.
|
||||||
__fi u32 GetCurrentCommandBufferIndex() const { return m_current_frame; }
|
__fi u32 GetCurrentCommandBufferIndex() const { return m_current_frame; }
|
||||||
|
|
Loading…
Reference in New Issue