summaryrefslogtreecommitdiffstatsci
path: root/src/skia-egl.cpp
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/skia-egl.cpp
parentdf0386562111870047c854f28ff59fdbcb8879cc (diff)
Add EGL support for skia
Diffstat (limited to 'src/skia-egl.cpp')
-rw-r--r--src/skia-egl.cpp86
1 files changed, 86 insertions, 0 deletions
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;
+}