summaryrefslogtreecommitdiffstatsci
path: root/src
diff options
context:
space:
mode:
authorBryce Harrington <b.harrington@samsung.com>2013-11-27 16:34:21 -0800
committerBryce Harrington <b.harrington@samsung.com>2013-11-27 16:42:43 -0800
commitdbf3ac8a72196a7334a407b0a6721e0ed87fc759 (patch)
treed05137845cd3d896cdd8bb199a150c5940ec05dc /src
parentdf0386562111870047c854f28ff59fdbcb8879cc (diff)
Add EGL support for skia
Diffstat (limited to 'src')
-rw-r--r--src/caskbench.cpp5
-rw-r--r--src/skia-egl.cpp86
2 files changed, 91 insertions, 0 deletions
diff --git a/src/caskbench.cpp b/src/caskbench.cpp
index 607044e..d25a8b6 100644
--- a/src/caskbench.cpp
+++ b/src/caskbench.cpp
@@ -53,6 +53,9 @@ create_cairo_surface_egl (int width, int height);
SkBaseDevice *
create_skia_device_image (int width, int height);
+SkBaseDevice *
+create_skia_device_egl (int width, int height);
+
void
write_image_file_cairo (const char *fname, caskbench_context_t *context)
@@ -254,6 +257,8 @@ main (int argc, char *argv[])
} else if (!strncmp(opt.surface_type, "egl", 3)) {
context.cairo_surface = create_cairo_surface_egl ( context.canvas_width,
context.canvas_height);
+ context.skia_device = create_skia_device_egl ( context.canvas_width,
+ context.canvas_height);
}
if (!context.cairo_surface)
diff --git a/src/skia-egl.cpp b/src/skia-egl.cpp
new file mode 100644
index 0000000..3301b23
--- /dev/null
+++ b/src/skia-egl.cpp
@@ -0,0 +1,86 @@
+#include <err.h>
+#include <stdlib.h>
+
+#include <GrGLInterface.h>
+#include <GrRenderTarget.h>
+#include <GrContext.h>
+#include <SkGpuDevice.h>
+
+#include <EGL/egl.h>
+#include <GLES3/gl3.h>
+
+#include "egl.h"
+
+static void
+cleanup (void *data)
+{
+ egl_state_t *state = (egl_state_t*)data;
+
+ eglDestroyContext (state->egl_display, state->egl_context);
+ eglDestroySurface (state->egl_display, state->egl_surface);
+ eglTerminate (state->egl_display);
+
+ XUnmapWindow (state->dpy, state->window);
+ XDestroyWindow (state->dpy, state->window);
+ XCloseDisplay (state->dpy);
+
+ free (state);
+}
+
+SkBaseDevice *
+create_skia_device_egl (int width, int height)
+{
+ egl_state_t *state;
+
+ GrBackendRenderTargetDesc desc;
+ GrContext* ctx;
+ GrRenderTarget* target;
+ SkGpuDevice *device;
+
+ state = (egl_state_t*) malloc (sizeof (egl_state_t));
+ if (!state) {
+ warnx ("Out of memory\n");
+ return NULL;
+ }
+
+ if (!createWindow(state, width, height)) {
+ return NULL;
+ }
+
+ if (!createEGLContextWithWindow(state)) {
+ cleanup(state);
+ return NULL;
+ }
+
+ eglMakeCurrent(state->egl_display, state->egl_surface, state->egl_surface, state->egl_context);
+
+ desc.fWidth = 720;
+ desc.fHeight = 1280;
+ desc.fConfig = kSkia8888_GrPixelConfig;
+ desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
+ //desc.fOrigin = kTopLeft_GrSurfaceOrigin;
+ desc.fSampleCnt = 4;
+ desc.fStencilBits = 1;
+ desc.fRenderTargetHandle = 0;
+ ctx = GrContext::Create(kOpenGL_GrBackend, 0);
+ target = ctx->wrapBackendRenderTarget(desc);
+
+ device = new SkGpuDevice(ctx, target);
+
+ /* TODO: Set cleanup routine to get called
+
+ if (cairo_device_set_user_data (cairo_device,
+ (cairo_user_data_key_t *) cleanup,
+ state,
+ cleanup))
+ {
+ warnx ("Failed to setup cleanup callback closure\n");
+ cleanup (state);
+ return NULL;
+ }
+
+ cairo_device_destroy (cairo_device);
+ */
+
+ return device;
+}