Mesa (7.9): mesa: Make metaops use program refcounts instead of names.
Ian Romanick
idr at kemper.freedesktop.org
Wed Dec 15 20:19:25 UTC 2010
Module: Mesa
Branch: 7.9
Commit: 44df2b08445c54bb59a36d9b8d6b66f4b22da6ed
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=44df2b08445c54bb59a36d9b8d6b66f4b22da6ed
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Wed Dec 15 12:14:08 2010 -0800
mesa: Make metaops use program refcounts instead of names.
Fixes failure on restoring state when the program was active but
deleted, and the name no longer exists.
Bug #31194
(cherry picked from commit a974949f3b586eee2bc8d6d97d3adb71796fe167)
Conflicts:
src/mesa/drivers/common/meta.c
src/mesa/main/shaderapi.c
src/mesa/main/shaderapi.h
This required substantial edits because the 7.9 branch doesn't have
the EXT_separate_shader_objects changes.
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/mesa/drivers/common/meta.c | 9 +++--
src/mesa/main/shaderapi.c | 67 ++++++++++++++++++++-------------------
src/mesa/main/shaderapi.h | 8 ++++-
3 files changed, 46 insertions(+), 38 deletions(-)
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 20dda5f..758bcf8 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -53,6 +53,7 @@
#include "main/readpix.h"
#include "main/scissor.h"
#include "main/shaderapi.h"
+#include "main/shaderobj.h"
#include "main/state.h"
#include "main/stencil.h"
#include "main/texobj.h"
@@ -147,7 +148,7 @@ struct save_state
struct gl_vertex_program *VertexProgram;
GLboolean FragmentProgramEnabled;
struct gl_fragment_program *FragmentProgram;
- GLuint Shader;
+ struct gl_shader_program *Shader;
/** META_STENCIL_TEST */
struct gl_stencil_attrib Stencil;
@@ -443,8 +444,8 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)
}
if (ctx->Extensions.ARB_shader_objects) {
- save->Shader = ctx->Shader.CurrentProgram ?
- ctx->Shader.CurrentProgram->Name : 0;
+ _mesa_reference_shader_program(ctx, &save->Shader,
+ ctx->Shader.CurrentProgram);
_mesa_UseProgramObjectARB(0);
}
}
@@ -678,7 +679,7 @@ _mesa_meta_end(GLcontext *ctx)
}
if (ctx->Extensions.ARB_shader_objects) {
- _mesa_UseProgramObjectARB(save->Shader);
+ _mesa_use_program(ctx, save->Shader);
}
}
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 4b69544..0ff033b 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -911,44 +911,14 @@ print_shader_info(const struct gl_shader_program *shProg)
* Use the named shader program for subsequent rendering.
*/
void
-_mesa_use_program(GLcontext *ctx, GLuint program)
+_mesa_use_program(GLcontext *ctx, struct gl_shader_program *shProg)
{
- struct gl_shader_program *shProg;
- struct gl_transform_feedback_object *obj =
- ctx->TransformFeedback.CurrentObject;
-
- if (obj->Active) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glUseProgram(transform feedback active)");
- return;
- }
-
if (ctx->Shader.CurrentProgram &&
- ctx->Shader.CurrentProgram->Name == program) {
+ ctx->Shader.CurrentProgram == shProg) {
/* no-op */
return;
}
- if (program) {
- shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseProgram");
- if (!shProg) {
- return;
- }
- if (!shProg->LinkStatus) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glUseProgram(program %u not linked)", program);
- return;
- }
-
- /* debug code */
- if (ctx->Shader.Flags & GLSL_USE_PROG) {
- print_shader_info(shProg);
- }
- }
- else {
- shProg = NULL;
- }
-
if (ctx->Shader.CurrentProgram != shProg) {
FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS);
_mesa_reference_shader_program(ctx, &ctx->Shader.CurrentProgram, shProg);
@@ -1502,8 +1472,39 @@ void GLAPIENTRY
_mesa_UseProgramObjectARB(GLhandleARB program)
{
GET_CURRENT_CONTEXT(ctx);
+ struct gl_shader_program *shProg;
+ struct gl_transform_feedback_object *obj =
+ ctx->TransformFeedback.CurrentObject;
+
FLUSH_VERTICES(ctx, _NEW_PROGRAM);
- _mesa_use_program(ctx, program);
+
+ if (obj->Active) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glUseProgram(transform feedback active)");
+ return;
+ }
+
+ if (program) {
+ shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseProgram");
+ if (!shProg) {
+ return;
+ }
+ if (!shProg->LinkStatus) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glUseProgram(program %u not linked)", program);
+ return;
+ }
+
+ /* debug code */
+ if (ctx->Shader.Flags & GLSL_USE_PROG) {
+ print_shader_info(shProg);
+ }
+ }
+ else {
+ shProg = NULL;
+ }
+
+ _mesa_use_program(ctx, shProg);
}
diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h
index 16e2253..4dba4f8 100644
--- a/src/mesa/main/shaderapi.h
+++ b/src/mesa/main/shaderapi.h
@@ -39,8 +39,11 @@ _mesa_copy_string(GLchar *dst, GLsizei maxLength,
GLsizei *length, const GLchar *src);
extern void
-_mesa_use_program(GLcontext *ctx, GLuint program);
+_mesa_use_program(GLcontext *ctx, struct gl_shader_program *shProg);
+extern void
+_mesa_active_program(GLcontext *ctx, struct gl_shader_program *shProg,
+ const char *caller);
extern void
_mesa_init_shader_dispatch(struct _glapi_table *exec);
@@ -165,5 +168,8 @@ _mesa_ShaderBinary(GLint n, const GLuint *shaders, GLenum binaryformat,
extern void GLAPIENTRY
_mesa_ProgramParameteriARB(GLuint program, GLenum pname,
GLint value);
+void
+_mesa_use_shader_program(GLcontext *ctx, GLenum type,
+ struct gl_shader_program *shProg);
#endif /* SHADERAPI_H */
More information about the mesa-commit
mailing list