- ใน Apple Silicon รุ่น M4·M5 จะไม่รองรับ โหมด HiDPI 3840×2160@2x บนจอ 4K ภายนอก และทำได้สูงสุดเพียง 3360×1890
- ข้อจำกัดนี้เกิดจาก การเปลี่ยนแปลงโครงสร้างเฟิร์มแวร์ Display Coprocessor (DCP) ไม่ใช่ปัญหาด้านประสิทธิภาพฮาร์ดแวร์
- ใน M5 Max มีการ จัดสรร framebuffer budget ใหม่ตามแต่ละ pipe ทำให้ความกว้างของ single-stream pipe ลดลงเหลือ 6720 พิกเซล
- มีการลองหลายวิธีแล้ว เช่น แก้ไข EDID เปลี่ยนพอร์ต และปรับแต่งคุณสมบัติของไดรเวอร์ แต่ ทั้งหมดไม่ได้ผล
- วิธีแก้ที่สมบูรณ์ในตอนนี้คือ Apple ต้องแก้เฟิร์มแวร์ DCP ส่วนทางออกชั่วคราวคือใช้การมิเรอร์ผ่าน virtual display เพื่อทำ 2x HiDPI
การวิเคราะห์ข้อจำกัด HiDPI ของจอ 4K ภายนอกบน Apple Silicon M4/M5
- Apple Silicon รุ่น M4 และ M5 ไม่รองรับ โหมด 2x HiDPI เต็มรูปแบบ (3840×2160@2x) สำหรับจอ 4K ภายนอก
- โหมด HiDPI สูงสุดถูกจำกัดไว้ที่ 3360×1890 ทำให้ไม่สามารถใช้ 3840×2160 HiDPI ได้เหมือนรุ่นก่อนหน้าอย่าง M2/M3
- ผู้ใช้ต้องเลือกระหว่าง ข้อความพร่ามัวในโหมดไม่ใช่ HiDPI หรือ ภาพคมชัดแต่พื้นที่ทำงานเล็กลง
- ข้อจำกัดนี้มาจาก การเปลี่ยนแปลงโครงสร้างเฟิร์มแวร์ Display Coprocessor (DCP) ไม่ใช่ข้อจำกัดของฮาร์ดแวร์
- แม้ M5 Max จะรองรับ 8K@60Hz ตามสเปก แต่ความสามารถที่ DCP รายงานออกมากลับเทียบเท่ากับ M2 Max
- ในรุ่น M4/M5 มีการจัดสรร framebuffer budget ใหม่ตามแต่ละ pipe ทำให้งบของเส้นทาง 4K มาตรฐานลดจาก 7680 พิกเซลเหลือ 6720 พิกเซล
- จากการถอดแยกเฟิร์มแวร์ DCP พบว่ามีค่าคงที่ 6720 (0x1A40) ถูกฮาร์ดโค้ดเอาไว้
สภาพแวดล้อมการทดสอบและผลการเปรียบเทียบ
| รายการ |
M5 Max (มีปัญหา) |
M2 Max (ทำงานปกติ) |
| ชิป |
Apple M5 Max |
Apple M2 Max |
| Model 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 |
- ทั้งสองระบบมีพารามิเตอร์ DCP เช่น
MaxActivePixelRate, MaxW, MaxH, MaxBpc เหมือนกัน
- จากผลลัพธ์
system_profiler บน M5 Max พบว่า backing store เป็น 6720×3780 และ UI แสดงเป็น 3360×1890 HiDPI
- ในรายการ
HiDPI modes ก็ไม่มีรายการ 3840×2160@2x อยู่ด้วย
การเปลี่ยนแปลงของ framebuffer และโครงสร้าง pipe
- M2 Max ใช้งบรวมแบบเดี่ยวต่อคอนโทรลเลอร์ (
MaxSrcRectWidth=7680)
- M5 Max เปลี่ยนเป็น โครงสร้างงบตาม sub-pipe (
MaxSrcRectWidthForPipe=(6720,7680,7680,7680))
- เอาต์พุต 4K แบบ single-stream ใช้เพียง sub-pipe 0 (6720)
- เอาต์พุต 8K ใช้ 2 sub-pipe คือ (0,2)
- ดังนั้น 4K HiDPI (backing store 7680×4320) จึงเกินงบของ sub-pipe 0 และไม่สามารถสร้างได้
| Sub-pipe |
MaxSrcRectWidth |
การใช้งาน |
| 0 |
6720 |
single-stream (จอมาตรฐาน) |
| 1–3 |
7680 |
multi-pipe (เช่น 8K) |
- การเปรียบเทียบ
MaxVideoSrcDownscalingWidth
| คอนโทรลเลอร์ |
MaxSrcRectWidthForPipe[0] |
MaxVideoSrcDownscalingWidth |
อัตราส่วน |
| จอภายใน |
5120 |
10744 |
2.1x |
| จอภายนอก |
6720 |
6720 |
1.0x |
- จอภายในยังมีเผื่อสำหรับสเกลเลอร์ แต่จอภายนอกไม่มี จึงไม่สามารถใช้ 3840×2160 HiDPI ได้
- ค่า
MaxSrcRectWidthForPipe และ MaxVideoSrcDownscalingWidth จะถูก ตรึงไว้ตอนโหลดไดรเวอร์ และไม่สามารถเปลี่ยนระหว่างรันไทม์ได้
- ต่อให้เปลี่ยนพอร์ต ใช้โหมด clamshell หรือแก้ EDID ก็ยังคงเป็น 6720 เหมือนเดิม
การวิเคราะห์เฟิร์มแวร์ DCP
- ไฟล์เฟิร์มแวร์อยู่ที่
/System/Volumes/Preboot/<UUID>/restore/Firmware/dcp/ และใน M5 Max ใช้ t605xdcp.im4p
- อยู่ในสถานะ บีบอัดด้วย LZFSE (4.1MB → 16.4MB) และไม่ถูกเข้ารหัส จึงแยกออกได้ด้วย
img4tool
- คุณสมบัติที่เกี่ยวข้องกับ 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)
- ข้อจำกัดนี้ทำงานเป็นสองขั้น
MaxSrcRectWidthForPipe[0] (6720) → จำกัดตั้งแต่ขั้นตอน enumerate โหมด
MaxVideoSrcDownscalingWidth (6720) → จำกัดอีกครั้งตอนตรวจสอบระหว่างรันไทม์
- เมื่อพิจารณาว่า pipe อื่นในคอนโทรลเลอร์เดียวกันรองรับ 7680 ได้ จึงยืนยันได้ว่านี่เป็น นโยบายของเฟิร์มแวร์ ไม่ใช่ข้อจำกัดของฮาร์ดแวร์
ความพยายามในการแก้ปัญหา
-
Display Override Plist
- เพิ่มความละเอียด HiDPI 7680×4320 ลงใน
/Library/Displays/.../DisplayVendorID-1e6d/DisplayProductID-7750
- บน M5 Max ไม่มีผล แต่บน M2 Max ใช้งานได้ตามปกติ
- WindowServer บน M5 Max ไม่ enumerate โหมดดังกล่าว
-
ซอฟต์แวร์แพตช์ EDID
- แทรก EDID ที่แก้ไขแล้วลงใน
IODisplayEDID (4095×4095, maximum pixel clock 655.35MHz ฯลฯ)
- ไม่ได้ผล
- ผู้พัฒนา BetterDisplay รายงานว่าบน M4 เคยมีกรณีที่ซอฟต์แวร์ EDID override ช่วยให้ได้ 8K framebuffer
- แต่เนื่องจากแผง 4K ไม่สามารถแสดงสัญญาณ 8K จริงได้ จึงไม่ใช่วิธีแก้ที่ใช้ได้จริง
-
แฟลช EDID ที่ฮาร์ดแวร์
- เพิ่มโหมด 7680×4320@60Hz (VIC 199) ลงใน EDID แล้วแฟลชลง EEPROM ของจอ LG
- แม้ DCP จะอัปเดตเป็น
MaxW=7680, MaxH=4320 แต่ ข้อจำกัด 6720 ของ sub-pipe 0 ยังคงอยู่
- เมื่อกำหนดให้ใช้ timing 8K เป็นค่าเริ่มต้น จะสามารถสร้างโหมด 3840×2160@2x ได้ แต่ macOS จะพยายามส่งสัญญาณ 8K จริง ทำให้แสดงผลไม่ได้
-
การแก้ไข IOKit Registry
- ลองแก้คุณสมบัติ DCP โดยตรง เช่น
DisplayHints, ConnectionMapping
- แต่เคอร์เนลไดรเวอร์ (
AppleDisplayCrossbar) ปฏิเสธการเขียน (kIOReturnUnsupported)
-
ความพยายามอื่น ๆ
- ลบแคชของ WindowServer ลดจำนวนจอที่เชื่อมต่อ สลับไปใช้ HDMI และเรียก SkyLight private API (
SLConfigureDisplayWithDisplayMode) ล้วนไม่สำเร็จ
- หากปลอมตัวเป็นจอ Apple (ใส่ Apple Vendor ID ใน EDID) ระบบจะแสดงเป็น “Apple Pro Display X” แต่
ExternalAppleLook=No และงบประมาณก็ไม่เปลี่ยน
-
สรุปผลการเขียนคุณสมบัติ IOKit
| บริการ |
เมธอด |
ผลลัพธ์ |
| IOMobileFramebufferShim |
IORegistryEntrySetCFProperty |
kIOReturnUnsupported |
| AppleDisplayCrossbar และอื่น ๆ |
IORegistryEntrySetCFProperty |
kIOReturnNotReady |
| IOAVController |
IORegistryEntrySetCFProperty |
Accepted (แต่ไม่ถูกส่งต่อไปยัง DCP) |
การทดสอบ boot args ของ RuntimeProperty
- ในเฟิร์มแวร์มีฟังก์ชัน
IOMobileFramebuffer::parse_RTP_boot_args() ซึ่งบ่งชี้ว่าอาจสามารถ override คุณสมบัติได้ตอนบูต
- ตัวอย่างเช่น
iomfb_RuntimeProperty_ExternalAppleLook, iomfb_enable_bw_check, iomfb_dual_pipe_policy เป็นต้น
- มีการทดสอบด้วย
sudo nvram boot-args= ภายใต้สภาพแวดล้อมที่ผ่อนคลาย SIP และ Startup Security แล้ว แต่เฟิร์มแวร์ DCP ไม่ตอบสนอง
- จึงคาดว่าโค้ดเส้นทางดังกล่าว เปิดใช้เฉพาะในงานพัฒนาเท่านั้น
วิธีหลบข้อจำกัดชั่วคราวด้วย Virtual Display Mirror
- มีการสร้างเครื่องมือ CLI ชื่อ
force-hidpi โดยใช้ private SLVirtualDisplay API ของ SkyLight เพื่อสร้าง virtual display (7680×4320) แล้วทำ hardware mirroring ไปยังแผง 4K จริง
- เส้นทาง hardware mirror จะข้ามการตรวจสอบ
verify_downscaling
- ใน
system_profiler จะแสดงเป็น “Hardware Mirror: Yes”
- วิธีนี้ทำให้สามารถใช้ 3840×2160 HiDPI ได้
- ข้อความคมชัด และ macOS เรนเดอร์ UI ที่ความหนาแน่น 2x ตามปกติ
- virtual display ใช้ PQ (ST 2084) EOTF และมีการปรับแกมมาสำหรับจอ SDR
- ข้อเสีย
- เครื่องมือต้องรันค้างไว้ตลอด และเมื่อปิดจะกลับไปเป็น 1.0x
- มีจอเพิ่มขึ้นใน System Settings
- การเรนเดอร์ข้อความแตกต่างจาก HiDPI แบบเนทีฟบน M2 Max เล็กน้อย
- เนื่องจาก พึ่งพา private API จึงอาจไม่เสถียรเมื่อ macOS อัปเดต
สรุปสาเหตุและความเป็นไปได้ในการแก้ไข
- M2 Max: มีงบ 7680 พิกเซลต่อคอนโทรลเลอร์ → ใช้ 3840×2160 HiDPI ได้
- M5 Max: เปลี่ยนเป็นโครงสร้างแบบ sub-pipe ทำให้ single-stream pipe (0) ถูกจำกัดที่ 6720
- ส่งผลให้เพดานของ 4K HiDPI ลดลงเหลือ 3360×1890
- การแก้ EDID เปลี่ยนพอร์ต หรือปรับจำนวนจอ ไม่สามารถเปลี่ยนแปลงได้
- วิธีแก้ถาวรคือ Apple ต้องแก้เฟิร์มแวร์ DCP (
t605xdcp.im4p)
- ปรับค่าคงที่ฮาร์ดโค้ด 0x1A40 → 0x1E00
- อนุญาต backing store แบบ multi-pipe HiDPI แม้ใน single-pipe
- อนุญาตการจัดสรรแบบไดนามิกตามจอที่เชื่อมต่อ
- เปิดเผย runtime property หรือ boot arg ที่ใช้ควบคุมได้
- มีการส่ง Apple Feedback หมายเลข FB22365722 แล้ว
- Apple รับทราบปัญหาแล้ว และขณะนี้ตอบสนองด้วยการ เพิ่มคำเตือนเรื่องข้อจำกัดของ scaled resolution บนหน้าผลิตภัณฑ์
สรุปคำสั่งสำหรับการวินิจฉัย
ioreg -l -w0 | grep "IOMFBMaxSrcPixels" : ตรวจสอบ framebuffer budget ของแต่ละ pipe
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
- ยืนยัน
MaxSrcRectWidth=7680 ได้จาก IOMFBMaxSrcPixels
- ใช้โหมด HiDPI เต็มรูปแบบได้บนจอ LG HDR 4K รุ่นเดียวกัน
2 ความคิดเห็น
เรื่องพื้นฐานก็ควรทำให้มันแน่นอนหน่อยสิ..
ความคิดเห็นจาก Hacker News
เพิ่งซื้อ MacBook Pro M5 Pro มาไม่นาน และเริ่มรู้สึกเสียดายนิดหน่อย
ตัวโน้ตบุ๊กเองยอดเยี่ยมมาก แต่กลับใช้งานร่วมกับ จอ LG 38WN95C-W (3840x1600@144Hz, USB-C) ของฉันได้ไม่ลงตัว
ใช้ BetterDisplay เพื่อเปิด 3360x1400 HiDPI ได้ แต่ก็ต้องแลกกับพื้นที่หน้าจอที่เคยชิน
ไม่คิดเลยว่า M5 จะออกมาแย่กว่ารุ่นก่อนในจุดนี้ Apple ทำหลายอย่างได้ดีมาก แต่กลับพลาดเรื่องพื้นฐานแบบนี้
ตอนนี้คงต้องไปถาม Apple Intelligence ว่าจะอธิบายกับภรรยายังไงว่าฉันต้องการจอใหม่
มันเป็น บั๊ก DisplayPort DSC ที่ทำให้ macOS ไม่รองรับรีเฟรชเรตเกิน 60Hz มาตั้งแต่ Catalina
ทีมซัพพอร์ตของ Apple วนอยู่กับการวินิจฉัยหลายสัปดาห์ก่อนจะปิดเรื่องแบบ “WontFix” แต่หลังจากส่งอีเมลแล้วก็ถูกแก้ใน Sonoma
ลิงก์ฟอรัมที่เกี่ยวข้อง
ปัญหานี้เกิดหลังเปลี่ยนจาก macOS Sequoia ไป Tahoe
และอาจต่อรองกับจอที่ไม่ใช่ของ Apple โดยหลอกว่า GPU รองรับแค่ 1.2 เท่านั้น
ปัญหาครั้งนี้อาจเป็นส่วนต่อเนื่องจากเรื่องนั้นก็ได้
เห็นได้ชัดว่าผู้เขียนทุ่มความพยายามมหาศาลเพื่อแก้ปัญหานี้
มันน่าเสียดายที่ต้องทำถึงขนาดนี้ Apple ถึงจะรับรู้ว่ามีปัญหา
สุดท้ายแก้ได้ด้วยการปลดข้อจำกัดของ Mac ใน BetterDisplay แล้วใช้ทั้ง สาย DisplayLink และ ดองเกิล HDMI แบบมีไฟเลี้ยง ร่วมกัน
5120x1440 @ lodpi มัวเกินไป แต่ฉันทำให้มันนิ่งที่ 10240x2880 @ 120Hz HDR ได้
เห็นหัวข้อแล้วหลุดขำเลย เพราะเข้าใจความทรมานของ OP มาก
ผู้เขียนก็น่าจะเริ่มต้นจากจุดที่แทบไม่มีความรู้เรื่องจอแสดงผลเหมือนกัน
ฉันก็แทบเป็นบ้ากับ M4 MacBook เครื่องใหม่ เพราะภาพจากจอ 4K ภายนอกดูมัว
ต่อให้คัดลอกการตั้งค่าเดิมมาก็ไม่หาย เลยเริ่มสงสัยว่า Apple ปรับแต่งมาเพื่อจอของตัวเองเท่านั้นหรือเปล่า
แม้แต่ Windows 11 ก็ไม่มีปัญหาแบบนี้ แต่บน macOS ตัวอักษรบนจอที่ไม่ใช่ของ Apple กลับดูแปลกๆ
สมัย Intel Mac ก่อนหน้านี้ฉันก็เคยเจอปัญหานี้ตอนต่อผ่าน Thunderbolt dock
อยากให้รองรับ ตัวเลือก subpixel rendering กลับมาอีกครั้ง
ฉันใช้จอ 43" 4K แบบสเกล 1x มา 8 ปีแล้ว และไม่รู้สึกถึงความต่างระหว่าง Linux, M1 หรือ M4 เลย
ถ้าเป็นกรณีที่ EDID ของจอเพี้ยน ลองแก้ด้วย screenresolution CLI app ได้
ฉันใช้มันตั้งค่าความละเอียดและรีเฟรชเรตเองได้ และใช้งาน 100Hz ได้อย่างเสถียร
หรือว่าผู้เขียนกำลังพยายามให้จอ 4K เรนเดอร์ด้วยเฟรมบัฟเฟอร์ 8K แล้วค่อยดาวน์สเกล?
ฉันสงสัยว่ามันได้ประโยชน์อะไรเมื่อเทียบกับ 4K low-DPI ปกติ มันคือ anti-aliasing ฟรี แบบหนึ่งหรือเปล่า?
Windows จะทำให้ข้อความมัวเมื่อใช้สเกล 1.5x แต่ macOS จะ ใช้เฟรมบัฟเฟอร์ 6K แล้วดาวน์สเกลลงมาเป็น 4K เพื่อรักษาความคมชัด
แม้แต่จอ 2K ถ้าใช้เฟรมบัฟเฟอร์ 5K เสมือนแล้วลดลงมาเป็น 2K ก็ยังคมกว่า 2K ปกติของ macOS มาก
ฉันก็เจอปัญหาคล้ายกันบน M5 Air
จอ 4K 60Hz ใช้งานได้ปกติ แต่ถ้าต่อ จอเกมมิง 4K รีเฟรชเรตสูงสองจอ พร้อมกัน จะมีจอหนึ่งไม่ถูกตรวจพบ
ลองเปลี่ยนสายไปมาสุดท้ายก็พบว่าเป็นเพราะ ข้อจำกัดด้านแบนด์วิดท์
นี่ไม่ใช่การตั้งค่า Retina แบบทั่วไป
มันเป็นการตั้งค่าที่ค่อนข้างแปลก ซึ่งใช้เฟรมบัฟเฟอร์ใหญ่กว่าความละเอียดจริงมากแล้วค่อยดาวน์สเกล
ผู้ใช้ส่วนใหญ่คงไม่ได้ต้องการแบบนี้ Apple เลยไม่น่าจะใส่ใจมากนัก
เลยค่อนข้างน่าผิดหวังที่ Mac ซึ่งเป็น แพลตฟอร์มหลักสำหรับสายงานสร้างสรรค์ กลับทำเรื่องนี้ไม่ได้
ถ้าเป็น HiDPI ก็น่าจะหมายถึง 1080p@2x ไม่ใช่หรือ? แบบนั้นยังทำได้อยู่ไหม?
แต่ฉันไม่เข้าใจว่าทำไมต้องใช้บัฟเฟอร์ 7680x4320 ด้วย
บน M4 Mac ของฉัน จอ 4K ใช้งานด้วยบัฟเฟอร์ 5120x2880 (2560x1440@2x) ได้ปกติดี
อ้างอิงจาก macOS Sequoia
นั่นคือ 2160p@2x บนจอ 8K ต่างหาก ส่วน 4K สเกล 100% ก็ดูไม่ดีบนทุกระบบปฏิบัติการอยู่แล้ว
ถ้าในบทความมี ภาพหน้าจอเปรียบเทียบความมัวของข้อความ ก็น่าจะช่วยให้โน้มน้าวได้มากขึ้น