diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-01-06 10:32:25 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-01-06 10:32:25 +0000 |
commit | 4f142f3a7bf24b659c5caccab3a1aedd6b680909 (patch) | |
tree | 75d80a6dfe4e69239b62463588f9c4bef5a66ede | |
parent | 45a4b42a361eb791c571b201e11c3505a0a1a396 (diff) | |
download | cairo-4f142f3a7bf24b659c5caccab3a1aedd6b680909.tar.gz |
xlib/shm: Only mark the shm pixmap as active if we upload into it
Be more strict with when we mark the pixmap as active so that we only
wait for the actual XCopyArea involving the pixmap to complete.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/cairo-xlib-surface-shm.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c index 1e2c6e6d9..2c2858cd2 100644 --- a/src/cairo-xlib-surface-shm.c +++ b/src/cairo-xlib-surface-shm.c @@ -1066,10 +1066,6 @@ _cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) damage = _cairo_damage_reduce (shm->image.base.damage); shm->image.base.damage = _cairo_damage_create (); - status = _cairo_xlib_surface_get_gc (display, surface, &gc); - if (unlikely (status)) - goto out; - TRACE ((stderr, "%s: flushing damage x %d\n", __FUNCTION__, damage->region ? cairo_region_num_rectangles (damage->region) : 0)); if (damage->status == CAIRO_STATUS_SUCCESS && damage->region) { @@ -1079,9 +1075,16 @@ _cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) int n_rects, i; n_rects = cairo_region_num_rectangles (damage->region); - if (n_rects == 0) { - } else if (n_rects == 1) { + if (n_rects == 0) + goto out; + + status = _cairo_xlib_surface_get_gc (display, surface, &gc); + if (unlikely (status)) + goto out; + + if (n_rects == 1) { cairo_region_get_rectangle (damage->region, 0, &r); + _cairo_xlib_shm_surface_mark_active (surface->shm); XCopyArea (display->display, shm->pixmap, surface->drawable, gc, r.x, r.y, @@ -1092,6 +1095,7 @@ _cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) rects = _cairo_malloc_ab (n_rects, sizeof (XRectangle)); if (unlikely (rects == NULL)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + _cairo_xlib_surface_put_gc (display, surface, gc); goto out; } } @@ -1105,6 +1109,7 @@ _cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) } XSetClipRectangles (display->display, gc, 0, 0, rects, i, YXBanded); + _cairo_xlib_shm_surface_mark_active (surface->shm); XCopyArea (display->display, shm->pixmap, surface->drawable, gc, 0, 0, @@ -1114,12 +1119,12 @@ _cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) if (damage->status == CAIRO_STATUS_SUCCESS && damage->region) XSetClipMask (display->display, gc, None); } + + _cairo_xlib_surface_put_gc (display, surface, gc); } - _cairo_damage_destroy (damage); - _cairo_xlib_shm_surface_mark_active (surface->shm); - _cairo_xlib_surface_put_gc (display, surface, gc); out: + _cairo_damage_destroy (damage); cairo_device_release (&display->base); } |