| 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 <indirect> is |
| treated as an array of <primcount> DrawArraysIndirectCommand structures. |
| <indirect> contains the offset of the first element of the array within the |
| buffer currently bound to the DRAW_INDIRECT buffer binding.<stride> |
| specifies the distance, in basic machine units, between the elements of the |
| array. If <stride> is zero, the array elements are treated as tightly |
| packed. <stride> must be a multiple of four, otherwise an INVALID_VALUE |
| error is generated. |
| |
| It has the same effect as: |
| |
| if (<mode> 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; |
| } |
| } |
| } |
| |
| <primcount> 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 <indirect> is |
| treated as an array of <primcount> DrawElementsIndirectCommand structures. |
| <indirect> contains the offset of the first element of the array within the |
| buffer currently bound to the DRAW_INDIRECT buffer binding. <stride> |
| specifies the distance, in basic machine units, between the elements of the |
| array. If <stride> is zero, the array elements are treated as tightly |
| packed. <stride> must be a multiple of four, otherwise an INVALID_VALUE |
| error is generated. |
| |
| It has the same effect as: |
| |
| if (<mode> or <type> 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 <primcount> is negative. |
| |
| INVALID_VALUE is generated by MultiDrawArraysIndirect or |
| MultiDrawElementsIndirect if <stride> 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 |