Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 #include "Benchmark.h"
      8 #include "SkDeferredCanvas.h"
      9 #include "SkDevice.h"
     10 #include "SkString.h"
     11 
     12 class DeferredCanvasBench : public Benchmark {
     13 public:
     14     DeferredCanvasBench(const char name[])  {
     15         fName.printf("deferred_canvas_%s", name);
     16     }
     17 
     18     enum {
     19         CANVAS_WIDTH = 200,
     20         CANVAS_HEIGHT = 200,
     21     };
     22 protected:
     23     virtual const char* onGetName() {
     24         return fName.c_str();
     25     }
     26 
     27     virtual void onDraw(const int loops, SkCanvas* canvas) {
     28 #if 0   // what specifically are we interested in timing here?
     29         SkBaseDevice *device = canvas->getDevice()->createCompatibleDevice(
     30             SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false);
     31 
     32         SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(device));
     33         device->unref();
     34 
     35         initDeferredCanvas(deferredCanvas);
     36         drawInDeferredCanvas(loops, deferredCanvas);
     37         finalizeDeferredCanvas(deferredCanvas);
     38         deferredCanvas->flush();
     39 #endif
     40     }
     41 
     42     virtual void initDeferredCanvas(SkDeferredCanvas* canvas) = 0;
     43     virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) = 0;
     44     virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) = 0;
     45 
     46     SkString fName;
     47 
     48 private:
     49     typedef Benchmark INHERITED;
     50 };
     51 
     52 class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient {
     53 public:
     54     SimpleNotificationClient() : fDummy(false) {}
     55 
     56     //bogus virtual implementations that just do something small
     57     virtual void prepareForDraw() SK_OVERRIDE {fDummy = true;}
     58     virtual void storageAllocatedForRecordingChanged(size_t) SK_OVERRIDE {fDummy = false;}
     59     virtual void flushedDrawCommands() SK_OVERRIDE {fDummy = !fDummy;}
     60 private:
     61     bool fDummy;
     62 
     63     typedef SkDeferredCanvas::NotificationClient INHERITED;
     64 };
     65 
     66 // Test that records very simple draw operations.
     67 // This benchmark aims to capture performance fluctuations in the recording
     68 // overhead of SkDeferredCanvas
     69 class DeferredRecordBench : public DeferredCanvasBench {
     70 public:
     71     DeferredRecordBench()
     72         : INHERITED("record") {
     73     }
     74 
     75 protected:
     76 
     77     virtual void initDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
     78         canvas->setNotificationClient(&fNotificationClient);
     79     }
     80 
     81     virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) SK_OVERRIDE {
     82         SkRect rect;
     83         rect.setXYWH(0, 0, 10, 10);
     84         SkPaint paint;
     85         for (int i = 0; i < loops; i++) {
     86             canvas->save();
     87             canvas->translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT));
     88             canvas->drawRect(rect, paint);
     89             canvas->restore();
     90         }
     91     }
     92 
     93     virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
     94         canvas->clear(0x0);
     95         canvas->setNotificationClient(NULL);
     96     }
     97 
     98 private:
     99     typedef DeferredCanvasBench INHERITED;
    100     SimpleNotificationClient fNotificationClient;
    101 };
    102 
    103 
    104 ///////////////////////////////////////////////////////////////////////////////
    105 
    106 DEF_BENCH( return new DeferredRecordBench(); )
    107