diff options
Diffstat (limited to 'src/mesa/main/shader_query.cpp')
-rw-r--r-- | src/mesa/main/shader_query.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp index eec933c2176..5956ce4976d 100644 --- a/src/mesa/main/shader_query.cpp +++ b/src/mesa/main/shader_query.cpp @@ -881,6 +881,13 @@ _mesa_program_resource_location_index(struct gl_shader_program *shProg, if (!res || !(res->StageReferences & (1 << MESA_SHADER_FRAGMENT))) return -1; + /* From OpenGL 4.5 spec, 7.3 Program Objects + * "The value -1 will be returned by either command... + * ... or if name identifies an active variable that does not have a + * valid location assigned. + */ + if (RESOURCE_VAR(res)->location == -1) + return -1; return RESOURCE_VAR(res)->index; } @@ -1233,12 +1240,18 @@ _mesa_program_resource_prop(struct gl_shader_program *shProg, default: goto invalid_operation; } - case GL_LOCATION_INDEX: + case GL_LOCATION_INDEX: { + int tmp; if (res->Type != GL_PROGRAM_OUTPUT) goto invalid_operation; - *val = RESOURCE_VAR(res)->index; + tmp = program_resource_location(res, 0); + if (tmp == -1) + *val = -1; + else + *val = _mesa_program_resource_location_index(shProg, res->Type, + RESOURCE_VAR(res)->name); return 1; - + } case GL_NUM_COMPATIBLE_SUBROUTINES: if (res->Type != GL_VERTEX_SUBROUTINE_UNIFORM && res->Type != GL_FRAGMENT_SUBROUTINE_UNIFORM && |