summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorsuyambulingamrm <suyambu.rm@samsung.com>2014-07-18 18:30:31 +0530
committersuyambulingamrm <suyambu.rm@samsung.com>2014-07-18 18:30:31 +0530
commit051ed08e74a5382d108e281b05c2e77a4d34b1fb (patch)
tree2905d81e989dad802c5a5735fe840be20523eb4c
parentbbac18889369ccdd296ce9c2a25ef18bee4da133 (diff)
Issue #112. Add support for SkDeferredCanvas.
-rw-r--r--src/caskbench.cpp8
-rw-r--r--src/caskbench_context.cpp50
-rw-r--r--src/caskbench_context.h6
-rw-r--r--src/forward.h2
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