summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Justen <jordan.l.justen@intel.com>2015-02-02 16:16:20 -0800
committerJordan Justen <jordan.l.justen@intel.com>2015-08-05 23:53:24 -0700
commit9065d126a966f4bf66dbba97d45d42b5a5da8f71 (patch)
tree3670c46b5cc18ae7832511a74e47840db86cd53c
parent62dd477cb59afe29001bc65d7692007197525190 (diff)
glsl: Mark gl_GlobalInvocationID dependencies as usedcs-global-id-v1
gl_GlobalInvocationID = gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID Therefore, if gl_GlobalInvocationID is used, then we mark these other variables as being used. This prevents them from being considered dead variables and being removed. Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
-rw-r--r--src/glsl/glsl_parser_extras.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index 46896d7799..49fc12dce0 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -1568,6 +1568,36 @@ set_shader_inout_layout(struct gl_shader *shader,
}
}
+static void
+set_cs_variable_deps_as_used(struct gl_shader *shader,
+ struct _mesa_glsl_parse_state *state)
+{
+ /* gl_GlobalInvocationID only exists in the compute shader.
+ */
+ if (shader->Stage != MESA_SHADER_COMPUTE)
+ return;
+
+ ir_variable *gl_GlobalInvocationID =
+ state->symbols->get_variable("gl_GlobalInvocationID");
+ assert(gl_GlobalInvocationID);
+
+ if (!gl_GlobalInvocationID->data.used)
+ return;
+
+ static const char *dep_var_names[] = {
+ "gl_WorkGroupSize",
+ "gl_WorkGroupID",
+ "gl_LocalInvocationID"
+ };
+
+ for (unsigned i = 0; i < ARRAY_SIZE(dep_var_names); i++) {
+ ir_variable *var =
+ state->symbols->get_variable(dep_var_names[i]);
+ assert(var);
+ var->data.used = true;
+ }
+}
+
extern "C" {
void
@@ -1618,6 +1648,9 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
&ctx->Const.ShaderCompilerOptions[shader->Stage];
lower_subroutine(shader->ir, state);
+
+ set_cs_variable_deps_as_used(shader, state);
+
/* Do some optimization at compile time to reduce shader IR size
* and reduce later work if the same shader is linked multiple times
*/