[cairo-commit] perf/cairo-perf-trace.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Jan 28 02:15:13 PST 2013


 perf/cairo-perf-trace.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

New commits:
commit 3c18bae20ee2fea24d75f6986390ef8157d0207d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jan 28 10:03:54 2013 +0000

    perf; Do not allow the backends to optimize away the clear before sync
    
    The importance of writing to the scratch surface before retrieving an
    image is that it makes that the write lands in the server queue, as well
    as the GetImage, in order to serialise the timer against all the
    operations.
    
    Reported-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/perf/cairo-perf-trace.c b/perf/cairo-perf-trace.c
index 4b8c85e..f27f8e4 100644
--- a/perf/cairo-perf-trace.c
+++ b/perf/cairo-perf-trace.c
@@ -171,10 +171,12 @@ done:
 }
 
 static void
-clear_surface (cairo_surface_t *surface)
+fill_surface (cairo_surface_t *surface)
 {
     cairo_t *cr = cairo_create (surface);
-    cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+    /* This needs to be an operation that the backends can't optimise away */
+    cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+    cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
     cairo_paint (cr);
     cairo_destroy (cr);
 }
@@ -714,6 +716,8 @@ cairo_perf_trace (cairo_perf_t			   *perf,
 					       1, 1,
 					       CAIRO_BOILERPLATE_MODE_PERF,
 					       &args.closure);
+	fill_surface(args.surface); /* remove any clear flags */
+
 	if (perf->observe) {
 	    cairo_surface_t *obs;
 	    obs = cairo_surface_create_observer (args.surface,
@@ -768,7 +772,7 @@ cairo_perf_trace (cairo_perf_t			   *perf,
 	    fill[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_fill_elapsed (observer));
 	    glyphs[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_glyphs_elapsed (observer));
 	} else {
-	    clear_surface (args.surface); /* queue a write to the sync'ed surface */
+	    fill_surface (args.surface); /* queue a write to the sync'ed surface */
 	    cairo_perf_timer_stop ();
 	    times[i] = cairo_perf_timer_elapsed ();
 	}


More information about the cairo-commit mailing list