From abe5013f1dfd0399cba2f863765a0833a044d0e1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 21 Jan 2024 04:11:01 +0300 Subject: [PATCH] rsx: Fix compiling of mixed-precision shaders --- .../RSXProg/RSXFragmentPrologue.glsl | 20 ++++++++++++------- .../GLSLSnippets/RSXProg/RSXROPEpilogue.glsl | 8 ++++---- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl index acc6231ee2..5b388e3187 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl @@ -1,5 +1,18 @@ R"( +#ifdef _32_BIT_OUTPUT +// Everything is fp32 on ouput channels +#define _mrt_color_t(expr) expr +#else +// Mixed types. We have fp16 outputs +#define _mrt_color_t f16vec4 +f16vec4 round_to_8bit(const in f16vec4 v4) +{ + uvec4 raw = uvec4(floor(fma(v4, f16vec4(255.), f16vec4(0.5)))); + return f16vec4(raw) / f16vec4(255.); +} +#endif + #if defined(_ENABLE_ROP_OUTPUT_ROUNDING) || defined(_ENABLE_PROGRAMMABLE_BLENDING) // Default. Used when we're not utilizing native fp16 vec4 round_to_8bit(const in vec4 v4) @@ -7,13 +20,6 @@ vec4 round_to_8bit(const in vec4 v4) uvec4 raw = uvec4(floor(fma(v4, vec4(255.), vec4(0.5)))); return vec4(raw) / vec4(255.); } -#if !defined(_32_BIT_OUTPUT) -f16vec4 round_to_8bit(const in f16vec4 v4) -{ - uvec4 raw = uvec4(floor(fma(v4, f16vec4(255.), f16vec4(0.5)))); - return f16vec4(raw) / f16vec4(255.); -} -#endif #endif #ifdef _DISABLE_EARLY_DISCARD diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl index b740ce2b28..aaaaa559ca 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl @@ -10,10 +10,10 @@ R"( #ifdef _ENABLE_FRAMEBUFFER_SRGB if (_test_bit(rop_control, SRGB_FRAMEBUFFER_BIT)) { - col0.rgb = linear_to_srgb(col0).rgb; - col1.rgb = linear_to_srgb(col1).rgb; - col2.rgb = linear_to_srgb(col2).rgb; - col3.rgb = linear_to_srgb(col3).rgb; + col0.rgb = _mrt_color_t(linear_to_srgb(col0)).rgb; + col1.rgb = _mrt_color_t(linear_to_srgb(col1)).rgb; + col2.rgb = _mrt_color_t(linear_to_srgb(col2)).rgb; + col3.rgb = _mrt_color_t(linear_to_srgb(col3)).rgb; } #endif