Mesa (7.10): mesa: invalidate framebuffer if internal format of renderbuffer is changed

Marek Olšák mareko at kemper.freedesktop.org
Sun Jun 12 04:18:38 UTC 2011


Module: Mesa
Branch: 7.10
Commit: b10abac70e9005799d0c9be2a089458f0703ce25
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b10abac70e9005799d0c9be2a089458f0703ce25

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sun Mar  6 05:26:12 2011 +0100

mesa: invalidate framebuffer if internal format of renderbuffer is changed

RenderTexture doesn't have to be called in invalidate_rb, I guess.
(cherry picked from commit df818d572e4ddb1ceccd22a538bf98ce01caffee)

---

 src/mesa/main/fbobject.c |   35 +++++++++++++++++++++++++++++------
 src/mesa/main/mtypes.h   |    2 ++
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 6c63047..0f946a1 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -359,6 +359,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);
@@ -1023,6 +1024,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
 
@@ -1115,12 +1140,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 19724d9..fad24eb 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2352,6 +2352,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;
 




More information about the mesa-commit mailing list