Contribute
Register

Adding/Using HiDPI custom resolutions

Status
Not open for further replies.
I've tried to do this quite a few times. My 4540s has a 15" 1920x1080p monitor. Most of the time, I can work close enough to the display such that the text is not too small. But sometimes, it would be useful to work at 1600x900. Unfortunately, if you use a normal scaled resolution at 1600x900 the text is not as crisp. It would be great to use Apple's HiDPI tech to get better scaling.

Same thing goes for my Lenovo u430 with 1600x900 14" display. Sometimes it would be great to use 1440x810 instead. The result is not retina clarity, but it isn't bad... This post will use my Lenovo u430 as an example.

I've tried a number of methods as documented in the following threads, but they've always come up short and don't really work. The problem is they rely on SwitchResX to add the resolutions which is fairly buggy and will not add all resolutions consistently. SwitchResX works great for selecting modes not available in SysPrefs->Displays, but not so good for adding custom resolutions.

http://forums.macrumors.com/showthread.php?t=1568657
http://www.tonymacx86.com/graphics/...na-hidpi-resolution-your-desktop-display.html
http://www.insanelymac.com/forum/to...na-hidpi-resolution-for-your-desktop-display/

In addition, they have you extracting EDID and other unnecessary tasks...

The other day, I borrowed a friend's MacBookPro11,2 with retina display. I did a little poking around, and in particular, I grabbed the display override plist for the built-in retina display. Looking at that file and experimenting with it gave me the information needed to add your own custom resolutions to our own display plist. There are some quirks, but it works...

First step is you must enable HiDPI mode:
Code:
sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES
sudo defaults delete /Library/Preferences/com.apple.windowserver DisplayResolutionDisabled

Note: I did not have to do the second one.

Note: For 10.11.0 and later, the location of the display overrides have changed. They are now at
/System/Library/Displays/Contents/Resources/Overrides. If you are running 10.11 or later, make sure you substitute the new path as appropriate.

Next, determine your vendor-id and product-id of your display. This is available from ioreg. Using IORegistryExplorer, look under your display under your graphics device:

View attachment 93897

Your ids are DisplayVendorID and DisplayProductID. The hex values here determine where in /System/Library/Displays/Overrides, you create the directory/plist file. If the file already exists, you should edit the existing file (copy it to your Desktop for editing).

In my case, the vendor-id is 0xdae, so I need to create a directory (it may already be present):
Code:
sudo mkdir /System/Library/Displays/Overrides/DisplayVendorID-dae

Next, create your plist file. I create it on my desktop and then copy it to the overrides folder later. the file name should be named after your product id. In my case the product-id is 0x1482, so the name will be DisplayProductID-1482.plist. I name it with extension plist to make it easy to open the file. The starting contents should look like this:
Code:
<?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>Lenovo u430 Display</string>
    <key>DisplayProductID</key>
    <integer>5250</integer>
    <key>DisplayVendorID</key>
    <integer>3502</integer>
    <key>scale-resolutions</key>
    <array>
    </array>
</dict>
</plist>

The DisplayProductName can be whatever you like. Note that DisplayProductID and DisplayVendorID must be converted from hex to decimal for the plist.

Next step is to add your custom resolution(s). Open the plist that is now on your desktop in a plist editor (I use xcode), and then add your custom resolutions under scale-resolutions.

You must add two resolutions for each custom resolution you'd like. My native display on this laptop is 1600x900, so I'm going to add two custom resolutions 1366x768 and 1440x810. Note how the resolutions are carefully chosen to reflect a 16:9 aspect ratio. Custom resolutions are array entries under scale-resolutions that have type Data and have two 32-bit values. The values are in natural byte-order (big-endian/Motorola byte-order, not little-endian or Intel byte order). 1366x768 would be:
Code:
<00000556 00000300>

Note that the value you enter here are in hex. 0x556 is 1366 and 0x300 is 768.

In order to make it HiDPI capable, you must also add another scaled resolution at twice the custom resolution above, so... 2732x1536. Converted to Data hex format:
Code:
<00000aac 00000600 00000001>

With these two entries, it looks like this in the xcode plist editor:
View attachment 93898

You can test this plist now by copying it and rebooting:
Code:
cd ~/Desktop
sudo cp DisplayProductID-1482.plist /System/Library/Displays/Overrides/DisplayVendorID-dae/DisplayProductID-1482

Note that the destination in Displays/Overrides does not have a plist extension.

After that you can restart:
Code:
sudo reboot

You can now access the HiDPI resolution of 1366x768 in SysPrefs->Displays.

Curious things start to happen if you add multiple new HiDPI resolutions. There seems to be some filtering going on in SysPrefs->Displays. Resolutions which are 'close' to each other are filtered out and only one is shown if they are close (eg. 1366x768 either/or 1440x810).

