Name ARB_multi_draw_indirect Name Strings GL_ARB_multi_draw_indirect Contact Graham Sellers, AMD (graham.sellers 'at' amd.com) Contributors Graham Sellers Notice Copyright (c) 2012-2013 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html Specification Update Policy Khronos-approved extension specifications are updated in response to issues and bugs prioritized by the Khronos OpenGL Working Group. For extensions which have been promoted to a core Specification, fixes will first appear in the latest version of that core Specification, and will eventually be backported to the extension document. This policy is described in more detail at https://www.khronos.org/registry/OpenGL/docs/update_policy.php Status Complete. Approved by the ARB on 2012/06/12. Version Last Modified Date: June 9, 2014 Revision: 4 Number ARB Extension #133 Dependencies OpenGL 4.0 or ARB_draw_indirect is required. The extension is written against the OpenGL 4.1 Specification, Core Profile, July 25, 2010 Overview The ARB_draw_indirect extension (included in OpenGL 4.0) introduced mechanisms whereby the parameters for a draw function may be provided in a structure contained in a buffer object rather than as parameters to the drawing procedure. This is known as an indirect draw and is exposed as two new functions, glDrawArraysIndirect and glDrawElementsIndirect. Each of these functions generates a single batch of primitives. This extension builds on this functionality by providing procedures to invoke multiple draws from a single procedure call. This allows large batches of drawing commands to be assembled in server memory (via a buffer object) which may then be dispatched through a single function call. New Procedures and Functions void MultiDrawArraysIndirect(enum mode, const void *indirect, sizei primcount, sizei stride); void MultiDrawElementsIndirect(enum mode, enum type, const void *indirect, sizei primcount, sizei stride); New Tokens None. Additions to Chapter 2 of the OpenGL 4.1 (Core) Specification (OpenGL Operation) Additions to Section 2.8.3, "Drawing Commands" After the description of MultiDrawArrays and before the introduction of DrawElementsInstanced, insert the following on p.36: The command void MultiDrawArraysIndirect(enum mode, const void *indirect, sizei primcount, sizei stride); behaves identically to DrawArraysIndirect, except that is treated as an array of DrawArraysIndirectCommand structures. contains the offset of the first element of the array within the buffer currently bound to the DRAW_INDIRECT buffer binding. specifies the distance, in basic machine units, between the elements of the array. If is zero, the array elements are treated as tightly packed. must be a multiple of four, otherwise an INVALID_VALUE error is generated. It has the same effect as (assuming no errors are generated): if ( is invalid) generate appropriate error else { const ubyte * ptr = (const ubyte *)indirect; for (i = 0; i < primcount; i++) { DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr); if (stride == 0) { ptr += sizeof(DrawArraysIndirectCommand); } else { ptr += stride; } } } must be positive, otherwise an INVALID_VALUE error will be generated. After the description of DrawElementsIndirect and before the introduction of MultiDrawElementsBaseVertex, insert the following on p.39: The command void MultiDrawElementsIndirect(enum mode, enum type, const void *indirect, sizei primcount, sizei stride); behaves identically to DrawElementsIndirect, except that is treated as an array of DrawElementsIndirectCommand structures. contains the offset of the first element of the array within the buffer currently bound to the DRAW_INDIRECT buffer binding. specifies the distance, in basic machine units, between the elements of the array. If is zero, the array elements are treated as tightly packed. must be a multiple of four, otherwise an INVALID_VALUE error is generated. It has the same effect as (assuming no errors are generated): if ( or is invalid) generate appropriate error else { const ubyte * ptr = (const ubyte *)indirect; for (i = 0; i < primcount; i++) { DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand*)ptr); if (stride == 0) { ptr += sizeof(DrawElementsIndirectCommand); } else { ptr += stride; } } } Modifications to Section 2.9.8 "Indirect Commands in Buffer Objects" Modify both instances of "DrawArraysIndirect and DrawElementsIndirect" on p.51 to read "DrawArraysIndirect, DrawElementsIndirect, MultiDrawArraysIndirect and MultiDrawElementsIndirect". Additions to Chapter 3 of the OpenGL 4.1 (Core) Specification (Rasterization) None. Additions to Chapter 4 of the OpenGL 4.1 (Core) Specification (Per-Fragment Operations and the Framebuffer) None. Additions to Chapter 5 of the OpenGL 4.1 (Core) Specification (Special Functions) None. Additions to Chapter 6 of the OpenGL 4.1 (Core) Specification (State and State Requests) None. Additions to the AGL/GLX/WGL Specifications None. GLX Protocol None. Errors MultiDrawArraysIndirect and MultiDrawElementsIndirect may generate the same errors as the corresponding DrawArraysIndirect and DrawElementsIndirect commands in the equivalent pseudocode. In addition, INVALID_VALUE is generated by MultiDrawArraysIndirect or MultiDrawElementsIndirect if is negative. INVALID_VALUE is generated by MultiDrawArraysIndirect or MultiDrawElementsIndirect if is not a multipe of four. New State None. New Implementation Dependent State None. Issues None, so far. Revision History Rev. Date Author Changes ---- -------- -------- ----------------------------------------- 4 06/09/2014 Jon Leech Note that errors can be generated from the non-Multi Draw*Indirect commands in the equivalent pseudocode (Bug 11946). 3 06/14/2012 Jon Leech Change to ARB extension & remove suffixes 2 02/14/2011 gsellers Add stride parameters 1 01/06/2011 gsellers Initial draft