From f982e2434b0b30db9401a4db62868dd357eec041 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Sat, 28 Nov 2015 09:16:45 +1100 Subject: mesa: add LOCATION_COMPONENT support to GetProgramResourceiv From Section 7.3.1.1 (Naming Active Resources) of the OpenGL 4.5 spec: "For the property LOCATION_COMPONENT, a single integer indicating the first component of the location assigned to an active input or output variable is written to params. For input and output variables with a component specified by a layout qualifier, the specified component is written. For all other input and output variables, the value zero is written." Reviewed-by: Anuj Phogat --- src/compiler/glsl/linker.cpp | 1 + src/mesa/main/mtypes.h | 6 ++++++ src/mesa/main/shader_query.cpp | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index f7b884e0173..9c724782e4d 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -3570,6 +3570,7 @@ create_shader_variable(struct gl_shader_program *shProg, } out->type = type; + out->component = in->data.location_frac; out->index = in->data.index; out->patch = in->data.patch; out->mode = in->data.mode; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 46b1543b56c..62838542920 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2570,6 +2570,12 @@ struct gl_shader_variable */ int location; + /** + * Specifies the first component the variable is stored in as per + * ARB_enhanced_layouts. + */ + unsigned component:2; + /** * Output index for dual source blending. * diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp index 2c1a6ee3505..020990ae9bf 100644 --- a/src/mesa/main/shader_query.cpp +++ b/src/mesa/main/shader_query.cpp @@ -1216,6 +1216,15 @@ _mesa_program_resource_prop(struct gl_shader_program *shProg, default: goto invalid_operation; } + case GL_LOCATION_COMPONENT: + switch (res->Type) { + case GL_PROGRAM_INPUT: + case GL_PROGRAM_OUTPUT: + *val = RESOURCE_VAR(res)->component; + return 1; + default: + goto invalid_operation; + } case GL_LOCATION_INDEX: if (res->Type != GL_PROGRAM_OUTPUT) goto invalid_operation; -- cgit v1.2.3