blob: 231066450de806816ef4af7456693c9f45e4d9e6 [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 "include/core/SkCanvas.h"
#include "include/core/SkColorSpace.h"
#include "include/core/SkImage.h"
#include "include/core/SkPaint.h"
#include "include/core/SkSize.h"
#include "include/core/SkSurface.h"
#include "tools/ToolUtils.h"
class BilerpBench : public Benchmark {
public:
// Defined constants for 4K dimensions
static constexpr int k4KWidth = 3840;
static constexpr int k4KHeight = 2160;
BilerpBench(float scale)
: fSrcSize(SkISize::Make(k4KWidth, k4KHeight))
, fDstSize(SkSize::Make(k4KWidth * scale, k4KHeight * scale))
, fRec709(false) {
fName.printf("bilerp_4k_scale_%0.2f", scale);
}
BilerpBench(int srcW, int srcH, int dstW, int dstH, bool rec709 = false)
: fSrcSize(SkISize::Make(srcW, srcH))
, fDstSize(SkSize::Make(dstW, dstH))
, fRec709(rec709) {
fName.printf("bilerp_%dx%d_to_%dx%d%s", srcW, srcH, dstW, dstH, rec709 ? "_rec709" : "");
}
protected:
const char* onGetName() override { return fName.c_str(); }
SkISize onGetSize() override {
return SkISize::Make(SkScalarCeilToInt(fDstSize.fWidth),
SkScalarCeilToInt(fDstSize.fHeight));
}
void onDelayedSetup() override {
fImage = ToolUtils::create_checkerboard_image(
fSrcSize.fWidth, fSrcSize.fHeight, SK_ColorGRAY, SK_ColorDKGRAY, 16);
if (fRec709) {
fImage = fImage->reinterpretColorSpace(
SkColorSpace::MakeRGB(SkNamedTransferFn::kRec709, SkNamedGamut::kSRGB));
SkImageInfo dstInfo = SkImageInfo::MakeN32Premul(SkScalarCeilToInt(fDstSize.fWidth),
SkScalarCeilToInt(fDstSize.fHeight),
SkColorSpace::MakeSRGB());
fSrgbSurface = SkSurfaces::Raster(dstInfo);
}
fDst = SkRect::MakeWH(fDstSize.fWidth, fDstSize.fHeight);
}
void onDraw(int loops, SkCanvas* canvas) override {
SkCanvas* targetCanvas = fRec709 ? fSrgbSurface->getCanvas() : canvas;
SkPaint paint;
SkSamplingOptions sampling(SkFilterMode::kLinear, SkMipmapMode::kNone);
for (int i = 0; i < loops; i++) {
targetCanvas->drawImageRect(fImage, fDst, sampling, &paint);
}
}
private:
SkString fName;
sk_sp<SkImage> fImage;
sk_sp<SkSurface> fSrgbSurface;
SkRect fDst;
SkISize fSrcSize;
SkSize fDstSize;
bool fRec709;
using INHERITED = Benchmark;
};
DEF_BENCH(return new BilerpBench(1.00f);)
DEF_BENCH(return new BilerpBench(0.99f);)
DEF_BENCH(return new BilerpBench(0.75f);)
DEF_BENCH(return new BilerpBench(0.50f);)
DEF_BENCH(return new BilerpBench(0.33f);)
DEF_BENCH(return new BilerpBench(1920, 1080, 3840, 2160, false);)
DEF_BENCH(return new BilerpBench(1920, 1080, 3840, 2160, true);)