12c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland/* 22c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * Copyright (C) 2013 The Android Open Source Project 32c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * 42c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * Licensed under the Apache License, Version 2.0 (the "License"); 52c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * you may not use this file except in compliance with the License. 62c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * You may obtain a copy of the License at 72c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * 82c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * http://www.apache.org/licenses/LICENSE-2.0 92c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * 102c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * Unless required by applicable law or agreed to in writing, software 112c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * distributed under the License is distributed on an "AS IS" BASIS, 122c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * See the License for the specific language governing permissions and 142c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland * limitations under the License. 152c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland */ 162c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 172c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include <stdlib.h> 182c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include <stdio.h> 192c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include <stdarg.h> 202c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 212c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include <EGL/egl.h> 222c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include <GLES2/gl2.h> 232c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 242c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include <system/graphics.h> 252c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 262c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland#include "util.h" 272c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 282c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandvoid matrix_init_ortho(GLfloat *m, float w, float h) { 292c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[0] = 2.0 / w; 302c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[1] = 0.0; 312c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[2] = 0.0; 322c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[3] = -1.0; 332c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[4] = 0.0; 342c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[5] = 2.0 / h; 352c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[6] = 0.0; 362c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[7] = -1.0; 372c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[8] = 0.0; 382c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[9] = 0.0; 392c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[10] -1.0; 402c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[11] = 0.0; 412c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[12] = 0.0; 422c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[13] = 0.0; 432c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[14] = 0.0; 442c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland m[15] = 1.0; 452c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland} 462c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 472c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandstatic GLuint load_shader(GLenum shaderType, const char *src) { 482c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland GLint status = 0, len = 0; 492c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland GLuint shader; 502c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 512c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!(shader = glCreateShader(shaderType))) 522c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return 0; 532c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 542c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glShaderSource(shader, 1, &src, NULL); 552c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glCompileShader(shader); 562c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 572c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 582c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (status) 592c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return shader; 602c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 612c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len); 622c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (len) { 632c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland char *msg = malloc(len); 642c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (msg) { 652c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glGetShaderInfoLog(shader, len, NULL, msg); 662c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland msg[len-1] = 0; 672c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "error compiling shader:\n%s\n", msg); 682c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland free(msg); 692c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 702c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 712c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glDeleteShader(shader); 722c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return 0; 732c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland} 742c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 752c7b08ad8aeedef1807560ea16d54d073bede2b2Brian SwetlandGLuint load_program(const char *vert_src, const char *frag_src) { 762c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland GLuint vert, frag, prog; 772c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland GLint status = 0, len = 0; 782c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 792c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!(vert = load_shader(GL_VERTEX_SHADER, vert_src))) 802c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return 0; 812c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!(frag = load_shader(GL_FRAGMENT_SHADER, frag_src))) 822c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland goto fail_frag; 832c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!(prog = glCreateProgram())) 842c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland goto fail_prog; 852c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 862c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glAttachShader(prog, vert); 872c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glAttachShader(prog, frag); 882c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glLinkProgram(prog); 892c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 902c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glGetProgramiv(prog, GL_LINK_STATUS, &status); 912c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (status) 922c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return prog; 932c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 942c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len); 952c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (len) { 962c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland char *buf = (char*) malloc(len); 972c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (buf) { 982c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glGetProgramInfoLog(prog, len, NULL, buf); 992c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland buf[len-1] = 0; 1002c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "error linking program:\n%s\n", buf); 1012c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland free(buf); 1022c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1032c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1042c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glDeleteProgram(prog); 1052c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandfail_prog: 1062c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glDeleteShader(frag); 1072c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandfail_frag: 1082c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland glDeleteShader(vert); 1092c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return 0; 1102c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland} 1112c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1122c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandint select_config_for_window(EGLDisplay dpy, EGLint *attr, 1132c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland unsigned format, EGLConfig *config) { 1142c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint R,G,B,A,r,g,b,a; 1152c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint i, n, max; 1162c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLConfig *cfg; 1172c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1182c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland switch (format) { 1192c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland case HAL_PIXEL_FORMAT_RGBA_8888: 1202c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland case HAL_PIXEL_FORMAT_BGRA_8888: 1212c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland R = G = B = A = 8; 1222c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland break; 1232c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland case HAL_PIXEL_FORMAT_RGB_565: 1242c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland R = 5; G = 6; B = 5; A = 0; 1252c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland break; 1262c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland default: 1272c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "unknown fb pixel format %d\n", format); 1282c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1292c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1302c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1312c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (eglGetConfigs(dpy, NULL, 0, &max) == EGL_FALSE) { 1322c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "no EGL configurations available?!\n"); 1332c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1342c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1352c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1362c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland cfg = (EGLConfig*) malloc(sizeof(EGLConfig) * max); 1372c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!cfg) 1382c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1392c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1402c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (eglChooseConfig(dpy, attr, cfg, max, &n) == EGL_FALSE) { 1412c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "eglChooseConfig failed\n"); 1422c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1432c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1442c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1452c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland for (i = 0; i < n; i++) { 1462c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint r,g,b,a; 1472c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglGetConfigAttrib(dpy, cfg[i], EGL_RED_SIZE, &r); 1482c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglGetConfigAttrib(dpy, cfg[i], EGL_GREEN_SIZE, &g); 1492c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglGetConfigAttrib(dpy, cfg[i], EGL_BLUE_SIZE, &b); 1502c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglGetConfigAttrib(dpy, cfg[i], EGL_ALPHA_SIZE, &a); 1512c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (r == R && g == G && b == B && a == A) { 1522c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland *config = cfg[i]; 1532c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland free(cfg); 1542c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return 0; 1552c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1562c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 1572c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1582c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "cannot find matching config\n"); 1592c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland free(cfg); 1602c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1612c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland} 1622c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1632c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandstatic struct CNativeWindow *_cnw = 0; 1642c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1652c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandint egl_create(EGLDisplay *_display, EGLSurface *_surface, int *_w, int *_h) { 1662c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLBoolean res; 1672c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLConfig config = { 0 }; 1682c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint context_attrs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 1692c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint config_attrs[] = { 1702c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 1712c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 1722c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGL_NONE }; 1732c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint major, minor; 1742c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLContext context; 1752c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLSurface surface; 1762c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLint w, h; 1772c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLDisplay display; 1782c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland EGLNativeWindowType window; 1792c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland unsigned width, height, format; 1802c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland struct CNativeWindow *cnw; 1812c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1822c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 1832c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (display == EGL_NO_DISPLAY) 1842c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1852c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1862c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!(res = eglInitialize(display, &major, &minor))) 1872c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1882c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1892c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "egl version: %d.%d\n", major, minor); 1902c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1912c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if ((cnw = cnw_create()) == 0) 1922c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 1932c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1942c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland cnw_info(cnw, &width, &height, &format); 1952c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland window = (EGLNativeWindowType) cnw; 1962c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 1972c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if ((res = select_config_for_window(display, config_attrs, format, &config))) 1982c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland goto fail; 1992c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2002c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland surface = eglCreateWindowSurface(display, config, window, NULL); 2012c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (surface == EGL_NO_SURFACE) 2022c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland goto fail; 2032c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2042c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland context = eglCreateContext(display, config, EGL_NO_CONTEXT, context_attrs); 2052c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (context == EGL_NO_CONTEXT) 2062c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland goto fail; 2072c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2082c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (!(res = eglMakeCurrent(display, surface, surface, context))) 2092c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland goto fail; 2102c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2112c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglQuerySurface(display, surface, EGL_WIDTH, &w); 2122c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglQuerySurface(display, surface, EGL_HEIGHT, &h); 2132c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2142c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland fprintf(stderr, "window: %d x %d\n", w, h); 2152c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2162c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland *_display = display; 2172c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland *_surface = surface; 2182c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland *_w = w; 2192c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland *_h = h; 2202c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2212c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland _cnw = cnw; 2222c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return 0; 2232c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2242c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandfail: 2252c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland cnw_destroy(cnw); 2262c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland return -1; 2272c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland} 2282c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland 2292c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetlandvoid egl_destroy(EGLDisplay display, EGLSurface surface) { 2302c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland if (_cnw) { 2312c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglDestroySurface(display, surface); 2322c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland eglTerminate(display); 2332c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland cnw_destroy(_cnw); 2342c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland _cnw = 0; 2352c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland } 2362c7b08ad8aeedef1807560ea16d54d073bede2b2Brian Swetland} 237