From: Chia-I Wu Date: Fri, 12 Mar 2010 16:48:23 +0000 (+0800) Subject: st/egl: Cache the pipe surface used in flush_frontbuffer. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9222c0934910172daf2405b0e581becdfbc80405;p=mesa.git st/egl: Cache the pipe surface used in flush_frontbuffer. It is very likely that the same surface will be flushed again and again. Caching the surface should reduce the overhead of surface creation. --- diff --git a/src/gallium/state_trackers/egl/x11/native_ximage.c b/src/gallium/state_trackers/egl/x11/native_ximage.c index e0d12acabe8..c6b16354f9b 100644 --- a/src/gallium/state_trackers/egl/x11/native_ximage.c +++ b/src/gallium/state_trackers/egl/x11/native_ximage.c @@ -82,6 +82,8 @@ struct ximage_surface { int width, height; struct ximage_buffer buffers[NUM_NATIVE_ATTACHMENTS]; uint valid_mask; + + struct pipe_surface *draw_surface; }; struct ximage_config { @@ -266,15 +268,19 @@ ximage_surface_draw_buffer(struct native_surface *nsurf, assert(xsurf->drawable && xbuf->texture); - /* what's the cost of surface creation? */ - psurf = screen->get_tex_surface(screen, - xbuf->texture, 0, 0, 0, PIPE_BUFFER_USAGE_CPU_READ); - if (!psurf) - return FALSE; + psurf = xsurf->draw_surface; + if (!psurf || psurf->texture != xbuf->texture) { + pipe_surface_reference(&xsurf->draw_surface, NULL); - screen->flush_frontbuffer(screen, psurf, &xbuf->xdraw); + psurf = screen->get_tex_surface(screen, + xbuf->texture, 0, 0, 0, PIPE_BUFFER_USAGE_CPU_READ); + if (!psurf) + return FALSE; - pipe_surface_reference(&psurf, NULL); + xsurf->draw_surface = psurf; + } + + screen->flush_frontbuffer(screen, psurf, &xbuf->xdraw); return TRUE; } @@ -371,6 +377,8 @@ ximage_surface_destroy(struct native_surface *nsurf) struct ximage_surface *xsurf = ximage_surface(nsurf); int i; + pipe_surface_reference(&xsurf->draw_surface, NULL); + for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) ximage_surface_free_buffer(&xsurf->base, i);