From d56d35aa76c3b630b6b164703b0de07b554a5d2c Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Fri, 3 Apr 2026 08:18:08 +0200 Subject: [PATCH] nir/opt_varyings_bulk: add data parameter to optimize callback Signed-off-by: Job Noorman Reviewed-by: Emma Anholt Part-of: --- src/asahi/vulkan/hk_shader.c | 4 ++-- src/compiler/glsl/gl_nir_linker.c | 8 +++++++- src/compiler/nir/nir.h | 3 ++- src/compiler/nir/nir_opt_varyings.c | 16 +++++++++------- src/kosmickrisp/vulkan/kk_shader.c | 6 +++--- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/asahi/vulkan/hk_shader.c b/src/asahi/vulkan/hk_shader.c index a164e9c91d2..3bd09b28683 100644 --- a/src/asahi/vulkan/hk_shader.c +++ b/src/asahi/vulkan/hk_shader.c @@ -1499,7 +1499,7 @@ hk_compile_shader(struct hk_device *dev, struct vk_shader_compile_info *info, } static void -nir_opts(nir_shader *nir) +nir_opts(nir_shader *nir, void *data) { bool progress; @@ -1566,7 +1566,7 @@ hk_compile_shaders(struct vk_device *vk_dev, uint32_t shader_count, } nir_opt_varyings_bulk(shaders, shader_count, true, UINT32_MAX, UINT32_MAX, - nir_opts); + nir_opts, NULL); for (uint32_t i = 0; i < shader_count; i++) { VkResult result = diff --git a/src/compiler/glsl/gl_nir_linker.c b/src/compiler/glsl/gl_nir_linker.c index 9280a1f3186..7768c823609 100644 --- a/src/compiler/glsl/gl_nir_linker.c +++ b/src/compiler/glsl/gl_nir_linker.c @@ -1460,6 +1460,12 @@ prelink_lowering(const struct pipe_screen *screen, return true; } +static void +optimize_varyings_opts(nir_shader *nir, void *data) +{ + gl_nir_opts(nir); +} + /** * Lower load_deref and store_deref on input/output variables to load_input * and store_output intrinsics, and perform varying optimizations and @@ -1511,7 +1517,7 @@ gl_nir_lower_optimize_varyings(const struct gl_constants *consts, return; nir_opt_varyings_bulk(shaders, num_shaders, spirv, max_uniform_comps, - max_ubos, gl_nir_opts); + max_ubos, optimize_varyings_opts, NULL); } bool diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 27029fa84be..e666695ed05 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -5370,7 +5370,8 @@ nir_varying_var_mask(nir_shader *nir); void nir_opt_varyings_bulk(nir_shader **shaders, uint32_t num_shaders, bool spirv, unsigned max_uniform_comps, unsigned max_ubos, - void (*optimize)(nir_shader *)); + void (*optimize)(nir_shader *, void *), + void *optimize_data); bool nir_slot_is_sysval_output(gl_varying_slot slot, mesa_shader_stage next_shader); diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c index cdcf85c1e39..07b2f565600 100644 --- a/src/compiler/nir/nir_opt_varyings.c +++ b/src/compiler/nir/nir_opt_varyings.c @@ -5470,16 +5470,16 @@ nir_varying_var_mask(nir_shader *nir) static nir_opt_varyings_progress optimize_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, unsigned max_uniform_comps, unsigned max_ubos, - void (*optimize)(nir_shader *)) + void (*optimize)(nir_shader *, void *), void *optimize_data) { nir_opt_varyings_progress progress = nir_opt_varyings(producer, consumer, spirv, max_uniform_comps, max_ubos, false); if (progress & nir_progress_producer) - optimize(producer); + optimize(producer, optimize_data); if (progress & nir_progress_consumer) - optimize(consumer); + optimize(consumer, optimize_data); return progress; } @@ -5493,7 +5493,8 @@ optimize_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, void nir_opt_varyings_bulk(nir_shader **shaders, uint32_t num_shaders, bool spirv, unsigned max_uniform_comps, unsigned max_ubos, - void (*optimize)(nir_shader *)) + void (*optimize)(nir_shader *, void *), + void *optimize_data) { /* There is nothing to link for only 1 shader. */ if (num_shaders == 1) { @@ -5537,7 +5538,7 @@ nir_opt_varyings_bulk(nir_shader **shaders, uint32_t num_shaders, bool spirv, NULL, NULL); /* nir_opt_varyings requires shaders to be optimized. */ - optimize(nir); + optimize(nir, optimize_data); } /* Optimize varyings from the first shader to the last shader first, and @@ -5556,7 +5557,8 @@ nir_opt_varyings_bulk(nir_shader **shaders, uint32_t num_shaders, bool spirv, unsigned highest_changed_producer = 0; for (unsigned i = 0; i < num_shaders - 1; i++) { if (optimize_varyings(shaders[i], shaders[i + 1], spirv, - max_uniform_comps, max_ubos, optimize) & + max_uniform_comps, max_ubos, optimize, + optimize_data) & nir_progress_producer) highest_changed_producer = i; } @@ -5566,7 +5568,7 @@ nir_opt_varyings_bulk(nir_shader **shaders, uint32_t num_shaders, bool spirv, */ for (unsigned i = highest_changed_producer; i > 0; i--) { optimize_varyings(shaders[i - 1], shaders[i], spirv, max_uniform_comps, - max_ubos, optimize); + max_ubos, optimize, optimize_data); } /* Final cleanups. */ diff --git a/src/kosmickrisp/vulkan/kk_shader.c b/src/kosmickrisp/vulkan/kk_shader.c index f34c2cc7d11..15c3711d6ab 100644 --- a/src/kosmickrisp/vulkan/kk_shader.c +++ b/src/kosmickrisp/vulkan/kk_shader.c @@ -751,7 +751,7 @@ kk_compile_nir_shader(struct kk_device *dev, nir_shader *nir, } static void -nir_opts(nir_shader *nir) +nir_opts(nir_shader *nir, void *data) { bool progress; @@ -1134,12 +1134,12 @@ kk_compile_shaders(struct vk_device *device, uint32_t shader_count, uint32_t total_shaders = null_fs ? shader_count + 1 : shader_count; nir_opt_varyings_bulk(shaders, total_shaders, true, UINT32_MAX, UINT32_MAX, - nir_opts); + nir_opts, NULL); /* Second pass is required because some dEQP-VK.glsl.matrix.sub.dynamic.* * would fail otherwise due to vertex outputting vec4 while fragments reading * vec3 when in reality only vec3 is needed. */ nir_opt_varyings_bulk(shaders, total_shaders, true, UINT32_MAX, UINT32_MAX, - nir_opts); + nir_opts, NULL); for (uint32_t i = 0; i < shader_count; i++) { result =