gl2_basic.cpp revision d9872bf424ad327861ab98390319566b25571f76
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 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 17818e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich#if 0 17918e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich 18018e24f952506beebe1eea5672a7dbf60c1040556Jack Palevichvoid PrintEGLConfig(EGLDisplay dpy, EGLConfig config) { 181d9872bf424ad327861ab98390319566b25571f76Jack Palevich int attrib[] = {EGL_RED_SIZE, EGL_GREEN_SIZE, EGL_BLUE_SIZE, EGL_ALPHA_SIZE, 182d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGL_DEPTH_SIZE, EGL_SURFACE_TYPE, EGL_RENDERABLE_TYPE 183d9872bf424ad327861ab98390319566b25571f76Jack Palevich }; 184d9872bf424ad327861ab98390319566b25571f76Jack Palevich for(size_t i = 0; i < sizeof(attrib)/sizeof(attrib[0]); i++) { 18518e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich int value = 0; 18618e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich int a = attrib[i]; 18718e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich if (eglGetConfigAttrib(dpy, config, a, &value)) { 18818e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich printf(" 0x%04x: %d", a, value); 18918e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich } 190d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 191d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("\n"); 19218e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich} 19318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich 19418e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich#endif 19518e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich 196d9872bf424ad327861ab98390319566b25571f76Jack Palevichint printEGLConfigurations(EGLDisplay dpy) { 197d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLint numConfig = 0; 198d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLint returnVal = eglGetConfigs(dpy, NULL, 0, &numConfig); 199d9872bf424ad327861ab98390319566b25571f76Jack Palevich checkEglError("eglGetConfigs", returnVal); 200d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (!returnVal) { 201d9872bf424ad327861ab98390319566b25571f76Jack Palevich return false; 202d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 203d9872bf424ad327861ab98390319566b25571f76Jack Palevich 204d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("Number of EGL configuration: %d\n", numConfig); 205d9872bf424ad327861ab98390319566b25571f76Jack Palevich 206d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLConfig* configs = (EGLConfig*) malloc(sizeof(EGLConfig) * numConfig); 207d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (! configs) { 208d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("Could not allocate configs.\n"); 209d9872bf424ad327861ab98390319566b25571f76Jack Palevich return false; 210d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 211d9872bf424ad327861ab98390319566b25571f76Jack Palevich 212d9872bf424ad327861ab98390319566b25571f76Jack Palevich returnVal = eglGetConfigs(dpy, NULL, 0, &numConfig); 213d9872bf424ad327861ab98390319566b25571f76Jack Palevich checkEglError("eglGetConfigs", returnVal); 214d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (!returnVal) { 215d9872bf424ad327861ab98390319566b25571f76Jack Palevich free(configs); 216d9872bf424ad327861ab98390319566b25571f76Jack Palevich return false; 217d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 218d9872bf424ad327861ab98390319566b25571f76Jack Palevich 219d9872bf424ad327861ab98390319566b25571f76Jack Palevich#define X(VAL) {VAL, #VAL} 220d9872bf424ad327861ab98390319566b25571f76Jack Palevich struct {EGLint attribute; const char* name;} names[] = { 221d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_BUFFER_SIZE), 222d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_RED_SIZE), 223d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_GREEN_SIZE), 224d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_BLUE_SIZE), 225d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_ALPHA_SIZE), 226d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_CONFIG_CAVEAT), 227d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_CONFIG_ID), 228d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_DEPTH_SIZE), 229d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_LEVEL), 230d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_MAX_PBUFFER_WIDTH), 231d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_MAX_PBUFFER_HEIGHT), 232d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_MAX_PBUFFER_PIXELS), 233d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_NATIVE_RENDERABLE), 234d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_NATIVE_VISUAL_ID), 235d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_NATIVE_VISUAL_TYPE), 236d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_PRESERVED_RESOURCES), 237d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_SAMPLE_BUFFERS), 238d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_SAMPLES), 239d9872bf424ad327861ab98390319566b25571f76Jack Palevich // X(EGL_STENCIL_BITS), 240d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_SURFACE_TYPE), 241d9872bf424ad327861ab98390319566b25571f76Jack Palevich X(EGL_TRANSPARENT_TYPE), 242d9872bf424ad327861ab98390319566b25571f76Jack Palevich // X(EGL_TRANSPARENT_RED), 243d9872bf424ad327861ab98390319566b25571f76Jack Palevich // X(EGL_TRANSPARENT_GREEN), 244d9872bf424ad327861ab98390319566b25571f76Jack Palevich // X(EGL_TRANSPARENT_BLUE) 245d9872bf424ad327861ab98390319566b25571f76Jack Palevich }; 246d9872bf424ad327861ab98390319566b25571f76Jack Palevich#undef X 247d9872bf424ad327861ab98390319566b25571f76Jack Palevich 248d9872bf424ad327861ab98390319566b25571f76Jack Palevich for(int i = 0; i < numConfig; i++) { 249d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("Configuration %d\n", i); 250d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLConfig config = configs[i]; 251d9872bf424ad327861ab98390319566b25571f76Jack Palevich for (int j = 0; j < sizeof(names) / sizeof(names[0]); j++) { 252d9872bf424ad327861ab98390319566b25571f76Jack Palevich EGLint value = -1; 253d9872bf424ad327861ab98390319566b25571f76Jack Palevich returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); 254d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (returnVal) { 255d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf(" %s: %d (0x%x)", names[j].name, value, value); 256d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 257d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 258d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("\n"); 259d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 260d9872bf424ad327861ab98390319566b25571f76Jack Palevich 261d9872bf424ad327861ab98390319566b25571f76Jack Palevich free(configs); 262d9872bf424ad327861ab98390319566b25571f76Jack Palevich return true; 263d9872bf424ad327861ab98390319566b25571f76Jack Palevich} 264d9872bf424ad327861ab98390319566b25571f76Jack Palevich 2659ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevichint main(int argc, char** argv) { 266058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich EGLBoolean returnValue; 26718e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGLConfig myConfig = {0}; 268058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich 2699ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 27018e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGLint s_configAttribs[] = { 27118e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGL_SURFACE_TYPE, EGL_PBUFFER_BIT|EGL_WINDOW_BIT, 27218e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 27318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGL_NONE }; 2749ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint majorVersion; 2759ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint minorVersion; 2769ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLContext context; 2779ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLSurface surface; 2789ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLint w, h; 2799ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2809ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich EGLDisplay dpy; 2819ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2829ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("<init>"); 2839ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 2849ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglGetDisplay"); 2859ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (dpy == EGL_NO_DISPLAY) { 2869ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 2879ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2889ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2899ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 2909ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 2919ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglInitialize", returnValue); 2929ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 2939ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (returnValue != EGL_TRUE) { 2949ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("eglInitialize failed\n"); 2959ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 2969ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 2979ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 298d9872bf424ad327861ab98390319566b25571f76Jack Palevich if (!printEGLConfigurations(dpy)) { 299d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("printEGLConfigurations failed\n"); 300d9872bf424ad327861ab98390319566b25571f76Jack Palevich return 0; 301d9872bf424ad327861ab98390319566b25571f76Jack Palevich } 302d9872bf424ad327861ab98390319566b25571f76Jack Palevich 30318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich EGLNativeWindowType window = android_createDisplaySurface(); 30418e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich returnValue = EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &myConfig); 30518e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich if (returnValue) { 306d9872bf424ad327861ab98390319566b25571f76Jack Palevich printf("EGLUtils::selectConfigForNativeWindow() returned %d", returnValue); 307d9872bf424ad327861ab98390319566b25571f76Jack Palevich return 0; 308058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich } 309493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 31018e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); 3119ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglCreateWindowSurface"); 3129ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (surface == EGL_NO_SURFACE) { 3139ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printf("gelCreateWindowSurface failed.\n"); 3149ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 3159ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 3169ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 31718e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, context_attribs); 3189ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglCreateContext"); 3199ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if (context == EGL_NO_CONTEXT) { 320058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich printf("eglCreateContext failed\n"); 321058777592dc784034cc19f6d358fe5ca4225d81dJack Palevich return 0; 3229ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 32318e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich returnValue = eglMakeCurrent(dpy, surface, surface, context); 32418e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich checkEglError("eglMakeCurrent", returnValue); 32518e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich if (returnValue != EGL_TRUE) { 32618e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich return 0; 32718e24f952506beebe1eea5672a7dbf60c1040556Jack Palevich } 3289ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 3299ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglQuerySurface"); 3309ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 3319ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich checkEglError("eglQuerySurface"); 3329ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich GLint dim = w < h ? w : h; 3339ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3349ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 3359ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3369ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Version", GL_VERSION); 3379ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Vendor", GL_VENDOR); 3389ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Renderer", GL_RENDERER); 3399ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich printGLString("Extensions", GL_EXTENSIONS); 3409ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3419ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich if(!setupGraphics(w, h)) { 3429ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich fprintf(stderr, "Could not set up graphics.\n"); 3439ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 3449ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 3459ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3469ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich for (;;) { 3479ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich renderFrame(); 3489ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich eglSwapBuffers(dpy, surface); 349919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich checkEglError("eglSwapBuffers"); 3509ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich } 3519ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich 3529ec24af0e8fa1005e8b37073a27590d8f42149ceJack Palevich return 0; 353493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 354