fill_common.cpp revision e6f43ddce78d6846af12550ff9193c5c6fe5844b
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