diff options
-rw-r--r-- | src/compiler/glsl/linker.cpp | 20 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 32 |
2 files changed, 48 insertions, 4 deletions
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 8e6455310bb..1d5552915ca 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -3660,7 +3660,8 @@ static gl_shader_variable * create_shader_variable(struct gl_shader_program *shProg, const ir_variable *in, const char *name, const glsl_type *type, - bool use_implicit_location, int location) + bool use_implicit_location, int location, + const glsl_type *outermost_struct_type) { gl_shader_variable *out = ralloc(shProg, struct gl_shader_variable); if (!out) @@ -3703,10 +3704,15 @@ create_shader_variable(struct gl_shader_program *shProg, } out->type = type; + out->outermost_struct_type = outermost_struct_type; + out->interface_type = in->get_interface_type(); out->component = in->data.location_frac; out->index = in->data.index; out->patch = in->data.patch; out->mode = in->data.mode; + out->interpolation = in->data.interpolation; + out->explicit_location = in->data.explicit_location; + out->precision = in->data.precision; return out; } @@ -3715,7 +3721,8 @@ static bool add_shader_variable(struct gl_shader_program *shProg, unsigned stage_mask, GLenum programInterface, ir_variable *var, const char *name, const glsl_type *type, - bool use_implicit_location, int location) + bool use_implicit_location, int location, + const glsl_type *outermost_struct_type = NULL) { const bool is_vertex_input = programInterface == GL_PROGRAM_INPUT && @@ -3732,13 +3739,17 @@ add_shader_variable(struct gl_shader_program *shProg, unsigned stage_mask, * structure member to enumerate is itself a structure or array, * these enumeration rules are applied recursively." */ + if (outermost_struct_type == NULL) + outermost_struct_type = type; + unsigned field_location = location; for (unsigned i = 0; i < type->length; i++) { const struct glsl_struct_field *field = &type->fields.structure[i]; char *field_name = ralloc_asprintf(shProg, "%s.%s", name, field->name); if (!add_shader_variable(shProg, stage_mask, programInterface, var, field_name, field->type, - use_implicit_location, field_location)) + use_implicit_location, field_location, + outermost_struct_type)) return false; field_location += @@ -3772,7 +3783,8 @@ add_shader_variable(struct gl_shader_program *shProg, unsigned stage_mask, */ gl_shader_variable *sha_v = create_shader_variable(shProg, var, prefixed_name, type, - use_implicit_location, location); + use_implicit_location, location, + outermost_struct_type); if (!sha_v) return false; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index e16663d2880..e8ab195a91b 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2547,6 +2547,17 @@ struct gl_shader_variable const struct glsl_type *type; /** + * If the variable is in an interface block, this is the type of the block. + */ + const struct glsl_type *interface_type; + + /** + * For variables inside structs (possibly recursively), this is the + * outermost struct type. + */ + const struct glsl_type *outermost_struct_type; + + /** * Declared name of the variable */ char *name; @@ -2600,6 +2611,27 @@ struct gl_shader_variable * \sa (n)ir_variable_mode */ unsigned mode:4; + + /** + * Interpolation mode for shader inputs / outputs + * + * \sa ir_variable_interpolation + */ + unsigned interpolation:2; + + /** + * Was the location explicitly set in the shader? + * + * If the location is explicitly set in the shader, it \b cannot be changed + * by the linker or by the API (e.g., calls to \c glBindAttribLocation have + * no effect). + */ + unsigned explicit_location:1; + + /** + * Precision qualifier. + */ + unsigned precision:2; }; /** |