mesa: Branch 'master'

Michel Daenzer daenzer at kemper.freedesktop.org
Mon Mar 26 15:39:41 UTC 2007


 src/mesa/drivers/dri/i915tex/intel_fbo.c    |   24 ++++++++++++++++++------
 src/mesa/drivers/dri/i915tex/intel_screen.c |    3 +++
 2 files changed, 21 insertions(+), 6 deletions(-)

New commits:
diff-tree 76f3b66e0489526694d6a39b4a6ac3b1c2bee100 (from 8051c95a7ede9b9cd4fa89445c52bbcaa7ff766c)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Mon Mar 26 17:38:58 2007 +0200

    i915tex: Make sure renderbuffers don't get deleted when flipping them.
    
    Since the recent renderbuffer refcounting fixes it's no longer sufficient to
    just remove the old renderbuffer from the framebuffer and then add the new one
    because the former may decrease the reference count to 0 and delete the old
    renderbuffer.

diff --git a/src/mesa/drivers/dri/i915tex/intel_fbo.c b/src/mesa/drivers/dri/i915tex/intel_fbo.c
index 8d43055..9b84faa 100644
--- a/src/mesa/drivers/dri/i915tex/intel_fbo.c
+++ b/src/mesa/drivers/dri/i915tex/intel_fbo.c
@@ -80,21 +80,33 @@ intel_flip_renderbuffers(struct intel_fr
 {
    int current_page = intel_fb->pf_current_page;
    int next_page = (current_page + 1) % intel_fb->pf_num_pages;
+   struct gl_renderbuffer *tmp_rb;
 
+   /* Exchange renderbuffers if necessary but make sure their reference counts
+    * are preserved.
+    */
    if (intel_fb->color_rb[current_page] &&
        intel_fb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer !=
        &intel_fb->color_rb[current_page]->Base) {
-      _mesa_remove_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT);
-      _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,
-			     &intel_fb->color_rb[current_page]->Base);
+      tmp_rb = NULL;
+      _mesa_reference_renderbuffer(&tmp_rb,
+	 intel_fb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
+      tmp_rb = &intel_fb->color_rb[current_page]->Base;
+      _mesa_reference_renderbuffer(
+	 &intel_fb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer, tmp_rb);
+      _mesa_reference_renderbuffer(&tmp_rb, NULL);
    }
 
    if (intel_fb->color_rb[next_page] &&
        intel_fb->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer !=
        &intel_fb->color_rb[next_page]->Base) {
-      _mesa_remove_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT);
-      _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
-			     &intel_fb->color_rb[next_page]->Base);
+      tmp_rb = NULL;
+      _mesa_reference_renderbuffer(&tmp_rb,
+	 intel_fb->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer);
+      tmp_rb = &intel_fb->color_rb[next_page]->Base;
+      _mesa_reference_renderbuffer(
+	 &intel_fb->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer, tmp_rb);
+      _mesa_reference_renderbuffer(&tmp_rb, NULL);
    }
 }
 
diff --git a/src/mesa/drivers/dri/i915tex/intel_screen.c b/src/mesa/drivers/dri/i915tex/intel_screen.c
index a634204..9034ee1 100644
--- a/src/mesa/drivers/dri/i915tex/intel_screen.c
+++ b/src/mesa/drivers/dri/i915tex/intel_screen.c
@@ -613,6 +613,8 @@ intelCreateBuffer(__DRIscreenPrivate * d
 				&intel_fb->color_rb[1]->Base);
 
 	 if (screen->third.handle) {
+	    struct gl_renderbuffer *tmp_rb = NULL;
+
 	    intel_fb->color_rb[2]
 	       = intel_create_renderbuffer(rgbFormat,
 					   screen->width, screen->height,
@@ -621,6 +623,7 @@ intelCreateBuffer(__DRIscreenPrivate * d
 					   screen->cpp,
 					   screen->third.map);
 	    intel_set_span_functions(&intel_fb->color_rb[2]->Base);
+	    _mesa_reference_renderbuffer(&tmp_rb, &intel_fb->color_rb[2]->Base);
 	 }
       }
 



More information about the mesa-commit mailing list