| /* |
| * Copyright © 2014 Samsung Electronics |
| * |
| * Permission is hereby granted, free of charge, to any person |
| * obtaining a copy of this software and associated documentation |
| * files (the "Software"), to deal in the Software without |
| * restriction, including without limitation the rights to use, copy, |
| * modify, merge, publish, distribute, sublicense, and/or sell copies |
| * of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| * |
| * Author: Ravi Nanjundappa <nravi.n@samsung.com> |
| */ |
| |
| /* |
| * This case tests using a EGL surface as the source |
| * |
| */ |
| |
| #include "cairo-test.h" |
| #include <cairo-gl.h> |
| |
| #include "surface-source.c" |
| |
| struct closure { |
| EGLDisplay dpy; |
| EGLContext ctx; |
| }; |
| |
| static void |
| cleanup (void *data) |
| { |
| struct closure *arg = data; |
| |
| eglDestroyContext (arg->dpy, arg->ctx); |
| eglMakeCurrent (arg->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); |
| eglTerminate (arg->dpy); |
| |
| free (arg); |
| } |
| |
| static cairo_surface_t * |
| create_source_surface (int size) |
| { |
| EGLint config_attribs[] = { |
| EGL_RED_SIZE, 8, |
| EGL_GREEN_SIZE, 8, |
| EGL_BLUE_SIZE, 8, |
| EGL_ALPHA_SIZE, 8, |
| EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, |
| #if CAIRO_HAS_GL_SURFACE |
| EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, |
| #elif CAIRO_HAS_GLESV2_SURFACE |
| EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, |
| #endif |
| EGL_NONE |
| }; |
| const EGLint ctx_attribs[] = { |
| #if CAIRO_HAS_GLESV2_SURFACE |
| EGL_CONTEXT_CLIENT_VERSION, 2, |
| #endif |
| EGL_NONE |
| }; |
| |
| struct closure *arg; |
| cairo_device_t *device; |
| cairo_surface_t *surface; |
| EGLConfig config; |
| EGLint numConfigs; |
| EGLDisplay dpy; |
| EGLContext ctx; |
| int major, minor; |
| |
| dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); |
| if (! eglInitialize (dpy, &major, &minor)) { |
| return NULL; |
| } |
| |
| eglChooseConfig (dpy, config_attribs, &config, 1, &numConfigs); |
| if (numConfigs == 0) { |
| return NULL; |
| } |
| |
| #if CAIRO_HAS_GL_SURFACE |
| eglBindAPI (EGL_OPENGL_API); |
| #elif CAIRO_HAS_GLESV2_SURFACE |
| eglBindAPI (EGL_OPENGL_ES_API); |
| #endif |
| |
| ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT, |
| ctx_attribs); |
| if (ctx == EGL_NO_CONTEXT) { |
| eglTerminate (dpy); |
| return NULL; |
| } |
| |
| arg = xmalloc (sizeof (struct closure)); |
| arg->dpy = dpy; |
| arg->ctx = ctx; |
| device = cairo_egl_device_create (dpy, ctx); |
| if (cairo_device_set_user_data (device, |
| (cairo_user_data_key_t *) cleanup, |
| arg, |
| cleanup)) |
| { |
| cleanup (arg); |
| return NULL; |
| } |
| |
| surface = cairo_gl_surface_create (device, |
| CAIRO_CONTENT_COLOR_ALPHA, |
| size, size); |
| cairo_device_destroy (device); |
| |
| return surface; |
| } |
| |
| CAIRO_TEST (egl_surface_source, |
| "Test using a EGL surface as the source", |
| "source", /* keywords */ |
| NULL, /* requirements */ |
| SIZE, SIZE, |
| preamble, draw) |