Mesa (main): freedreno/a6xx: Set the tess BO ptrs in the program stateobj.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Dec 2 02:28:46 UTC 2021


Module: Mesa
Branch: main
Commit: 59ba7a2ad8f9c63c8fc9f6378d6e015736b79497
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=59ba7a2ad8f9c63c8fc9f6378d6e015736b79497

Author: Emma Anholt <emma at anholt.net>
Date:   Wed Nov 17 14:45:03 2021 -0800

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>

---

 src/gallium/drivers/freedreno/a6xx/fd6_const.c   | 25 ----------------------
 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
@@ -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) {
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
@@ -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);



More information about the mesa-commit mailing list