From 9ff6003dfc4a5193d27a8058d8f02eb5495ce2bf Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 18 Apr 2023 13:19:57 +0300 Subject: [PATCH] rsx: Add Ultra shader precision setting for costly accuracy settings --- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 42 ++++++++++++++++++---------- rpcs3/Emu/system_config_types.cpp | 1 + rpcs3/Emu/system_config_types.h | 1 + rpcs3/rpcs3qt/emu_settings.cpp | 1 + 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index edc74dd4ea..25a89883d8 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -1,10 +1,11 @@ #include "stdafx.h" -#include "Utilities/StrFmt.h" #include "GLSLCommon.h" #include "RSXFragmentProgram.h" -#include "../gcm_enums.h" +#include "Emu/system_config.h" +#include "Emu/RSX/gcm_enums.h" +#include "Utilities/StrFmt.h" namespace program_common { @@ -1245,18 +1246,31 @@ namespace glsl // Interpolate the input attributes manually. // Matches AMD behavior where gl_BaryCoordSmoothAMD only provides x and y with z being autogenerated. - OS << fmt::replace_all( - "\n" - "vec4 _interpolate_varying3(const in vec4[3] v)\n" - "{\n" - " const double _gl_BaryCoord_x = double($gl_BaryCoord.x);\n" - " const double _gl_BaryCoord_y = double($gl_BaryCoord.y);\n" - " const double _gl_BaryCoord_z = double(1.0) - (_gl_BaryCoord_x + _gl_BaryCoord_y);\n" - " return vec4(_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) } - }); + std::string interpolate_function_block; + if (g_cfg.video.shader_precision == gpu_preset_level::ultra) + { + interpolate_function_block = + "\n" + "vec4 _interpolate_varying3(const in vec4[3] v)\n" + "{\n" + " const double _gl_BaryCoord_x = double($gl_BaryCoord.x);\n" + " const double _gl_BaryCoord_y = double($gl_BaryCoord.y);\n" + " const double _gl_BaryCoord_z = double(1.0) - (_gl_BaryCoord_x + _gl_BaryCoord_y);\n" + " return vec4(_gl_BaryCoord_x * v[0] + _gl_BaryCoord_y * v[1] + _gl_BaryCoord_z * v[2]);\n" + "}\n\n"; + } + else + { + interpolate_function_block = + "\n" + "vec4 _interpolate_varying3(const in vec4[3] v)\n" + "{\n" + " vec3 _gl_BaryCoord = vec3($gl_BaryCoord.xy, 1.f);\n" + " _gl_BaryCoord.z = dot(_gl_BaryCoord, vec3(-1.f, -1.f, 1.f));\n" + " return vec4(_gl_BaryCoord.x * v[0] + _gl_BaryCoord.y * v[1] + _gl_BaryCoord.z * v[2]);\n" + "}\n\n"; + } + OS << fmt::replace_all(interpolate_function_block, {{ "$gl_BaryCoord", "gl_BaryCoord"s + std::string(ext_flavour) }}); for (const auto& reg : varying_list) { diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index 9dd821486d..79bd61f11c 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -608,6 +608,7 @@ void fmt_class_string::format(std::string& out, u64 arg) switch (value) { case gpu_preset_level::_auto: return "Auto"; + case gpu_preset_level::ultra: return "Ultra"; case gpu_preset_level::high: return "High"; case gpu_preset_level::low: return "Low"; } diff --git a/rpcs3/Emu/system_config_types.h b/rpcs3/Emu/system_config_types.h index a257416d65..4e7446d2f5 100644 --- a/rpcs3/Emu/system_config_types.h +++ b/rpcs3/Emu/system_config_types.h @@ -301,6 +301,7 @@ enum class zcull_precision_level enum class gpu_preset_level { + ultra, high, low, _auto diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index 282f5279f5..0c30a0dbdd 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -947,6 +947,7 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ switch (static_cast(index)) { case gpu_preset_level::_auto: return tr("Auto", "Shader Precision"); + case gpu_preset_level::ultra: return tr("Ultra", "Shader Precision"); case gpu_preset_level::high: return tr("High", "Shader Precision"); case gpu_preset_level::low: return tr("Low", "Shader Precision"); }