freedreno/computerator: Add support for pvtmem

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11876>
This commit is contained in:
Connor Abbott
2021-07-14 13:42:02 +02:00
committed by Marge Bot
parent b16587c14c
commit 1963a61faa
5 changed files with 45 additions and 0 deletions
+25
View File
@@ -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");
@@ -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
+1
View File
@@ -42,6 +42,7 @@ computerator = executable(
libfreedreno_drm,
libfreedreno_ir3,
libfreedreno_perfcntrs,
libfreedreno_common,
],
dependencies : [
dep_libdrm,
+1
View File
@@ -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);
+4
View File
@@ -333,6 +333,7 @@ static void print_token(FILE *file, int type, YYSTYPE value)
%token <tok> T_A_IN
%token <tok> T_A_OUT
%token <tok> T_A_TEX
%token <tok> 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 ')' { }