rsx: Add Ultra shader precision setting for costly accuracy settings

This commit is contained in:
kd-11 2023-04-18 13:19:57 +03:00 committed by kd-11
parent f725ea7d0d
commit 9ff6003dfc
4 changed files with 31 additions and 14 deletions

View file

@ -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)
{