From df818d572e4ddb1ceccd22a538bf98ce01caffee Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Sun, 6 Mar 2011 05:26:12 +0100 Subject: mesa: invalidate framebuffer if internal format of renderbuffer is changed RenderTexture doesn't have to be called in invalidate_rb, I guess. --- src/mesa/main/fbobject.c | 35 +++++++++++++++++++++++++++++------ src/mesa/main/mtypes.h | 2 ++ 2 files changed, 31 insertions(+), 6 deletions(-) (limited to 'src/mesa/main') diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index c242e568d0..be8e9d5fa9 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -384,6 +384,7 @@ _mesa_framebuffer_renderbuffer(struct gl_context *ctx, assert(att); _mesa_set_renderbuffer_attachment(ctx, att, rb); } + rb->AttachedAnytime = GL_TRUE; } else { _mesa_remove_attachment(ctx, att); @@ -1115,6 +1116,30 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat) } +/** + * Invalidate a renderbuffer attachment. Called from _mesa_HashWalk(). + */ +static void +invalidate_rb(GLuint key, void *data, void *userData) +{ + struct gl_framebuffer *fb = (struct gl_framebuffer *) data; + struct gl_renderbuffer *rb = (struct gl_renderbuffer *) userData; + + /* If this is a user-created FBO */ + if (fb->Name) { + GLuint i; + for (i = 0; i < BUFFER_COUNT; i++) { + struct gl_renderbuffer_attachment *att = fb->Attachment + i; + if (att->Type == GL_RENDERBUFFER && + att->Renderbuffer == rb) { + /* Mark fb status as indeterminate to force re-validation */ + fb->_Status = 0; + } + } + } +} + + /** sentinal value, see below */ #define NO_SAMPLES 1000 @@ -1207,12 +1232,10 @@ renderbuffer_storage(GLenum target, GLenum internalFormat, rb->NumSamples = 0; } - /* - test_framebuffer_completeness(ctx, fb); - */ - /* XXX if this renderbuffer is attached anywhere, invalidate attachment - * points??? - */ + /* Invalidate the framebuffers the renderbuffer is attached in. */ + if (rb->AttachedAnytime) { + _mesa_HashWalk(ctx->Shared->FrameBuffers, invalidate_rb, rb); + } } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index db3eba20c6..49ecea59d3 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2376,6 +2376,8 @@ struct gl_renderbuffer GLenum DataType; /**< Type of values passed to the Get/Put functions */ GLvoid *Data; /**< This may not be used by some kinds of RBs */ + GLboolean AttachedAnytime; /**< TRUE if it was attached to a framebuffer */ + /* Used to wrap one renderbuffer around another: */ struct gl_renderbuffer *Wrapped; -- cgit v1.2.3