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()
{ = * 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?