4870e6d4c9
Skia'a nanobench can hold onto an image, that causes the lifetime of GrGLGpu to extend past that of the GL interface. Kill reference to surface and image before killing the interface Review URL: https://codereview.chromium.org/1472433002
67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
/*
|
|
* Copyright 2015 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 "SkSurface.h"
|
|
|
|
class Image2RasterBench : public Benchmark {
|
|
public:
|
|
Image2RasterBench() {
|
|
fName.set("native_image_to_raster_surface");
|
|
}
|
|
|
|
bool isSuitableFor(Backend backend) override {
|
|
return kGPU_Backend == backend || kRaster_Backend == backend;
|
|
}
|
|
|
|
protected:
|
|
const char* onGetName() override {
|
|
return fName.c_str();
|
|
}
|
|
|
|
// We explicitly want to bench drawing a Image [cpu or gpu backed] into a raster target,
|
|
// to ensure that we can cache the read-back in the case of gpu -> raster
|
|
//
|
|
void onPerCanvasPreDraw(SkCanvas* canvas) override {
|
|
// create an Image reflecting the canvas (gpu or cpu)
|
|
SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
|
|
SkAutoTUnref<SkSurface> surface(canvas->newSurface(info));
|
|
canvas->drawColor(SK_ColorRED);
|
|
fImage.reset(surface->newImageSnapshot());
|
|
|
|
// create a cpu-backed Surface
|
|
fRasterSurface.reset(SkSurface::NewRaster(info));
|
|
}
|
|
|
|
void onPerCanvasPostDraw(SkCanvas*) override {
|
|
// Release the image and raster surface here to prevent out of order destruction
|
|
// between these and the gpu interface.
|
|
fRasterSurface.reset(nullptr);
|
|
fImage.reset(nullptr);
|
|
}
|
|
|
|
void onDraw(int loops, SkCanvas*) override {
|
|
for (int i = 0; i < loops; i++) {
|
|
for (int inner = 0; inner < 10; ++inner) {
|
|
fRasterSurface->getCanvas()->drawImage(fImage, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
SkString fName;
|
|
SkAutoTUnref<SkImage> fImage;
|
|
SkAutoTUnref<SkSurface> fRasterSurface;
|
|
|
|
typedef Benchmark INHERITED;
|
|
};
|
|
|
|
|
|
DEF_BENCH( return new Image2RasterBench; )
|