Home | History | Annotate | Download | only in microbench
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <benchmark/benchmark.h>
     18 
     19 #include "DisplayList.h"
     20 #if HWUI_NEW_OPS
     21 #include "RecordingCanvas.h"
     22 #else
     23 #include "DisplayListCanvas.h"
     24 #endif
     25 #include "tests/common/TestUtils.h"
     26 
     27 using namespace android;
     28 using namespace android::uirenderer;
     29 
     30 #if HWUI_NEW_OPS
     31 typedef RecordingCanvas TestCanvas;
     32 #else
     33 typedef DisplayListCanvas TestCanvas;
     34 #endif
     35 
     36 void BM_DisplayList_alloc(benchmark::State& benchState) {
     37     while (benchState.KeepRunning()) {
     38         auto displayList = new DisplayList();
     39         benchmark::DoNotOptimize(displayList);
     40         delete displayList;
     41     }
     42 }
     43 BENCHMARK(BM_DisplayList_alloc);
     44 
     45 void BM_DisplayList_alloc_theoretical(benchmark::State& benchState) {
     46     while (benchState.KeepRunning()) {
     47         auto displayList = new char[sizeof(DisplayList)];
     48         benchmark::DoNotOptimize(displayList);
     49         delete[] displayList;
     50     }
     51 }
     52 BENCHMARK(BM_DisplayList_alloc_theoretical);
     53 
     54 void BM_DisplayListCanvas_record_empty(benchmark::State& benchState) {
     55     TestCanvas canvas(100, 100);
     56     delete canvas.finishRecording();
     57 
     58     while (benchState.KeepRunning()) {
     59         canvas.resetRecording(100, 100);
     60         benchmark::DoNotOptimize(&canvas);
     61         delete canvas.finishRecording();
     62     }
     63 }
     64 BENCHMARK(BM_DisplayListCanvas_record_empty);
     65 
     66 void BM_DisplayListCanvas_record_saverestore(benchmark::State& benchState) {
     67     TestCanvas canvas(100, 100);
     68     delete canvas.finishRecording();
     69 
     70     while (benchState.KeepRunning()) {
     71         canvas.resetRecording(100, 100);
     72         canvas.save(SaveFlags::MatrixClip);
     73         canvas.save(SaveFlags::MatrixClip);
     74         benchmark::DoNotOptimize(&canvas);
     75         canvas.restore();
     76         canvas.restore();
     77         delete canvas.finishRecording();
     78     }
     79 }
     80 BENCHMARK(BM_DisplayListCanvas_record_saverestore);
     81 
     82 void BM_DisplayListCanvas_record_translate(benchmark::State& benchState) {
     83     TestCanvas canvas(100, 100);
     84     delete canvas.finishRecording();
     85 
     86     while (benchState.KeepRunning()) {
     87         canvas.resetRecording(100, 100);
     88         canvas.scale(10, 10);
     89         benchmark::DoNotOptimize(&canvas);
     90         delete canvas.finishRecording();
     91     }
     92 }
     93 BENCHMARK(BM_DisplayListCanvas_record_translate);
     94 
     95 /**
     96  * Simulate a simple view drawing a background, overlapped by an image.
     97  *
     98  * Note that the recording commands are intentionally not perfectly efficient, as the
     99  * View system frequently produces unneeded save/restores.
    100  */
    101 void BM_DisplayListCanvas_record_simpleBitmapView(benchmark::State& benchState) {
    102     TestCanvas canvas(100, 100);
    103     delete canvas.finishRecording();
    104 
    105     SkPaint rectPaint;
    106     SkBitmap iconBitmap = TestUtils::createSkBitmap(80, 80);
    107 
    108     while (benchState.KeepRunning()) {
    109         canvas.resetRecording(100, 100);
    110         {
    111             canvas.save(SaveFlags::MatrixClip);
    112             canvas.drawRect(0, 0, 100, 100, rectPaint);
    113             canvas.restore();
    114         }
    115         {
    116             canvas.save(SaveFlags::MatrixClip);
    117             canvas.translate(10, 10);
    118             canvas.drawBitmap(iconBitmap, 0, 0, nullptr);
    119             canvas.restore();
    120         }
    121         benchmark::DoNotOptimize(&canvas);
    122         delete canvas.finishRecording();
    123     }
    124 }
    125 BENCHMARK(BM_DisplayListCanvas_record_simpleBitmapView);
    126 
    127 class NullClient: public CanvasStateClient {
    128     void onViewportInitialized() override {}
    129     void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {}
    130     GLuint getTargetFbo() const override { return 0; }
    131 };
    132 
    133 void BM_CanvasState_saverestore(benchmark::State& benchState) {
    134     NullClient client;
    135     CanvasState state(client);
    136     state.initializeSaveStack(100, 100, 0, 0, 100, 100, Vector3());
    137 
    138     while (benchState.KeepRunning()) {
    139         state.save(SaveFlags::MatrixClip);
    140         state.save(SaveFlags::MatrixClip);
    141         benchmark::DoNotOptimize(&state);
    142         state.restore();
    143         state.restore();
    144     }
    145 }
    146 BENCHMARK(BM_CanvasState_saverestore);
    147 
    148 void BM_CanvasState_init(benchmark::State& benchState) {
    149     NullClient client;
    150     CanvasState state(client);
    151     state.initializeSaveStack(100, 100, 0, 0, 100, 100, Vector3());
    152 
    153     while (benchState.KeepRunning()) {
    154         state.initializeSaveStack(100, 100, 0, 0, 100, 100, Vector3());
    155         benchmark::DoNotOptimize(&state);
    156     }
    157 }
    158 BENCHMARK(BM_CanvasState_init);
    159 
    160 void BM_CanvasState_translate(benchmark::State& benchState) {
    161     NullClient client;
    162     CanvasState state(client);
    163     state.initializeSaveStack(100, 100, 0, 0, 100, 100, Vector3());
    164 
    165     while (benchState.KeepRunning()) {
    166         state.translate(5, 5, 0);
    167         benchmark::DoNotOptimize(&state);
    168         state.translate(-5, -5, 0);
    169     }
    170 }
    171 BENCHMARK(BM_CanvasState_translate);
    172