glsl/cs: Exclude gl_LocalInvocationIndex from builtin variable stripping
authorJordan Justen <jordan.l.justen@intel.com>
Mon, 17 Aug 2015 22:49:44 +0000 (15:49 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Sun, 13 Sep 2015 16:53:16 +0000 (09:53 -0700)
We lower gl_LocalInvocationIndex based on the extension spec formula:

    gl_LocalInvocationIndex =
        gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y +
        gl_LocalInvocationID.y * gl_WorkGroupSize.x +
        gl_LocalInvocationID.x;

https://www.opengl.org/registry/specs/ARB/compute_shader.txt

We need to set this variable in main(), even if gl_LocalInvocationIndex
is not referenced by the shader. (It may be used by a linked shader.)
Therefore, we can't eliminate it as a dead variable.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
src/glsl/opt_dead_builtin_variables.cpp

index 90b753e012c30bdba19e77ee7c0195c5400c4418..03e578982b9f710591cf50d565a390a0036d0ead 100644 (file)
@@ -72,6 +72,13 @@ optimize_dead_builtin_variables(exec_list *instructions,
        *    gl_GlobalInvocationID =
        *       gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID
        *
+       * Similarly, we initialize gl_LocalInvocationIndex in the main function:
+       *
+       *    gl_LocalInvocationIndex =
+       *       gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y +
+       *       gl_LocalInvocationID.y * gl_WorkGroupSize.x +
+       *       gl_LocalInvocationID.x;
+       *
        * Matrix uniforms with "Transpose" are not eliminated because there's
        * an optimization pass that can turn references to the regular matrix
        * into references to the transpose matrix.  Eliminating the transpose
@@ -87,6 +94,7 @@ optimize_dead_builtin_variables(exec_list *instructions,
           || strcmp(var->name, "gl_WorkGroupSize") == 0
           || strcmp(var->name, "gl_LocalInvocationID") == 0
           || strcmp(var->name, "gl_GlobalInvocationID") == 0
+          || strcmp(var->name, "gl_LocalInvocationIndex") == 0
           || strstr(var->name, "Transpose") != NULL)
          continue;