Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit b3bef36

Browse files
author
George Wright
committed
DrawArc
1 parent 1885da7 commit b3bef36

File tree

3 files changed

+59
-3
lines changed

3 files changed

+59
-3
lines changed

flow/display_list_benchmarks.cc

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,45 @@ void BM_DrawRRect(benchmark::State& state,
263263
canvas_provider->Snapshot(filename);
264264
}
265265

266+
void BM_DrawArc(benchmark::State& state,
267+
std::unique_ptr<CanvasProvider> canvas_provider) {
268+
DisplayListBuilder builder;
269+
size_t length = state.range(0);
270+
canvas_provider->InitializeSurface(length, length);
271+
auto canvas = canvas_provider->GetSurface()->getCanvas();
272+
273+
SkScalar startingAngle = 0.0f;
274+
SkScalar scalarLength = length;
275+
276+
// Just some random sweeps that will mostly circumnavigate the circle
277+
std::vector<SkScalar> segmentSweeps = {5.5f, -10.0f, 42.0f, 71.7f, 90.0f,
278+
37.5f, 17.9f, 32.0f, 379.4f};
279+
280+
SkRect bounds = SkRect::MakeLTRB(0, 0, length, length);
281+
282+
for (size_t i = 0; i < 1000; i++) {
283+
SkScalar inset = std::fmod(i * 0.5, scalarLength);
284+
bounds.setLTRB(0, inset, scalarLength, scalarLength - inset);
285+
for (SkScalar sweep : segmentSweeps) {
286+
builder.drawArc(bounds, startingAngle, sweep, false);
287+
startingAngle += sweep + 5.0f;
288+
}
289+
}
290+
291+
auto displaylist = builder.Build();
292+
293+
// We only want to time the actual rasterization.
294+
for (auto _ : state) {
295+
canvas->discard();
296+
displaylist->RenderTo(canvas);
297+
canvas_provider->GetSurface()->flushAndSubmit(true);
298+
}
299+
300+
auto filename = canvas_provider->BackendName() + "-DrawArc-" +
301+
std::to_string(state.range(0)) + ".png";
302+
canvas_provider->Snapshot(filename);
303+
}
304+
266305
std::vector<SkPoint> GetPolygonPoints(size_t n, SkPoint center, SkScalar r) {
267306
std::vector<SkPoint> points;
268307
SkScalar x, y;
@@ -421,8 +460,6 @@ sk_sp<SkVertices> GetTestVertices(SkPoint center,
421460
size_t outerVertexCount = vertexCount / 2;
422461
std::vector<SkPoint> outerPoints =
423462
GetPolygonPoints(outerVertexCount, center, radius * 1.5f);
424-
std::vector<SkPoint> innerPoints =
425-
GetPolygonPoints(outerVertexCount * 2, center, radius * 0.75f);
426463

427464
std::vector<SkPoint> vertices;
428465
std::vector<SkColor> colors;
@@ -446,7 +483,7 @@ sk_sp<SkVertices> GetTestVertices(SkPoint center,
446483
for (size_t i = 0; i <= outerVertexCount; i++) {
447484
vertices.push_back(outerPoints[i % outerPoints.size()]);
448485
colors.push_back(i % 2 ? SK_ColorRED : SK_ColorGREEN);
449-
vertices.push_back(innerPoints[(2 * i + 1) % innerPoints.size()]);
486+
vertices.push_back(center);
450487
colors.push_back(i % 2 ? SK_ColorBLUE : SK_ColorCYAN);
451488
}
452489
break;
@@ -511,6 +548,10 @@ void BM_DrawVertices(benchmark::State& state,
511548
canvas_provider->Snapshot(filename);
512549
}
513550

551+
void BM_DrawPoints(benchmark::State& state,
552+
std::unique_ptr<CanvasProvider> canvas_provider,
553+
SkCanvas::PointMode mode) {}
554+
514555
// clang-format off
515556

516557
BENCHMARK_CAPTURE(BM_DrawLine,
@@ -541,6 +582,13 @@ BENCHMARK_CAPTURE(BM_DrawCircle,
541582
->Range(16, 2048)
542583
->Unit(benchmark::kMillisecond);
543584

585+
BENCHMARK_CAPTURE(BM_DrawArc,
586+
Software,
587+
std::make_unique<SoftwareCanvasProvider>())
588+
->RangeMultiplier(2)
589+
->Range(128, 2048)
590+
->Unit(benchmark::kMillisecond);
591+
544592
BENCHMARK_CAPTURE(BM_DrawRRect,
545593
Symmetric/Software,
546594
std::make_unique<SoftwareCanvasProvider>(),

flow/display_list_benchmarks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ void BM_DrawCircle(benchmark::State& state,
5454
std::unique_ptr<CanvasProvider> canvas_provider);
5555
void BM_DrawOval(benchmark::State& state,
5656
std::unique_ptr<CanvasProvider> canvas_provider);
57+
void BM_DrawArc(benchmark::State& state,
58+
std::unique_ptr<CanvasProvider> canvas_provider);
5759
void BM_DrawRRect(benchmark::State& state,
5860
std::unique_ptr<CanvasProvider> canvas_provider,
5961
SkRRect::Type type);

flow/display_list_benchmarks_metal.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ BENCHMARK_CAPTURE(BM_DrawCircle, Metal, std::make_unique<MetalCanvasProvider>())
5959
->UseRealTime()
6060
->Unit(benchmark::kMillisecond);
6161

62+
BENCHMARK_CAPTURE(BM_DrawArc, Metal, std::make_unique<MetalCanvasProvider>())
63+
->RangeMultiplier(2)
64+
->Range(16, 2048)
65+
->UseRealTime()
66+
->Unit(benchmark::kMillisecond);
67+
6268
BENCHMARK_CAPTURE(BM_DrawRRect,
6369
Symmetric/Metal,
6470
std::make_unique<MetalCanvasProvider>(),

0 commit comments

Comments
 (0)