diff options
| author | Bryce Harrington <b.harrington@samsung.com> | 2014-07-18 11:26:09 -0700 |
|---|---|---|
| committer | Bryce Harrington <b.harrington@samsung.com> | 2014-07-18 11:26:09 -0700 |
| commit | 80ad156d402aac8255245cc0f8003cf6270cf339 (patch) | |
| tree | 5f0ab28ddb8132fda0f35fc21f48ae6ac6b18900 | |
| parent | d2fb40482089a5d333438c4f59c5e8788e15c6d8 (diff) | |
| parent | ff92336f5afcf3a58a28b44a115dd2bee6a0928a (diff) | |
Merge pull request #124 from Samsung/Issue_112
Issue 112. Add SkDeferredCanvas to caskbench.
| -rw-r--r-- | CMakeScripts/Modules/FindSkia.cmake | 1 | ||||
| -rw-r--r-- | src/cairo-tests/cubic.cpp | 6 | ||||
| -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 | ||||
| -rw-r--r-- | src/skia-shapes.cpp | 4 | ||||
| -rw-r--r-- | src/skia-tests/cubic.cpp | 4 | ||||
| -rw-r--r-- | src/skia-tests/shadow.cpp | 5 | ||||
| -rwxr-xr-x | utils/canvas_perf | 14 |
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] |