mesa: Add a flag for shader programs to allow SSO linkage in GLES2.
authorEric Anholt <eric@anholt.net>
Fri, 22 Jul 2011 19:57:47 +0000 (12:57 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 18 Oct 2011 17:54:32 +0000 (10:54 -0700)
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
src/mesa/main/mtypes.h

index 42075cbbe09410a40d07220544ac20b1e18e4f59..a7c38a3426a5f914d638476d698112aa9cc113ad 100644 (file)
@@ -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) {
index a7d1cb2b11141dca952a5e02b660726ac069d215..17c645a7ee5e25eeadfb0c4b5953cb9c53b85e43 100644 (file)
@@ -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 */