From: Anuj Phogat Date: Mon, 10 Feb 2014 22:12:40 +0000 (-0800) Subject: glsl: Apply the link error conditions to GL_ARB_fragment_coord_conventions X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=9bcb0a85321c128b6e5ff8fc6694c2eff613e65a glsl: Apply the link error conditions to GL_ARB_fragment_coord_conventions Link error conditions added in previous patch are equally applicable to GL_ARB_fragment_coord_conventions implementation. Extension's spec says: "If gl_FragCoord is redeclared in any fragment shader in a program, it must be redeclared in all the fragment shaders in that program that have a static use of gl_FragCoord. All redeclarations of gl_FragCoord in all fragment shaders in a single program must have the same set of qualifiers." Signed-off-by: Anuj Phogat Cc: Reviewed-by: Ian Romanick --- diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 600658d9788..8f09cc7293a 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -1408,6 +1408,8 @@ set_shader_inout_layout(struct gl_shader *shader, shader->uses_gl_fragcoord = state->fs_uses_gl_fragcoord; shader->pixel_center_integer = state->fs_pixel_center_integer; shader->origin_upper_left = state->fs_origin_upper_left; + shader->ARB_fragment_coord_conventions_enable = + state->ARB_fragment_coord_conventions_enable; break; default: diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 9a018774f80..a1bae297eaa 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1210,7 +1210,8 @@ link_fs_input_layout_qualifiers(struct gl_shader_program *prog, linked_shader->origin_upper_left = false; linked_shader->pixel_center_integer = false; - if (linked_shader->Stage != MESA_SHADER_FRAGMENT || prog->Version < 150) + if (linked_shader->Stage != MESA_SHADER_FRAGMENT || + (prog->Version < 150 && !prog->ARB_fragment_coord_conventions_enable)) return; for (unsigned i = 0; i < num_shaders; i++) { @@ -2249,6 +2250,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) ralloc_free(prog->AtomicBuffers); prog->AtomicBuffers = NULL; prog->NumAtomicBuffers = 0; + prog->ARB_fragment_coord_conventions_enable = false; /* Separate the shaders into groups based on their type. */ @@ -2275,6 +2277,9 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) goto done; } + prog->ARB_fragment_coord_conventions_enable |= + prog->Shaders[i]->ARB_fragment_coord_conventions_enable; + gl_shader_stage shader_type = prog->Shaders[i]->Stage; shader_list[shader_type][num_shaders[shader_type]] = prog->Shaders[i]; num_shaders[shader_type]++; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index d9fb297a966..0fd81ff6d39 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2434,6 +2434,7 @@ struct gl_shader bool uses_builtin_functions; bool uses_gl_fragcoord; bool redeclares_gl_fragcoord; + bool ARB_fragment_coord_conventions_enable; /** * Fragment shader state from GLSL 1.50 layout qualifiers. @@ -2765,6 +2766,11 @@ struct gl_shader_program * \c NULL. */ struct gl_shader *_LinkedShaders[MESA_SHADER_STAGES]; + + /* True if any of the fragment shaders attached to this program use: + * #extension ARB_fragment_coord_conventions: enable + */ + GLboolean ARB_fragment_coord_conventions_enable; };