From 7140e821899d0292d733ff68c93cf28a2e77c983 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 6 Oct 2022 19:31:17 +0300 Subject: [PATCH] rsx: Fix program invalidation rules --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 8 ++++++++ rpcs3/Emu/RSX/VK/VKDraw.cpp | 13 ++++++++++++- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 3 +-- rpcs3/Emu/RSX/VK/VKGSRender.h | 1 + 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 9dc5adbb16..60bfc1c1e9 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -622,9 +622,17 @@ void GLGSRender::begin() rsx::thread::begin(); if (skip_current_frame || cond_render_ctrl.disable_rendering()) + { return; + } init_buffers(rsx::framebuffer_creation_context::context_draw); + + if (m_graphics_state & rsx::pipeline_state::invalidate_pipeline_bits) + { + // Shaders need to be reloaded. + m_program = nullptr; + } } void GLGSRender::end() diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index c8193dc213..11b5ed653d 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -896,10 +896,21 @@ void VKGSRender::begin() rsx::thread::begin(); - if (skip_current_frame || swapchain_unavailable || cond_render_ctrl.disable_rendering()) + if (skip_current_frame || + swapchain_unavailable || + cond_render_ctrl.disable_rendering()) + { return; + } init_buffers(rsx::framebuffer_creation_context::context_draw); + + if (m_graphics_state & rsx::pipeline_state::invalidate_pipeline_bits) + { + // Shaders need to be reloaded. + m_prev_program = m_program; + m_program = nullptr; + } } void VKGSRender::end() diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index f6db56b45e..7b493ac0cc 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1731,7 +1731,6 @@ bool VKGSRender::load_program() auto &vertex_program = current_vertex_program; auto &fragment_program = current_fragment_program; - auto old_program = m_program; vk::pipeline_props properties{}; @@ -1929,7 +1928,7 @@ bool VKGSRender::load_program() if (!m_program && (shadermode == shader_mode::async_with_interpreter || shadermode == shader_mode::interpreter_only)) { - if (!m_shader_interpreter.is_interpreter(old_program)) + if (!m_shader_interpreter.is_interpreter(m_prev_program)) { m_interpreter_state = rsx::invalidate_pipeline_bits; } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 8a3fc3e893..383d9f7d79 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -63,6 +63,7 @@ private: const VKFragmentProgram *m_fragment_prog = nullptr; const VKVertexProgram *m_vertex_prog = nullptr; vk::glsl::program *m_program = nullptr; + vk::glsl::program *m_prev_program = nullptr; vk::pipeline_props m_pipeline_properties; vk::texture_cache m_texture_cache;