summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/shader_query.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2016-03-29 14:15:14 -0700
committerKenneth Graunke <[email protected]>2016-04-01 22:05:20 -0700
commit94ed482c19916ddede91c3c2ea3a538039ddb489 (patch)
treef5ae21f660c357d74b33ce701a88d5c502ec77a7 /src/mesa/main/shader_query.cpp
parentc123294dfe2e52443f2eff2723ef922f22972ef5 (diff)
glsl: Fix prorgram interface query locations biasing for SSO.
With SSO, the GL_PROGRAM_INPUT and GL_PROGRAM_OUTPUT interfaces refer to the first and last shader stage linked into a program. This may not be the vertex and fragment shader stages. So, subtracting VERT_ATTRIB_GENERIC0 and FRAG_RESULT_DATA0 is bogus. We need to subtract VERT_ATTRIB_GENERIC0 for VS inputs, FRAG_RESULT_DATA0 for FS outputs, and VARYING_SLOT_VAR0 for other cases. Note that built-in variables get a location of -1. Fixes 4 dEQP-GLES31.functional.program_interface_query tests: - program_input.location.separable_fragment.var_explicit_location - program_input.location.separable_fragment.var_array_explicit_location - program_output.location.separable_vertex.var_array_explicit_location - program_output.location.separable_vertex.var_array_explicit_location Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/mesa/main/shader_query.cpp')
-rw-r--r--src/mesa/main/shader_query.cpp11
1 files changed, 3 insertions, 8 deletions
diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index 190f6387987..4650a5c9ef1 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -780,10 +780,6 @@ program_resource_location(struct gl_shader_program *shProg,
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);
@@ -796,9 +792,8 @@ program_resource_location(struct gl_shader_program *shProg,
&& 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)
@@ -809,7 +804,7 @@ program_resource_location(struct gl_shader_program *shProg,
&& 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)