17920987182de225959a3bf40f36fd5ee23204caeJason Sams/* 27920987182de225959a3bf40f36fd5ee23204caeJason Sams * Copyright (C) 2007 The Android Open Source Project 37920987182de225959a3bf40f36fd5ee23204caeJason Sams * 47920987182de225959a3bf40f36fd5ee23204caeJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 57920987182de225959a3bf40f36fd5ee23204caeJason Sams * you may not use this file except in compliance with the License. 67920987182de225959a3bf40f36fd5ee23204caeJason Sams * You may obtain a copy of the License at 77920987182de225959a3bf40f36fd5ee23204caeJason Sams * 87920987182de225959a3bf40f36fd5ee23204caeJason Sams * http://www.apache.org/licenses/LICENSE-2.0 97920987182de225959a3bf40f36fd5ee23204caeJason Sams * 107920987182de225959a3bf40f36fd5ee23204caeJason Sams * Unless required by applicable law or agreed to in writing, software 117920987182de225959a3bf40f36fd5ee23204caeJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 127920987182de225959a3bf40f36fd5ee23204caeJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137920987182de225959a3bf40f36fd5ee23204caeJason Sams * See the License for the specific language governing permissions and 147920987182de225959a3bf40f36fd5ee23204caeJason Sams * limitations under the License. 157920987182de225959a3bf40f36fd5ee23204caeJason Sams */ 167920987182de225959a3bf40f36fd5ee23204caeJason Sams 1774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams#include "fragment_shaders.cpp" 1874b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 197920987182de225959a3bf40f36fd5ee23204caeJason SamsFILE * fOut = NULL; 207920987182de225959a3bf40f36fd5ee23204caeJason Samsvoid ptSwap(); 217920987182de225959a3bf40f36fd5ee23204caeJason Sams 2274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic char gCurrentTestName[1024]; 2374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic uint32_t gWidth = 0; 2474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic uint32_t gHeight = 0; 2574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 267920987182de225959a3bf40f36fd5ee23204caeJason Samsstatic void checkGlError(const char* op) { 277920987182de225959a3bf40f36fd5ee23204caeJason Sams for (GLint error = glGetError(); error; error 287920987182de225959a3bf40f36fd5ee23204caeJason Sams = glGetError()) { 29e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("after %s() glError (0x%x)\n", op, error); 307920987182de225959a3bf40f36fd5ee23204caeJason Sams } 317920987182de225959a3bf40f36fd5ee23204caeJason Sams} 327920987182de225959a3bf40f36fd5ee23204caeJason Sams 337920987182de225959a3bf40f36fd5ee23204caeJason SamsGLuint loadShader(GLenum shaderType, const char* pSource) { 347920987182de225959a3bf40f36fd5ee23204caeJason Sams GLuint shader = glCreateShader(shaderType); 357920987182de225959a3bf40f36fd5ee23204caeJason Sams if (shader) { 367920987182de225959a3bf40f36fd5ee23204caeJason Sams glShaderSource(shader, 1, &pSource, NULL); 377920987182de225959a3bf40f36fd5ee23204caeJason Sams glCompileShader(shader); 387920987182de225959a3bf40f36fd5ee23204caeJason Sams GLint compiled = 0; 397920987182de225959a3bf40f36fd5ee23204caeJason Sams glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 407920987182de225959a3bf40f36fd5ee23204caeJason Sams if (!compiled) { 417920987182de225959a3bf40f36fd5ee23204caeJason Sams GLint infoLen = 0; 427920987182de225959a3bf40f36fd5ee23204caeJason Sams glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); 437920987182de225959a3bf40f36fd5ee23204caeJason Sams if (infoLen) { 447920987182de225959a3bf40f36fd5ee23204caeJason Sams char* buf = (char*) malloc(infoLen); 457920987182de225959a3bf40f36fd5ee23204caeJason Sams if (buf) { 467920987182de225959a3bf40f36fd5ee23204caeJason Sams glGetShaderInfoLog(shader, infoLen, NULL, buf); 47e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Could not compile shader %d:\n%s\n", shaderType, buf); 487920987182de225959a3bf40f36fd5ee23204caeJason Sams free(buf); 497920987182de225959a3bf40f36fd5ee23204caeJason Sams } 507920987182de225959a3bf40f36fd5ee23204caeJason Sams glDeleteShader(shader); 517920987182de225959a3bf40f36fd5ee23204caeJason Sams shader = 0; 527920987182de225959a3bf40f36fd5ee23204caeJason Sams } 537920987182de225959a3bf40f36fd5ee23204caeJason Sams } 547920987182de225959a3bf40f36fd5ee23204caeJason Sams } 557920987182de225959a3bf40f36fd5ee23204caeJason Sams return shader; 567920987182de225959a3bf40f36fd5ee23204caeJason Sams} 577920987182de225959a3bf40f36fd5ee23204caeJason Sams 587920987182de225959a3bf40f36fd5ee23204caeJason Samsenum { 597920987182de225959a3bf40f36fd5ee23204caeJason Sams A_POS, 607920987182de225959a3bf40f36fd5ee23204caeJason Sams A_COLOR, 617920987182de225959a3bf40f36fd5ee23204caeJason Sams A_TEX0, 627920987182de225959a3bf40f36fd5ee23204caeJason Sams A_TEX1 637920987182de225959a3bf40f36fd5ee23204caeJason Sams}; 647920987182de225959a3bf40f36fd5ee23204caeJason Sams 657920987182de225959a3bf40f36fd5ee23204caeJason SamsGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) { 667920987182de225959a3bf40f36fd5ee23204caeJason Sams GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource); 677920987182de225959a3bf40f36fd5ee23204caeJason Sams if (!vertexShader) { 687920987182de225959a3bf40f36fd5ee23204caeJason Sams return 0; 697920987182de225959a3bf40f36fd5ee23204caeJason Sams } 707920987182de225959a3bf40f36fd5ee23204caeJason Sams 717920987182de225959a3bf40f36fd5ee23204caeJason Sams GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource); 727920987182de225959a3bf40f36fd5ee23204caeJason Sams if (!pixelShader) { 737920987182de225959a3bf40f36fd5ee23204caeJason Sams return 0; 747920987182de225959a3bf40f36fd5ee23204caeJason Sams } 757920987182de225959a3bf40f36fd5ee23204caeJason Sams 767920987182de225959a3bf40f36fd5ee23204caeJason Sams GLuint program = glCreateProgram(); 777920987182de225959a3bf40f36fd5ee23204caeJason Sams if (program) { 787920987182de225959a3bf40f36fd5ee23204caeJason Sams glAttachShader(program, vertexShader); 797920987182de225959a3bf40f36fd5ee23204caeJason Sams checkGlError("glAttachShader v"); 807920987182de225959a3bf40f36fd5ee23204caeJason Sams glAttachShader(program, pixelShader); 817920987182de225959a3bf40f36fd5ee23204caeJason Sams checkGlError("glAttachShader p"); 827920987182de225959a3bf40f36fd5ee23204caeJason Sams 837920987182de225959a3bf40f36fd5ee23204caeJason Sams glBindAttribLocation(program, A_POS, "a_pos"); 847920987182de225959a3bf40f36fd5ee23204caeJason Sams glBindAttribLocation(program, A_COLOR, "a_color"); 857920987182de225959a3bf40f36fd5ee23204caeJason Sams glBindAttribLocation(program, A_TEX0, "a_tex0"); 867920987182de225959a3bf40f36fd5ee23204caeJason Sams glBindAttribLocation(program, A_TEX1, "a_tex1"); 877920987182de225959a3bf40f36fd5ee23204caeJason Sams glLinkProgram(program); 887920987182de225959a3bf40f36fd5ee23204caeJason Sams GLint linkStatus = GL_FALSE; 897920987182de225959a3bf40f36fd5ee23204caeJason Sams glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); 907920987182de225959a3bf40f36fd5ee23204caeJason Sams if (linkStatus != GL_TRUE) { 917920987182de225959a3bf40f36fd5ee23204caeJason Sams GLint bufLength = 0; 927920987182de225959a3bf40f36fd5ee23204caeJason Sams glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); 937920987182de225959a3bf40f36fd5ee23204caeJason Sams if (bufLength) { 947920987182de225959a3bf40f36fd5ee23204caeJason Sams char* buf = (char*) malloc(bufLength); 957920987182de225959a3bf40f36fd5ee23204caeJason Sams if (buf) { 967920987182de225959a3bf40f36fd5ee23204caeJason Sams glGetProgramInfoLog(program, bufLength, NULL, buf); 97e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Could not link program:\n%s\n", buf); 987920987182de225959a3bf40f36fd5ee23204caeJason Sams free(buf); 997920987182de225959a3bf40f36fd5ee23204caeJason Sams } 1007920987182de225959a3bf40f36fd5ee23204caeJason Sams } 1017920987182de225959a3bf40f36fd5ee23204caeJason Sams glDeleteProgram(program); 1027920987182de225959a3bf40f36fd5ee23204caeJason Sams program = 0; 1037920987182de225959a3bf40f36fd5ee23204caeJason Sams } 1047920987182de225959a3bf40f36fd5ee23204caeJason Sams } 1057920987182de225959a3bf40f36fd5ee23204caeJason Sams checkGlError("createProgram"); 1067920987182de225959a3bf40f36fd5ee23204caeJason Sams glUseProgram(program); 1077920987182de225959a3bf40f36fd5ee23204caeJason Sams return program; 1087920987182de225959a3bf40f36fd5ee23204caeJason Sams} 1097920987182de225959a3bf40f36fd5ee23204caeJason Sams 1107920987182de225959a3bf40f36fd5ee23204caeJason Samsuint64_t getTime() { 1117920987182de225959a3bf40f36fd5ee23204caeJason Sams struct timespec t; 1127920987182de225959a3bf40f36fd5ee23204caeJason Sams clock_gettime(CLOCK_MONOTONIC, &t); 1137920987182de225959a3bf40f36fd5ee23204caeJason Sams return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000); 1147920987182de225959a3bf40f36fd5ee23204caeJason Sams} 1157920987182de225959a3bf40f36fd5ee23204caeJason Sams 1167920987182de225959a3bf40f36fd5ee23204caeJason Samsuint64_t gTime; 1177920987182de225959a3bf40f36fd5ee23204caeJason Samsvoid startTimer() { 1187920987182de225959a3bf40f36fd5ee23204caeJason Sams gTime = getTime(); 1197920987182de225959a3bf40f36fd5ee23204caeJason Sams} 1207920987182de225959a3bf40f36fd5ee23204caeJason Sams 12174b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 12274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic void endTimer(int count) { 1237920987182de225959a3bf40f36fd5ee23204caeJason Sams uint64_t t2 = getTime(); 1247920987182de225959a3bf40f36fd5ee23204caeJason Sams double delta = ((double)(t2 - gTime)) / 1000000000; 12574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams double pixels = (gWidth * gHeight) * count; 1267920987182de225959a3bf40f36fd5ee23204caeJason Sams double mpps = pixels / delta / 1000000; 12774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams double dc60 = ((double)count) / delta / 60; 1287920987182de225959a3bf40f36fd5ee23204caeJason Sams 1297920987182de225959a3bf40f36fd5ee23204caeJason Sams if (fOut) { 13074b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams fprintf(fOut, "%s, %f, %f\r\n", gCurrentTestName, mpps, dc60); 1317920987182de225959a3bf40f36fd5ee23204caeJason Sams fflush(fOut); 1327920987182de225959a3bf40f36fd5ee23204caeJason Sams } else { 13374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams printf("%s, %f, %f\n", gCurrentTestName, mpps, dc60); 1347920987182de225959a3bf40f36fd5ee23204caeJason Sams } 135a19954ab377b46dbcb9cbe8a6ab6d458f2e32bcaSteve Block ALOGI("%s, %f, %f\r\n", gCurrentTestName, mpps, dc60); 1367920987182de225959a3bf40f36fd5ee23204caeJason Sams} 1377920987182de225959a3bf40f36fd5ee23204caeJason Sams 1387920987182de225959a3bf40f36fd5ee23204caeJason Sams 1397920987182de225959a3bf40f36fd5ee23204caeJason Samsstatic const char gVertexShader[] = 1407920987182de225959a3bf40f36fd5ee23204caeJason Sams "attribute vec4 a_pos;\n" 1417920987182de225959a3bf40f36fd5ee23204caeJason Sams "attribute vec4 a_color;\n" 1427920987182de225959a3bf40f36fd5ee23204caeJason Sams "attribute vec2 a_tex0;\n" 1437920987182de225959a3bf40f36fd5ee23204caeJason Sams "attribute vec2 a_tex1;\n" 1447920987182de225959a3bf40f36fd5ee23204caeJason Sams "varying vec4 v_color;\n" 1457920987182de225959a3bf40f36fd5ee23204caeJason Sams "varying vec2 v_tex0;\n" 1467920987182de225959a3bf40f36fd5ee23204caeJason Sams "varying vec2 v_tex1;\n" 14774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams "uniform vec2 u_texOff;\n" 1487920987182de225959a3bf40f36fd5ee23204caeJason Sams 1497920987182de225959a3bf40f36fd5ee23204caeJason Sams "void main() {\n" 1507920987182de225959a3bf40f36fd5ee23204caeJason Sams " v_color = a_color;\n" 1517920987182de225959a3bf40f36fd5ee23204caeJason Sams " v_tex0 = a_tex0;\n" 1527920987182de225959a3bf40f36fd5ee23204caeJason Sams " v_tex1 = a_tex1;\n" 15374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams " v_tex0.x += u_texOff.x;\n" 15474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams " v_tex1.y += u_texOff.y;\n" 1557920987182de225959a3bf40f36fd5ee23204caeJason Sams " gl_Position = a_pos;\n" 1567920987182de225959a3bf40f36fd5ee23204caeJason Sams "}\n"; 1577920987182de225959a3bf40f36fd5ee23204caeJason Sams 1587920987182de225959a3bf40f36fd5ee23204caeJason Samsstatic void setupVA() { 1597920987182de225959a3bf40f36fd5ee23204caeJason Sams static const float vtx[] = { 1607920987182de225959a3bf40f36fd5ee23204caeJason Sams -1.0f,-1.0f, 1617920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,-1.0f, 1627920987182de225959a3bf40f36fd5ee23204caeJason Sams -1.0f, 1.0f, 1637920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f, 1.0f }; 1647920987182de225959a3bf40f36fd5ee23204caeJason Sams static const float color[] = { 1657920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,0.0f,1.0f,1.0f, 1667920987182de225959a3bf40f36fd5ee23204caeJason Sams 0.0f,0.0f,1.0f,1.0f, 1677920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,1.0f,0.0f,1.0f, 1687920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,1.0f,1.0f,1.0f }; 1697920987182de225959a3bf40f36fd5ee23204caeJason Sams static const float tex0[] = { 1707920987182de225959a3bf40f36fd5ee23204caeJason Sams 0.0f,0.0f, 1717920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,0.0f, 17274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 0.0f,1.0f, 17374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 1.0f,1.0f }; 1747920987182de225959a3bf40f36fd5ee23204caeJason Sams static const float tex1[] = { 1757920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,0.0f, 1767920987182de225959a3bf40f36fd5ee23204caeJason Sams 1.0f,1.0f, 1777920987182de225959a3bf40f36fd5ee23204caeJason Sams 0.0f,1.0f, 1787920987182de225959a3bf40f36fd5ee23204caeJason Sams 0.0f,0.0f }; 1797920987182de225959a3bf40f36fd5ee23204caeJason Sams 1807920987182de225959a3bf40f36fd5ee23204caeJason Sams glEnableVertexAttribArray(A_POS); 1817920987182de225959a3bf40f36fd5ee23204caeJason Sams glEnableVertexAttribArray(A_COLOR); 1827920987182de225959a3bf40f36fd5ee23204caeJason Sams glEnableVertexAttribArray(A_TEX0); 1837920987182de225959a3bf40f36fd5ee23204caeJason Sams glEnableVertexAttribArray(A_TEX1); 1847920987182de225959a3bf40f36fd5ee23204caeJason Sams 1857920987182de225959a3bf40f36fd5ee23204caeJason Sams glVertexAttribPointer(A_POS, 2, GL_FLOAT, false, 8, vtx); 1867920987182de225959a3bf40f36fd5ee23204caeJason Sams glVertexAttribPointer(A_COLOR, 4, GL_FLOAT, false, 16, color); 1877920987182de225959a3bf40f36fd5ee23204caeJason Sams glVertexAttribPointer(A_TEX0, 2, GL_FLOAT, false, 8, tex0); 1887920987182de225959a3bf40f36fd5ee23204caeJason Sams glVertexAttribPointer(A_TEX1, 2, GL_FLOAT, false, 8, tex1); 1897920987182de225959a3bf40f36fd5ee23204caeJason Sams} 1907920987182de225959a3bf40f36fd5ee23204caeJason Sams 1917920987182de225959a3bf40f36fd5ee23204caeJason Samsstatic void randUniform(int pgm, const char *var) { 1927920987182de225959a3bf40f36fd5ee23204caeJason Sams int loc = glGetUniformLocation(pgm, var); 1937920987182de225959a3bf40f36fd5ee23204caeJason Sams if (loc >= 0) { 1947920987182de225959a3bf40f36fd5ee23204caeJason Sams float x = ((float)rand()) / RAND_MAX; 1957920987182de225959a3bf40f36fd5ee23204caeJason Sams float y = ((float)rand()) / RAND_MAX; 1967920987182de225959a3bf40f36fd5ee23204caeJason Sams float z = ((float)rand()) / RAND_MAX; 1977920987182de225959a3bf40f36fd5ee23204caeJason Sams float w = ((float)rand()) / RAND_MAX; 1987920987182de225959a3bf40f36fd5ee23204caeJason Sams glUniform4f(loc, x, y, z, w); 1997920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2007920987182de225959a3bf40f36fd5ee23204caeJason Sams} 2017920987182de225959a3bf40f36fd5ee23204caeJason Sams 20274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic void doLoop(bool warmup, int pgm, uint32_t passCount) { 20374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams if (warmup) { 2047920987182de225959a3bf40f36fd5ee23204caeJason Sams glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 2057920987182de225959a3bf40f36fd5ee23204caeJason Sams glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 2067920987182de225959a3bf40f36fd5ee23204caeJason Sams ptSwap(); 2077920987182de225959a3bf40f36fd5ee23204caeJason Sams glFinish(); 2087920987182de225959a3bf40f36fd5ee23204caeJason Sams return; 2097920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2107920987182de225959a3bf40f36fd5ee23204caeJason Sams 2117920987182de225959a3bf40f36fd5ee23204caeJason Sams startTimer(); 2127920987182de225959a3bf40f36fd5ee23204caeJason Sams glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 21374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams for (uint32_t ct=0; ct < passCount; ct++) { 21474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams int loc = glGetUniformLocation(pgm, "u_texOff"); 21574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glUniform2f(loc, ((float)ct) / passCount, ((float)ct) / 2.f / passCount); 21674b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 2177920987182de225959a3bf40f36fd5ee23204caeJason Sams randUniform(pgm, "u_color"); 2187920987182de225959a3bf40f36fd5ee23204caeJason Sams randUniform(pgm, "u_0"); 2197920987182de225959a3bf40f36fd5ee23204caeJason Sams randUniform(pgm, "u_1"); 2207920987182de225959a3bf40f36fd5ee23204caeJason Sams randUniform(pgm, "u_2"); 2217920987182de225959a3bf40f36fd5ee23204caeJason Sams randUniform(pgm, "u_3"); 2227920987182de225959a3bf40f36fd5ee23204caeJason Sams glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 2237920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2247920987182de225959a3bf40f36fd5ee23204caeJason Sams ptSwap(); 2257920987182de225959a3bf40f36fd5ee23204caeJason Sams glFinish(); 22674b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams endTimer(passCount); 22774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams} 22874b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 22974b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 23074b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic uint32_t rgb(uint32_t r, uint32_t g, uint32_t b) 23174b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams{ 23274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams uint32_t ret = 0xff000000; 23374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams ret |= r & 0xff; 23474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams ret |= (g & 0xff) << 8; 23574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams ret |= (b & 0xff) << 16; 23674b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams return ret; 2377920987182de225959a3bf40f36fd5ee23204caeJason Sams} 2387920987182de225959a3bf40f36fd5ee23204caeJason Sams 2397920987182de225959a3bf40f36fd5ee23204caeJason Samsvoid genTextures() { 2407920987182de225959a3bf40f36fd5ee23204caeJason Sams uint32_t *m = (uint32_t *)malloc(1024*1024*4); 2417920987182de225959a3bf40f36fd5ee23204caeJason Sams for (int y=0; y < 1024; y++){ 2427920987182de225959a3bf40f36fd5ee23204caeJason Sams for (int x=0; x < 1024; x++){ 24374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams m[y*1024 + x] = rgb(x, (((x+y) & 0xff) == 0x7f) * 0xff, y); 2447920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2457920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2467920987182de225959a3bf40f36fd5ee23204caeJason Sams glBindTexture(GL_TEXTURE_2D, 1); 2477920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, m); 2487920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 2497920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 2507920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 2517920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 2527920987182de225959a3bf40f36fd5ee23204caeJason Sams 2537920987182de225959a3bf40f36fd5ee23204caeJason Sams for (int y=0; y < 16; y++){ 2547920987182de225959a3bf40f36fd5ee23204caeJason Sams for (int x=0; x < 16; x++){ 25574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams m[y*16 + x] = rgb(x << 4, (((x+y) & 0xf) == 0x7) * 0xff, y << 4); 2567920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2577920987182de225959a3bf40f36fd5ee23204caeJason Sams } 2587920987182de225959a3bf40f36fd5ee23204caeJason Sams glBindTexture(GL_TEXTURE_2D, 2); 2597920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, m); 2607920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 2617920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 2627920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 2637920987182de225959a3bf40f36fd5ee23204caeJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 26474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams free(m); 2657920987182de225959a3bf40f36fd5ee23204caeJason Sams} 2667920987182de225959a3bf40f36fd5ee23204caeJason Sams 26774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Samsstatic void doSingleTest(uint32_t pgmNum, int tex) { 26874b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams const char *pgmTxt = gFragmentTests[pgmNum]->txt; 26974b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams int pgm = createProgram(gVertexShader, pgmTxt); 27074b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams if (!pgm) { 27174b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams printf("error running test\n"); 27274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams return; 27374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams } 27474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams int loc = glGetUniformLocation(pgm, "u_tex0"); 27574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams if (loc >= 0) glUniform1i(loc, 0); 27674b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams loc = glGetUniformLocation(pgm, "u_tex1"); 27774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams if (loc >= 0) glUniform1i(loc, 1); 27874b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 27974b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 28074b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glActiveTexture(GL_TEXTURE0); 28174b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glBindTexture(GL_TEXTURE_2D, tex); 28274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glActiveTexture(GL_TEXTURE1); 28374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glBindTexture(GL_TEXTURE_2D, tex); 28474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glActiveTexture(GL_TEXTURE0); 28574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 28674b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glBlendFunc(GL_ONE, GL_ONE); 28774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glDisable(GL_BLEND); 28874b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams //sprintf(str2, "%i, %i, %i, %i, %i, 0", 28974b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams //useVarColor, texCount, modulateFirstTex, extraMath, tex0); 29074b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams //doLoop(true, pgm, w, h, str2); 29174b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams //doLoop(false, pgm, w, h, str2); 29274b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams 29374b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams glEnable(GL_BLEND); 29474b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams sprintf(gCurrentTestName, "%s, %i, %i, 1", gFragmentTests[pgmNum]->name, pgmNum, tex); 29574b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams doLoop(true, pgm, 100); 29674b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams doLoop(false, pgm, 100); 29774b28e45c38d742a517ca95e29ab8cbbb1645fd5Jason Sams} 2987920987182de225959a3bf40f36fd5ee23204caeJason Sams 299