nir/opt_varyings_bulk: add data parameter to optimize callback

Signed-off-by: Job Noorman <jnoorman@igalia.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40651>
This commit is contained in:
Job Noorman 2026-04-03 08:18:08 +02:00
parent 27b56314ee
commit d56d35aa76
5 changed files with 23 additions and 14 deletions

View file

@ -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 =

View file

@ -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

View file

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

View file

@ -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. */

View file

@ -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 =