From be431e0dc71f2da3b1cd5e552fa490617b851c5b Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Tue, 10 Oct 2023 02:47:53 +0800 Subject: [PATCH] compiler: Implement num_mesh_vertices_per_primitive to match u_vertices_per_prim Signed-off-by: Yonggang Luo Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/shader_enums.c | 44 ++++++++++++++++++++++++++++--------- src/compiler/shader_enums.h | 4 ++-- src/compiler/shader_info.h | 2 +- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index ea36dc84b59..b514a7adad2 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -28,6 +28,7 @@ #include "shader_enums.h" #include "util/macros.h" +#include "util/u_debug.h" #define ENUM(x) [x] = #x #define NAME(val) ((((val) < ARRAY_SIZE(names)) && names[(val)]) ? names[(val)] : "UNKNOWN") @@ -433,17 +434,40 @@ gl_frag_result_name(gl_frag_result result) } unsigned -num_mesh_vertices_per_primitive(unsigned prim) +num_mesh_vertices_per_primitive(enum mesa_prim prim) { - switch (prim) { - case MESA_PRIM_POINTS: - return 1; - case MESA_PRIM_LINES: - return 2; - case MESA_PRIM_TRIANGLES: - return 3; - default: - unreachable("invalid mesh shader primitive type"); + switch(prim) { + case MESA_PRIM_POINTS: + return 1; + case MESA_PRIM_LINES: + case MESA_PRIM_LINE_LOOP: + case MESA_PRIM_LINE_STRIP: + return 2; + case MESA_PRIM_TRIANGLES: + case MESA_PRIM_TRIANGLE_STRIP: + case MESA_PRIM_TRIANGLE_FAN: + return 3; + case MESA_PRIM_LINES_ADJACENCY: + case MESA_PRIM_LINE_STRIP_ADJACENCY: + return 4; + case MESA_PRIM_TRIANGLES_ADJACENCY: + case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY: + return 6; + + case MESA_PRIM_QUADS: + case MESA_PRIM_QUAD_STRIP: + /* These won't be seen from geometry shaders but prim assembly might for + * prim id. + */ + return 4; + + /* The following primitives should never be used with geometry or mesh + * shaders and their size is undefined. + */ + case MESA_PRIM_POLYGON: + default: + debug_printf("Unrecognized geometry or mesh shader primitive"); + return 3; } } diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 96d75805488..551952b5abb 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -1189,9 +1189,9 @@ enum ENUM_PACKED mesa_prim }; /** - * Number of vertices per mesh shader primitive. + * Number of vertices per primitive as seen by a geometry or mesh shader. */ -unsigned num_mesh_vertices_per_primitive(unsigned prim); +unsigned num_mesh_vertices_per_primitive(enum mesa_prim prim); /** * A compare function enum for use in compiler lowering passes. This is in diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index e46927ba88b..40e50e5e818 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -588,7 +588,7 @@ typedef struct shader_info { uint16_t max_vertices_out; uint16_t max_primitives_out; - uint16_t primitive_type; /* GL_POINTS, GL_LINES or GL_TRIANGLES. */ + enum mesa_prim primitive_type; /* GL_POINTS, GL_LINES or GL_TRIANGLES. */ /* TODO: remove this when we stop supporting NV_mesh_shader. */ bool nv;