On 16.10.2017 14:06, Iago Toral Quiroga wrote:
We only need to add a check to validate output locations here. For
inputs with invalid locations we will fail to link when we can't
find a matching output in the same (invalid) location.

Fixes:
KHR-GL45.enhanced_layouts.varying_location_limit

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>


---
  src/compiler/glsl/link_varyings.cpp | 12 +++++++++++-
  src/compiler/glsl/link_varyings.h   |  3 ++-
  src/compiler/glsl/linker.cpp        |  2 +-
  3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/compiler/glsl/link_varyings.cpp 
b/src/compiler/glsl/link_varyings.cpp
index 29842ecacd..bdb70edf47 100644
--- a/src/compiler/glsl/link_varyings.cpp
+++ b/src/compiler/glsl/link_varyings.cpp
@@ -381,7 +381,8 @@ cross_validate_front_and_back_color(struct 
gl_shader_program *prog,
   * Validate that outputs from one stage match inputs of another
   */
  void
-cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
+cross_validate_outputs_to_inputs(struct gl_context *ctx,
+                                 struct gl_shader_program *prog,
                                   gl_linked_shader *producer,
                                   gl_linked_shader *consumer)
  {
@@ -410,6 +411,15 @@ cross_validate_outputs_to_inputs(struct gl_shader_program 
*prog,
           unsigned slot_limit = idx + num_elements;
           unsigned last_comp;
+ unsigned slot_max =
+            ctx->Const.Program[producer->Stage].MaxOutputComponents / 4;
+         if (slot_limit > slot_max) {
+            linker_error(prog,
+                         "Invalid location %u in %s shader\n",
+                         idx, _mesa_shader_stage_to_string(producer->Stage));
+            return;
+         }
+
           if (type->without_array()->is_record()) {
              /* The component qualifier can't be used on structs so just treat
               * all component slots as used.
diff --git a/src/compiler/glsl/link_varyings.h 
b/src/compiler/glsl/link_varyings.h
index 4e1f6d2e42..081b04ea38 100644
--- a/src/compiler/glsl/link_varyings.h
+++ b/src/compiler/glsl/link_varyings.h
@@ -300,7 +300,8 @@ link_varyings(struct gl_shader_program *prog, unsigned 
first, unsigned last,
                struct gl_context *ctx, void *mem_ctx);
void
-cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
+cross_validate_outputs_to_inputs(struct gl_context *ctx,
+                                 struct gl_shader_program *prog,
                                   gl_linked_shader *producer,
                                   gl_linked_shader *consumer);
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 03eb05bf63..3798309678 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -4929,7 +4929,7 @@ link_shaders(struct gl_context *ctx, struct 
gl_shader_program *prog)
        if (!prog->data->LinkStatus)
           goto done;
- cross_validate_outputs_to_inputs(prog,
+      cross_validate_outputs_to_inputs(ctx, prog,
                                         prog->_LinkedShaders[prev],
                                         prog->_LinkedShaders[i]);
        if (!prog->data->LinkStatus)



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to