diff options
author | Chia-I Wu <[email protected]> | 2010-03-13 00:48:23 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2010-03-13 13:05:21 +0800 |
commit | 9222c0934910172daf2405b0e581becdfbc80405 (patch) | |
tree | b24e9ad80a06a753d2a9118d8c3b3749fa41728f /src/gallium/state_trackers | |
parent | 5d66fc6e3a78f3ebdbeac647a786063293750abb (diff) |
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.
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/egl/x11/native_ximage.c | 22 |
1 files changed, 15 insertions, 7 deletions
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); |