blob: 129eac3abd497a4d6ac529c5349b0bb794bce18a [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/benchmarking/benchmarking.h"
#include "flutter/display_list/display_list_test_utils.h"
namespace flutter {
namespace {
static std::vector<testing::DisplayListInvocationGroup> allRenderingOps =
testing::CreateAllRenderingOps();
enum class DisplayListBuilderBenchmarkType {
kDefault,
kBounds,
kRtree,
kBoundsAndRtree,
};
static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
for (auto& group : allRenderingOps) {
for (size_t i = 0; i < group.variants.size(); i++) {
auto& invocation = group.variants[i];
invocation.Invoke(builder);
}
}
}
static void Complete(DisplayListBuilder& builder,
DisplayListBuilderBenchmarkType type) {
auto display_list = builder.Build();
switch (type) {
case DisplayListBuilderBenchmarkType::kBounds:
display_list->bounds();
break;
case DisplayListBuilderBenchmarkType::kRtree:
display_list->rtree();
break;
case DisplayListBuilderBenchmarkType::kBoundsAndRtree:
display_list->bounds();
display_list->rtree();
break;
case DisplayListBuilderBenchmarkType::kDefault:
break;
}
}
} // namespace
static void BM_DisplayListBuilderDefault(benchmark::State& state,
DisplayListBuilderBenchmarkType type) {
while (state.KeepRunning()) {
DisplayListBuilder builder;
InvokeAllRenderingOps(builder);
Complete(builder, type);
}
}
static void BM_DisplayListBuilderWithScaleAndTranslate(
benchmark::State& state,
DisplayListBuilderBenchmarkType type) {
while (state.KeepRunning()) {
DisplayListBuilder builder;
builder.scale(3.5, 3.5);
builder.translate(10.3, 6.9);
InvokeAllRenderingOps(builder);
Complete(builder, type);
}
}
static void BM_DisplayListBuilderWithPerspective(
benchmark::State& state,
DisplayListBuilderBenchmarkType type) {
while (state.KeepRunning()) {
DisplayListBuilder builder;
builder.transformFullPerspective(0, 1, 0, 12, 1, 0, 0, 33, 3, 2, 5, 29, 0,
0, 0, 12);
InvokeAllRenderingOps(builder);
Complete(builder, type);
}
}
static void BM_DisplayListBuilderWithClipRect(
benchmark::State& state,
DisplayListBuilderBenchmarkType type) {
SkRect clip_bounds = SkRect::MakeLTRB(6.5, 7.3, 90.2, 85.7);
while (state.KeepRunning()) {
DisplayListBuilder builder;
builder.clipRect(clip_bounds, SkClipOp::kIntersect, true);
InvokeAllRenderingOps(builder);
Complete(builder, type);
}
}
static void BM_DisplayListBuilderWithSaveLayer(
benchmark::State& state,
DisplayListBuilderBenchmarkType type) {
while (state.KeepRunning()) {
DisplayListBuilder builder;
for (auto& group : allRenderingOps) {
for (size_t i = 0; i < group.variants.size(); i++) {
auto& invocation = group.variants[i];
builder.saveLayer(nullptr, false);
invocation.Invoke(builder);
builder.restore();
}
}
Complete(builder, type);
}
}
static void BM_DisplayListBuilderWithSaveLayerAndImageFilter(
benchmark::State& state,
DisplayListBuilderBenchmarkType type) {
DlPaint layer_paint;
layer_paint.setImageFilter(&testing::kTestBlurImageFilter1);
SkRect layer_bounds = SkRect::MakeLTRB(6.5, 7.3, 35.2, 42.7);
while (state.KeepRunning()) {
DisplayListBuilder builder;
for (auto& group : allRenderingOps) {
for (size_t i = 0; i < group.variants.size(); i++) {
auto& invocation = group.variants[i];
builder.saveLayer(&layer_bounds, &layer_paint);
invocation.Invoke(builder);
builder.restore();
}
}
Complete(builder, type);
}
}
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault,
kBounds,
DisplayListBuilderBenchmarkType::kBounds)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault,
kRtree,
DisplayListBuilderBenchmarkType::kRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault,
kBoundsAndRtree,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithScaleAndTranslate,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithScaleAndTranslate,
kBounds,
DisplayListBuilderBenchmarkType::kBounds)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithScaleAndTranslate,
kRtree,
DisplayListBuilderBenchmarkType::kRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithScaleAndTranslate,
kBoundsAndRtree,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithPerspective,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithPerspective,
kBounds,
DisplayListBuilderBenchmarkType::kBounds)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithPerspective,
kRtree,
DisplayListBuilderBenchmarkType::kRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithPerspective,
kBoundsAndRtree,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithClipRect,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithClipRect,
kBounds,
DisplayListBuilderBenchmarkType::kBounds)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithClipRect,
kRtree,
DisplayListBuilderBenchmarkType::kRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithClipRect,
kBoundsAndRtree,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayer,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayer,
kBounds,
DisplayListBuilderBenchmarkType::kBounds)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayer,
kRtree,
DisplayListBuilderBenchmarkType::kRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayer,
kBoundsAndRtree,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayerAndImageFilter,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayerAndImageFilter,
kBounds,
DisplayListBuilderBenchmarkType::kBounds)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayerAndImageFilter,
kRtree,
DisplayListBuilderBenchmarkType::kRtree)
->Unit(benchmark::kMicrosecond);
BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayerAndImageFilter,
kBoundsAndRtree,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);
} // namespace flutter