Skip to content

Instantly share code, notes, and snippets.

@adaugherity
Forked from BugRoger/patch-edid.rb
Last active March 23, 2024 07:33
Show Gist options
  • Save adaugherity/7435890 to your computer and use it in GitHub Desktop.
Save adaugherity/7435890 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby
# Create display override file to force Mac OS X to use RGB mode for Display
# see http://embdev.net/topic/284710
require 'base64'
data=`ioreg -l -d0 -w 0 -r -c AppleDisplay`
edids=data.scan(/IODisplayEDID.*?<([a-z0-9]+)>/i).flatten
vendorids=data.scan(/DisplayVendorID.*?([0-9]+)/i).flatten
productids=data.scan(/DisplayProductID.*?([0-9]+)/i).flatten
displays = []
edids.each_with_index do |edid, i|
disp = { "edid_hex"=>edid, "vendorid"=>vendorids[i].to_i, "productid"=>productids[i].to_i }
displays.push(disp)
end
# Process all displays
if displays.length > 1
puts "Found %d displays! You should only install the override file for the one which" % displays.length
puts "is giving you problems.","\n"
elsif displays.length == 0
puts "No display data found! Are any external displays connected?"
puts "\nNote: Apple Silicon (arm64) devices are currently unsupported, as the standard"
puts "method of retrieving display information does not work."
end
displays.each do |disp|
# Retrieve monitor model from EDID display descriptor
i = disp["edid_hex"].index('000000fc00')
if i.nil?
monitor_name = "Display"
else
# The monitor name is stored in (up to) 13 bytes of text following 00 00 00 fc 00.
# If the name is shorter than 13 bytes, it is terminated with a newline (0a) and then padded with spaces.
monitor_name = [disp["edid_hex"][i + 10, 26].to_s].pack("H*")
monitor_name.rstrip! # remove trailing newline/spaces
end
puts "Found display '#{monitor_name}': vendor ID=#{disp["vendorid"]} (0x%x), product ID=#{disp["productid"]} (0x%x)" %
[disp["vendorid"], disp["productid"]]
puts "Raw EDID data:\n#{disp["edid_hex"]}"
bytes=disp["edid_hex"].scan(/../).map{|x|Integer("0x#{x}")}.flatten
puts "Setting color support to RGB 4:4:4 only"
bytes[24] &= ~(0b11000)
puts "Number of extension blocks: #{bytes[126]}"
puts "removing extension block"
bytes = bytes[0..127]
bytes[126] = 0
bytes[127] = (0x100-(bytes[0..126].reduce(:+) % 256)) % 256
puts
puts "Recalculated checksum: 0x%x" % bytes[127]
puts "new EDID:\n#{bytes.map{|b|"%02X"%b}.join}"
Dir.mkdir("DisplayVendorID-%x" % disp["vendorid"]) rescue nil
filename = "DisplayVendorID-%x/DisplayProductID-%x" % [disp["vendorid"], disp["productid"]]
puts "Output file: #{Dir.pwd}/#{filename}"
f = File.open(filename, 'w')
f.write '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">'
f.write "
<dict>
<key>DisplayProductName</key>
<string>#{monitor_name} - forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>#{Base64.encode64(bytes.pack('C*'))}</data>
<key>DisplayVendorID</key>
<integer>#{disp["vendorid"]}</integer>
<key>DisplayProductID</key>
<integer>#{disp["productid"]}</integer>
</dict>
</plist>"
f.close
puts "\n"
end # displays.each
@aednichols
Copy link

Hi there - I have a lg C1 48 OLED and M1 Mac mini - I would like to get 2k 2560x1440p 120hz HiDpi but having no luck - I can only get the low resolution of 2k on 120hz - any help on how to get HiPi 120hz at 2k?

The purpose of this script is fixing colors, RGB vs YPbPr. It does not attempt to set resolution or refresh rate.

@GetVladimir
Copy link

@law94air I'm not sure if you can set 1440p on 120Hz even with the 2x scaling workaround here (https://gist.github.com/adaugherity/7435890?permalink_comment_id=4207100#gistcomment-4207100)

