summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler/glsl/linker.cpp20
-rw-r--r--src/mesa/main/mtypes.h32
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;
};
/**