glGetActiveUniformBlock on ATI

Hi,

I’m trying to query the uniform block name in the following shader:


#version 150
                 
layout(std140) uniform RedBlock
{
    uniform float red;
};

out vec4 FragColor;

void main()
{
    FragColor = vec4(red, 0, 0, 1);
}

On an ATI Radeon HD 5870 with Catalyst 10.4, glGetActiveUniformBlockName(program, 0, …) returns “” instead of “RedBlock.” Although, calls to glGetActiveUniformBlock(program, 0, …) return correct data. I am fairly new to UBOs so I may be doing something wrong but this code works on the NVIDIA cards I tried.

Regards,
Patrick

How do you know that it is uniform block index 0?

I called GetProgramiv with ACTIVE_UNIFORM_BLOCKS and it returned one. Perhaps, I’ve misunderstood glGetActiveUniformBlockName in the spec but I thought that meant the uniform block must be at index zero:

uniformBlockIndex must be an active uniform block index of program, in the range zero to the value of ACTIVE_UNIFORM_BLOCKS - 1. The value of ACTIVE_-UNIFORM_BLOCKS can be queried with GetProgramiv…

If there is another way I should be querying uniform blocks, I’d be happy to do it.

Here’s my code (C#/OpenTK):


private static UniformBlockCollection FindUniformBlocks(int program)
{
    int numberOfUniformBlocks;
    GL.GetProgram(program, ProgramParameter.ActiveUniformBlocks, out numberOfUniformBlocks);

    UniformBlockCollection uniformBlocks = new UniformBlockCollection();
    for (int i = 0; i < numberOfUniformBlocks; ++i)
    {
        string uniformBlockName = GL.GetActiveUniformBlockName(program, i);

        int uniformBlockSizeInBytes;
        GL.GetActiveUniformBlock(program, i, ActiveUniformBlockParameter.UniformBlockDataSize, out uniformBlockSizeInBytes);

        int numberOfUniformsInBlock;
        GL.GetActiveUniformBlock(program, i, ActiveUniformBlockParameter.UniformBlockActiveUniforms, out numberOfUniformsInBlock);

        int[] uniformIndicesInBlock = new int[numberOfUniformsInBlock];
        GL.GetActiveUniformBlock(program, i, ActiveUniformBlockParameter.UniformBlockActiveUniformIndices, uniformIndicesInBlock);

        ...

Only the call to GL.GetActiveUniformBlockName returns incorrect data, the later calls to GL.GetActiveUniformBlock return correct information.

Regards,
Patrick

Yep, I have same issue with UBO on the current ATI 3.3/4.0 beta drivers - this lead me to abandon UBO instancing support in my engine (for now) and use TBO instead.

Yes, the first block will have an index of 0!
My code, however, relys upon obtaining the index from the blockname - so this had to work — and it does NOT!

This is no longer an issue in AMD OpenGL drivers.