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