From 1592ecdc559912366786fda56275f0ecb44beb82 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 24 Mar 2022 21:31:17 +0300 Subject: [PATCH] rsx: Invalidate transform block on program change - Since each program now does a remap of the outputs, we need to reupload the constants - This is not a loss, constants are almost always changing between draw calls anyway --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 7 ------- rpcs3/Emu/RSX/RSXThread.cpp | 12 ++++++------ rpcs3/Emu/RSX/VK/VKDraw.cpp | 7 ------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index c3fb54c352..1604edc262 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -621,13 +621,6 @@ void GLGSRender::end() if (m_graphics_state & (rsx::pipeline_state::fragment_program_ucode_dirty | rsx::pipeline_state::vertex_program_ucode_dirty)) { - // TODO: Move to shared code - if ((m_graphics_state & rsx::pipeline_state::vertex_program_ucode_dirty) && - m_vertex_prog && !m_vertex_prog->has_indexed_constants) - { - m_graphics_state |= rsx::pipeline_state::transform_constants_dirty; - } - analyse_current_rsx_pipeline(); } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index bc931c887b..bfa0e05ade 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1649,6 +1649,9 @@ namespace rsx m_graphics_state &= ~rsx::pipeline_state::fragment_program_ucode_dirty; + // Request for update of fragment constants if the program block is invalidated + m_graphics_state |= rsx::pipeline_state::fragment_constants_dirty; + const auto [program_offset, program_location] = method_registers.shader_program_address(); const auto prev_textures_reference_mask = current_fp_metadata.referenced_textures_mask; @@ -1693,6 +1696,9 @@ namespace rsx m_graphics_state &= ~rsx::pipeline_state::vertex_program_ucode_dirty; + // Reload transform constants unconditionally for now + m_graphics_state |= rsx::pipeline_state::transform_constants_dirty; + const u32 transform_program_start = rsx::method_registers.transform_program_start(); current_vertex_program.data.reserve(512 * 4); current_vertex_program.jump_table.clear(); @@ -1724,12 +1730,6 @@ namespace rsx void thread::analyse_current_rsx_pipeline() { - if (m_graphics_state & rsx::pipeline_state::fragment_program_ucode_dirty) - { - // Request for update of fragment constants if the program block is invalidated - m_graphics_state |= rsx::pipeline_state::fragment_constants_dirty; - } - prefetch_vertex_program(); prefetch_fragment_program(); } diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 8a40241063..568d72f869 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -1030,13 +1030,6 @@ void VKGSRender::end() if (m_graphics_state & (rsx::pipeline_state::fragment_program_ucode_dirty | rsx::pipeline_state::vertex_program_ucode_dirty)) { - // TODO: Move to shared code - if ((m_graphics_state & rsx::pipeline_state::vertex_program_ucode_dirty) && - m_vertex_prog && !m_vertex_prog->has_indexed_constants) - { - m_graphics_state |= rsx::pipeline_state::transform_constants_dirty; - } - analyse_current_rsx_pipeline(); }