gl_code.cpp revision 3e9eb868b3ad6a93adcb6e8874779f1f57c6ca16
1eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich// OpenGL ES 2.0 code
2eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
3eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <nativehelper/jni.h>
4eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#define LOG_TAG "GLPerf gl_code.cpp"
5eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <utils/Log.h>
6eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
7eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <EGL/egl.h>
8eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <GLES2/gl2.h>
9eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <GLES2/gl2ext.h>
10eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <utils/Timers.h>
11eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
12eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <stdio.h>
13eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <stdlib.h>
14eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich#include <math.h>
15eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
1663bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack PalevichFILE * out;
1763bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich
18eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void printGLString(const char *name, GLenum s) {
19eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    const char *v = (const char *) glGetString(s);
20eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    LOGI("GL %s = %s\n", name, v);
21eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
22eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
23eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void checkGlError(const char* op) {
24eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    for (GLint error = glGetError(); error; error
25eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            = glGetError()) {
26eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        LOGI("after %s() glError (0x%x)\n", op, error);
27eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
28eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
29eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
30eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichGLuint loadShader(GLenum shaderType, const char* pSource) {
31eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint shader = glCreateShader(shaderType);
32eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (shader) {
33eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glShaderSource(shader, 1, &pSource, NULL);
34eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glCompileShader(shader);
35eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        GLint compiled = 0;
36eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
37eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (!compiled) {
38eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            GLint infoLen = 0;
39eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
40eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            if (infoLen) {
41eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                char* buf = (char*) malloc(infoLen);
42eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                if (buf) {
43eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    glGetShaderInfoLog(shader, infoLen, NULL, buf);
44eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    LOGE("Could not compile shader %d:\n%s\n",
45eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                            shaderType, buf);
46eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    free(buf);
47eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                }
48eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                glDeleteShader(shader);
49eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                shader = 0;
50eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
51eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
52eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
53eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return shader;
54eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
55eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
56eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichenum {
57eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_POS,
58eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_COLOR,
59eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_TEX0,
60eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_TEX1
61eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich};
62eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
63eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
64eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);
65eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (!vertexShader) {
66eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        return 0;
67eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
68eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
69eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);
70eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (!pixelShader) {
71eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        return 0;
72eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
73eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
74eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint program = glCreateProgram();
75eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (program) {
76eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glAttachShader(program, vertexShader);
77eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        checkGlError("glAttachShader v");
78eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glAttachShader(program, pixelShader);
79eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        checkGlError("glAttachShader p");
80eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
81eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_POS, "a_pos");
82eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_COLOR, "a_color");
83eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_TEX0, "a_tex0");
84eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_TEX1, "a_tex1");
85eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glLinkProgram(program);
86eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        GLint linkStatus = GL_FALSE;
87eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
88eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (linkStatus != GL_TRUE) {
89eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            GLint bufLength = 0;
90eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
91eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            if (bufLength) {
92eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                char* buf = (char*) malloc(bufLength);
93eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                if (buf) {
94eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    glGetProgramInfoLog(program, bufLength, NULL, buf);
95eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    LOGE("Could not link program:\n%s\n", buf);
96eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    free(buf);
97eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                }
98eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
99eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            glDeleteProgram(program);
100eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            program = 0;
101eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
102eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
103eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    checkGlError("createProgram");
104eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glUseProgram(program);
105eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return program;
106eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
107eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
108eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint64_t getTime() {
109eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    struct timespec t;
110eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    clock_gettime(CLOCK_MONOTONIC, &t);
111eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000);
112eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
113eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
114eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint64_t gTime;
115eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid startTimer() {
116eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    gTime = getTime();
117eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
118eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
119eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid endTimer(const char *str, int w, int h, double dc, int count) {
120eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    uint64_t t2 = getTime();
121eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double delta = ((double)(t2 - gTime)) / 1000000000;
122eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double pixels = dc * (w * h) * count;
123eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double mpps = pixels / delta / 1000000;
124eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double dc60 = pixels / delta / (w * h) / 60;
125eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
126eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    LOGI("%s, %f, %f\n", str, mpps, dc60);
12792a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich    if (out) {
12892a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich        fprintf(out, "%s, %f, %f\r\n", str, mpps, dc60);
12992a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich        fflush(out);
13092a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich    }
131eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
132eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
133eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic const char gVertexShader[] =
134eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec4 a_pos;\n"
135eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec4 a_color;\n"
136eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec2 a_tex0;\n"
137eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec2 a_tex1;\n"
138eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec4 v_color;\n"
139eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex0;\n"
140eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex1;\n"
141eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
142eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "void main() {\n"
143eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    v_color = a_color;\n"
144eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    v_tex0 = a_tex0;\n"
145eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    v_tex1 = a_tex1;\n"
146eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    gl_Position = a_pos;\n"
147eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "}\n";
148eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
149eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic const char gShaderPrefix[] =
150eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "precision mediump float;\n"
151eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_color;\n"
152eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_0;\n"
153eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_1;\n"
154eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_2;\n"
155eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_3;\n"
156eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec4 v_color;\n"
157eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex0;\n"
158eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex1;\n"
159eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform sampler2D u_tex0;\n"
160eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform sampler2D u_tex1;\n"
161eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "void main() {\n";
162eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
163eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic const char gShaderPostfix[] =
164eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "  gl_FragColor = c;\n"
165eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "}\n";
166eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
167eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
168eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic char * append(char *d, const char *s) {
169eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    size_t len = strlen(s);
170eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    memcpy(d, s, len);
171eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return d + len;
172eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
173eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
174eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic char * genShader(
175eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    bool useVarColor,
176eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int texCount,
177eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    bool modulateFirstTex,
178eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int extraMath)
179eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich{
180eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    char *str = (char *)calloc(16 * 1024, 1);
181eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    char *tmp = append(str, gShaderPrefix);
182eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
183eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (modulateFirstTex || !texCount) {
184eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (useVarColor) {
185eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            tmp = append(tmp, "  vec4 c = v_color;\n");
186eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        } else {
187eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            tmp = append(tmp, "  vec4 c = u_color;\n");
188eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
189eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    } else {
190eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  vec4 c = texture2D(u_tex0, v_tex0);\n");
191eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
192eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
193eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (modulateFirstTex && texCount) {
194eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= texture2D(u_tex0, v_tex0);\n");
195eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
196eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (texCount > 1) {
197eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= texture2D(u_tex1, v_tex1);\n");
198eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
199eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
200eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 0) {
201eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_0;\n");
202eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
203eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 1) {
204eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_1;\n");
205eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
206eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 2) {
207eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_2;\n");
208eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
209eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 3) {
210eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_3;\n");
211eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
212eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
213eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
214eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    tmp = append(tmp, gShaderPostfix);
215eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    tmp[0] = 0;
216eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
217eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    //LOGI("%s", str);
218eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return str;
219eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
220eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
221eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void setupVA() {
222eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float vtx[] = {
223eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        -2.0f,-1.0f,
224eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         1.0f,-1.0f,
225eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        -2.0f, 1.0f,
226eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         1.0f, 1.0f };
227eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float color[] = {
228eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,0.0f,1.0f,1.0f,
229eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,0.0f,1.0f,1.0f,
230eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,0.0f,1.0f,
231eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,1.0f,1.0f };
232eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float tex0[] = {
233eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,0.0f,
234eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,0.0f,
235eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,
236eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,1.0f };
237eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float tex1[] = {
238eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,0.0f,
239eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,
240eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,1.0f,
241eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,0.0f };
242eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
243eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_POS);
244eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_COLOR);
245eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_TEX0);
246eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_TEX1);
247eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
248eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_POS, 2, GL_FLOAT, false, 8, vtx);
249eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_COLOR, 4, GL_FLOAT, false, 16, color);
250eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_TEX0, 2, GL_FLOAT, false, 8, tex0);
251eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_TEX1, 2, GL_FLOAT, false, 8, tex1);
252eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
253eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
254eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich//////////////////////////
255eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
25663bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich// Width and height of the screen
257eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
258eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint32_t w;
259eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint32_t h;
260eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
261eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich// The stateClock starts at zero and increments by 1 every time we draw a frame. It is used to control which phase of the test we are in.
262eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
263eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichint stateClock;
264eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichconst int doLoopStates = 2;
265eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichconst int doSingleTestStates = 2;
266eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichbool done;
267eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
26863bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich// Saves the parameters of the test (so we can print them out when we finish the timing.)
26963bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich
270eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichchar saveBuf[1024];
271eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
272eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void doLoop(uint32_t w, uint32_t h, const char *str) {
273965b95468d8325388557003eec24bd70fd22640aJack Palevich    int doLoopState = stateClock % doLoopStates;
274965b95468d8325388557003eec24bd70fd22640aJack Palevich    // LOGI("doLoop %d\n", doLoopState);
275965b95468d8325388557003eec24bd70fd22640aJack Palevich    switch(doLoopState) {
276eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    case 0:
277eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
278eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
279eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    	break;
280eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    case 1:
281eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            strcpy(saveBuf, str);
282eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    startTimer();
283eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
284eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    for (int ct=0; ct < 100; ct++) {
285eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
286eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    }
287eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
288eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
289eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
290eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
291eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void doSingleTest(uint32_t w, uint32_t h,
292eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         bool useVarColor,
293eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         int texCount,
294eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         bool modulateFirstTex,
295eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         int extraMath,
296eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         int tex0, int tex1) {
297965b95468d8325388557003eec24bd70fd22640aJack Palevich    int doSingleTestState = (stateClock / doLoopStates) % doSingleTestStates;
298965b95468d8325388557003eec24bd70fd22640aJack Palevich    // LOGI("doSingleTest %d\n", doSingleTestState);
299965b95468d8325388557003eec24bd70fd22640aJack Palevich    switch (doSingleTestState) {
300eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 0: {
301eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    char *pgmTxt = genShader(useVarColor, texCount, modulateFirstTex, extraMath);
302eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    int pgm = createProgram(gVertexShader, pgmTxt);
303eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (!pgm) {
304eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		LOGE("error running test\n");
305eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		return;
306eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    }
307eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    int loc = glGetUniformLocation(pgm, "u_tex0");
308eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    //LOGI("loc = %i \n", loc);
309eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform1i(loc, 0);
310eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_tex1");
311eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform1i(loc, 1);
312eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
313eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_color");
314eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 1.f, 0.4f, 0.6f, 0.8f);
315eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
316eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_0");
317eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 1.f, 0.4f, 0.6f, 0.8f);
318eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
319eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_1");
320eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 0.7f, 0.8f, 0.6f, 0.8f);
321eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
322eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_2");
323eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 0.9f, 0.6f, 0.7f, 1.0f);
324eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
325eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_3");
326eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 0.88f, 0.2f, 0.4f, 0.2f);
327eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
328eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glActiveTexture(GL_TEXTURE0);
329eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glBindTexture(GL_TEXTURE_2D, tex0);
330eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glActiveTexture(GL_TEXTURE1);
331eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glBindTexture(GL_TEXTURE_2D, tex1);
332eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glActiveTexture(GL_TEXTURE0);
333eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
334eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
335eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glBlendFunc(GL_ONE, GL_ONE);
336eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glDisable(GL_BLEND);
337eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            char str2[1024];
338eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    sprintf(str2, "%i, %i, %i, %i, %i, 0",
339eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		    useVarColor, texCount, modulateFirstTex, extraMath, tex0);
340eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    	    doLoop(w, h, str2);
341eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	 }
342eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         break;
343eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         case 1: {
344eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            char str2[1024];
345eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glEnable(GL_BLEND);
346eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    sprintf(str2, "%i, %i, %i, %i, %i, 1",
347eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		    useVarColor, texCount, modulateFirstTex, extraMath, tex0);
348eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    doLoop(w, h, str2);
349eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
350eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        break;
351eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
352eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
353eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
354eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid genTextures() {
355eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    uint32_t *m = (uint32_t *)malloc(1024*1024*4);
356eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    for (int y=0; y < 1024; y++){
357eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        for (int x=0; x < 1024; x++){
358eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            m[y*1024 + x] = 0xff0000ff | ((x & 0xff) << 8) | (y << 16);
359eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
360eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
361eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glBindTexture(GL_TEXTURE_2D, 1);
362eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, m);
363eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
364eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
365eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
366eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
367eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
368eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    for (int y=0; y < 16; y++){
369eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        for (int x=0; x < 16; x++){
370eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            m[y*16 + x] = 0xff0000ff | (x<<12) | (y<<20);
371eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
372eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
373eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glBindTexture(GL_TEXTURE_2D, 2);
374eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, m);
375eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
376eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
377eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
378eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
379eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
380eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
381eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
382eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid doTest(uint32_t w, uint32_t h) {
383eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int testState = stateClock / (doLoopStates * doSingleTestStates);
384eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int texCount;
385eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int extraMath;
386eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int testSubState;
3873e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich    const int extraMathCount = 5;
3883e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich    const int texCount0SubTestCount = 2;
3893e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich    const int texCountNSubTestCount = 8;
3903e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich
3913e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich    if ( testState < extraMathCount * texCount0SubTestCount) {
3923e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich       texCount = 0; // Only 10 tests for texCount 0
3933e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich       extraMath = (testState / texCount0SubTestCount) % extraMathCount;
3943e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich       testSubState = testState % texCount0SubTestCount;
395eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    } else {
3963e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich       texCount = 1 + (testState - extraMathCount * texCount0SubTestCount) / (extraMathCount * texCountNSubTestCount);
3973e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich       extraMath = (testState / texCountNSubTestCount) % extraMathCount;
3983e9eb868b3ad6a93adcb6e8874779f1f57c6ca16Jack Palevich       testSubState = testState % texCountNSubTestCount;
399eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
400eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (texCount >= 3) {
40163bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich       LOGI("done\n");
40263bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich       if (out) {
40363bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich           fclose(out);
40463bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich           out = NULL;
40563bcb5f8e2d2c1d054b09a5ab9f989644cfeb9b1Jack Palevich       }
406eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       done = true;
407eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       return;
408eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
409eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
410965b95468d8325388557003eec24bd70fd22640aJack Palevich
411965b95468d8325388557003eec24bd70fd22640aJack Palevich    // LOGI("doTest %d %d %d\n", texCount, extraMath, testSubState);
412965b95468d8325388557003eec24bd70fd22640aJack Palevich
413eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    switch(testSubState) {
414eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 0:
415eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            doSingleTest(w, h, false, texCount, false, extraMath, 1, 1);
416eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
417eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 1:
418eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            doSingleTest(w, h, true, texCount, false, extraMath, 1, 1);
419eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
420eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 2:
421eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, false, texCount, true, extraMath, 1, 1);
422eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
423eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 3:
424eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, true, texCount, true, extraMath, 1, 1);
425eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
426eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
427eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 4:
428eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, false, texCount, false, extraMath, 2, 2);
429eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
430eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 5:
431eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, true, texCount, false, extraMath, 2, 2);
432eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
433eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 6:
434eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, false, texCount, true, extraMath, 2, 2);
435eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
436eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 7:
437eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, true, texCount, true, extraMath, 2, 2);
438eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
439eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
440eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
441eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
442eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichextern "C" {
443eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * env, jobject obj,  jint width, jint height);
444eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_step(JNIEnv * env, jobject obj);
445eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich};
446eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
447eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichJNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * env, jobject obj,  jint width, jint height)
448eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich{
44992a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich    if (!done) {
45092a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    w = width;
45192a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    h = height;
45292a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    stateClock = 0;
45392a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    done = false;
45492a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    setupVA();
45592a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    genTextures();
45692a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    const char* fileName = "/sdcard/glperf.csv";
45792a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich            if (out != NULL) {
45892a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich                 LOGI("Closing partially written output.n");
45992a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich                 fclose(out);
46092a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich                 out = NULL;
46192a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich            }
46292a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    LOGI("Writing to: %s\n",fileName);
46392a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    out = fopen(fileName, "w");
46492a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    if (out == NULL) {
46592a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich		LOGE("Could not open: %s\n", fileName);
46692a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    }
467eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
46892a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    LOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
46992a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich	    if (out) fprintf(out,"varColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\r\n");
47092a9ae4a02682a9e195f3e3a68d2c7293c018173Jack Palevich    }
471eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
472eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
473eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichJNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_step(JNIEnv * env, jobject obj)
474eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich{
475eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (! done) {
476965b95468d8325388557003eec24bd70fd22640aJack Palevich        if (stateClock > 0 && ((stateClock & 1) == 0)) {
477965b95468d8325388557003eec24bd70fd22640aJack Palevich	    endTimer(saveBuf, w, h, 1, 100);
478eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
479eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        doTest(w, h);
480eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        stateClock++;
481965b95468d8325388557003eec24bd70fd22640aJack Palevich    } else {
482965b95468d8325388557003eec24bd70fd22640aJack Palevich	    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
483eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
484eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
485