Consider the following code, which prints out the name of uniforms in a program:

Code :
GLint numUniforms;
glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numUniforms);
 
std::cout << "Num uniforms: " << numUniforms << "\n";
 
for(int ix = 0; ix < numUniforms; ++ix)
{
	GLint length;
	glGetActiveUniformsiv(program, 1, (GLuint*)&ix, GL_UNIFORM_NAME_LENGTH, &length);
 
	std::vector<GLchar> str(length);
	glGetActiveUniformName(program, ix, length, NULL, &str[0]);
	std::string name(str.begin(), str.end());
	std::cout << ix << ":\t" << name << "\n";
}

Now considering the following Vertex Shader:

Code :
#version 330
 
uniform BlockName
{
  float a_name;
} instance_name;
 
uniform float a_name;
 
in vec3 position;
 
void main()
{
	gl_Position.xyz = position.xyz * a_name * instance_name.a_name;
	gl_Position.w = 1.0;
}

If the fragment shader has no other uniforms, we would expect to see 2 uniforms come out of this code. And on both NVIDIA and AMD drivers, I do. The problem is what they're named.

On AMD, they're called "a_name" and "instance_name.a_name". On NVIDIA, they're called "a_name" and "BlockName.a_name".

I'm fairly sure NVIDIA is correct here, but I can't say that they are because... the actual OpenGL spec does not say. Or if it does, I certainly can't find it.

So one of them is wrong. Or maybe both are. I don't know. Does anyone know? Will the ARB ever bother clarifying it?