diff --git a/docs/features.txt b/docs/features.txt index ade6b8ac1a9..679dc80ec3c 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -557,7 +557,7 @@ Khronos extensions that are not part of any Vulkan version: VK_KHR_pipeline_library DONE (anv, lvp, nvk, panvk, radv, tu, vn) VK_KHR_present_wait DONE (anv, nvk, radv, tu, x11/display) VK_KHR_ray_query DONE (anv/gfx12.5+, lvp, radv/gfx10.3+, tu/a740+, vn) - VK_KHR_ray_tracing_maintenance1 DONE (anv/gfx12.5+, radv/gfx10.3+, tu/a740+) + VK_KHR_ray_tracing_maintenance1 DONE (anv/gfx12.5+, radv/gfx10.3+, tu/a740+, vn) VK_KHR_ray_tracing_pipeline DONE (anv/gfx12.5+, lvp, radv/gfx10.3+, vn) VK_KHR_ray_tracing_position_fetch DONE (anv, radv/gfx10.3+, vn) VK_KHR_shader_clock DONE (anv, hasvk, lvp, nvk, radv, vn) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 87889129c2c..8c6da7a556e 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -2810,3 +2810,11 @@ vn_CmdTraceRaysKHR( pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth); } + +void +vn_CmdTraceRaysIndirect2KHR(VkCommandBuffer commandBuffer, + VkDeviceAddress indirectDeviceAddress) +{ + VN_CMD_ENQUEUE(vkCmdTraceRaysIndirect2KHR, commandBuffer, + indirectDeviceAddress); +} diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c index 651d36c0794..e1c968f23dd 100644 --- a/src/virtio/vulkan/vn_physical_device.c +++ b/src/virtio/vulkan/vn_physical_device.c @@ -160,6 +160,8 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev) fragment_shader_barycentric; VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragment_shading_rate; VkPhysicalDeviceRayQueryFeaturesKHR ray_query; + VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR + ray_tracing_maintenance_1; VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline; VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR ray_tracing_position_fetch; @@ -306,6 +308,7 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev) VN_ADD_PNEXT_EXT(feats2, FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, local_feats.fragment_shader_barycentric, exts->KHR_fragment_shader_barycentric); VN_ADD_PNEXT_EXT(feats2, FRAGMENT_SHADING_RATE_FEATURES_KHR, local_feats.fragment_shading_rate, exts->KHR_fragment_shading_rate); VN_ADD_PNEXT_EXT(feats2, RAY_QUERY_FEATURES_KHR, local_feats.ray_query, exts->KHR_ray_query); + VN_ADD_PNEXT_EXT(feats2, RAY_TRACING_MAINTENANCE_1_FEATURES_KHR, local_feats.ray_tracing_maintenance_1, exts->KHR_ray_tracing_maintenance1); VN_ADD_PNEXT_EXT(feats2, RAY_TRACING_PIPELINE_FEATURES_KHR, local_feats.ray_tracing_pipeline, exts->KHR_ray_tracing_pipeline); VN_ADD_PNEXT_EXT(feats2, RAY_TRACING_POSITION_FETCH_FEATURES_KHR, local_feats.ray_tracing_position_fetch, exts->KHR_ray_tracing_position_fetch); VN_ADD_PNEXT_EXT(feats2, SHADER_CLOCK_FEATURES_KHR, local_feats.shader_clock, exts->KHR_shader_clock); @@ -1241,6 +1244,7 @@ vn_physical_device_get_passthrough_extensions( .KHR_fragment_shading_rate = true, .KHR_pipeline_library = true, .KHR_ray_query = physical_dev->ray_tracing, + .KHR_ray_tracing_maintenance1 = physical_dev->ray_tracing, .KHR_ray_tracing_pipeline = physical_dev->ray_tracing, .KHR_ray_tracing_position_fetch = physical_dev->ray_tracing, .KHR_shader_clock = true, diff --git a/src/virtio/vulkan/vn_query_pool.c b/src/virtio/vulkan/vn_query_pool.c index 30d63dfc429..362f4bb8b26 100644 --- a/src/virtio/vulkan/vn_query_pool.c +++ b/src/virtio/vulkan/vn_query_pool.c @@ -93,6 +93,20 @@ vn_CreateQueryPool(VkDevice device, */ pool->result_array_size = 1; break; + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: + /* + * The VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR is to query the + * acceleration structure size on the device timeline. + * + * SERIALIZATION_BOTTOM_LEVEL_POINTERS is to query the number of bottom + * level acceleration structure pointers for serialization. + * + * So either of these queries only writes one integer value. + * + */ + pool->result_array_size = 1; + break; default: unreachable("bad query type"); break;