1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 10:42:36 +01:00

rsx: Handle floating point shenanigans

- If near and far clip are too close together, the API will not distinguish between them leading to out of bounds values
This commit is contained in:
kd-11 2021-12-21 12:11:25 +03:00 committed by kd-11
parent de495952fd
commit 56dd09f4fe
4 changed files with 2 additions and 16 deletions

View File

@ -125,7 +125,6 @@ void GLVertexDecompilerThread::insertMainStart(std::stringstream & OS)
properties2.domain = glsl::glsl_vertex_program; properties2.domain = glsl::glsl_vertex_program;
properties2.require_lit_emulation = properties.has_lit_op; properties2.require_lit_emulation = properties.has_lit_op;
properties2.emulate_zclip_transform = true; properties2.emulate_zclip_transform = true;
properties2.quantize_depth_values = dev_caps.vendor_AMD;
properties2.emulate_depth_clip_only = dev_caps.NV_depth_buffer_float_supported; properties2.emulate_depth_clip_only = dev_caps.NV_depth_buffer_float_supported;
insert_glsl_legacy_function(OS, properties2); insert_glsl_legacy_function(OS, properties2);

View File

@ -603,17 +603,6 @@ namespace glsl
{ {
if (props.emulate_depth_clip_only) if (props.emulate_depth_clip_only)
{ {
// Optionally quantize Z values. This doesn't work fully since fragment interpolation will add back intermediate values...
// But it helps make the values closer to the correct integral counterparts
if (!props.quantize_depth_values) [[likely]]
{
OS << "#define _quantize_z(value) (value)\n\n";
}
else
{
OS << "#define _quantize_z(value) (double(uint(value * 0xFFFFFFu)) / 16777215.0)\n\n";
}
// Technically the depth value here is the 'final' depth that should be stored in the Z buffer. // Technically the depth value here is the 'final' depth that should be stored in the Z buffer.
// Forward mapping eqn is d' = d * (f - n) + n, where d' is the stored Z value (this) and d is the normalized API value. // Forward mapping eqn is d' = d * (f - n) + n, where d' is the stored Z value (this) and d is the normalized API value.
OS << OS <<
@ -624,9 +613,9 @@ namespace glsl
" const float real_n = min(far_plane, near_plane);\n" " const float real_n = min(far_plane, near_plane);\n"
" const float real_f = max(far_plane, near_plane);\n" " const float real_f = max(far_plane, near_plane);\n"
" const double depth_range = double(real_f - real_n);\n" " const double depth_range = double(real_f - real_n);\n"
" const double inv_range = (depth_range > 0.0) ? (1.0 / (depth_range * pos.w)) : 0.0;\n" " const double inv_range = (depth_range > 0.000001) ? (1.0 / (depth_range * pos.w)) : 0.0;\n"
" const double d = (double(pos.z) - real_n) * inv_range;\n" " const double d = (double(pos.z) - real_n) * inv_range;\n"
" return vec4(pos.xy, float(_quantize_z(d) * pos.w), pos.w);\n" " return vec4(pos.xy, float(d * pos.w), pos.w);\n"
" }\n" " }\n"
" else\n" " else\n"
" {\n" " {\n"

View File

@ -34,7 +34,6 @@ namespace glsl
bool emulate_shadow_compare : 1; bool emulate_shadow_compare : 1;
bool emulate_zclip_transform : 1; bool emulate_zclip_transform : 1;
bool emulate_depth_clip_only : 1; bool emulate_depth_clip_only : 1;
bool quantize_depth_values : 1;
bool low_precision_tests : 1; bool low_precision_tests : 1;
bool disable_early_discard : 1; bool disable_early_discard : 1;
bool supports_native_fp16 : 1; bool supports_native_fp16 : 1;

View File

@ -187,7 +187,6 @@ void VKVertexDecompilerThread::insertMainStart(std::stringstream & OS)
properties2.domain = glsl::glsl_vertex_program; properties2.domain = glsl::glsl_vertex_program;
properties2.require_lit_emulation = properties.has_lit_op; properties2.require_lit_emulation = properties.has_lit_op;
properties2.emulate_zclip_transform = true; properties2.emulate_zclip_transform = true;
properties2.quantize_depth_values = !vk::g_render_device->get_formats_support().d24_unorm_s8;
properties2.emulate_depth_clip_only = vk::g_render_device->get_shader_types_support().allow_float64; properties2.emulate_depth_clip_only = vk::g_render_device->get_shader_types_support().allow_float64;
glsl::insert_glsl_legacy_function(OS, properties2); glsl::insert_glsl_legacy_function(OS, properties2);