[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