summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2010-03-13 00:48:23 +0800
committerChia-I Wu <[email protected]>2010-03-13 13:05:21 +0800
commit9222c0934910172daf2405b0e581becdfbc80405 (patch)
treeb24e9ad80a06a753d2a9118d8c3b3749fa41728f
parent5d66fc6e3a78f3ebdbeac647a786063293750abb (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.
-rw-r--r--src/gallium/state_trackers/egl/x11/native_ximage.c22
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);