diff options
author | Michel Dänzer <[email protected]> | 2007-03-26 17:38:58 +0200 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2007-03-26 17:38:58 +0200 |
commit | 76f3b66e0489526694d6a39b4a6ac3b1c2bee100 (patch) | |
tree | 40dd46e0390469228e9f649878e3295e9bb48bb8 /src/mesa/drivers/dri/i915tex | |
parent | 8051c95a7ede9b9cd4fa89445c52bbcaa7ff766c (diff) |
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.
Diffstat (limited to 'src/mesa/drivers/dri/i915tex')
-rw-r--r-- | src/mesa/drivers/dri/i915tex/intel_fbo.c | 24 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915tex/intel_screen.c | 3 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i915tex/intel_fbo.c b/src/mesa/drivers/dri/i915tex/intel_fbo.c index 8d430553822..9b84faaeb7d 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_framebuffer *intel_fb) { 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 a6342046b5f..9034ee1b223 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 * driScrnPriv, &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 * driScrnPriv, 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); } } |