diff --git a/src/gallium/drivers/panfrost/pan_assemble.c b/src/gallium/drivers/panfrost/pan_assemble.c index 6d55125c4ac..21141e930bd 100644 --- a/src/gallium/drivers/panfrost/pan_assemble.c +++ b/src/gallium/drivers/panfrost/pan_assemble.c @@ -69,6 +69,7 @@ panfrost_shader_compile(struct pipe_screen *pscreen, struct panfrost_compile_inputs inputs = { .gpu_id = dev->gpu_id, .shaderdb = !!(dev->debug & PAN_DBG_PRECOMPILE), + .fixed_sysval_ubo = -1, .fixed_varying_mask = state->key.fixed_varying_mask }; diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 787032cb1ba..4be5e533349 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -503,8 +503,9 @@ static bi_instr * bi_load_sysval_to(bi_builder *b, bi_index dest, int sysval, unsigned nr_components, unsigned offset) { - unsigned sysval_ubo = - MAX2(b->shader->inputs->sysval_ubo, b->shader->nir->info.num_ubos); + unsigned sysval_ubo = b->shader->inputs->fixed_sysval_ubo >= 0 ? + b->shader->inputs->fixed_sysval_ubo : + b->shader->nir->info.num_ubos; unsigned uniform = pan_lookup_sysval(b->shader->sysval_to_id, b->shader->info.sysvals, diff --git a/src/panfrost/bifrost/cmdline.c b/src/panfrost/bifrost/cmdline.c index e161da36970..2a11486cbed 100644 --- a/src/panfrost/bifrost/cmdline.c +++ b/src/panfrost/bifrost/cmdline.c @@ -193,6 +193,7 @@ compile_shader(int stages, char **files) struct panfrost_compile_inputs inputs = { .gpu_id = gpu_id, + .fixed_sysval_ubo = -1, }; struct pan_shader_info info = { 0 }; diff --git a/src/panfrost/lib/pan_blend.c b/src/panfrost/lib/pan_blend.c index efc7c6cf2fd..8c212a8457d 100644 --- a/src/panfrost/lib/pan_blend.c +++ b/src/panfrost/lib/pan_blend.c @@ -822,6 +822,7 @@ GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev, .is_blend = true, .blend.rt = shader->key.rt, .blend.nr_samples = key.nr_samples, + .fixed_sysval_ubo = -1, .rt_formats = { key.format }, }; @@ -834,6 +835,9 @@ GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev, GENX(pan_shader_compile)(nir, &inputs, &variant->binary, &info); + /* Blend shaders can't have sysvals */ + assert(info.sysvals.sysval_count == 0); + variant->work_reg_count = info.work_reg_count; #if PAN_ARCH <= 5 diff --git a/src/panfrost/lib/pan_blitter.c b/src/panfrost/lib/pan_blitter.c index b5428c5898d..4eb761342ff 100644 --- a/src/panfrost/lib/pan_blitter.c +++ b/src/panfrost/lib/pan_blitter.c @@ -604,6 +604,7 @@ pan_blitter_get_blit_shader(struct panfrost_device *dev, .gpu_id = dev->gpu_id, .is_blit = true, .no_idvs = true, + .fixed_sysval_ubo = -1, }; struct util_dynarray binary; @@ -619,6 +620,9 @@ pan_blitter_get_blit_shader(struct panfrost_device *dev, GENX(pan_shader_compile)(b.shader, &inputs, &binary, &shader->info); + /* Blit shaders shouldn't have sysvals */ + assert(shader->info.sysvals.sysval_count == 0); + shader->key = *key; shader->address = pan_pool_upload_aligned(dev->blitter.shaders.pool, diff --git a/src/panfrost/lib/pan_indirect_dispatch.c b/src/panfrost/lib/pan_indirect_dispatch.c index 604d69b185f..688bcb66e77 100644 --- a/src/panfrost/lib/pan_indirect_dispatch.c +++ b/src/panfrost/lib/pan_indirect_dispatch.c @@ -216,7 +216,10 @@ GENX(pan_indirect_dispatch_init)(struct panfrost_device *dev) nir_pop_if(&b, NULL); - struct panfrost_compile_inputs inputs = { .gpu_id = dev->gpu_id }; + struct panfrost_compile_inputs inputs = { + .gpu_id = dev->gpu_id, + .fixed_sysval_ubo = -1, + }; struct pan_shader_info shader_info; struct util_dynarray binary; diff --git a/src/panfrost/lib/pan_indirect_draw.c b/src/panfrost/lib/pan_indirect_draw.c index 71068cf128a..94793779397 100644 --- a/src/panfrost/lib/pan_indirect_draw.c +++ b/src/panfrost/lib/pan_indirect_draw.c @@ -1133,7 +1133,10 @@ create_indirect_draw_shader(struct panfrost_device *dev, else patch(&builder); - struct panfrost_compile_inputs inputs = { .gpu_id = dev->gpu_id }; + struct panfrost_compile_inputs inputs = { + .gpu_id = dev->gpu_id, + .fixed_sysval_ubo = -1, + }; struct pan_shader_info shader_info; struct util_dynarray binary; diff --git a/src/panfrost/lib/pan_shader.c b/src/panfrost/lib/pan_shader.c index 9e6eb5aca94..b8ebfc5bc12 100644 --- a/src/panfrost/lib/pan_shader.c +++ b/src/panfrost/lib/pan_shader.c @@ -312,10 +312,9 @@ GENX(pan_shader_compile)(nir_shader *s, info->outputs_written = s->info.outputs_written; /* Sysvals have dedicated UBO */ - if (info->sysvals.sysval_count) - info->ubo_count = MAX2(s->info.num_ubos + 1, inputs->sysval_ubo + 1); - else - info->ubo_count = s->info.num_ubos; + info->ubo_count = s->info.num_ubos; + if (info->sysvals.sysval_count && inputs->fixed_sysval_ubo < 0) + info->ubo_count++; info->attribute_count += BITSET_LAST_BIT(s->info.images_used); info->writes_global = s->info.writes_memory; diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 7f4f0ab35c8..d63bdfb85ce 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1575,8 +1575,9 @@ emit_sysval_read(compiler_context *ctx, nir_instr *instr, nir_dest nir_dest; /* Figure out which uniform this is */ - unsigned sysval_ubo = - MAX2(ctx->inputs->sysval_ubo, ctx->nir->info.num_ubos); + unsigned sysval_ubo = ctx->inputs->fixed_sysval_ubo >= 0 ? + ctx->inputs->fixed_sysval_ubo : + ctx->nir->info.num_ubos; int sysval = panfrost_sysval_for_instr(instr, &nir_dest); unsigned dest = nir_dest_index(&nir_dest); unsigned uniform = diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h index 3819e814272..77ed8d10b2b 100644 --- a/src/panfrost/util/pan_ir.h +++ b/src/panfrost/util/pan_ir.h @@ -181,7 +181,7 @@ struct panfrost_compile_inputs { unsigned nr_samples; uint64_t bifrost_blend_desc; } blend; - unsigned sysval_ubo; + int fixed_sysval_ubo; bool shaderdb; bool no_idvs; bool no_ubo_to_push; diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 0af64b26ebd..87b79fe8efe 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -345,7 +345,7 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, .gpu_id = pdev->gpu_id, .no_ubo_to_push = true, .no_idvs = true, /* TODO */ - .sysval_ubo = sysval_ubo, + .fixed_sysval_ubo = sysval_ubo, }; NIR_PASS_V(nir, nir_lower_indirect_derefs,