I fiddled around with the test and I was able to use varying vec4 
var_in[13] as a max in one array. 14 - 16 resulted in a segmentation 
fault and 17 resulted in glLinK failure error.

I was able to create a second array of varying vec4 testa[3] though 
and it compiled successfully resulting in 64 varyings. I'll attach what I 
did.
#include <GL/gl.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

void init(void)
{
    GLuint shader = glCreateShader(GL_FRAGMENT_SHADER), shader2 = glCreateShader(GL_VERTEX_SHADER);
    GLuint prog;
    char log[4096];
    GLsizei len;

    const char *code =
           "varying vec4 var_in[13];"
         //"varying vec4 gl_Color;"
         //"varying vec4 gl_SecondaryColor;"
         //"varying vec4 gl_TexCoord[];"
           "varying vec4 testa[3];"  // second array
           "int counter;"
           "int countera;"           // for second for loop
           "uniform ivec4 controla;" // for second for loop
           "uniform ivec4 control;"
         /*"const ivec4 control = ivec4(0, 5, 1, 0);" */
           "void main() {"
           "    gl_FragColor = vec4(0.0);"
           "    for(counter = control.y; counter < control.x; counter+control.z) {"
         /*"        gl_FragColor += gl_TexCoord[counter + 0];"   -- resulted in mismatch semantics */
           "        gl_FragColor += var_in[counter + 0];"
         //"        gl_Color;"
         //"        gl_SecondaryColor;"
         //"        gl_TexCoord[0];"
         //"        gl_FogFragCoord;"
           "    }"
           "    for(countera = controla.y; countera < controla.x; countera+controla.z) {"
           "        gl_FragColor += testa[countera + 0];"
           "    }"
           "}";
    const char *codev =
            "varying vec4 var_in[13];"
            "uniform vec4 param[16];"
            //"varying vec4 gl_FrontColor;"
            //"varying vec4 gl_BackColor;"
            //"varying vec4 gl_FrontSecondaryColor;"
            //"varying vec4 gl_BackSecondaryColor;"
            //"varying vec4 gl_TexCoord[];"
            "varying vec4 testa[3];" // second array
            "void main() {"
            "    var_in[0] = param[0];"
            "    var_in[1] = param[1];"
            "    var_in[2] = param[2];"
            "    var_in[3] = param[3];"
            "    var_in[4] = param[4];"
            "    var_in[5] = param[5];"
            "    var_in[6] = param[6];"
            "    var_in[7] = param[7];"
            "    var_in[8] = param[8];"
            "    var_in[9] = param[9];"
            "    var_in[10] = param[10];"
            "    var_in[11] = param[11];"
            "    var_in[12] = param[12];"
            "    testa[0] = param[13];"
            "    testa[1] = param[14];"
            "    testa[2] = param[15];"
            //"    gl_FrontColor = param[13];"
            //"    gl_BackColor = param[14];"
            //"    gl_FrontSecondaryColor = param[15];"
            //"    gl_BackSecondaryColor = param[16];"
            //"    gl_TexCoord[0];"
            //"    gl_FogFragCoord = float(0.0);"
            "    gl_Position = vec4(0.0);"
            "}";

    glShaderSource(shader, 1, &code, 0);
    glCompileShader(shader);
    glGetShaderInfoLog(shader, sizeof(log), &len, log);
    printf("%s\n", log);
    glShaderSource(shader2, 1, &codev, 0);
    glCompileShader(shader2);        // changed from shader to shader2
    glGetShaderInfoLog(shader2, sizeof(log), &len, log); // same here
    printf("%s\n", log);

    prog = glCreateProgram();
    glAttachShader(prog, shader);
    glAttachShader(prog, shader2);
    glLinkProgram(prog);
    glGetInfoLogARB(prog, sizeof(log), NULL, log);
    printf("link:\n");
    printf("%s\n", log);
    printf("end link:\n");
    printf("error: %d\n", glGetError());
return;
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (200, 200);
   glutCreateWindow (argv[0]);
   init();
   return 0;
}



Reply via email to