From fc29906826717528aa22e58fa9df8ba68cb3de9e Mon Sep 17 00:00:00 2001 From: brianosman Date: Wed, 1 Jun 2016 12:40:15 -0700 Subject: New benchmark to measure GPU mip-mapping performance BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2030673002 Review-Url: https://codereview.chromium.org/2030673002 --- bench/GrMipMapBench.cpp | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 bench/GrMipMapBench.cpp (limited to 'bench/GrMipMapBench.cpp') diff --git a/bench/GrMipMapBench.cpp b/bench/GrMipMapBench.cpp new file mode 100644 index 0000000000..3b4db24596 --- /dev/null +++ b/bench/GrMipMapBench.cpp @@ -0,0 +1,74 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Benchmark.h" +#include "SkCanvas.h" +#include "SkImage.h" +#include "SkPaint.h" +#include "SkSurface.h" + +#if SK_SUPPORT_GPU + +class GrMipMapBench: public Benchmark { + sk_sp fSurface; + SkString fName; + const int fW, fH; + +public: + GrMipMapBench(int w, int h) : fW(w), fH(h) { + fName.printf("gr_mipmap_build_%dx%d", w, h); + } + +protected: + bool isSuitableFor(Backend backend) override { + return kGPU_Backend == backend; + } + + const char* onGetName() override { return fName.c_str(); } + + void onDraw(int loops, SkCanvas* canvas) override { + if (!fSurface) { + GrContext* context = canvas->getGrContext(); + if (nullptr == context) { + return; + } + SkImageInfo info = SkImageInfo::Make(fW, fH, kN32_SkColorType, kPremul_SkAlphaType, + kSRGB_SkColorProfileType); + fSurface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info); + } + + // Clear surface once: + fSurface->getCanvas()->clear(SK_ColorBLACK); + + SkPaint paint; + paint.setFilterQuality(kMedium_SkFilterQuality); + + for (int i = 0; i < loops; i++) { + // Touch surface so mips are dirtied + fSurface->getCanvas()->drawPoint(0, 0, SK_ColorWHITE); + + // Draw reduced version of surface to original canvas, to trigger mip generation + canvas->save(); + canvas->scale(0.1f, 0.1f); + canvas->drawImage(fSurface->makeImageSnapshot(SkBudgeted::kNo), 0, 0, &paint); + canvas->restore(); + } + } + +private: + typedef Benchmark INHERITED; +}; + +// Build variants that exercise the width and heights being even or odd at each level, as the +// impl specializes on each of these. +// +DEF_BENCH( return new GrMipMapBench(511, 1023); ) +DEF_BENCH( return new GrMipMapBench(512, 511); ) +DEF_BENCH( return new GrMipMapBench(511, 512); ) +DEF_BENCH( return new GrMipMapBench(512, 512); ) + +#endif -- cgit v1.2.3