Name ARB_indirect_parameters Name Strings GL_ARB_indirect_parameters Contact Graham Sellers (graham.sellers 'at' amd.com) Contributors ??? 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: 20 June 2013 Revision: 3 Number ARB Extension #154 Dependencies OpenGL 4.2 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. Overview OpenGL 4.3 (with the introduction of the GL_ARB_multi_draw_indirect extension) enhanced the ability of OpenGL to allow a large sets of parameters for indirect draws (introduced with OpenGL 4.0) into a buffer object and dispatch the entire list with one API call. This allows, for example, a shader (such as a compute shader via shader storage buffers, or a geometry shader via transform feedback) to produce lists of draw commands that can then be consumed by OpenGL without a server-client round trip. However, when a variable and potentially unknown number of draws are produced by such a shader, it becomes difficult to know how many draws are in the output array(s). Applications must resort to techniques such as transform feedback primitive queries, or mapping buffers containing the content of atomic counters, which can cause stalls or bubbles in the OpenGL pipeline. This extension introduces the concept of the "parameter buffer", which is a target allowing buffers to store parameters for certain drawing commands. Also in this extension, new variants of MultiDrawArraysIndirect and MultiDrawElementsIndirect are introduced that source some of their parameters from this buffer. Further commands could potentially be introduced that source other parameters from a buffer. New Procedures and Functions void MultiDrawArraysIndirectCountARB(enum mode, const void *indirect, intptr drawcount, sizei maxdrawcount, sizei stride); void MultiDrawElementsIndirectCountARB(enum mode, enum type, const void *indirect, intptr drawcount, sizei maxdrawcount, sizei stride); New Tokens Accepted by the parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData: PARAMETER_BUFFER_ARB 0x80EE Accepted by the parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev: PARAMETER_BUFFER_BINDING_ARB 0x80EF Additions to Chapter 6 of the OpenGL 4.3 (Core Profile) Specification (Drawing Commands Using Vertex Arrays) Modifications to Section 6.1 "Creating and Binding Buffer Objects" Add to Table 6.1: Buffer object binding targets: Target name Purpose Described in section(s) -------------------- --------------- ------------------------ PARAMETER_BUFFER_ARB draw parameters 10.5 Additions to Chapter 10 of the OpenGL 4.3 (Core Profile) Specification (Drawing Commands Using Vertex Arrays) Add to Section 10.5, "Drawing Commands Using Vertex Arrays", after the introduction of MultiDrawArraysIndirect, p.311: The command void MultiDrawArraysIndirectCountARB(enum mode, const void *indirect, intptr drawcount, intptr maxdrawcount, sizei stride); behaves similarly to MultiDrawArraysIndirect, except that defines an offset (in bytes) into the buffer object bound to the PARAMETER_BUFFER_ARB binding point at which a single typed value is stored, which contains the draw count. specifies the maximum number of draws that are expected to be stored in the buffer. If the value stored at into the buffer is greater than , an implementation stop processing draws after parameter sets. must be a multiple of four. Add to Section 10.5, "Drawing Commands Using Vertex Arrays", after the introduction of MultiDrawElementsIndirect, p.316: The command void MultiDrawElementsIndirectCountARB(enum mode, enum type, const void *indirect, intptr drawcount, sizei maxdrawcount, sizei stride); behaves similarly to MultiDrawElementsIndirect, except that defines an offset (in bytes) into the buffer object bound to the PARAMETER_BUFFER_ARB binding point at which a single typed value is stored, which contains the draw count. specifies the maximum number of draws that are expected to be stored in the buffer. If the value stored at into the buffer is greater than , an implementation stop processing draws after parameter sets. must be a multiple of four. Errors INVALID_OPERATION is generated by MultiDrawArraysIndirectCountARB or MultiDrawElementsIndirectCountARB if no buffer is bound to the PARAMETER_BUFFER_ARB binding point. INVALID_VALUE is generated by MultiDrawArraysIndirectCountARB or MultiDrawElementsIndirectCountARB if is not a multiple of four. INVALID_OPERATION is generated by MultiDrawArraysIndirectCountARB or MultiDrawElementsIndirectCountARB if reading a typed value from the buffer bound to the PARAMETER_BUFFER_ARB target at the offset specified by would result in an out-of-bounds access. New State Append to Table 23.5, "Vertex Array Data (not in Vertex Array objects)" +-------------------------------+------+--------------+---------+-----------------------------------+----------+ | Get Value | | Get | Initial | | | | Value | Type | Command | Value | Description | Sec | +-------------------------------+------+--------------+---------+-----------------------------------+--------- + | PARAMETER_BUFFER_BINDING_ARB | Z+ | GetIntegerv | 0 | Indirect parameter buffer binding | 13.5 | +-------------------------------+------+--------------+---------+-----------------------------------+--------- + Issues 1) Is this extension named appropriately? Is it too generic? DISCUSSION: We'd rather lean towards the generic and be forward-looking. It's conceivable we could add further commands that source some or all of their parameters from a buffer object in the future. Revision History Rev. Date Author Changes ---- -------- -------- ----------------------------------------- 1 05/16/2013 gsellers Initial draft based on multi_draw_indirect2 2 05/29/2013 gsellers Rename MultiDrawArraysIndirectCount and MultiDrawElementsIndirectCount. Add issue (1) 3 06/20/2013 pdaniell Modify the parameter type to const void *.