diff options
| author | Bryce Harrington <b.harrington@samsung.com> | 2013-11-27 16:34:21 -0800 |
|---|---|---|
| committer | Bryce Harrington <b.harrington@samsung.com> | 2013-11-27 16:42:43 -0800 |
| commit | dbf3ac8a72196a7334a407b0a6721e0ed87fc759 (patch) | |
| tree | d05137845cd3d896cdd8bb199a150c5940ec05dc /src/skia-egl.cpp | |
| parent | df0386562111870047c854f28ff59fdbcb8879cc (diff) | |
Add EGL support for skia
Diffstat (limited to 'src/skia-egl.cpp')
| -rw-r--r-- | src/skia-egl.cpp | 86 |
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; +} |