1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 11cb93a386Sopenharmony_ci#include "include/core/SkSurface.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ciclass Image2RasterBench : public Benchmark { 14cb93a386Sopenharmony_cipublic: 15cb93a386Sopenharmony_ci Image2RasterBench() { 16cb93a386Sopenharmony_ci fName.set("native_image_to_raster_surface"); 17cb93a386Sopenharmony_ci } 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 20cb93a386Sopenharmony_ci return kGPU_Backend == backend || kRaster_Backend == backend; 21cb93a386Sopenharmony_ci } 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ciprotected: 24cb93a386Sopenharmony_ci const char* onGetName() override { 25cb93a386Sopenharmony_ci return fName.c_str(); 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci // We explicitly want to bench drawing a Image [cpu or gpu backed] into a raster target, 29cb93a386Sopenharmony_ci // to ensure that we can cache the read-back in the case of gpu -> raster 30cb93a386Sopenharmony_ci // 31cb93a386Sopenharmony_ci void onPerCanvasPreDraw(SkCanvas* canvas) override { 32cb93a386Sopenharmony_ci // create an Image reflecting the canvas (gpu or cpu) 33cb93a386Sopenharmony_ci SkImageInfo info = canvas->imageInfo().makeWH(100, 100); 34cb93a386Sopenharmony_ci auto surface(canvas->makeSurface(info)); 35cb93a386Sopenharmony_ci canvas->drawColor(SK_ColorRED); 36cb93a386Sopenharmony_ci fImage = surface->makeImageSnapshot(); 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci // create a cpu-backed Surface 39cb93a386Sopenharmony_ci SkImageInfo n32Info = SkImageInfo::MakeN32Premul(100, 100); 40cb93a386Sopenharmony_ci fRasterSurface = SkSurface::MakeRaster(n32Info); 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci void onPerCanvasPostDraw(SkCanvas*) override { 44cb93a386Sopenharmony_ci // Release the image and raster surface here to prevent out of order destruction 45cb93a386Sopenharmony_ci // between these and the gpu interface. 46cb93a386Sopenharmony_ci fRasterSurface.reset(nullptr); 47cb93a386Sopenharmony_ci fImage.reset(nullptr); 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 51cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 52cb93a386Sopenharmony_ci for (int inner = 0; inner < 10; ++inner) { 53cb93a386Sopenharmony_ci fRasterSurface->getCanvas()->drawImage(fImage.get(), 0, 0); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci } 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprivate: 59cb93a386Sopenharmony_ci SkString fName; 60cb93a386Sopenharmony_ci sk_sp<SkImage> fImage; 61cb93a386Sopenharmony_ci sk_sp<SkSurface> fRasterSurface; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci using INHERITED = Benchmark; 64cb93a386Sopenharmony_ci}; 65cb93a386Sopenharmony_ciDEF_BENCH( return new Image2RasterBench; ) 66