From 104206fb0ff7c3127ece566e547fe94850e21397 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Wed, 26 Nov 2025 16:17:38 +0200 Subject: [PATCH] vulkan/runtime: add an internal flag for independent sets Shader objects are by definition I think independents. But implementation like Anv would like to optimize dynamic descriptors if possible. It's possible if the sets are not independent. Signed-off-by: Lionel Landwerlin Acked-by: Alyssa Rosenzweig Part-of: --- src/vulkan/runtime/vk_pipeline.c | 36 ++++++++++++++++++++++-------- src/vulkan/runtime/vk_shader.c | 2 +- src/vulkan/util/vk_internal_exts.h | 1 + 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/vulkan/runtime/vk_pipeline.c b/src/vulkan/runtime/vk_pipeline.c index ab260b94492..9cafe0219ac 100644 --- a/src/vulkan/runtime/vk_pipeline.c +++ b/src/vulkan/runtime/vk_pipeline.c @@ -1215,7 +1215,8 @@ vk_graphics_pipeline_cmd_bind(struct vk_command_buffer *cmd_buffer, static VkShaderCreateFlagsEXT vk_pipeline_to_shader_flags(VkPipelineCreateFlags2KHR pipeline_flags, - mesa_shader_stage stage) + mesa_shader_stage stage, + struct vk_pipeline_layout *pipeline_layout) { VkShaderCreateFlagsEXT shader_flags = 0; @@ -1241,6 +1242,15 @@ vk_pipeline_to_shader_flags(VkPipelineCreateFlags2KHR pipeline_flags, shader_flags |= VK_SHADER_CREATE_UNALIGNED_DISPATCH_BIT_MESA; } + /* Independent sets has no impact on compute shaders since there is only + * ever one shader in the pipeline. + */ + if (stage != MESA_SHADER_COMPUTE && + pipeline_layout != NULL && + (pipeline_layout->create_flags & + VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT)) + shader_flags |= VK_SHADER_CREATE_INDEPENDENT_SETS_BIT_MESA; + return shader_flags; } @@ -1528,7 +1538,8 @@ vk_get_graphics_pipeline_compile_info(struct vk_graphics_pipeline_compile_info * sizeof(stage->precomp_key)); VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline_flags, stage->stage); + vk_pipeline_to_shader_flags(pipeline_flags, stage->stage, + pipeline_layout); _mesa_blake3_update(&blake3_ctx, &shader_flags, sizeof(shader_flags)); } @@ -1719,7 +1730,8 @@ vk_graphics_pipeline_compile_shaders(struct vk_device *device, struct vk_pipeline_stage *stage = &compile_info->stages[i]; VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline_flags, stage->stage); + vk_pipeline_to_shader_flags(pipeline_flags, stage->stage, + pipeline_layout); if (compile_info->partition[p + 1] - compile_info->partition[p] > 1) shader_flags |= VK_SHADER_CREATE_LINK_STAGE_BIT_EXT; @@ -2313,7 +2325,8 @@ vk_get_compute_pipeline_compile_info(struct vk_pipeline_stage *stage, vk_compute_pipeline_create_flags(pCreateInfo); const VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline_flags, MESA_SHADER_COMPUTE); + vk_pipeline_to_shader_flags(pipeline_flags, MESA_SHADER_COMPUTE, + pipeline_layout); vk_pipeline_hash_precomp_shader_stage(device, pipeline_flags, pCreateInfo->pNext, &pCreateInfo->stage, stage); @@ -2388,7 +2401,8 @@ vk_pipeline_compile_compute_stage(struct vk_device *device, get_push_range_for_stage(pipeline_layout, MESA_SHADER_COMPUTE); VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline->base.flags, MESA_SHADER_COMPUTE); + vk_pipeline_to_shader_flags(pipeline->base.flags, MESA_SHADER_COMPUTE, + pipeline_layout); /* vk_device_shader_ops::compile() consumes the NIR regardless of whether * or not it succeeds and only generates shaders on success. Once compile() @@ -2810,7 +2824,8 @@ vk_pipeline_hash_rt_shader(struct vk_device *device, sizeof(stage->stage)); VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline_flags, stage->stage); + vk_pipeline_to_shader_flags(pipeline_flags, stage->stage, + pipeline_layout); hash_rt_parameters(&blake3_ctx, shader_flags, pipeline_flags, @@ -2857,7 +2872,8 @@ vk_pipeline_rehash_rt_linked_shaders(struct vk_device *device, get_push_range_for_stage(pipeline_layout, stages[i].stage); VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline_flags, stages[i].stage); + vk_pipeline_to_shader_flags(pipeline_flags, stages[i].stage, + pipeline_layout); hash_rt_parameters(&blake3_ctx, shader_flags, pipeline_flags, push_range, pipeline_layout); @@ -3170,7 +3186,8 @@ vk_pipeline_compile_rt_shader(struct vk_device *device, get_push_range_for_stage(pipeline_layout, stage->stage); VkShaderCreateFlagsEXT shader_flags = - vk_pipeline_to_shader_flags(pipeline_flags, stage->stage); + vk_pipeline_to_shader_flags(pipeline_flags, stage->stage, + pipeline_layout); /* vk_device_shader_ops::compile() consumes the NIR regardless of * whether or not it succeeds and only generates shaders on success. @@ -3288,7 +3305,8 @@ vk_pipeline_compile_rt_shader_group(struct vk_device *device, compile_info[i] = (struct vk_shader_compile_info) { .stage = stages[i].stage, .flags = vk_pipeline_to_shader_flags(pipeline_flags, - stages[i].stage), + stages[i].stage, + pipeline_layout), .rt_flags = pipeline_flags & MESA_VK_PIPELINE_RAY_TRACING_FLAGS, .next_stage_mask = 0, .nir = vk_pipeline_precomp_shader_get_nir(precomp, nir_options), diff --git a/src/vulkan/runtime/vk_shader.c b/src/vulkan/runtime/vk_shader.c index 755dec5232d..812d6496de1 100644 --- a/src/vulkan/runtime/vk_shader.c +++ b/src/vulkan/runtime/vk_shader.c @@ -295,7 +295,7 @@ vk_shader_compile_info_init(struct vk_shader_compile_info *info, *info = (struct vk_shader_compile_info) { .stage = nir->info.stage, - .flags = vk_info->flags, + .flags = vk_info->flags | VK_SHADER_CREATE_INDEPENDENT_SETS_BIT_MESA, .next_stage_mask = vk_info->nextStage, .nir = nir, .robustness = rs, diff --git a/src/vulkan/util/vk_internal_exts.h b/src/vulkan/util/vk_internal_exts.h index d2bc167e1e3..497d28bd40b 100644 --- a/src/vulkan/util/vk_internal_exts.h +++ b/src/vulkan/util/vk_internal_exts.h @@ -145,6 +145,7 @@ static const VkPipelineCreateFlagBits2 #define VK_SHADER_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_MESA 0x1000 #define VK_SHADER_CREATE_UNALIGNED_DISPATCH_BIT_MESA 0x2000 +#define VK_SHADER_CREATE_INDEPENDENT_SETS_BIT_MESA 0x4000 #ifdef __cplusplus }