tritex.cpp revision 6ef57d7b368ebbac5f2b27c36a9032fee1cda8b1
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 116ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <WindowSurface.h> 126ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <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 286ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFaddenint init_gl_surface(const WindowSurface&); 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 1016ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden WindowSurface windowSurface; 1026ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if(!init_gl_surface(windowSurface)) 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("GL initialisation failed - exiting\n"); 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project init_scene(); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project create_texture(); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("Start test...\n"); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project render(argc==2 ? atoi(argv[1]) : ITERATIONS); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free_gl_surface(); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1216ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFaddenint init_gl_surface(const WindowSurface& windowSurface) 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint numConfigs = 1; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig myConfig = {0}; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attrib[] = 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 12738d3c2a850e986ed37126127fc2939fae9de76c6Jack Palevich EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_DEPTH_SIZE, 16, 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NONE 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( (eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY ) 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglGetDisplay failed\n"); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( eglInitialize(eglDisplay, NULL, NULL) != EGL_TRUE ) 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglInitialize failed\n"); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 143bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich 1446ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden EGLNativeWindowType window = windowSurface.getSurface(); 145bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich EGLUtils::selectConfigForNativeWindow(eglDisplay, attrib, window, &myConfig); 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( (eglSurface = eglCreateWindowSurface(eglDisplay, myConfig, 148bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich window, 0)) == EGL_NO_SURFACE ) 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglCreateWindowSurface failed\n"); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( (eglContext = eglCreateContext(eglDisplay, myConfig, 0, 0)) == EGL_NO_CONTEXT ) 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglCreateContext failed\n"); 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ( eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext) != EGL_TRUE ) 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("eglMakeCurrent failed\n"); 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid free_gl_surface(void) 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglDisplay != EGL_NO_DISPLAY) 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent( EGL_NO_DISPLAY, EGL_NO_SURFACE, 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NO_SURFACE, EGL_NO_CONTEXT ); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDestroyContext( eglDisplay, eglContext ); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDestroySurface( eglDisplay, eglSurface ); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglTerminate( eglDisplay ); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglDisplay = EGL_NO_DISPLAY; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid init_scene(void) 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_CULL_FACE); 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float ratio = 320.0f / 480.0f; 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glViewport(0, 0, 320, 480); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glMatrixMode(GL_PROJECTION); 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glLoadIdentity(); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFrustumf(-ratio, ratio, -1, 1, 1, 10); 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glMatrixMode(GL_MODELVIEW); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glLoadIdentity(); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gluLookAt( 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 0, 3, // eye 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 0, 0, // center 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 1, 0); // up 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_TEXTURE_2D); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnableClientState(GL_VERTEX_ARRAY); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnableClientState(GL_TEXTURE_COORD_ARRAY); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid create_texture(void) 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const unsigned int on = 0xff0000ff; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const unsigned int off = 0xffffffff; 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const unsigned int pixels[] = 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project on, off, on, off, on, off, on, off, 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project off, on, off, on, off, on, off, on, 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glGenTextures(1, &texture); 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, texture); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid render(int quads) 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int i, j; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat vertices[] = { 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 -1, 1, 0 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed texCoords[] = { 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 0, 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project FIXED_ONE, 0, 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project FIXED_ONE, FIXED_ONE, 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, FIXED_ONE 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 247bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich const GLushort quadIndices[] = { 0, 1, 2, 0, 2, 3 }; 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 250bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich GLushort* indices = (GLushort*)malloc(quads*sizeof(quadIndices)); 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<quads ; i++) 252bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich memcpy(indices+(sizeof(quadIndices)/sizeof(indices[0]))*i, quadIndices, sizeof(quadIndices)); 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(3, GL_FLOAT, 0, vertices); 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexCoordPointer(2, GL_FIXED, 0, texCoords); 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // make sure to do a couple eglSwapBuffers to make sure there are 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // no problems with the very first ones (who knows) 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClearColor(0.4, 0.4, 0.4, 0.4); 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(eglDisplay, eglSurface); 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClearColor(0.6, 0.6, 0.6, 0.6); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(eglDisplay, eglSurface); 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClearColor(1.0, 1.0, 1.0, 1.0); 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (j=0 ; j<10 ; j++) { 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf("loop %d / 10 (%d quads / loop)\n", j, quads); 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 270bc4a4177a34267ad0d039c8567bb9fe7549bb310Jack Palevich int nelem = sizeof(quadIndices)/sizeof(quadIndices[0]); 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawElements(GL_TRIANGLES, nelem*quads, GL_UNSIGNED_SHORT, indices); 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(eglDisplay, eglSurface); 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(indices); 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 279