- Trên thế hệ M4·M5, màn hình 4K ngoài không hỗ trợ chế độ 3840×2160@2x HiDPI, và tối đa chỉ đạt 3360×1890
- Giới hạn này phát sinh do thay đổi trong cấu trúc firmware Display Coprocessor (DCP), không phải do vấn đề hiệu năng phần cứng
- Ngân sách framebuffer của M5 Max được phân bổ lại theo từng pipe, khiến chiều rộng của pipe luồng đơn bị giảm xuống còn 6720 pixel
- Nhiều cách như chỉnh EDID, đổi cổng kết nối, điều chỉnh thuộc tính driver đã được thử nhưng đều không hiệu quả
- Hiện tại, cách khắc phục triệt để duy nhất là Apple sửa firmware DCP; giải pháp tạm thời là dùng phương thức mirror màn hình ảo để triển khai 2x HiDPI
Phân tích giới hạn HiDPI của màn hình 4K ngoài trên Apple Silicon M4/M5
- Apple Silicon thế hệ M4 và M5 không cung cấp chế độ 2x HiDPI đầy đủ (3840×2160@2x) cho màn hình 4K ngoài
- Chế độ HiDPI tối đa bị giới hạn ở 3360×1890, nên 3840×2160 HiDPI vốn khả dụng trên thế hệ trước (M2/M3) nay không còn dùng được
- Người dùng buộc phải chọn giữa chế độ không HiDPI với chữ mờ hoặc không gian làm việc sắc nét nhưng bị thu nhỏ
- Giới hạn này bắt nguồn từ thay đổi trong cấu trúc firmware Display Coprocessor (DCP) chứ không phải giới hạn phần cứng
- Về thông số, M5 Max hỗ trợ 8K@60Hz, nhưng năng lực mà DCP báo cáo lại giống hệt M2 Max
- Trên thế hệ M4/M5, ngân sách framebuffer được phân bổ lại theo từng pipe, khiến ngân sách của đường 4K tiêu chuẩn bị giảm từ 7680 pixel xuống 6720 pixel
- Kết quả giải mã ngược firmware DCP cho thấy giá trị 6720 (0x1A40) tồn tại như một hằng số được hardcode
Môi trường thử nghiệm và kết quả so sánh
| Hạng mục |
M5 Max (có vấn đề) |
M2 Max (hoạt động bình thường) |
| Chip |
Apple M5 Max |
Apple M2 Max |
| Model ID |
Mac17,6 |
Mac14,6 |
| GPU core |
40 |
38 |
| macOS |
26.4 (25E246) |
26.4 (25E246) |
| Màn hình |
LG HDR 4K 32UN880 |
LG HDR 4K 32UN880 |
| Kết nối |
USB-C/Thunderbolt (HBR3, 8.1Gbps, 4 lanes) |
Giống nhau |
| Chế độ HiDPI tối đa |
3360×1890 |
3840×2160 |
- Trên cả hai hệ thống, các tham số DCP như
MaxActivePixelRate, MaxW, MaxH, MaxBpc đều giống nhau
- Trong đầu ra
system_profiler, backing store của M5 Max hiển thị là 6720×3780, còn UI là 3360×1890 HiDPI
- Trong danh sách
HiDPI modes, cũng không có mục 3840×2160@2x
Thay đổi trong cấu trúc framebuffer và pipe
- M2 Max dùng một ngân sách duy nhất theo từng controller (
MaxSrcRectWidth=7680)
- M5 Max chuyển sang cấu trúc ngân sách theo từng sub-pipe (
MaxSrcRectWidthForPipe=(6720,7680,7680,7680))
- Xuất 4K luồng đơn chỉ dùng sub-pipe 0 (6720)
- Xuất 8K dùng 2 sub-pipe (0,2)
- Vì vậy, 4K HiDPI (backing store 7680×4320) vượt quá ngân sách của sub-pipe 0 nên không thể tạo được
| Sub-pipe |
MaxSrcRectWidth |
Mục đích |
| 0 |
6720 |
Luồng đơn (màn hình tiêu chuẩn) |
| 1–3 |
7680 |
Multi-pipe (8K, v.v.) |
- So sánh
MaxVideoSrcDownscalingWidth
| Controller |
MaxSrcRectWidthForPipe[0] |
MaxVideoSrcDownscalingWidth |
Tỷ lệ |
| Màn hình trong |
5120 |
10744 |
2.1x |
| Màn hình ngoài |
6720 |
6720 |
1.0x |
- Màn hình trong có dư địa cho scaler, còn màn hình ngoài thì không, nên không thể có 3840×2160 HiDPI
MaxSrcRectWidthForPipe và MaxVideoSrcDownscalingWidth được cố định khi driver được nạp nên không thể thay đổi lúc runtime
- Đổi cổng, dùng chế độ clamshell, chỉnh EDID... đều vẫn giữ nguyên 6720
Phân tích firmware DCP
- File firmware nằm tại đường dẫn
/System/Volumes/Preboot/<UUID>/restore/Firmware/dcp/, và M5 Max dùng t605xdcp.im4p
- File ở trạng thái nén LZFSE (4.1MB → 16.4MB) và không bị mã hóa, nên có thể trích xuất bằng
img4tool
- Các thuộc tính liên quan đến HiDPI như
MaxVideoSrcDownscalingWidth, MaxSrcRectWidthForPipe, IOMFBMaxSrcPixels, ExternalAppleLook đều được định nghĩa bên trong firmware này
- Hàm
IOMFB::UPPipe::verify_downscaling(SwapRequest *) kiểm tra độ rộng nguồn được yêu cầu dựa trên MaxVideoSrcDownscalingWidth
- Kết quả phân tích bằng Ghidra
- Sub-pipe 0 của màn hình ngoài:
0x1A40 (6720)
- Sub-pipe 1~3:
0x1E00 (7680)
- Sub-pipe 0 của màn hình trong:
0x1400 (5120)
- Chiều cao của mọi Sub-pipe:
0x1200 (4608)
- Giới hạn hoạt động theo hai bước
MaxSrcRectWidthForPipe[0] (6720) → giới hạn ở bước liệt kê mode
MaxVideoSrcDownscalingWidth (6720) → giới hạn ở bước xác thực runtime
- Do các pipe khác của cùng controller vẫn hỗ trợ 7680, có thể xác nhận đây là chính sách firmware chứ không phải ràng buộc phần cứng
Các nỗ lực khắc phục
-
Display Override Plist
- Thêm độ phân giải HiDPI 7680×4320 vào
/Library/Displays/.../DisplayVendorID-1e6d/DisplayProductID-7750
- Trên M5 Max không có tác dụng, nhưng trên M2 Max thì hoạt động bình thường
- WindowServer trên M5 Max không liệt kê mode đó
-
Bản vá EDID bằng phần mềm
- Chèn EDID đã chỉnh sửa vào
IODisplayEDID (4095×4095, xung pixel tối đa 655.35MHz, v.v.)
- Không có tác dụng
- Nhà phát triển BetterDisplay cho biết từng có trường hợp thành công trong việc giành framebuffer 8K trên M4 bằng EDID override phần mềm
- Tuy nhiên, panel 4K không thể hiển thị tín hiệu 8K thật, nên đây không phải giải pháp thực tế
-
Flash EDID bằng phần cứng
- Thêm mode 7680×4320@60Hz (VIC 199) vào EDID rồi flash vào EEPROM của màn hình LG
- DCP cập nhật thành
MaxW=7680, MaxH=4320, nhưng giới hạn 6720 của sub-pipe 0 vẫn giữ nguyên
- Khi đặt timing 8K làm mặc định, mode 3840×2160@2x được tạo ra, nhưng macOS cố xuất tín hiệu 8K thật nên không thể hiển thị
-
Chỉnh IORegistry của IOKit
- Thử sửa trực tiếp các thuộc tính DCP như
DisplayHints, ConnectionMapping
- Driver kernel (
AppleDisplayCrossbar) từ chối ghi (kIOReturnUnsupported)
-
Các thử nghiệm khác
- Xóa cache WindowServer, giảm số lượng màn hình kết nối, chuyển sang HDMI, gọi API riêng tư của SkyLight (
SLConfigureDisplayWithDisplayMode) đều thất bại
- Khi giả dạng thành màn hình Apple (chèn Apple Vendor ID vào EDID), hệ thống hiện là “Apple Pro Display X” nhưng
ExternalAppleLook=No, ngân sách không thay đổi
-
Tóm tắt kết quả ghi thuộc tính IOKit
| Dịch vụ |
Phương thức |
Kết quả |
| IOMobileFramebufferShim |
IORegistryEntrySetCFProperty |
kIOReturnUnsupported |
| AppleDisplayCrossbar v.v. |
IORegistryEntrySetCFProperty |
kIOReturnNotReady |
| IOAVController |
IORegistryEntrySetCFProperty |
Accepted (nhưng không được chuyển vào DCP) |
Thử nghiệm boot arg RuntimeProperty
- Trong firmware có hàm
IOMobileFramebuffer::parse_RTP_boot_args(), cho thấy có khả năng ghi đè thuộc tính khi khởi động
- Ví dụ:
iomfb_RuntimeProperty_ExternalAppleLook, iomfb_enable_bw_check, iomfb_dual_pipe_policy v.v.
- Đã thử bằng
sudo nvram boot-args= trong trạng thái nới lỏng SIP và Startup Security, nhưng firmware DCP không phản hồi
- Có vẻ đường mã này chỉ được kích hoạt cho mục đích phát triển
Cách lách tạm thời bằng Virtual Display Mirror
- Đã tạo công cụ CLI
force-hidpi dùng API riêng tư SLVirtualDisplay của SkyLight để tạo màn hình ảo (7680×4320) rồi mirror phần cứng sang panel 4K thật
- Đường mirror phần cứng bỏ qua kiểm tra
verify_downscaling
- Trong
system_profiler sẽ hiển thị “Hardware Mirror: Yes”
- Cách này cho phép triển khai 3840×2160 HiDPI
- Văn bản sắc nét và giao diện macOS được render ở mật độ 2x bình thường
- Màn hình ảo dùng PQ (ST 2084) EOTF và áp dụng hiệu chỉnh gamma cho panel SDR
- Nhược điểm
- Công cụ phải chạy liên tục, tắt đi thì hệ thống quay lại 1.0x
- Cài đặt hệ thống sẽ hiện thêm một màn hình
- Kết xuất chữ hơi khác so với HiDPI native trên M2 Max
- Phụ thuộc vào API riêng tư, nên có thể thiếu ổn định khi macOS cập nhật
Tóm tắt nguyên nhân và khả năng sửa lỗi
- M2 Max: ngân sách 7680 pixel cho mỗi controller → có thể dùng 3840×2160 HiDPI
- M5 Max: đổi sang cấu trúc sub-pipe nên pipe luồng đơn (0) bị giới hạn ở 6720
- Vì vậy, mức tối đa của 4K HiDPI bị giảm xuống 3360×1890
- Chỉnh EDID, đổi cổng, điều chỉnh số lượng màn hình... đều không thể thay đổi
- Cách khắc phục gốc là Apple sửa firmware DCP (
t605xdcp.im4p)
- Nâng hằng số hardcode 0x1A40 → 0x1E00
- Cho phép backing store HiDPI multi-pipe ngay cả trên pipe đơn
- Cho phép phân bổ động dựa trên màn hình đang kết nối
- Công khai thuộc tính runtime hoặc boot arg
- Apple Feedback FB22365722 đã được gửi
- Apple đã nhận biết vấn đề và hiện đang xử lý bằng cách thêm cảnh báo giới hạn độ phân giải scale trên trang sản phẩm
Tóm tắt lệnh chẩn đoán
ioreg -l -w0 | grep "IOMFBMaxSrcPixels" : kiểm tra ngân sách framebuffer theo từng pipe
ioreg -l -w0 | grep "MaxVideoSrcDownscalingWidth" : kiểm tra giới hạn scaler
system_profiler SPDisplaysDataType : xem tóm tắt màn hình
CGSGetNumberOfDisplayModes : kiểm tra danh sách mode HiDPI
Ví dụ M2 Max hoạt động bình thường
- Có mode 3840×2160@2x HiDPI
- Tham số DCP:
MaxW=3840, MaxH=2160, MaxActivePixelRate=497,664,000
IOMFBMaxSrcPixels xác nhận MaxSrcRectWidth=7680
- Có thể dùng chế độ HiDPI đầy đủ trên cùng màn hình LG HDR 4K
2 bình luận
Ngay cả những thứ cơ bản cũng nên làm cho thật chắc chứ..
Ý kiến trên Hacker News
Gần đây tôi mới mua MacBook Pro M5 Pro đầu tiên, và đang hơi hối hận
Bản thân chiếc laptop thì rất tuyệt, nhưng nó không tương thích đúng cách với màn hình LG 38WN95C-W của tôi (3840x1600@144Hz, USB-C)
Có thể dùng BetterDisplay để chạy 3360x1400 HiDPI, nhưng lại mất đi không gian màn hình mà tôi đã quen dùng
Tôi không ngờ M5 lại tệ hơn thế hệ trước. Apple làm tốt rất nhiều thứ, nhưng lại vấp ở những điểm cơ bản như thế này
Giờ chắc phải hỏi Apple Intelligence cách giải thích với vợ rằng tôi cần một màn hình mới
Đó là lỗi DisplayPort DSC khiến macOS không hỗ trợ tần số quét trên 60Hz kể từ Catalina
Bộ phận hỗ trợ Apple chỉ lặp đi lặp lại việc chẩn đoán suốt nhiều tuần rồi kết thúc bằng “WontFix”, nhưng sau email đó thì đã được sửa trên Sonoma
Liên kết diễn đàn liên quan
Vấn đề xuất hiện sau khi chuyển từ macOS Sequoia sang Tahoe
có thể họ đã thương lượng theo kiểu đánh lừa màn hình không phải của Apple rằng GPU chỉ hỗ trợ 1.2.
Có khi vấn đề lần này cũng là phần nối dài của chuyện đó
Có thể thấy tác giả đã bỏ ra một lượng công sức khổng lồ để giải quyết vấn đề này.
Thật đáng buồn khi phải làm đến mức đó thì Apple mới nhận ra vấn đề
Cuối cùng tôi xử lý được bằng cách gỡ giới hạn của Mac trong BetterDisplay, rồi kết hợp cáp DisplayLink với đầu chuyển HDMI có cấp nguồn
5120x1440 @ lodpi thì quá mờ, nhưng tôi đã ổn định ở 10240x2880 @ 120Hz HDR
Đọc tiêu đề mà tôi bật cười. Tôi đồng cảm sâu sắc với nỗi khổ của OP
Có lẽ tác giả cũng bắt đầu trong tình trạng gần như không có kiến thức gì về màn hình
Tôi cũng phát điên vì màn hình 4K ngoài trên M4 MacBook mới của mình trông bị mờ
Sao chép lại cấu hình cũ cũng không giải quyết được, nên tôi bắt đầu nghi ngờ liệu Apple có chỉ tối ưu cho màn hình của hãng hay không
Ngay cả Windows 11 cũng không gặp vấn đề kiểu này, còn macOS thì chữ trên màn hình không phải của Apple trông rất lạ
Từ thời Intel Mac trước đây tôi cũng từng gặp chuyện này khi kết nối qua dock Thunderbolt
Tôi ước gì họ hỗ trợ lại tùy chọn render subpixel
Tôi đã dùng màn hình 4K 43" ở scale 1x suốt 8 năm nay và không cảm nhận được khác biệt giữa Linux, M1 hay M4
Nếu là màn hình có EDID bị lỗi, thì có thể xử lý bằng ứng dụng CLI screenresolution
Tôi đã dùng nó để đặt độ phân giải và tần số quét tùy ý, và chạy ổn định tới 100Hz
Có phải tác giả đang muốn render màn hình 4K bằng framebuffer 8K rồi downscale không?
Tôi tò mò không biết nó có lợi thế gì so với 4K low-DPI thông thường. Kiểu như anti-aliasing miễn phí à?
Windows sẽ làm chữ bị mờ ở scale 1.5x, còn macOS thì downscale framebuffer 6K xuống 4K để giữ độ sắc nét
Ngay cả với màn hình 2K, nếu giảm framebuffer 5K ảo xuống 2K thì vẫn sắc nét hơn nhiều so với 2K mặc định của macOS
Tôi cũng gặp vấn đề tương tự trên M5 Air
Màn hình 4K 60Hz thì không sao, nhưng khi cắm hai màn hình gaming 4K tần số quét cao cùng lúc thì một cái không được nhận
Sau khi thử đổi cáp các kiểu, cuối cùng tôi nhận ra là do giới hạn băng thông
Đây không phải cấu hình Retina thông thường.
Đây là một thiết lập đặc biệt, trong đó framebuffer lớn hơn nhiều so với độ phân giải thực rồi mới bị downscale
Có lẽ Apple không quan tâm vì đa số người dùng không muốn kiểu cấu hình này
nên việc Mac, vốn được xem là nền tảng tiêu biểu cho giới sáng tạo, lại không làm được thì hơi thất vọng
Nếu là HiDPI thì chẳng phải là 1080p@2x sao? Cái đó vẫn làm được chứ?
Nhưng tôi không hiểu vì sao lại dùng buffer 7680x4320.
Tôi đang dùng màn hình 4K trên M4 Mac với buffer 5120x2880 (2560x1440@2x) và nó hoạt động tốt
Theo macOS Sequoia
Đó chỉ là 2160p@2x trên màn hình 8K mà thôi. Scale 4K 100% thì trên hệ điều hành nào nhìn cũng không đẹp
Sẽ thuyết phục hơn nếu bài có ảnh chụp màn hình so sánh độ mờ của văn bản