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

Ian Romanick idr at freedesktop.org
Fri Aug 22 13:29:56 PDT 2014


On 05/14/2014 05:28 PM, Kenneth Graunke wrote:
> 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

And also glDetachShader, right?

> 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;
>     }
>  }
>  
> 



More information about the mesa-dev mailing list