<!--
{
  "availability" : [
    "iOS: 26.0.0 -",
    "iPadOS: 26.0.0 -",
    "macCatalyst: 26.0.0 -",
    "macOS: 26.0.0 -",
    "tvOS: 26.0.0 -",
    "visionOS: 26.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "Metal",
  "identifier" : "/documentation/Metal/MTL4RenderCommandEncoder/drawIndexedPrimitives(primitiveType:indexType:indexBuffer:indexBufferLength:indirectBuffer:)",
  "metadataVersion" : "0.1.0",
  "role" : "Instance Method",
  "symbol" : {
    "kind" : "Instance Method",
    "modules" : [
      "Metal"
    ],
    "preciseIdentifier" : "c:objc(pl)MTL4RenderCommandEncoder(im)drawIndexedPrimitives:indexType:indexBuffer:indexBufferLength:indirectBuffer:"
  },
  "title" : "drawIndexedPrimitives(primitiveType:indexType:indexBuffer:indexBufferLength:indirectBuffer:)"
}
-->

# drawIndexedPrimitives(primitiveType:indexType:indexBuffer:indexBufferLength:indirectBuffer:)

Encodes a draw command that renders multiple instances of a geometric primitive with indexed vertices
and indirect arguments.

```
func drawIndexedPrimitives(primitiveType: MTLPrimitiveType, indexType: MTLIndexType, indexBuffer: MTLGPUAddress, indexBufferLength: Int, indirectBuffer: MTLGPUAddress)
```

## Parameters

`primitiveType`

A [`MTLPrimitiveType`](/documentation/Metal/MTLPrimitiveType) representing how the command interprets vertex argument data.

`indexType`

A [`MTLIndexType`](/documentation/Metal/MTLIndexType) instance that represents the index format.

`indexBuffer`

GPUAddress of a [`MTLBuffer`](/documentation/Metal/MTLBuffer) instance that contains `indexCount` indices of `indexType` format.
You are responsible for ensuring this address is aligned to 2 bytes if the `indexType` format is
[`MTLIndexType.uint16`](/documentation/Metal/MTLIndexType/uint16), and aligned to 4 bytes if the format is
[`MTLIndexType.uint32`](/documentation/Metal/MTLIndexType/uint32).

`indexBufferLength`

An integer that represents the length of `indexBuffer`, in bytes. You are responsible for
ensuring this this size is a multiple of 2 if the `indexType` format is [`MTLIndexType.uint16`](/documentation/Metal/MTLIndexType/uint16),
and a multiple of 4 if the format is [`MTLIndexType.uint32`](/documentation/Metal/MTLIndexType/uint32).
If this draw call causes Metal to read indices at or beyond the `indexBufferLength`, Metal
continues to execute them assigning a value of `0` to the `vertex_id` attribute.

`indirectBuffer`

GPUAddress of an [`MTLBuffer`](/documentation/Metal/MTLBuffer) instance with data that matches the layout of the
[`MTLDrawIndexedPrimitivesIndirectArguments`](/documentation/Metal/MTLDrawIndexedPrimitivesIndirectArguments) structure. This address requires 4-byte alignment.

## Discussion

When you use this function, Metal reads the parameters to the draw command from an [`MTLBuffer`](/documentation/Metal/MTLBuffer) instance,
allowing you to implement a GPU-driven workflow where a compute pipeline state determines the draw arguments.

Because this is an indexed draw call, Metal interprets the contents of the indirect buffer to match the
layout of struct [`MTLDrawIndexedPrimitivesIndirectArguments`](/documentation/Metal/MTLDrawIndexedPrimitivesIndirectArguments), which includes `indexStart` and `indexCount`
members, denoting a range within the index buffer you provide in the `indexBuffer` parameter.

The range of indices within the `indexBuffer` form the primitives Metal draws.

Metal imposes some restrictions on the index buffer’s address, which needs to be 2- or 4-byte aligned, and its length
in bytes, which needs to be a multiple of 2 or 4, depending on whether the format of the index is
[`MTLIndexType.uint16`](/documentation/Metal/MTLIndexType/uint16) or [`MTLIndexType.uint32`](/documentation/Metal/MTLIndexType/uint32).

Similarly, you are responsible for ensuring the indirect buffer’s address has 4-byte alignment.

Use an instance of [`MTLResidencySet`](/documentation/Metal/MTLResidencySet) to mark residency of the indirect buffer that the `indirectBuffer` parameter
references, and of the index buffer the `indexBuffer` parameter references.

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)