blob: 0dc05dcfb0bebc49094d4d05c7d6ae2995132f7b [file] [log] [blame]
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
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 June 3, 2013.
Ratified by the Khronos Board of Promoters on July 19, 2013.
Version
Last Modified Date: 23 October 2017
Revision: 4
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 <target> parameters of BindBuffer, BufferData,
BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData,
GetBufferPointerv, MapBufferRange, FlushMappedBufferRange,
GetBufferParameteriv, and CopyBufferSubData:
PARAMETER_BUFFER_ARB 0x80EE
Accepted by the <value> 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 7 of the OpenGL 4.3 (Core Profile) Specification
(Programs and Shader)
Modifications to Section 7.12.2 "Shader Memory Access Synchronization"
Replace the bullet point describing COMMAND_BARRIER_BIT with
- COMMAND_BARRIER_BIT: Command data sourced from buffer objects by
Draw*Indirect, MultiDraw*IndirectCount, and DispatchComputeIndirect
commands after the barrier will reflect data written by shaders
prior to the barrier. The buffer objects affected by this bit
are derived from the DRAW_INDIRECT_BUFFER, DISPATCH_INDIRECT_BUFFER,
and PARAMETER_BUFFER_ARB bindings.
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 <drawcount>
defines an offset (in bytes) into the buffer object bound to the
PARAMETER_BUFFER_ARB binding point at which a single <sizei> typed value
is stored, which contains the draw count. <maxdrawcount> specifies the
maximum number of draws that are expected to be stored in the buffer.
If the value stored at <drawcount> into the buffer is greater than
<maxdrawcount>, an implementation stop processing draws after
<maxdrawcount> parameter sets. <drawcount> 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 <drawcount>
defines an offset (in bytes) into the buffer object bound to the
PARAMETER_BUFFER_ARB binding point at which a single <sizei> typed value
is stored, which contains the draw count. <maxdrawcount> specifies the
maximum number of draws that are expected to be stored in the buffer.
If the value stored at <drawcount> into the buffer is greater than
<maxdrawcount>, an implementation stop processing draws after
<maxdrawcount> parameter sets. <drawcount> 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 <drawcount> is not a multiple of
four.
INVALID_OPERATION is generated by MultiDrawArraysIndirectCountARB or
MultiDrawElementsIndirectCountARB if reading a <sizei> typed value
from the buffer bound to the PARAMETER_BUFFER_ARB target at the offset
specified by <drawcount> 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 <indirect> parameter type to
const void *.
4 10/23/2017 nhaehnle Add COMMAND_BARRIER_BIT language.