2010-2014
Khronos Group.
glDrawArraysIndirect
3G

# glDrawArraysIndirect

render primitives from array data, taking parameters from memory

## C Specification

                    void glDrawArraysIndirect
                    GLenum mode
                    const void *indirect

## Parameters

`mode`

  Specifies what kind of primitives to render. Symbolic constants `GL_POINTS`, `GL_LINE_STRIP`, `GL_LINE_LOOP`, `GL_LINES`, `GL_TRIANGLE_STRIP`, `GL_TRIANGLE_FAN`, and `GL_TRIANGLES` are accepted.

`indirect`

  Specifies the address of a structure containing the draw parameters.

## Description

`glDrawArraysIndirect` specifies multiple geometric primitives with very few subroutine calls. `glDrawArraysIndirect` behaves similarly to glDrawArraysInstanced, execept that the parameters to glDrawArraysInstanced are stored in memory at the address given by `indirect`.

The parameters addressed by `indirect` are packed into a structure that takes the form (in C):

        typedef  struct {
            uint  count;
            uint  primCount;
            uint  first;
            uint  reserved;
        } DrawArraysIndirectCommand;

        const DrawArraysIndirectCommand  *cmd  = (const DrawArraysIndirectCommand  *)indirect;
        glDrawArraysInstanced(mode,  cmd->first,  cmd->count,  cmd->primCount);

If a buffer is bound to the `GL_DRAW_INDIRECT_BUFFER` binding at the time of a call to `glDrawArraysIndirect`, `indirect` is interpreted as an offset, in basic machine units, into that buffer and the parameter data is read from the buffer rather than from client memory.

In contrast to glDrawArraysInstanced, the `first` member of the parameter structure is unsigned, and out-of-range indices do not generate an error.

Vertex attributes that are modified by `glDrawArraysIndirect` have an unspecified value after `glDrawArraysIndirect` returns. Attributes that aren't modified remain well defined.

## Notes

The `reserved` member of the `DrawArraysIndirectCommand` structure should be set to zero. Behavior is undefined if it is non-zero.

## Errors

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

`GL_INVALID_OPERATION` is generated if a non-zero buffer object name is bound to an enabled array or to the `GL_DRAW_INDIRECT_BUFFER` binding and the buffer object's data store is currently mapped.

## API Version Support

`glDrawArraysIndirect`

## See Also

glDrawArrays, glDrawArraysInstanced, glDrawElements, glDrawRangeElements,

## Copyright

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. http://opencontent.org/openpub/.