Skip to content

Metal: Metal Shader Converter (METAL_IR) shaders and D3D12-style bindings - #112

Closed
navjack wants to merge 1 commit into
renderbag:mainfrom
navjack:metal-shader-converter
Closed

navjack wants to merge 1 commit into
renderbag:mainfrom
navjack:metal-shader-converter

Conversation

@navjack

@navjack navjack commented Sep 15, 2026

Copy link
Copy Markdown

Add RenderShaderFormat::METAL_IR: a small "PLIR" container (plume_metal_ir.h)
holding the converted metallib, its entry point, and the resource list
reflected by Apple's Metal Shader Converter (type, register space, slot,
top-level argument buffer offset).

METAL_IR graphics pipelines bind one top-level argument buffer per stage at
kIRArgumentBufferBindPoint. Tables are built per draw from root constant
buffer descriptors, push constants and descriptor sets, resolving each
resource the same way as D3D12 (register space = descriptor set index,
slot = range binding). Draws publish IRRuntimeDrawParams and index type at
the draw-argument and uniform bind points so SV_VertexID/SV_InstanceID
match D3D. SetMetalShaderConverterDescriptorSets() opts a device into
shader-converter descriptor-set encoding; existing MSL/metallib paths are
unchanged. Large tables and push constants use pooled shared upload chunks
recycled after command buffer completion.

Vendor the Apache-2.0 Metal Shader Converter runtime headers in
contrib/metal-shaderconverter.

Link Metal, QuartzCore, Foundation, CoreFoundation, IOKit and AppKit from
the plume target itself; consumers previously only got them indirectly
through SDL2.

Testing

  • Developed and used in the macOS Metal port of LostOdysseyRecomp (Apple M4 Pro, macOS 27, Xcode 27), exercising this path during gameplay.
  • This branch is the single commit cherry-picked onto current main; -fsyntax-only compile of the changed sources on arm64 macOS against main passes.

🤖 Generated with Claude Code

…ings

Add RenderShaderFormat::METAL_IR: a small "PLIR" container (plume_metal_ir.h)
holding the converted metallib, its entry point, and the resource list
reflected by Apple's Metal Shader Converter (type, register space, slot,
top-level argument buffer offset).

METAL_IR graphics pipelines bind one top-level argument buffer per stage at
kIRArgumentBufferBindPoint. Tables are built per draw from root constant
buffer descriptors, push constants and descriptor sets, resolving each
resource the same way as D3D12 (register space = descriptor set index,
slot = range binding). Draws publish IRRuntimeDrawParams and index type at
the draw-argument and uniform bind points so SV_VertexID/SV_InstanceID
match D3D. SetMetalShaderConverterDescriptorSets() opts a device into
shader-converter descriptor-set encoding; existing MSL/metallib paths are
unchanged. Large tables and push constants use pooled shared upload chunks
recycled after command buffer completion.

Vendor the Apache-2.0 Metal Shader Converter runtime headers in
contrib/metal-shaderconverter.

Link Metal, QuartzCore, Foundation, CoreFoundation, IOKit and AppKit from
the plume target itself; consumers previously only got them indirectly
through SDL2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@DarioSamo

Copy link
Copy Markdown
Contributor

AI-generated contributions are not accepted, especially ones with Claude as the co-author. No copyright will be given to Anthropic in any of my projects.

@DarioSamo DarioSamo closed this Sep 15, 2026
@renderbag renderbag locked and limited conversation to collaborators Sep 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants