1e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams/* 2e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * Copyright (C) 2007 The Android Open Source Project 3e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * 4e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * you may not use this file except in compliance with the License. 6e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * You may obtain a copy of the License at 7e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * 8e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * 10e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * Unless required by applicable law or agreed to in writing, software 11e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * See the License for the specific language governing permissions and 14e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams * limitations under the License. 15e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams */ 16e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 17e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <stdlib.h> 18e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <stdio.h> 19e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <time.h> 20e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <sched.h> 21e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <sys/resource.h> 22e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 23e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <EGL/egl.h> 24e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <GLES2/gl2.h> 25e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <GLES2/gl2ext.h> 26e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 27e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <utils/Timers.h> 28e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 29e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams#include <ui/FramebufferNativeWindow.h> 30870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include "EGLUtils.h" 31e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 32e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsusing namespace android; 33e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 34e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 35e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { 36e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (returnVal != EGL_TRUE) { 37e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams fprintf(stderr, "%s() returned %d\n", op, returnVal); 38e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 39e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 40e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 41e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams = eglGetError()) { 42e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error), 43e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams error); 44e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 45e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams} 46e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 47e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsstatic void checkGlError(const char* op) { 48e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams for (GLint error = glGetError(); error; error 49e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams = glGetError()) { 50e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams fprintf(stderr, "after %s() glError (0x%x)\n", op, error); 51e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 52e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams} 53e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 54e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsbool doTest(uint32_t w, uint32_t h); 55e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 56e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsstatic EGLDisplay dpy; 57e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsstatic EGLSurface surface; 58e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 59e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsint main(int argc, char** argv) { 60e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLBoolean returnValue; 61e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLConfig myConfig = {0}; 62e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 63e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 64e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLint s_configAttribs[] = { 65e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 66e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 67e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGL_NONE }; 68e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLint majorVersion; 69e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLint minorVersion; 70e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLContext context; 71e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLint w, h; 72e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 73e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 74e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("<init>"); 75e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 76e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglGetDisplay"); 77e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (dpy == EGL_NO_DISPLAY) { 78e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 79e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 80e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 81e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 82e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 83e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglInitialize", returnValue); 84e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (returnValue != EGL_TRUE) { 85e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams printf("eglInitialize failed\n"); 86e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 87e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 88e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 89e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams EGLNativeWindowType window = android_createDisplaySurface(); 90e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams returnValue = EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &myConfig); 91e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (returnValue) { 92e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams printf("EGLUtils::selectConfigForNativeWindow() returned %d", returnValue); 93e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 94e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 95e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 96e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("EGLUtils::selectConfigForNativeWindow"); 97e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 98e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); 99e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglCreateWindowSurface"); 100e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (surface == EGL_NO_SURFACE) { 101e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams printf("gelCreateWindowSurface failed.\n"); 102e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 103e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 104e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 105e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, context_attribs); 106e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglCreateContext"); 107e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (context == EGL_NO_CONTEXT) { 108e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams printf("eglCreateContext failed\n"); 109e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 110e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 111e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams returnValue = eglMakeCurrent(dpy, surface, surface, context); 112e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglMakeCurrent", returnValue); 113e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams if (returnValue != EGL_TRUE) { 114e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 115e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 116e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 117e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglQuerySurface"); 118e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 119e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglQuerySurface"); 120e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams GLint dim = w < h ? w : h; 121e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 122e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams glViewport(0, 0, w, h); 123e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 124e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams for (;;) { 125e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams doTest(w, h); 126e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams eglSwapBuffers(dpy, surface); 127e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams checkEglError("eglSwapBuffers"); 128e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams } 129e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 130e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams return 0; 131e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams} 132e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 133e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Samsvoid ptSwap() { 134e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams eglSwapBuffers(dpy, surface); 135e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams} 136e448dd1a4f01da5d9d0ab813c2d5939bcba85ccbJason Sams 137