From 51e1ff497621a220900a457895841536a9c64c79 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 17 Aug 2025 19:25:30 +0300 Subject: [PATCH] vk: Fix shader compiler issues caused by broken preprocessor macro expansion --- .../GLSLInterpreter/FragmentInterpreter.glsl | 2 +- .../GLSLSnippets/RSXProg/RSXROPPrologue.glsl | 2 +- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 31 ++++++++++--------- rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp | 16 ++++++---- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLInterpreter/FragmentInterpreter.glsl b/rpcs3/Emu/RSX/Program/GLSLInterpreter/FragmentInterpreter.glsl index fb5e5854ab..34a03343b3 100644 --- a/rpcs3/Emu/RSX/Program/GLSLInterpreter/FragmentInterpreter.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLInterpreter/FragmentInterpreter.glsl @@ -553,7 +553,7 @@ void main() ur1 = (1u << ur1); // address mask uvr0.x = (ur0 >> 7u); // address to uvec4 row (each row has 32x4 bits) #ifdef VULKAN - uvr0.x += fs_stipple_pattern_array_offset; // Address base offset. Only applies to vulkan. + uvr0.x += _fs_stipple_pattern_array_offset; // Address base offset. Only applies to vulkan. #endif ur0 = (ur0 >> 5u) & 3u; // address to uvec4 word (address / 32) % 4 diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl index 02e3ba9b75..5b0798e43e 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl @@ -9,7 +9,7 @@ R"( const uint bit_offset = (address & 31u); #ifdef VULKAN // In vulkan we have a unified array with a dynamic offset - const uint word_index = _get_bits(address, 7, 3) + fs_stipple_pattern_array_offset; + const uint word_index = _get_bits(address, 7, 3) + _fs_stipple_pattern_array_offset; #else const uint word_index = _get_bits(address, 7, 3); #endif diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 451a1b14dd..800622e8e4 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -251,11 +251,12 @@ void VKFragmentDecompilerThread::insertConstants(std::stringstream & OS) " draw_parameters_t draw_parameters[];\n" "};\n\n" - "#define get_draw_params() draw_parameters[draw_parameters_offset]\n" - "#define fs_constants_offset get_draw_params().fs_constants_offset\n" - "#define fs_context_offset get_draw_params().fs_context_offset\n" - "#define fs_texture_base_index get_draw_params().fs_texture_base_index\n" - "#define fs_stipple_pattern_array_offset get_draw_params().fs_stipple_pattern_offset\n\n"; + "draw_parameters_t get_draw_params() { return draw_parameters[draw_parameters_offset]; }\n\n" + + "#define _fs_constants_offset get_draw_params().fs_constants_offset\n" + "#define _fs_context_offset get_draw_params().fs_context_offset\n" + "#define _fs_texture_base_index get_draw_params().fs_texture_base_index\n" + "#define _fs_stipple_pattern_array_offset get_draw_params().fs_stipple_pattern_offset\n\n"; if (!properties.constant_offsets.empty()) { @@ -263,7 +264,7 @@ void VKFragmentDecompilerThread::insertConstants(std::stringstream & OS) OS << "{\n"; OS << " vec4 fc[];\n"; OS << "};\n"; - OS << "#define _fetch_constant(x) fc[x + fs_constants_offset]\n\n"; + OS << "#define _fetch_constant(x) fc[x + _fs_constants_offset]\n\n"; } OS << @@ -341,19 +342,20 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) if (m_shader_props.require_fog_read) { OS << - "#define fog_param0 fs_contexts[fs_context_offset].fog_param0\n" - "#define fog_param1 fs_contexts[fs_context_offset].fog_param1\n" - "#define fog_mode fs_contexts[fs_context_offset].fog_mode\n\n"; + "#define fog_param0 fs_contexts[_fs_context_offset].fog_param0\n" + "#define fog_param1 fs_contexts[_fs_context_offset].fog_param1\n" + "#define fog_mode fs_contexts[_fs_context_offset].fog_mode\n\n"; } if (m_shader_props.require_wpos) { OS << - "#define wpos_scale fs_contexts[fs_context_offset].wpos_scale\n" - "#define wpos_bias fs_contexts[fs_context_offset].wpos_bias\n\n"; + "#define wpos_scale fs_contexts[_fs_context_offset].wpos_scale\n" + "#define wpos_bias fs_contexts[_fs_context_offset].wpos_bias\n\n"; } - OS << "#define texture_base_index fs_texture_base_index\n\n"; + OS << + "#define texture_base_index _fs_texture_base_index\n\n"; glsl::insert_glsl_legacy_function(OS, m_shader_props); } @@ -448,9 +450,10 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "void main()\n"; OS << "{\n"; + // FIXME: Workaround OS << - " const uint rop_control = fs_contexts[fs_context_offset].rop_control;\n" - " const float alpha_ref = fs_contexts[fs_context_offset].alpha_ref;\n\n"; + " const uint rop_control = fs_contexts[_fs_context_offset].rop_control;\n" + " const float alpha_ref = fs_contexts[_fs_context_offset].alpha_ref;\n\n"; ::glsl::insert_rop_init(OS); diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index 3ec8bdc783..2e28c2359e 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -178,11 +178,11 @@ namespace vk comp.insertConstants(builder); builder << - "#define fog_param0 fs_contexts[fs_context_offset].fog_param0\n" - "#define fog_param1 fs_contexts[fs_context_offset].fog_param1\n" - "#define fog_mode fs_contexts[fs_context_offset].fog_mode\n" - "#define wpos_scale fs_contexts[fs_context_offset].wpos_scale\n" - "#define wpos_bias fs_contexts[fs_context_offset].wpos_bias\n\n"; + "#define fog_param0 fs_contexts[_fs_context_offset].fog_param0\n" + "#define fog_param1 fs_contexts[_fs_context_offset].fog_param1\n" + "#define fog_mode fs_contexts[_fs_context_offset].fog_mode\n" + "#define wpos_scale fs_contexts[_fs_context_offset].wpos_scale\n" + "#define wpos_bias fs_contexts[_fs_context_offset].wpos_bias\n\n"; if (compiler_options & program_common::interpreter::COMPILER_OPT_ENABLE_ALPHA_TEST_GE) { @@ -260,7 +260,7 @@ namespace vk "#define SAMPLER2D(index) sampler2D_array[index]\n" "#define SAMPLER3D(index) sampler3D_array[index]\n" "#define SAMPLERCUBE(index) samplerCube_array[index]\n" - "#define texture_base_index fs_texture_base_index\n\n"; + "#define texture_base_index _fs_texture_base_index\n\n"; } builder << @@ -273,6 +273,10 @@ namespace vk " uvec4 fp_instructions[];\n" "};\n\n"; + builder << + " uint rop_control = fs_contexts[_fs_context_offset].rop_control;\n" + " float alpha_ref = fs_contexts[_fs_context_offset].alpha_ref;\n\n"; + builder << program_common::interpreter::get_fragment_interpreter(); const std::string s = builder.str();