From 1e581d3c90b6ac03542dc041ae48b4230a0a74e9 Mon Sep 17 00:00:00 2001 From: Neil Monday Date: Mon, 20 Jul 2026 08:21:58 -0400 Subject: [PATCH] Add ray tracing invocation reorder extensions Applications that use these extensions have shaders with new instructions. The driver should receive the features struct via a vkCreateDevice pNext chain to enable the feature. This change simply adds this extension as a supported extension, and adds the pNext structs to the supported structs. --- renderdoc/driver/vulkan/extension_support.md | 4 +- renderdoc/driver/vulkan/vk_common.h | 9 ++ renderdoc/driver/vulkan/vk_core.cpp | 8 ++ renderdoc/driver/vulkan/vk_next_chains.cpp | 12 ++- renderdoc/driver/vulkan/vk_serialise.cpp | 91 +++++++++++++++++-- renderdoc/driver/vulkan/vk_stringise.cpp | 11 +++ .../vulkan/wrappers/vk_device_funcs.cpp | 16 ++++ 7 files changed, 137 insertions(+), 14 deletions(-) diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 8a9be4b78..9978ed509 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -99,6 +99,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_provoking_vertex` * `VK_EXT_queue_family_foreign` * `VK_EXT_rasterization_order_attachment_access` +* `VK_EXT_ray_tracing_invocation_reorder` * `VK_EXT_rgba10x6_formats` * `VK_EXT_robustness2` * `VK_EXT_sample_locations` @@ -265,6 +266,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_NV_external_memory` * `VK_NV_fragment_shader_barycentric` * `VK_NV_geometry_shader_passthrough` +* `VK_NV_ray_tracing_invocation_reorder` * `VK_NV_sample_mask_override_coverage` * `VK_NV_shader_image_footprint` * `VK_NV_shader_subgroup_partitioned` @@ -333,7 +335,6 @@ The portability subset is only relevant on mac, which is not a supported platfor * `VK_EXT_pipeline_library_group_handles` * `VK_EXT_present_timing` * `VK_EXT_primitive_restart_index` -* `VK_EXT_ray_tracing_invocation_reorder` * `VK_EXT_shader_64bit_indexing` * `VK_EXT_shader_float8` * `VK_EXT_shader_long_vector` @@ -453,7 +454,6 @@ The portability subset is only relevant on mac, which is not a supported platfor * `VK_NV_present_barrier` * `VK_NV_present_metering` * `VK_NV_raw_access_chains` -* `VK_NV_ray_tracing_invocation_reorder` * `VK_NV_ray_tracing_linear_swept_spheres` * `VK_NV_ray_tracing_motion_blur` * `VK_NV_ray_tracing_validation` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index da4eef5b5..c43fe4d94 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1801,6 +1801,10 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProvokingVertexPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePushDescriptorProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayQueryFeaturesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingPipelineFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingPipelinePropertiesKHR); @@ -2344,6 +2348,10 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProvokingVertexPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePushDescriptorProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayQueryFeaturesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelineFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelinePropertiesKHR); @@ -2877,6 +2885,7 @@ DECLARE_REFLECTION_ENUM(VkQueryResultFlagBits); DECLARE_REFLECTION_ENUM(VkQueryType); DECLARE_REFLECTION_ENUM(VkQueueFlagBits); DECLARE_REFLECTION_ENUM(VkQueueGlobalPriority); +DECLARE_REFLECTION_ENUM(VkRayTracingInvocationReorderModeEXT); DECLARE_REFLECTION_ENUM(VkRayTracingShaderGroupTypeKHR); DECLARE_REFLECTION_ENUM(VkRenderingFlagBits); DECLARE_REFLECTION_ENUM(VkRenderPassCreateFlagBits); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 2a145d58c..172668572 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1381,6 +1381,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION, }, + { + VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, + VK_EXT_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION, + }, { VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME, VK_EXT_RGBA10X6_FORMATS_SPEC_VERSION, @@ -2071,6 +2075,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME, VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION, }, + { + VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, + VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION, + }, { VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME, VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 353ab8fde..96697b87d 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -507,6 +507,14 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDevicePushDescriptorProperties); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, \ VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT, \ + VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, \ + VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT, \ + VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV, \ + VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, \ VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, \ @@ -1368,10 +1376,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_FEATURES_QCOM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_PROPERTIES_QCOM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 1ccdc1b32..68bf7013d 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -915,6 +915,12 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, \ VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT) \ \ + /* VK_EXT_ray_tracing_invocation_reorder */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT, \ + VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT, \ + VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT) \ + \ /* VK_EXT_rgba10x6_formats */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT, \ VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT) \ @@ -1687,6 +1693,12 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV, \ VkExternalMemoryImageCreateInfoNV) \ \ + /* VK_NV_ray_tracing_invocation_reorder */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV, \ + VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV, \ + VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV) \ + \ /* VK_NV_shader_image_footprint */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, \ VkPhysicalDeviceShaderImageFootprintFeaturesNV) \ @@ -2042,10 +2054,6 @@ SERIALISE_VK_HANDLES(); /* VK_EXT_primitive_restart_index */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT) \ \ - /* VK_EXT_ray_tracing_invocation_reorder */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT) \ - \ /* VK_EXT_shader_64bit_indexing */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT) \ \ @@ -2550,10 +2558,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV) \ \ - /* VK_NV_ray_tracing_invocation_reorder */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV) \ - \ /* VK_NV_ray_tracing_motion_blur */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV) \ @@ -14102,6 +14106,73 @@ void Deserialise(const VkPhysicalDeviceRayTracingPipelinePropertiesKHR &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(rayTracingInvocationReorder); +} + +template <> +void Deserialise(const VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(rayTracingInvocationReorderReorderingHint); + SERIALISE_MEMBER(maxShaderBindingTableRecordIndex); +} + +template <> +void Deserialise(const VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(rayTracingInvocationReorder); +} + +template <> +void Deserialise(const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(rayTracingInvocationReorderReorderingHint); +} + +template <> +void Deserialise(const VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkStridedDeviceAddressRegionKHR &el) { @@ -15476,6 +15547,10 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProvokingVertexPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePushDescriptorProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayQueryFeaturesKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelineFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelinePropertiesKHR); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index a47a206f3..396ce8a3d 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -3808,6 +3808,17 @@ rdcstr DoStringise(const VkProvokingVertexModeEXT &el) END_ENUM_STRINGISE(); } +template <> +rdcstr DoStringise(const VkRayTracingInvocationReorderModeEXT &el) +{ + BEGIN_ENUM_STRINGISE(VkRayTracingInvocationReorderModeEXT); + { + STRINGISE_ENUM(VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_EXT) + STRINGISE_ENUM(VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_EXT) + } + END_ENUM_STRINGISE(); +} + template <> rdcstr DoStringise(const VkRayTracingShaderGroupTypeKHR &el) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index f2f77a8ae..28bcb1315 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -3542,6 +3542,22 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi } END_PHYS_EXT_CHECK(); + BEGIN_PHYS_EXT_CHECK( + VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(rayTracingInvocationReorder); + } + END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK( + VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV); + { + CHECK_PHYS_EXT_FEATURE(rayTracingInvocationReorder); + } + END_PHYS_EXT_CHECK(); + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceMaintenance5Features, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES); {