blob: d8cbd0839e5774d4dd1bc5e9c1823c87138b188d [file]
/*
* Copyright 2026 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "bench/Benchmark.h"
#include "bench/BenchmarkDataset.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "src/gpu/graphite/sparse_strips/Flatten.h"
#include "src/gpu/graphite/sparse_strips/Tiler.h"
#include <vector>
namespace skgpu::graphite {
template<uint16_t kTileWidth, uint16_t kTileHeight, bool kShouldSort,
BenchmarkDataset kDataset = BenchmarkDataset::kTiger>
class TilerBench : public Benchmark {
public:
TilerBench() {
using DatasetInfo = BenchmarkDatasetInfo<kDataset>;
fName.printf("SparseStrips_Tiler%sBench_%s_%ux%u",
kShouldSort ? "Sort" : "", DatasetInfo::kName, kTileWidth, kTileHeight);
}
protected:
const char* onGetName() override {
return fName.c_str();
}
void onDelayedSetup() override {
using DatasetInfo = BenchmarkDatasetInfo<kDataset>;
Flatten flattener;
std::vector<SkPath> paths = DatasetInfo::GetPaths();
for (auto& subPath : paths) {
flattener.processPaths<FlattenMode::kSimd>(subPath, SkMatrix(),
DatasetInfo::kWidthF, DatasetInfo::kHeightF,
&fPolyline);
}
}
void onDraw(int loops, SkCanvas* /*canvas*/) override {
using DatasetInfo = BenchmarkDatasetInfo<kDataset>;
Tiles<kTileWidth, kTileHeight> tiler;
for (int i = 0; i < loops; ++i) {
tiler.reset();
tiler.makeTilesMSAA(fPolyline, DatasetInfo::kWidth, DatasetInfo::kHeight);
if constexpr (kShouldSort) {
tiler.sortTiles();
}
}
}
private:
SkString fName;
Polyline fPolyline;
};
} // namespace skgpu::graphite
DEF_BENCH(return (new skgpu::graphite::TilerBench<4, 4, /*kShouldSort=*/false>); )
DEF_BENCH(return (new skgpu::graphite::TilerBench<8, 8, /*kShouldSort=*/false>); )
DEF_BENCH(return (new skgpu::graphite::TilerBench<4, 4, /*kShouldSort=*/true>); )
DEF_BENCH(return (new skgpu::graphite::TilerBench<8, 8, /*kShouldSort=*/true>); )