Chia-I, This looks like it introduces an extra full-window copying operation at every swapbuffers... is that correct?
If so, I think we should try to figure out an alternative approach without the copying... would actually flipping between two textures (thus preserving the old back/new front) contents be workable? Keith On Sun, Mar 14, 2010 at 5:17 AM, Chia-I Wu <o...@kemper.freedesktop.org> wrote: > Module: Mesa > Branch: gallium-st-api > Commit: d6262bdcfb64e1f88f6a890829f5c30c26bc372b > URL: > http://cgit.freedesktop.org/mesa/mesa/commit/?id=d6262bdcfb64e1f88f6a890829f5c30c26bc372b > > Author: Chia-I Wu <o...@lunarg.com> > Date: Sun Mar 14 12:01:27 2010 +0800 > > st/glx: Sync the back buffer to the front buffer. > > Consider this rendering sequence > > * render to the back buffer > * swap buffers > * read from the front buffer > > The front buffer is expected to have the contents of the back buffer. > > --- > > src/gallium/state_trackers/glx/xlib/xm_st.c | 26 ++++++++++++++++++++++---- > 1 files changed, 22 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/state_trackers/glx/xlib/xm_st.c > b/src/gallium/state_trackers/glx/xlib/xm_st.c > index de5a35e..bcb8285 100644 > --- a/src/gallium/state_trackers/glx/xlib/xm_st.c > +++ b/src/gallium/state_trackers/glx/xlib/xm_st.c > @@ -197,18 +197,36 @@ xmesa_st_framebuffer_validate(struct > st_framebuffer_iface *stfbi, > struct pipe_texture **out) > { > struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi); > - unsigned statt_mask, i; > + unsigned statt_mask, new_mask, i; > + boolean resized; > > statt_mask = 0x0; > for (i = 0; i < count; i++) > statt_mask |= 1 << statts[i]; > + /* record newly allocated textures */ > + new_mask = statt_mask & ~xstfb->texture_mask; > + > + resized = (xstfb->buffer->width != xstfb->texture_width || > + xstfb->buffer->height != xstfb->texture_height); > > /* revalidate textures */ > - if (xstfb->buffer->width != xstfb->texture_width || > - xstfb->buffer->height != xstfb->texture_height || > - (xstfb->texture_mask & statt_mask) != statt_mask) { > + if (resized || new_mask) { > xmesa_st_framebuffer_validate_textures(stfbi, > xstfb->buffer->width, xstfb->buffer->height, statt_mask); > + > + if (!resized) { > + enum st_attachment_type back, front; > + > + back = ST_ATTACHMENT_BACK_LEFT; > + front = ST_ATTACHMENT_FRONT_LEFT; > + /* copy the contents if front is newly allocated and back is not */ > + if ((statt_mask & (1 << back)) && > + (new_mask & (1 << front)) && > + !(new_mask & (1 << back))) { > + xmesa_st_framebuffer_copy_textures(stfbi, back, front, > + 0, 0, xstfb->texture_width, xstfb->texture_height); > + } > + } > } > > for (i = 0; i < count; i++) { > > _______________________________________________ > mesa-commit mailing list > mesa-com...@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-commit > ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev