diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 2130c6c207..2b6f686066 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -342,14 +342,15 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, .support_fp64_signed_zero_nan_preserve = float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE, - // Switch/Maxwell native float behavior (auto-configured on Qualcomm) + // Switch/Maxwell native float behavior - ONLY for Turnip Mesa (Stock Qualcomm broken) + // Stock Adreno drivers have broken float controls disabled in vulkan_device.cpp .force_fp32_denorm_flush = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY && - device.IsKhrShaderFloatControlsSupported(), + device.IsKhrShaderFloatControlsSupported(), // false on Stock, true on Turnip .force_fp32_denorm_preserve = false, // FTZ dominates .force_fp32_rte_rounding = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY && - device.IsKhrShaderFloatControlsSupported(), + device.IsKhrShaderFloatControlsSupported(), // false on Stock, true on Turnip .force_fp32_signed_zero_inf_nan = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY && - device.IsKhrShaderFloatControlsSupported(), + device.IsKhrShaderFloatControlsSupported(), // false on Stock, true on Turnip .support_explicit_workgroup_layout = device.IsKhrWorkgroupMemoryExplicitLayoutSupported(), .support_vote = device.IsSubgroupFeatureSupported(VK_SUBGROUP_FEATURE_VOTE_BIT), @@ -381,7 +382,8 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, .has_broken_spirv_position_input = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, .has_broken_unsigned_image_offsets = false, .has_broken_signed_operations = false, - .has_broken_fp16_float_controls = driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY, + .has_broken_fp16_float_controls = driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY || + driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, .ignore_nan_fp_comparisons = false, .has_broken_spirv_subgroup_mask_vector_extract_dynamic = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 28bcd8b059..4c82033178 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -551,23 +551,13 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR LOG_INFO(Render_Vulkan, "VK_QCOM_render_pass_shader_resolve: ENABLED"); } - // Shader Float Controls for Qualcomm Adreno - LOG_INFO(Render_Vulkan, "Enabling Shader Float Controls with Switch/Maxwell native configuration"); - - // Log driver capabilities - const auto& fc = properties.float_controls; - LOG_INFO(Render_Vulkan, "Driver Capabilities:"); - LOG_INFO(Render_Vulkan, " - Denorm Flush FP32: {}", fc.shaderDenormFlushToZeroFloat32 ? "YES" : "NO"); - LOG_INFO(Render_Vulkan, " - RTE Rounding FP32: {}", fc.shaderRoundingModeRTEFloat32 ? "YES" : "NO"); - LOG_INFO(Render_Vulkan, " - Signed Zero/Inf/Nan FP32: {}", fc.shaderSignedZeroInfNanPreserveFloat32 ? "YES" : "NO"); - - // Apply Switch/Maxwell native float behavior - LOG_INFO(Render_Vulkan, "Applying Switch/Maxwell native float behavior:"); - LOG_INFO(Render_Vulkan, " - FTZ (Flush-To-Zero): ON - Matches Switch hardware behavior"); - LOG_INFO(Render_Vulkan, " - RTE (Round-To-Even): ON - IEEE 754 standard precision"); - LOG_INFO(Render_Vulkan, " - SignedZero/Inf/NaN: ON - Mathematical correctness"); - - LOG_INFO(Render_Vulkan, "VK_KHR_shader_float_controls: ENABLED (auto-configured)"); + // Shader Float Controls: Keep extension ENABLED for FP32 precision control + // Stock Qualcomm: Disable FP16 support (broken hardware), force FP32 fallback + // Turnip Mesa: Full float controls support + if (!is_turnip) { + LOG_WARNING(Render_Vulkan, "Disabling FP16 support for Stock Qualcomm (broken driver)"); + features.shader_float16_int8.shaderFloat16 = false; + } // Int64 atomics - genuinely broken, always disable RemoveExtensionFeature(extensions.shader_atomic_int64, features.shader_atomic_int64,