GLMULTIDRAWELEMENTSI(3G)

πŸ“¦ in arch rolling

πŸ’… GLMULTIDRAWELEMENTSI(3G) β€” glMultiDrawElementsIndirectCount

okay bestie, sit down, because this one is a baddie. this is the 3G manual page for glMultiDrawElementsIndirectCount, and it is literally the "draw a whole bunch of indexed stuff with basically one function call" icon that we all deserve. ✨

It renders indexed primitives from array data, and it takes its parameters and its count straight from memory. no cap. πŸŽ€


✨ C SPECIFICATION ✨

look at her. she's gorgeous. she takes six whole arguments and does not apologize for it:

void glMultiDrawElementsIndirectCount(GLenum mode, GLenum type,
                                      const void *indirect,
                                      GLintptr drawcount,
                                      GLsizei maxdrawcount,
                                      GLsizei stride);

πŸ¦‹ PARAMETERS πŸ¦‹

every single one, and yes we're doing all of them:

  • mode β€” tells the GPU what kind of primitives we're rendering, bestie. accepted values are GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_LINE_STRIP_ADJACENCY, GL_LINES_ADJACENCY, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_TRIANGLE_STRIP_ADJACENCY, GL_TRIANGLES_ADJACENCY, and GL_PATCHES. that's the whole list, don't come at me with anything else πŸ™ˆ
  • type β€” the type of the data living in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. must be one of GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT. those three, pick one. πŸ’€
  • indirect β€” the address of a structure that holds an array of draw parameters. like, the whole little pile of them. πŸ“
  • drawcount β€” an offset, in bytes, into the buffer object bound to the GL_PARAMETER_BUFFER binding point, and at that offset there's a single sizei typed value chillin'. it must be a multiple of four. yes, must. 🫢
  • maxdrawcount β€” the maximum number of draws that are expected to be stored in the buffer. and if the value stored at drawcount in the buffer is greater than maxdrawcount, the implementation just stops processing draws after maxdrawcount parameter sets. it simply stops. no drama, it's in the spec. βœ‚οΈ
  • stride β€” the distance, in basic machine units, between elements of the draw parameter array. that's the spacing between your little parameter sets. πŸ“

🌸 DESCRIPTION 🌸

so glMultiDrawElementsIndirectCount specifies multiple geometric primitives with very few subroutine calls β€” main character energy honestly, she does so much with so little.

she behaves similarly to glMultiDrawElementsIndirect(), with the one glow-up that the drawcount parameter is stored in the buffer bound to the GL_PARAMETER_BUFFER binding at the offset specified by drawcount. the count lives in the buffer, not in your hand. iykyk. πŸ‘‘

the parameters addressed by indirect are packed into a structure that takes this form, in C, and i'm copying it exactly so don't @ me:

typedef  struct {
    uint  count;
    uint  instanceCount;
    uint  firstIndex;
    int  baseVertex;
    uint  baseInstance;
} DrawElementsIndirectCommand;

if a buffer is bound to the GL_DRAW_INDIRECT_BUFFER binding at the time of a call to glMultiDrawElementsIndirectCount, then indirect is interpreted as an offset β€” in basic machine units β€” into that buffer, and the parameter data gets read from the buffer instead of from client memory. it's giving "read the room, read the buffer". πŸ“–

🚨 not me having to say this, but: indices stored in client memory are not supported. if no buffer is bound to the GL_ELEMENT_ARRAY_BUFFER binding, an error will be generated. periodt.

the results of the operation are undefined if the reservedMustBeZero member of the parameter structure is non-zero. and like… no error is generated in that case either. it's just vibes and chaos. you've been warned, bestie 😭

vertex attributes that are modified by glMultiDrawElementsIndirectCount have an unspecified value after glMultiDrawElementsIndirectCount returns. attributes that aren't modified remain well defined. that's the deal. πŸ’«


πŸ”₯ ERRORS πŸ”₯

here's the full receipt, every single one, no skipping:

  • GL_INVALID_ENUM is generated if mode is not an accepted value. πŸ‘Ž
  • GL_INVALID_VALUE is generated if stride is not a multiple of four.
  • GL_INVALID_VALUE is generated if drawcount is negative.
  • GL_INVALID_OPERATION is generated if no buffer is bound to the GL_ELEMENT_ARRAY_BUFFER binding, or if such a buffer's data store is currently mapped.
  • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or to the GL_DRAW_INDIRECT_BUFFER binding and the buffer object's data store is currently mapped.
  • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the currently installed program object.
  • GL_INVALID_OPERATION is generated if mode is GL_PATCHES and no tessellation control shader is active.
  • GL_INVALID_OPERATION error is generated if no buffer is bound to the GL_PARAMETER_BUFFER binding point.
  • GL_INVALID_OPERATION error is generated if drawcount is not a multiple of four.
  • GL_INVALID_OPERATION error is generated if reading a sizei typed value from the buffer bound to the GL_PARAMETER_BUFFER target at the offset specified by drawcount would result in an out-of-bounds access. 🚧

πŸŽ€ VERSION SUPPORT πŸŽ€

the original ships a whole grid here, and since we don't do tables in this house, here's the tea in words β€” it's the same tea, i promise:

Function / Feature Name: glMultiDrawElementsIndirectCount

OpenGL Version: 2.0, 2.1, 3.0, 3.1, 3.2, 3.3, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6

Support: every single version from 2.0 all the way through 4.5 gets a - (nope, not her), and 4.6 gets the one and only βœ”. she showed up late and she showed up iconic. ⭐


🌈 SEE ALSO 🌈

go read these next, bestie, they're all connected:

  • glDrawArrays()
  • glDrawArraysInstanced()
  • glDrawArraysIndirect()
  • glDrawElements()
  • glDrawRangeElements()
  • glDrawElementsIndirect()
  • glMultiDrawArraysIndirect()
  • glMultiDrawArraysIndirectCount()
  • glMultiDrawElementsIndirect()

Copyright Β© 2010-2014 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. https://opencontent.org/openpub/.

and again, because the original says it twice and we keep every detail:

Copyright Β© 2010-2014 Khronos Group.


mwah πŸ’œ that's the whole page. source: [FIXME: source], dated 10/07/2026, from the GLMULTIDRAWELEMENTSI(3G) era. go draw something beautiful, bestie β€” and remember, drawcount is a multiple of four. 🫢✨
πŸ“¦ where this page comes from