diff options
author | Emma Anholt <emma@anholt.net> | 2021-11-17 14:45:03 -0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2021-12-02 01:47:38 +0000 |
commit | 59ba7a2ad8f9c63c8fc9f6378d6e015736b79497 (patch) | |
tree | 88614ad4bd4e08b7614667ad8c9fa10a2db55ffa /src/gallium | |
parent | 5495359085ac60de970e2588d9052a1ff9f3b69f (diff) |
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>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/freedreno/a6xx/fd6_const.c | 25 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/a6xx/fd6_program.c | 27 |
2 files changed, 27 insertions, 25 deletions
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_const.c b/src/gallium/drivers/freedreno/a6xx/fd6_const.c index edf1e3327ca..b45bc293767 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_const.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_const.c @@ -108,29 +108,6 @@ emit_const_ptrs(struct fd_ringbuffer *ring, const struct ir3_shader_variant *v, } 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) { diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.c b/src/gallium/drivers/freedreno/a6xx/fd6_program.c index e568f6a5f14..6a4cfc6ed79 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_program.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.c @@ -366,6 +366,29 @@ next_regid(uint32_t reg, uint32_t increment) } 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, const struct ir3_shader_key *key, bool binning_pass) assert_dt @@ -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); |