Module: Mesa
Branch: main
Commit: 0f87d406b58aa103ae67f3cc8a694c1343d8f8ed
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f87d406b58aa103ae67f3cc8a694c1343d8f8ed

Author: Konstantin Seurer <konstantin.seu...@gmail.com>
Date:   Tue Sep 12 17:15:40 2023 +0200

radv/rt: Skip compiling a traversal shader

If we don't need one, we don't compile one.

Reviewed-by: Friedrich Vock <friedrich.v...@gmx.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25224>

---

 src/amd/vulkan/radv_cmd_buffer.c  | 12 ++++++++----
 src/amd/vulkan/radv_pipeline_rt.c | 21 +++++++++++++++++----
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 81d553cf32f..38257ad1a00 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -6259,8 +6259,11 @@ radv_emit_compute_pipeline(struct radv_cmd_buffer 
*cmd_buffer, struct radv_compu
       radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, 
cmd_buffer->state.shaders[MESA_SHADER_COMPUTE]->bo);
    } else {
       radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, 
cmd_buffer->state.rt_prolog->bo);
-      radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs,
-                         
cmd_buffer->state.shaders[MESA_SHADER_INTERSECTION]->bo);
+
+      if (cmd_buffer->state.shaders[MESA_SHADER_INTERSECTION])
+         radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs,
+                            
cmd_buffer->state.shaders[MESA_SHADER_INTERSECTION]->bo);
+
       struct radv_ray_tracing_pipeline *rt_pipeline = 
radv_pipeline_to_ray_tracing(&pipeline->base);
       for (unsigned i = 0; i < rt_pipeline->stage_count; ++i) {
          if (!radv_ray_tracing_stage_is_compiled(&rt_pipeline->stages[i]))
@@ -10066,8 +10069,9 @@ radv_trace_rays(struct radv_cmd_buffer *cmd_buffer, 
VkTraceRaysIndirectCommand2K
    }
 
    const struct radv_userdata_info *shader_loc = radv_get_user_sgpr(rt_prolog, 
AC_UD_CS_TRAVERSAL_SHADER_ADDR);
-   if (shader_loc->sgpr_idx != -1) {
-      uint64_t traversal_va = 
cmd_buffer->state.shaders[MESA_SHADER_INTERSECTION]->va | 
radv_rt_priority_traversal;
+   struct radv_shader *traversal_shader = 
cmd_buffer->state.shaders[MESA_SHADER_INTERSECTION];
+   if (shader_loc->sgpr_idx != -1 && traversal_shader) {
+      uint64_t traversal_va = traversal_shader->va | 
radv_rt_priority_traversal;
       radv_emit_shader_pointer(cmd_buffer->device, cmd_buffer->cs, base_reg + 
shader_loc->sgpr_idx * 4, traversal_va,
                                true);
    }
diff --git a/src/amd/vulkan/radv_pipeline_rt.c 
b/src/amd/vulkan/radv_pipeline_rt.c
index e1b324f6d42..f2ec9a1a1ea 100644
--- a/src/amd/vulkan/radv_pipeline_rt.c
+++ b/src/amd/vulkan/radv_pipeline_rt.c
@@ -500,7 +500,9 @@ radv_rt_compile_shaders(struct radv_device *device, struct 
vk_pipeline_cache *ca
    if (!stages)
       return VK_ERROR_OUT_OF_HOST_MEMORY;
 
-   bool monolithic = !(pipeline->base.base.create_flags & 
VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR);
+   bool library = pipeline->base.base.create_flags & 
VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR;
+
+   bool monolithic = !library;
    for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
       if (rt_stages[i].shader || rt_stages[i].nir)
          continue;
@@ -519,9 +521,14 @@ radv_rt_compile_shaders(struct radv_device *device, struct 
vk_pipeline_cache *ca
    }
 
    bool has_callable = false;
+   /* TODO: Recompile recursive raygen shaders instead. */
+   bool raygen_imported = false;
    for (uint32_t i = 0; i < pipeline->stage_count; i++) {
       has_callable |= rt_stages[i].stage == MESA_SHADER_CALLABLE;
       monolithic &= rt_stages[i].can_inline;
+
+      if (i > pCreateInfo->stageCount)
+         raygen_imported |= rt_stages[i].stage == MESA_SHADER_RAYGEN;
    }
 
    for (uint32_t idx = 0; idx < pCreateInfo->stageCount; idx++) {
@@ -540,7 +547,6 @@ radv_rt_compile_shaders(struct radv_device *device, struct 
vk_pipeline_cache *ca
        *    - monolithic:       Callable shaders (chit/miss) are inlined into 
the raygen shader.
        */
       bool compiled = radv_ray_tracing_stage_is_compiled(&rt_stages[idx]);
-      bool library = pCreateInfo->flags & VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
       bool nir_needed =
          (library && !has_callable) || !compiled || (monolithic && 
rt_stages[idx].stage != MESA_SHADER_RAYGEN);
       nir_needed &= !rt_stages[idx].nir;
@@ -589,7 +595,11 @@ radv_rt_compile_shaders(struct radv_device *device, struct 
vk_pipeline_cache *ca
       }
    }
 
-   if (pipeline->base.base.create_flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR)
+   /* Monolithic raygen shaders do not need a traversal shader. Skip compiling 
one if there are only monolithic raygen
+    * shaders.
+    */
+   bool traversal_needed = !library && (!monolithic || raygen_imported);
+   if (!traversal_needed)
       return VK_SUCCESS;
 
    /* create traversal shader */
@@ -716,7 +726,10 @@ compile_rt_prolog(struct radv_device *device, struct 
radv_ray_tracing_pipeline *
          combine_config(config, &shader->config);
       }
    }
-   combine_config(config, 
&pipeline->base.base.shaders[MESA_SHADER_INTERSECTION]->config);
+
+   if (pipeline->base.base.shaders[MESA_SHADER_INTERSECTION])
+      combine_config(config, 
&pipeline->base.base.shaders[MESA_SHADER_INTERSECTION]->config);
+
    postprocess_rt_config(config, device->physical_device->rad_info.gfx_level, 
device->physical_device->rt_wave_size);
 }
 

Reply via email to