Can you find error in this test of sampler array?
It renders correctly on both GEFORCE and RADEON cards, but RADEONs throw GL_INVALID_OPERATION in glEnd.
It is so simplified, that it creates no fragments and sampler lookup is dead code, but GL_INVALID_OPERATION is still present.
Bigger version with array longer than 1 compiles and links without errors, but renders incorrectly on RADEONs.
#include <GL/glew.h>
#include <GL/glut.h>
GLuint shadowmap;
GLint program;
void display()
{
glUseProgram(program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,shadowmap);
GLint zero=0;
glUniform1iv(glGetUniformLocation(program,"shadowMap"),1,&zero);
glBegin(GL_TRIANGLES);
glVertex3f(0,0,0);
glVertex3f(0,0,0);
glVertex3f(0,0,0);
glEnd(); // throws GL_INVALID_OPERATION with Radeon, Catalyst 6.12
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(640,480);
glutCreateWindow("test");
glutDisplayFunc(display);
glewInit();
glGenTextures(1,&shadowmap);
glBindTexture(GL_TEXTURE_2D,shadowmap);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,64,64,0,GL_DEPTH_COMPONENT,GL_UNSIGNED_BYTE,0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_MODE,GL_COMPARE_R_TO_TEXTURE);
program = glCreateProgram();
GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar* strings[] = {"uniform sampler2DShadow shadowMap[1]; void main() { shadow2DProj(shadowMap[0], gl_FragCoord); gl_FragColor = vec4(1.0,1.0,1.0,1.0); }"};
glShaderSource(shader,1,strings,0);
glCompileShader(shader);
glAttachShader(program,shader);
glLinkProgram(program);
glutMainLoop();
return 0;
}