diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 4be5e533349..2590014f891 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -4961,7 +4961,10 @@ bifrost_compile_shader_nir(nir_shader *nir, bifrost_debug = debug_get_option_bifrost_debug(); bi_finalize_nir(nir, inputs->gpu_id, inputs->is_blend); - struct hash_table_u64 *sysval_to_id = panfrost_init_sysvals(&info->sysvals, NULL); + struct hash_table_u64 *sysval_to_id = + panfrost_init_sysvals(&info->sysvals, + inputs->fixed_sysval_layout, + NULL); info->tls_size = nir->scratch_size; info->vs.idvs = bi_should_idvs(nir, inputs); diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index d63bdfb85ce..cf2120b731d 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -3127,7 +3127,9 @@ midgard_compile_shader_nir(nir_shader *nir, /* TODO: Bound against what? */ compiler_context *ctx = rzalloc(NULL, compiler_context); - ctx->sysval_to_id = panfrost_init_sysvals(&info->sysvals, ctx); + ctx->sysval_to_id = panfrost_init_sysvals(&info->sysvals, + inputs->fixed_sysval_layout, + ctx); ctx->inputs = inputs; ctx->nir = nir; diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h index 77ed8d10b2b..19fcaa52a6a 100644 --- a/src/panfrost/util/pan_ir.h +++ b/src/panfrost/util/pan_ir.h @@ -163,7 +163,9 @@ unsigned pan_lookup_pushed_ubo(struct panfrost_ubo_push *push, unsigned ubo, unsigned offs); struct hash_table_u64 * -panfrost_init_sysvals(struct panfrost_sysvals *sysvals, void *memctx); +panfrost_init_sysvals(struct panfrost_sysvals *sysvals, + struct panfrost_sysvals *fixed_sysvals, + void *memctx); unsigned pan_lookup_sysval(struct hash_table_u64 *sysval_to_id, @@ -182,6 +184,7 @@ struct panfrost_compile_inputs { uint64_t bifrost_blend_desc; } blend; int fixed_sysval_ubo; + struct panfrost_sysvals *fixed_sysval_layout; bool shaderdb; bool no_idvs; bool no_ubo_to_push; diff --git a/src/panfrost/util/pan_sysval.c b/src/panfrost/util/pan_sysval.c index 07f502635fa..e5b0a5fa325 100644 --- a/src/panfrost/util/pan_sysval.c +++ b/src/panfrost/util/pan_sysval.c @@ -134,6 +134,17 @@ panfrost_sysval_for_instr(nir_instr *instr, nir_dest *dest) return sysval; } +static unsigned +pan_add_sysval(struct hash_table_u64 *sysval_to_id, + struct panfrost_sysvals *sysvals, + int sysval, unsigned id) +{ + assert(id < MAX_SYSVAL_COUNT); + _mesa_hash_table_u64_insert(sysval_to_id, sysval, (void *) ((uintptr_t) id + 1)); + sysvals->sysvals[id] = sysval; + return id; +} + unsigned pan_lookup_sysval(struct hash_table_u64 *sysval_to_id, struct panfrost_sysvals *sysvals, @@ -151,18 +162,29 @@ pan_lookup_sysval(struct hash_table_u64 *sysval_to_id, } /* Else assign */ - - unsigned id = sysvals->sysval_count++; - assert(id < MAX_SYSVAL_COUNT); - _mesa_hash_table_u64_insert(sysval_to_id, sysval, (void *) ((uintptr_t) id + 1)); - sysvals->sysvals[id] = sysval; - - return id; + return pan_add_sysval(sysval_to_id, sysvals, sysval, + sysvals->sysval_count++); } struct hash_table_u64 * -panfrost_init_sysvals(struct panfrost_sysvals *sysvals, void *memctx) +panfrost_init_sysvals(struct panfrost_sysvals *sysvals, + struct panfrost_sysvals *fixed_sysvals, + void *memctx) { - sysvals->sysval_count = 0; - return _mesa_hash_table_u64_create(memctx); + memset(sysvals, 0, sizeof(*sysvals)); + struct hash_table_u64 *sysval_to_id = + _mesa_hash_table_u64_create(memctx); + + if (fixed_sysvals) { + for (unsigned i = 0; i < fixed_sysvals->sysval_count; i++) { + if (!fixed_sysvals->sysvals[i]) + continue; + + pan_add_sysval(sysval_to_id, sysvals, + fixed_sysvals->sysvals[i], i); + } + sysvals->sysval_count = fixed_sysvals->sysval_count; + } + + return sysval_to_id; }