gl2_basic.cpp revision 9ec24af0e8fa1005e8b37073a27590d8f42149ce
1493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams/* 2493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * Copyright (C) 2007 The Android Open Source Project 3493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * 4493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * you may not use this file except in compliance with the License. 6493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * You may obtain a copy of the License at 7493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * 8493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * 10493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * Unless required by applicable law or agreed to in writing, software 11493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * See the License for the specific language governing permissions and 14493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams * limitations under the License. 15493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams */ 16493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 17493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <stdlib.h> 18493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <stdio.h> 19493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <time.h> 20493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <sched.h> 21493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <sys/resource.h> 22493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 23493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <EGL/egl.h> 249ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich#include <GLES2/gl2.h> 259ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich#include <GLES2/gl2ext.h> 26493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 27493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <utils/Timers.h> 28493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 29493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <ui/FramebufferNativeWindow.h> 30493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <ui/EGLUtils.h> 31493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 32493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Samsusing namespace android; 33493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 349ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic void printGLString(const char *name, GLenum s) { 359ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // fprintf(stderr, "printGLString %s, %d\n", name, s); 369ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich const char *v = (const char *) glGetString(s); 379ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // int error = glGetError(); 389ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // fprintf(stderr, "glGetError() = %d, result of glGetString = %x\n", error, 399ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // (unsigned int) v); 409ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // if ((v < (const char*) 0) || (v > (const char*) 0x10000)) 419ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // fprintf(stderr, "GL %s = %s\n", name, v); 429ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // else 439ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich // fprintf(stderr, "GL %s = (null) 0x%08x\n", name, (unsigned int) v); 449ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "GL %s = %s\n", name, v); 4513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich} 4613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich 4713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevichstatic const char* eglErrorToString[] = { 489ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_SUCCESS", // 0x3000 12288 499ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_NOT_INITIALIZED", 509ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_ACCESS", // 0x3002 12290 519ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_ALLOC", "EGL_BAD_ATTRIBUTE", 529ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_CONFIG", 539ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_CONTEXT", // 0x3006 12294 549ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_CURRENT_SURFACE", "EGL_BAD_DISPLAY", "EGL_BAD_MATCH", 559ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_NATIVE_PIXMAP", "EGL_BAD_NATIVE_WINDOW", "EGL_BAD_PARAMETER", // 0x300c 12300 569ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "EGL_BAD_SURFACE" }; 5713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich 58058777592dc784034cc19f6d358fe5ca4225d81dJack Palevichstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { 59058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich if (returnVal != EGL_TRUE) { 60058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich fprintf(stderr, "%s() returned %d\n", op, returnVal); 61058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich } 62058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich 639ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 649ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich = eglGetError()) { 6513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich const char* errorString = "unknown"; 6613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich if (error >= EGL_SUCCESS && error <= EGL_BAD_SURFACE) { 6713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich errorString = eglErrorToString[error - EGL_SUCCESS]; 6813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich } 699ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, errorString, 709ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich error); 719ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 729ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 739ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic void checkGlError(const char* op) { 759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (GLint error = glGetError(); error; error 769ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich = glGetError()) { 779ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "after %s() glError (0x%x)\n", op, error); 789ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 799ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 809ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 819ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic const char gVertexShader[] = "attribute vec4 vPosition;\n" 829ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "void main() {\n" 839ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich " gl_Position = vPosition;\n" 849ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "}\n"; 859ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 869ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic const char gFragmentShader[] = "precision mediump float;\n" 879ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "void main() {\n" 889ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" 899ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "}\n"; 909ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 919ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint loadShader(GLenum shaderType, const char* pSource) { 929ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint shader = glCreateShader(shaderType); 939ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (shader) { 949ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glShaderSource(shader, 1, &pSource, NULL); 959ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glCompileShader(shader); 969ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint compiled = 0; 979ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 989ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!compiled) { 999ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint infoLen = 0; 1009ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); 1019ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (infoLen) { 1029ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich char* buf = (char*) malloc(infoLen); 1039ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (buf) { 1049ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetShaderInfoLog(shader, infoLen, NULL, buf); 1059ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not compile shader %d:\n%s\n", 1069ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich shaderType, buf); 1079ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich free(buf); 1089ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1099ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glDeleteShader(shader); 1109ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich shader = 0; 1119ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1129ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1139ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1149ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return shader; 1159ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 1169ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1179ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) { 1189ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource); 1199ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!vertexShader) { 1209ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 1219ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1229ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1239ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource); 1249ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!pixelShader) { 1259ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 1269ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1279ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1289ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint program = glCreateProgram(); 1299ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (program) { 1309ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glAttachShader(program, vertexShader); 1319ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glAttachShader"); 1329ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glAttachShader(program, pixelShader); 1339ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glAttachShader"); 1349ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glLinkProgram(program); 1359ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint linkStatus = GL_FALSE; 1369ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); 1379ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (linkStatus != GL_TRUE) { 1389ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint bufLength = 0; 1399ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); 1409ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (bufLength) { 1419ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich char* buf = (char*) malloc(bufLength); 1429ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (buf) { 1439ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetProgramInfoLog(program, bufLength, NULL, buf); 1449ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not link program:\n%s\n", buf); 1459ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich free(buf); 1469ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1479ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1489ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glDeleteProgram(program); 1499ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich program = 0; 1509ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1519ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1529ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return program; 1539ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 1549ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1559ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint gProgram; 1569ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint gvPositionHandle; 1579ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1589ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichbool setupGraphics(int w, int h) { 1599ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich gProgram = createProgram(gVertexShader, gFragmentShader); 1609ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!gProgram) { 1619ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return false; 16213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich } 1639ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich gvPositionHandle = glGetAttribLocation(gProgram, "vPosition"); 1649ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glGetAttribLocation"); 1659ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "glGetAttribLocation(\"vPosition\") = %d\n", 1669ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich gvPositionHandle); 1679ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1689ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glViewport(0, 0, w, h); 1699ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glViewport"); 1709ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return true; 1719ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 1729ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1739ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichconst GLfloat gTriangleVertices[] = { 0.0f, 0.5f, -0.5f, -0.5f, 1749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 0.5f, -0.5f }; 1759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1769ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichvoid renderFrame() { 1779ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 1789ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glClearColor"); 1799ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 1809ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glClear"); 1819ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1829ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glUseProgram(gProgram); 1839ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glUseProgram"); 1849ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1859ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices); 1869ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glVertexAttribPointer"); 1879ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glEnableVertexAttribArray(gvPositionHandle); 1889ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glEnableVertexAttribArray"); 1899ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glDrawArrays(GL_TRIANGLES, 0, 3); 1909ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glDrawArrays"); 191493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 192493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 1939ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichint main(int argc, char** argv) { 194058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich EGLBoolean returnValue; 195058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich EGLConfig configs[2]; 196058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich EGLint config_count; 197058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich 1989ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 1999ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint s_configAttribs[] = { EGL_BUFFER_SIZE, EGL_DONT_CARE, EGL_RED_SIZE, 2009ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 5, EGL_GREEN_SIZE, 6, EGL_BLUE_SIZE, 5, EGL_DEPTH_SIZE, 8, 2019ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE }; 2029ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2039ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint s_configAttribs2[] = 2049ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich { 2059ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGL_DEPTH_SIZE, 16, 2069ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGL_NONE 2079ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich }; 2089ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2099ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint majorVersion; 2109ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint minorVersion; 2119ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLContext context; 2129ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLSurface surface; 2139ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint w, h; 2149ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2159ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLDisplay dpy; 2169ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2179ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLNativeWindowType window = 0; 2189ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich window = android_createDisplaySurface(); 2199ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2209ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("<init>"); 2219ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 2229ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglGetDisplay"); 2239ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (dpy == EGL_NO_DISPLAY) { 2249ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 2259ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2269ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2279ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2289ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 2299ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglInitialize", returnValue); 2309ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 2319ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (returnValue != EGL_TRUE) { 2329ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("eglInitialize failed\n"); 2339ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2349ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2359ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2369ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich returnValue = eglGetConfigs(dpy, configs, 2, &config_count); 2379ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglGetConfigs", returnValue); 2389ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Config count: %d\n", config_count); 2399ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (int i = 0; i < config_count; i++) { 240058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich fprintf(stderr, "%d: 0x%08x\n", i, (unsigned int) configs[i]); 2419ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2429ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 243058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich#if 0 2449ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLConfig config; 2459ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &config); 2469ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("EGLUtils::selectConfigForNativeWindow"); 247058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich#else 2489ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich int chooseConfigResult = eglChooseConfig(dpy, s_configAttribs2, configs, 2, 2499ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich &config_count); 250058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich checkEglError("eglChooseConfig", chooseConfigResult); 2519ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (chooseConfigResult != EGL_TRUE) { 252058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich printf("eglChooseConfig failed\n"); 2539ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 254058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich } 255058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich#endif 256493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 2579ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich surface = eglCreateWindowSurface(dpy, configs[0], window, NULL); 2589ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglCreateWindowSurface"); 2599ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (surface == EGL_NO_SURFACE) { 2609ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("gelCreateWindowSurface failed.\n"); 2619ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2629ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2639ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint gl2_0Attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 2649ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2659ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich context = eglCreateContext(dpy, configs[0], EGL_NO_CONTEXT, context_attribs); 2669ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglCreateContext"); 2679ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (context == EGL_NO_CONTEXT) { 268058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich printf("eglCreateContext failed\n"); 269058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich return 0; 2709ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2719ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglMakeCurrent(dpy, surface, surface, context); 2729ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglMakeCurrent"); 2739ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 2749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglQuerySurface"); 2759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 2769ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglQuerySurface"); 2779ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint dim = w < h ? w : h; 2789ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2799ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 2809ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2819ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Version", GL_VERSION); 2829ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Vendor", GL_VENDOR); 2839ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Renderer", GL_RENDERER); 2849ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Extensions", GL_EXTENSIONS); 2859ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2869ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if(!setupGraphics(w, h)) { 2879ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not set up graphics.\n"); 2889ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2899ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2909ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2919ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (;;) { 2929ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich renderFrame(); 2939ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglSwapBuffers(dpy, surface); 2949ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2959ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2969ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 297493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 298