| /* |
| * 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 "bench/Benchmark.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkImage.h" |
| #include "include/core/SkSurface.h" |
| |
| class Image2RasterBench : public Benchmark { |
| public: |
| Image2RasterBench() { |
| fName.set("native_image_to_raster_surface"); |
| } |
| |
| bool isSuitableFor(Backend backend) override { |
| return Backend::kGanesh == backend || Backend::kRaster == 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 = canvas->imageInfo().makeWH(100, 100); |
| auto surface(canvas->makeSurface(info)); |
| canvas->drawColor(SK_ColorRED); |
| fImage = surface->makeImageSnapshot(); |
| |
| // create a cpu-backed Surface |
| SkImageInfo n32Info = SkImageInfo::MakeN32Premul(100, 100); |
| fRasterSurface = SkSurfaces::Raster(n32Info); |
| } |
| |
| 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.get(), 0, 0); |
| } |
| } |
| } |
| |
| private: |
| SkString fName; |
| sk_sp<SkImage> fImage; |
| sk_sp<SkSurface> fRasterSurface; |
| |
| using INHERITED = Benchmark; |
| }; |
| DEF_BENCH( return new Image2RasterBench; ) |