freedreno/a6xx: Move pvtmem allocation to ir3_gallium.

This will be the same thing for pre-a6xx.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24358>
This commit is contained in:
Emma Anholt
2023-07-27 11:21:04 -07:00
committed by Marge Bot
parent a4c89cc8a6
commit 0fb797aab0
4 changed files with 29 additions and 19 deletions
@@ -104,25 +104,9 @@ fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring,
fd_emit_string5(ring, name, strlen(name));
#endif
uint32_t fibers_per_sp = ctx->screen->info->fibers_per_sp;
uint32_t num_sp_cores = ctx->screen->info->num_sp_cores;
ir3_get_private_mem(ctx, so);
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);
ctx->pvtmem[so->pvtmem_per_wave].per_fiber_size = per_fiber_size;
uint32_t total_size =
ALIGN(per_fiber_size * fibers_per_sp, 1 << 12) * num_sp_cores;
ctx->pvtmem[so->pvtmem_per_wave].bo = fd_bo_new(
ctx->screen->dev, total_size, FD_BO_NOMAP,
"pvtmem_%s_%d", so->pvtmem_per_wave ? "per_wave" : "per_fiber",
per_fiber_size);
} else {
per_fiber_size = ctx->pvtmem[so->pvtmem_per_wave].per_fiber_size;
}
uint32_t per_sp_size = ALIGN(per_fiber_size * fibers_per_sp, 1 << 12);
uint32_t per_sp_size = ctx->pvtmem[so->pvtmem_per_wave].per_sp_size;
OUT_PKT4(ring, instrlen, 1);
OUT_RING(ring, so->instrlen);
@@ -130,7 +114,7 @@ fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring,
OUT_PKT4(ring, first_exec_offset, 7);
OUT_RING(ring, 0); /* SP_xS_OBJ_FIRST_EXEC_OFFSET */
OUT_RELOC(ring, so->bo, 0, 0, 0); /* SP_xS_OBJ_START_LO */
OUT_RING(ring, A6XX_SP_VS_PVT_MEM_PARAM_MEMSIZEPERITEM(per_fiber_size));
OUT_RING(ring, A6XX_SP_VS_PVT_MEM_PARAM_MEMSIZEPERITEM(ctx->pvtmem[so->pvtmem_per_wave].per_fiber_size));
if (so->pvtmem_size > 0) { /* SP_xS_PVT_MEM_ADDR */
OUT_RELOC(ring, ctx->pvtmem[so->pvtmem_per_wave].bo, 0, 0, 0);
fd_ringbuffer_attach_bo(ring, ctx->pvtmem[so->pvtmem_per_wave].bo);
@@ -526,6 +526,7 @@ struct fd_context {
struct {
struct fd_bo *bo;
uint32_t per_fiber_size;
uint32_t per_sp_size;
} pvtmem[2] dt;
/* maps per-shader-stage state plus variant key to hw
@@ -663,3 +663,25 @@ ir3_update_max_tf_vtx(struct fd_context *ctx,
ctx->streamout.max_tf_vtx = maxvtxcnt;
}
void
ir3_get_private_mem(struct fd_context *ctx, const struct ir3_shader_variant *so)
{
uint32_t fibers_per_sp = ctx->screen->info->fibers_per_sp;
uint32_t num_sp_cores = ctx->screen->info->num_sp_cores;
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);
uint32_t per_sp_size = ALIGN(per_fiber_size * fibers_per_sp, 1 << 12);
uint32_t total_size = per_sp_size * num_sp_cores;
ctx->pvtmem[so->pvtmem_per_wave].per_fiber_size = per_fiber_size;
ctx->pvtmem[so->pvtmem_per_wave].per_sp_size = per_sp_size;
ctx->pvtmem[so->pvtmem_per_wave].bo = fd_bo_new(
ctx->screen->dev, total_size, FD_BO_NOMAP, "pvtmem_%s_%d",
so->pvtmem_per_wave ? "per_wave" : "per_fiber", per_fiber_size);
}
}
@@ -84,6 +84,9 @@ ir3_point_sprite(const struct ir3_shader_variant *fs, int i,
void ir3_update_max_tf_vtx(struct fd_context *ctx,
const struct ir3_shader_variant *v) assert_dt;
void ir3_get_private_mem(struct fd_context *ctx,
const struct ir3_shader_variant *so) assert_dt;
ENDC;
#endif /* IR3_GALLIUM_H_ */