* 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;
}
}
+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)
/* 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;
}
}
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;