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) {