There doesn't seem to be enough bandwidth on the HDMI port on the M1 Mac mini to support it.

Perhaps other users with that same display can give you a better confirmation

@law94air
Copy link

law94air commented Nov 21, 2022

@law94air I'm not sure if you can set 1440p on 120Hz even with the 2x scaling workaround here (https://gist.github.com/adaugherity/7435890?permalink_comment_id=4207100#gistcomment-4207100)

There doesn't seem to be enough bandwidth on the HDMI port on the M1 Mac mini to support it.

Perhaps other users with that same display can give you a better confirmation

I'm using the thunderbolt port connection on Mac to hdmi so enough bandwidth...it's apple restricting Hidpi usage I reckon

@law94air
Copy link

@law94air I'm not sure if you can set 1440p on 120Hz even with the 2x scaling workaround here (https://gist.github.com/adaugherity/7435890?permalink_comment_id=4207100#gistcomment-4207100)

There doesn't seem to be enough bandwidth on the HDMI port on the M1 Mac mini to support it.

Perhaps other users with that same display can give you a better confirmation

I am using the thunderbolt 4 port

@glyph
Copy link

glyph commented Jan 19, 2023

After an even grosser hack of https://gist.github.com/adaugherity/7435890?permalink_comment_id=4132166#gistcomment-4132166 (at https://gist.github.com/glyph/86421ad155c4f9bf30932205e14974de), I was able to get a display override to work on my M1 machine. I can't figure out how to patch the EDID itself for the life of me, but, I was able to extract the vendor ID and product ID, and create a file called

/Library/Displays/Contents/Resources/Overrides/DisplayVendorID-1e6d/DisplayProductID-774d

with the contents

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>DisplayProductName</key>
    <string>LG HDR WQHD+ (107NTQDAV764) NotTV</string>
    <key>DisplayVendorID</key>
    <integer>7789</integer>
    <key>DisplayProductID</key>
    <integer>30541</integer>
    <key>DisplayIsTV</key>
    <false/>
  </dict>
</plist>

and with that, System Information.app no longer shows me "Television: Yes", and I See my custom name in Displays.

Sadly this does not make it default to RGB/4:4:4, as far as I can tell.

I tried using the aforementioned AW EDID editor to switch off YUV / YPbPr 422 everywhere I could see it in the UI, and sticking in a IODisplayEDID key with the base64-encoded modified binary file, and … it seems like maybe it worked? I can force it to go back to YUV422 by switching back to 144Hz which is not promising, but if I leave it at 120 it seems to stay in RGB mode, at least with my testing so far.

@glyph
Copy link

glyph commented Jan 19, 2023

it seems like maybe it worked?

Nope. Patched EDID apparently does nothing. Switches back to YUV again when I disconnect for 30 minutes and plug in again. Sigh.

@glyph
Copy link

glyph commented Jan 21, 2023

After spending a truly ludicrous amount of time trying to get this to work automatically, I'm curious if anyone else has tried using the edid-patches key rather than the IODisplayEDID one on an Apple Silicon machine?

@GetVladimir
Copy link

@glyph Yes, I have tested with the edid-patches as well on M1 Mac mini, and all the ones I've tested don't seem to do anything or are ignored completely

@glyph
Copy link

glyph commented Jan 22, 2023

@glyph Yes, I have tested with the edid-patches as well on M1 Mac mini, and all the ones I've tested don't seem to do anything or are ignored completely

@GetVladimir Bummer. Thanks for the reply; I think the real answer has got to be Apple fixing this, but gosh it's annoying in the meanwhile.

@tribblon
Copy link

@GetVladimir Bummer. Thanks for the reply; I think the real answer has got to be Apple fixing this, but gosh it's annoying in the meanwhile.

Don't hold your breath. Sadly its been over 2 years since there have been ARM-based Mac Mini's and this is still an issue. pretty sure Apple couldn't care less about it. Any other platform you can, you know... change your settings, if they aren't auto-detected properly. My solution was to sell mine and never buy another one. Its just ridiculous that people have to deal with this nonsense in a supposedly premium product.

