Name

    ARB_shader_draw_parameters

Name Strings

    GL_ARB_shader_draw_parameters

Contact

    Graham Sellers (graham.sellers 'at' amd.com)

Contributors

    Piers Daniell, NVIDIA
    Daniel Rakos, AMD
    Christophe Riccio, OpenGL Garden (!)
    Daniel Koch, NVIDIA

Notice

    Copyright (c) 2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by the ARB on June 3, 2013.
    Ratified by the Khronos Board of Promoters on July 19, 2013.

Version

    Last Modified Date: 29 May 2017
    Revision: 4

Number

    ARB Extension #156

Dependencies

    OpenGL 3.1 is required.

    This extension is written against Version 4.3 of the Core Profile OpenGL
    Specification, dated February 14, 2013 and Version 4.30 of the OpenGL
    Shading Language Specification, dated February 7, 2013.

    The presence of the GL_ARB_multi_draw_indirect extension affects the
    definition of this extension.

    The GL_ARB_indirect_parameters extension affects the definition of this
    extension.

Overview

        In unextended GL, vertex shaders have inputs named gl_VertexID and
    gl_InstanceID, which contain, respectively the index of the vertex and
    instance. The value of gl_VertexID is the implicitly passed index of the
    vertex being processed, which includes the value of baseVertex, for those
    commands that accept it. Meanwhile, gl_InstanceID is the integer index
    of the current instance being processed, but, even for commands that
    accept a baseInstance parameter, it does not include the value of this
    argument. Furthermore, the equivalents to these variables in other
    graphics APIs do not necessarily follow these conventions. The reason for
    this inconsistency is that there are legitimate use cases for both
    inclusion and exclusion of the baseVertex or baseInstance parameters
    in gl_VertexID and gl_InstanceID, respectively.

        Rather than change the semantics of either built-in variable, this
    extension adds two new built-in variables to the GL shading language,
    gl_BaseVertexARB and gl_BaseInstanceARB, which contain the values passed
    in the baseVertex and baseInstance parameters, respectively. Shaders
    provided by the application may use these variables to offset gl_VertexID
    or gl_InstanceID if desired, or use them for any other purpose.

        Additionally, this extension adds a further built-in variable, gl_DrawID
    to the shading language. This variable contains the index of the draw
    currently being processed by a Multi* variant of a drawing command (such
    as MultiDrawElements or MultiDrawArraysIndirect).

New Procedures and Functions

    None.

New Tokens

    None.

IP Status

    No known IP claims.

Additions to Chapter 10 of the OpenGL Core Profile Specification, "Vertex
Specification and Drawing Commands"

    Add the following after the pseudo-code describing MultiDrawArrays on
    p.310:

        The index of the draw (<i> in the above pseudo-code) may be read by
    a vertex shader as <gl_DrawIDARB>, as described in Section 11.1.3.9.

    Add the following after the pseudo-code describing MultiDrawArraysIndirect
    on p.311:

        The index of the draw (<i> in the above pseudo-code) may be read by
    a vertex shader as <gl_DrawIDARB>, as described in Section 11.1.3.9.

    Add the following after the pseudo-code describing MultiDrawElements on
    p.313:

        The index of the draw (<i> in the above pseudo-code) may be read by
    a vertex shader as <gl_DrawIDARB>, as described in Section 11.1.3.9.

    Add the following after the pseudo-code describing
    MultiDrawElementsIndirect on p.316:

        The index of the draw (<i> in the above pseudo-code) may be read by
    a vertex shader as <gl_DrawIDARB>, as described in Section 11.1.3.9.

    Add the following after the pseudo-code describing
    MultiDrawElementsBaseVertex on p.316:

        The index of the draw (<i> in the above pseudo-code) may be read by
    a vertex shader as <gl_DrawIDARB>, as described in Section 11.1.3.9.

Additions to Chapter 11 of the OpenGL Core Profile Specification, "Programmable
Vertex Processing"

    In Section 11.1.1, "Vertex Attributes", in the description of
    GetActiveAttrib, state that gl_DrawIDARB is enumerated:

        For GetActiveAttrib, all active vertex shader input variables are
    enumerated, including the special built-in inputs gl_VertexID,
    gl_BaseVertexARB, gl_InstanceID, gl_BaseInstanceARB, and gl_DrawIDARB.

    Replace the paragraphs describing gl_VertexID and gl_InstanceID in Section
    11.1.3.9, "Shader Inputs" with the following:

        Besides having access to vertex attributes and uniform variables,
    vertex shaders can access the read-only built-in variables gl_VertexID,
    gl_InstanceID, gl_BaseVertexARB, gl_BaseInstanceARB and gl_DrawIDARB.

        <gl_VertexID> holds ... (retain original language)

        <gl_BaseVertexARB> holds the integer value passed to the <baseVertex>
    parameter to the command that resulted in the current shader invocation.
    In the case where the command has no <baseVertex> parameter, the value
    of <gl_BaseVertexARB> is zero.

        <gl_InstanceID> holds ... (retain original language)

        <gl_BaseInstanceARB> holds the integer value passed to the
    <baseInstance> parameter to the command that resulted in the current
    shader invocation. In the case where the command has no <baseInstance>
    parameter, the value of <gl_BaseInstanceARB> is zero.

    Add the following paragraph after the above discussion of <gl_InstanceID>:

        <gl_DrawIDARB> holds the integer draw number the current draw being
    processed by the shader invocation. It is dynamically uniform. In
    MultiDraw* variants, this is the zero-based index of the draw within the
    list of draws processed by the command. In non-MultiDraw* commands, the
    value of <gl_DrawIDARB> is always zero.

