From 57088ebb82214f20a65a2d4f12ed5bd682e949d3 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 29 Mar 2023 23:00:08 +0200 Subject: [PATCH] Shaders: Add error message for asciiart shader if shader_subgroup is missing. This extension is currently required to get good performance. So instead of maybe triggering a GPU hang, let's just disable the shader and show a warning instead. Sadly our postprocessing framework does not support reporting a warning, so the way to display the warning is a bit hacky. But this is an ascii-art shader, we already have a font in the shader, so let's use it. --- Data/Sys/Shaders/asciiart.glsl | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/Data/Sys/Shaders/asciiart.glsl b/Data/Sys/Shaders/asciiart.glsl index e05a60ef97..1b5cfa947c 100644 --- a/Data/Sys/Shaders/asciiart.glsl +++ b/Data/Sys/Shaders/asciiart.glsl @@ -14,8 +14,8 @@ DefaultValue = false [/configuration] */ -const uint MAX_CHARS = 96u; // max 96, must be a multiple of 32 -const bool HAVE_FULL_FEATURE_FALLBACK = true; +const uint MAX_CHARS = 96u; // max 96, must be a multiple of 32 +const bool HAVE_FULL_FEATURE_FALLBACK = false; // terrible slow, can easily softlock the GPU const uint UNROLL_FALLBACK = 4; const uint UNROLL_SIMD = 3; // max MAX_CHARS / 32 @@ -391,6 +391,29 @@ bool supportsSIMD(uint simd_width) #endif } +// "Error: The AsciiArt shader requires the missing GPU extention KHR_shader_subgroup." +const uint missing_subgroup_warning_len = 82; +const uint missing_subgroup_warning[missing_subgroup_warning_len] = { + 37, 82, 82, 79, 82, 26, 95, 52, 72, 69, 95, 33, 83, 67, 73, 73, 33, 82, 84, 95, 83, + 72, 65, 68, 69, 82, 95, 82, 69, 81, 85, 73, 82, 69, 83, 95, 84, 72, 69, 95, 77, 73, + 83, 83, 73, 78, 71, 95, 39, 48, 53, 95, 69, 88, 84, 69, 78, 84, 73, 79, 78, 95, 43, + 40, 50, 63, 83, 72, 65, 68, 69, 82, 63, 83, 85, 66, 71, 82, 79, 85, 80, 14}; + +float3 ShowWarning(uint2 char_pos) +{ + CharResults char_out; + char_out.fg = float3(1.0, 1.0, 1.0); + char_out.bg = float3(0.0, 0.0, 0.0); + char_out.c = 95u; // just background + + if (char_pos.y == 0u && char_pos.x < missing_subgroup_warning_len) + { + char_out.c = missing_subgroup_warning[char_pos.x]; + } + + return GetFinalPixel(char_out); +} + void main() { // Calculate the character position of this pixel @@ -442,6 +465,12 @@ void main() } } else +#else + if (char_pos_self.y <= 1u) + { + color_out = ShowWarning(char_pos_self); + } + else #endif if (HAVE_FULL_FEATURE_FALLBACK) {