freedreno/a6xx: Set the tess BO ptrs in the program stateobj.
Saves some draw-time work for tess. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13851>
This commit is contained in:
@@ -107,29 +107,6 @@ emit_const_ptrs(struct fd_ringbuffer *ring, const struct ir3_shader_variant *v,
|
||||
unreachable("shouldn't be called on a6xx");
|
||||
}
|
||||
|
||||
static void
|
||||
emit_tess_bos(struct fd_screen *screen, struct fd_ringbuffer *ring,
|
||||
struct ir3_shader_variant *s) assert_dt
|
||||
{
|
||||
const struct ir3_const_state *const_state = ir3_const_state(s);
|
||||
const unsigned regid = const_state->offsets.primitive_param + 1;
|
||||
uint32_t dwords = 8;
|
||||
|
||||
if (regid >= s->constlen)
|
||||
return;
|
||||
|
||||
OUT_PKT7(ring, fd6_stage2opcode(s->type), 7);
|
||||
OUT_RING(ring, CP_LOAD_STATE6_0_DST_OFF(regid) |
|
||||
CP_LOAD_STATE6_0_STATE_TYPE(ST6_CONSTANTS) |
|
||||
CP_LOAD_STATE6_0_STATE_SRC(SS6_DIRECT) |
|
||||
CP_LOAD_STATE6_0_STATE_BLOCK(fd6_stage2shadersb(s->type)) |
|
||||
CP_LOAD_STATE6_0_NUM_UNIT(dwords / 4));
|
||||
OUT_RING(ring, 0);
|
||||
OUT_RING(ring, 0);
|
||||
OUT_RELOC(ring, screen->tess_bo, FD6_TESS_FACTOR_SIZE, 0, 0);
|
||||
OUT_RELOC(ring, screen->tess_bo, 0, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
emit_stage_tess_consts(struct fd_ringbuffer *ring, struct ir3_shader_variant *v,
|
||||
uint32_t *params, int num_params)
|
||||
@@ -171,7 +148,6 @@ fd6_build_tess_consts(struct fd6_emit *emit)
|
||||
|
||||
emit_stage_tess_consts(constobj, emit->hs, hs_params,
|
||||
ARRAY_SIZE(hs_params));
|
||||
emit_tess_bos(ctx->screen, constobj, emit->hs);
|
||||
|
||||
if (emit->gs)
|
||||
num_vertices = emit->gs->shader->nir->info.gs.vertices_in;
|
||||
@@ -184,7 +160,6 @@ fd6_build_tess_consts(struct fd6_emit *emit)
|
||||
|
||||
emit_stage_tess_consts(constobj, emit->ds, ds_params,
|
||||
ARRAY_SIZE(ds_params));
|
||||
emit_tess_bos(ctx->screen, constobj, emit->ds);
|
||||
}
|
||||
|
||||
if (emit->gs) {
|
||||
|
@@ -365,6 +365,29 @@ next_regid(uint32_t reg, uint32_t increment)
|
||||
return regid(63, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
fd6_emit_tess_bos(struct fd_screen *screen, struct fd_ringbuffer *ring,
|
||||
const struct ir3_shader_variant *s) assert_dt
|
||||
{
|
||||
const struct ir3_const_state *const_state = ir3_const_state(s);
|
||||
const unsigned regid = const_state->offsets.primitive_param + 1;
|
||||
uint32_t dwords = 8;
|
||||
|
||||
if (regid >= s->constlen)
|
||||
return;
|
||||
|
||||
OUT_PKT7(ring, fd6_stage2opcode(s->type), 7);
|
||||
OUT_RING(ring, CP_LOAD_STATE6_0_DST_OFF(regid) |
|
||||
CP_LOAD_STATE6_0_STATE_TYPE(ST6_CONSTANTS) |
|
||||
CP_LOAD_STATE6_0_STATE_SRC(SS6_DIRECT) |
|
||||
CP_LOAD_STATE6_0_STATE_BLOCK(fd6_stage2shadersb(s->type)) |
|
||||
CP_LOAD_STATE6_0_NUM_UNIT(dwords / 4));
|
||||
OUT_RING(ring, 0);
|
||||
OUT_RING(ring, 0);
|
||||
OUT_RELOC(ring, screen->tess_bo, FD6_TESS_FACTOR_SIZE, 0, 0);
|
||||
OUT_RELOC(ring, screen->tess_bo, 0, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx,
|
||||
struct fd6_program_state *state,
|
||||
@@ -544,6 +567,10 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx,
|
||||
|
||||
fd6_emit_shader(ctx, ring, vs);
|
||||
fd6_emit_immediates(ctx->screen, vs, ring);
|
||||
if (hs) {
|
||||
fd6_emit_tess_bos(ctx->screen, ring, hs);
|
||||
fd6_emit_tess_bos(ctx->screen, ring, ds);
|
||||
}
|
||||
|
||||
struct ir3_shader_linkage l = {0};
|
||||
const struct ir3_shader_variant *last_shader = fd6_last_shader(state);
|
||||
|
Reference in New Issue
Block a user