mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-04 22:18:29 +02:00
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:
parent
e1a8a8b65a
commit
cb6aed0a81
5 changed files with 39 additions and 2 deletions
17
boilerplate/cairo-boilerplate.c
Executable file → Normal file
17
boilerplate/cairo-boilerplate.c
Executable file → Normal 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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue