diff --git a/src/freedreno/computerator/a6xx.c b/src/freedreno/computerator/a6xx.c index 0dc103816f7..67104a6db71 100644 --- a/src/freedreno/computerator/a6xx.c +++ b/src/freedreno/computerator/a6xx.c @@ -29,6 +29,8 @@ #include "adreno_common.xml.h" #include "a6xx.xml.h" +#include "common/freedreno_dev_info.h" + #include "ir3_asm.h" #include "main.h" @@ -38,6 +40,8 @@ struct a6xx_backend { struct ir3_compiler *compiler; struct fd_device *dev; + const struct fd_dev_info *info; + unsigned seqno; struct fd_bo *control_mem; @@ -109,6 +113,7 @@ static void cs_program_emit(struct fd_ringbuffer *ring, struct kernel *kernel) { struct ir3_kernel *ir3_kernel = to_ir3_kernel(kernel); + struct a6xx_backend *a6xx_backend = to_a6xx_backend(ir3_kernel->backend); struct ir3_shader_variant *v = ir3_kernel->v; const struct ir3_info *i = &v->info; enum a6xx_threadsize thrsz = i->double_threadsize ? THREAD128 : THREAD64; @@ -182,6 +187,24 @@ cs_program_emit(struct fd_ringbuffer *ring, struct kernel *kernel) CP_LOAD_STATE6_0_STATE_BLOCK(SB6_CS_SHADER) | CP_LOAD_STATE6_0_NUM_UNIT(v->instrlen)); 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_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; + + struct fd_bo *pvtmem = fd_bo_new(a6xx_backend->dev, total_size, 0, "pvtmem"); + OUT_PKT4(ring, REG_A6XX_SP_CS_PVT_MEM_PARAM, 4); + OUT_RING(ring, A6XX_SP_CS_PVT_MEM_PARAM_MEMSIZEPERITEM(per_fiber_size)); + OUT_RELOC(ring, pvtmem, 0, 0, 0); + OUT_RING(ring, A6XX_SP_CS_PVT_MEM_SIZE_TOTALPVTMEMSIZE(per_sp_size) | + COND(v->pvtmem_per_wave, + A6XX_SP_CS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT)); + + OUT_PKT4(ring, REG_A6XX_SP_CS_PVT_MEM_HW_STACK_OFFSET, 1); + OUT_RING(ring, A6XX_SP_CS_PVT_MEM_HW_STACK_OFFSET_OFFSET(per_sp_size)); + } } static void @@ -499,6 +522,8 @@ a6xx_init(struct fd_device *dev, const struct fd_dev_id *dev_id) a6xx_backend->compiler = ir3_compiler_create(dev, dev_id, false); a6xx_backend->dev = dev; + a6xx_backend->info = fd_dev_info(dev_id); + a6xx_backend->control_mem = fd_bo_new(dev, 0x1000, 0, "control"); diff --git a/src/freedreno/computerator/examples/pvtmem.asm b/src/freedreno/computerator/examples/pvtmem.asm new file mode 100644 index 00000000000..15b493d8be5 --- /dev/null +++ b/src/freedreno/computerator/examples/pvtmem.asm @@ -0,0 +1,14 @@ +@localsize 1, 1, 1 +@buf 4 ; g[0] +@pvtmem 4 +mov.u32u32 r1.x, 0x12345678 +mov.u32u32 r0.x, 0 +(rpt5)nop +stp.u32 p[r0.x + 0], r1.x, 1 +ldp.u32 r0.x, p[r0.x + 0], 1 +mov.u32u32 r0.y, 0x00000000 +(sy)(rpt5)nop +stib.b.untyped.1d.u32.1.imm r0.x, r0.y, 0 +end +nop + diff --git a/src/freedreno/computerator/meson.build b/src/freedreno/computerator/meson.build index b320426e3d8..41b9eb8d813 100644 --- a/src/freedreno/computerator/meson.build +++ b/src/freedreno/computerator/meson.build @@ -42,6 +42,7 @@ computerator = executable( libfreedreno_drm, libfreedreno_ir3, libfreedreno_perfcntrs, + libfreedreno_common, ], dependencies : [ dep_libdrm, diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index cdee9ab9c26..2d5582e5bda 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -116,6 +116,7 @@ static int parse_w(const char *str) "@in" return TOKEN(T_A_IN); "@out" return TOKEN(T_A_OUT); "@tex" return TOKEN(T_A_TEX); +"@pvtmem" return TOKEN(T_A_PVTMEM); "(sy)" return TOKEN(T_SY); "(ss)" return TOKEN(T_SS); "(absneg)" return TOKEN(T_ABSNEG); diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 9f16bed739d..81e7620272a 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -333,6 +333,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_A_IN %token T_A_OUT %token T_A_TEX +%token T_A_PVTMEM /* todo, re-add @sampler/@uniform/@varying if needed someday */ /* src register flags */ @@ -655,6 +656,7 @@ header: localsize_header | in_header | out_header | tex_header +| pvtmem_header const_val: T_FLOAT { $$ = fui($1); } | T_INT { $$ = $1; } @@ -710,6 +712,8 @@ numwg_header: T_A_NUMWG '(' T_CONSTANT ')' { branchstack_header: T_A_BRANCHSTACK const_val { variant->branchstack = $2; } +pvtmem_header: T_A_PVTMEM const_val { variant->pvtmem_size = $2; } + /* Stubs for now */ in_header: T_A_IN '(' T_REGISTER ')' T_IDENTIFIER '(' T_IDENTIFIER '=' integer ')' { }