From: Eric Anholt Date: Fri, 22 Jul 2011 19:57:47 +0000 (-0700) Subject: mesa: Add a flag for shader programs to allow SSO linkage in GLES2. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=57f7978b1de40be6eb138d391c8d9f95b68cbf62;p=mesa.git mesa: Add a flag for shader programs to allow SSO linkage in GLES2. On converting fixed function programs to generate GLSL, the linker became cranky that we were trying to make something that wasn't a linked vertex+fragment program. Given that the Mesa GLES2 drivers also support desktop GL with EXT_sso, just telling the linker to shut up seems like the easiest solution. --- diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 42075cbbe09..a7c38a3426a 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1805,7 +1805,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) * present in a linked program. By checking for use of shading language * version 1.00, we also catch the GL_ARB_ES2_compatibility case. */ - if (ctx->API == API_OPENGLES2 || prog->Version == 100) { + if (!prog->InternalSeparateShader && + (ctx->API == API_OPENGLES2 || prog->Version == 100)) { if (prog->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) { linker_error(prog, "program lacks a vertex shader\n"); } else if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) { diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index a7d1cb2b111..17c645a7ee5 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2135,6 +2135,17 @@ struct gl_shader_program GLint RefCount; /**< Reference count */ GLboolean DeletePending; + /** + * Flags that the linker should not reject the program if it lacks + * a vertex or fragment shader. GLES2 doesn't allow separate + * shader objects, and would reject them. However, we internally + * build separate shader objects for fixed function programs, which + * we use for drivers/common/meta.c and for handling + * _mesa_update_state with no program bound (for example in + * glClear()). + */ + GLboolean InternalSeparateShader; + GLuint NumShaders; /**< number of attached shaders */ struct gl_shader **Shaders; /**< List of attached the shaders */