Minecraft: Java Edition draws through OpenGL 3.3 on macOS — an API Apple deprecated in 2018 and never optimised for Apple silicon.
Titanium replaces the renderer with a genuine Apple Metal backend. Not a wrapper, not a translation layer.
Why
Apple deprecated OpenGL across its platforms in 2018. It still works, but it receives no driver investment, cannot express how Apple GPUs actually render, and leaves most of the hardware's capability unreachable.
Titanium talks to Metal through an Objective-C++ bridge. There is no MoltenVK, no Vulkan layer, and no OpenGL shim underneath — at runtime the process speaks Metal and nothing else.
Unified memory means vertex data written by the JVM is the same memory the GPU reads. Tile-based deferred rendering means depth buffers never have to exist in main memory at all.
Every Metal feature is checked against the live device at runtime, never inferred from the chip name or macOS version. Unsupported machines fall back cleanly instead of crashing.
How
Mojang's 1.21 rendering rewrite introduced an explicit, backend-agnostic
graphics abstraction — and marked it @DontObfuscate, so it keeps its real
names through obfuscation. Titanium implements that interface instead of patching
thousands of scattered draw calls.
The OpenGL context itself is created inside GlDevice —
so replacing the device removes OpenGL from the process rather than leaving a dead
context behind. Verified by disassembling the 1.21.11 client, not assumed.
Status
Titanium is an in-progress project published in the open. This table reflects what has been built and tested — not what is planned.
| Component | Detail | State |
|---|---|---|
| Feasibility study | Backend seam, injection point and shader model verified against the real 1.21.11 client jar and official mappings | done |
| Native Metal core | Device, capabilities, buffers, textures, samplers, pipelines, depth/stencil, render passes, frames in flight, pipeline cache | done |
| JNI bridge | 62 entry points; zero-copy vertex upload straight into GPU-visible memory | done |
| Swapchain & presentation | CAMetalLayer on Minecraft's window, resize, vsync, ProMotion frame pacing | in progress |
| GLSL → MSL translation | Minecraft ships 93 GLSL shaders; Metal cannot consume them directly | next |
| Fabric integration | Mixins replacing the device, plus the full GpuDevice implementation | next |
| MetalFX upscaling | Spatial first; temporal requires motion vectors Minecraft does not yet produce | planned |
| Mesh shaders | Gated on a workload where the win is measurable, with a conventional fallback | planned |
Titanium publishes no frame-rate numbers, because none have been measured against the unmodified renderer yet. Claiming a speedup before the renderer is complete would be guesswork. When benchmarks exist they will state the scene, the settings, the hardware, and the percentiles — not a single flattering average.
Requirements
Shader packs such as Iris and OptiFine inject GLSL and call OpenGL directly. With no GL context in the process there is nothing for them to call, so Titanium detects them at startup and stays disabled rather than failing halfway through world load.