Mesa (main): freedreno/ir3: Make a shared helper for the tess factor stride.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 1 17:52:19 UTC 2021


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

Author: Emma Anholt <emma at anholt.net>
Date:   Wed Nov 17 11:07:42 2021 -0800

freedreno/ir3: Make a shared helper for the tess factor stride.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6089>

---

 src/freedreno/ir3/ir3_shader.h                | 20 ++++++++++++++++++--
 src/freedreno/vulkan/tu_cmd_buffer.c          | 15 +--------------
 src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 25 ++++++-------------------
 3 files changed, 25 insertions(+), 35 deletions(-)

diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h
index 9b0cfeac684..6dc005ea9f3 100644
--- a/src/freedreno/ir3/ir3_shader.h
+++ b/src/freedreno/ir3/ir3_shader.h
@@ -299,8 +299,8 @@ struct ir3_shader_key {
           * topology the TES uses, which the TCS needs to know.
           */
 #define IR3_TESS_NONE      0
-#define IR3_TESS_TRIANGLES 1
-#define IR3_TESS_QUADS     2
+#define IR3_TESS_QUADS     1
+#define IR3_TESS_TRIANGLES 2
 #define IR3_TESS_ISOLINES  3
          unsigned tessellation : 2;
 
@@ -349,6 +349,22 @@ ir3_tess_mode(unsigned gl_tess_mode)
    }
 }
 
+static inline uint32_t
+ir3_tess_factor_stride(unsigned patch_type)
+{
+   /* note: this matches the stride used by ir3's build_tessfactor_base */
+   switch (patch_type) {
+   case IR3_TESS_ISOLINES:
+      return 12;
+   case IR3_TESS_TRIANGLES:
+      return 20;
+   case IR3_TESS_QUADS:
+      return 28;
+   default:
+      unreachable("bad tessmode");
+   }
+}
+
 static inline bool
 ir3_shader_key_equal(const struct ir3_shader_key *a,
                      const struct ir3_shader_key *b)
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c
index a5e576314a6..be11ef839aa 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.c
+++ b/src/freedreno/vulkan/tu_cmd_buffer.c
@@ -3509,20 +3509,7 @@ get_tess_factor_bo_size(const struct tu_pipeline *pipeline,
    /* Each distinct patch gets its own tess factor output. */
    uint32_t verts_per_patch = pipeline->ia.primtype - DI_PT_PATCHES0;
    uint32_t num_patches = draw_count / verts_per_patch;
-   uint32_t factor_stride;
-   switch (pipeline->tess.patch_type) {
-   case IR3_TESS_ISOLINES:
-      factor_stride = 12;
-      break;
-   case IR3_TESS_TRIANGLES:
-      factor_stride = 20;
-      break;
-   case IR3_TESS_QUADS:
-      factor_stride = 28;
-      break;
-   default:
-      unreachable("bad tessmode");
-   }
+   uint32_t factor_stride = ir3_tess_factor_stride(pipeline->tess.patch_type);
    return factor_stride * num_patches;
 }
 
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
index 9c1bd2117db..a79f6a5800e 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
@@ -251,25 +251,12 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
    }
 
    if (info->mode == PIPE_PRIM_PATCHES) {
-      shader_info *ds_info = &emit.ds->shader->nir->info;
-      uint32_t factor_stride;
-
-      switch (ds_info->tess.primitive_mode) {
-      case GL_ISOLINES:
-         draw0.patch_type = TESS_ISOLINES;
-         factor_stride = 12;
-         break;
-      case GL_TRIANGLES:
-         draw0.patch_type = TESS_TRIANGLES;
-         factor_stride = 20;
-         break;
-      case GL_QUADS:
-         draw0.patch_type = TESS_QUADS;
-         factor_stride = 28;
-         break;
-      default:
-         unreachable("bad tessmode");
-      }
+      uint32_t factor_stride = ir3_tess_factor_stride(emit.key.key.tessellation);
+
+      STATIC_ASSERT(IR3_TESS_ISOLINES == TESS_ISOLINES + 1);
+      STATIC_ASSERT(IR3_TESS_TRIANGLES == TESS_TRIANGLES + 1);
+      STATIC_ASSERT(IR3_TESS_QUADS == TESS_QUADS + 1);
+      draw0.patch_type = emit.key.key.tessellation - 1;
 
       draw0.prim_type = DI_PT_PATCHES0 + ctx->patch_vertices;
       draw0.tess_enable = true;



More information about the mesa-commit mailing list