From 4bf30b41a6efee287cb82e1a74872c85e3ce7413 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 20 Aug 2026 19:49:12 -0400 Subject: [PATCH] =?UTF-8?q?ASD=C3=91lasfu=20mfudgh=20rq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shader_recompiler/backend/spirv/emit_spirv.cpp | 2 +- src/shader_recompiler/profile.h | 2 ++ src/video_core/renderer_opengl/gl_shader_cache.cpp | 1 + src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 2f7fd2bb42..585543df2b 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -335,7 +335,7 @@ void SetupDenormControl(const Profile& profile, const IR::Program& program, Emit if (info.uses_fp32_denorms_flush && info.uses_fp32_denorms_preserve) { LOG_DEBUG(Shader_SPIRV, "Fp32 denorm flush and preserve on the same shader"); } else if (info.uses_fp32_denorms_flush) { - if (profile.support_fp32_denorm_flush) { + if (profile.support_fp32_denorm_flush && !profile.has_broken_fp32_denorm_flush) { ctx.AddCapability(spv::Capability::DenormFlushToZero); ctx.AddExecutionMode(main_func, spv::ExecutionMode::DenormFlushToZero, 32U); } else { diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index 98e3e0abd4..d0cf98d3fd 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -88,6 +88,8 @@ struct Profile { bool has_broken_fp16_float_controls{}; /// Forcing fp32 signed zero, Inf and NaN preservation miscompiles on some drivers bool has_broken_fp32_signed_zero_nan_preserve{}; + /// Declaring fp32 denorm flush to zero miscompiles on some drivers + bool has_broken_fp32_denorm_flush{}; /// Dynamic vec4 indexing is broken on some OpenGL drivers bool has_gl_component_indexing_bug{}; /// The precise type qualifier is broken in the fragment stage of some drivers diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 879e15f56e..8a375a2c7b 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -239,6 +239,7 @@ ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, .has_broken_signed_operations = true, .has_broken_fp16_float_controls = false, .has_broken_fp32_signed_zero_nan_preserve = false, + .has_broken_fp32_denorm_flush = false, .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), .has_gl_precise_bug = device.HasPreciseBug(), .has_gl_cbuf_ftou_bug = device.HasCbufFtouBug(), diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 767cd45137..db0bd2dab0 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -458,6 +458,7 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, .has_broken_fp32_signed_zero_nan_preserve = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, + .has_broken_fp32_denorm_flush = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, .ignore_nan_fp_comparisons = false, .has_broken_spirv_subgroup_mask_vector_extract_dynamic = false, .has_broken_robust =