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)); }