# iPad Pro High-Accuracy Color Setup
Settings → Display & Brightness → Advanced → Reference Mode **On**
The peak HDR brightness is now capped at **1000 nits**.
# Custom EDID Virtual Display
## VirtualDisplayDriver Configuration
Install the driver from
https://github.com/VirtualDrivers/Virtual-Display-Driver/releases
Set resolution **2752 × 2064** at **120 Hz**.
Enable **custom_edid**, **EdidCeaOverride**, **10-bit color depth**, **HDR+**, etc.
## Generate Color-Gamut & HDR Settings with CRU
Download CRU 1.5.3
https://www.monitortests.com/download/cru/cru-1.5.3.zip
Open **CRU**, select the VDD virtual display, open **Extension Blocks**, and edit the **HDR Static Metadata** block:
check **SMPTE ST 2084**, enable **Static Metadata**, set **Max luminance** to **138** (slightly under 1000 nits) and **Max frame-avg** to **128** (800 nits).
> In CRU 1.5.3’s **HDR Static Metadata**, the numeric value *v* for “Max luminance” (MaxCLL) or “Max frame-avg” (MaxFALL) is *not* linear to the actual peak brightness (nits). Dolby’s HDR static-metadata spec uses an exponential mapping:
> **Reverse mapping (nits → Value)**:
>  *v* = 32 × log₂ (*nits*/50)
![[Pasted image 20250712164655.png]]
![[Pasted image 20250712164713.png]]
Export the file as **user_edid.bin** to the VirtualDisplayDriver root folder.
The bundled **restart64.exe** in that folder conveniently reloads the display driver.
## Deltacast E-EDID — Set Rec. 2020 Primaries in the Base Block
Download
https://www.deltacast.tv/media/1145/eedid_editor-win.x64-1.6.0-inst.zip
Why this step matters:
If you stop after the CRU step, when Moonlight connects you’ll see in the Sunshine log:
Colorspace : DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020
Bits Per Color : 10
Red Primary : [0.639648,0.330078]
Green Primary : [0.299805,0.599609]
Blue Primary : [0.150391,0.0595703]
White Point : [0.313477,0.329102]
Min Luminance : 0 nits
Max Luminance : 993.515 nits
Max Full Luminance : 800 nits
These primaries are wrong and deviate greatly from Rec. 2020.
Open the **.bin** with **Deltacast E-EDID** and set the primaries like this:
![[Pasted image 20250712164823.png]]
After success you’ll see:
Colorspace : DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020
Bits Per Color : 10
Red Primary : [0.708008,0.291992]
Green Primary : [0.169922,0.796875]
Blue Primary : [0.130859,0.0458984]
White Point : [0.3125,0.329102]
Min Luminance : 0 nits
Max Luminance : 993.515 nits
Max Full Luminance : 800 nits
# Remote Streaming
## Sunshine Server
After unzipping, first run the **uninstall** scripts inside *scripts/*.
*Running with administrator rights and disabling the service is the officially recommended best practice.*
## Color-Space Compatibility Matrix
**Current AV1 Hardware Support**
```
|Color Space|NVENC AV1|Software AV1|HEVC Comparison|
|---|---|---|---|
|BT.709 Limited|✅|✅|✅|
|BT.709 Full|⚠️|✅|✅|
|BT.2020 Limited|⚠️|✅|✅|
|BT.2020 Full|❌|✅|✅|
```
Add the following to **config/sunshine.conf**:
```
av1_mode = 0
dd_configuration_option = ensure_active
dd_manual_refresh_rate = 25
dd_manual_resolution = 2752x2064
dd_refresh_rate_option = manual
dd_resolution_option = disabled
encoder = nvenc
hevc_mode = 3
install_steam_audio_drivers = disabled
lan_encryption_mode = 0
min_fps_factor = 1
min_threads = 4
nvenc_preset = 7
nvenc_realtime_hags = disabled
nvenc_twopass = full_res
nvenc_vbv_increase = 200
output_name = {YOUR_DEVICE_ID}
qp = 8
stream_audio = false
```
- Force **HEVC** with 10-bit, use **NVENC**.
- Max out server performance (at the expense of latency) and trade data redundancy for raw quality + stability.
- Refresh rate and resolution can be overridden here but are optional.
- The critical knobs are **nvenc_vbv_increase**, **qp**, and **nvenc_realtime_hags**.
- You find **{YOUR_DEVICE_ID}** in Sunshine’s startup log *after* the virtual display is configured.
## Moonlight Client
Resolution/refresh are irrelevant—the server dictates them.
Set **Bitrate = 150 Mbps**, **Quality = Highest**.
Switch touch mode to **Touch Screen** and hide the on-screen gamepad.
Use **HEVC** codec.
## The Brutal Truth
A color-calibration probe shows a hard ceiling of **~400 nits**.
After probing into it carefully, **iPad Pro 2024 hits 1000 nits only under strict conditions**.
### Why does remote PQ + HDR10 top out at 400 nits?
1. **EDR “Safety Mode”**
- For **external HDR10 sources without dynamic metadata**, ColorSync pins `referenceWhite` to the brightness-slider value (typically 80–120 nits) and gives at most a **4× headroom**.
- Hence **100 nits × 4 ≈ 400 nits**. Apple’s WWDC21 sample says ordinary back-lit Mac/iPad gets 2×, XDR displays 400×, iPad Pro XDR 16×. [Apple Developer]
2. **Moonlight is an “unsigned external stream”**
- After decode it goes through `AVSampleBufferDisplayLayer`, not Apple TV/AVPlayer’s trusted path.
- For power & burn-in reasons the system locks EDR to 4×, so whatever MaxCLL=1000 you declare in Windows, you still get 400 nits.
### PQ HDR10, HLG, Dolby Vision on Apple Devices
| Format | System Support | Theoretical Peak (nits) | Remote-Streaming Status |
|-------------------|-----------------------------------------------------------|--------------------------------|----------------------------------------------|
| **HDR10 (PQ)** | Fully supported across devices | Device ceiling (1000/1600) | Moonlight locked to 4× → ~400 nits |
| **HLG** | `AVPlayer.HDRMode.hlg` since iOS 11 [Apple Support] | Relative; 600–800 nits (slider)| Sunshine/Moonlight **don’t output HLG** |
| **Dolby Vision P8.4** | Native decode; Reference Mode explicitly supports it [Apple Support][Apple Developer] | Full 1000/1600 via Apple’s tone map | Practically **unworkable** for streaming: real-time RPU+EL injection and paid license required |
## Conclusion
The iPad Pro 2024 makes an excellent ultra-portable black-level reference, delivering 100 % Display P3 and solid Rec. 2020 end-to-end—*if* you fully configure the virtual display’s EDID (primaries, HDR static metadata, gamut), pick the right encoder (NVENC HEVC) and dial-in stability/quality settings.
Yet, ecosystem limits keep HDR-1000 a distant dream. **HLG** lacks tooling; **Dolby Vision** is fenced off by patents.
In the end I reverted **Max Luminance** and **Max Full Luminance* back to **400 nits** by calibrating a windows monitor color profile.