<!--
{
  "documentType" : "article",
  "framework" : "Metal",
  "identifier" : "/documentation/Metal/work-submission",
  "metadataVersion" : "0.1.0",
  "role" : "collectionGroup",
  "title" : "Work submission"
}
-->

# Work submission

Create queues that submit work to the GPU or load assets into GPU resources, and indirect command buffers that group your frequent commands together.

## Topics

### Creating command queues

Command queues encode and submit work to the GPU, which include render, compute, and blit passes.

[`func makeCommandQueue() -> (any MTLCommandQueue)?`](/documentation/Metal/MTLDevice/makeCommandQueue())

Creates a queue you use to submit rendering and computation commands to a GPU.

[`func makeCommandQueue(maxCommandBufferCount: Int) -> (any MTLCommandQueue)?`](/documentation/Metal/MTLDevice/makeCommandQueue(maxCommandBufferCount:))

Creates a queue you use to submit rendering and computation commands to a GPU that has a fixed number of uncompleted command buffers.

### Creating residency sets

A residency set makes a group of resources, such as buffers, textures, and heaps, accessible to a GPU for your command buffers and their shaders.

[`func makeResidencySet(descriptor: MTLResidencySetDescriptor) throws -> any MTLResidencySet`](/documentation/Metal/MTLDevice/makeResidencySet(descriptor:))

Creates a residency set, which can move resources in and out of memory residency.

### Creating I/O command queues

Input/Output command queues load assets from the file system into textures, GPU buffers, and traditional CPU buffers.

[`func makeIOCommandQueue(descriptor: MTLIOCommandQueueDescriptor) throws -> any MTLIOCommandQueue`](/documentation/Metal/MTLDevice/makeIOCommandQueue(descriptor:))

Creates an input/output command queue you use to submit commands that load assets from the file system into GPU resources or system memory.

### Creating I/O file handles

Input/Output file handles each represent an asset in the file system that an I/O command queue loads into a resource for your app.

[`func makeIOFileHandle(url: URL) throws -> any MTLIOFileHandle`](/documentation/Metal/MTLDevice/makeIOFileHandle(url:))

Creates an input/output file handle instance that represents a file at a URL.

[`func makeIOFileHandle(url: URL, compressionMethod: MTLIOCompressionMethod) throws -> any MTLIOFileHandle`](/documentation/Metal/MTLDevice/makeIOFileHandle(url:compressionMethod:))

Creates an input/output file handle instance that represents a compressed file at a URL.

[`func makeIOHandle(url: URL) throws -> any MTLIOFileHandle`](/documentation/Metal/MTLDevice/makeIOHandle(url:))

Creates an input/output file handle instance that represents a file at a URL.

[`func makeIOHandle(url: URL, compressionMethod: MTLIOCompressionMethod) throws -> any MTLIOFileHandle`](/documentation/Metal/MTLDevice/makeIOHandle(url:compressionMethod:))

Creates an input/output file handle instance that represents a compressed file at a URL.

### Creating indirect command buffers

Indirect command buffers (ICBs) store commands that you can reuse throughout your app’s lifetime, instead of encoding the same commands repeatedly.

[`func makeIndirectCommandBuffer(descriptor: MTLIndirectCommandBufferDescriptor, maxCommandCount: Int, options: MTLResourceOptions) -> (any MTLIndirectCommandBuffer)?`](/documentation/Metal/MTLDevice/makeIndirectCommandBuffer(descriptor:maxCommandCount:options:))

Creates an indirect command buffer instance.



---

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)