From 57f7978b1de40be6eb138d391c8d9f95b68cbf62 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 22 Jul 2011 12:57:47 -0700 Subject: [PATCH] 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. --- src/glsl/linker.cpp | 3 ++- src/mesa/main/mtypes.h | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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 */ -- 2.30.2