From e3274e9e1b5f5b8c65ce57df53396d1507aa3373 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Thu, 27 Jul 2023 10:52:17 -0700 Subject: [PATCH] freedreno/ir3: Move pvtmem per-fiber size alignment to the compiler. Instead of having tu and each fd backend do it. This will help me make some shared code on freedreno for pre-6xx pvtmem support. Part-of: --- src/freedreno/computerator/a6xx.cc | 2 +- src/freedreno/ir3/ir3_compiler.c | 3 +++ src/freedreno/ir3/ir3_compiler.h | 3 +++ src/freedreno/ir3/ir3_compiler_nir.c | 2 ++ src/freedreno/ir3/ir3_shader.h | 2 +- src/gallium/drivers/freedreno/a6xx/fd6_program.cc | 2 +- 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/freedreno/computerator/a6xx.cc b/src/freedreno/computerator/a6xx.cc index f8919a65b8d..ce6d01adf6f 100644 --- a/src/freedreno/computerator/a6xx.cc +++ b/src/freedreno/computerator/a6xx.cc @@ -215,7 +215,7 @@ cs_program_emit(struct fd_ringbuffer *ring, struct kernel *kernel) OUT_RELOC(ring, v->bo, 0, 0, 0); if (v->pvtmem_size > 0) { - uint32_t per_fiber_size = ALIGN(v->pvtmem_size, 512); + uint32_t per_fiber_size = v->pvtmem_size; uint32_t per_sp_size = ALIGN(per_fiber_size * a6xx_backend->info->a6xx.fibers_per_sp, 1 << 12); uint32_t total_size = per_sp_size * a6xx_backend->info->num_sp_cores; diff --git a/src/freedreno/ir3/ir3_compiler.c b/src/freedreno/ir3/ir3_compiler.c index 9bab3e24618..78269c19715 100644 --- a/src/freedreno/ir3/ir3_compiler.c +++ b/src/freedreno/ir3/ir3_compiler.c @@ -217,6 +217,9 @@ ir3_compiler_create(struct fd_device *dev, const struct fd_dev_id *dev_id, compiler->max_const_safe = 256; } + /* This is just a guess for a4xx. */ + compiler->pvtmem_per_fiber_align = compiler->gen >= 4 ? 512 : 128; + if (compiler->gen >= 6) { compiler->reg_size_vec4 = dev_info->a6xx.reg_size_vec4; } else if (compiler->gen >= 4) { diff --git a/src/freedreno/ir3/ir3_compiler.h b/src/freedreno/ir3/ir3_compiler.h index 1730fa40809..98b40dd049b 100644 --- a/src/freedreno/ir3/ir3_compiler.h +++ b/src/freedreno/ir3/ir3_compiler.h @@ -191,6 +191,9 @@ struct ir3_compiler { /* The number of total branch stack entries, divided by wave_granularity. */ uint32_t branchstack_size; + /* The byte increment of MEMSIZEPERITEM, the private memory per-fiber allocation. */ + uint32_t pvtmem_per_fiber_align; + /* Whether clip+cull distances are supported */ bool has_clip_cull; diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index d7a3700c10e..a6b2b1aef65 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -4990,6 +4990,8 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler, so->branchstack = ctx->max_stack; + so->pvtmem_size = ALIGN(so->pvtmem_size, compiler->pvtmem_per_fiber_align); + /* Note that max_bary counts inputs that are not bary.f'd for FS: */ if (so->type == MESA_SHADER_FRAGMENT) so->total_in = max_bary + 1; diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h index 4aa1422033b..8720056b82c 100644 --- a/src/freedreno/ir3/ir3_shader.h +++ b/src/freedreno/ir3/ir3_shader.h @@ -573,7 +573,7 @@ struct ir3_shader_variant { */ unsigned constlen; - /* The private memory size in bytes */ + /* The private memory size in bytes per fiber */ unsigned pvtmem_size; /* Whether we should use the new per-wave layout rather than per-fiber. */ bool pvtmem_per_wave; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.cc b/src/gallium/drivers/freedreno/a6xx/fd6_program.cc index f7d82c58427..af8033c7475 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_program.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.cc @@ -107,7 +107,7 @@ fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring, uint32_t fibers_per_sp = ctx->screen->info->a6xx.fibers_per_sp; uint32_t num_sp_cores = ctx->screen->info->num_sp_cores; - uint32_t per_fiber_size = ALIGN(so->pvtmem_size, 512); + uint32_t per_fiber_size = so->pvtmem_size; if (per_fiber_size > ctx->pvtmem[so->pvtmem_per_wave].per_fiber_size) { if (ctx->pvtmem[so->pvtmem_per_wave].bo) fd_bo_del(ctx->pvtmem[so->pvtmem_per_wave].bo);