@Dochartaigh
Copy link

Hi. I have this same / similar issue on my Apple / Mac, that when in HDR mode my HDR-compatible external monitor tinges everything a dull, muted, gray color. Whites are especially noticeable - they're simply not white, they're grey. Turn HDR off and everything is PERFECT again (you know, besides not being able to watch HDR content...). Also, guess what? Booting my Mac to Windows/Boot Camp on the SAME COMPUTER (same cables/screen, everything) and the issue is FIXED - this is solely a macOS issue, seemingly going ALL the way back to Catalina...

YOU HAVE TO REPORT THIS TO APPLE FOR THEM TO FIX IT. Apple support, and their engineering teams have NO RECORD OF THIS ISSUE!!! You have to contact them through their support chat or a phone call (posting here does nothing tbh). FYI, Apple support told me you can start an Official Apple Support ticket even if your computer isn't in the 1-year warranty, or 3-year AppleCare period (just as long as you're using their newest OS, Ventura). I found this all out today since this problem persists on my brand new Mac mini M2 Pro, and when I contacted them they told me all the above (and also told me it was a good idea to post to everybody on the Apple forums and tell them to report this so it gets on their radar, and hopefully gets fixed!!!).

For my particular case, I've tried TWO HDR-compatible Macs (2018 MacBook Pro 15", 2023 Mac mini M2 Pro). Multiple HDMI 2.0 and HDMI 2.1 CERTIFIED HDMI cables. Multiple monitors / 4K TV's (three different brands) and the problem persists... and when Windows 10 is fine on the (Intel based Mac I tested at least) it's a fact it's NOT the hardware, it's a macOS issue. Other articles surmise that the 'Mac outputs incorrect YPbPr colour', since when you manually (though a programming-esque type GitHub-documented process) change it to output RGB the problem is fixed...

Anyway, with my support ticket to Apple they wanted a video or screenshot of this issue... which it's nearly impossible to capture this on video since my iPhone auto-white balances and/or increases brightness for a darker image (so I can't capture just how much darker the HDR image is to the naked eye, and how all my whites are now gray with HDR turned on)... so I literally took my professional X-Rite Colorimeter and took readings with HCFR display calibration software to show them (all live on video) the very large difference between HDR enabled, and disabled. Literally proved that HDR (in the macOS itself) is HALF as bright as SDR... when it should be the complete opposite... I'll report back if there is a fix... but I'm not hopeful... this has been reported THOUSANDS of times all over the net since Catalina in 2019 and it's still not fixed... and somehow Apple says they've never even heard of this issue... (and Apple won't even let me give them links to non-apple websites to show all these people with this same issue... even the sites where they developed a possible fix for it...).

@GetVladimir
Copy link

@Dochartaigh You're right, it's been an issue for many years already. Both x86 based and M1/M2 Macs are having the color output issues.

It's also relatively easy to confirm that it's a macOS software related issue, since the same hardware works great on Bootcamp, at least the x86 Macs that we can test.

@Dochartaigh
Copy link

Dochartaigh commented Jan 27, 2023

@Dochartaigh You're right, it's been an issue for many years already. Both x86 based and M1/M2 Macs are having the color output issues.

It's also relatively easy to confirm that it's a macOS software related issue, since the same hardware works great on Bootcamp, at least the x86 Macs that we can test.

Sorry if I seem like I'm spamming with the above... Apple support literally told me to post everywhere (which I'm going through google results now and posting everywhere I see this issue discussed lol) to get people to ACTUALLY CALL APPLE and report this issue... because according to them they've never, ever, seen this issue reported in their internal troubleshooting / problem database... (besides me, reporting it just today).

...I have a hard time believe the above though, because I'm literally going through all 280 of the discussions.apple.com posts about this right now... and so many of those posts have hundreds of people who checked the "me too" button... which means they experience this same issue as well... so I just don't believe that NONE of those other people have ever reported this to apple before...

