From b33d5d1a98218596f235650f71dabc6ac637e580 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 29 Mar 2023 16:53:52 -0400 Subject: [PATCH] zink: generate flat_flags during shader creation Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 14 ++++++++++++++ src/gallium/drivers/zink/zink_program.c | 14 +------------- src/gallium/drivers/zink/zink_types.h | 1 + 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 7e818fe..7dddafc 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -4661,6 +4661,18 @@ fixup_io_locations(nir_shader *nir) return true; } +static uint32_t +zink_flat_flags(struct nir_shader *shader) +{ + uint32_t flat_flags = 0, c = 0; + nir_foreach_shader_in_variable(var, shader) { + if (var->data.interpolation == INTERP_MODE_FLAT) + flat_flags |= 1u << (c++); + } + + return flat_flags; +} + struct zink_shader * zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, const struct pipe_stream_output_info *so_info) @@ -4697,6 +4709,8 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, if (nir->info.stage < MESA_SHADER_FRAGMENT) have_psiz = check_psiz(nir); + if (nir->info.stage == MESA_SHADER_FRAGMENT) + ret->flat_flags = zink_flat_flags(nir); if (!gl_shader_stage_is_compute(nir->info.stage) && nir->info.separate_shader) NIR_PASS_V(nir, fixup_io_locations); diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 407f10d..5cc5882 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -2224,18 +2224,6 @@ zink_add_inline_uniform(nir_shader *shader, int offset) ++shader->info.num_inlinable_uniforms; } -static uint32_t -zink_flat_flags(struct nir_shader *shader) -{ - uint32_t flat_flags = 0, c = 0; - nir_foreach_shader_in_variable(var, shader) { - if (var->data.interpolation == INTERP_MODE_FLAT) - flat_flags |= 1u << (c++); - } - - return flat_flags; -} - static unsigned encode_lower_pv_mode(enum pipe_prim_type prim_type) { @@ -2353,7 +2341,7 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx) } ctx->base.set_inlinable_constants(&ctx->base, MESA_SHADER_GEOMETRY, 2, - (uint32_t []){zink_flat_flags(ctx->gfx_stages[MESA_SHADER_FRAGMENT]->nir), + (uint32_t []){ctx->gfx_stages[MESA_SHADER_FRAGMENT]->flat_flags, ctx->gfx_pipeline_state.dyn_state3.pv_last}); } else if (ctx->gfx_stages[MESA_SHADER_GEOMETRY] && ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.is_generated) diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 7379b90..4057f77 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -748,6 +748,7 @@ struct zink_shader { unsigned num_texel_buffers; uint32_t ubos_used; // bitfield of which ubo indices are used uint32_t ssbos_used; // bitfield of which ssbo indices are used + uint32_t flat_flags; bool bindless; bool can_inline; bool has_uniforms; -- 2.7.4