If I read the spec correctly, textureQueryLevels() should return zero if the texture has no image specified. However in my test it returns 1 for both the default texture and a newly created texture with no image specified. Is that a driver bug?
Test program, which shows a red window on my computer (expecting green):
#include <cstdio>
#include <GL/glew.h>
#include <GL/freeglut.h>
GLuint program;
GLuint texture;
char const* vertex_shader_src =
"#version 430 compatibility\n"
"void main() { gl_Position = gl_Vertex; }\n"
;
char const* fragment_shader_src =
"#version 430 compatibility\n"
"layout(binding = 0) uniform sampler2D texture0;\n"
"void main() { gl_FragColor = textureQueryLevels(texture0) > 0 ? vec4(1.0, 0.0, 0.0, 1.0) : vec4(0.0, 1.0, 0.0, 1.0); }\n"
;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glVertex2d(-1, -1);
glVertex2d(+1, -1);
glVertex2d(+1, +1);
glVertex2d(-1, +1);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glUseProgram(0);
glutSwapBuffers();
glutPostRedisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL | GLUT_DOUBLE);
glutInitWindowSize(1280, 720);
glutCreateWindow("OpenGL Window");
glewInit();
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_src, nullptr);
glCompileShader(vertex_shader);
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_src, nullptr);
glCompileShader(fragment_shader);
program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
GLchar log[1024];
GLsizei logLen = 0;
glGetProgramInfoLog(program, sizeof(log), &logLen, log);
printf("%s\n", log);
glGenTextures(1, &texture);
printf("Texture ID: %d\n", (int)texture);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}