diff options
author | marha <marha@users.sourceforge.net> | 2011-06-23 09:11:12 +0200 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-06-23 09:11:12 +0200 |
commit | 97c96ddb6f56be198c2e8bf04ff25bc7b48dd1f2 (patch) | |
tree | f753c413a2349158d33e31e69cde9cc2002becf9 /mesalib/src/mesa/state_tracker/st_manager.c | |
parent | 1b072e6a8a80ac63d1b3469d76d4854d5c7835c1 (diff) | |
download | vcxsrv-97c96ddb6f56be198c2e8bf04ff25bc7b48dd1f2.tar.gz vcxsrv-97c96ddb6f56be198c2e8bf04ff25bc7b48dd1f2.tar.bz2 vcxsrv-97c96ddb6f56be198c2e8bf04ff25bc7b48dd1f2.zip |
libX11 mesa pixman xserver git update 23 June 2011
Diffstat (limited to 'mesalib/src/mesa/state_tracker/st_manager.c')
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_manager.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/mesalib/src/mesa/state_tracker/st_manager.c b/mesalib/src/mesa/state_tracker/st_manager.c index 46be55318..c95514cbe 100644 --- a/mesalib/src/mesa/state_tracker/st_manager.c +++ b/mesalib/src/mesa/state_tracker/st_manager.c @@ -716,38 +716,49 @@ st_api_get_current(struct st_api *stapi) return (st) ? &st->iface : NULL; } +static struct st_framebuffer * +st_framebuffer_reuse_or_create(struct gl_framebuffer *fb, + struct st_framebuffer_iface *stfbi) +{ + struct st_framebuffer *cur = st_ws_framebuffer(fb), *stfb = NULL; + + if (cur && cur->iface == stfbi) { + /* reuse the current stfb */ + st_framebuffer_reference(&stfb, cur); + } + else { + /* create a new one */ + stfb = st_framebuffer_create(stfbi); + } + + return stfb; +} + static boolean st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi, struct st_framebuffer_iface *stdrawi, struct st_framebuffer_iface *streadi) { struct st_context *st = (struct st_context *) stctxi; - struct st_framebuffer *stdraw, *stread, *stfb; + struct st_framebuffer *stdraw, *stread; boolean ret; _glapi_check_multithread(); if (st) { - /* reuse/create the draw fb */ - stfb = st_ws_framebuffer(st->ctx->WinSysDrawBuffer); - if (stfb && stfb->iface == stdrawi) { - stdraw = NULL; - st_framebuffer_reference(&stdraw, stfb); + /* reuse or create the draw fb */ + stdraw = st_framebuffer_reuse_or_create(st->ctx->WinSysDrawBuffer, + stdrawi); + if (streadi != stdrawi) { + /* do the same for the read fb */ + stread = st_framebuffer_reuse_or_create(st->ctx->WinSysReadBuffer, + streadi); } else { - stdraw = st_framebuffer_create(stdrawi); - } - - /* reuse/create the read fb */ - stfb = st_ws_framebuffer(st->ctx->WinSysReadBuffer); - if (!stfb || stfb->iface != streadi) - stfb = stdraw; - if (stfb && stfb->iface == streadi) { stread = NULL; - st_framebuffer_reference(&stread, stfb); - } - else { - stread = st_framebuffer_create(streadi); + /* reuse the draw fb for the read fb */ + if (stdraw) + st_framebuffer_reference(&stread, stdraw); } if (stdraw && stread) { |