Best solution I found
As previously mentioned you'll get very little luck having this just work - especially with multiple monitors (my problem). I settled on a one-line command to achieve consistent multi-monitor presentation, with my on-board display being the hidpi, this:
./xrandr --output eDP-1 --mode "2880x1800" --scale "0.5x0.5"
This command means: Scale my native resolution down by 50%, which when we're talking about pixels means the rendering shouldn't have to interpret very much at all and the result should be crisp.
Why it works: Because, one "square" pixel is now represented in 4 square pixels.
Note: Your options will probably be a bit different.
Some details: Had to switch back to nouveau from nvidia
First - See if your default system xrandr scaling has no blur
Install x11-server-utils
sudo apt install x11-xserver-utils
Find the 'connected' hidpi display, it will have an identifying name
in front of 'connected':
xrandr -q
example output, your monitor name is in front of the 'connected':
xrandr -q output
So my monitor is 'eDP-1' and the native resolution, the top one, is 2880x1800. So, we scale the top one by 50% to avoid blurring, be sure to use your values from xrandr -q for the eDP-1 and the 2880x1800:
xrandr --output eDP-1 --mode "2880x1800" --scale "0.5x0.5"
If you do this and you still have crisp fonts, etc, then you are set, skip to 'Wrap Up' below.
If it is blurry, then the following steps will help.
Step 1 - System xrandr still blurry...system prep
sudo apt install git build-essential autoconf xutils-dev automake dkms gksu libxrandr-dev mesa-utils x11-xserver-utils
Could be a bit different for you depending on your system, this worked for me though.
Step 2 - get the xrandr source
clone the xrandr code
git clone https://anongit.freedesktop.org/git/xorg/app/xrandr.git xrandr_source && cd xrandr_source
Step 3 - note your xrandr version
Note your xrandr version, you'll need this:
xrandr --version | grep 'program version' | awk '{print $4}'
Step 4 - checkout the same version number git tag as what your system has
Check the git tags for xrandr from within the xrandr_source directory
git tag --list | grep 'xrandr'
Find your version number and 'check out' that tag
git checkout tag/xrandr-[your version number here]
for me this was:
git checkout tax/xrandr-1.5.0
Step 5 - Modify xrandr.c
Open xrandr.c with whatever file editor you want to use. Search for 'transform.filter'. There are about three places. You'll notice it's within a conditional, something like this:
if (sx != 1 || sy != 1)
output->transform.filter = "bilinear";
else
output->transform.filter = "nearest";
'bilinear' is what makes it blurry - BUT - since we are "squarely" scaling down, that is, one pixel is now four, we don't need bilinear and can go with 'nearest'.
You have two options, enhance the if conditional, or completely remove all of the if and keep just:
output->transform.filter = "nearest";
Since we are not going to 'install' this xrandr, might as well just take the route I did. You'll find a few places with:
output->transform.filter = "bilinear";
Simplest thing is to just change the "bilinear" to "nearest"
Save the file. Close your editor
Step 6 - compile
./autogen.sh && make
You should have a newly built xrandr now in that directory, try
./xrandr -q
Which should give you output.
Now you can try the original xrandr command:
./xrandr --output [your display] --mode "[your native resolution]" --scale "0.5x0.5"
Step 7 - wrap up
You can also now do things like play with all your regular settings related to fonts, dpi, anti-alias, etc
I don't need all the extra real estate the hidpi gives, plus you just end up enlarging everything to make is usable.
Credit: I got most of my stuff for this from here, But, it's a couple years old and I think it belongs here on a more recent question: https://forums.linuxmint.com/viewtopic.php?t=159064