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

Author: Yonggang Luo <[email protected]>
Date:   Tue Oct 10 02:47:53 2023 +0800

compiler: Implement num_mesh_vertices_per_primitive to match u_vertices_per_prim

Signed-off-by: Yonggang Luo <[email protected]>
Reviewed-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25880>

---

 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;

Reply via email to