radv/rt: Rework radv_GetRayTracingCaptureReplayShaderGroupHandlesKHR
authorFriedrich Vock <friedrich.vock@gmx.de>
Wed, 7 Jun 2023 07:54:50 +0000 (09:54 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 5 Jul 2023 15:58:25 +0000 (15:58 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23516>

src/amd/vulkan/radv_pipeline_rt.c

index e9d34f7..07164b7 100644 (file)
@@ -788,8 +788,24 @@ radv_GetRayTracingShaderGroupStackSizeKHR(VkDevice device, VkPipeline _pipeline,
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL
-radv_GetRayTracingCaptureReplayShaderGroupHandlesKHR(VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+radv_GetRayTracingCaptureReplayShaderGroupHandlesKHR(VkDevice device, VkPipeline _pipeline, uint32_t firstGroup,
                                                      uint32_t groupCount, size_t dataSize, void *pData)
 {
-   return radv_GetRayTracingShaderGroupHandlesKHR(device, pipeline, firstGroup, groupCount, dataSize, pData);
+   RADV_FROM_HANDLE(radv_pipeline, pipeline, _pipeline);
+   struct radv_ray_tracing_pipeline *rt_pipeline = radv_pipeline_to_ray_tracing(pipeline);
+   struct radv_rt_capture_replay_handle *data = pData;
+
+   memset(data, 0, groupCount * sizeof(struct radv_rt_capture_replay_handle));
+
+   for (uint32_t i = 0; i < groupCount; ++i) {
+      uint32_t recursive_shader = rt_pipeline->groups[firstGroup + i].recursive_shader;
+      if (recursive_shader != VK_SHADER_UNUSED_KHR) {
+         struct radv_shader *shader =
+            container_of(rt_pipeline->stages[recursive_shader].shader, struct radv_shader, base);
+         data[i].recursive_shader_alloc = radv_serialize_shader_arena_block(shader->alloc);
+      }
+      data[i].non_recursive_idx = rt_pipeline->groups[firstGroup + i].handle.any_hit_index;
+   }
+
+   return VK_SUCCESS;
 }