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