The tl;dr of the issue is this image:
This is not colour mismatch, but the actual difference when increasing the refresh rate - a greenish hue commonly characterizing compressed images (notice the
The setup is a 4k Spectrum running firmware version 106, fed by an M1 Pro 16 incher, with an OWC Thunderbolt 4 cable, both of which have full support for DP Alt Mode 1.4 w/ HBR3 and DSC 1.2 (on paper). The display naturally has USB-C bandwidth priority set to High refresh rate.
I did some searching here and Google researching, but can’t see a reason why I shouldn’t be getting a lossless image at 144Hz.
There are two points worth mentioning:
- MacOS, for whatever reason, does not let me choose a 120Hz refresh mode (it’s either 144Hz or 60Hz, you filthy peasant; oddly 120Hz is available for 1080p). This might actually help and I’ll try and hack that in the following days, but if anyone is aware of a fix, that would be most welcome.
- I run 4k@144Hz w/ 10bit on Windows without visible compression, connected through a DisplayPort cable. Back in firmware version 104, this did exhibit a similar visible compression, so I’m wondering whether it’s something that can be fixed at firmware level as well.
I’m thinking of trying a few USB-C to (alleged) HDMI 8k@60Hz/4k@120Hz cables, but at the current mess of HDMI 2.1 compliance, I’d love to hear from people having similar issues or from the developers themselves, before spending triple digits on wires…
Very interesting. I’ll give it a try with my own Mac setup. I already spent a bunch on cables trying to figure out other issues. I can hopefully get to it by this weekend and post the results. If there are any pictures or text you want me to take pictures of let me know. Also are you in the RGB, PCI3, or HDR mode.
It almost looks like the signal is dropping into chroma subsampling mode. There’s no obvious reason why subsampling should be needed, given that HBR3 and DSC are available.
I couldn’t easily find any way to check if subsampling is in use on a Mac. The best option appears to be on the page below, which contains a test image that doesn’t show correctly when subsampling is being used.
As part of the search that led me to this page, I’ve seen several mentions on Reddit that Apple’s external monitor handling is awful. One person also mentioned drops to subsampling mode for no obvious reason. Fun.
If its dropping into chroma subsampling, as NZgeek stated, I believe it does that automatically for MacOS to run at 144hz. Without DSC or Chroma subsampling 120hz is the highest due to DP 1.4. Here is a link on where this was discussed further!
There is apparently also a way to check for chroma subsampling in software. They are discussing it in the macrumors forum here:
I’m using P3, @MemeScreen, or have it selected in Color Profile anyways.
And yep, @NZgeek and @Aethel, it’s definitely chroma subsampling following the Geeks3D article.
As for solving it, I tried SwitchResX to enable 4k@120Hz, but custom resolutions apparently aren’t currently supported on Apple Silicon. Is it the Spectrum firmware that sends available options to MacOS, or Apple trimming down the selection?
I assume the remaining immediate options are trying a few cables? I think I’ll buy this one at a local store (for science) and see how it goes.
You could try using BetterDisplay to set a custom resolution
AGDCDiagnose tool can report whether subsampling is being used. However, I’ve also read that it only works on Intel-based Macs. There’s several mentions that it’s either missing or non-function on Apple Silicon machines.
I’ve noticed some interesting sections when running that command on my work MBP:
## Register Dump Port 4 - Start ##
000000: 0x12 0x14 0xc4 0x81 0x01 0x00 0x01 0xc1 0x02 0x02 0x06 0x00 0x00 0x00 0x84 0x00
Reg: 000000: 12 : DPCD_REV: 1.2
Reg: 000001: 14 : MAX_LINK_RATE: HBR2
Reg: 000002: c4 : MAX_LANE_COUNT: 4, TPS3_SUPPORTED: 1, ENHANCED_FRAME_CAP: 1
Reg: 000003: 81 : MAX_DOWNSPREAD: 0.5% down, NO_AUX_HANDSHAKE_LINK_TRAINING: 0
Reg: 000004: 01 : NORP: 1
Reg: 000005: 00 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 0, DWN_STRM_PORT_TYPE:  DisplayPort, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 0
Reg: 000006: 01 : MAIN_LINK_CHANNEL_CODING: ANSI 8B/10B
Reg: 000007: c1 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 1, MSA_TIMING_PAR_IGNORED: 1, OUI: 1
Reg: 000008: 02 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 1, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 000009: 02 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 96
Reg: 00000a: 06 : RECEIVE_PORT1_CAP_0:
Reg: 00000b: 00 : RECEIVE_PORT1_CAP_1:
Reg: 00000c: 00 : I2C Speed:
Reg: 00000d: 00 : eDP_CONFIGURATION_CAP: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 00000e: 84 : TRAINING_AUX_RD_INTERVAL: 0 RESERVED, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: YES
Reg: 00000f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
000020: 0x00 0x00 0x00
Reg: 000020: 00 : FAUX_CAP: FAUX_CAP: 0
Reg: 000021: 00 : MSTM_CAP: MST_CAP: 0
Reg: 000022: 00 : NUMBER_OF_AUDIO_ENDPOINTS: 0
000060: 0x01 0x21 0x03 0x7f 0x3b 0x07 0x01 0x00 0x00 0x1f 0x0e 0x11 0x08 0x00 0x00 0x00
Reg: 000060: 01 : DSC Support: 1
Reg: 000061: 21 : DSC Algorithm revision: 33
Reg: 000062: 03 : DSC RC Buffer Block size: 3
Reg: 000063: 7f : DSC RC Buffer size: 127
Reg: 000064: 3b : DSC slice Capabilities 1 : 59
Reg: 000065: 07 : DSC Line buffer bit depth: 7
Reg: 000066: 01 : DSC Block prediction support: 1
Reg: 000067: 00 : DSC Maximum bit per pixel: 0
Reg: 000068: 00 : DSC Maximum bit per pixel: 0
Reg: 000069: 1f : DSC Decoder color format capabilities: 31
Reg: 00006a: 0e : DSC decoder color depth capabilities: 14
Reg: 00006b: 11 : DSC Peak Throughput: 17
Reg: 00006c: 08 : DSC Maximum Slice width: 8
Reg: 00006d: 00 : DSC Slice capabilities 2: 0
Reg: 00006e: 00 : Reserved: 0
Reg: 00006f: 00 : DSC Bits per pixel increment: 0
Reg: 000090: bf : FEC Capability: 0xbf
000100: 0x1e 0x84
Reg: 000100: 1e : LINK_BW_SET: HBR3
Reg: 000101: 84 : LANE_COUNT_SET: LANE_COUNT_SET 4, ENHANCED_FRAME_EN: 1
Reg: 000107: 10 : DOWNSPREAD_CTRL: SPREAD_AMP: 1, MSA_TIMING_PAR_IGNORE_EN: 0
Reg: 00010a: 00 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 000111: 00 : MSTM_CTRL: UPSTREAM_IS_SRC:0 UP_REQ_EN:0 MST_EN:0
Reg: 000120: 00 : FEC Configuration: 0x0
Reg: 000160: 00 : DSC Enable: 0x0
I’m seeing conflicting information in here.
- This indicates that the Spectrum is only advertising HBR2 as the fastest connection it supports.
- This indicates that the actual connection is being made at HBR3 speeds.
If I’m reading things right here, this would indicate why things are messed up over USB-C connections. There’s a mismatch between what the Spectrum says it supports and what it actually supports.
@nkyadav can you get the firmware team to look at this? If they can get both values to get set to HBR3, it’ll hopefully fix a few of the issues seen on USB-C connections.
Thank you for your work on this, it’ll help anyone else out who’s planning for a similar setup
Have someone tried the 107 firmware?
One of the new feature is: “Added support for display stream compression (DSC) over USB Type-C.”
Firmware v107 is very similar to the PS5.Test5 build that was released a few weeks ago. Both support DSC over USB-C.
It doesn’t help at all on Intel-based Macs. From what I can guess, the graphics driver sees that the maximum supported link speed is HBR2, so it assumes that only DP1.2 is available and ignores the fact that DSC can be used.
For Apple Silicon Macs, it does allow 144Hz to be used. However, because the Spectrum is reporting that it only does HBR2 speeds, the graphics driver decides to use chroma subsampling to reduce the bandwidth needed. Subsampling can reduce image quality and cause visible issues in some situations.
I’ve been working with Eve to get this issue escalated to the company that makes the Spectrum’s scaler chip. Assuming that it is a real issue, hopefully it can be fixed and we can get full 144Hz HDR working.
I don’t know about HDR, but 107 did fix the issue for me.