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> 30870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include "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 47058777592dc784034cc19f6d358fe5ca4225d81dJack Palevichstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { 48058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich if (returnVal != EGL_TRUE) { 49058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich fprintf(stderr, "%s() returned %d\n", op, returnVal); 50058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich } 51058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich 529ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 539ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich = eglGetError()) { 5418e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error), 559ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich error); 569ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 579ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 589ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 599ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic void checkGlError(const char* op) { 609ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (GLint error = glGetError(); error; error 619ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich = glGetError()) { 629ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "after %s() glError (0x%x)\n", op, error); 639ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 649ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 659ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 669ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic const char gVertexShader[] = "attribute vec4 vPosition;\n" 679ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "void main() {\n" 689ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich " gl_Position = vPosition;\n" 699ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "}\n"; 709ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 719ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichstatic const char gFragmentShader[] = "precision mediump float;\n" 729ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "void main() {\n" 739ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" 749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich "}\n"; 759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 769ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint loadShader(GLenum shaderType, const char* pSource) { 779ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint shader = glCreateShader(shaderType); 789ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (shader) { 799ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glShaderSource(shader, 1, &pSource, NULL); 809ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glCompileShader(shader); 819ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint compiled = 0; 829ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 839ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!compiled) { 849ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint infoLen = 0; 859ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); 869ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (infoLen) { 879ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich char* buf = (char*) malloc(infoLen); 889ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (buf) { 899ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetShaderInfoLog(shader, infoLen, NULL, buf); 909ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not compile shader %d:\n%s\n", 919ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich shaderType, buf); 929ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich free(buf); 939ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 949ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glDeleteShader(shader); 959ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich shader = 0; 969ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 979ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 989ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 999ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return shader; 1009ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 1019ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1029ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) { 1039ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource); 1049ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!vertexShader) { 1059ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 1069ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1079ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1089ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource); 1099ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!pixelShader) { 1109ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 1119ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1129ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1139ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLuint program = glCreateProgram(); 1149ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (program) { 1159ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glAttachShader(program, vertexShader); 1169ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glAttachShader"); 1179ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glAttachShader(program, pixelShader); 1189ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glAttachShader"); 1199ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glLinkProgram(program); 1209ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint linkStatus = GL_FALSE; 1219ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); 1229ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (linkStatus != GL_TRUE) { 1239ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint bufLength = 0; 1249ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); 1259ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (bufLength) { 1269ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich char* buf = (char*) malloc(bufLength); 1279ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (buf) { 1289ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glGetProgramInfoLog(program, bufLength, NULL, buf); 1299ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not link program:\n%s\n", buf); 1309ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich free(buf); 1319ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1329ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1339ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glDeleteProgram(program); 1349ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich program = 0; 1359ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1369ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 1379ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return program; 1389ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 1399ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1409ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint gProgram; 1419ec24af0e8fa1005e8b37073a27590d8f42149ceJack PalevichGLuint gvPositionHandle; 1429ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1439ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichbool setupGraphics(int w, int h) { 1449ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich gProgram = createProgram(gVertexShader, gFragmentShader); 1459ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (!gProgram) { 1469ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return false; 14713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich } 1489ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich gvPositionHandle = glGetAttribLocation(gProgram, "vPosition"); 1499ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glGetAttribLocation"); 1509ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "glGetAttribLocation(\"vPosition\") = %d\n", 1519ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich gvPositionHandle); 1529ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1539ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glViewport(0, 0, w, h); 1549ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glViewport"); 1559ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return true; 1569ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich} 1579ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1589ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichconst GLfloat gTriangleVertices[] = { 0.0f, 0.5f, -0.5f, -0.5f, 1599ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 0.5f, -0.5f }; 1609ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1619ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichvoid renderFrame() { 1629ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 1639ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glClearColor"); 1649ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 1659ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glClear"); 1669ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1679ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glUseProgram(gProgram); 1689ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glUseProgram"); 1699ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 1709ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices); 1719ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glVertexAttribPointer"); 1729ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glEnableVertexAttribArray(gvPositionHandle); 1739ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glEnableVertexAttribArray"); 1749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich glDrawArrays(GL_TRIANGLES, 0, 3); 1759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkGlError("glDrawArrays"); 176493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 177493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 17834329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevichvoid printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { 17934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich 18034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich#define X(VAL) {VAL, #VAL} 18134329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich struct {EGLint attribute; const char* name;} names[] = { 18234329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_BUFFER_SIZE), 18334329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_ALPHA_SIZE), 18434329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_BLUE_SIZE), 18534329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_GREEN_SIZE), 18634329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_RED_SIZE), 18734329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_DEPTH_SIZE), 18834329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_STENCIL_SIZE), 18934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_CONFIG_CAVEAT), 19034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_CONFIG_ID), 19134329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_LEVEL), 19234329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_MAX_PBUFFER_HEIGHT), 19334329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_MAX_PBUFFER_PIXELS), 19434329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_MAX_PBUFFER_WIDTH), 19534329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_NATIVE_RENDERABLE), 19634329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_NATIVE_VISUAL_ID), 19734329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_NATIVE_VISUAL_TYPE), 19834329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_SAMPLES), 19934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_SAMPLE_BUFFERS), 20034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_SURFACE_TYPE), 20134329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_TRANSPARENT_TYPE), 20234329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_TRANSPARENT_RED_VALUE), 20334329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_TRANSPARENT_GREEN_VALUE), 20434329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_TRANSPARENT_BLUE_VALUE), 20534329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_BIND_TO_TEXTURE_RGB), 20634329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_BIND_TO_TEXTURE_RGBA), 20734329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_MIN_SWAP_INTERVAL), 20834329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_MAX_SWAP_INTERVAL), 20934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_LUMINANCE_SIZE), 21034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_ALPHA_MASK_SIZE), 21134329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_COLOR_BUFFER_TYPE), 21234329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_RENDERABLE_TYPE), 21334329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich X(EGL_CONFORMANT), 21434329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich }; 21534329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich#undef X 21634329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich 21734329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { 21834329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich EGLint value = -1; 21934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich EGLint returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); 22034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich EGLint error = eglGetError(); 22134329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich if (returnVal && error == EGL_SUCCESS) { 22234329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich printf(" %s: ", names[j].name); 22334329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich printf("%d (0x%x)", value, value); 22418e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich } 225d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 226d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("\n"); 22718e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich} 22818e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich 229d9872bf424ad327861ab98390319566b25571f76Jack Palevichint printEGLConfigurations(EGLDisplay dpy) { 230d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLint numConfig = 0; 231d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLint returnVal = eglGetConfigs(dpy, NULL, 0, &numConfig); 232d9872bf424ad327861ab98390319566b25571f76Jack Palevich checkEglError("eglGetConfigs", returnVal); 233d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (!returnVal) { 234d9872bf424ad327861ab98390319566b25571f76Jack Palevich return false; 235d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 236d9872bf424ad327861ab98390319566b25571f76Jack Palevich 237d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("Number of EGL configuration: %d\n", numConfig); 238d9872bf424ad327861ab98390319566b25571f76Jack Palevich 239d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLConfig* configs = (EGLConfig*) malloc(sizeof(EGLConfig) * numConfig); 240d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (! configs) { 241d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("Could not allocate configs.\n"); 242d9872bf424ad327861ab98390319566b25571f76Jack Palevich return false; 243d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 244d9872bf424ad327861ab98390319566b25571f76Jack Palevich 24534329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich returnVal = eglGetConfigs(dpy, configs, numConfig, &numConfig); 246d9872bf424ad327861ab98390319566b25571f76Jack Palevich checkEglError("eglGetConfigs", returnVal); 247d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (!returnVal) { 248d9872bf424ad327861ab98390319566b25571f76Jack Palevich free(configs); 249d9872bf424ad327861ab98390319566b25571f76Jack Palevich return false; 250d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 251d9872bf424ad327861ab98390319566b25571f76Jack Palevich 252d9872bf424ad327861ab98390319566b25571f76Jack Palevich for(int i = 0; i < numConfig; i++) { 253d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("Configuration %d\n", i); 25434329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich printEGLConfiguration(dpy, configs[i]); 255d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 256d9872bf424ad327861ab98390319566b25571f76Jack Palevich 257d9872bf424ad327861ab98390319566b25571f76Jack Palevich free(configs); 258d9872bf424ad327861ab98390319566b25571f76Jack Palevich return true; 259d9872bf424ad327861ab98390319566b25571f76Jack Palevich} 260d9872bf424ad327861ab98390319566b25571f76Jack Palevich 2619ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichint main(int argc, char** argv) { 262058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich EGLBoolean returnValue; 26318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGLConfig myConfig = {0}; 264058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich 2659ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 26618e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGLint s_configAttribs[] = { 26734329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 26818e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 26918e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGL_NONE }; 2709ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint majorVersion; 2719ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint minorVersion; 2729ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLContext context; 2739ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLSurface surface; 2749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint w, h; 2759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2769ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLDisplay dpy; 2779ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2789ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("<init>"); 2799ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 2809ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglGetDisplay"); 2819ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (dpy == EGL_NO_DISPLAY) { 2829ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 2839ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2849ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2859ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2869ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 2879ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglInitialize", returnValue); 2889ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 2899ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (returnValue != EGL_TRUE) { 2909ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("eglInitialize failed\n"); 2919ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2929ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2939ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 294d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (!printEGLConfigurations(dpy)) { 295d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("printEGLConfigurations failed\n"); 296d9872bf424ad327861ab98390319566b25571f76Jack Palevich return 0; 297d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 298d9872bf424ad327861ab98390319566b25571f76Jack Palevich 29934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich checkEglError("printEGLConfigurations"); 30034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich 30118e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGLNativeWindowType window = android_createDisplaySurface(); 30218e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich returnValue = EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &myConfig); 30318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich if (returnValue) { 304d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("EGLUtils::selectConfigForNativeWindow() returned %d", returnValue); 305d9872bf424ad327861ab98390319566b25571f76Jack Palevich return 0; 306058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich } 307493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 30834329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich checkEglError("EGLUtils::selectConfigForNativeWindow"); 30934329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich 31034329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich printf("Chose this configuration:\n"); 31134329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich printEGLConfiguration(dpy, myConfig); 31234329eed2ccc5fa0efe95bb4c87fbe38538978bcJack Palevich 31318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); 3149ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglCreateWindowSurface"); 3159ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (surface == EGL_NO_SURFACE) { 3169ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("gelCreateWindowSurface failed.\n"); 3179ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 3189ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 3199ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 32018e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, context_attribs); 3219ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglCreateContext"); 3229ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (context == EGL_NO_CONTEXT) { 323058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich printf("eglCreateContext failed\n"); 324058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich return 0; 3259ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 32618e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich returnValue = eglMakeCurrent(dpy, surface, surface, context); 32718e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich checkEglError("eglMakeCurrent", returnValue); 32818e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich if (returnValue != EGL_TRUE) { 32918e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich return 0; 33018e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich } 3319ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 3329ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglQuerySurface"); 3339ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 3349ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglQuerySurface"); 3359ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint dim = w < h ? w : h; 3369ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3379ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 3389ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3399ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Version", GL_VERSION); 3409ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Vendor", GL_VENDOR); 3419ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Renderer", GL_RENDERER); 3429ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Extensions", GL_EXTENSIONS); 3439ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3449ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if(!setupGraphics(w, h)) { 3459ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not set up graphics.\n"); 3469ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 3479ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 3489ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3499ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (;;) { 3509ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich renderFrame(); 3519ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglSwapBuffers(dpy, surface); 352919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich checkEglError("eglSwapBuffers"); 3539ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 3549ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3559ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 356493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 357