From 302e87c920038bae1d35f631b7c3bb8ec909379a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 21:20:11 +0300 Subject: [PATCH] rsx/vk: Improve robustness when encountering corrupted shaders --- .../Emu/RSX/Program/FragmentProgramDecompiler.cpp | 3 +++ rpcs3/Emu/RSX/VK/VKDraw.cpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index c00cef47e6..8f134ebfae 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -868,8 +868,11 @@ std::string FragmentProgramDecompiler::BuildCode() if (!m_is_valid_ucode) { // If the code is broken, do not compile. Simply NOP main and write empty outputs + m_parr.params[PF_PARAM_UNIFORM].clear(); insertHeader(OS); OS << "\n"; + insertConstants(OS); + OS << "\n"; OS << "void main()\n"; OS << "{\n"; OS << "#if 0\n"; diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 634131b13b..b18ebaed3a 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -635,9 +635,16 @@ bool VKGSRender::bind_texture_env() { if (!(textures_ref & 1)) { + // Unused TIU continue; } + if (m_fs_binding_table->ftex_location[i] == umax) + { + // Corrupt shader table + break; + } + vk::image_view* view = nullptr; auto sampler_state = static_cast(fs_sampler_state[i].get()); @@ -707,9 +714,16 @@ bool VKGSRender::bind_texture_env() { if (!(textures_ref & 1)) { + // Unused TIU continue; } + if (m_vs_binding_table->vtex_location[i] == umax) + { + // Corrupt shader + break; + } + if (!rsx::method_registers.vertex_textures[i].enabled()) { const auto view_type = vk::get_view_type(current_vertex_program.get_texture_dimension(i));