Mesa (mesa_7_5_branch): st: do proper refcounting for framebuffer surfaces

Brian Paul brianp at kemper.freedesktop.org
Mon May 11 22:12:34 UTC 2009


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

Author: Brian Paul <brianp at vmware.com>
Date:   Mon May 11 16:09:39 2009 -0600

st: do proper refcounting for framebuffer surfaces

---

 src/mesa/state_tracker/st_atom_framebuffer.c |   16 ++++++++++------
 src/mesa/state_tracker/st_context.c          |    7 +++++++
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c
index df0f093..5362936 100644
--- a/src/mesa/state_tracker/st_atom_framebuffer.c
+++ b/src/mesa/state_tracker/st_atom_framebuffer.c
@@ -98,8 +98,6 @@ update_framebuffer_state( struct st_context *st )
    struct st_renderbuffer *strb;
    GLuint i;
 
-   memset(framebuffer, 0, sizeof(*framebuffer));
-
    framebuffer->width = fb->Width;
    framebuffer->height = fb->Height;
 
@@ -120,12 +118,19 @@ update_framebuffer_state( struct st_context *st )
          }
 
          if (strb->surface) {
-            framebuffer->cbufs[framebuffer->nr_cbufs] = strb->surface;
+            pipe_surface_reference(&framebuffer->cbufs[framebuffer->nr_cbufs],
+                                   strb->surface);
             framebuffer->nr_cbufs++;
          }
       }
    }
+   for (i = framebuffer->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; i++) {
+      pipe_surface_reference(&framebuffer->cbufs[i], NULL);
+   }
 
+   /*
+    * Depth/Stencil renderbuffer/surface.
+    */
    strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer);
    if (strb) {
       strb = st_renderbuffer(strb->Base.Wrapped);
@@ -133,15 +138,14 @@ update_framebuffer_state( struct st_context *st )
          /* rendering to a GL texture, may have to update surface */
          update_renderbuffer_surface(st, strb);
       }
-
-      framebuffer->zsbuf = strb->surface;
+      pipe_surface_reference(&framebuffer->zsbuf, strb->surface);
    }
    else {
       strb = st_renderbuffer(fb->Attachment[BUFFER_STENCIL].Renderbuffer);
       if (strb) {
          strb = st_renderbuffer(strb->Base.Wrapped);
          assert(strb->surface);
-         framebuffer->zsbuf = strb->surface;
+         pipe_surface_reference(&framebuffer->zsbuf, strb->surface);
       }
    }
 
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 2a1f21c..e536029 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -233,6 +233,7 @@ void st_destroy_context( struct st_context *st )
    struct pipe_context *pipe = st->pipe;
    struct cso_context *cso = st->cso_context;
    GLcontext *ctx = st->ctx;
+   GLuint i;
 
    /* need to unbind and destroy CSO objects before anything else */
    cso_release_all(st->cso_context);
@@ -240,6 +241,12 @@ void st_destroy_context( struct st_context *st )
    st_reference_fragprog(st, &st->fp, NULL);
    st_reference_vertprog(st, &st->vp, NULL);
 
+   /* release framebuffer surfaces */
+   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
+      pipe_surface_reference(&st->state.framebuffer.cbufs[i], NULL);
+   }
+   pipe_surface_reference(&st->state.framebuffer.zsbuf, NULL);
+
    _mesa_delete_program_cache(st->ctx, st->pixel_xfer.cache);
 
    _vbo_DestroyContext(st->ctx);




More information about the mesa-commit mailing list