Anyway, if anybody reads this PLEASE REPORT TO APPLE so they fix this and we don't have to jump through github programming stuff (which is above me tbh...) to fix this. Again, your computer doesn't have to be under Apple warranty/AppleCare, just needs to be running Ventura macOS.

@GetVladimir
Copy link

@law94air1976 you can try starting the Mac in safe mode and see if you can delete the override.

Depending on the type of Mac that you use, here are the steps to start in safe mode: https://support.apple.com/en-ie/guide/mac-help/mh21245/mac

@Unklemac
Copy link

Unklemac commented Feb 2, 2023

Right now im connected with 48gbit (4L12), but with this script, im only allowed for RGB 8bit 60hz. I tried to use another github users edid (both LG tv's but not the same model - and he was running USB-C -> HDMI 2.1, i'm running Displayport 1.4a -> HDMI 2.1).... but with his, I get RGB 10bit 60hz. I know my connection allows for atleast RGB 8bit 120hz and maybe 10bit.

So my question is, what does it take to force 4K 120hz?

Without any script/edid mod, im getting the same 4:2:0 10b 4k 120hz as the rest of the Mac gang.

Dual boot to Windows allows = 4K 444 Full RGB 10/12bit 120hz VRR

@Adlopa
Copy link

Adlopa commented Feb 17, 2023

I ended up reverting to USB C > DisplayPort for my Dell U2713H monitor to bypass these RGB problems, but now have to switch to USB C > HDMI (reasons too dull to explain).

However, I now can't get the LinkDescription override to work. Each time I modify the com.apple.windowserver.displays.plist file and restart, the file seems to be reset or regenerated to its original unmodified version. This is with the Mac Mini connected to a KVM switch with USB C > HDMI and then HDMI > HDMI on the monitor – I don't know if that's a factor.

Am I missing something obvious here..?

(BTW Apple is well aware of this issue -- I spent 3 months with tech support when I first got my Mac Mini M1 when it first launched trying all sorts of solutions from them, before they eventually stopped replying to me. Still worth reporting, though – you never know.)

@GetVladimir
Copy link

@Adlopa thank you for the comment and for the details.

Yes, it's very likely that the Mac detects the KVM switch as a different device each time and assigns it a different UUID. This makes it very hard to add the LinkDescription properly.

If possible, please use an HDMI to HDMI cable for the Mac mini and the monitor and avoid using the KVM or any dock/adapter between the Mac and the Monitor.

@vittau
Copy link

vittau commented Feb 25, 2023

I ended up reverting to USB C > DisplayPort for my Dell U2713H monitor to bypass these RGB problems, but now have to switch to USB C > HDMI (reasons too dull to explain).

However, I now can't get the LinkDescription override to work. Each time I modify the com.apple.windowserver.displays.plist file and restart, the file seems to be reset or regenerated to its original unmodified version. This is with the Mac Mini connected to a KVM switch with USB C > HDMI and then HDMI > HDMI on the monitor – I don't know if that's a factor.

Am I missing something obvious here..?

(BTW Apple is well aware of this issue -- I spent 3 months with tech support when I first got my Mac Mini M1 when it first launched trying all sorts of solutions from them, before they eventually stopped replying to me. Still worth reporting, though – you never know.)

Based on the discussion here, you really need to use USB-C -> DisplayPort to be sure this is gonna work properly.
The LinkDescription workaround used to work well before Ventura, but now even that won't work.

@mazingtech
Copy link

Hi every, the refresh rate of my screen is 100Hz, now the output is RGB, but the frame rate is locked on 60Hz, how could I get 100Hz back. And another question, if I use DP, do I still need to do this? Or it's only a HDMI/DVI problem? Thanks a lot!

@GetVladimir
Copy link

@mazingtech If you use an USB-C to DisplayPort cable to connect directly from the Mac to the Monitor, usually it just works without the need of modifications (unless there is a bug in a specific macOS version)

@subsatori
Copy link

subsatori commented Jul 4, 2023

