gl_code.cpp revision eb69d2ae19c89553c142a7b716fe2ac72e32080a
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
16eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void printGLString(const char *name, GLenum s) {
17eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    const char *v = (const char *) glGetString(s);
18eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    LOGI("GL %s = %s\n", name, v);
19eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
20eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
21eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void checkGlError(const char* op) {
22eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    for (GLint error = glGetError(); error; error
23eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            = glGetError()) {
24eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        LOGI("after %s() glError (0x%x)\n", op, error);
25eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
26eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
27eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
28eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichGLuint loadShader(GLenum shaderType, const char* pSource) {
29eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint shader = glCreateShader(shaderType);
30eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (shader) {
31eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glShaderSource(shader, 1, &pSource, NULL);
32eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glCompileShader(shader);
33eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        GLint compiled = 0;
34eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
35eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (!compiled) {
36eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            GLint infoLen = 0;
37eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
38eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            if (infoLen) {
39eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                char* buf = (char*) malloc(infoLen);
40eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                if (buf) {
41eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    glGetShaderInfoLog(shader, infoLen, NULL, buf);
42eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    LOGE("Could not compile shader %d:\n%s\n",
43eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                            shaderType, buf);
44eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    free(buf);
45eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                }
46eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                glDeleteShader(shader);
47eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                shader = 0;
48eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
49eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
50eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
51eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return shader;
52eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
53eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
54eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichenum {
55eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_POS,
56eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_COLOR,
57eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_TEX0,
58eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    A_TEX1
59eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich};
60eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
61eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
62eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);
63eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (!vertexShader) {
64eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        return 0;
65eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
66eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
67eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);
68eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (!pixelShader) {
69eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        return 0;
70eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
71eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
72eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    GLuint program = glCreateProgram();
73eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (program) {
74eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glAttachShader(program, vertexShader);
75eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        checkGlError("glAttachShader v");
76eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glAttachShader(program, pixelShader);
77eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        checkGlError("glAttachShader p");
78eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
79eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_POS, "a_pos");
80eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_COLOR, "a_color");
81eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_TEX0, "a_tex0");
82eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glBindAttribLocation(program, A_TEX1, "a_tex1");
83eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glLinkProgram(program);
84eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        GLint linkStatus = GL_FALSE;
85eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
86eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (linkStatus != GL_TRUE) {
87eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            GLint bufLength = 0;
88eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
89eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            if (bufLength) {
90eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                char* buf = (char*) malloc(bufLength);
91eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                if (buf) {
92eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    glGetProgramInfoLog(program, bufLength, NULL, buf);
93eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    LOGE("Could not link program:\n%s\n", buf);
94eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    free(buf);
95eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                }
96eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
97eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            glDeleteProgram(program);
98eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            program = 0;
99eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
100eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
101eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    checkGlError("createProgram");
102eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glUseProgram(program);
103eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return program;
104eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
105eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
106eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint64_t getTime() {
107eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    struct timespec t;
108eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    clock_gettime(CLOCK_MONOTONIC, &t);
109eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000);
110eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
111eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
112eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint64_t gTime;
113eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid startTimer() {
114eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    gTime = getTime();
115eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
116eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
117eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid endTimer(const char *str, int w, int h, double dc, int count) {
118eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    uint64_t t2 = getTime();
119eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double delta = ((double)(t2 - gTime)) / 1000000000;
120eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double pixels = dc * (w * h) * count;
121eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double mpps = pixels / delta / 1000000;
122eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    double dc60 = pixels / delta / (w * h) / 60;
123eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
124eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    LOGI("%s, %f, %f\n", str, mpps, dc60);
125eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
126eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
127eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic const char gVertexShader[] =
128eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec4 a_pos;\n"
129eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec4 a_color;\n"
130eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec2 a_tex0;\n"
131eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "attribute vec2 a_tex1;\n"
132eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec4 v_color;\n"
133eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex0;\n"
134eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex1;\n"
135eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
136eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "void main() {\n"
137eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    v_color = a_color;\n"
138eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    v_tex0 = a_tex0;\n"
139eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    v_tex1 = a_tex1;\n"
140eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "    gl_Position = a_pos;\n"
141eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "}\n";
142eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
143eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic const char gShaderPrefix[] =
144eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "precision mediump float;\n"
145eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_color;\n"
146eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_0;\n"
147eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_1;\n"
148eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_2;\n"
149eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform vec4 u_3;\n"
150eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec4 v_color;\n"
151eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex0;\n"
152eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "varying vec2 v_tex1;\n"
153eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform sampler2D u_tex0;\n"
154eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "uniform sampler2D u_tex1;\n"
155eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "void main() {\n";
156eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
157eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic const char gShaderPostfix[] =
158eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "  gl_FragColor = c;\n"
159eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    "}\n";
160eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
161eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
162eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic char * append(char *d, const char *s) {
163eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    size_t len = strlen(s);
164eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    memcpy(d, s, len);
165eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return d + len;
166eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
167eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
168eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic char * genShader(
169eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    bool useVarColor,
170eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int texCount,
171eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    bool modulateFirstTex,
172eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int extraMath)
173eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich{
174eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    char *str = (char *)calloc(16 * 1024, 1);
175eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    char *tmp = append(str, gShaderPrefix);
176eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
177eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (modulateFirstTex || !texCount) {
178eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (useVarColor) {
179eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            tmp = append(tmp, "  vec4 c = v_color;\n");
180eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        } else {
181eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            tmp = append(tmp, "  vec4 c = u_color;\n");
182eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
183eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    } else {
184eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  vec4 c = texture2D(u_tex0, v_tex0);\n");
185eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
186eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
187eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (modulateFirstTex && texCount) {
188eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= texture2D(u_tex0, v_tex0);\n");
189eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
190eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (texCount > 1) {
191eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= texture2D(u_tex1, v_tex1);\n");
192eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
193eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
194eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 0) {
195eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_0;\n");
196eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
197eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 1) {
198eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_1;\n");
199eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
200eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 2) {
201eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_2;\n");
202eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
203eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (extraMath > 3) {
204eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        tmp = append(tmp, "  c *= u_3;\n");
205eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
206eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
207eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
208eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    tmp = append(tmp, gShaderPostfix);
209eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    tmp[0] = 0;
210eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
211eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    //LOGI("%s", str);
212eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    return str;
213eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
214eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
215eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void setupVA() {
216eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float vtx[] = {
217eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        -2.0f,-1.0f,
218eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         1.0f,-1.0f,
219eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        -2.0f, 1.0f,
220eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         1.0f, 1.0f };
221eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float color[] = {
222eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,0.0f,1.0f,1.0f,
223eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,0.0f,1.0f,1.0f,
224eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,0.0f,1.0f,
225eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,1.0f,1.0f };
226eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float tex0[] = {
227eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,0.0f,
228eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,0.0f,
229eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,
230eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,1.0f };
231eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    static const float tex1[] = {
232eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,0.0f,
233eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        1.0f,1.0f,
234eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,1.0f,
235eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        0.0f,0.0f };
236eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
237eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_POS);
238eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_COLOR);
239eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_TEX0);
240eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glEnableVertexAttribArray(A_TEX1);
241eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
242eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_POS, 2, GL_FLOAT, false, 8, vtx);
243eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_COLOR, 4, GL_FLOAT, false, 16, color);
244eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_TEX0, 2, GL_FLOAT, false, 8, tex0);
245eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glVertexAttribPointer(A_TEX1, 2, GL_FLOAT, false, 8, tex1);
246eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
247eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
248eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich//////////////////////////
249eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
250eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich// Tells us what to draw next
251eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
252eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint32_t w;
253eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichuint32_t h;
254eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
255eb69d2ae19c89553c142a7b716fe2ac72e32080aJack 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.
256eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
257eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichint stateClock;
258eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichconst int doLoopStates = 2;
259eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichconst int doSingleTestStates = 2;
260eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichbool done;
261eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
262eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichchar saveBuf[1024];
263eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
264eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid kickTimer() {
265eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    endTimer(saveBuf, w, h, 1, 100);
266eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
267eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void doLoop(uint32_t w, uint32_t h, const char *str) {
268eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    switch(stateClock % doLoopStates) {
269eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    case 0:
270eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
271eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
272eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    	break;
273eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    case 1:
274eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            strcpy(saveBuf, str);
275eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    startTimer();
276eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
277eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    for (int ct=0; ct < 100; ct++) {
278eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
279eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    }
280eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
281eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
282eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
283eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
284eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichstatic void doSingleTest(uint32_t w, uint32_t h,
285eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         bool useVarColor,
286eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         int texCount,
287eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         bool modulateFirstTex,
288eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         int extraMath,
289eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                         int tex0, int tex1) {
290eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    switch ((stateClock / doLoopStates) % doSingleTestStates) {
291eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 0: {
292eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    char *pgmTxt = genShader(useVarColor, texCount, modulateFirstTex, extraMath);
293eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    int pgm = createProgram(gVertexShader, pgmTxt);
294eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (!pgm) {
295eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		LOGE("error running test\n");
296eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		return;
297eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    }
298eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    int loc = glGetUniformLocation(pgm, "u_tex0");
299eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    //LOGI("loc = %i \n", loc);
300eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform1i(loc, 0);
301eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_tex1");
302eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform1i(loc, 1);
303eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
304eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_color");
305eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 1.f, 0.4f, 0.6f, 0.8f);
306eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
307eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_0");
308eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 1.f, 0.4f, 0.6f, 0.8f);
309eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
310eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_1");
311eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 0.7f, 0.8f, 0.6f, 0.8f);
312eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
313eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_2");
314eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 0.9f, 0.6f, 0.7f, 1.0f);
315eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
316eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    loc = glGetUniformLocation(pgm, "u_3");
317eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    if (loc >= 0) glUniform4f(loc, 0.88f, 0.2f, 0.4f, 0.2f);
318eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
319eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glActiveTexture(GL_TEXTURE0);
320eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glBindTexture(GL_TEXTURE_2D, tex0);
321eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glActiveTexture(GL_TEXTURE1);
322eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glBindTexture(GL_TEXTURE_2D, tex1);
323eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glActiveTexture(GL_TEXTURE0);
324eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
325eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
326eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glBlendFunc(GL_ONE, GL_ONE);
327eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glDisable(GL_BLEND);
328eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            char str2[1024];
329eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    sprintf(str2, "%i, %i, %i, %i, %i, 0",
330eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		    useVarColor, texCount, modulateFirstTex, extraMath, tex0);
331eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    	    doLoop(w, h, str2);
332eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	 }
333eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         break;
334eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich         case 1: {
335eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            char str2[1024];
336eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    glEnable(GL_BLEND);
337eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    sprintf(str2, "%i, %i, %i, %i, %i, 1",
338eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich		    useVarColor, texCount, modulateFirstTex, extraMath, tex0);
339eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	    doLoop(w, h, str2);
340eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
341eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        break;
342eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
343eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
344eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
345eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid genTextures() {
346eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    uint32_t *m = (uint32_t *)malloc(1024*1024*4);
347eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    for (int y=0; y < 1024; y++){
348eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        for (int x=0; x < 1024; x++){
349eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            m[y*1024 + x] = 0xff0000ff | ((x & 0xff) << 8) | (y << 16);
350eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
351eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
352eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glBindTexture(GL_TEXTURE_2D, 1);
353eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, m);
354eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
355eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
356eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
357eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
358eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
359eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    for (int y=0; y < 16; y++){
360eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        for (int x=0; x < 16; x++){
361eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            m[y*16 + x] = 0xff0000ff | (x<<12) | (y<<20);
362eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
363eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
364eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glBindTexture(GL_TEXTURE_2D, 2);
365eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, m);
366eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
367eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
368eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
369eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
370eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
371eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
372eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
373eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichvoid doTest(uint32_t w, uint32_t h) {
374eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int testState = stateClock / (doLoopStates * doSingleTestStates);
375eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int texCount;
376eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int extraMath;
377eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    int testSubState;
378eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if ( testState < 5 * 2) {
379eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       texCount = 0; // Only 10 tests for texCout 0
380eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       extraMath = testState / 2;
381eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       testSubState = testState % 2;
382eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    } else {
383eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       texCount = 1 + (testState - 10) / (5 * 8);
384eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       extraMath = testState / 8;
385eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       testSubState = testState % 8;
386eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
387eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (texCount >= 3) {
388eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       LOGI("done\n");
389eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       done = true;
390eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich       return;
391eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
392eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
393eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    switch(testSubState) {
394eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 0:
395eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            doSingleTest(w, h, false, texCount, false, extraMath, 1, 1);
396eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
397eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 1:
398eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            doSingleTest(w, h, true, texCount, false, extraMath, 1, 1);
399eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
400eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 2:
401eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, false, texCount, true, extraMath, 1, 1);
402eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
403eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 3:
404eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, true, texCount, true, extraMath, 1, 1);
405eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
406eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
407eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 4:
408eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, false, texCount, false, extraMath, 2, 2);
409eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
410eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 5:
411eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, true, texCount, false, extraMath, 2, 2);
412eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
413eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 6:
414eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, false, texCount, true, extraMath, 2, 2);
415eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
416eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	case 7:
417eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                doSingleTest(w, h, true, texCount, true, extraMath, 2, 2);
418eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich	break;
419eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
420eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
421eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
422eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichextern "C" {
423eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * env, jobject obj,  jint width, jint height);
424eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    JNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_step(JNIEnv * env, jobject obj);
425eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich};
426eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
427eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichJNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_init(JNIEnv * env, jobject obj,  jint width, jint height)
428eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich{
429eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    w = width;
430eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    h = height;
431eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    stateClock = 0;
432eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    done = false;
433eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    setupVA();
434eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    genTextures();
435eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
436eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    LOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
437eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
438eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
439eb69d2ae19c89553c142a7b716fe2ac72e32080aJack PalevichJNIEXPORT void JNICALL Java_com_android_glperf_GLPerfLib_step(JNIEnv * env, jobject obj)
440eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich{
441eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    if (! done) {
442eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        if (stateClock > 0) {
443eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            kickTimer();
444eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
445eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        doTest(w, h);
446eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        stateClock++;
447eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
448eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
449