On the Probook (1080p native), if you add 1440x810, it will override the 1366x768, but on the Lenovo u430 (900p native), the 1366x768 seems to override 1440x810:
View attachment 93900

If you run SwitchResX with both installed you'll be able to select either one and activate it even though both are not available in SysPrefs->Displays. SysPrefs->Displays is filtering the resolutions in a way that SwitchResX is not. Note that using SwitchResX to add these resolutions does not work most of the time. You must edit the plist directly.

On my 4540s I was able to add both 1600x900 and 1440x810 (or 1366x768). In that case, the system showed both 1600x900 and the 1440x810 (or 1366x768) but not the 1440x810 and 1366x768 at the same time. Thus why I say the system is filtering resolutions that are close to each other.

Just for clarification, this is what my plist looks like (in text) for both 1366x768 and 1440x810 (Data values are encoded base64):
Code:
<?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>Lenovo u430 Display</string>
    <key>DisplayProductID</key>
    <integer>5250</integer>
    <key>DisplayVendorID</key>
    <integer>3502</integer>
    <key>scale-resolutions</key>
    <array>
        <data>AAALQAAABlQ=</data>
        <data>AAAFoAAAAyo=</data>
        <data>AAAKrAAABgA=</data>
        <data>AAAFVgAAAwA=</data>
    </array>
</dict>
</plist>

