summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2009-01-19 12:53:58 -0700
committerBrian Paul <brianp@vmware.com>2009-01-19 12:55:35 -0700
commit2fa407be8b982016d355c51bd32f3023b9ee0140 (patch)
treed9260664d42ef1d26877414501675c5721b356bf
parentb9a3952f8f04a25818aba69e235e3d250c064cb8 (diff)
statetracker: copy back color buffer to front buffer when needed
Fixes front-buffer rendering when following a SwapBuffers. See progs/tests/rubberband.c
-rw-r--r--src/mesa/state_tracker/st_atom_framebuffer.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c
index ca1a719a9ac..092cdab2bd6 100644
--- a/src/mesa/state_tracker/st_atom_framebuffer.c
+++ b/src/mesa/state_tracker/st_atom_framebuffer.c
@@ -34,6 +34,7 @@
#include "st_context.h"
#include "st_atom.h"
#include "st_cb_fbo.h"
+#include "st_public.h"
#include "st_texture.h"
#include "pipe/p_context.h"
#include "pipe/p_inlines.h"
@@ -146,7 +147,18 @@ update_framebuffer_state( struct st_context *st )
if (fb->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT) {
if (st->frontbuffer_status == FRONT_STATUS_COPY_OF_BACK) {
- /* XXX copy back buf to front? */
+ /* copy back color buffer to front color buffer */
+ struct st_framebuffer *stfb = (struct st_framebuffer *) fb;
+ struct pipe_surface *surf_front
+ = st_get_framebuffer_surface(stfb, ST_SURFACE_FRONT_LEFT);
+ struct pipe_surface *surf_back
+ = st_get_framebuffer_surface(stfb, ST_SURFACE_BACK_LEFT);
+
+ st->pipe->surface_copy(st->pipe,
+ FALSE,
+ surf_front, 0, 0, /* dest */
+ surf_back, 0, 0, /* src */
+ fb->Width, fb->Height);
}
/* we're assuming we'll really draw to the front buffer */
st->frontbuffer_status = FRONT_STATUS_DIRTY;