diff options
author | Jordan Justen <jordan.l.justen@intel.com> | 2015-02-02 16:16:20 -0800 |
---|---|---|
committer | Jordan Justen <jordan.l.justen@intel.com> | 2015-08-05 23:53:24 -0700 |
commit | 9065d126a966f4bf66dbba97d45d42b5a5da8f71 (patch) | |
tree | 3670c46b5cc18ae7832511a74e47840db86cd53c | |
parent | 62dd477cb59afe29001bc65d7692007197525190 (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.cpp | 33 |
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 */ |