Name AMD_multi_draw_indirect Name Strings GL_AMD_multi_draw_indirect Contact Graham Sellers, AMD (graham.sellers 'at' amd.com) Contributors Graham Sellers Status Complete, shipping. Version Last Modified Date: Febuary 14, 2011 Revision: 2 Number 408 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 MultiDrawArraysIndirectAMD(enum mode, const void *indirect, sizei primcount, sizei stride); void MultiDrawElementsIndirectAMD(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 MultiDrawArraysIndirectAMD(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: 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 MultiDrawElementsIndirectAMD(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: 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 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 ---- -------- -------- ----------------------------------------- 2 02/14/2011 gsellers Add stride parameters 1 01/06/2011 gsellers Initial draft