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

Author: Faith Ekstrand <[email protected]>
Date:   Mon Aug 21 18:09:22 2023 -0500

glsl: Properly remap GL_* to MESA_PRIM

Instead of blatantly assuming with no assert that they're the same, add
a remap function.  Also, be more careful about which enum we use where.
In the AST, we use GLenum and GL_FOO because we also need GL_ISOLINES.
When we translate to shader info, GS gets translated into mesa_prim
and tessellation gets translated into tess_primitive_mode which has
ISOLINES as a valid primitive value.

Reviewed-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24821>

---

 src/compiler/glsl/ast_to_hir.cpp         |  6 ++++--
 src/compiler/glsl/glsl_parser_extras.cpp |  6 ++++--
 src/compiler/glsl/ir.cpp                 | 30 ++++++++++++------------------
 src/compiler/glsl/ir.h                   |  4 ++--
 src/compiler/glsl/linker.cpp             |  6 +++---
 5 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
index bb872cf8ac1..0a0e2734f40 100644
--- a/src/compiler/glsl/ast_to_hir.cpp
+++ b/src/compiler/glsl/ast_to_hir.cpp
@@ -4954,7 +4954,8 @@ handle_geometry_shader_input_decl(struct 
_mesa_glsl_parse_state *state,
    unsigned num_vertices = 0;
 
    if (state->gs_input_prim_type_specified) {
-      num_vertices = vertices_per_prim(state->in_qualifier->prim_type);
+      GLenum in_prim_type = state->in_qualifier->prim_type;
+      num_vertices = mesa_vertices_per_prim(gl_to_mesa_prim(in_prim_type));
    }
 
    /* Geometry shader input variables must be arrays.  Caller should have
@@ -8869,7 +8870,8 @@ ast_gs_input_layout::hir(exec_list *instructions,
     * array size, make sure the size they specified is consistent with the
     * primitive type.
     */
-   unsigned num_vertices = vertices_per_prim(this->prim_type);
+   unsigned num_vertices =
+      mesa_vertices_per_prim(gl_to_mesa_prim(this->prim_type));
    if (state->gs_input_size != 0 && state->gs_input_size != num_vertices) {
       _mesa_glsl_error(&loc, state,
                        "this geometry shader input layout implies %u vertices"
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp 
b/src/compiler/glsl/glsl_parser_extras.cpp
index 048c719444b..0f6d303dc7b 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -1970,13 +1970,15 @@ set_shader_inout_layout(struct gl_shader *shader,
       }
 
       if (state->gs_input_prim_type_specified) {
-         shader->info.Geom.InputType = (enum 
mesa_prim)state->in_qualifier->prim_type;
+         shader->info.Geom.InputType =
+            gl_to_mesa_prim(state->in_qualifier->prim_type);
       } else {
          shader->info.Geom.InputType = MESA_PRIM_UNKNOWN;
       }
 
       if (state->out_qualifier->flags.q.prim_type) {
-         shader->info.Geom.OutputType = (enum 
mesa_prim)state->out_qualifier->prim_type;
+         shader->info.Geom.OutputType =
+            gl_to_mesa_prim(state->out_qualifier->prim_type);
       } else {
          shader->info.Geom.OutputType = MESA_PRIM_UNKNOWN;
       }
diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp
index 56bef033522..0feac40a713 100644
--- a/src/compiler/glsl/ir.cpp
+++ b/src/compiler/glsl/ir.cpp
@@ -2275,24 +2275,18 @@ reparent_ir(exec_list *list, void *mem_ctx)
    }
 }
 
-unsigned
-vertices_per_prim(GLenum prim)
-{
-   switch (prim) {
-   case GL_POINTS:
-      return 1;
-   case GL_LINES:
-      return 2;
-   case GL_TRIANGLES:
-      return 3;
-   case GL_LINES_ADJACENCY:
-      return 4;
-   case GL_TRIANGLES_ADJACENCY:
-      return 6;
-   default:
-      assert(!"Bad primitive");
-      return 3;
-   }
+enum mesa_prim
+gl_to_mesa_prim(GLenum prim)
+{
+   STATIC_ASSERT(GL_POINTS                == MESA_PRIM_POINTS);
+   STATIC_ASSERT(GL_LINES                 == MESA_PRIM_LINES);
+   STATIC_ASSERT(GL_LINES_ADJACENCY       == MESA_PRIM_LINES_ADJACENCY);
+   STATIC_ASSERT(GL_LINE_STRIP            == MESA_PRIM_LINE_STRIP);
+   STATIC_ASSERT(GL_TRIANGLES             == MESA_PRIM_TRIANGLES);
+   STATIC_ASSERT(GL_TRIANGLES_ADJACENCY   == MESA_PRIM_TRIANGLES_ADJACENCY);
+   STATIC_ASSERT(GL_TRIANGLE_STRIP        == MESA_PRIM_TRIANGLE_STRIP);
+
+   return (enum mesa_prim)prim;
 }
 
 /**
diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
index 65d36f9b7de..e1a5ccae538 100644
--- a/src/compiler/glsl/ir.h
+++ b/src/compiler/glsl/ir.h
@@ -2483,7 +2483,7 @@ _mesa_glsl_get_builtin_uniform_desc(const char *name);
 } /* extern "C" */
 #endif
 
-unsigned
-vertices_per_prim(GLenum prim);
+enum mesa_prim
+gl_to_mesa_prim(GLenum prim);
 
 #endif /* IR_H */
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index a0a7336613c..93e6f807494 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -698,7 +698,7 @@ validate_geometry_shader_executable(struct 
gl_shader_program *prog,
       return;
 
    unsigned num_vertices =
-      vertices_per_prim(shader->Program->info.gs.input_primitive);
+      mesa_vertices_per_prim(shader->Program->info.gs.input_primitive);
    prog->Geom.VerticesIn = num_vertices;
 
    analyze_clip_cull_usage(prog, shader, consts, &shader->Program->info);
@@ -752,7 +752,7 @@ validate_geometry_shader_emissions(const struct 
gl_constants *consts,
        * stream.
        */
       if (prog->Geom.ActiveStreamMask & ~(1 << 0) &&
-          sh->Program->info.gs.output_primitive != GL_POINTS) {
+          sh->Program->info.gs.output_primitive != MESA_PRIM_POINTS) {
          linker_error(prog, "EmitStreamVertex(n) and EndStreamPrimitive(n) "
                       "with n>0 requires point output\n");
       }
@@ -2518,7 +2518,7 @@ link_intrastage_shaders(void *mem_ctx,
    /* Set the size of geometry shader input arrays */
    if (linked->Stage == MESA_SHADER_GEOMETRY) {
       unsigned num_vertices =
-         vertices_per_prim(gl_prog->info.gs.input_primitive);
+         mesa_vertices_per_prim(gl_prog->info.gs.input_primitive);
       array_resize_visitor input_resize_visitor(num_vertices, prog,
                                                 MESA_SHADER_GEOMETRY);
       foreach_in_list(ir_instruction, ir, linked->ir) {

Reply via email to