*/
static gl_shader_variable *
create_shader_variable(struct gl_shader_program *shProg,
- const ir_variable *in, bool use_implicit_location)
+ const ir_variable *in, bool use_implicit_location,
+ int location_bias)
{
gl_shader_variable *out = ralloc(shProg, struct gl_shader_variable);
if (!out)
!(in->data.explicit_location || use_implicit_location)) {
out->location = -1;
} else {
- out->location = in->data.location;
+ out->location = in->data.location - location_bias;
}
out->type = in->type;
if (!var || var->data.how_declared == ir_var_hidden)
continue;
+ int loc_bias;
+
switch (var->data.mode) {
case ir_var_system_value:
case ir_var_shader_in:
if (programInterface != GL_PROGRAM_INPUT)
continue;
+ loc_bias = (stage == MESA_SHADER_VERTEX) ? int(VERT_ATTRIB_GENERIC0)
+ : int(VARYING_SLOT_VAR0);
break;
case ir_var_shader_out:
if (programInterface != GL_PROGRAM_OUTPUT)
continue;
+ loc_bias = (stage == MESA_SHADER_FRAGMENT) ? int(FRAG_RESULT_DATA0)
+ : int(VARYING_SLOT_VAR0);
break;
default:
continue;
(stage == MESA_SHADER_FRAGMENT && var->data.mode == ir_var_shader_out);
gl_shader_variable *sha_v =
- create_shader_variable(shProg, var, vs_input_or_fs_output);
+ create_shader_variable(shProg, var, vs_input_or_fs_output, loc_bias);
if (!sha_v)
return false;
if (type == iface) {
gl_shader_variable *sha_v =
- create_shader_variable(shProg, var, false);
+ create_shader_variable(shProg, var, false, VARYING_SLOT_VAR0);
if (!sha_v)
return false;
if (!add_program_resource(shProg, iface, sha_v,
ir_variable *var = node->as_variable();
if (var) {
assert(var->data.mode == ir_var_shader_out);
- gl_shader_variable *sha_v = create_shader_variable(shProg, var, true);
+ gl_shader_variable *sha_v =
+ create_shader_variable(shProg, var, true, FRAG_RESULT_DATA0);
if (!sha_v)
return false;
if (!add_program_resource(shProg, GL_PROGRAM_OUTPUT, sha_v,
struct gl_program_resource *res, const char *name,
unsigned array_index)
{
- /* VERT_ATTRIB_GENERIC0 and FRAG_RESULT_DATA0 are decremented as these
- * offsets are used internally to differentiate between built-in attributes
- * and user-defined attributes.
- */
switch (res->Type) {
case GL_PROGRAM_INPUT: {
const gl_shader_variable *var = RESOURCE_VAR(res);
&& array_index >= var->type->length) {
return -1;
}
- return (var->location +
- (array_index * var->type->without_array()->matrix_columns) -
- VERT_ATTRIB_GENERIC0);
+ return var->location +
+ (array_index * var->type->without_array()->matrix_columns);
}
case GL_PROGRAM_OUTPUT:
if (RESOURCE_VAR(res)->location == -1)
&& array_index >= RESOURCE_VAR(res)->type->length) {
return -1;
}
- return RESOURCE_VAR(res)->location + array_index - FRAG_RESULT_DATA0;
+ return RESOURCE_VAR(res)->location + array_index;
case GL_UNIFORM:
/* If the uniform is built-in, fail. */
if (RESOURCE_UNI(res)->builtin)