Adding custom HiDPI resolutions should prove very useful for screens which have very high resolution (retina class) or even moderate resolution on small screens (1080p on 13" or under).

You will notice some performance degradation when running a scaled resolution like this. This is because the system is rendering to the high-resolution frame buffer (at twice the size), then scaling down to the native resolution of the display (that part is probably done in hardware).

Automatic tool

I have not tried this tool, but there is a web based program that can generate a display override plist for you.

Refer to the post (#222) in this thread for a link: http://www.tonymacx86.com/threads/adding-using-hidpi-custom-resolutions.133254/page-23#post-1271885

Thanks! I followed your guide and did not use SwitchresX for changing resolutions. BTW i used this link to create custom resolutions. All you need to do is edit your vendorID, displayID and add resolutions and it will be automatically create a plist file for you.

 

Attachments

  • Screen Shot 2019-05-04 at 8.56.07 PM.png
    Screen Shot 2019-05-04 at 8.56.07 PM.png
    5.8 MB · Views: 212
Work like a charm.
Note: You must remove .plist extension to make it work.
 
I have an Acer XV273K (4K / 120hz), and am able to select 3840x2160@120hz and 1920x1080@120hz HiDPI and everything works correctly. However, for the other intermediate scaling options like "Looks like 2560x1440", I can only select 60hz refresh rate.

I've tried creating custom resolutions in SwitchResX but I can't create anything that's not a 2x resolution. I've seen the guides for DisplayOverrides but they always mention creating 2x resolutions too... not something in between like I'm trying to use here. Any tips?

404645
404646
 
Just want to clarify(as least this my learning):

the custom resolution(or HiDPI) is not magic art that can overtake your (max.) native resolution capability. e.g. if your ext. monitor is 2560x1440, that the HiPDI is capable to get 1280x720(HiDPI), if you use RDM or SwtichRes and set to higher than 2560x1440, then it will be blurry! same thing as build-in display, if its native resolution is 1366x768, you will get blurry picture if you set to 1920x1080.

---------
Besides the method of add Overide (.plist) and change EDID, here is another one I tried for my U310 on HD4000 and successfully get (via HDMI) for external monitor at its native 2K resolution (i.e. 2560x1440), which was normally only 1920x1080 allowed.:

---------
 
I have an Acer XV273K (4K / 120hz), and am able to select 3840x2160@120hz and 1920x1080@120hz HiDPI and everything works correctly. However, for the other intermediate scaling options like "Looks like 2560x1440", I can only select 60hz refresh rate.

I've tried creating custom resolutions in SwitchResX but I can't create anything that's not a 2x resolution. I've seen the guides for DisplayOverrides but they always mention creating 2x resolutions too... not something in between like I'm trying to use here. Any tips?
Since you have a 4K display, make sure that "Scaled resolution base" is set to 3840 x 2160. This seems to be the case already, as you are able to select 1920x1080@120hz HiDPI - but check SwitchResX to verify that the timing used by that resolution is 3840x2160@120Hz. Actually, I am curious to see a screenshot of the timing info from SwitchResX, as 4K120Hz is near limit of 8 bit color DisplayPort 1.4 without display stream compression. I would like to know if the timing differs from the CVT-RB calculation of SwitchResX.

For "Looks like 2560x1440" you need to create a custom resolution that is a scaled resolution of 5120x2880.
After that, since you are able to select 1920x1080@120Hz HiDPI, you should now be able to select 2560x1440@HiDPI also (they should both use the 3840x2160@120Hz timing).

I am unable to find a method that results in multiple refresh rates for a scaled timing. For example, I can create several 4K timings (30Hz, 40Hz, 50 Hz, 60Hz) and a 5K scaled resolution, but the scaled resolution uses only one of the 4K timings (the one with the lowest refresh rate). This is probably a limitation of Apple's graphics drivers.
 
I have done everything by the book and my resolutions don't show up for my external monitor in RDM (also tried for other monitors and no luck)... Any help? This is on a genuine 2019 MacBook Pro with a 555X discrete GPU.

I am trying to downscale a 4K monitor (DELL U2718Q) to 2K because on native 4K everything is too small and on 1080p HiDPI everything is too big...

The DisplayVendorID is 10ac (converted to integer: 4268) and the DisplayProductID is a0ec (converted to integer: 41196) if anyone wants to have a go at creating the .plist I need.

I created this and it didn't work:
XML:
<?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>DELL U2718Q</string>
  <key>DisplayProductID</key>
  <integer>41196</integer>
  <key>DisplayVendorID</key>
  <integer>4268</integer>
  <key>scale-resolutions</key>
  <array>
    <data>AAAKAAAABaAAAAABACAAAA==</data>
  </array>
</dict>
</plist>
 
Last edited:
I have done everything by the book and my resolutions don't show up for my external monitor in RDM (also tried for other monitors and no luck)... Any help? This is on a genuine 2019 MacBook Pro with a 555X discrete GPU.

I am trying to downscale a 4K monitor (DELL U2718Q) to 2K because on native 4K everything is too small and on 1080p HiDPI everything is too big...

The DisplayVendorID is 10ac (converted to integer: 4268) and the DisplayProductID is a0ec (converted to integer: 41196) if anyone wants to have a go at creating the .plist I need.

I created this and it didn't work:
XML:
<?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>DELL U2718Q</string>
  <key>DisplayProductID</key>
  <integer>41196</integer>
  <key>DisplayVendorID</key>
  <integer>4268</integer>
  <key>scale-resolutions</key>
  <array>
    <data>AAAKAAAABaAAAAABACAAAA==</data>
  </array>
</dict>
</plist>
I can't see anything wrong. You created a 2560x1440 scaled resolution. Do you see a 1280x700 HiDPI mode? You probably should create a 5120x2880 scaled resolution which will allow a 2560x1440 HiDPI mode (it will look better on a 4K display than 2560x1440 non-HiDPI does). If this doesn't work, maybe delete your changes and try SwitchResX. With SwitchResX you can also try creating non-scaled timings.
 
These are the resolutions I see within RDM for my monitor.

1565684872890.png


I'm not sure what you mean by create a 5120x2880 scaled resolution, I tried creating random resolutions and they just wouldn't show up... Maybe you can try creating one for me?

Also, scaling at 1080p is laggy as ****, is this expected off the latest iteration of the MacBook Pro with the highest spec?
 
These are the resolutions I see within RDM for my monitor.

View attachment 421600


I'm not sure what you mean by create a 5120x2880 scaled resolution, I tried creating random resolutions and they just wouldn't show up... Maybe you can try creating one for me?

Also, scaling at 1080p is laggy as ****, is this expected off the latest iteration of the MacBook Pro with the highest spec?
In your plist, do you not understand that "<data>AAAKAAAABaAAAAABACAAAA==</data>" is 2560x1440? I'm telling you to change that one or add a new one for 5120x2880.
Code:
        <data>AAAKAAAABaAAAAABACAAAA==</data>
        <data>AAAUAAAAC0AAAAABACAAAA==</data>
When I said 1280x700, I actually meant 1280x720. You happen to have a 1280x720 mode. Can you check if it's a HiDPI mode by seeing if System Information.app says it "Looks like 1280x720"? If it is then it might have come from the 2560x1440 scaled mode you created, unless that mode always existed before you created it. With the new 5120x2880 scaled mode, you should get a 2560x1440 HiDPI mode.

I am not familiar with RDM. I'm not sure why you would use an app that doesn't seem to be supported anymore.

I'm not sure you even need to create a custom resolution. You should be able to go into the Displays preferences panel, click Scaled, and choose "Looks like 2560 x 1440". Or you can hold Option key, click Scaled, enable "Show low resolution modes" and select either "2560 x 1440" (for HiPDI), or "2560 x 1440 (low resolution)" for non-HiDPI.
 
I have taken your advice and put those resolutions in the file, rebooted, installed SwitchResX and this is what I see

1565700840989.png

However, when I select either and click Activate Immediately, screen flashes black, then goes back to previous resolution, so they still don't work.

I want to say that I am connected through a DELL D6000 dock, through the DisplayLink software. I have ordered a DP to USB C cable that should arrive today, so by tomorrow I will have tested it directly and gave feedback... I have a feeling this dock is the core of the lag as well as this whole mess
 
Last edited:
Status
Not open for further replies.
Back
Top