[Mesa-dev] [PATCH v2] mesa: fix interface matching done in validate_io

Tapani Pälli tapani.palli at intel.com
Mon Dec 14 00:29:40 PST 2015


Patch makes following changes for interface matching:

   - do not try to match builtin variables
   - handle swizzle in input name, as example 'a.z' should
     match with 'a'
   - check that amount of inputs and outputs matches

These changes make interface matching tests to work in:
   ES31-CTS.sepshaderobjs.StateInteraction

Test does not still pass completely due to errors in rendering
output. IMO this is unrelated to interface matching.

v2: add spec reference, return true on desktop since we do not
    have failing cases for it, inputs and outputs amount do not
    need to match on desktop.

Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
---
 src/mesa/main/shader_query.cpp | 54 ++++++++++++++++++++++++++++++++++++++----
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index ced10a9..bc01b97 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -1377,19 +1377,38 @@ validate_io(const struct gl_shader *input_stage,
             const struct gl_shader *output_stage, bool isES)
 {
    assert(input_stage && output_stage);
+   unsigned inputs = 0, outputs = 0;
+
+   /* Currently no matching done for desktop. */
+   if (!isES)
+      return true;
 
    /* For each output in a, find input in b and do any required checks. */
    foreach_in_list(ir_instruction, out, input_stage->ir) {
       ir_variable *out_var = out->as_variable();
-      if (!out_var || out_var->data.mode != ir_var_shader_out)
+      if (!out_var || out_var->data.mode != ir_var_shader_out ||
+          is_gl_identifier(out_var->name))
          continue;
 
+      outputs++;
+
+      inputs = 0;
       foreach_in_list(ir_instruction, in, output_stage->ir) {
          ir_variable *in_var = in->as_variable();
-         if (!in_var || in_var->data.mode != ir_var_shader_in)
+         if (!in_var || in_var->data.mode != ir_var_shader_in ||
+             is_gl_identifier(in_var->name))
             continue;
 
-         if (strcmp(in_var->name, out_var->name) == 0) {
+         inputs++;
+
+         unsigned len = strlen(in_var->name);
+
+         /* Handle input swizzle in variable name. */
+         const char *dot = strchr(in_var->name, '.');
+         if (dot)
+            len = dot - in_var->name;
+
+         if (strncmp(in_var->name, out_var->name, len) == 0) {
             /* Since we now only validate precision, we can skip this step for
              * desktop GLSL shaders, there precision qualifier is ignored.
              *
@@ -1412,7 +1431,34 @@ validate_io(const struct gl_shader *input_stage,
          }
       }
    }
-   return true;
+
+   /* Amount of inputs vs outputs should match when using OpenGL ES.
+    *
+    * From OpenGL ES 3.1 spec (Interface matching):
+    *
+    *    "At an interface between program objects, the set of inputs and outputs
+    *    are considered to match exactly if and only if:
+    *
+    *    - Every declared input variable has a matching output, as described
+    *    above.
+    *
+    *    - There are no user-defined output variables declared without a
+    *    matching input variable declaration.
+    *
+    *    - All matched input and output variables have identical precision
+    *    qualification.
+    *
+    *    When the set of inputs and outputs on an interface between programs
+    *    matches exactly, all inputs are well-defined except when the
+    *    corresponding outputs were not written in the previous shader. However,
+    *    any mismatch between inputs and outputs will result in a validation
+    *    failure."
+    *
+    * OpenGL Core 4.5 spec includes same paragraph as above but without last
+    * precision or the last 'validation failure' clause. Therefore behaviour is
+    * more relaxed, input and output amount does not need to match on desktop.
+    */
+   return isES ? inputs == outputs : true;
 }
 
 /**
-- 
2.5.0



More information about the mesa-dev mailing list