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