In macOS 13.4.1 at least, I see HiDPI resolutions for my external 1920 x 1080 Display connected via Thunderbolt > HDMI (Apple). Using 1904 x 1071 (HiDPI), which was the biggest, improved text display insanely well, especially in the Firefox browser but also in PDFs and so on. If you zoom in (with macOS) with the default native resolution you see clear artefacts around letters quite quickly, while with HiDPI you have to zoom well more than quadruple to notice anything.

@mazingtech
Copy link

@mazingtech If you use an USB-C to DisplayPort cable to connect directly from the Mac to the Monitor, usually it just works without the need of modifications (unless there is a bug in a specific macOS version)

I'm using a DP to connect my screen, either RGB @60Hz or no RGB @100hz, any idea?

@GetVladimir
Copy link

@mazingtech make sure that you use USB-C to DisplayPort, without any adapters or docks.

Try different resolutions to see on which ones the option for 100Hz will appear and on which one it will use RGB

@mazingtech
Copy link

@mazingtech make sure that you use USB-C to DisplayPort, without any adapters or docks.

Try different resolutions to see on which ones the option for 100Hz will appear and on which one it will use RGB

Got it thanks

@cooltig
Copy link

cooltig commented Jul 13, 2023

I get an error. Can you help?
sudo ruby patch-edid.rb patch-edid.rb:11:in

': undefined method []' for nil:NilClass (NoMethodError)

@Atalantia
Copy link

Can someone please post an uninstall procedure? On Catalina I can't change the color profile anymore.

@GetVladimir
Copy link

@Atalantia as far as I know, you just need to delete the file that you added to the Display Override folder here: /Library/Displays/Overrides/DisplayVendorID-[yourMonitorVendorID]/DisplayProductID-[yourMonitorID]

The file is named based on your Monitor ID and Vendor ID.

@Atalantia
Copy link

Atalantia commented Sep 18, 2023

Even with "System Integrity Protection status: disabled." I have no access to this files. Can't delete them. Even with: "sudo rm -r /System/Library/Displays/Contents/Resources/Overrides" it's not possible.

@GetVladimir
Copy link

@Atalantia make sure you're looking into /Library and not /System/Library

You don't need to disable SIP for it

@Atalantia
Copy link

Atalantia commented Sep 18, 2023

There is no such folder in /Library neither in ~/Library. Only in /System/Library/Displays/Contents/Resources/Overrides Maybe I have to start in Recovery mode and delete the whole folder with command line.

@GetVladimir
Copy link

GetVladimir commented Sep 18, 2023

@Atalantia thank you for the reply.

Usually, only if you used recovery mode to as the file, then you'll need to repeat the same steps to remove it.

On the newer versions of macOS, this is not needed, since you can just place the file in the /Library folder instead of /System/Library.

If you're going to delete files from Recovery, make sure that you only delete the one file that you've added and not the complete folder. Also, make sure to do a backup and please note that you're doing any changes at your own risk

@Atalantia
Copy link

Why not the whole folder. This folder was installed by this script here. I cant find the ID of my TV in the OS.

@GetVladimir
Copy link

@Atalantia I meant don't delete the whole Overrides folder. That one is a System folder and it's not created by the script.

You can delete the one file with your monitor ID that you've added though.

Also, please note that not being able to select a color profile sounds like a different issue, and it's usually not caused by this specific override.

If you've installed any other 3rd party apps or changed any other settings, you might want to try reverting those and see if they affect the color profile selection

@daili0802
Copy link

Hi, I'm looking to see if this script could help me resolve another issue, related to EDIDs. Please help if you can, thank you.
I have two Asus monitors, PA278CV, with unique 'AlphanumericSerialNumber' registered to MacOS, but they present the same EDID. This raises an issue with MacBooks using Apple M1/M2, where EDID is the only factor used to identify external monitors, as far as I can tell. My monitor arrangement will randomly swap position after reboot, wake from sleep or unplug/replug to docking station. It seems like the only two solution to this, is 1. for Apple to adjust OS to use AlphanumericSerialNumber as identifier, or 2. have product manufacture to update firmware that provides unique EDID. I'm curious if this script could help manipulate the EDID the presents to Mac, so OS knows how to identify them, without change any bytes associated to RGB or extension block. If so, which bit could I change instead? Thank you so much!

