From 2fa407be8b982016d355c51bd32f3023b9ee0140 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 19 Jan 2009 12:53:58 -0700 Subject: [PATCH] statetracker: copy back color buffer to front buffer when needed Fixes front-buffer rendering when following a SwapBuffers. See progs/tests/rubberband.c --- src/mesa/state_tracker/st_atom_framebuffer.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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; -- 2.30.2