Add support for VK_KHR_ray_tracing_maintenance1

This commit is contained in:
baldurk
2025-02-13 15:10:11 +00:00
parent 5af9ccb9d9
commit 6c985c7cac
10 changed files with 133 additions and 8 deletions
+1 -1
View File
@@ -187,6 +187,7 @@ Maintainers can update this file by updating vk.xml in this folder and running `
* `VK_KHR_present_wait`
* `VK_KHR_push_descriptor`
* `VK_KHR_ray_query`
* `VK_KHR_ray_tracing_maintenance1`
* `VK_KHR_ray_tracing_pipeline`
* `VK_KHR_ray_tracing_position_fetch`
* `VK_KHR_relaxed_block_layout`
@@ -260,7 +261,6 @@ KHR extensions will definitely be implemented at some point, though KHR extensio
* `VK_KHR_maintenance8`
* `VK_KHR_map_memory2`
* `VK_KHR_pipeline_binary`
* `VK_KHR_ray_tracing_maintenance1`
## KHR Portability
+3
View File
@@ -1148,6 +1148,7 @@ enum class VulkanChunk : uint32_t
vkCreateRayTracingPipelinesKHR,
vkCmdSetRenderingAttachmentLocationsKHR,
vkCmdSetRenderingInputAttachmentIndicesKHR,
vkCmdTraceRaysIndirect2KHR,
Max,
};
@@ -1468,6 +1469,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProvokingVertexPropertiesEXT);
DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePushDescriptorProperties);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayQueryFeaturesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingPipelineFeaturesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingPipelinePropertiesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR);
@@ -1918,6 +1920,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProvokingVertexPropertiesEXT);
DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePushDescriptorProperties);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayQueryFeaturesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelineFeaturesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelinePropertiesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR);
+6
View File
@@ -1658,6 +1658,10 @@ static const VkExtensionProperties supportedExtensions[] = {
VK_KHR_RAY_QUERY_EXTENSION_NAME,
VK_KHR_RAY_QUERY_SPEC_VERSION,
},
{
VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME,
VK_KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION,
},
{
VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME,
VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION,
@@ -4356,6 +4360,8 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk)
case VulkanChunk::vkCreateRayTracingPipelinesKHR:
return Serialise_vkCreateRayTracingPipelinesKHR(ser, VK_NULL_HANDLE, VK_NULL_HANDLE,
VK_NULL_HANDLE, 0, NULL, NULL, NULL);
case VulkanChunk::vkCmdTraceRaysIndirect2KHR:
return Serialise_vkCmdTraceRaysIndirect2KHR(ser, VK_NULL_HANDLE, 0);
// chunks that are reserved but not yet serialised
case VulkanChunk::vkResetCommandPool:
+4
View File
@@ -3024,4 +3024,8 @@ public:
VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR(VkDevice device, VkPipeline pipeline,
uint32_t group,
VkShaderGroupShaderKHR groupShader);
// VK_KHR_ray_tracing_maintenance1
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdTraceRaysIndirect2KHR, VkCommandBuffer commandBuffer,
VkDeviceAddress indirectDeviceAddress);
};
+7 -2
View File
@@ -544,7 +544,8 @@
DeclExt(EXT_subgroup_size_control); \
DeclExt(EXT_shader_subgroup_ballot); \
DeclExt(EXT_shader_subgroup_vote); \
DeclExt(KHR_shader_subgroup_uniform_control_flow);
DeclExt(KHR_shader_subgroup_uniform_control_flow); \
DeclExt(KHR_ray_tracing_maintenance1);
// for simplicity and since the check itself is platform agnostic,
// these aren't protected in platform defines
@@ -678,7 +679,8 @@
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);
CheckExt(KHR_shader_subgroup_uniform_control_flow, VKXX); \
CheckExt(KHR_ray_tracing_maintenance1, VKXX);
#define HookInitVulkanInstanceExts_PhysDev() \
HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \
@@ -1044,6 +1046,7 @@
HookInitExtension(KHR_ray_tracing_pipeline, GetRayTracingCaptureReplayShaderGroupHandlesKHR); \
HookInitExtension(KHR_ray_tracing_pipeline, GetRayTracingShaderGroupHandlesKHR); \
HookInitExtension(KHR_ray_tracing_pipeline, GetRayTracingShaderGroupStackSizeKHR); \
HookInitExtension(KHR_ray_tracing_maintenance1, CmdTraceRaysIndirect2KHR); \
HookInitExtension_Device_Win32(); \
HookInitExtension_Device_Linux(); \
HookInitExtension_Device_Android(); \
@@ -1949,6 +1952,8 @@
pipeline, uint32_t, group, VkShaderGroupShaderKHR, groupShader); \
HookDefine2(void, vkCmdSetRayTracingPipelineStackSizeKHR, VkCommandBuffer, commandBuffer, \
uint32_t, pipelineStackSize); \
HookDefine2(void, vkCmdTraceRaysIndirect2KHR, VkCommandBuffer, commandBuffer, VkDeviceAddress, \
indirectDeviceAddress); \
HookDefine_Win32(); \
HookDefine_Linux(); \
HookDefine_Android(); \
+2 -1
View File
@@ -416,6 +416,8 @@ 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_MAINTENANCE_1_FEATURES_KHR, \
VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, \
VkPhysicalDeviceRayTracingPipelineFeaturesKHR); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR, \
@@ -1139,7 +1141,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV: \
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_MAINTENANCE_1_FEATURES_KHR: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV: \
+22 -3
View File
@@ -1293,6 +1293,10 @@ SERIALISE_VK_HANDLES();
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, \
VkPhysicalDeviceRayQueryFeaturesKHR) \
\
/* VK_KHR_ray_tracing_maintenance1 */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, \
VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR) \
\
/* VK_KHR_ray_tracing_pipeline */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR, \
VkRayTracingPipelineCreateInfoKHR) \
@@ -1843,9 +1847,6 @@ SERIALISE_VK_HANDLES();
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DEVICE_PIPELINE_BINARY_INTERNAL_CACHE_CONTROL_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_BINARY_HANDLES_INFO_KHR) \
\
/* VK_KHR_ray_tracing_maintenance1 */ \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR) \
\
/* VK_KHR_video_decode_av1 */ \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_KHR) \
@@ -12579,6 +12580,23 @@ void DoSerialise(SerialiserType &ser, VkDeviceOrHostAddressKHR &el)
SERIALISE_MEMBER(deviceAddress);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(rayTracingMaintenance1);
SERIALISE_MEMBER(rayTracingPipelineTraceRaysIndirect2);
}
template <>
void Deserialise(const VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPhysicalDeviceRayQueryFeaturesKHR &el)
{
@@ -13054,6 +13072,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProvokingVertexPropertiesEXT);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePushDescriptorProperties);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayQueryFeaturesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelineFeaturesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingPipelinePropertiesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR);
+2 -1
View File
@@ -28,7 +28,7 @@
template <>
rdcstr DoStringise(const VulkanChunk &el)
{
RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1215, "Chunks changed without updating names");
RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1216, "Chunks changed without updating names");
BEGIN_ENUM_STRINGISE(VulkanChunk)
{
@@ -247,6 +247,7 @@ rdcstr DoStringise(const VulkanChunk &el)
STRINGISE_ENUM_CLASS(vkCreateRayTracingPipelinesKHR)
STRINGISE_ENUM_CLASS(vkCmdSetRenderingAttachmentLocationsKHR)
STRINGISE_ENUM_CLASS(vkCmdSetRenderingInputAttachmentIndicesKHR)
STRINGISE_ENUM_CLASS(vkCmdTraceRaysIndirect2KHR)
STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk");
}
END_ENUM_STRINGISE()
@@ -3436,6 +3436,14 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi
}
END_PHYS_EXT_CHECK();
BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR);
{
CHECK_PHYS_EXT_FEATURE(rayTracingMaintenance1);
CHECK_PHYS_EXT_FEATURE(rayTracingPipelineTraceRaysIndirect2);
}
END_PHYS_EXT_CHECK();
BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR);
{
@@ -5426,6 +5426,82 @@ void WrappedVulkan::vkCmdTraceRaysIndirectKHR(
}
}
template <typename SerialiserType>
bool WrappedVulkan::Serialise_vkCmdTraceRaysIndirect2KHR(SerialiserType &ser,
VkCommandBuffer commandBuffer,
VkDeviceAddress indirectDeviceAddress)
{
SERIALISE_ELEMENT(commandBuffer);
SERIALISE_ELEMENT(indirectDeviceAddress).Important();
Serialise_DebugMessages(ser);
SERIALISE_CHECK_READ_ERRORS();
if(IsReplayingAndReading())
{
m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer));
if(IsActiveReplaying(m_State))
{
if(InRerecordRange(m_LastCmdBufferID))
{
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::DispatchRay);
ObjDisp(commandBuffer)->CmdTraceRaysIndirect2KHR(Unwrap(commandBuffer), indirectDeviceAddress);
if(eventId && m_ActionCallback->PostDispatch(eventId, ActionFlags::DispatchRay, commandBuffer))
{
ObjDisp(commandBuffer)->CmdTraceRaysIndirect2KHR(Unwrap(commandBuffer), indirectDeviceAddress);
m_ActionCallback->PostRemisc(eventId, ActionFlags::Clear, commandBuffer);
}
}
}
else
{
ObjDisp(commandBuffer)->CmdTraceRaysIndirect2KHR(Unwrap(commandBuffer), indirectDeviceAddress);
{
AddEvent();
ActionDescription action;
action.flags = ActionFlags::DispatchRay | ActionFlags::Indirect;
AddAction(action);
}
}
}
return true;
}
void WrappedVulkan::vkCmdTraceRaysIndirect2KHR(VkCommandBuffer commandBuffer,
VkDeviceAddress indirectDeviceAddress)
{
SCOPED_DBG_SINK();
SERIALISE_TIME_CALL(
ObjDisp(commandBuffer)->CmdTraceRaysIndirect2KHR(Unwrap(commandBuffer), indirectDeviceAddress));
if(IsCaptureMode(m_State))
{
VkResourceRecord *record = GetRecord(commandBuffer);
CACHE_THREAD_SERIALISER();
ser.SetActionChunk();
SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdTraceRaysIndirect2KHR);
Serialise_vkCmdTraceRaysIndirect2KHR(ser, commandBuffer, indirectDeviceAddress);
record->AddChunk(scope.Get(&record->cmdInfo->alloc));
// all buffers referenced are BDA so they are already forcibly and pessimistically referenced
}
}
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdDraw, VkCommandBuffer commandBuffer, uint32_t vertexCount,
uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);
@@ -5547,3 +5623,5 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdTraceRaysIndirectKHR, VkCommandBuffer
const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
VkDeviceAddress indirectDeviceAddress);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdTraceRaysIndirect2KHR, VkCommandBuffer commandBuffer,
VkDeviceAddress indirectDeviceAddress);