summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorBryce Harrington <b.harrington@samsung.com>2014-07-18 11:26:09 -0700
committerBryce Harrington <b.harrington@samsung.com>2014-07-18 11:26:09 -0700
commit80ad156d402aac8255245cc0f8003cf6270cf339 (patch)
tree5f0ab28ddb8132fda0f35fc21f48ae6ac6b18900
parentd2fb40482089a5d333438c4f59c5e8788e15c6d8 (diff)
parentff92336f5afcf3a58a28b44a115dd2bee6a0928a (diff)
Merge pull request #124 from Samsung/Issue_112
Issue 112. Add SkDeferredCanvas to caskbench.
-rw-r--r--CMakeScripts/Modules/FindSkia.cmake1
-rw-r--r--src/cairo-tests/cubic.cpp6
-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
-rw-r--r--src/skia-shapes.cpp4
-rw-r--r--src/skia-tests/cubic.cpp4
-rw-r--r--src/skia-tests/shadow.cpp5
-rwxr-xr-xutils/canvas_perf14
10 files changed, 80 insertions, 20 deletions
diff --git a/CMakeScripts/Modules/FindSkia.cmake b/CMakeScripts/Modules/FindSkia.cmake
index 7424e04..affb4d8 100644
--- a/CMakeScripts/Modules/FindSkia.cmake
+++ b/CMakeScripts/Modules/FindSkia.cmake
@@ -48,6 +48,7 @@ list(APPEND SKIA_INCLUDE_DIRS ${SKIA_INCLUDE_DIR}/tools/flags/)
list(APPEND SKIA_INCLUDE_DIRS ${SKIA_INCLUDE_DIR}/lazy/)
list(APPEND SKIA_INCLUDE_DIRS ${SKIA_INCLUDE_DIR}/gpu/)
list(APPEND SKIA_INCLUDE_DIRS ${SKIA_INCLUDE_DIR}/gpu/gl/)
+list(APPEND SKIA_INCLUDE_DIRS ${SKIA_INCLUDE_DIR}/../src/effects/)
if (SKIA_LIBRARIES)
message("Found libraries")
diff --git a/src/cairo-tests/cubic.cpp b/src/cairo-tests/cubic.cpp
index 64c44ef..8482292 100644
--- a/src/cairo-tests/cubic.cpp
+++ b/src/cairo-tests/cubic.cpp
@@ -47,9 +47,13 @@ ca_test_cubic(caskbench_context_t *ctx)
cairoRandomizeColor(ctx);
cairoDrawCubicCurve(ctx, &shape);
+ if (ctx->shape_defaults.fill_type == CB_FILL_SOLID)
+ cairo_fill(ctx->cairo_cr);
+ else
+ cairo_stroke(ctx->cairo_cr);
}
- cairo_stroke(ctx->cairo_cr);
+
return 1;
}
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
diff --git a/src/skia-shapes.cpp b/src/skia-shapes.cpp
index ba10f1d..d38ccba 100644
--- a/src/skia-shapes.cpp
+++ b/src/skia-shapes.cpp
@@ -103,7 +103,7 @@ skiaCreateLinearGradientShader(int y1, int y2)
return SkGradientShader::CreateLinear(
linearPoints, linearColors, NULL, NUM_ELEM(linearColors),
- SkShader::kClamp_TileMode, NULL);
+ SkShader::kClamp_TileMode);
}
SkShader*
@@ -134,7 +134,7 @@ skiaCreateRadialGradientShader(const shapes_t *shape)
return SkGradientShader::CreateRadial(
center, radius,
colors, NULL, NUM_ELEM(colors),
- SkShader::kClamp_TileMode, NULL);
+ SkShader::kClamp_TileMode);
}
SkShader*
diff --git a/src/skia-tests/cubic.cpp b/src/skia-tests/cubic.cpp
index 2c9c2e8..21091a5 100644
--- a/src/skia-tests/cubic.cpp
+++ b/src/skia-tests/cubic.cpp
@@ -22,6 +22,10 @@ sk_setup_cubic(caskbench_context_t *ctx)
ctx->skia_paint->setAntiAlias(false);
ctx->skia_paint->setStrokeWidth(1);
ctx->skia_paint->setStyle(SkPaint::kStroke_Style);
+ if (ctx->shape_defaults.fill_type == CB_FILL_SOLID) {
+ ctx->skia_paint->setStyle(SkPaint::kFill_Style);
+ }
+
return 1;
}
diff --git a/src/skia-tests/shadow.cpp b/src/skia-tests/shadow.cpp
index 4e0de46..4a363ee 100644
--- a/src/skia-tests/shadow.cpp
+++ b/src/skia-tests/shadow.cpp
@@ -15,6 +15,7 @@
#include "skia-shapes.h"
#include "kinetics.h"
#include "SkBlurMaskFilter.h"
+#include "SkBlurMask.h"
static double line_width;
@@ -61,9 +62,9 @@ static void particle_init ()
drop_line_width = line_width;
SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
- mf = SkBlurMaskFilter::Create(SkBlurMaskFilter::kInner_BlurStyle, (SkDoubleToScalar(drop_line_width)), flags);
+ mf = SkBlurMaskFilter::Create(kInner_SkBlurStyle, (SkDoubleToScalar(drop_line_width)), flags);
flags = SkBlurMaskFilter::kNone_BlurFlag;
- mf_spread = SkBlurMaskFilter::Create(SkBlurMaskFilter::kInner_BlurStyle, (SkDoubleToScalar(spread_line_width)), flags);
+ mf_spread = SkBlurMaskFilter::Create(kInner_SkBlurStyle, (SkDoubleToScalar(spread_line_width)), flags);
}
static void fill_particle (caskbench_context_t *ctx, shapes_t *shape)
diff --git a/utils/canvas_perf b/utils/canvas_perf
index 9dc9547..2826624 100755
--- a/utils/canvas_perf
+++ b/utils/canvas_perf
@@ -20,11 +20,11 @@ perfdefs = [
[ "line", 1000, 6, ["line"] ],
[ "rect", 1000, 5, ["rect", "-f", "none"] ],
[ "fill_rect", 500, 5, ["rect", "-f", "solid"] ],
- [ "lines", 1000, 8, ["multi-line"] ],
+ [ "lines", 1000, 8, ["multi_line"] ],
[ "arc", 1000, 4, ["circle", "-f", "none"] ],
[ "fill_arc", 1000, 7, ["circle", "-f", "solid"] ],
[ "bezier", 1000, 3, ["cubic"] ],
-# [ "fill_bezier", 1000, 4, ["cubic", "-f", "solid"] ],
+ [ "fill_bezier", 1000, 4, ["cubic", "-f", "solid"] ],
[ "quad", 1000, 4, ["quadratic"] ],
# [ "curves", 50, 5, ["curves", "-f", "none"] ],
# [ "fill_curves", 50, 8, ["curves", "-f", "solid"] ],
@@ -37,7 +37,7 @@ perfdefs = [
# [ "linear_gradient", 100, 2, ["fill", "-f", "linear-gradient"] ],
# [ "radial_gradient", 100, 0.3, ["fill", "-f", "radial-gradient"] ],
# [ "text", 100, 0.6, ["text"] ],
-# [ "clip", 100, 0.8, ["clip"] ]
+ [ "clip", 100, 0.8, ["clip"] ]
]
class ReturnCode(Exception):
@@ -70,6 +70,9 @@ for testcase in perfdefs:
'-i', '1',
'-s', str(testcase[1]),
'-j',
+ '-o', 'output.json',
+ '-t', 'egl',
+ '--deferred-rendering',
]
cmd += testcase[3]
@@ -77,7 +80,10 @@ for testcase in perfdefs:
print(' '.join(cmd))
json_output = execute(cmd)
print(json_output)
- result = json.loads(json_output)[0]
+
+ with open('output.json') as file:
+ result = json.load(file)[0]
+
value = result["median run time (s)"]*1000.0
ratio = value / testcase[2]