Mesa (master): glsl/linker: Check the subroutine associated functions names

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 4 15:46:11 UTC 2018


Module: Mesa
Branch: master
Commit: 5f0567a4f60c6671d4e2a942ab3f3248dbbd6997
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5f0567a4f60c6671d4e2a942ab3f3248dbbd6997

Author: Vadym Shovkoplias <vadim.shovkoplias at gmail.com>
Date:   Wed Oct  3 11:39:04 2018 +0300

glsl/linker: Check the subroutine associated functions names

>From Section 6.1.2 (Subroutines) of the GLSL 4.00 specification

    "A program will fail to compile or link if any shader
     or stage contains two or more functions with the same
     name if the name is associated with a subroutine type."

v2:
  - error out earlier (Tapani)
  - style fixes (Iago)

Fixes:
    * no-overloads.vert

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108109
Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

---

 src/compiler/glsl/linker.cpp | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 3fde7e78d3..2f4c886054 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -4640,6 +4640,45 @@ link_assign_subroutine_types(struct gl_shader_program *prog)
 }
 
 static void
+verify_subroutine_associated_funcs(struct gl_shader_program *prog)
+{
+   unsigned mask = prog->data->linked_stages;
+   while (mask) {
+      const int i = u_bit_scan(&mask);
+      gl_program *p = prog->_LinkedShaders[i]->Program;
+      glsl_symbol_table *symbols = prog->_LinkedShaders[i]->symbols;
+
+      /*
+       * From OpenGL ES Shading Language 4.00 specification
+       * (6.1.2 Subroutines):
+       *     "A program will fail to compile or link if any shader
+       *     or stage contains two or more functions with the same
+       *     name if the name is associated with a subroutine type."
+       */
+      for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) {
+         unsigned definitions = 0;
+         char *name = p->sh.SubroutineFunctions[j].name;
+         ir_function *fn = symbols->get_function(name);
+
+         /* Calculate number of function definitions with the same name */
+         foreach_in_list(ir_function_signature, sig, &fn->signatures) {
+            if (sig->is_defined) {
+               if (++definitions > 1) {
+                  linker_error(prog, "%s shader contains two or more function "
+                               "definitions with name `%s', which is "
+                               "associated with a subroutine type.\n",
+                               _mesa_shader_stage_to_string(i),
+                               fn->name);
+                  return;
+               }
+            }
+         }
+      }
+   }
+}
+
+
+static void
 set_always_active_io(exec_list *ir, ir_variable_mode io_mode)
 {
    assert(io_mode == ir_var_shader_in || io_mode == ir_var_shader_out);
@@ -5024,6 +5063,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
 
    check_explicit_uniform_locations(ctx, prog);
    link_assign_subroutine_types(prog);
+   verify_subroutine_associated_funcs(prog);
 
    if (!prog->data->LinkStatus)
       goto done;




More information about the mesa-commit mailing list