diff options
| author | suyambulingamrm <suyambu.rm@samsung.com> | 2014-07-18 18:30:31 +0530 |
|---|---|---|
| committer | suyambulingamrm <suyambu.rm@samsung.com> | 2014-07-18 18:30:31 +0530 |
| commit | 051ed08e74a5382d108e281b05c2e77a4d34b1fb (patch) | |
| tree | 2905d81e989dad802c5a5735fe840be20523eb4c | |
| parent | bbac18889369ccdd296ce9c2a25ef18bee4da133 (diff) | |
Issue #112. Add support for SkDeferredCanvas.
| -rw-r--r-- | src/caskbench.cpp | 8 | ||||
| -rw-r--r-- | src/caskbench_context.cpp | 50 | ||||
| -rw-r--r-- | src/caskbench_context.h | 6 | ||||
| -rw-r--r-- | src/forward.h | 2 |
4 files changed, 55 insertions, 11 deletions
diff --git a/src/caskbench.cpp b/src/caskbench.cpp index 44ccb17..8b68c89 100644 --- a/src/caskbench.cpp +++ b/src/caskbench.cpp @@ -65,6 +65,7 @@ typedef struct _caskbench_options { int min_swap_interval; int max_swap_interval; int match_native_pixmap; + int deferred_canvas; const char **tests; } caskbench_options_t; @@ -286,6 +287,9 @@ process_options(caskbench_options_t *opt, int argc, char *argv[]) {"match-native-pixmap", '\0', POPT_ARG_INT, &opt->match_native_pixmap, 0, "EGL pixmap handle to use", NULL}, + {"deferred-rendering", '\0', POPT_ARG_NONE, &opt->deferred_canvas, 0, + "Creates Deferred Canvas for skia rendering for EGL backend. Deferred rendering records graphics commands and stores the intermediate result. It can be played back by the application appropriately.", + NULL}, #endif {"list-drawing-libs", '\0', POPT_ARG_NONE, &opt->list_drawing_libs, 0, "List the drawing libraries available", @@ -627,6 +631,10 @@ main (int argc, char *argv[]) context.canvas_height = opt.canvas_height; if (opt.stock_image_path) context.stock_image_path = opt.stock_image_path; + if (opt.surface_type && opt.deferred_canvas) + context.is_egl_deferred = !strncmp(opt.surface_type, "egl", 3); + else if (opt.deferred_canvas) + errx (0, "Deferred rendering is not available with the current configuration"); shape_defaults_init(&context.shape_defaults, &opt); result_init(&result, perf_tests[c].name); diff --git a/src/caskbench_context.cpp b/src/caskbench_context.cpp index 066400a..50f9e1d 100644 --- a/src/caskbench_context.cpp +++ b/src/caskbench_context.cpp @@ -10,6 +10,7 @@ #include <assert.h> #include <err.h> #include <string.h> +#include <forward.h> #ifdef USE_CAIRO #include <cairo.h> @@ -23,6 +24,10 @@ # include <SkBitmapDevice.h> # include <SkPaint.h> # include <SkCanvas.h> +# include <SkDeferredCanvas.h> +# include <SkImage.h> +# include <SkSurface.h> +# include <GrRenderTarget.h> #endif #include "caskbench_context.h" @@ -33,20 +38,11 @@ context_init(caskbench_context_t *context, int size) { assert(context); assert(size > 0); - + memset(context, 0, sizeof(caskbench_context_t)); context->size = size; context->canvas_width = 800; context->canvas_height = 400; - context->skia_device = NULL; - context->skia_paint = NULL; - context->setup_cairo = NULL; - context->setup_skia = NULL; - context->destroy_cairo = NULL; - context->destroy_skia = NULL; - context->update_cairo = NULL; - context->update_skia = NULL; context->tolerance = 0.25; - context->stock_image_path = NULL; } #ifdef USE_CAIRO @@ -154,6 +150,22 @@ context_setup_skia(caskbench_context_t *context, const device_config_t& config) context->skia_paint = new SkPaint; context->skia_canvas = new SkCanvas(context->skia_device); + + // egl and deferred_rendering + if (context->is_egl_deferred) { + SkDeferredCanvas *dCanvas; + SkImageInfo dImageInfo; + + // create deferred canvas + dImageInfo.fWidth = context->canvas_width; + dImageInfo.fHeight = context->canvas_height; + dImageInfo.fColorType = kRGBA_8888_SkColorType; + dImageInfo.fAlphaType = kPremul_SkAlphaType; + context->dSurface = SkSurface::NewRenderTarget(context->skia_device->accessRenderTarget()->getContext(), dImageInfo, 0); + dCanvas = SkDeferredCanvas::Create(context->dSurface); + context->skia_canvas_immediate = context->skia_canvas; + context->skia_canvas = dCanvas; + } // Clear background to black context->skia_canvas->clear(0); context->skia_paint->setARGB(255, 0, 0, 0); @@ -166,6 +178,21 @@ context_setup_skia(caskbench_context_t *context, const device_config_t& config) void context_update_skia(caskbench_context_t *context) { + // egl and deferred_rendering + if (context->is_egl_deferred) { + SkPaint p; + if (context->snapshot) + context->snapshot->unref(); + + context->snapshot = static_cast <SkDeferredCanvas*> (context->skia_canvas)->newImageSnapshot(); + SkRect src_rect, dst_rect; + src_rect = SkRect::MakeXYWH(0, 0, context->canvas_width, context->canvas_height); + dst_rect = src_rect; + + p.setXfermodeMode(SkXfermode::kSrc_Mode); + context->snapshot->draw(context->skia_canvas_immediate, &src_rect, dst_rect, &p); + + } context->update_skia(); } @@ -175,8 +202,11 @@ context_destroy_skia(caskbench_context_t *context) if (!context) return; delete context->skia_paint; + delete context->skia_canvas_immediate; delete context->skia_canvas; delete context->skia_device; + delete context->dSurface; + delete context->snapshot; context->destroy_skia(); context->skia_device = NULL; } diff --git a/src/caskbench_context.h b/src/caskbench_context.h index 9e70ad8..691afc8 100644 --- a/src/caskbench_context.h +++ b/src/caskbench_context.h @@ -19,8 +19,11 @@ typedef struct _caskbench_context { cairo_surface_t *cairo_surface; SkPaint *skia_paint; - SkCanvas *skia_canvas; + SkCanvas *skia_canvas; // Acts as SkDeferredCanvas only when deferred-rendering is enabled. + SkCanvas *skia_canvas_immediate; // Backup for Immediate/Regular Skia canvas. SkBaseDevice *skia_device; + SkSurface *dSurface; + SkImage *snapshot; cairo_surface_t *(*setup_cairo)(const device_config_t& config); SkBaseDevice *(*setup_skia)(const device_config_t& config); @@ -32,6 +35,7 @@ typedef struct _caskbench_context { const char *stock_image_path; shapes_t shape_defaults; double tolerance; + int is_egl_deferred; } caskbench_context_t; diff --git a/src/forward.h b/src/forward.h index c16ad49..305675c 100644 --- a/src/forward.h +++ b/src/forward.h @@ -20,6 +20,8 @@ class SkPaint; class SkCanvas; class SkShader; class SkBaseDevice; +class SkImage; +class SkSurface; // Caskbench forward declarations |