gl2_basic.cpp revision 13e68424fb7d68b4b9a9dd443eb0e87721312834
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> 24493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <GLES/gl.h> 25493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams#include <GLES/glext.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 34493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Samsstatic void printGLString(const char *name, GLenum s) 35493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams{ 3613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "printGLString %s, %d\n", name, s); 37493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams const char *v = (const char *)glGetString(s); 3813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich int error = glGetError(); 3913e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "glGetError() = %d, result of glGetString = %x\n", error, 4013e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich (unsigned int)v); 4113e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich if ((v < (const char*) 0) || (v > (const char*) 0x1000)) 4213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "GL %s = %s\n", name, v); 43493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams else 4413e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "GL %s = (null)\n", name); 4513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich} 4613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich 4713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevichstatic const char* eglErrorToString[] = { 4813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_SUCCESS", // 0x3000 12288 4913e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_NOT_INITIALIZED", 5013e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_ACCESS", // 0x3002 12290 5113e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_ALLOC", 5213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_ATTRIBUTE", 5313e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_CONFIG", 5413e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_CONTEXT", // 0x3006 12294 5513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_CURRENT_SURFACE", 5613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_DISPLAY", 5713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_MATCH", 5813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_NATIVE_PIXMAP", 5913e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_NATIVE_WINDOW", 6013e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_PARAMETER", // 0x300c 12300 6113e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich "EGL_BAD_SURFACE" 6213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich}; 6313e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich 6413e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevichstatic void checkEglError(const char* op) { 6513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich for(EGLint error = eglGetError(); 6613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich error != EGL_SUCCESS; 6713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich error = eglGetError()) { 6813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich const char* errorString = "unknown"; 6913e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich if (error >= EGL_SUCCESS && error <= EGL_BAD_SURFACE) { 7013e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich errorString = eglErrorToString[error - EGL_SUCCESS]; 7113e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich } 7213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "%s() returned eglError %s (0x%x)\n", op, 7313e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich errorString, error); 7413e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich } 75493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 76493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 77493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Samsint main(int argc, char** argv) 78493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams{ 79493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLint s_configAttribs[] = { 80493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 81493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGL_RED_SIZE, 5, 82493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGL_GREEN_SIZE, 6, 83493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGL_BLUE_SIZE, 5, 84493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGL_NONE 85493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams }; 86493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 87493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLint numConfigs = -1; 88493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLint majorVersion; 89493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLint minorVersion; 90493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLConfig config; 91493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLContext context; 92493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLSurface surface; 93493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLint w, h; 94493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 95493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLDisplay dpy; 96493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 97493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLNativeWindowType window = 0; 98493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams window = android_createDisplaySurface(); 99493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 10013e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("<init>"); 101493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 10213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglGetDisplay"); 103493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams eglInitialize(dpy, &majorVersion, &minorVersion); 10413e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglInitialize"); 10513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 106493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &config); 10713e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "Chosen config: 0x%08x\n", (unsigned long) config); 10813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich 10913e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("EGLUtils::selectConfigForNativeWindow"); 110493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams surface = eglCreateWindowSurface(dpy, config, window, NULL); 11113e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglCreateWindowSurface"); 112493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 11313e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich EGLint gl2_0Attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; 114493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 115493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams context = eglCreateContext(dpy, config, NULL, gl2_0Attribs); 11613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglCreateContext"); 117493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams eglMakeCurrent(dpy, surface, surface, context); 11813e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglMakeCurrent"); 119493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 12013e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglQuerySurface"); 121493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 12213e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich checkEglError("eglQuerySurface"); 123493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams GLint dim = w<h ? w : h; 124493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 12513e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 12613e68424fb7d68b4b9a9dd443eb0e87721312834Jack Palevich 127493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams printGLString("Version", GL_VERSION); 128493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams printGLString("Vendor", GL_VENDOR); 129493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams printGLString("Renderer", GL_RENDERER); 130493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams printGLString("Extensions", GL_EXTENSIONS); 131493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams 132493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams return 0; 133493220dcb8d2f5d9633c157b41e1e27c6613b21dJason Sams} 134