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