Apple Silicon M4・M5チップで外部4KディスプレイのHiDPI解像度制限が発生
(smcleod.net)- M4・M5世代では、外部4Kモニターで 3840×2160@2x HiDPIモード がサポートされず、最大 3360×1890 までしか利用できない
- この制限は Display Coprocessor(DCP)ファームウェア構造の変更 によって生じており、ハードウェア性能の問題ではない
- M5 Maxの フレームバッファ予算がパイプごとに再割り当て され、単一ストリームパイプの幅が6720ピクセルに縮小された
- EDID修正、ポート変更、ドライバー属性調整などさまざまな方法が試されたが、いずれも効果なし
- 現時点で完全な解決策は AppleがDCPファームウェアを修正 することであり、暫定的には仮想ディスプレイのミラーリング方式で2x HiDPIを実現できる
Apple Silicon M4/M5 外部4Kディスプレイ HiDPI制限の分析
- M4およびM5世代のApple Silicon では、外部4Kモニターの 完全な2x HiDPIモード(3840×2160@2x) が提供されない
- 最大HiDPIモードは 3360×1890 に制限され、前世代(M2/M3)で可能だった3840×2160 HiDPIは利用不可
- ユーザーは 非HiDPIモードのぼやけた文字 か 鮮明だが縮小された作業領域 のどちらかを選ぶ必要がある
- この制限は ハードウェア限界ではなくDisplay Coprocessor(DCP)ファームウェア構造の変更 に起因する
- M5 Maxは仕様上8K@60Hzをサポートするが、DCPが報告する機能はM2 Maxと同じ
- M4/M5世代では フレームバッファ予算(framebuffer budget) がパイプごとに再割り当てされ、標準4K経路の予算が 7680ピクセルから6720ピクセルへ縮小
- DCPファームウェアの逆アセンブル結果では、6720(0x1A40) の値がハードコードされた定数として存在する
テスト環境および比較結果
| 項目 | M5 Max (問題あり) | M2 Max (正常動作) |
|---|---|---|
| チップ | Apple M5 Max | Apple M2 Max |
| モデルID | Mac17,6 | Mac14,6 |
| GPUコア | 40 | 38 |
| macOS | 26.4 (25E246) | 26.4 (25E246) |
| ディスプレイ | LG HDR 4K 32UN880 | LG HDR 4K 32UN880 |
| 接続 | USB-C/Thunderbolt (HBR3, 8.1Gbps, 4 lanes) | 同一 |
| 最大HiDPIモード | 3360×1890 | 3840×2160 |
- 両システムとも
MaxActivePixelRate,MaxW,MaxH,MaxBpcなどのDCPパラメータは同一 system_profiler出力では、M5 Maxのバッキングストアは 6720×3780、UIは 3360×1890 HiDPI と表示されるHiDPI modes一覧にも3840×2160@2xの項目は存在しない
フレームバッファおよびパイプ構造の変化
- M2 Maxはコントローラ単位の単一予算(
MaxSrcRectWidth=7680)を使用 - M5 Maxは サブパイプ別の予算構造(
MaxSrcRectWidthForPipe=(6720,7680,7680,7680))に変更- 単一ストリーム4K出力は sub-pipe 0(6720) のみを使用
- 8K出力時は2つのsub-pipe(0,2)を使用
- このため、4K HiDPI(7680×4320バッキングストア)はsub-pipe 0の予算を超え、生成できない
| Sub-pipe | MaxSrcRectWidth | 用途 |
|---|---|---|
| 0 | 6720 | 単一ストリーム (標準ディスプレイ) |
| 1–3 | 7680 | マルチパイプ (8Kなど) |
MaxVideoSrcDownscalingWidthの比較コントローラ MaxSrcRectWidthForPipe[0] MaxVideoSrcDownscalingWidth 比率 内蔵ディスプレイ 5120 10744 2.1x 外部ディスプレイ 6720 6720 1.0x - 内蔵ディスプレイにはスケーラの余裕があるが、外部には余裕がなく、3840×2160 HiDPIが不可能
MaxSrcRectWidthForPipeとMaxVideoSrcDownscalingWidthは ドライバーロード時に固定 され、実行時に変更不可- ポート変更、クラムシェルモード、EDID修正などでも同様に6720のまま
DCPファームウェア分析
- ファームウェアファイルは
/System/Volumes/Preboot/<UUID>/restore/Firmware/dcp/パスにあり、M5 Maxではt605xdcp.im4pを使用- LZFSE圧縮(4.1MB → 16.4MB) 状態で暗号化されておらず、
img4toolで抽出可能
- LZFSE圧縮(4.1MB → 16.4MB) 状態で暗号化されておらず、
- HiDPI関連属性(
MaxVideoSrcDownscalingWidth,MaxSrcRectWidthForPipe,IOMFBMaxSrcPixels,ExternalAppleLook)はすべてこのファームウェア内で定義されている IOMFB::UPPipe::verify_downscaling(SwapRequest *)関数がMaxVideoSrcDownscalingWidthを基準に要求されたソース幅を検証する- Ghidra分析結果
- 外部ディスプレイ Sub-pipe 0:
0x1A40(6720) - Sub-pipe 1~3:
0x1E00(7680) - 内蔵ディスプレイ Sub-pipe 0:
0x1400(5120) - すべてのSub-pipe高さ:
0x1200(4608)
- 外部ディスプレイ Sub-pipe 0:
- 制限は2段階で動作する
MaxSrcRectWidthForPipe[0](6720) → モード列挙段階で制限MaxVideoSrcDownscalingWidth(6720) → 実行時検証段階で制限
- 同一コントローラの別パイプが7680をサポートしているため、ハードウェア制約ではなくファームウェアポリシー であることが確認された
問題解決の試み
-
Display Override Plist
/Library/Displays/.../DisplayVendorID-1e6d/DisplayProductID-7750に7680×4320 HiDPI解像度を追加- M5 Maxでは効果なし、M2 Maxでは正常動作
- M5 MaxのWindowServerが該当モードを列挙しない
-
EDIDソフトウェアパッチ
IODisplayEDIDに修正済みEDIDを挿入 (4095×4095、最大ピクセルクロック655.35MHzなど)- 効果なし
- BetterDisplay開発者は、M4でソフトウェアEDIDオーバーライドにより8Kフレームバッファ確保に成功した事例を報告
- ただし4Kパネルは実際の8K信号を表示できず、実用的な解決策ではない
-
EDIDハードウェア書き込み
- 7680×4320@60Hz(VIC 199)モードをEDIDに追加後、LGモニターのEEPROMへ書き込み
- DCPが
MaxW=7680,MaxH=4320に更新されるが、sub-pipe 0の6720制限は維持 - 8Kタイミングを既定に設定すると3840×2160@2xモードは生成されるが、macOSが実際に8K信号を出力しようとして表示不可
-
IOKit Registry修正
DisplayHints,ConnectionMappingなどDCP属性の直接修正を試行- カーネルドライバー(
AppleDisplayCrossbar)が 書き込み拒否(kIOReturnUnsupported)
-
その他の試み
- WindowServerキャッシュ削除、接続ディスプレイ数削減、HDMI切り替え、SkyLight非公開API(
SLConfigureDisplayWithDisplayMode)呼び出しなど、いずれも失敗 - Appleディスプレイに偽装(EDIDにApple Vendor IDを挿入)すると「Apple Pro Display X」と表示されるが、
ExternalAppleLook=Noのままで予算変化なし
- WindowServerキャッシュ削除、接続ディスプレイ数削減、HDMI切り替え、SkyLight非公開API(
-
IOKit属性書き込み結果の要約
サービス メソッド 結果 IOMobileFramebufferShim IORegistryEntrySetCFProperty kIOReturnUnsupported AppleDisplayCrossbar など IORegistryEntrySetCFProperty kIOReturnNotReady IOAVController IORegistryEntrySetCFProperty Accepted (ただしDCPには伝播しない)
RuntimePropertyブート引数テスト
- ファームウェアには
IOMobileFramebuffer::parse_RTP_boot_args()関数が存在し、ブート時に属性を上書きできる可能性がある- 例:
iomfb_RuntimeProperty_ExternalAppleLook,iomfb_enable_bw_check,iomfb_dual_pipe_policyなど
- 例:
- SIPとStartup Securityを緩和した状態で
sudo nvram boot-args=によりテストしたが、DCPファームウェアは反応しなかった- このコードパスは 開発用にのみ有効化 されていると推定される
Virtual Display Mirror による暫定的な回避策
force-hidpiCLIツール を作成し、SkyLightの非公開SLVirtualDisplayAPI を利用して 仮想ディスプレイ(7680×4320) を生成し、実際の4Kパネルをハードウェアミラーリング- ハードウェアミラー経路は
verify_downscaling検査を回避する system_profilerでは「Hardware Mirror: Yes」と表示
- ハードウェアミラー経路は
- この方式で 3840×2160 HiDPI を実現可能
- テキストは鮮明で、macOS UIは通常の2x密度でレンダリングされる
- 仮想ディスプレイは PQ(ST 2084) EOTF を使用し、SDRパネル向けのガンマ補正を適用
- 欠点
- ツールを常時実行しておく必要があり、終了すると1.0xに戻る
- システム設定に追加ディスプレイが表示される
- M2 MaxのネイティブHiDPIよりテキストレンダリングがやや異なる
- 非公開API依存 のため、macOSアップデート時に不安定になる可能性がある
原因および修正可能性の要約
- M2 Max: コントローラあたり7680ピクセル予算 → 3840×2160 HiDPI可能
- M5 Max: sub-pipe構造に変更され、単一ストリームパイプ(0) が6720に制限
- これにより4K HiDPI最大値が3360×1890へ縮小
- EDID修正、ポート変更、ディスプレイ数調整などでは変更不可
- 根本的な解決策は AppleがDCPファームウェア(
t605xdcp.im4p)を修正 すること- ハードコード定数 0x1A40 → 0x1E00 へ引き上げ
- 単一パイプでもマルチパイプHiDPIバッキングストアを許可
- 接続ディスプレイに基づく動的割り当てを許可
- 実行時属性またはブート引数を公開
- Apple Feedback FB22365722 提出済み
- Appleは問題を認識しており、現在は 製品ページにスケーリング解像度制限の警告を追加 して対応中
診断コマンド要約
ioreg -l -w0 | grep "IOMFBMaxSrcPixels": パイプごとのフレームバッファ予算を確認ioreg -l -w0 | grep "MaxVideoSrcDownscalingWidth": スケーラ制限を確認system_profiler SPDisplaysDataType: ディスプレイ概要CGSGetNumberOfDisplayModes: HiDPIモード一覧を確認
M2 Max 正常動作の例
- 3840×2160@2x HiDPIモードが存在
- DCPパラメータ:
MaxW=3840,MaxH=2160,MaxActivePixelRate=497,664,000 IOMFBMaxSrcPixelsでMaxSrcRectWidth=7680を確認- 同一のLG HDR 4Kディスプレイで完全なHiDPIモードを利用可能
2件のコメント
基本的なところは、もう少ししっかりしてほしい……
Hacker Newsの意見
最近 MacBook Pro M5 Pro を初めて買ったが、少し後悔している
ノートPC自体は素晴らしいが、手元の LG 38WN95C-Wモニター(3840x1600@144Hz, USB-C) と きちんと互換性がない
BetterDisplayで 3360x1400 HiDPI は可能だが、慣れていた画面スペースを失ってしまう
M5 が前世代より悪いとは思わなかった。Appleは多くのことをうまくやっているが、こういう基本的な部分でミスをする
いまや Apple Intelligence に、妻へ新しいモニターが必要だとどう説明すればいいか聞かないといけない気がする
Catalina以降、macOSが60Hz超のリフレッシュレートをサポートしなかった DisplayPort DSCバグ だった
Appleサポートは数週間にわたり診断を繰り返した末に「WontFix」で終わったが、メール後に Sonoma で修正された
関連フォーラムリンク
macOS SequoiaからTahoeに変えた後に発生した問題だ
非AppleモニターにはGPUが1.2しかサポートしないと偽って交渉した可能性がある。
今回の問題もその延長線上かもしれない
投稿者がこの問題を解決するために途方もない努力を払ったのが分かる。
ここまでしないとAppleが問題を認識しないのは残念だ
結局 BetterDisplay でMacの制限を解除し、DisplayLinkケーブル と 給電対応HDMIドングル を組み合わせて解決した
5120x1440 @ lodpi はあまりにぼやけていたが、10240x2880 @ 120Hz HDR で安定した
タイトルを見て笑ってしまった。OPの苦しみがあまりにもよく分かる
投稿者もおそらくディスプレイの知識がほとんどない状態から始めたのだと思う
私も新しい M4 MacBook で外部4Kモニターがぼやけて見えて気が狂いそうだった
以前の設定をそのまま再現しても解決せず、もしかして Appleが自社製ディスプレイだけを最適化 しているのではと疑っている
Windows 11ですらこんな問題はないのに、macOSでは非Appleモニターで文字が不自然に見える
昔のIntel Mac時代にもThunderboltドック接続でこうした問題を経験した
サブピクセルレンダリングのオプション をまたサポートしてほしい
私は43" 4Kモニターを1xスケールで8年間使っているが、LinuxでもM1でもM4でも違いを感じなかった
もし EDIDが壊れたモニター なら、screenresolution CLI app で解決できるかもしれない
これで任意の解像度とリフレッシュレートを設定し、100Hzまで安定して使えた
もしかして筆者は4Kディスプレイを 8Kフレームバッファでレンダリングしてからダウンスケール しようとしているのか?
単純な4K low-DPIと比べてどんな利点があるのか気になる。いわば 無料のアンチエイリアシング なのか?
Windowsは1.5xスケーリング時に文字がぼやけるが、macOSは 6Kフレームバッファを4Kへダウンスケール して鮮明さを保つ
2Kモニターでも仮想5Kフレームバッファを2Kへ縮小すると、macOS標準の2Kよりはるかに鮮明だ
私も M5 Air で似た問題を経験した
60Hzの4Kモニターは問題ないが、高リフレッシュレートの4Kゲーミングモニター2台 を同時接続すると1台が認識されない
ケーブルを替えて試した末に、結局 帯域幅の限界 が原因だと気づいた
これは一般的な Retina構成 ではない。
フレームバッファが実解像度よりはるかに大きく、そこからダウンスケールされる特殊な設定だ
ほとんどのユーザーはこんな構成を望まないので、Appleも気にしていないのだろう
クリエイター向けプラットフォームの代表格 であるMacがこれをできないのは少し残念だ
HiDPIなら1080p@2xではないのか? それはまだ可能なのか?
なのに、なぜ7680x4320バッファを使うのか分からない。
私はM4 Macで4Kディスプレイを5120x2880(2560x1440@2x)バッファとして使っているが、問題なく動いている
macOS Sequoia時点の話だ
それは8Kモニターで2160p@2xと言っているのと同じだ。4K 100%スケールはどのOSでも見栄えがよくない
記事に テキストのぼけ比較スクリーンショット があれば、もっと説得力があると思う