diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 07781d30b3..035ec4838d 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -500,6 +500,9 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR CollectToolingInfo(); if (is_qualcomm) { + disable_graphics_subgroups = true; + LOG_WARNING(Render_Vulkan, + "Qualcomm drivers force subgroup emulation; disabling graphics warp intrinsics"); // Qualcomm Adreno GPUs doesn't handle scaled vertex attributes; keep emulation enabled must_emulate_scaled_formats = true; LOG_WARNING(Render_Vulkan, @@ -1553,19 +1556,23 @@ bool Device::SupportsSubgroupStage(VkShaderStageFlags stage_mask) const { if (stage_mask == 0) { return true; } + if (disable_graphics_subgroups && (stage_mask & GraphicsStageMask) != 0) { + return false; + } const VkShaderStageFlags supported = properties.subgroup_properties.supportedStages; if ((supported & stage_mask) == stage_mask) { return true; } if ((stage_mask & GraphicsStageMask) != 0 && - (supported & (VK_SHADER_STAGE_ALL_GRAPHICS | VK_SHADER_STAGE_ALL)) != 0) { + ((supported & VK_SHADER_STAGE_ALL_GRAPHICS) == VK_SHADER_STAGE_ALL_GRAPHICS || + (supported & VK_SHADER_STAGE_ALL) == VK_SHADER_STAGE_ALL)) { return true; } if ((stage_mask & VK_SHADER_STAGE_COMPUTE_BIT) != 0 && - (supported & (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_ALL)) != 0) { + (supported & VK_SHADER_STAGE_ALL) == VK_SHADER_STAGE_ALL) { return true; } - return (supported & VK_SHADER_STAGE_ALL) != 0; + return false; } bool Device::IsSubgroupFeatureSupported(VkSubgroupFeatureFlagBits feature, diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index f1674e32a1..084232f782 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -1100,6 +1100,7 @@ private: bool dynamic_state3_alpha_to_coverage{}; bool dynamic_state3_alpha_to_one{}; bool supports_conditional_barriers{}; ///< Allows barriers in conditional control flow. + bool disable_graphics_subgroups{}; ///< Forces subgroup emulation on graphics stages. size_t sampler_heap_budget{}; ///< Sampler budget for buggy drivers (0 = unlimited). VkDeviceSize uniform_buffer_alignment_minimum{}; ///< Minimum enforced UBO alignment. VkDeviceSize storage_buffer_alignment_minimum{}; ///< Minimum enforced SSBO alignment.