Mesa (master): mesa: Add a flag for shader programs to allow SSO linkage in GLES2.

Eric Anholt anholt at kemper.freedesktop.org
Tue Oct 18 11:06:44 PDT 2011


Module: Mesa
Branch: master
Commit: 57f7978b1de40be6eb138d391c8d9f95b68cbf62
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=57f7978b1de40be6eb138d391c8d9f95b68cbf62

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jul 22 12:57:47 2011 -0700

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 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 42075cb..a7c38a3 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 a7d1cb2..17c645a 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 */
 



More information about the mesa-commit mailing list