// 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 "impeller/aiks/canvas.h" namespace impeller { namespace { using CanvasCallback = size_t (*)(Canvas&); size_t DrawRect(Canvas& canvas) { for (auto i = 0; i < 500; i++) { canvas.DrawRect(Rect::MakeLTRB(0, 0, 100, 100), {.color = Color::DarkKhaki()}); } return 500; } size_t DrawCircle(Canvas& canvas) { for (auto i = 0; i < 500; i++) { canvas.DrawCircle({100, 100}, 5, {.color = Color::DarkKhaki()}); } return 500; } size_t DrawLine(Canvas& canvas) { for (auto i = 0; i < 500; i++) { canvas.DrawLine({0, 0}, {100, 100}, {.color = Color::DarkKhaki()}); } return 500; } } // namespace // A set of benchmarks that measures the CPU cost of encoding canvas operations. // These benchmarks do not measure the cost of conversion through the HAL, no // do they measure the GPU side cost of executing the required shader programs. template static void BM_CanvasRecord(benchmark::State& state, Args&&... args) { auto args_tuple = std::make_tuple(std::move(args)...); auto test_proc = std::get(args_tuple); size_t op_count = 0u; size_t canvas_count = 0u; while (state.KeepRunning()) { // A new canvas is allocated for each iteration to avoid the benchmark // becoming a measurement of only the entity vector re-allocation time. Canvas canvas; op_count += test_proc(canvas); canvas_count++; } state.counters["TotalOpCount"] = op_count; state.counters["TotalCanvasCount"] = canvas_count; } BENCHMARK_CAPTURE(BM_CanvasRecord, draw_rect, &DrawRect); BENCHMARK_CAPTURE(BM_CanvasRecord, draw_circle, &DrawCircle); BENCHMARK_CAPTURE(BM_CanvasRecord, draw_line, &DrawLine); } // namespace impeller