summaryrefslogtreecommitdiff
path: root/src/cairo-surface-observer.c
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2011-08-30 16:15:28 +0200
committerAndrea Canciani <ranma42@gmail.com>2011-09-02 12:27:13 +0200
commit0101a545793291d0fe76b765ba8392ade5faa1a1 (patch)
tree7294a6416e8036672b41cae84c3f2ff6849154f3 /src/cairo-surface-observer.c
parente7204a3631d29d334511f291db8c31ce0026e2ce (diff)
downloadcairo-0101a545793291d0fe76b765ba8392ade5faa1a1.tar.gz
time: Add cairo_time_t type
Add the cairo_time_t type (currently based on cairo_uint64_t) and use it in cairo-observer and in the perf suite. Fixes the build on MacOS X (for the src/ subdir) and Win32, whch failed because they don't provide clock_gettime: cairo-surface-observer.c:629: error: implicit declaration of function 'clock_gettime' cairo-surface-observer.c:629: warning: nested extern declaration of 'clock_gettime' cairo-surface-observer.c:629: error: 'CLOCK_MONOTONIC' undeclared (first use in this function) ...
Diffstat (limited to 'src/cairo-surface-observer.c')
-rw-r--r--src/cairo-surface-observer.c169
1 files changed, 74 insertions, 95 deletions
diff --git a/src/cairo-surface-observer.c b/src/cairo-surface-observer.c
index 92f26240a..a0dcb2f5b 100644
--- a/src/cairo-surface-observer.c
+++ b/src/cairo-surface-observer.c
@@ -487,7 +487,7 @@ record_paint (cairo_observation_record_t *r,
cairo_operator_t op,
const cairo_pattern_t *source,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
record_target (r, target);
@@ -512,7 +512,7 @@ record_mask (cairo_observation_record_t *r,
const cairo_pattern_t *source,
const cairo_pattern_t *mask,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
record_target (r, target);
@@ -540,7 +540,7 @@ record_fill (cairo_observation_record_t *r,
double tolerance,
cairo_antialias_t antialias,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
record_target (r, target);
@@ -570,7 +570,7 @@ record_stroke (cairo_observation_record_t *r,
double tolerance,
cairo_antialias_t antialias,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
record_target (r, target);
@@ -597,7 +597,7 @@ record_glyphs (cairo_observation_record_t *r,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
record_target (r, target);
@@ -628,25 +628,6 @@ add_record (cairo_observation_t *log,
}
static void
-start_timer (struct timespec *ts)
-{
- clock_gettime (CLOCK_MONOTONIC, ts);
-}
-
-static double
-stop_timer (const struct timespec *then)
-{
- struct timespec now;
- double elapsed;
-
- clock_gettime (CLOCK_MONOTONIC, &now);
-
- elapsed = now.tv_nsec - then->tv_nsec;
- elapsed += 1e9 * (now.tv_sec - then->tv_sec);
- return elapsed;
-}
-
-static void
sync (cairo_surface_t *target, int x, int y)
{
cairo_rectangle_t extents;
@@ -674,7 +655,7 @@ add_record_paint (cairo_observation_t *log,
cairo_operator_t op,
const cairo_pattern_t *source,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
cairo_observation_record_t record;
cairo_int_status_t status;
@@ -692,9 +673,9 @@ add_record_paint (cairo_observation_t *log,
assert (status == CAIRO_INT_STATUS_SUCCESS);
}
- if (elapsed > log->paint.slowest.elapsed)
+ if (_cairo_time_gt (elapsed, log->paint.slowest.elapsed))
log->paint.slowest = record;
- log->paint.elapsed += elapsed;
+ log->paint.elapsed = _cairo_time_add (log->paint.elapsed, elapsed);
}
static cairo_int_status_t
@@ -708,8 +689,7 @@ _cairo_surface_observer_paint (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
- double elapsed;
+ cairo_time_t t;
int x, y;
/* XXX device locking */
@@ -741,7 +721,7 @@ _cairo_surface_observer_paint (void *abstract_surface,
add_extents (&device->log.paint.extents, &composite);
_cairo_composite_rectangles_fini (&composite);
- start_timer (&ts);
+ t = _cairo_time_get ();
status = _cairo_surface_paint (surface->target,
op, source,
clip);
@@ -749,10 +729,10 @@ _cairo_surface_observer_paint (void *abstract_surface,
return status;
sync (surface->target, x, y);
- elapsed = stop_timer (&ts);
+ t = _cairo_time_get_delta (t);
- add_record_paint (&surface->log, surface->target, op, source, clip, elapsed);
- add_record_paint (&device->log, surface->target, op, source, clip, elapsed);
+ add_record_paint (&surface->log, surface->target, op, source, clip, t);
+ add_record_paint (&device->log, surface->target, op, source, clip, t);
return CAIRO_STATUS_SUCCESS;
}
@@ -764,7 +744,7 @@ add_record_mask (cairo_observation_t *log,
const cairo_pattern_t *source,
const cairo_pattern_t *mask,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
cairo_observation_record_t record;
cairo_int_status_t status;
@@ -778,9 +758,9 @@ add_record_mask (cairo_observation_t *log,
assert (status == CAIRO_INT_STATUS_SUCCESS);
}
- if (elapsed > log->mask.slowest.elapsed)
+ if (_cairo_time_gt (elapsed, log->mask.slowest.elapsed))
log->mask.slowest = record;
- log->mask.elapsed += elapsed;
+ log->mask.elapsed = _cairo_time_add (log->mask.elapsed, elapsed);
}
static cairo_int_status_t
@@ -795,8 +775,7 @@ _cairo_surface_observer_mask (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
- double elapsed;
+ cairo_time_t t;
int x, y;
surface->log.mask.count++;
@@ -828,7 +807,7 @@ _cairo_surface_observer_mask (void *abstract_surface,
add_extents (&device->log.mask.extents, &composite);
_cairo_composite_rectangles_fini (&composite);
- start_timer (&ts);
+ t = _cairo_time_get ();
status = _cairo_surface_mask (surface->target,
op, source, mask,
clip);
@@ -836,14 +815,14 @@ _cairo_surface_observer_mask (void *abstract_surface,
return status;
sync (surface->target, x, y);
- elapsed = stop_timer (&ts);
+ t = _cairo_time_get_delta (t);
add_record_mask (&surface->log,
surface->target, op, source, mask, clip,
- elapsed);
+ t);
add_record_mask (&device->log,
surface->target, op, source, mask, clip,
- elapsed);
+ t);
return CAIRO_STATUS_SUCCESS;
}
@@ -858,7 +837,7 @@ add_record_fill (cairo_observation_t *log,
double tolerance,
cairo_antialias_t antialias,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
cairo_observation_record_t record;
cairo_int_status_t status;
@@ -878,9 +857,9 @@ add_record_fill (cairo_observation_t *log,
assert (status == CAIRO_INT_STATUS_SUCCESS);
}
- if (elapsed > log->fill.slowest.elapsed)
+ if (_cairo_time_gt (elapsed, log->fill.slowest.elapsed))
log->fill.slowest = record;
- log->fill.elapsed += elapsed;
+ log->fill.elapsed = _cairo_time_add (log->fill.elapsed, elapsed);
}
static cairo_int_status_t
@@ -898,8 +877,7 @@ _cairo_surface_observer_fill (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
- double elapsed;
+ cairo_time_t t;
int x, y;
surface->log.fill.count++;
@@ -935,7 +913,7 @@ _cairo_surface_observer_fill (void *abstract_surface,
add_extents (&device->log.fill.extents, &composite);
_cairo_composite_rectangles_fini (&composite);
- start_timer (&ts);
+ t = _cairo_time_get ();
status = _cairo_surface_fill (surface->target,
op, source, path,
fill_rule, tolerance, antialias,
@@ -944,17 +922,17 @@ _cairo_surface_observer_fill (void *abstract_surface,
return status;
sync (surface->target, x, y);
- elapsed = stop_timer (&ts);
+ t = _cairo_time_get_delta (t);
add_record_fill (&surface->log,
surface->target, op, source, path,
fill_rule, tolerance, antialias,
- clip, elapsed);
+ clip, t);
add_record_fill (&device->log,
surface->target, op, source, path,
fill_rule, tolerance, antialias,
- clip, elapsed);
+ clip, t);
return CAIRO_STATUS_SUCCESS;
}
@@ -971,7 +949,7 @@ add_record_stroke (cairo_observation_t *log,
double tolerance,
cairo_antialias_t antialias,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
cairo_observation_record_t record;
cairo_int_status_t status;
@@ -992,9 +970,9 @@ add_record_stroke (cairo_observation_t *log,
assert (status == CAIRO_INT_STATUS_SUCCESS);
}
- if (elapsed > log->stroke.slowest.elapsed)
+ if (_cairo_time_gt (elapsed, log->stroke.slowest.elapsed))
log->stroke.slowest = record;
- log->stroke.elapsed += elapsed;
+ log->stroke.elapsed = _cairo_time_add (log->stroke.elapsed, elapsed);
}
static cairo_int_status_t
@@ -1014,8 +992,7 @@ _cairo_surface_observer_stroke (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
- double elapsed;
+ cairo_time_t t;
int x, y;
surface->log.stroke.count++;
@@ -1054,7 +1031,7 @@ _cairo_surface_observer_stroke (void *abstract_surface,
add_extents (&device->log.stroke.extents, &composite);
_cairo_composite_rectangles_fini (&composite);
- start_timer (&ts);
+ t = _cairo_time_get ();
status = _cairo_surface_stroke (surface->target,
op, source, path,
style, ctm, ctm_inverse,
@@ -1064,19 +1041,19 @@ _cairo_surface_observer_stroke (void *abstract_surface,
return status;
sync (surface->target, x, y);
- elapsed = stop_timer (&ts);
+ t = _cairo_time_get_delta (t);
add_record_stroke (&surface->log,
surface->target, op, source, path,
style, ctm,ctm_inverse,
tolerance, antialias,
- clip, elapsed);
+ clip, t);
add_record_stroke (&device->log,
surface->target, op, source, path,
style, ctm,ctm_inverse,
tolerance, antialias,
- clip, elapsed);
+ clip, t);
return CAIRO_STATUS_SUCCESS;
}
@@ -1090,7 +1067,7 @@ add_record_glyphs (cairo_observation_t *log,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
const cairo_clip_t *clip,
- double elapsed)
+ cairo_time_t elapsed)
{
cairo_observation_record_t record;
cairo_int_status_t status;
@@ -1112,9 +1089,9 @@ add_record_glyphs (cairo_observation_t *log,
assert (status == CAIRO_INT_STATUS_SUCCESS);
}
- if (elapsed > log->glyphs.slowest.elapsed)
+ if (_cairo_time_gt (elapsed, log->glyphs.slowest.elapsed))
log->glyphs.slowest = record;
- log->glyphs.elapsed += elapsed;
+ log->glyphs.elapsed = _cairo_time_add (log->glyphs.elapsed, elapsed);
}
static cairo_int_status_t
@@ -1133,8 +1110,7 @@ _cairo_surface_observer_glyphs (void *abstract_surface,
cairo_rectangle_int_t extents;
cairo_int_status_t status;
cairo_glyph_t *dev_glyphs;
- struct timespec ts;
- double elapsed;
+ cairo_time_t t;
int x, y;
surface->log.glyphs.count++;
@@ -1175,7 +1151,7 @@ _cairo_surface_observer_glyphs (void *abstract_surface,
memcpy (dev_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t));
*remaining_glyphs = 0;
- start_timer (&ts);
+ t = _cairo_time_get ();
status = _cairo_surface_show_text_glyphs (surface->target, op, source,
NULL, 0,
dev_glyphs, num_glyphs,
@@ -1187,17 +1163,17 @@ _cairo_surface_observer_glyphs (void *abstract_surface,
return status;
sync (surface->target, x, y);
- elapsed = stop_timer (&ts);
+ t = _cairo_time_get_delta (t);
add_record_glyphs (&surface->log,
surface->target, op, source,
glyphs, num_glyphs, scaled_font,
- clip, elapsed);
+ clip, t);
add_record_glyphs (&device->log,
surface->target, op, source,
glyphs, num_glyphs, scaled_font,
- clip, elapsed);
+ clip, t);
return CAIRO_STATUS_SUCCESS;
}
@@ -1620,13 +1596,14 @@ print_record (cairo_output_stream_t *stream,
_cairo_output_stream_printf (stream, " antialias: %s\n",
antialias_names[r->antialias]);
_cairo_output_stream_printf (stream, " clip: %s\n", clip_names[r->clip]);
- _cairo_output_stream_printf (stream, " elapsed: %f ns\n", r->elapsed);
+ _cairo_output_stream_printf (stream, " elapsed: %f ns\n",
+ _cairo_time_to_ns (r->elapsed));
}
-static double percent (double a, double b)
+static double percent (cairo_time_t a, cairo_time_t b)
{
/* Fake %.1f */
- return round (a*1000 / b) / 10;
+ return round (_cairo_time_to_s (a) * 1000 / _cairo_time_to_s (b)) / 10;
}
static cairo_bool_t
@@ -1653,15 +1630,17 @@ replay_record (cairo_observation_t *log,
return TRUE;
}
-static double
-_cairo_observation_total_elapsed_ns (cairo_observation_t *log)
+static cairo_time_t
+_cairo_observation_total_elapsed (cairo_observation_t *log)
{
- double total = 0;
- total += log->paint.elapsed;
- total += log->mask.elapsed;
- total += log->fill.elapsed;
- total += log->stroke.elapsed;
- total += log->glyphs.elapsed;
+ cairo_time_t total;
+
+ total = log->paint.elapsed;
+ total = _cairo_time_add (total, log->mask.elapsed);
+ total = _cairo_time_add (total, log->fill.elapsed);
+ total = _cairo_time_add (total, log->stroke.elapsed);
+ total = _cairo_time_add (total, log->glyphs.elapsed);
+
return total;
}
@@ -1670,15 +1649,15 @@ _cairo_observation_print (cairo_output_stream_t *stream,
cairo_observation_t *log)
{
cairo_device_t *script;
- double total;
+ cairo_time_t total;
script = _cairo_script_context_create_internal (stream);
_cairo_script_context_attach_snapshots (script, FALSE);
- total = _cairo_observation_total_elapsed_ns (log);
+ total = _cairo_observation_total_elapsed (log);
_cairo_output_stream_printf (stream, "elapsed: %f\n",
- total);
+ _cairo_time_to_ns (total));
_cairo_output_stream_printf (stream, "surfaces: %d\n",
log->num_surfaces);
_cairo_output_stream_printf (stream, "contexts: %d\n",
@@ -1689,7 +1668,7 @@ _cairo_observation_print (cairo_output_stream_t *stream,
_cairo_output_stream_printf (stream, "paint: count %d [no-op %d], elapsed %f [%f%%]\n",
log->paint.count, log->paint.noop,
- log->paint.elapsed,
+ _cairo_time_to_ns (log->paint.elapsed),
percent (log->paint.elapsed, total));
if (log->paint.count) {
print_extents (stream, &log->paint.extents);
@@ -1709,7 +1688,7 @@ _cairo_observation_print (cairo_output_stream_t *stream,
_cairo_output_stream_printf (stream, "mask: count %d [no-op %d], elapsed %f [%f%%]\n",
log->mask.count, log->mask.noop,
- log->mask.elapsed,
+ _cairo_time_to_ns (log->mask.elapsed),
percent (log->mask.elapsed, total));
if (log->mask.count) {
print_extents (stream, &log->mask.extents);
@@ -1730,7 +1709,7 @@ _cairo_observation_print (cairo_output_stream_t *stream,
_cairo_output_stream_printf (stream, "fill: count %d [no-op %d], elaspsed %f [%f%%]\n",
log->fill.count, log->fill.noop,
- log->fill.elapsed,
+ _cairo_time_to_ns (log->fill.elapsed),
percent (log->fill.elapsed, total));
if (log->fill.count) {
print_extents (stream, &log->fill.extents);
@@ -1753,7 +1732,7 @@ _cairo_observation_print (cairo_output_stream_t *stream,
_cairo_output_stream_printf (stream, "stroke: count %d [no-op %d], elapsed %f [%f%%]\n",
log->stroke.count, log->stroke.noop,
- log->stroke.elapsed,
+ _cairo_time_to_ns (log->stroke.elapsed),
percent (log->stroke.elapsed, total));
if (log->stroke.count) {
print_extents (stream, &log->stroke.extents);
@@ -1777,7 +1756,7 @@ _cairo_observation_print (cairo_output_stream_t *stream,
_cairo_output_stream_printf (stream, "glyphs: count %d [no-op %d], elasped %f [%f%%]\n",
log->glyphs.count, log->glyphs.noop,
- log->glyphs.elapsed,
+ _cairo_time_to_ns (log->glyphs.elapsed),
percent (log->glyphs.elapsed, total));
if (log->glyphs.count) {
print_extents (stream, &log->glyphs.extents);
@@ -1831,7 +1810,7 @@ cairo_surface_observer_elapsed (cairo_surface_t *abstract_surface)
return -1;
surface = (cairo_surface_observer_t *) abstract_surface;
- return _cairo_observation_total_elapsed_ns (&surface->log);
+ return _cairo_time_to_ns (_cairo_observation_total_elapsed (&surface->log));
}
void
@@ -1867,7 +1846,7 @@ cairo_device_observer_elapsed (cairo_device_t *abstract_device)
return -1;
device = (cairo_device_observer_t *) abstract_device;
- return _cairo_observation_total_elapsed_ns (&device->log);
+ return _cairo_time_to_ns (_cairo_observation_total_elapsed (&device->log));
}
double
@@ -1882,7 +1861,7 @@ cairo_device_observer_paint_elapsed (cairo_device_t *abstract_device)
return -1;
device = (cairo_device_observer_t *) abstract_device;
- return device->log.paint.elapsed;
+ return _cairo_time_to_ns (device->log.paint.elapsed);
}
double
@@ -1897,7 +1876,7 @@ cairo_device_observer_mask_elapsed (cairo_device_t *abstract_device)
return -1;
device = (cairo_device_observer_t *) abstract_device;
- return device->log.mask.elapsed;
+ return _cairo_time_to_ns (device->log.mask.elapsed);
}
double
@@ -1912,7 +1891,7 @@ cairo_device_observer_fill_elapsed (cairo_device_t *abstract_device)
return -1;
device = (cairo_device_observer_t *) abstract_device;
- return device->log.fill.elapsed;
+ return _cairo_time_to_ns (device->log.fill.elapsed);
}
double
@@ -1927,7 +1906,7 @@ cairo_device_observer_stroke_elapsed (cairo_device_t *abstract_device)
return -1;
device = (cairo_device_observer_t *) abstract_device;
- return device->log.stroke.elapsed;
+ return _cairo_time_to_ns (device->log.stroke.elapsed);
}
double
@@ -1942,5 +1921,5 @@ cairo_device_observer_glyphs_elapsed (cairo_device_t *abstract_device)
return -1;
device = (cairo_device_observer_t *) abstract_device;
- return device->log.glyphs.elapsed;
+ return _cairo_time_to_ns (device->log.glyphs.elapsed);
}