tritex.cpp revision bc4a4177a34267ad0d039c8567bb9fe7549bb310
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Calls glDrawElements() the number of times specified by 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ITERATIONS. Should draw a checkerboard on the screen after 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// a few seconds. 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Ported from a Java version by Google. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 9bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich#include <GLES/glext.h> 10bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich 11bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich#include <ui/FramebufferNativeWindow.h> 12bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich#include <ui/EGLUtils.h> 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 17bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich 18bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevichusing namespace android; 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglDisplay; 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglSurface; 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglContext; 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLuint texture; 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define FIXED_ONE 0x10000 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ITERATIONS 50 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint init_gl_surface(void); 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid free_gl_surface(void); 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid init_scene(void); 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid render(int quads); 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid create_texture(void); 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint readTimer(void); 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void gluLookAt(float eyeX, float eyeY, float eyeZ, 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float centerX, float centerY, float centerZ, float upX, float upY, 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float upZ) 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // See the OpenGL GLUT documentation for gluLookAt for a description 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // of the algorithm. We implement it in a straightforward way: 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float fx = centerX - eyeX; 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float fy = centerY - eyeY; 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float fz = centerZ - eyeZ; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Normalize f 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float rlf = 1.0f / sqrtf(fx*fx + fy*fy + fz*fz); 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fx *= rlf; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fy *= rlf; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fz *= rlf; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Normalize up 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float rlup = 1.0f / sqrtf(upX*upX + upY*upY + upZ*upZ); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project upX *= rlup; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project upY *= rlup; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project upZ *= rlup; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // compute s = f x up (x means "cross product") 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float sx = fy * upZ - fz * upY; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float sy = fz * upX - fx * upZ; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float sz = fx * upY - fy * upX; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // compute u = s x f 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float ux = sy * fz - sz * fy; 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float uy = sz * fx - sx * fz; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float uz = sx * fy - sy * fx; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float m[16] ; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[0] = sx; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[1] = ux; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[2] = -fx; 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[3] = 0.0f; 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[4] = sy; 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[5] = uy; 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[6] = -fy; 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[7] = 0.0f; 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[8] = sz; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[9] = uz; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[10] = -fz; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[11] = 0.0f; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[12] = 0.0f; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[13] = 0.0f; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[14] = 0.0f; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[15] = 1.0f; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glMultMatrixf(m); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTranslatef(-eyeX, -eyeY, -eyeZ); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint main(int argc, char **argv) 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int q; 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int start, end; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("Initializing EGL...\n"); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if(!init_gl_surface()) 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("GL initialisation failed - exiting\n"); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project init_scene(); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project create_texture(); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("Start test...\n"); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project render(argc==2 ? atoi(argv[1]) : ITERATIONS); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free_gl_surface(); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint init_gl_surface(void) 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint numConfigs = 1; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig myConfig = {0}; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attrib[] = 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 126bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich EGL_SURFACE_TYPE, EGL_PBUFFER_BIT|EGL_WINDOW_BIT, 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_DEPTH_SIZE, 16, 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NONE 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( (eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY ) 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglGetDisplay failed\n"); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( eglInitialize(eglDisplay, NULL, NULL) != EGL_TRUE ) 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglInitialize failed\n"); 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 142bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich 143bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich EGLNativeWindowType window = android_createDisplaySurface(); 144bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich EGLUtils::selectConfigForNativeWindow(eglDisplay, attrib, window, &myConfig); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( (eglSurface = eglCreateWindowSurface(eglDisplay, myConfig, 147bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich window, 0)) == EGL_NO_SURFACE ) 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglCreateWindowSurface failed\n"); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( (eglContext = eglCreateContext(eglDisplay, myConfig, 0, 0)) == EGL_NO_CONTEXT ) 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglCreateContext failed\n"); 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext) != EGL_TRUE ) 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglMakeCurrent failed\n"); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid free_gl_surface(void) 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglDisplay != EGL_NO_DISPLAY) 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent( EGL_NO_DISPLAY, EGL_NO_SURFACE, 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NO_SURFACE, EGL_NO_CONTEXT ); 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDestroyContext( eglDisplay, eglContext ); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDestroySurface( eglDisplay, eglSurface ); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglTerminate( eglDisplay ); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDisplay = EGL_NO_DISPLAY; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid init_scene(void) 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_CULL_FACE); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float ratio = 320.0f / 480.0f; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glViewport(0, 0, 320, 480); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glMatrixMode(GL_PROJECTION); 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glLoadIdentity(); 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFrustumf(-ratio, ratio, -1, 1, 1, 10); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glMatrixMode(GL_MODELVIEW); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glLoadIdentity(); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gluLookAt( 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 0, 3, // eye 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 0, 0, // center 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 1, 0); // up 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_TEXTURE_2D); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnableClientState(GL_VERTEX_ARRAY); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnableClientState(GL_TEXTURE_COORD_ARRAY); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid create_texture(void) 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const unsigned int on = 0xff0000ff; 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const unsigned int off = 0xffffffff; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const unsigned int pixels[] = 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glGenTextures(1, &texture); 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, texture); 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid render(int quads) 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int i, j; 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat vertices[] = { 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project -1, -1, 0, 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1, -1, 0, 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1, 1, 0, 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project -1, 1, 0 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed texCoords[] = { 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 0, 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project FIXED_ONE, 0, 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project FIXED_ONE, FIXED_ONE, 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, FIXED_ONE 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 246bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich const GLushort quadIndices[] = { 0, 1, 2, 0, 2, 3 }; 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 249bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich GLushort* indices = (GLushort*)malloc(quads*sizeof(quadIndices)); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<quads ; i++) 251bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich memcpy(indices+(sizeof(quadIndices)/sizeof(indices[0]))*i, quadIndices, sizeof(quadIndices)); 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(3, GL_FLOAT, 0, vertices); 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexCoordPointer(2, GL_FIXED, 0, texCoords); 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // make sure to do a couple eglSwapBuffers to make sure there are 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // no problems with the very first ones (who knows) 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClearColor(0.4, 0.4, 0.4, 0.4); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(eglDisplay, eglSurface); 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClearColor(0.6, 0.6, 0.6, 0.6); 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(eglDisplay, eglSurface); 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClearColor(1.0, 1.0, 1.0, 1.0); 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (j=0 ; j<10 ; j++) { 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("loop %d / 10 (%d quads / loop)\n", j, quads); 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 269bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich int nelem = sizeof(quadIndices)/sizeof(quadIndices[0]); 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawElements(GL_TRIANGLES, nelem*quads, GL_UNSIGNED_SHORT, indices); 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(eglDisplay, eglSurface); 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(indices); 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 278