diff options
author | Brian Paul <brianp@vmware.com> | 2009-01-19 12:53:58 -0700 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2009-01-19 12:55:35 -0700 |
commit | 2fa407be8b982016d355c51bd32f3023b9ee0140 (patch) | |
tree | d9260664d42ef1d26877414501675c5721b356bf | |
parent | b9a3952f8f04a25818aba69e235e3d250c064cb8 (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.c | 14 |
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; |