skia2/bench/DDLRecorderBench.cpp
Brian Osman 01e6d17fe8 Stop including SkCanvas.h from GrTypesPriv.h
It was too easy to get into circular include chains. Added static
asserts to ensure we keep our quad AA flags in sync. Also, IWYU.

Change-Id: I01aefa264aa56420ab5a46a8ecd9e63c021c79ab
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/280405
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
2020-03-30 20:43:34 +00:00

90 lines
2.9 KiB
C++

/*
* Copyright 2019 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/SkDeferredDisplayListRecorder.h"
#include "include/core/SkSurfaceCharacterization.h"
static SkSurfaceCharacterization create_characterization(GrContext* context) {
size_t maxResourceBytes = context->getResourceCacheLimit();
if (!context->colorTypeSupportedAsSurface(kRGBA_8888_SkColorType)) {
return SkSurfaceCharacterization();
}
SkImageInfo ii = SkImageInfo::Make(32, 32, kRGBA_8888_SkColorType,
kPremul_SkAlphaType, nullptr);
GrBackendFormat backendFormat = context->defaultBackendFormat(kRGBA_8888_SkColorType,
GrRenderable::kYes);
if (!backendFormat.isValid()) {
return SkSurfaceCharacterization();
}
SkSurfaceProps props(0x0, kUnknown_SkPixelGeometry);
SkSurfaceCharacterization c = context->threadSafeProxy()->createCharacterization(
maxResourceBytes, ii, backendFormat, 1,
kTopLeft_GrSurfaceOrigin, props, false);
return c;
}
// This benchmark tries to simulate how Viz is using SkDDLRecorders.
// For each config it will create a single DDLRecorder which it reuses for all the runs
// For each run it creates a DDL and stores it for later deletion.
class DDLRecorderBench : public Benchmark {
public:
DDLRecorderBench() { }
protected:
const char* onGetName() override { return "DDLRecorder"; }
void onDraw(int loops, SkCanvas* origCanvas) override {
if (!fRecorder) {
return;
}
SkASSERT(!fDDLs.size());
fDDLs.reserve(loops);
for (int i = 0; i < loops; ++i) {
SkCanvas* recordingCanvas = fRecorder->getCanvas();
recordingCanvas->drawRect(SkRect::MakeWH(32, 32), SkPaint());
fDDLs.emplace_back(fRecorder->detach());
}
}
private:
// We create one DDLRecorder for all the timing runs and just keep reusing it
void onPerCanvasPreDraw(SkCanvas* origCanvas) override {
GrContext* context = origCanvas->getGrContext();
if (!context) {
return;
}
SkSurfaceCharacterization c = create_characterization(context);
fRecorder.reset(new SkDeferredDisplayListRecorder(c));
}
// We defer the clean up of the DDLs so it is done outside of the timing loop
void onPostDraw(SkCanvas*) override {
fDDLs.clear();
}
std::unique_ptr<SkDeferredDisplayListRecorder> fRecorder = nullptr;
std::vector<std::unique_ptr<SkDeferredDisplayList>> fDDLs;
typedef Benchmark INHERITED;
};
DEF_BENCH(return new DDLRecorderBench();)