freedreno/computerator: Add support for pvtmem
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11876>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -42,6 +42,7 @@ computerator = executable(
|
||||
libfreedreno_drm,
|
||||
libfreedreno_ir3,
|
||||
libfreedreno_perfcntrs,
|
||||
libfreedreno_common,
|
||||
],
|
||||
dependencies : [
|
||||
dep_libdrm,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ')' { }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user