blob: b0b33d32ebe88286b8e0a8ee6450127a09007097 [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.
#ifndef FLUTTER_DISPLAY_LIST_BENCHMARKING_DL_BENCHMARKS_H_
#define FLUTTER_DISPLAY_LIST_BENCHMARKING_DL_BENCHMARKS_H_
#include "flutter/display_list/dl_canvas.h"
#include "flutter/display_list/dl_sampling_options.h"
#include "flutter/display_list/dl_vertices.h"
#include "flutter/display_list/testing/dl_test_surface_provider.h"
#include "third_party/benchmark/include/benchmark/benchmark.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkRRect.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/core/SkVertices.h"
namespace flutter {
namespace testing {
enum BenchmarkAttributes {
kEmpty = 0,
kStrokedStyle = 1 << 0,
kFilledStyle = 1 << 1,
kHairlineStroke = 1 << 2,
kAntiAliasing = 1 << 3
};
DlPaint GetPaintForRun(unsigned attributes);
using BackendType = DlSurfaceProvider::BackendType;
// Benchmarks
void BM_DrawLine(benchmark::State& state,
BackendType backend_type,
unsigned attributes);
void BM_DrawRect(benchmark::State& state,
BackendType backend_type,
unsigned attributes);
void BM_DrawCircle(benchmark::State& state,
BackendType backend_type,
unsigned attributes);
void BM_DrawOval(benchmark::State& state,
BackendType backend_type,
unsigned attributes);
void BM_DrawArc(benchmark::State& state,
BackendType backend_type,
unsigned attributes);
void BM_DrawRRect(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
SkRRect::Type type);
void BM_DrawDRRect(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
SkRRect::Type type);
void BM_DrawPath(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
SkPath::Verb type);
void BM_DrawPoints(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
DlCanvas::PointMode mode);
void BM_DrawVertices(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
DlVertexMode mode);
void BM_DrawImage(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
DlImageSampling options,
bool upload_bitmap);
void BM_DrawImageRect(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
DlImageSampling options,
DlCanvas::SrcRectConstraint constraint,
bool upload_bitmap);
void BM_DrawImageNine(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
const DlFilterMode filter,
bool upload_bitmap);
void BM_DrawTextBlob(benchmark::State& state,
BackendType backend_type,
unsigned attributes);
void BM_DrawShadow(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
bool transparent_occluder,
SkPath::Verb type);
void BM_SaveLayer(benchmark::State& state,
BackendType backend_type,
unsigned attributes,
size_t save_depth);
// clang-format off
// DrawLine
#define DRAW_LINE_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawLine, BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawRect
#define DRAW_RECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawRect, BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawOval
#define DRAW_OVAL_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawOval, BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawCircle
#define DRAW_CIRCLE_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawCircle, BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawArc
#define DRAW_ARC_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawArc, BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES) \
->RangeMultiplier(2) \
->Range(128, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawPath
#define DRAW_PATH_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawPath, \
Lines/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkPath::Verb::kLine_Verb) \
->RangeMultiplier(2) \
->Range(8, 512) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity(); \
\
BENCHMARK_CAPTURE(BM_DrawPath, \
Quads/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkPath::Verb::kQuad_Verb) \
->RangeMultiplier(2) \
->Range(8, 512) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity(); \
\
BENCHMARK_CAPTURE(BM_DrawPath, \
Conics/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkPath::Verb::kConic_Verb) \
->RangeMultiplier(2) \
->Range(8, 512) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity(); \
\
BENCHMARK_CAPTURE(BM_DrawPath, \
Cubics/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkPath::Verb::kCubic_Verb) \
->RangeMultiplier(2) \
->Range(8, 512) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity();
// DrawPoints
#define DRAW_POINTS_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawPoints, Points/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlCanvas::PointMode::kPoints) \
->RangeMultiplier(2) \
->Range(1024, 32768) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawPoints, Lines/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlCanvas::PointMode::kLines) \
->RangeMultiplier(2) \
->Range(1024, 32768) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawPoints, Polygon/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlCanvas::PointMode::kPolygon) \
->RangeMultiplier(2) \
->Range(1024, 32768) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawVertices
#define DRAW_VERTICES_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawVertices, \
TriangleStrip/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlVertexMode::kTriangleStrip) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity(); \
\
BENCHMARK_CAPTURE(BM_DrawVertices, \
TriangleFan/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlVertexMode::kTriangleFan) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity(); \
\
BENCHMARK_CAPTURE(BM_DrawVertices, \
Triangles/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlVertexMode::kTriangles) \
->RangeMultiplier(2) \
->Range(16, 2048) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity();
// DrawRRect
#define DRAW_RRECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawRRect, Symmetric/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkRRect::Type::kSimple_Type) \
->RangeMultiplier(2) \
->Range(16, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawRRect, NinePatch/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkRRect::Type::kNinePatch_Type) \
->RangeMultiplier(2) \
->Range(16, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawRRect, Complex/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkRRect::Type::kComplex_Type) \
->RangeMultiplier(2) \
->Range(16, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawDRRect
#define DRAW_DRRECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawDRRect, Symmetric/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkRRect::Type::kSimple_Type) \
->RangeMultiplier(2) \
->Range(16, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawDRRect, NinePatch/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkRRect::Type::kNinePatch_Type) \
->RangeMultiplier(2) \
->Range(16, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawDRRect, Complex/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
SkRRect::Type::kComplex_Type) \
->RangeMultiplier(2) \
->Range(16, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawImage
#define DRAW_IMAGE_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawImage, Texture/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlImageSampling::kNearestNeighbor, false) \
->RangeMultiplier(2) \
->Range(128, 512) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawImage, Upload/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlImageSampling::kNearestNeighbor, true) \
->RangeMultiplier(2) \
->Range(128, 512) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawImageRect
#define DRAW_IMAGE_RECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE( \
BM_DrawImageRect, Texture/Strict/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlImageSampling::kNearestNeighbor, \
DlCanvas::SrcRectConstraint::kStrict, false) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE( \
BM_DrawImageRect, Texture/Fast/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlImageSampling::kNearestNeighbor, \
DlCanvas::SrcRectConstraint::kFast, false) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE( \
BM_DrawImageRect, Upload/Strict/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlImageSampling::kNearestNeighbor, \
DlCanvas::SrcRectConstraint::kStrict, true) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE( \
BM_DrawImageRect, Upload/Fast/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlImageSampling::kNearestNeighbor, \
DlCanvas::SrcRectConstraint::kFast, true) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawImageNine
#define DRAW_IMAGE_NINE_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawImageNine, Texture/Nearest/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlFilterMode::kNearest, false) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawImageNine, Upload/Nearest/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlFilterMode::kNearest, true) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawImageNine, Texture/Linear/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlFilterMode::kLinear, false) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawImageNine, Upload/Linear/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
DlFilterMode::kLinear, true) \
->RangeMultiplier(2) \
->Range(32, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// DrawTextBlob
#define DRAW_TEXT_BLOB_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawTextBlob, BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES) \
->RangeMultiplier(2) \
->Range(1, 256) \
->UseRealTime() \
->Unit(benchmark::kMillisecond) \
->Complexity();
// DrawShadow
#define DRAW_SHADOW_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_DrawShadow, Lines/Transparent/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
true, \
SkPath::Verb::kLine_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Quads/Transparent/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
true, \
SkPath::Verb::kQuad_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Conics/Transparent/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
true, \
SkPath::Verb::kConic_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Cubics/Transparent/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
true, \
SkPath::Verb::kCubic_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Lines/Opaque/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
false, \
SkPath::Verb::kLine_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Quads/Opaque/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
false, \
SkPath::Verb::kQuad_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Conics/Opaque/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
false, \
SkPath::Verb::kConic_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_DrawShadow, Cubics/Opaque/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
false, \
SkPath::Verb::kCubic_Verb) \
->RangeMultiplier(2) \
->Range(1, 32) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// SaveLayer
#define SAVE_LAYER_BENCHMARKS(BACKEND, ATTRIBUTES) \
BENCHMARK_CAPTURE(BM_SaveLayer, Depth 1/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
1) \
->RangeMultiplier(2) \
->Range(1, 128) \
->UseRealTime() \
->Unit(benchmark::kMillisecond); \
\
BENCHMARK_CAPTURE(BM_SaveLayer, Depth 8/BACKEND, \
BackendType::k##BACKEND##Backend, \
ATTRIBUTES, \
8) \
->RangeMultiplier(2) \
->Range(1, 128) \
->UseRealTime() \
->Unit(benchmark::kMillisecond);
// Applies stroke style and antialiasing
#define STROKE_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_LINE_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_POINTS_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_RECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_OVAL_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_CIRCLE_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_ARC_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_PATH_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_RRECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_DRRECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_TEXT_BLOB_BENCHMARKS(BACKEND, ATTRIBUTES)
// Applies fill style and antialiasing
#define FILL_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_RECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_OVAL_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_CIRCLE_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_ARC_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_PATH_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_RRECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_DRRECT_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_TEXT_BLOB_BENCHMARKS(BACKEND, ATTRIBUTES)
// Applies antialiasing
#define ANTI_ALIASING_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_IMAGE_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_IMAGE_RECT_BENCHMARKS(BACKEND, ATTRIBUTES)
// Does not apply style or antialiasing
#define OTHER_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_IMAGE_NINE_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_VERTICES_BENCHMARKS(BACKEND, ATTRIBUTES) \
DRAW_SHADOW_BENCHMARKS(BACKEND, ATTRIBUTES) \
SAVE_LAYER_BENCHMARKS(BACKEND, ATTRIBUTES)
#define RUN_DISPLAYLIST_BENCHMARKS(BACKEND) \
STROKE_BENCHMARKS(BACKEND, kStrokedStyle) \
STROKE_BENCHMARKS(BACKEND, kStrokedStyle | kAntiAliasing) \
STROKE_BENCHMARKS(BACKEND, kStrokedStyle | kHairlineStroke) \
STROKE_BENCHMARKS(BACKEND, kStrokedStyle | kHairlineStroke | \
kAntiAliasing) \
FILL_BENCHMARKS(BACKEND, kFilledStyle) \
FILL_BENCHMARKS(BACKEND, kFilledStyle | kAntiAliasing) \
ANTI_ALIASING_BENCHMARKS(BACKEND, kEmpty) \
ANTI_ALIASING_BENCHMARKS(BACKEND, kAntiAliasing) \
OTHER_BENCHMARKS(BACKEND, kEmpty)
// clang-format on
} // namespace testing
} // namespace flutter
#endif // FLUTTER_DISPLAY_LIST_BENCHMARKING_DL_BENCHMARKS_H_