From 3b525036b94f041ebae192b9737b93c8c264befa Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Fri, 31 May 2013 22:48:48 +0200 Subject: st/dri: manually swap MSAA front and back buffers in SwapBuffers Reviewed-by: Brian Paul --- .../state_trackers/dri/common/dri_drawable.c | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/gallium/state_trackers/dri') diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c b/src/gallium/state_trackers/dri/common/dri_drawable.c index ff04d57a258..1c2bad42cbe 100644 --- a/src/gallium/state_trackers/dri/common/dri_drawable.c +++ b/src/gallium/state_trackers/dri/common/dri_drawable.c @@ -414,6 +414,7 @@ dri_flush(__DRIcontext *cPriv, struct dri_context *ctx = dri_context(cPriv); struct dri_drawable *drawable = dri_drawable(dPriv); unsigned flush_flags; + boolean swap_msaa_buffers = FALSE; if (!ctx) { assert(0); @@ -440,6 +441,12 @@ dri_flush(__DRIcontext *cPriv, drawable->textures[ST_ATTACHMENT_BACK_LEFT], drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]); + if (reason == __DRI2_THROTTLE_SWAPBUFFER && + drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT] && + drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]) { + swap_msaa_buffers = TRUE; + } + /* FRONT_LEFT is resolved in drawable->flush_frontbuffer. */ } @@ -494,6 +501,24 @@ dri_flush(__DRIcontext *cPriv, if (drawable) { drawable->flushing = FALSE; } + + /* Swap the MSAA front and back buffers, so that reading + * from the front buffer after SwapBuffers returns what was + * in the back buffer. + */ + if (swap_msaa_buffers) { + struct pipe_resource *tmp = + drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT]; + + drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT] = + drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]; + drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT] = tmp; + + /* Now that we have swapped the buffers, this tells the state + * tracker to revalidate the framebuffer. + */ + p_atomic_inc(&drawable->base.stamp); + } } /** -- cgit v1.2.3