Bringing Cyberpunk 2077 to Mac
CD PROJEKT RED explains how Cyberpunk 2077 reached macOS with native Apple silicon builds, Metal, MetalFX, platform features, and per-Mac presets.
TL;DR
- Use Game Porting Toolkit early to run the Windows build on macOS, gather feasibility and hotspot data, and turn CPU/GPU signals into a native-port roadmap.
- A production Mac target needs native Apple silicon builds, adapted data and shader pipelines, architecture validation, Metal rendering, and Metal Shader Converter integration.
- MetalFX Upscaling with Dynamic Resolution Scaling helped Cyberpunk 2077 maintain stable performance across Mac hardware without broadly lowering visual quality.
- The "For this Mac" preset and native macOS features-notifications, Game Mode, Game Controller, EDR HDR, spatial audio, and iCloud Drive saves-made the first-launch experience feel tuned for each device.
Porting goals and quality bar
CD PROJEKT RED framed the Mac port around three requirements: preserve Cyberpunk 2077's visual identity, keep performance stable in demanding scenes, and make the game feel native on macOS. The game is a heavy benchmark because Night City combines dense streaming, crowds, traffic, AI, physics, animation, quests, mixed lighting, reflections, volumetrics, ray tracing, and path tracing.
Apple silicon maturity made it feasible to target a serious quality level rather than merely getting the game running. The team treated Mac as another supported platform in its production process, not as a one-off compatibility layer.
- Visual fidelity: lighting, materials, post effects, ray tracing, and path tracing needed to match the game's identity on other platforms.
- Stable performance: test dense driving, combat, crowds, screen-space reflections, streaming, and other high CPU/GPU scenes.
- Native feel: adopt macOS behaviors and Apple-platform features instead of shipping only a basic renderable build.
Evaluate first with Game Porting Toolkit
Before building the native path, the team used Game Porting Toolkit to run the Windows build in a translated environment on macOS. The goal was not final performance numbers; it was to learn whether the port could meet the quality bar and where frame time pressure would likely appear.
They ran a fixed set of hotspot sequences and inspected data from multiple angles: in-engine statistical frame-time profiling, Metal HUD correlation, and engine thread breakdowns. Once native builds were available, Metal HUD became the primary frame-time capture tool because it could collect comparable data across many devices on builds without debug or profiling settings enabled.
- Use the evaluation environment before writing port-specific code to identify CPU, GPU, shader, audio, streaming, and scene-specific risks.
- Expect some artifacts from the translated environment; Cyberpunk saw live shader-translation frame-time oscillation and audio middleware overhead that were resolved with native binaries.
- Convert evaluation findings into a roadmap: create a real Mac target, bring up rendering and shaders, then optimize and polish.
Native Mac target, shaders, Metal, and MetalFX
The production port started by making macOS a real build target: native Apple silicon game binaries, native development tools, macOS outputs in the existing build pipeline, platform-specific archives, shader cache generation, and architecture validation with unit testing.
Metal Shader Converter was integrated into the shader build to quickly reach broad shader coverage. The team iterated by generating Metal shader output in normal builds, validating repeatable scenes, comparing lighting/material/post-effect results, and refining advanced shaders or edge cases. In parallel, they built a native Metal rendering foundation from unit tests to stationary scenes and then dynamic scenes with camera movement, streaming, gameplay, ray tracing, and path tracing.
MetalFX Upscaling and Dynamic Resolution Scaling provided performance headroom across the Mac lineup by rendering at a lower internal resolution and reconstructing a higher-resolution output while adapting under load.
- Treat shader conversion as a build-and-validation loop, not a one-time conversion step.
- Validate image correctness progressively: unit tests, stationary scenes, dynamic traversal, then heavy gameplay.
- Use MetalFX with Dynamic Resolution Scaling to maintain stable frame time in CPU/GPU-heavy scenes while preserving motion quality.
"For this Mac" graphics preset
The "For this Mac" preset is a device-based graphics preset system. It detects the hardware in the player's Mac and automatically chooses a stable, high-quality starting point for that specific device.
The team tuned each supported Mac by selecting a 30 or 60 FPS target, enabling MetalFX with Dynamic Resolution Scaling, setting minimum and maximum internal resolution bounds, configuring output resolution, V-Sync, and HDR, then iterating across scenes that stress CPU, GPU, and streaming systems.
- Choose an image-fidelity target per supported Mac before optimizing individual settings.
- Set a target FPS, then tune MetalFX Dynamic Resolution Scaling bounds to stay within the frame-time budget.
- Tune video settings as part of the preset: final output resolution, V-Sync/frame pacing, and HDR defaults based on display capability.
- Revalidate in consistent hotspot scenes across the lineup until the default experience is both performant and visually acceptable.
macOS integration and native platform features
The Mac version responds to macOS windowing, app switching, display, and cursor events through AppKit notifications. For example, it reduces CPU/GPU activity when not visible, updates the game window when display parameters change, handles moving to a new display, and switches between the game cursor and system cursor when focus changes.
Game Mode is automatically enabled for apps categorized as games and gives the game higher priority access to CPU/GPU resources while reducing background-task impact. It also improves latency for wireless controllers and AirPods by increasing Bluetooth sampling rate.
Input support uses Game Controller framework for third-party controllers and advanced features such as touchpad and adaptive triggers. The game also adapts controls for Magic Mouse and trackpad, including toggle aiming and an alternative to middle mouse button behavior using a modifier key plus click.
- Use
NSWindowDidChangeOcclusionStateNotificationplusNSWindow.occlusionStateto pause or resume rendering when the game is hidden or visible. - Use
NSApplicationDidChangeScreenParametersNotificationto update window sizing after display configuration changes. - Use
NSWindowDidChangeScreenNotificationto collect details about a newly assigned display, such as Display ID, resolution, mirror mode, and screen name. - Use
NSWindowDidResignKeyNotificationandNSWindowDidBecomeKeyNotificationto coordinate custom game cursor visibility with the system cursor.
Representative AppKit notification handling
The session highlights these notifications as key hooks for background rendering, display changes, moving between displays, and cursor/focus behavior.
// Names used by Cyberpunk 2077's Mac integration
NSWindowDidChangeOcclusionStateNotification
NSApplicationDidChangeScreenParametersNotification
NSWindowDidChangeScreenNotification
NSWindowDidResignKeyNotification
NSWindowDidBecomeKeyNotificationEDR HDR, spatial audio, and saves
Cyberpunk 2077 uses Apple's Extended Dynamic Range pipeline to calibrate HDR automatically on Apple displays. The game polls the display's current maximum EDR value and sends it to the tone mapper, and it enables HDR by default when the display has sufficient EDR headroom.
The game also enables head-tracked spatial audio for AirPods through audio middleware that implements Apple spatial audio APIs via AVAudioEngine. Saves are supported through iCloud Drive integration on Apple devices, alongside CD PROJEKT RED's cross-progression system for continuing across platforms.
- Poll
maximumExtendedDynamicRangeColorComponentValuefor the current display and drive the tone mapper's maximum HDR output from that value. - Check
maximumPotentialExtendedDynamicRangeColorComponentValue; Cyberpunk enables HDR by default when the display's maximum potential EDR value is greater than 2.0. - Enable AirPods head tracking by setting
AVAudioEnvironmentNode.listenerHeadTrackingEnabledtotruewhen using AVAudioEngine-based spatial audio. - Use iCloud Drive integration to reduce save-transfer friction between Apple devices.
Automatic EDR-driven HDR calibration
The game uses the current EDR value for tone mapping and enables HDR by default on displays with enough potential EDR headroom.
let currentEDR = screen.maximumExtendedDynamicRangeColorComponentValue
toneMapper.maximumHDROutput = currentEDR
let potentialEDR = screen.maximumPotentialExtendedDynamicRangeColorComponentValue
let enableHDRByDefault = potentialEDR > 2.0Head-tracked spatial audio with AirPods
Cyberpunk's audio middleware uses AVAudioEngine spatial audio APIs and enables head tracking through AVAudioEnvironmentNode.
audioEnvironmentNode.listenerHeadTrackingEnabled = trueResources
- Performing your own tone mapping
- Personalizing spatial audio in your app
- Download the Game Porting Toolkit
Related Sessions
Discover USDKit and what’s new in OpenUSD
Learn how USDKit brings first-class Swift APIs for OpenUSD scenes, compression, accessibility metadata, Spatial Preview, and USD web delivery.
Speedrun your game port with agentic coding
Use Game Porting Toolkit 4 agentic skills to structure, implement, validate, debug, and tune native Apple-platform game ports with Metal 4 and MetalFX.