glsl: mark explicit uniforms as explicit in other stages too
authorTapani Pälli <tapani.palli@intel.com>
Thu, 14 Jan 2016 12:10:59 +0000 (14:10 +0200)
committerTapani Pälli <tapani.palli@intel.com>
Fri, 15 Jan 2016 05:12:42 +0000 (07:12 +0200)
If shader declares uniform explicit location in one stage but
implicit in another, explicit location should be used. Patch marks
implicit uniforms as explicit if they were explicit in previous stage.
This makes sure that we don't treat them implicit later when assigning
locations.

Fixes following CTS test:
   ES31-CTS.explicit_uniform_location.uniform-loc-implicit-in-some-stages3

v2: move check to cross_validate_globals (Timothy)

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/glsl/linker.cpp

index 564c47128718f9af32ee1408a98c0394cd3dc740..3f40c0be3325813212a2573e14c5800d76f59660 100644 (file)
@@ -992,7 +992,17 @@ cross_validate_globals(struct gl_shader_program *prog,
 
               existing->data.location = var->data.location;
               existing->data.explicit_location = true;
-           }
+           } else {
+               /* Check if uniform with implicit location was marked explicit
+                * by earlier shader stage. If so, mark it explicit in this stage
+                * too to make sure later processing does not treat it as
+                * implicit one.
+                */
+               if (existing->data.explicit_location) {
+                 var->data.location = existing->data.location;
+                 var->data.explicit_location = true;
+               }
+            }
 
             /* From the GLSL 4.20 specification:
              * "A link error will result if two compilation units in a program