1b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams/* 2b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * Copyright (C) 2007 The Android Open Source Project 3b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * 4b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * you may not use this file except in compliance with the License. 6b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * You may obtain a copy of the License at 7b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * 8b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * 10b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * Unless required by applicable law or agreed to in writing, software 11b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * See the License for the specific language governing permissions and 14b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams * limitations under the License. 15b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams */ 16b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 17b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <stdlib.h> 18b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <stdio.h> 19b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <time.h> 20b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <sched.h> 21b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <sys/resource.h> 22b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 23b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <EGL/egl.h> 24953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich#include <GLES2/gl2.h> 25953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich#include <GLES2/gl2ext.h> 26b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 27b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <utils/Timers.h> 28b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 29b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <ui/FramebufferNativeWindow.h> 30b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams#include <ui/EGLUtils.h> 31b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 32b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Samsusing namespace android; 33b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 34953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichstatic void printGLString(const char *name, GLenum s) { 35953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // fprintf(stderr, "printGLString %s, %d\n", name, s); 36953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich const char *v = (const char *) glGetString(s); 37953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // int error = glGetError(); 38953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // fprintf(stderr, "glGetError() = %d, result of glGetString = %x\n", error, 39953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // (unsigned int) v); 40953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // if ((v < (const char*) 0) || (v > (const char*) 0x10000)) 41953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // fprintf(stderr, "GL %s = %s\n", name, v); 42953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // else 43953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich // fprintf(stderr, "GL %s = (null) 0x%08x\n", name, (unsigned int) v); 44953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "GL %s = %s\n", name, v); 45113096d5d05c9c1739c9d427399f47a35cf6fd57Jack Palevich} 46113096d5d05c9c1739c9d427399f47a35cf6fd57Jack Palevich 47fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevichstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { 48fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich if (returnVal != EGL_TRUE) { 49fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich fprintf(stderr, "%s() returned %d\n", op, returnVal); 50fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich } 51fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich 52953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 53953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich = eglGetError()) { 5466d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error), 55953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich error); 56953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 57953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich} 58953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 59953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichstatic void checkGlError(const char* op) { 60953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich for (GLint error = glGetError(); error; error 61953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich = glGetError()) { 62953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "after %s() glError (0x%x)\n", op, error); 63953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 64953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich} 65953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 66953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichstatic const char gVertexShader[] = "attribute vec4 vPosition;\n" 67953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich "void main() {\n" 68953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich " gl_Position = vPosition;\n" 69953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich "}\n"; 70953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 71953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichstatic const char gFragmentShader[] = "precision mediump float;\n" 72953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich "void main() {\n" 73953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" 74953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich "}\n"; 75953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 76953254b2f2c420d865b132b09bc682458b3e32ddJack PalevichGLuint loadShader(GLenum shaderType, const char* pSource) { 77953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLuint shader = glCreateShader(shaderType); 78953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (shader) { 79953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glShaderSource(shader, 1, &pSource, NULL); 80953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glCompileShader(shader); 81953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLint compiled = 0; 82953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 83953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (!compiled) { 84953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLint infoLen = 0; 85953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); 86953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (infoLen) { 87953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich char* buf = (char*) malloc(infoLen); 88953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (buf) { 89953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glGetShaderInfoLog(shader, infoLen, NULL, buf); 90953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "Could not compile shader %d:\n%s\n", 91953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich shaderType, buf); 92953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich free(buf); 93953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 94953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glDeleteShader(shader); 95953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich shader = 0; 96953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 97953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 98953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 99953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return shader; 100953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich} 101953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 102953254b2f2c420d865b132b09bc682458b3e32ddJack PalevichGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) { 103953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource); 104953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (!vertexShader) { 105953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 106953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 107953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 108953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource); 109953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (!pixelShader) { 110953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 111953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 112953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 113953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLuint program = glCreateProgram(); 114953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (program) { 115953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glAttachShader(program, vertexShader); 116953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glAttachShader"); 117953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glAttachShader(program, pixelShader); 118953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glAttachShader"); 119953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glLinkProgram(program); 120953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLint linkStatus = GL_FALSE; 121953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); 122953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (linkStatus != GL_TRUE) { 123953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLint bufLength = 0; 124953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); 125953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (bufLength) { 126953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich char* buf = (char*) malloc(bufLength); 127953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (buf) { 128953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glGetProgramInfoLog(program, bufLength, NULL, buf); 129953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "Could not link program:\n%s\n", buf); 130953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich free(buf); 131953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 132953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 133953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glDeleteProgram(program); 134953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich program = 0; 135953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 136953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 137953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return program; 138953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich} 139953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 140953254b2f2c420d865b132b09bc682458b3e32ddJack PalevichGLuint gProgram; 141953254b2f2c420d865b132b09bc682458b3e32ddJack PalevichGLuint gvPositionHandle; 142953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 143953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichbool setupGraphics(int w, int h) { 144953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich gProgram = createProgram(gVertexShader, gFragmentShader); 145953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (!gProgram) { 146953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return false; 147113096d5d05c9c1739c9d427399f47a35cf6fd57Jack Palevich } 148953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich gvPositionHandle = glGetAttribLocation(gProgram, "vPosition"); 149953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glGetAttribLocation"); 150953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "glGetAttribLocation(\"vPosition\") = %d\n", 151953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich gvPositionHandle); 152953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 153953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glViewport(0, 0, w, h); 154953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glViewport"); 155953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return true; 156953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich} 157953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 158953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichconst GLfloat gTriangleVertices[] = { 0.0f, 0.5f, -0.5f, -0.5f, 159953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 0.5f, -0.5f }; 160953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 161953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichvoid renderFrame() { 162953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 163953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glClearColor"); 164953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 165953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glClear"); 166953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 167953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glUseProgram(gProgram); 168953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glUseProgram"); 169953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 170953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices); 171953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glVertexAttribPointer"); 172953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glEnableVertexAttribArray(gvPositionHandle); 173953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glEnableVertexAttribArray"); 174953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich glDrawArrays(GL_TRIANGLES, 0, 3); 175953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkGlError("glDrawArrays"); 176b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams} 177b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 17882c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevichvoid printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { 17982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich 18082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich#define X(VAL) {VAL, #VAL} 18182c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich struct {EGLint attribute; const char* name;} names[] = { 18282c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_BUFFER_SIZE), 18382c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_ALPHA_SIZE), 18482c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_BLUE_SIZE), 18582c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_GREEN_SIZE), 18682c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_RED_SIZE), 18782c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_DEPTH_SIZE), 18882c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_STENCIL_SIZE), 18982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_CONFIG_CAVEAT), 19082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_CONFIG_ID), 19182c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_LEVEL), 19282c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_MAX_PBUFFER_HEIGHT), 19382c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_MAX_PBUFFER_PIXELS), 19482c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_MAX_PBUFFER_WIDTH), 19582c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_NATIVE_RENDERABLE), 19682c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_NATIVE_VISUAL_ID), 19782c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_NATIVE_VISUAL_TYPE), 19882c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_SAMPLES), 19982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_SAMPLE_BUFFERS), 20082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_SURFACE_TYPE), 20182c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_TRANSPARENT_TYPE), 20282c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_TRANSPARENT_RED_VALUE), 20382c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_TRANSPARENT_GREEN_VALUE), 20482c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_TRANSPARENT_BLUE_VALUE), 20582c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_BIND_TO_TEXTURE_RGB), 20682c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_BIND_TO_TEXTURE_RGBA), 20782c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_MIN_SWAP_INTERVAL), 20882c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_MAX_SWAP_INTERVAL), 20982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_LUMINANCE_SIZE), 21082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_ALPHA_MASK_SIZE), 21182c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_COLOR_BUFFER_TYPE), 21282c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_RENDERABLE_TYPE), 21382c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich X(EGL_CONFORMANT), 21482c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich }; 21582c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich#undef X 21682c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich 21782c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { 21882c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich EGLint value = -1; 21982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich EGLint returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); 22082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich EGLint error = eglGetError(); 22182c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich if (returnVal && error == EGL_SUCCESS) { 22282c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich printf(" %s: ", names[j].name); 22382c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich printf("%d (0x%x)", value, value); 22466d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich } 225669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich } 226669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich printf("\n"); 22766d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich} 22866d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich 229669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevichint printEGLConfigurations(EGLDisplay dpy) { 230669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich EGLint numConfig = 0; 231669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich EGLint returnVal = eglGetConfigs(dpy, NULL, 0, &numConfig); 232669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich checkEglError("eglGetConfigs", returnVal); 233669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich if (!returnVal) { 234669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich return false; 235669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich } 236669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 237669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich printf("Number of EGL configuration: %d\n", numConfig); 238669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 239669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich EGLConfig* configs = (EGLConfig*) malloc(sizeof(EGLConfig) * numConfig); 240669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich if (! configs) { 241669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich printf("Could not allocate configs.\n"); 242669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich return false; 243669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich } 244669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 24582c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich returnVal = eglGetConfigs(dpy, configs, numConfig, &numConfig); 246669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich checkEglError("eglGetConfigs", returnVal); 247669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich if (!returnVal) { 248669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich free(configs); 249669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich return false; 250669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich } 251669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 252669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich for(int i = 0; i < numConfig; i++) { 253669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich printf("Configuration %d\n", i); 25482c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich printEGLConfiguration(dpy, configs[i]); 255669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich } 256669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 257669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich free(configs); 258669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich return true; 259669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich} 260669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 261953254b2f2c420d865b132b09bc682458b3e32ddJack Palevichint main(int argc, char** argv) { 262fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich EGLBoolean returnValue; 26366d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich EGLConfig myConfig = {0}; 264fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich 265953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 26666d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich EGLint s_configAttribs[] = { 26782c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 26866d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 26966d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich EGL_NONE }; 270953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLint majorVersion; 271953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLint minorVersion; 272953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLContext context; 273953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLSurface surface; 274953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLint w, h; 275953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 276953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich EGLDisplay dpy; 277953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 278953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("<init>"); 279953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 280953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("eglGetDisplay"); 281953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (dpy == EGL_NO_DISPLAY) { 282953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 283953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 284953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 285953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 286953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 287953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("eglInitialize", returnValue); 288953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 289953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (returnValue != EGL_TRUE) { 290953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printf("eglInitialize failed\n"); 291953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 292953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 293953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 294669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich if (!printEGLConfigurations(dpy)) { 295669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich printf("printEGLConfigurations failed\n"); 296669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich return 0; 297669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich } 298669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich 29982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich checkEglError("printEGLConfigurations"); 30082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich 30166d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich EGLNativeWindowType window = android_createDisplaySurface(); 30266d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich returnValue = EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &myConfig); 30366d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich if (returnValue) { 304669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich printf("EGLUtils::selectConfigForNativeWindow() returned %d", returnValue); 305669ce246a8a61b7a97837f4d9ea9b30ee5f4e1bfJack Palevich return 0; 306fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich } 307b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams 30882c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich checkEglError("EGLUtils::selectConfigForNativeWindow"); 30982c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich 31082c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich printf("Chose this configuration:\n"); 31182c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich printEGLConfiguration(dpy, myConfig); 31282c78b83e3950a26d51da33ffb91bc808ce036f6Jack Palevich 31366d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); 314953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("eglCreateWindowSurface"); 315953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (surface == EGL_NO_SURFACE) { 316953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printf("gelCreateWindowSurface failed.\n"); 317953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 318953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 319953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 32066d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, context_attribs); 321953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("eglCreateContext"); 322953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if (context == EGL_NO_CONTEXT) { 323fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich printf("eglCreateContext failed\n"); 324fc342cbbf71e29ed52996dee059655c83b95ab68Jack Palevich return 0; 325953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 32666d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich returnValue = eglMakeCurrent(dpy, surface, surface, context); 32766d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich checkEglError("eglMakeCurrent", returnValue); 32866d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich if (returnValue != EGL_TRUE) { 32966d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich return 0; 33066d2e25ae39307325c616a8f95d9594d4d295566Jack Palevich } 331953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 332953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("eglQuerySurface"); 333953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 334953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich checkEglError("eglQuerySurface"); 335953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich GLint dim = w < h ? w : h; 336953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 337953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 338953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 339953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printGLString("Version", GL_VERSION); 340953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printGLString("Vendor", GL_VENDOR); 341953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printGLString("Renderer", GL_RENDERER); 342953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich printGLString("Extensions", GL_EXTENSIONS); 343953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 344953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich if(!setupGraphics(w, h)) { 345953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich fprintf(stderr, "Could not set up graphics.\n"); 346953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 347953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 348953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 349953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich for (;;) { 350953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich renderFrame(); 351953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich eglSwapBuffers(dpy, surface); 352a8fecb87c5eaaefc9ca6272e3b59ef88d293dd6dJack Palevich checkEglError("eglSwapBuffers"); 353953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich } 354953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich 355953254b2f2c420d865b132b09bc682458b3e32ddJack Palevich return 0; 356b22f5b3bb356ac747e8cd6c2f1c4e6f4a8539eebJason Sams} 357