[Mesa-users] GL_ACTIVE_UNIFORMS returns unexpected value
Brian Paul
brianp at vmware.com
Thu Mar 19 07:20:28 PDT 2015
On 03/19/2015 04:16 AM, Lascha Lagidse wrote:
> On 3/18/2015 6:12 PM, Brian Paul wrote:
>> On 03/18/2015 09:37 AM, Lascha Lagidse wrote:
>>> Hello :)
>>>
>>> I am Lascha, new to linux and first time subscribing to a mailing list.
>>> I heard you were great guys ;)
>>
>> We try to be. :)
>>
>>
>>> So, I am currently in the process of porting the game Age of Wonders 3
>>> to Linux. The game is currently in open-beta on Steam, and people
>>> reported issues with the specifically the Mesa graphics driver. I had a
>>> look and it looks like this driver behaves differently on this driver
>>> when using glGetProgramiv and glGetActiveUniform.
>>>
>>> The vertex shader (see bottom) is attached to a program. The program is
>>> then linked. Note: Only this vertex shader is attached to the program;
>>> there is no other shader attached. Now using glGetProgramiv with
>>> GL_ACTIVE_UNIFORMS will return 2, but I expect it to be 3 like on the
>>> other drivers. According to glGetActiveUniform it is the variable 'c24'
>>> which is missing. My guess is that it's optimized away, for some reason.
>>> If I also link the fragment shader, then 'c24' is listed correctly.
>>>
>>> My goal is to retrieve the active uniforms from specifically the vertex
>>> shader. If I link both the vertex AND the fragment program, then there
>>> is no way to distinguish which uniforms belong to the vertex program and
>>> which belong to the fragment program (or is there?).
>>>
>>> I can't think of a nice work-around; but since this is only
>>> initialization code the only work-around that comes to mind is to
>>> serialize the info I get from glGetActiveUniform on another driver and
>>> use that info instead of calling glGetActiveUniform at initialization.
>>>
>>> #version 140
>>> uniform mat4 c20;
>>> uniform vec4 c24;
>>> uniform vec4 c25;
>>> in vec3 POSITION0;
>>> in vec2 TEXCOORD0;
>>> out vec2 xlv_TEXCOORD0;
>>> void main ()
>>> {
>>> vec4 PosWS_1;
>>> PosWS_1.xy = (c25.xy + (POSITION0.xy * c25.zw));
>>> PosWS_1.z = POSITION0.z;
>>> PosWS_1.w = 1.0;
>>> gl_Position = (c20 * PosWS_1);
>>> xlv_TEXCOORD0 = (c24.xy + (TEXCOORD0 * c24.zw));
>>> }
>>
>> Which version of Mesa are you using? Would it be possible to get a
>> simple glut/piglit test program?
>>
>> -Brian
>>
> Sorry if you're receiving this multiple times. I think I should have
> used 'Reply All' instead of 'Reply'. Realized this too late.
>
> I'm using "3.3 (Core profile) Mesa 10.3.2" (according to GL_VERSION).
>
> Here is a simple test program. It uses freeglut and glew. I hope that's
> okay.
>
> #include <GL/glew.h>
> #include <GL/freeglut.h>
> #include <stdlib.h>
> #include <cstdio>
> #include <cstring>
>
> int main(int argc, char *argv[])
> {
> glutInit(&argc, argv);
> glutInitWindowSize(128,128);
> glutInitWindowPosition(10,10);
> glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
> glutInitContextVersion(3, 3);
> glutInitContextFlags(GLUT_CORE_PROFILE);
> glutCreateWindow("LinuxShaderBug");
> glewInit();
>
> printf("version: %s\n", glGetString(GL_VERSION));
>
> const GLchar* shader_code = "#version 140\n\
> uniform mat4 c20;\n\
> uniform vec4 c24;\n\
> uniform vec4 c25;\n\
> in vec3 POSITION0;\n\
> in vec2 TEXCOORD0;\n\
> out vec2 xlv_TEXCOORD0;\n\
> void main ()\n\
> {\n\
> vec4 PosWS_1;\n\
> PosWS_1.xy = (c25.xy + (POSITION0.xy * c25.zw));\n\
> PosWS_1.z = POSITION0.z;\n\
> PosWS_1.w = 1.0;\n\
> gl_Position = (c20 * PosWS_1);\n\
> xlv_TEXCOORD0 = (c24.xy + (TEXCOORD0 * c24.zw));\n\
> }\n";
>
> const GLchar* shader_code_array[1] = { shader_code };
> const GLint shader_size_array[1] = { strlen(shader_code) };
> GLuint shader_handle = glCreateShader(GL_VERTEX_SHADER);
> glShaderSource(shader_handle, 1, shader_code_array, shader_size_array);
> glCompileShader(shader_handle);
>
> GLuint program_handle = glCreateProgram();
> glAttachShader(program_handle, shader_handle);
> glLinkProgram(program_handle);
>
> GLint num_uniforms = 0;
> glGetProgramiv(program_handle, GL_ACTIVE_UNIFORMS, &num_uniforms);
> printf("num_uniforms: %i\n", num_uniforms);
>
> char u_name[32];
> GLsizei u_name_len = 0;
> GLint u_size = 0;
> GLenum u_type = GL_NONE;
> GLint u_idx = 0;
>
> for (u_idx = 0; u_idx < num_uniforms; ++u_idx)
> {
> glGetActiveUniform(program_handle, u_idx, 31, &u_name_len, &u_size,
> &u_type, &u_name[0]);
> printf("u_name: %s\n", u_name);
> }
>
> return EXIT_SUCCESS;
> }
Thanks. Looks like it's the same with current Mesa from git. Seems
like a bug to me. I'll probably convert your test to a piglit test.
Not sure if I'll have time to debug this, bug I can file a bug anyway.
-Brian
More information about the mesa-users
mailing list