From: Mike Blumenkrantz Date: Wed, 29 Mar 2023 20:53:52 +0000 (-0400) Subject: zink: generate flat_flags during shader creation X-Git-Tag: upstream/23.3.3~10565 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b33d5d1a98218596f235650f71dabc6ac637e580;p=platform%2Fupstream%2Fmesa.git zink: generate flat_flags during shader creation Part-of: --- 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;