Errors

    None.

New State

    None.

Modifications to Chapter 7 of the OpenGL Shading Language Specification,
Version 4.30.

    Including the following line in a shader can be used to control the
    language features described in this extension:

        #extension GL_ARB_shader_draw_parameters : <behavior>

    where <behavior> is as described in Section 3.3.

    A new preprocessor #define is added to the OpenGL Shading Language:

      #define GL_ARB_shader_draw_parameters     1

    In Section 7.1, "Built-in Language Variables", add the following to the
    list of input variables to a vertex shader, p.110:

        in int      gl_DrawIDARB;
        in int      gl_BaseVertexARB;
        in int      gl_BaseInstanceARB;

    Add the following paragraph after the description of gl_InstanceID, p.114:

        The variable <gl_DrawIDARB> is a vertex language input variable that
    holds the integer index of the drawing command to which the current vertex
    belongs (see "Shader Inputs" in section 11.1.3.9 of the OpenGL Graphics
    System Specification). If the vertex is not invoked by a Multi* form of
    a draw command, then the value of gl_DrawIDARB is zero.

        The variable <gl_BaseVertexARB> is a vertex language input variable
    that holds the integer value passed to the <baseVertex> parameter of the
    command that resulted in the current shader invocation (see "Shader Inputs"
    in section 11.1.3.9 of the OpenGL Graphics System Specification).

        The variable <gl_BaseInstanceARB> is a vertex language input variable
    that holds the integer value passed to the <baseInstance> parameter of
    the command that resulted in the current shader invocation (see "Shader
    Inputs" in section 11.1.3.9 of the OpenGL Graphics System Specification).

Usage Examples

--- Example 1 ---
--- Using a different transformation matrix per draw ---
--- Some draws can share the same matrix ---

    layout(binding = INDIRECTION) uniform indirection
    {
        int Transform[MAX_DRAW];
    } Indirection;

    layout(binding = TRANSFORM0) uniform transform
    {
        mat4 MVP[MAX_DRAW];
    } Transform;

    layout(location = POSITION) in vec3 Position;
    layout(location = TEXCOORD) in vec3 Texcoord;

    out gl_PerVertex
    {
        vec4 gl_Position;
    };

    out block
    {
        vec2 Texcoord;
    } Out;

    void main()
    {
        Out.Texcoord = Texcoord.st;
        gl_Position = Transform.MVP[Indirection.Transform[gl_DrawIDARB]] *
                      vec4(Position, 1.0);
    }

Dependencies on GL_ARB_multi_draw_indirect

    If GL_ARB_multi_draw_indirect is not supported, remove the language added
    after the pseudo-code describing MultiDrawArraysIndirect and
    MultiDrawElementsIndirect.

Dependencies on GL_ARB_indirect_parameters

    Whilst not a true dependency, it should be noted that the additional
    commands introduced by ARB_indirect_parameters affect the value of
    gl_DrawIDARB.

Issues

    1) -

    2) -

    3) What is the value of gl_DrawIDARB for non-Multi* draws?

       RESOLVED: Zero.

    4) Do we need language to clarify that gl_DrawIDARB is a dynamically
       uniform expression?

       RESOLVED: Yes, this allows accessing resources per-draw.

    5) -

    6) -

Revision History

    Rev.    Date      Author    Changes
    ----  --------    --------  -----------------------------------------

     1    05/16/2013  gsellers  Initial draft
     2    05/29/2013  gsellers  Add descriptions of gl_BaseVertexARB and
                                gl_BaseInstanceARB.
                                Document pseudo-dependency on
                                ARB_indirect_parameters.
     3    06/05/2013  gsellers  Remove controls over gl_VertexID and
                                gl_InstanceID, leaving only the
                                gl_BaseVertexARB and gl_BaseInstanceARB
                                variables. gl_DrawIDARB is unmodified.
                                Issues 1, 2, 5 and 6 become non-issues as
                                a result.
     4    05/29/2017  dgkoch    remove edit reference to non-existant
                                MultiDrawElementsInstancedBaseInstance function.
                                Fix typos.

