1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* San Angeles Observation OpenGL ES version example 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright 2004-2005 Jetro Lauha 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * All rights reserved. 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Web: http://iki.fi/jetro/ 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This source is free software; you can redistribute it and/or 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * modify it under the terms of EITHER: 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (1) The GNU Lesser General Public License as published by the Free 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Software Foundation; either version 2.1 of the License, or (at 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * your option) any later version. The text of the GNU Lesser 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * General Public License is included with this source in the 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * file LICENSE-LGPL.txt. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (2) The BSD-style license that is included with this source in 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the file LICENSE-BSD.txt. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This source is distributed in the hope that it will be useful, 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details. 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * $Id: app-linux.c,v 1.4 2005/02/08 18:42:48 tonic Exp $ 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * $Revision: 1.4 $ 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Parts of this source file is based on test/example code from 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * GLESonGL implementation by David Blythe. Here is copy of the 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * license notice from that source: 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2003 David Blythe All Rights Reserved. 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * copy of this software and associated documentation files (the "Software"), 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * to deal in the Software without restriction, including without limitation 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the rights to use, copy, modify, merge, publish, distribute, sublicense, 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * and/or sell copies of the Software, and to permit persons to whom the 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Software is furnished to do so, subject to the following conditions: 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * The above copyright notice and this permission notice shall be included 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * in all copies or substantial portions of the Software. 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * DAVID BLYTHE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/time.h> 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 556ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <EGLUtils.h> 566ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <WindowSurface.h> 57653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian 58653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopianusing namespace android; 59653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "app.h" 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint gAppAlive = 1; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const char sAppName[] = 66829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian "San Angeles Observation OpenGL ES version example (Linux)"; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int sWindowWidth = WINDOW_DEFAULT_WIDTH; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int sWindowHeight = WINDOW_DEFAULT_HEIGHT; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLDisplay sEglDisplay = EGL_NO_DISPLAY; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLContext sEglContext = EGL_NO_CONTEXT; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface sEglSurface = EGL_NO_SURFACE; 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char *egl_strerror(unsigned err) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(err){ 77829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_SUCCESS: return "SUCCESS"; 78829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_NOT_INITIALIZED: return "NOT INITIALIZED"; 79829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_ACCESS: return "BAD ACCESS"; 80829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_ALLOC: return "BAD ALLOC"; 81829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_ATTRIBUTE: return "BAD_ATTRIBUTE"; 82829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_CONFIG: return "BAD CONFIG"; 83829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_CONTEXT: return "BAD CONTEXT"; 84829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_CURRENT_SURFACE: return "BAD CURRENT SURFACE"; 85829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_DISPLAY: return "BAD DISPLAY"; 86829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_MATCH: return "BAD MATCH"; 87829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_NATIVE_PIXMAP: return "BAD NATIVE PIXMAP"; 88829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_NATIVE_WINDOW: return "BAD NATIVE WINDOW"; 89829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_PARAMETER: return "BAD PARAMETER"; 90829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian case EGL_BAD_SURFACE: return "BAD_SURFACE"; 91829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian // case EGL_CONTEXT_LOST: return "CONTEXT LOST"; 92829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian default: return "UNKNOWN"; 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid egl_error(const char *name) 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project unsigned err = eglGetError(); 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if(err != EGL_SUCCESS) { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fprintf(stderr,"%s(): egl error 0x%x (%s)\n", 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name, err, egl_strerror(err)); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void checkGLErrors() 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum error = glGetError(); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (error != GL_NO_ERROR) 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fprintf(stderr, "GL Error: 0x%04x\n", (int)error); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void checkEGLErrors() 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint error = eglGetError(); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLESonGL seems to be returning 0 when there is no errors? 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (error && error != EGL_SUCCESS) 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fprintf(stderr, "EGL Error: 0x%04x\n", (int)error); 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1216ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFaddenstatic int initGraphics(unsigned samples, const WindowSurface& windowSurface) 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian EGLint configAttribs[] = { 124829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGL_DEPTH_SIZE, 16, 125829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGL_SAMPLE_BUFFERS, samples ? 1 : 0, 126829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGL_SAMPLES, samples, 127829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGL_NONE 128829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian }; 129829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 130829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLint majorVersion; 131829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLint minorVersion; 132829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLContext context; 133829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLConfig config; 134829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLSurface surface; 135829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLint w, h; 136829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian EGLDisplay dpy; 137829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 1386ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden EGLNativeWindowType window = windowSurface.getSurface(); 139829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 140829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 141829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian eglInitialize(dpy, &majorVersion, &minorVersion); 142829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 143829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian status_t err = EGLUtils::selectConfigForNativeWindow( 144829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian dpy, configAttribs, window, &config); 145829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian if (err) { 146829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian fprintf(stderr, "couldn't find an EGLConfig matching the screen format\n"); 147829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian return 0; 148829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian } 149829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 150829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian surface = eglCreateWindowSurface(dpy, config, window, NULL); 151829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian egl_error("eglCreateWindowSurface"); 152829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 153829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian fprintf(stderr,"surface = %p\n", surface); 154829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 155829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian context = eglCreateContext(dpy, config, NULL, NULL); 156829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian egl_error("eglCreateContext"); 157829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian fprintf(stderr,"context = %p\n", context); 158829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 159829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian eglMakeCurrent(dpy, surface, surface, context); 160829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian egl_error("eglMakeCurrent"); 161829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 162829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian eglQuerySurface(dpy, surface, EGL_WIDTH, &sWindowWidth); 163829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian eglQuerySurface(dpy, surface, EGL_HEIGHT, &sWindowHeight); 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sEglDisplay = dpy; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sEglSurface = surface; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sEglContext = context; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 169829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian if (samples == 0) { 170829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian // GL_MULTISAMPLE is enabled by default 171829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian glDisable(GL_MULTISAMPLE); 172829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian } 173829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void deinitGraphics() 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(sEglDisplay, NULL, NULL, NULL); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDestroyContext(sEglDisplay, sEglContext); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDestroySurface(sEglDisplay, sEglSurface); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglTerminate(sEglDisplay); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint main(int argc, char *argv[]) 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 189829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian unsigned samples = 0; 190829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian printf("usage: %s [samples]\n", argv[0]); 191829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian if (argc == 2) { 192829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian samples = atoi( argv[1] ); 193829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian printf("Multisample enabled: GL_SAMPLES = %u\n", samples); 194829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian } 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1966ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden WindowSurface windowSurface; 1976ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if (!initGraphics(samples, windowSurface)) 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fprintf(stderr, "Graphics initialization failed.\n"); 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EXIT_FAILURE; 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project appInit(); 204879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian 205879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian struct timeval timeTemp; 206879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian int frameCount = 0; 207879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian gettimeofday(&timeTemp, NULL); 208879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian double totalTime = timeTemp.tv_usec/1000000.0 + timeTemp.tv_sec; 209829622113873392b01b37ee72effbeb6b5966dbfMathias Agopian 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (gAppAlive) 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct timeval timeNow; 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 214879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian gettimeofday(&timeNow, NULL); 215879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian appRender(timeNow.tv_sec * 1000 + timeNow.tv_usec / 1000, 216879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian sWindowWidth, sWindowHeight); 217879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian checkGLErrors(); 218879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian eglSwapBuffers(sEglDisplay, sEglSurface); 219879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian checkEGLErrors(); 220879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian frameCount++; 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 223879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian gettimeofday(&timeTemp, NULL); 224879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project appDeinit(); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project deinitGraphics(); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian totalTime = (timeTemp.tv_usec/1000000.0 + timeTemp.tv_sec) - totalTime; 229879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian printf("totalTime=%f s, frameCount=%d, %.2f fps\n", 230879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian totalTime, frameCount, frameCount/totalTime); 231879ba138fc8cc4a88d355322a67eaa26f1d57682Mathias Agopian 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EXIT_SUCCESS; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 234