1 điểm bởi GN⁺ 21 ngày trước | 2 bình luận | Chia sẻ qua WhatsApp
  • 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
  • MaxSrcRectWidthForPipeMaxVideoSrcDownscalingWidth đượ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
    1. MaxSrcRectWidthForPipe[0] (6720) → giới hạn ở bước liệt kê mode
    2. 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)
    1. Nâng hằng số hardcode 0x1A40 → 0x1E00
    2. Cho phép backing store HiDPI multi-pipe ngay cả trên pipe đơn
    3. Cho phép phân bổ động dựa trên màn hình đang kết nối
    4. 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

  • 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

    • Tôi cũng gặp vấn đề tương tự, nhưng đã được giải quyết sau khi gửi email cho Tim Cook
      Đó 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
      • Tôi không kỳ vọng email gửi CEO thực sự được chuyển tới nơi, nhưng biết đâu được nên tôi cũng đã gửi
      • Tôi cũng nâng cấp từ M1 Pro lên M5 Pro, nhưng ngay cả với cùng dock và cùng màn hình thì vẫn không chạy được quá 4K 60Hz
        Vấn đề xuất hiện sau khi chuyển từ macOS Sequoia sang Tahoe
      • Tôi cũng vừa gửi email xong. Vấn đề này thật quá vô lý
      • Nghe chuyện này tôi mới hiểu vì sao MacOS của tôi lại cho cảm giác chậm hơn Windows trên cùng một màn hình 144Hz
      • Chưa hẳn đã được sửa hoàn toàn. Apple từng can thiệp vào DP 1.4 để chạy ProDisplay XDR,
        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 đề

    • Tôi cũng từng vật lộn với G9 ultrawide 57" vì thiết lập PIP/PBP
      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
    • Tôi cũng vò đầu bứt tai suốt cả cuối tuần để tìm cách giải quyết, nhưng không có cách lách nào thực sự ổn
    • Tôi cũng gặp vấn đề tương tự, nhưng khi dùng Claude hoặc GPT để lần mò sự cố phần cứng thì chúng đưa ra các bước xử lý rất nhanh, khá hữu ích
      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

    • Cách macOS xử lý độ phân giải và scaling vẫn rất kỳ quặc
      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 không hiểu vì sao “lodpi” lại bị coi là mờ.
      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
    • Tôi cũng đã thử mọi tổ hợp bằng BetterDisplay, nhưng phông chữ vẫn bị mờ. Với các màn hình 5k2k cỡ lớn thì càng bực bội hơn
    • Nhìn chất lượng tổng thể của macOS dạo này cứ bất ổn, khả năng cao đây đơn giản là do quản lý công ty yếu kém
  • 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ảm ơn. Tuy nhiên có vẻ công cụ này chỉ thay đổi độ phân giải và tần số quét, chứ không điều khiển được HiDPI scaling
  • 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í à?

    • Đúng vậy. macOS có chất lượng render văn bản kém khi không ở scale 2x, nên người ta mới làm vậy
    • Điểm mấu chốt là để tránh suy giảm chất lượng khi scale ở độ phân giải không native
      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
    • Tôi cũng đang dùng BetterDisplay theo đúng cách này
      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

    • Tôi chỉ đơn giản là cắm LG UltraFine 4K tiêu chuẩn vào M5 MacBook Pro, mà lại bị coi là cấu hình bất thường thì thật khó hiểu
    • Chẳng phải đó là một dạng supersampling 2x sao? Muốn anti-aliasing hoàn hảo thì mức đó là cần thiết
    • Tôi cũng đồng ý rằng đây là cấu hình bất thường. Tôi không hiểu tại sao phải render ở số pixel gấp đôi rồi lại giảm xuống một nửa
    • Nhưng ngay cả laptop Windows phổ thông cũng xử lý kiểu độ phân giải này ngon lành,
      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ứ?

    • Đúng vậy. Với màn hình 3840x2160 thì trên macOS thường dùng 1920x1080@2x
      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
    • Tôi cũng không thực sự hiểu trọng tâm của bài này. 4K HiDPI trên màn hình 4K là thứ không tồn tại.
      Đó 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
    • Có vẻ rốt cuộc họ đang nói tới cấu hình 2160p@2x mang tính bất thường đó
  • 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

    • Cảm ơn góp ý. Chụp chính xác thì không dễ, nhưng tối nay sau giờ làm tôi sẽ thử thêm ảnh để cập nhật