diff options
-rw-r--r-- | src/mesa/main/uniforms.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 3236d6eb064..66522510f70 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -643,6 +643,7 @@ _mesa_GetActiveUniformBlockiv(GLuint program, GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg; struct gl_uniform_block *block; + unsigned i; if (!ctx->Extensions.ARB_uniform_buffer_object) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv"); @@ -668,10 +669,39 @@ _mesa_GetActiveUniformBlockiv(GLuint program, params[0] = block->Binding; return; + case GL_UNIFORM_BLOCK_DATA_SIZE: + params[0] = block->UniformBufferSize; + return; + case GL_UNIFORM_BLOCK_NAME_LENGTH: params[0] = strlen(block->Name) + 1; return; + case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: + params[0] = block->NumUniforms; + return; + + case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: + for (i = 0; i < block->NumUniforms; i++) { + unsigned offset; + params[i] = _mesa_get_uniform_location(ctx, shProg, + block->Uniforms[i].Name, + &offset); + } + return; + + case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: + params[0] = shProg->UniformBlockStageIndex[MESA_SHADER_VERTEX][uniformBlockIndex] != -1; + return; + + case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER: + params[0] = shProg->UniformBlockStageIndex[MESA_SHADER_GEOMETRY][uniformBlockIndex] != -1; + return; + + case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: + params[0] = shProg->UniformBlockStageIndex[MESA_SHADER_FRAGMENT][uniformBlockIndex] != -1; + return; + default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetActiveUniformBlockiv(pname 0x%x (%s))", |