diff options
-rw-r--r-- | src/glsl/builtin_variables.cpp | 67 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.cpp | 2 | ||||
-rw-r--r-- | src/glsl/ir.h | 3 |
3 files changed, 72 insertions, 0 deletions
diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index fbcec353a4a..34d4006f86f 100644 --- a/src/glsl/builtin_variables.cpp +++ b/src/glsl/builtin_variables.cpp @@ -22,6 +22,8 @@ */ #include "ir.h" +#include "ir_builder.h" +#include "linker.h" #include "glsl_parser_extras.h" #include "glsl_symbol_table.h" #include "main/core.h" @@ -29,6 +31,8 @@ #include "program/prog_statevars.h" #include "program/prog_instruction.h" +using namespace ir_builder; + static const struct gl_builtin_uniform_element gl_NumSamples_elements[] = { {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX} }; @@ -1056,6 +1060,7 @@ builtin_variable_generator::generate_cs_special_vars() add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_ID, uvec3_t, "gl_LocalInvocationID"); add_system_value(SYSTEM_VALUE_WORK_GROUP_ID, uvec3_t, "gl_WorkGroupID"); + add_variable("gl_GlobalInvocationID", uvec3_t, ir_var_auto, 0); /* TODO: finish this. */ } @@ -1207,3 +1212,65 @@ _mesa_glsl_initialize_variables(exec_list *instructions, break; } } + + +/** + * Initialize compute shader variables with values that are derived from other + * compute shader variable. + */ +static void +initialize_cs_derived_variables(gl_shader *shader, + ir_function_signature *const main_sig) +{ + assert(shader->Stage == MESA_SHADER_COMPUTE); + + ir_variable *gl_GlobalInvocationID = + shader->symbols->get_variable("gl_GlobalInvocationID"); + assert(gl_GlobalInvocationID); + ir_variable *gl_WorkGroupID = + shader->symbols->get_variable("gl_WorkGroupID"); + assert(gl_WorkGroupID); + ir_variable *gl_WorkGroupSize = + shader->symbols->get_variable("gl_WorkGroupSize"); + if (gl_WorkGroupSize == NULL) { + void *const mem_ctx = ralloc_parent(shader->ir); + gl_WorkGroupSize = new(mem_ctx) ir_variable(glsl_type::uvec3_type, + "gl_WorkGroupSize", + ir_var_auto); + gl_WorkGroupSize->data.how_declared = ir_var_declared_implicitly; + gl_WorkGroupSize->data.read_only = true; + shader->ir->push_head(gl_WorkGroupSize); + } + ir_variable *gl_LocalInvocationID = + shader->symbols->get_variable("gl_LocalInvocationID"); + assert(gl_LocalInvocationID); + + /* gl_GlobalInvocationID = + * gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID + */ + ir_instruction *inst = + assign(gl_GlobalInvocationID, + add(mul(gl_WorkGroupID, gl_WorkGroupSize), + gl_LocalInvocationID)); + main_sig->body.push_head(inst); +} + + +/** + * Initialize builtin variables with values based on other builtin variables. + * These are initialized in the main function. + */ +void +_mesa_glsl_initialize_derived_variables(gl_shader *shader) +{ + /* We only need to set CS variables currently. */ + if (shader->Stage != MESA_SHADER_COMPUTE) + return; + + ir_function_signature *const main_sig = + _mesa_get_main_function_signature(shader); + if (main_sig == NULL) + return; + + initialize_cs_derived_variables(shader, main_sig); +} diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index fb76614133d..dae5261daca 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -1694,6 +1694,8 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, } } + _mesa_glsl_initialize_derived_variables(shader); + delete state->symbols; ralloc_free(state); } diff --git a/src/glsl/ir.h b/src/glsl/ir.h index fce72a2d3c4..f9ddf7442b0 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -2514,6 +2514,9 @@ _mesa_glsl_initialize_variables(exec_list *instructions, struct _mesa_glsl_parse_state *state); extern void +_mesa_glsl_initialize_derived_variables(gl_shader *shader); + +extern void _mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state); extern void |