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