From 9c0b2338cfb3f6e7d6b5ac1cb93946e4a2cab6f5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 10 Dec 2022 18:20:43 +0300 Subject: [PATCH] rsx: Fix shader compilation --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 2 +- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 24 +++++++++++++++--------- rpcs3/Emu/RSX/Program/GLSLCommon.h | 4 ++-- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 2 +- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 6 +++--- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index b92e90af4c..9b6bd72e60 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -50,7 +50,7 @@ void GLFragmentDecompilerThread::insertInputs(std::stringstream & OS) { glsl::insert_fragment_shader_inputs_block( OS, - glsl::extension_type::NV, + glsl::extension_flavour::NV, m_prog, m_parr.params[PF_PARAM_IN], { diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 1f6231abcc..b6e6ccced1 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -1145,6 +1145,7 @@ namespace glsl void insert_fragment_shader_inputs_block( std::stringstream& OS, + const std::string_view ext_flavour, const RSXFragmentProgram& prog, const std::vector& params, const two_sided_lighting_config& _2sided_lighting, @@ -1157,7 +1158,7 @@ namespace glsl std::string type; }; - rsx::simple_array<_varying_register_config> varying_list; + std::vector<_varying_register_config> varying_list; for (const ParamType& PT : params) { @@ -1208,7 +1209,7 @@ namespace glsl } // Make the output a little nicer - varying_list.sort(FN(x.location < y.location)); + std::sort(varying_list.begin(), varying_list.end(), FN(x.location < y.location)); if (!(prog.ctrl & RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION)) { @@ -1217,22 +1218,27 @@ namespace glsl OS << "layout(location=" << reg.location << ") in " << reg.type << " " << reg.name << ";\n"; } + OS << "\n"; return; } for (const auto& reg : varying_list) { - OS << "layout(location=" << reg.location << ") pervertexNV in " << reg.type << " " << reg.name << "_raw[3];\n"; + OS << "layout(location=" << reg.location << ") pervertex" << ext_flavour << " in " << reg.type << " " << reg.name << "_raw[3];\n"; } // Interpolate the input attributes manually. // Matches AMD behavior where gl_BaryCoordSmoothAMD only provides x and y with z being autogenerated. - OS << - "vec4 _interpolate_varying3(const in vec4[3] v)\n" - "{\n" - " const BaryCoord_z = 1.0 - (gl_BaryCoordNV.x + gl_BaryCoordNV.y);\n" - " return gl_BaryCoordNV.x * v[0] + gl_BaryCoordNV.y * v[1] + BaryCoord_z * v[2];\n" - "}\n\n"; + OS << fmt::replace_all( + "\n" + "vec4 _interpolate_varying3(const in vec4[3] v)\n" + "{\n" + " const float _gl_BaryCoord_z = 1.0 - ($gl_BaryCoord.x + $gl_BaryCoord.y);\n" + " return $gl_BaryCoord.x * v[0] + $gl_BaryCoord.y * v[1] + _gl_BaryCoord_z * v[2];\n" + "}\n\n", + { + { "$gl_BaryCoord", "gl_BaryCoord"s + std::string(ext_flavour) } + }); for (const auto& reg : varying_list) { diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index b257ca5c3d..71dc2bc989 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -4,7 +4,7 @@ #include "GLSLTypes.h" #include "ShaderParam.h" -class RSXFragmentProgram; +struct RSXFragmentProgram; namespace rsx { @@ -90,7 +90,7 @@ namespace glsl bool two_sided_specular; }; - struct extension_type + struct extension_flavour { static constexpr std::string_view EXT = "EXT", diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index aeffffda4b..baa75296a4 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -65,7 +65,7 @@ void VKFragmentDecompilerThread::insertInputs(std::stringstream & OS) { glsl::insert_fragment_shader_inputs_block( OS, - glsl::extension_type::EXT, + glsl::extension_flavour::EXT, m_prog, m_parr.params[PF_PARAM_IN], { diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 06ca2e75bb..4d0764228d 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -541,9 +541,9 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) // NVIDIA has broken attribute interpolation backend_config.supports_normalized_barycentrics = ( - vk::get_driver_vendor() != vk::driver_vendor::NVIDIA && - m_device->get_barycoords_support() && - g_cfg.video.shader_precision != gpu_preset_level::low); + vk::get_driver_vendor() != vk::driver_vendor::NVIDIA || + !m_device->get_barycoords_support() || + g_cfg.video.shader_precision == gpu_preset_level::low); // NOTE: We do not actually need multiple sample support for A2C to work // This is here for visual consistency - will be removed when AA problems due to mipmaps are fixed