From 3748b8afce91beeaabb71e3f9723bc57b4abf54f Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 17 Nov 2021 11:07:42 -0800 Subject: [PATCH] freedreno/ir3: Make a shared helper for the tess factor stride. Part-of: --- src/freedreno/ir3/ir3_shader.h | 20 ++++++++++++++-- src/freedreno/vulkan/tu_cmd_buffer.c | 15 +----------- src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 23 ++++--------------- 3 files changed, 24 insertions(+), 34 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; + uint32_t factor_stride = ir3_tess_factor_stride(emit.key.key.tessellation); - 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"); - } + 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;