Light | Dark

# docs.GL

OpenGL ES 3
OpenGL ES 2

# glGetProgramiv

## Name

glGetProgramiv — Returns a parameter from a program object

## C Specification

`void glGetProgramiv(` | GLuint program,
| GLenum pname,
| GLint *params`)`;

## Parameters

`program`

  Specifies the program object to be queried.

`pname`

  Specifies the object parameter. Accepted symbolic names are `GL_ACTIVE_ATOMIC_COUNTER_BUFFERS`, `GL_ACTIVE_ATTRIBUTES`, `GL_ACTIVE_ATTRIBUTE_MAX_LENGTH`, `GL_ACTIVE_UNIFORMS`, `GL_ACTIVE_UNIFORM_BLOCKS`, `GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH`, `GL_ACTIVE_UNIFORM_MAX_LENGTH`, `GL_ATTACHED_SHADERS`, `GL_COMPUTE_WORK_GROUP_SIZE`, `GL_DELETE_STATUS`, `GL_INFO_LOG_LENGTH`, `GL_LINK_STATUS`, `GL_PROGRAM_BINARY_RETRIEVABLE_HINT`, `GL_PROGRAM_SEPARABLE`, `GL_TRANSFORM_FEEDBACK_BUFFER_MODE`, `GL_TRANSFORM_FEEDBACK_VARYINGS`, `GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH` and `GL_VALIDATE_STATUS`.

`params`

  Returns the requested object parameter.

## Description

`glGetProgramiv` returns in `params` the value of a parameter for a specific program object. The following parameters are defined:

`GL_ACTIVE_ATOMIC_COUNTER_BUFFERS`

  `params` returns the number of active attribute atomic counter buffers used by `program`.

`GL_ACTIVE_ATTRIBUTES`

  `params` returns the number of active attribute variables for `program`.

`GL_ACTIVE_ATTRIBUTE_MAX_LENGTH`

  `params` returns the length of the longest active attribute name for `program`, including the null termination character (i.e., the size of the character buffer required to store the longest attribute name). If no active attributes exist, 0 is returned.

`GL_ACTIVE_UNIFORM_BLOCKS`

  `params` returns the number of uniform blocks for `program` containing active uniforms.

`GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH`

  `params` returns the length of the longest active uniform block name for `program`, including the null termination character (i.e., the size of the character buffer required to store the longest uniform block name). If no active uniform blocks exist, 0 is returned.

`GL_ACTIVE_UNIFORMS`

  `params` returns the number of active uniform variables for `program`.

`GL_ACTIVE_UNIFORM_MAX_LENGTH`

  `params` returns the length of the longest active uniform variable name for `program`, including the null termination character (i.e., the size of the character buffer required to store the longest uniform variable name). If no active uniform variables exist, 0 is returned.

`GL_ATTACHED_SHADERS`

  `params` returns the number of shader objects attached to `program`.

`GL_COMPUTE_WORK_GROUP_SIZE`

  `params` returns an array of three integers containing the local work group size of the compute program as specified by its input layout qualifier(s). `program` must be the name of a program object that has been previously linked successfully and contains a binary for the compute shader stage.

`GL_DELETE_STATUS`

  `params` returns `GL_TRUE` if `program` is currently flagged for deletion, and `GL_FALSE` otherwise.

`GL_INFO_LOG_LENGTH`

  `params` returns the number of characters in the information log for `program` including the null termination character (i.e., the size of the character buffer required to store the information log). If `program` has no information log, a value of 0 is returned.

`GL_LINK_STATUS`

  `params` returns `GL_TRUE` if the last link operation on `program` was successful, and `GL_FALSE` otherwise.

`GL_PROGRAM_BINARY_RETRIEVABLE_HINT`

  `params` returns the current value of whether the binary retrieval hint is enabled for `program`.

`GL_PROGRAM_SEPARABLE`

  `params` returns `GL_TRUE` if the program has been flagged for use as a separable program object that can be found to individual shader stages with glUseProgramStages.

`GL_TRANSFORM_FEEDBACK_BUFFER_MODE`

  `params` returns a symbolic constant indicating the buffer mode used when transform feedback is active. This may be `GL_SEPARATE_ATTRIBS` or `GL_INTERLEAVED_ATTRIBS`.

`GL_TRANSFORM_FEEDBACK_VARYINGS`

  `params` returns the number of varying variables to capture in transform feedback mode for the program.

`GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH`

  `params` returns the length of the longest variable name to be used for transform feedback, including the null-terminator.

`GL_VALIDATE_STATUS`

  `params` returns `GL_TRUE` or if the last validation operation on `program` was successful, and `GL_FALSE` otherwise.

## Notes

If an error is generated, no change is made to the contents of `params`.

## Errors

`GL_INVALID_VALUE` is generated if `program` is not a value generated by OpenGL.

`GL_INVALID_OPERATION` is generated if `program` does not refer to a program object.

`GL_INVALID_ENUM` is generated if `pname` is not an accepted value.

## Associated Gets

glGetActiveAttrib with argument `program`

glGetActiveUniform with argument `program`

glGetAttachedShaders with argument `program`

glGetProgramInfoLog with argument `program`

glIsProgram

## Examples

Compile a program from a vertex shader and a fragment shader.

    GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vshader, 1, &vertex_shader_source, NULL); // vertex_shader_source is a GLchar* containing glsl shader source code
    glCompileShader(vshader);

    GLint vertex_compiled;
    glGetShaderiv(vshader, GL_COMPILE_STATUS, &vertex_compiled);
    if (vertex_compiled != GL_TRUE)
    {
        GLsizei log_length = 0;
        GLchar message[1024];
        glGetShaderInfoLog(vshader, 1024, &log_length, message);
        // Write the error to a log
    }

    GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fshader, 1, &fragment_shader_source, NULL); // fragment_shader_source is a GLchar* containing glsl shader source code
    glCompileShader(fshader);

    GLint fragment_compiled;
    glGetShaderiv(fshader, GL_COMPILE_STATUS, &fragment_compiled);
    if (fragment_compiled != GL_TRUE)
    {
        GLsizei log_length = 0;
        GLchar message[1024];
        glGetShaderInfoLog(fshader, 1024, &log_length, message);
        // Write the error to a log
    }

    GLuint program = glCreateProgram();

    // This step is unnecessary if you use the location specifier in your shader
    // e.g. layout (location = 0) in vec3 position;
    glBindAttribLocation(program, 0, "position"); // The index passed into glBindAttribLocation is
    glBindAttribLocation(program, 1, "texcoord"); // used by glEnableVertexAttribArray. "position"
    glBindAttribLocation(program, 2, "normal");   // "texcoord" "normal" and "color" are the names of the
    glBindAttribLocation(program, 3, "color");    // respective inputs in your fragment shader.

    glAttachShader(program, vshader);
    glAttachShader(program, fshader);
    glLinkProgram(program);

    GLint program_linked;
    glGetProgramiv(program, GL_LINK_STATUS, &program_linked);
    if (program_linked != GL_TRUE)
    {
        GLsizei log_length = 0;
        GLchar message[1024];
        glGetProgramInfoLog(program, 1024, &log_length, message);
        // Write the error to a log
    }

Retrieve uniform data after the shader has been compiled

    // The index returned from these GLint functions gets passed to glEnableVertexAttribArray during rendering.
    GLint position_attrib_index = glGetAttribLocation(program, "position"); // program is what is returned by glCreateProgram.
    GLint texcoord_attrib_index = glGetAttribLocation(program, "texcoord");
    GLint normal_attrib_index = glGetAttribLocation(program, "normal");
    GLint color_attrib_index = glGetAttribLocation(program, "color");

    glBindFragDataLocation(program, 0, "output_color"); // "output_color" is an output value in your vertex shader and an input value in your fragment shader.

    GLint num_uniforms;
    glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &num_uniforms);
    GLchar uniform_name[256];
    GLsizei length;
    GLint size;
    GLenum type;
    for (int i = 0; i < num_uniforms; i++)
    {
        glGetActiveUniform(program, i, sizeof(uniform_name), &length, &size, &type, uniform_name);
        // ... save this uniform data so it can be used during rendering
    }

## API Version Support

| OpenGL ES API Version
--- | ---
Function Name | 2.0 | 3.0 | 3.1
glGetProgramiv | ✔ | ✔ | ✔

## See Also

glAttachShader, glCreateProgram, glDeleteProgram, glGetShaderiv, glLinkProgram, glValidateProgram

## Copyright

Copyright © 2003-2005 3Dlabs Inc. Ltd. Copyright © 2010-2014 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. https://opencontent.org/openpub/.

Think you can improve this page? Edit this page on GitHub.