perf: Make xlib testing wait for the X server to finish rendering.

We do this by adding a new cairo_perf_timer_set_finalize function and
in the case of the xlib backend passing a callback to that function
that does a 1x1 XGetImage.
This commit is contained in:
Carl Worth 2006-09-09 20:17:08 -07:00
parent e1a8a8b65a
commit cb6aed0a81
5 changed files with 39 additions and 2 deletions

17
boilerplate/cairo-boilerplate.c Executable file → Normal file
View file

@ -919,6 +919,17 @@ typedef struct _xlib_target_closure
cairo_bool_t drawable_is_pixmap;
} xlib_target_closure_t;
static void
boilerplate_xlib_wait_for_rendering (void *closure)
{
xlib_target_closure_t *xtc = closure;
XImage *ximage;
ximage = XGetImage (xtc->dpy, xtc->drawable,
0, 0, 1, 1, AllPlanes, ZPixmap);
XDestroyImage (ximage);
}
/* For the xlib backend we distinguish between TEST and PERF mode in a
* couple of ways.
*
@ -1478,9 +1489,11 @@ cairo_boilerplate_target_t targets[] =
#endif
#if CAIRO_HAS_XLIB_SURFACE
{ "xlib", CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR_ALPHA, 0,
create_xlib_surface, cairo_surface_write_to_png, cleanup_xlib},
create_xlib_surface, cairo_surface_write_to_png, cleanup_xlib,
boilerplate_xlib_wait_for_rendering},
{ "xlib", CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR, 0,
create_xlib_surface, cairo_surface_write_to_png, cleanup_xlib},
create_xlib_surface, cairo_surface_write_to_png, cleanup_xlib,
boilerplate_xlib_wait_for_rendering},
#endif
#if CAIRO_HAS_PS_SURFACE
{ "ps", CAIRO_SURFACE_TYPE_PS,

View file

@ -107,6 +107,9 @@ typedef cairo_status_t
typedef void
(*cairo_boilerplate_cleanup_t) (void *closure);
typedef void
(*cairo_boilerplate_wait_t) (void *closure);
typedef struct _cairo_boilerplate_target
{
const char *name;
@ -116,6 +119,7 @@ typedef struct _cairo_boilerplate_target
cairo_boilerplate_create_surface_t create_surface;
cairo_boilerplate_write_to_png_t write_to_png;
cairo_boilerplate_cleanup_t cleanup;
cairo_boilerplate_wait_t wait_for_rendering;
void *closure;
} cairo_boilerplate_target_t;

View file

@ -130,8 +130,20 @@ cairo_perf_timer_start (void) {
#endif
}
static cairo_perf_timer_finalize_t cairo_perf_timer_finalize = NULL;
static void *cairo_perf_timer_finalize_closure = NULL;
void
cairo_perf_timer_set_finalize (cairo_perf_timer_finalize_t finalize,
void *closure)
{
cairo_perf_timer_finalize = finalize;
cairo_perf_timer_finalize_closure = closure;
}
void
cairo_perf_timer_stop (void) {
if (cairo_perf_timer_finalize)
cairo_perf_timer_finalize (cairo_perf_timer_finalize_closure);
#ifdef OIL_STAMP
timer.stop = OIL_STAMP ();
#else

View file

@ -162,6 +162,7 @@ main (int argc, char *argv[])
size, size,
CAIRO_BOILERPLATE_MODE_PERF,
&target->closure);
cairo_perf_timer_set_finalize (target->wait_for_rendering, target->closure);
cr = cairo_create (surface);
for (k =0; k < cairo_perf_iterations; k++) {
cairo_perf_yield ();

View file

@ -38,6 +38,13 @@ cairo_perf_timer_start (void);
void
cairo_perf_timer_stop (void);
typedef void
(*cairo_perf_timer_finalize_t) (void *closure);
void
cairo_perf_timer_set_finalize (cairo_perf_timer_finalize_t finalize,
void *closure);
typedef uint64_t cairo_perf_ticks_t;
cairo_perf_ticks_t