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

Author: Konstantin Seurer <konstantin.seu...@gmail.com>
Date:   Mon Sep 11 22:00:16 2023 +0200

radv: Add more ray tracing data to the cache

This makes the cache more flexible when it comes to missing stages. This
will be used to skip compiling unused ray tracing stages.

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

---

 src/amd/vulkan/radv_pipeline_cache.c | 37 +++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/src/amd/vulkan/radv_pipeline_cache.c 
b/src/amd/vulkan/radv_pipeline_cache.c
index 4d04f8b2c20..a3fe626531c 100644
--- a/src/amd/vulkan/radv_pipeline_cache.c
+++ b/src/amd/vulkan/radv_pipeline_cache.c
@@ -407,6 +407,16 @@ radv_pipeline_cache_insert(struct radv_device *device, 
struct vk_pipeline_cache
    pipeline->cache_object = vk_pipeline_cache_add_object(cache, 
&pipeline_obj->base);
 }
 
+struct radv_ray_tracing_stage_cache_data {
+   uint32_t stack_size : 31;
+   uint32_t has_shader : 1;
+};
+
+struct radv_ray_tracing_pipeline_cache_data {
+   uint32_t has_traversal_shader : 1;
+   struct radv_ray_tracing_stage_cache_data stages[];
+};
+
 bool
 radv_ray_tracing_pipeline_cache_search(struct radv_device *device, struct 
vk_pipeline_cache *cache,
                                        struct radv_ray_tracing_pipeline 
*pipeline,
@@ -426,19 +436,19 @@ radv_ray_tracing_pipeline_cache_search(struct radv_device 
*device, struct vk_pip
       return false;
 
    struct radv_pipeline_cache_object *pipeline_obj = container_of(object, 
struct radv_pipeline_cache_object, base);
+   struct radv_ray_tracing_pipeline_cache_data *data = pipeline_obj->data;
 
    bool is_library = pipeline->base.base.create_flags & 
VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR;
    bool complete = true;
    unsigned idx = 0;
 
-   if (!is_library)
+   if (data->has_traversal_shader)
       pipeline->base.base.shaders[MESA_SHADER_INTERSECTION] = 
radv_shader_ref(pipeline_obj->shaders[idx++]);
 
-   uint32_t *stack_sizes = pipeline_obj->data;
    for (unsigned i = 0; i < pCreateInfo->stageCount; i++) {
-      pipeline->stages[i].stack_size = stack_sizes[i];
+      pipeline->stages[i].stack_size = data->stages[i].stack_size;
 
-      if (radv_ray_tracing_stage_is_compiled(&pipeline->stages[i]))
+      if (data->stages[i].has_shader)
          pipeline->stages[i].shader = 
&radv_shader_ref(pipeline_obj->shaders[idx++])->base;
 
       if (is_library) {
@@ -448,7 +458,6 @@ radv_ray_tracing_pipeline_cache_search(struct radv_device 
*device, struct vk_pip
    }
 
    assert(idx == pipeline_obj->num_shaders);
-   assert(pCreateInfo->stageCount == pipeline_obj->data_size / 
sizeof(uint32_t));
 
    if (cache_hit && cache != device->mem_cache) {
       const VkPipelineCreationFeedbackCreateInfo *creation_feedback =
@@ -483,20 +492,26 @@ radv_ray_tracing_pipeline_cache_insert(struct radv_device 
*device, struct vk_pip
    /* Count compiled shaders excl. library shaders */
    unsigned num_shaders = 
pipeline->base.base.shaders[MESA_SHADER_INTERSECTION] ? 1 : 0;
    for (unsigned i = 0; i < num_stages; ++i)
-      num_shaders += radv_ray_tracing_stage_is_compiled(&pipeline->stages[i]) 
? 1 : 0;
+      num_shaders += pipeline->stages[i].shader ? 1 : 0;
+
+   uint32_t data_size = sizeof(struct radv_ray_tracing_pipeline_cache_data) +
+                        num_stages * sizeof(struct 
radv_ray_tracing_stage_cache_data);
 
    struct radv_pipeline_cache_object *pipeline_obj =
-      radv_pipeline_cache_object_create(&device->vk, num_shaders, sha1, 
num_stages * sizeof(uint32_t));
+      radv_pipeline_cache_object_create(&device->vk, num_shaders, sha1, 
data_size);
+   struct radv_ray_tracing_pipeline_cache_data *data = pipeline_obj->data;
+
+   data->has_traversal_shader = 
!!pipeline->base.base.shaders[MESA_SHADER_INTERSECTION];
 
    unsigned idx = 0;
-   if (pipeline->base.base.shaders[MESA_SHADER_INTERSECTION])
+   if (data->has_traversal_shader)
       pipeline_obj->shaders[idx++] = 
radv_shader_ref(pipeline->base.base.shaders[MESA_SHADER_INTERSECTION]);
 
-   uint32_t *stack_sizes = pipeline_obj->data;
    for (unsigned i = 0; i < num_stages; ++i) {
-      stack_sizes[i] = pipeline->stages[i].stack_size;
+      data->stages[i].stack_size = pipeline->stages[i].stack_size;
+      data->stages[i].has_shader = !!pipeline->stages[i].shader;
 
-      if (radv_ray_tracing_stage_is_compiled(&pipeline->stages[i]))
+      if (pipeline->stages[i].shader)
          pipeline_obj->shaders[idx++] =
             radv_shader_ref(container_of(pipeline->stages[i].shader, struct 
radv_shader, base));
    }

Reply via email to