[Mesa-dev] [PATCH 1/6] mesa: Begin tracking whether a program needs re-linking.

Kenneth Graunke kenneth at whitecape.org
Wed May 14 17:28:12 PDT 2014


Tracking this will allow us to issue warnings when using a program that
hasn't yet been relinked, or when re-linking unnecessarily.

The following functions cause changes that don't take effect until the
program has been re-linked:

- glAttachShader
- glBindAttribLocation
- glBindFragDataLocation
- glBindFragDataLocationIndexed
- glTransformFeedbackVaryings
- glProgramParameteri (separable/binary retrievable hint)
- glUniformBlockBinding

OpenGL also allows the application to recompile shaders that have been
attached to programs and linked---at which point, they need relinking.
That case will be handled shortly.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/main/mtypes.h            | 1 +
 src/mesa/main/shader_query.cpp    | 3 ++-
 src/mesa/main/shaderapi.c         | 6 ++++++
 src/mesa/main/transformfeedback.c | 1 +
 src/mesa/main/uniforms.c          | 2 ++
 5 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 917d071..741f936 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2744,6 +2744,7 @@ struct gl_shader_program
    struct gl_active_atomic_buffer *AtomicBuffers;
    unsigned NumAtomicBuffers;
 
+   bool NeedsRelink;
    GLboolean LinkStatus;   /**< GL_LINK_STATUS */
    GLboolean Validated;
    GLboolean _Used;        /**< Ever used for drawing? */
diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index 36d1d9c..db3be0c 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -74,6 +74,7 @@ _mesa_BindAttribLocation(GLhandleARB program, GLuint index,
     * Note that this attribute binding won't go into effect until
     * glLinkProgram is called again.
     */
+   shProg->NeedsRelink = true;
 }
 
 static bool
@@ -365,7 +366,7 @@ _mesa_BindFragDataLocationIndexed(GLuint program, GLuint colorNumber,
     * Note that this binding won't go into effect until
     * glLinkProgram is called again.
     */
-
+   shProg->NeedsRelink = true;
 }
 
 GLint GLAPIENTRY
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 28739da..59d30ff 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -284,6 +284,7 @@ attach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
    shProg->Shaders[n] = NULL; /* since realloc() didn't zero the new space */
    _mesa_reference_shader(ctx, &shProg->Shaders[n], sh);
    shProg->NumShaders++;
+   shProg->NeedsRelink = true;
 }
 
 
@@ -914,6 +915,9 @@ link_program(struct gl_context *ctx, GLuint program)
 
    _mesa_glsl_link_shader(ctx, shProg);
 
+   if (shProg->LinkStatus == GL_TRUE)
+      shProg->NeedsRelink = false;
+
    if (shProg->LinkStatus == GL_FALSE && 
        (ctx->_Shader->Flags & GLSL_REPORT_ERRORS)) {
       _mesa_debug(ctx, "Error linking program %u:\n%s\n",
@@ -1770,6 +1774,7 @@ _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)
        *     is loaded again a recompile can be avoided."
        */
       shProg->BinaryRetreivableHint = value;
+      shProg->NeedsRelink = true;
       return;
 
    case GL_PROGRAM_SEPARABLE:
@@ -1785,6 +1790,7 @@ _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)
          return;
       }
       shProg->SeparateShader = value;
+      shProg->NeedsRelink = true;
       return;
 
    default:
diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c
index a737463..c037faa 100644
--- a/src/mesa/main/transformfeedback.c
+++ b/src/mesa/main/transformfeedback.c
@@ -771,6 +771,7 @@ _mesa_TransformFeedbackVaryings(GLuint program, GLsizei count,
    /* No need to invoke FLUSH_VERTICES or flag NewTransformFeedback since
     * the varyings won't be used until shader link time.
     */
+   shProg->NeedsRelink = true;
 }
 
 
diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
index 1daade4..39a61f7 100644
--- a/src/mesa/main/uniforms.c
+++ b/src/mesa/main/uniforms.c
@@ -1043,6 +1043,8 @@ _mesa_UniformBlockBinding(GLuint program,
 	    sh->UniformBlocks[stage_index].Binding = uniformBlockBinding;
 	 }
       }
+
+      shProg->NeedsRelink = true;
    }
 }
 
-- 
1.9.2



More information about the mesa-dev mailing list