@GetVladimir
Copy link

@daili0802 there might be a workaround for your specific use case.

Even when 2 monitors are exactly the same, each of their ports has a different designation.

So if they have multiple ports, you can connect the first monitor on its HDMI1 port for example, and the second monitor on its HDMI2 port.

This will allow macOS to distinguish between the display and will allow you to modify any settings per display.

@daili0802
Copy link

daili0802 commented Sep 28, 2023

Hi @GetVladimir, thanks for the quick response. Unfortunately, that isn't the case. I've tied using display port on one, HDMI on the other, as well as using USB-C on more, DisplayPort or HDMI on the other; or even swapping them with different docking stations. they all return the same swapping issue.
My current work around is bypassing my docking station and plugging in the monitors one by one to the laptop it self, this does not start a racing condition which confuses MacOS to swap the position, because I physically plugging them in one after another. But when they are pre-plugged-in on the dock, swapping start to happen.

@GetVladimir
Copy link

@daili0802 thank you for the reply and the update.

That might point that the issue is not the monitors being detected the same, but an issue with macOS to remember the display order.

This is usually the case when the Apple Silicon based Macs assign different UUID on each reboot.

If that is indeed what's happening, you might have the same issue even if you connect completely different monitors or TVs.

You can easily test this if you have a TV nearby and connect it with only one monitor.

To resolve this, you might need to connect each monitor directly to your Mac on a different USB-C port, and not use a dock

@daili0802
Copy link

@GetVladimir Yes, I've thought of this as well. I've tested it with an older dell monitor P2417, side by side to one of the Asus in my current pair. They did not swap after a week of use on the dock.

I should also point out, when I test to plug in the pair to laptop itself, (my current work around), I have to remember the cable and order to do so. Say, if I plugin monitor A to port 1 and then monitor B to port 2, and arrange it in the OS to my liking, next time, I go plug monitor B to port 2 first then monitor A to port 1, it swaps.

@GetVladimir
Copy link

@daili0802 that is actually a good find with the workaround you're using.

I don't know of another way to consistently work except for using the separate cables without using a dock. If you find some solution for this, let us know

@daili0802
Copy link

Sure. @GetVladimir
But, are there ways to us this script to override the EDID without changing the RGB setting?

@GetVladimir
Copy link

@daili0802 as far as I know, this specific script only works for x86 based Macs

@daili0802
Copy link

Ah! that was one important part I missed. Sorry and thank you.

@GetVladimir
Copy link

@daili0802 not a problem, you're welcome. It would be great if it gets resolved

@rainyskye
Copy link

Is there any similar way to accomplish this on an Apple Silicon Mac? Thanks :)

@GetVladimir
Copy link

@apassiou
Copy link

Here is my issue, I am sending signal from Mac to a monitor via HDbaseT adapter, and I get a display like this: https://i.imgur.com/yO1ArVp.png

Whats strange is if I rotate the picture 90 or 180 degrees it looks completely perfect. But setting it back to Standard it goes back looking like the picture. I tried running this script, but it didnt improve it.

@anbarae
Copy link

anbarae commented Oct 14, 2023

I have a 4k monitor, using a MacBook Pro 13-inch, 2017, Two Thunderbolt 3 ports. Resolution is maxed out at blurry 1440p. Any way to fix this?

@joevt
Copy link

joevt commented Oct 15, 2023

@anbarae What display? Is it HDMI or DisplayPort connection? Try SwitchResX? Run AllRez to get a list of display modes.

@brunodantas
Copy link

Works for Sonoma on a 2016 Macbook Pro 👌

@anbarae
Copy link

anbarae commented Oct 25, 2023 via email

@heshaam-42c
Copy link

I have 2 external HDMI-to-usbc monitors. The override works and I can see it take effect in Settings > Displays, but when i rearrange the monitors in Display settings, one of the monitors gets blurry again. Anyone run into this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment