From 983cf91ef0fd54f882a8fff4d2a1d2f7eb7d0e13 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 31 Jan 2025 14:09:03 +0000 Subject: [PATCH] Track enabled status of some subgroup vulkan extensions we care about --- renderdoc/driver/vulkan/vk_hookset_defs.h | 12 ++++++++++-- .../vulkan/wrappers/vk_device_funcs.cpp | 19 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index c283d52a2..a4cdf4f38 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -540,7 +540,11 @@ DeclExt(KHR_ray_query); \ DeclExt(EXT_nested_command_buffer); \ DeclExt(EXT_shader_object); \ - DeclExt(KHR_ray_tracing_pipeline); + DeclExt(KHR_ray_tracing_pipeline); \ + DeclExt(EXT_subgroup_size_control); \ + DeclExt(EXT_shader_subgroup_ballot); \ + DeclExt(EXT_shader_subgroup_vote); \ + DeclExt(KHR_shader_subgroup_uniform_control_flow); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -670,7 +674,11 @@ CheckExt(KHR_acceleration_structure, VKXX); \ CheckExt(KHR_ray_query, VKXX); \ CheckExt(EXT_shader_object, VKXX); \ - CheckExt(KHR_ray_tracing_pipeline, VKXX); + CheckExt(KHR_ray_tracing_pipeline, VKXX); \ + CheckExt(EXT_subgroup_size_control, VK13); \ + CheckExt(EXT_shader_subgroup_ballot, VK11); \ + CheckExt(EXT_shader_subgroup_vote, VK11); \ + CheckExt(KHR_shader_subgroup_uniform_control_flow, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 9ddcdfed3..048a0f5bd 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1762,6 +1762,9 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi AddRequiredExtensions(false, Extensions, supportedExtensions); + VkPhysicalDeviceProperties physProps; + ObjDisp(physicalDevice)->GetPhysicalDeviceProperties(Unwrap(physicalDevice), &physProps); + // Drop VK_KHR_driver_properties if it's not available, but add it if it is bool driverPropsSupported = (supportedExtensions.find(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME) != supportedExtensions.end()); @@ -1892,6 +1895,19 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi "mesh stage will not be available"); } + // enable VK_KHR_shader_subgroup_uniform_control_flow if it's available, to make subgroup + // debugging more reliable/spec-clean. + // if we can't get it, we'll just emit the same code anyway and hope it compiles to something sensible + if(RDCMIN(m_EnabledExtensions.vulkanVersion, physProps.apiVersion) >= VK_MAKE_VERSION(1, 1, 0)) + { + if(supportedExtensions.find(VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME) != + supportedExtensions.end()) + { + Extensions.push_back(VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME); + RDCLOG("Enabling VK_KHR_shader_subgroup_uniform_control_flow extension"); + } + } + bool KHRbuffer = false, EXTbuffer = false; if(supportedExtensions.find(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) != @@ -3543,9 +3559,6 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi SAFE_DELETE_ARRAY(exts); - VkPhysicalDeviceProperties physProps; - ObjDisp(physicalDevice)->GetPhysicalDeviceProperties(Unwrap(physicalDevice), &physProps); - VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR pipeExecFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, };