Changing refresh rate on Microsoft Surface Pro 8

Hello

I have a Microsoft Surface Pro 8 running Ubuntu 22 and have installed and successfully tested MATLAB 2022a and psych toolbox. Works great! Only problem is, I have thus far been unable to change the refresh rate on the display to anything other than 60 or 120 Hz, using both the display settings as well as lower level routines such as Xrandr. Does anybody know if it is possible to get the display to run at 75 or 100 Hz? If it is possible, how?

Thanks!
Lee Lovejoy

Good to know it works on Linux. Did you require some special hacks, kernels etc. or such, like with the SurfacePro 6?

Interesting question. Post your paid support membership authentication token and we can try to find out. → ‘help PsychPaidSupportAndServices’. If you don’t have one yet, you might still get the 99 Euro christmas offer. We decided last tuesday that the whole discounted membership program sadly is another colossal failure to get our users to use their brains and give something back, and end the discount and substantially raise the price anytime now, but afaics my boss hasn’t made the update yet.

-mario

Hello

It was a relatively easy process and it did require installing a special surface kernel. Some very good instructions are available on the GitHub repo for the kernel:

The multitouch support seems to work quite well.

Pasting in my authentication token below. We’ve had the paid support membership for a couple of years now.

CORRECTED TOKEN: LQ9WM49U-202339174250:9af6af30e1cb6b4233c3b2be7de388f652f20ab02e6c6d1f8462051ef8ca6406

Great. Yeah, I also have the surface-linux kernel and stuff on my MS Surface Pro 6, to make touch screen and battery reporting etc. working, and it was straightforward. Just wondered if the SP 8 may be “standard” enough to work without such customizations.

Good that the multitouch touchscreen continues to work nicely on SP 8. Does the webcam work? That required quite a lot of hacks on my SP6 iirc.

This license has run out over a month ago, and no renewal is so far registered in my database, despite it being a “yearly auto-renewing” one, first purchased 4th February 2022, no earlier purchases recorded, unless those were one-time licenses instead? How did you pay it? If it was with credit card, is that card still valid? Delays or errors can happen, also on our side, but if the renewal lapses by more than a month, you’ll lose the substantial 40% discount on extra work hours if needed. Please clarify.

The cameras aren’t supported. Haven’t been on 7, 7+, or 8.

Ouch I asked our admin to renew the subscription when the auto renewal didn’t work. I’ll follow up.

LQ9WM49U-202339174250:9af6af30e1cb6b4233c3b2be7de388f652f20ab02e6c6d1f8462051ef8ca6406

Ok, so I assume the renewed license will show by Monday, so far it hasn’t, and we go on for now without proof of payment. Swift payment is important, as is keeping the old license key around, to take advantage of possible discounts. Technically we are already beyond the grace period for lapsing the license.

So I did a bit of research, and the MS SP 8 should be quite a nice thing if one needs fine-grained stimulus timing and flexible framerates. It has an Intel Tigerlake cpu + gpu, with Gen 12 Intel Xe integrated graphics. The graphics chip and the touchscreen display should be fully (V)ariable (R)efresh (R)ate (VRR) capable and some internet searches seem to confirm that for Linux.

So in VRR mode with current PTB on Ubuntu 22.04-LTS and later (with required X-Server 21 and later), thanks to some unique PTB+Linux only features, you should be able to get any dynamically changeable framerate for animations from 30 fps - 120 fps, corresponding to ISI’s from 8.333 msecs to 33.333 msecs, and with a bit luck and careful use, ISI’s from 8.333 msecs to 20 minutes, or 0 fps - 120 fps. That said, PTB’s code so far has only been developed and tested on AMD graphics cards, and I specifically tweaked and improved AMD’s display drivers to work great with PTB. The status/quality of the Intel drivers wrt. VRR is so far unknown to me, especially if the crucially needed high precision stimulus onset timestamping is ready for this task in VRR mode, or if it would need extra work from myself. I don’t have suitable Intel graphics chips to test this atm., so I’m interested in your results.

You can test VRR mode by:

  1. Have a reasonably up to date Psychtoolbox. The feature was introduced sometime in PTB 3.0.16.

  2. Running XOrgConfCreator and answer 'y’es when it asks if you want VRR mode support, then run XOrgConfSelector to enable that new config file setting, and logout + login again to enable the machinery. Setup details to be found in help VRRSupport.

  3. Now you can use it in your own scripts. The test script provided with PTB is VRRTest, e.g., VRRTest('upsweep', [], 0.032) for an animation that should start fast at 120 fps / 8.333 msecs ISI, then linearly slow down to ~31 fps (aka 32 msecs ISI), or VRRTest(‘upsweep’) to test a range down to 5 fps / 200 msecs ISI.

So this is useful for fine-grained presentation timing control or choosing any framerate, changeable on each Flip. Assuming the Intel driver works as well in VRR mode as the AMD driver.

If you really only want to run the display at a fixed refresh rate of 75 or 100 Hz, then we’ll have to figure out a suitable video modeline to set via xrandr together. And then see how the panel responds to fixed rates other than 60 Hz or 120 Hz officially supported by Microsoft and defined in the panels EDID.

[30 out of 60 minutes of not-yet-paid support used.]

Hello Mario

Thanks for that! I very much hope the license has renewed by now. If not, I will investigate again.

I will update this reply with the plot results from VRRTest, but I wanted to let you know sooner rather than later that my testing with VRRTest revealed that I could, in fact, drive the display with a frame intervals from 8.333 msecs to 200 msecs! Not perfect but promising–when I attempted to run with a constant refresh rate I was unable to do so, but I didn’t have a chance to do much more investigation other than an initial proof of concept.

Will update soon.
Lee

So far, nothing has been renewed, according to my current record.

Good to know it works in principle, certainly interesting to look at different plots from VRRTest(). The ‘sine’ plot, ‘upstep’ and ‘downstep’ plots or ‘random’ are interesting., as is the ‘const’ one for an arbitrary constant framerate. The stability of this rises and falls with the quality of the display drivers implementation, which was specifically improved and tuned by myself for AMD graphics on Linux. A bit of noise is expected though, and less stability outside your displays native range of 30 fps - 120 fps, ie. for lower than 30 fps. Ofc. to be sure everything works in a trustworthy fashion, one would need to validate with external measurement hardware, of which the VRRTest() script supports plenty - although everything but photo-diodes won’t be usable on the MS Surface Pro 8’s internal display screen ofc.

But I still don’t know your use case. If you need a fixed rate of only e.g., 75 Hz, not the flexibility of VRR, we can still try to manually add a proper video mode for standard fixed rate operation?

Here’s another go with my support token
LQ9WM49U-202331692453:5a7c828a3ef10854369d43589d7e6fa1a8a24ea7ecfe9f06c451e4b6b23eb15b

My use case is displaying random dot motion stimuli, so I need either 75 or 100 Hz refresh rate consistently. Seems to me that the easiest for me would be finding that appropriate video mode line.

Here are some plots:



The license has not been renewed yet, or at least the payment hasn’t come through so far, or it hasn’t been entered into my database by our sales guy.

Ok. So lets try something. I’m working off the reported decoded EDID from this GitHub issue… SP8 120Hz mode not available · Issue #825 · linux-surface/linux-surface · GitHub
… which states a maximum pixelclock of 720 Mhz for the MS Surface Pro 8 panel. We should double-check that, so can you please post the full output of the terminal command xrandr --verbose ?

Assuming those limits would be right, it could be difficult to create a fixed refresh rate video mode for 100 Hz refresh, but might be possible for 75 Hz:

The gtf command line tool (Generalized Timing Formula) gives this:
gtf 2880 1920 75

“# 2880x1920 @ 75.00 Hz (GTF) hsync: 150.30 kHz; pclk: 601.20 MHz”
Modeline “2880x1920_75.00” 601.20 2880 3120 3440 4000 1920 1921 1924 2004 -HSync +Vsync

The cvt tool gives:
cvt 2880 1920 75

“# 2880x1920 74.96 Hz (CVT) hsync: 150.38 kHz; pclk: 601.50 MHz”
Modeline “2880x1920_75.00” 601.50 2880 3128 3440 4000 1920 1923 1933 2006 -hsync +vsync

In both cases the dotclock stays below the 720 Mhz limit. Unfortunately trying those tools with 100 Hz will yield dot clocks of 817 and 819 Mhz beyond the hardware limit, so unlikely to work. And we can’t use reduced blanking modes to stay within limits, because these only work for refresh rates that are multiples of 60 Hz, ie. not 75 Hz or 100 Hz.

Anyhow, if you want to try the 75 Hz mode, this would be a command to enter:

  1. xrandr --newmode "2880x1920_75.00" 601.20 2880 3120 3440 4000 1920 1921 1924 2004 -HSync +Vsync

To define a mode based on the gtf output from above - a copy and paste of the modeline.

  1. xrandr --addmode eDP-1 2880x1920_75.00

To make that mode available on video output eDP-1 which I think would be your touchscreen.

  1. xrandr --output eDP-1 --mode 2880x1920_75.00 --rate 75

To switch to 75 Hz, or you can also use the display settings GUI. Be aware that an invalid mode could end with a black screen. So maybe using the GUI is better for the last step, if it gets you one of those auto-reverts if proper setting is not confirmed within 10 seconds. Or blindly typing `xrandr --output eDP-1 --rate 120`` should also do the trick.

This as a first test. If the EDID output of that linked GitHub issue is correct, it looks like as if Microsoft does use non-standard mode timings for the 60 and 120 Hz modes, so it could be that the panel doesn’t like fixed refresh rate modes other than 60 and 120 Hz.

The VRR mode we tried works very different from the panels perspective - as if it is always running at 120 Hz, but then tricks are played with dynamically extending the vblank to get all the intermediate rates from 30 Hz - 120 Hz.

Those plots look as if it works in principle, and within the hardware supported range from 8.33 msecs to 33.33 msecs, I’m not displeased with these results. But outside that range, ie. for framerates lower than ~ 30 fps, the current PTB algorithm can’t get stable results on Intel. That would need some parameter tweaking + luck, or possibly enhancements to the Linux Intel display driver, the latter impossible without me having such hardware myself and the time and funding to do.

Seems within the display native range it is reasonably stable, with a fixed offset between “wanted” and reality of about 2 msecs, an offset one could correct for. PTB does some calibration during startup, but for various reasons that can be thrown off a bit, hence the median error of around 2 msecs.

I guess you’d only need a fixed rate for your case, so you could try VRRTest('const') to see how stable it is under the constant condition, which is also the most easy to handle. If you edit line 33 of VRRTest.m you can define your own target delay, e.g., delay = 0.010 for 10 msecs / 100 Hz target, or delay = 0.013333 for 13.333 msecs / 75 Hz target.

Setting the optional useVulkan flag to 1 in VRRTest is another thing one can try to reduce jitter. May or may not make things better or worse. Technically the Vulkan mode is part of some experimental prototype enhancements to the Linux Vulkan and display drivers that I have developed here to get some fantastics, rock-solid and accurate results on AMD gpu’s already 1.5 years ago. Unfortunately I have not found the time to turn that into something production ready, again mostly due to lack of funding, caused by our unsupportive “penny wise, pound foolish” user-base. So it sits on my disc drive and collects dust. But maybe even standard Vulkan setups may give some improvement in jitter…

-mario

[80 of 60 minutes paid support used, not yet paid support fully exhausted.]

Here’s another modeline to try:

Modeline “2880x1920_100” 595.848 2880 2888 2920 2960 1920 1999 2007 2013 +HSync -VSync

which results in:

xrandr --newmode "2880x1920_100" 595.848 2880 2888 2920 2960 1920 1999 2007 2013 +HSync -VSync

This would get 100 Hz refresh with 595.848 Mhz clock - within hw limits. Apparently reduced blanking is also possible at other than multples of 60 Hz with some more recent standards than what the cvt tool can compute.

I used this online calculator to get this new modeline:

https://tomverbeure.github.io/video_timings_calculator

Payment has now finally been received and your license renewed - happy end. Of course with 80 minutes of work rendered for 60 minutes of work paid, it is already completely used up. But we did decide to let you keep your 40% discount on the 300 Euros extra hours work packages, should they be needed, although technically that grace period has also already expired.

Please provide feedback swiftly if the proposed solution from my last postings works, wrt. how to add a 75 Hz or 100 Hz fixed refresh rate mode. If it works, I’ll provide you with another 5 minutes of work for free to get to an easier “plug and play” solution for this use case. If too much time passes and I forget about this discussion, you’ll have to pay for a full extra hour package at (for you with our maximum 40% discount) 180 Euros + applicable sales tax/VAT, for what now might only be a few more minutes of work.

Ping? If I don’t hear from you by this Monday evening 27th March CEST, I’ll consider this issue “resolved” and any further work will require additional payment.

Best,
-mario

Hello Mario I’m sorry for the delay in my reply, got bogged down with some clinical work. I’m sitting down to do a detailed reply.

OK, first I am going to post results of xrandr based tests.

Here is the output of xrandr --verbose:

Screen 0: minimum 320 x 200, current 2880 x 1920, maximum 16384 x 16384
eDP-1 connected primary 2880x1920+0+0 (0x49) normal (normal left inverted right x axis y axis) 274mm x 183mm
Identifier: 0x42
Timestamp: 16353
Subpixel: unknown
Gamma: 1.0:1.0:1.0
Brightness: 1.0
Clones:
CRTC: 0
CRTCs: 0 1 2 3
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
_MUTTER_PRESENTATION_OUTPUT: 0
EDID:
00ffffffffffff0030e4b106a1241800
001f0104a51b127803ef70a7514ca826
0e4f5300000001010101010101010101
010101010101de8a4078b08037703020
550012b71000001a000000fd001e78f0
f048010a202020202020000000fe004c
47445f4d50312e305f0a2020000000fe
004c503132395754323132313636018a
70132e00000301147f1501883f0b4f00
07801f007f071f08410007000301147f
1501083f0b4f0007801f007f074f0041
00070045000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000090
vrr_capable: 1
range: (0, 1)
Colorspace: Default
supported: Default, RGB_Wide_Gamut_Fixed_Point, RGB_Wide_Gamut_Floating_Point, opRGB, DCI-P3_RGB_D65, BT2020_RGB, BT601_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, BT2020_CYCC, BT2020_YCC
max bpc: 12
range: (6, 12)
Broadcast RGB: Automatic
supported: Automatic, Full, Limited 16:235
panel orientation: Normal
supported: Normal, Upside Down, Left Side Up, Right Side Up
scaling mode: Full aspect
supported: Full, Center, Full aspect
link-status: Good
supported: Good, Bad
CONNECTOR_ID: 308
supported: 308
non-desktop: 0
range: (0, 1)
2880x1920 (0x47) 710.400MHz +HSync -VSync +preferred
h: width 2880 start 2888 end 2920 total 2960 skew 0 clock 240.00KHz
v: height 1920 start 1986 end 1994 total 4000 clock 60.00Hz
2880x1920 (0x48) 355.500MHz +HSync -VSync +preferred
h: width 2880 start 2928 end 2960 total 3000 skew 0 clock 118.50KHz
v: height 1920 start 1925 end 1930 total 1975 clock 60.00Hz
2880x1920 (0x49) 710.400MHz +HSync -VSync *current
h: width 2880 start 2888 end 2920 total 2960 skew 0 clock 240.00KHz
v: height 1920 start 1986 end 1994 total 2000 clock 120.00Hz
2880x1620 (0x4a) 303.878MHz +HSync -VSync
h: width 2880 start 2928 end 2960 total 3040 skew 0 clock 99.96KHz
v: height 1620 start 1623 end 1628 total 1666 clock 60.00Hz
2560x1600 (0x4b) 268.627MHz +HSync -VSync
h: width 2560 start 2608 end 2640 total 2720 skew 0 clock 98.76KHz
v: height 1600 start 1603 end 1609 total 1646 clock 60.00Hz
2560x1440 (0x4c) 241.699MHz +HSync -VSync
h: width 2560 start 2608 end 2640 total 2720 skew 0 clock 88.86KHz
v: height 1440 start 1443 end 1448 total 1481 clock 60.00Hz
2048x1536 (0x4d) 266.952MHz -HSync +VSync
h: width 2048 start 2200 end 2424 total 2800 skew 0 clock 95.34KHz
v: height 1536 start 1537 end 1540 total 1589 clock 60.00Hz
1920x1440 (0x4e) 234.000MHz -HSync +VSync
h: width 1920 start 2048 end 2256 total 2600 skew 0 clock 90.00KHz
v: height 1440 start 1441 end 1444 total 1500 clock 60.00Hz
1856x1392 (0x4f) 218.267MHz -HSync +VSync
h: width 1856 start 1952 end 2176 total 2528 skew 0 clock 86.34KHz
v: height 1392 start 1393 end 1396 total 1439 clock 60.00Hz
1792x1344 (0x50) 204.750MHz -HSync +VSync
h: width 1792 start 1920 end 2120 total 2448 skew 0 clock 83.64KHz
v: height 1344 start 1345 end 1348 total 1394 clock 60.00Hz
2048x1152 (0x51) 156.988MHz +HSync -VSync
h: width 2048 start 2096 end 2128 total 2208 skew 0 clock 71.10KHz
v: height 1152 start 1155 end 1160 total 1185 clock 60.00Hz
1920x1200 (0x52) 154.128MHz +HSync -VSync
h: width 1920 start 1968 end 2000 total 2080 skew 0 clock 74.10KHz
v: height 1200 start 1203 end 1209 total 1235 clock 60.00Hz
1920x1080 (0x53) 138.652MHz +HSync -VSync
h: width 1920 start 1968 end 2000 total 2080 skew 0 clock 66.66KHz
v: height 1080 start 1083 end 1088 total 1111 clock 60.00Hz
1600x1200 (0x54) 162.000MHz +HSync +VSync
h: width 1600 start 1664 end 1856 total 2160 skew 0 clock 75.00KHz
v: height 1200 start 1201 end 1204 total 1250 clock 60.00Hz
1680x1050 (0x55) 119.232MHz +HSync -VSync
h: width 1680 start 1728 end 1760 total 1840 skew 0 clock 64.80KHz
v: height 1050 start 1053 end 1059 total 1080 clock 60.00Hz
1400x1050 (0x56) 122.049MHz +HSync +VSync
h: width 1400 start 1488 end 1640 total 1880 skew 0 clock 64.92KHz
v: height 1050 start 1052 end 1064 total 1082 clock 60.00Hz
1600x900 (0x57) 97.785MHz +HSync -VSync
h: width 1600 start 1648 end 1680 total 1760 skew 0 clock 55.56KHz
v: height 900 start 903 end 908 total 926 clock 60.00Hz
1280x1024 (0x58) 107.964MHz +HSync +VSync
h: width 1280 start 1328 end 1440 total 1688 skew 0 clock 63.96KHz
v: height 1024 start 1025 end 1028 total 1066 clock 60.00Hz
1400x900 (0x59) 86.673MHz +HSync -VSync
h: width 1400 start 1448 end 1480 total 1560 skew 0 clock 55.56KHz
v: height 900 start 903 end 913 total 926 clock 60.00Hz
1280x960 (0x5a) 108.000MHz +HSync +VSync
h: width 1280 start 1376 end 1488 total 1800 skew 0 clock 60.00KHz
v: height 960 start 961 end 964 total 1000 clock 60.00Hz
1440x810 (0x5b) 151.939MHz +HSync -VSync DoubleScan
h: width 1440 start 1464 end 1480 total 1520 skew 0 clock 99.96KHz
v: height 810 start 811 end 814 total 833 clock 60.00Hz
1368x768 (0x5c) 72.427MHz +HSync -VSync
h: width 1368 start 1416 end 1448 total 1528 skew 0 clock 47.40KHz
v: height 768 start 771 end 781 total 790 clock 60.00Hz
1280x800 (0x5d) 71.107MHz +HSync -VSync
h: width 1280 start 1328 end 1360 total 1440 skew 0 clock 49.38KHz
v: height 800 start 803 end 809 total 823 clock 60.00Hz
1152x864 (0x5e) 86.400MHz +HSync +VSync
h: width 1152 start 1216 end 1344 total 1600 skew 0 clock 54.00KHz
v: height 864 start 865 end 868 total 900 clock 60.00Hz
1280x720 (0x5f) 64.022MHz +HSync -VSync
h: width 1280 start 1328 end 1360 total 1440 skew 0 clock 44.46KHz
v: height 720 start 723 end 728 total 741 clock 60.00Hz
1024x768 (0x60) 64.995MHz -HSync -VSync
h: width 1024 start 1048 end 1184 total 1344 skew 0 clock 48.36KHz
v: height 768 start 771 end 777 total 806 clock 60.00Hz
1024x768i (0x61) 30.980MHz +HSync +VSync Interlace
h: width 1024 start 1032 end 1208 total 1264 skew 0 clock 24.51KHz
v: height 768 start 768 end 776 total 817 clock 60.00Hz
960x720 (0x62) 117.000MHz -HSync +VSync DoubleScan
h: width 960 start 1024 end 1128 total 1300 skew 0 clock 90.00KHz
v: height 720 start 720 end 722 total 750 clock 60.00Hz
928x696 (0x63) 109.057MHz -HSync +VSync DoubleScan
h: width 928 start 976 end 1088 total 1264 skew 0 clock 86.28KHz
v: height 696 start 696 end 698 total 719 clock 60.00Hz
896x672 (0x64) 102.375MHz -HSync +VSync DoubleScan
h: width 896 start 960 end 1060 total 1224 skew 0 clock 83.64KHz
v: height 672 start 672 end 674 total 697 clock 60.00Hz
1024x576 (0x65) 42.126MHz +HSync -VSync
h: width 1024 start 1072 end 1104 total 1184 skew 0 clock 35.58KHz
v: height 576 start 579 end 584 total 593 clock 60.00Hz
960x600 (0x66) 77.001MHz +HSync -VSync DoubleScan
h: width 960 start 984 end 1000 total 1040 skew 0 clock 74.04KHz
v: height 600 start 601 end 604 total 617 clock 60.00Hz
832x624 (0x67) 46.103MHz -HSync -VSync
h: width 832 start 864 end 928 total 1152 skew 0 clock 40.02KHz
v: height 624 start 625 end 628 total 667 clock 60.00Hz
960x540 (0x68) 37.363MHz +HSync -VSync
h: width 960 start 1008 end 1040 total 1120 skew 0 clock 33.36KHz
v: height 540 start 543 end 548 total 556 clock 60.00Hz
800x600 (0x69) 38.400MHz +HSync +VSync
h: width 800 start 824 end 896 total 1024 skew 0 clock 37.50KHz
v: height 600 start 601 end 603 total 625 clock 60.00Hz
840x525 (0x6a) 59.616MHz +HSync -VSync DoubleScan
h: width 840 start 864 end 880 total 920 skew 0 clock 64.80KHz
v: height 525 start 526 end 529 total 540 clock 60.00Hz
864x486 (0x6b) 30.720MHz +HSync -VSync
h: width 864 start 912 end 944 total 1024 skew 0 clock 30.00KHz
v: height 486 start 489 end 494 total 500 clock 60.00Hz
700x525 (0x6c) 61.024MHz +HSync +VSync DoubleScan
h: width 700 start 744 end 820 total 940 skew 0 clock 64.92KHz
v: height 525 start 526 end 532 total 541 clock 60.00Hz
800x450 (0x6d) 48.892MHz +HSync -VSync DoubleScan
h: width 800 start 824 end 840 total 880 skew 0 clock 55.56KHz
v: height 450 start 451 end 454 total 463 clock 60.00Hz
640x512 (0x6e) 53.982MHz +HSync +VSync DoubleScan
h: width 640 start 664 end 720 total 844 skew 0 clock 63.96KHz
v: height 512 start 512 end 514 total 533 clock 60.00Hz
700x450 (0x6f) 43.336MHz +HSync -VSync DoubleScan
h: width 700 start 724 end 740 total 780 skew 0 clock 55.56KHz
v: height 450 start 451 end 456 total 463 clock 60.00Hz
640x480 (0x70) 25.200MHz -HSync -VSync
h: width 640 start 656 end 752 total 800 skew 0 clock 31.50KHz
v: height 480 start 490 end 492 total 525 clock 60.00Hz
720x405 (0x71) 22.123MHz +HSync -VSync
h: width 720 start 768 end 800 total 880 skew 0 clock 25.14KHz
v: height 405 start 408 end 413 total 419 clock 60.00Hz
720x400 (0x72) 25.047MHz -HSync +VSync
h: width 720 start 756 end 828 total 936 skew 0 clock 26.76KHz
v: height 400 start 401 end 404 total 446 clock 60.00Hz
684x384 (0x73) 36.213MHz +HSync -VSync DoubleScan
h: width 684 start 708 end 724 total 764 skew 0 clock 47.40KHz
v: height 384 start 385 end 390 total 395 clock 60.00Hz
640x400 (0x74) 22.214MHz -HSync +VSync
h: width 640 start 672 end 736 total 832 skew 0 clock 26.70KHz
v: height 400 start 401 end 404 total 445 clock 60.00Hz
576x432 (0x75) 43.200MHz +HSync +VSync DoubleScan
h: width 576 start 608 end 672 total 800 skew 0 clock 54.00KHz
v: height 432 start 432 end 434 total 450 clock 60.00Hz
640x360 (0x76) 17.952MHz +HSync -VSync
h: width 640 start 688 end 720 total 800 skew 0 clock 22.44KHz
v: height 360 start 363 end 368 total 374 clock 60.00Hz
640x350 (0x77) 22.214MHz +HSync -VSync
h: width 640 start 672 end 736 total 832 skew 0 clock 26.70KHz
v: height 350 start 382 end 385 total 445 clock 60.00Hz
512x384 (0x78) 32.497MHz -HSync -VSync DoubleScan
h: width 512 start 524 end 592 total 672 skew 0 clock 48.36KHz
v: height 384 start 385 end 388 total 403 clock 60.00Hz
512x384i (0x79) 15.471MHz +HSync +VSync Interlace DoubleScan
h: width 512 start 516 end 604 total 632 skew 0 clock 24.48KHz
v: height 384 start 384 end 388 total 408 clock 60.00Hz
512x288 (0x7a) 21.027MHz +HSync -VSync DoubleScan
h: width 512 start 536 end 552 total 592 skew 0 clock 35.52KHz
v: height 288 start 289 end 292 total 296 clock 60.00Hz
416x312 (0x7b) 23.016MHz -HSync -VSync DoubleScan
h: width 416 start 432 end 464 total 576 skew 0 clock 39.96KHz
v: height 312 start 312 end 314 total 333 clock 60.00Hz
480x270 (0x7c) 18.681MHz +HSync -VSync DoubleScan
h: width 480 start 504 end 520 total 560 skew 0 clock 33.36KHz
v: height 270 start 271 end 274 total 278 clock 60.00Hz
400x300 (0x7d) 19.169MHz +HSync +VSync DoubleScan
h: width 400 start 412 end 448 total 512 skew 0 clock 37.44KHz
v: height 300 start 300 end 301 total 312 clock 60.00Hz
432x243 (0x7e) 15.360MHz +HSync -VSync DoubleScan
h: width 432 start 456 end 472 total 512 skew 0 clock 30.00KHz
v: height 243 start 244 end 247 total 250 clock 60.00Hz
320x240 (0x7f) 12.576MHz -HSync -VSync DoubleScan
h: width 320 start 328 end 376 total 400 skew 0 clock 31.44KHz
v: height 240 start 245 end 246 total 262 clock 60.00Hz
360x202 (0x80) 11.035MHz +HSync -VSync DoubleScan
h: width 360 start 384 end 400 total 440 skew 0 clock 25.08KHz
v: height 202 start 204 end 206 total 209 clock 60.00Hz
360x200 (0x81) 12.523MHz -HSync +VSync DoubleScan
h: width 360 start 378 end 414 total 468 skew 0 clock 26.76KHz
v: height 200 start 200 end 202 total 223 clock 60.00Hz
320x200 (0x82) 11.082MHz -HSync +VSync DoubleScan
h: width 320 start 336 end 368 total 416 skew 0 clock 26.64KHz
v: height 200 start 200 end 202 total 222 clock 60.00Hz
320x180 (0x83) 8.976MHz +HSync -VSync DoubleScan
h: width 320 start 344 end 360 total 400 skew 0 clock 22.44KHz
v: height 180 start 181 end 184 total 187 clock 60.00Hz
320x175 (0x84) 11.082MHz +HSync -VSync DoubleScan
h: width 320 start 336 end 368 total 416 skew 0 clock 26.64KHz
v: height 175 start 191 end 192 total 222 clock 60.00Hz
DP-1 disconnected (normal left inverted right x axis y axis)
Identifier: 0x43
Timestamp: 16353
Subpixel: unknown
Clones:
CRTCs: 0 1 2 3
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
HDCP Content Type: HDCP Type0
supported: HDCP Type0, HDCP Type1
Content Protection: Undesired
supported: Undesired, Desired, Enabled
vrr_capable: 0
range: (0, 1)
Colorspace: Default
supported: Default, RGB_Wide_Gamut_Fixed_Point, RGB_Wide_Gamut_Floating_Point, opRGB, DCI-P3_RGB_D65, BT2020_RGB, BT601_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, BT2020_CYCC, BT2020_YCC
max bpc: 12
range: (6, 12)
Broadcast RGB: Automatic
supported: Automatic, Full, Limited 16:235
audio: auto
supported: force-dvi, off, auto, on
subconnector: Unknown
supported: Unknown, VGA, DVI-D, HDMI, DP, Wireless, Native
link-status: Good
supported: Good, Bad
CONNECTOR_ID: 317
supported: 317
non-desktop: 0
range: (0, 1)
DP-2 disconnected (normal left inverted right x axis y axis)
Identifier: 0x44
Timestamp: 16353
Subpixel: unknown
Clones:
CRTCs: 0 1 2 3
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
HDCP Content Type: HDCP Type0
supported: HDCP Type0, HDCP Type1
Content Protection: Undesired
supported: Undesired, Desired, Enabled
vrr_capable: 0
range: (0, 1)
Colorspace: Default
supported: Default, RGB_Wide_Gamut_Fixed_Point, RGB_Wide_Gamut_Floating_Point, opRGB, DCI-P3_RGB_D65, BT2020_RGB, BT601_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, BT2020_CYCC, BT2020_YCC
max bpc: 12
range: (6, 12)
Broadcast RGB: Automatic
supported: Automatic, Full, Limited 16:235
audio: auto
supported: force-dvi, off, auto, on
subconnector: Unknown
supported: Unknown, VGA, DVI-D, HDMI, DP, Wireless, Native
link-status: Good
supported: Good, Bad
CONNECTOR_ID: 330
supported: 330
non-desktop: 0
range: (0, 1)
DP-3 disconnected (normal left inverted right x axis y axis)
Identifier: 0x45
Timestamp: 16353
Subpixel: unknown
Clones:
CRTCs: 0 1 2 3
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
HDCP Content Type: HDCP Type0
supported: HDCP Type0, HDCP Type1
Content Protection: Undesired
supported: Undesired, Desired, Enabled
vrr_capable: 0
range: (0, 1)
Colorspace: Default
supported: Default, RGB_Wide_Gamut_Fixed_Point, RGB_Wide_Gamut_Floating_Point, opRGB, DCI-P3_RGB_D65, BT2020_RGB, BT601_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, BT2020_CYCC, BT2020_YCC
max bpc: 12
range: (6, 12)
Broadcast RGB: Automatic
supported: Automatic, Full, Limited 16:235
audio: auto
supported: force-dvi, off, auto, on
subconnector: Unknown
supported: Unknown, VGA, DVI-D, HDMI, DP, Wireless, Native
link-status: Good
supported: Good, Bad
CONNECTOR_ID: 339
supported: 339
non-desktop: 0
range: (0, 1)

I have attempted the following modelines:
Modeline “2880x1920_75.00” 601.50 2880 3128 3440 4000 1920 1923 1933 2006 -hsync +vsync
Modeline “2880x1920_100” 595.848 2880 2888 2920 2960 1920 1999 2007 2013 +HSync -VSync

In both cases I got black screen then revert to previous settings (2880 x 1920 120 Hz):

xrandr: Configure crtc 0 failed

Ok, the panel is picky with its modelines and especially dot-clock vs. horizontal frequencies, but there’s a hint to a solution - use the fact that this is a VRR capable display and play with vtotal while keeping all other timing parameters fixed, to enforce a specific frame duration and refresh rate:

Try this one, according to the following receipt:

For a given desired refresh rate in hz the formula for your panel would be:

VTOTAL = round(120 / hz * 2000)

then plug the VTOTAL value into a modeline:

Modeline “2880x1920_hz” 710.400 2880 2888 2920 2960 1920 1986 1994 VTOTAL +HSync -VSync

E.g., for 100 Hz refresh, ie. hz = 100, try:

Modeline “2880x1920_100” 710.400 2880 2888 2920 2960 1920 1986 1994 2400 +HSync -VSync

Lets see if this gives you a 100 Hz mode.
-mario

1 Like

I had no luck with the following:

lovejoy@murmur:~$ xrandr --newmode “2880x1920_100” 710.400 2880 2888 2920 2960 1920 1986 1994 2400 +HSync -VSync

lovejoy@murmur:~$ xrandr
Screen 0: minimum 320 x 200, current 2880 x 1920, maximum 16384 x 16384
eDP-1 connected primary 2880x1920+0+0 (normal left inverted right x axis y axis) 274mm x 183mm
2880x1920 60.00 + 60.00 + 120.00*
2880x1620 60.00
2560x1600 60.00
2560x1440 60.00
2048x1536 60.00
1920x1440 60.00
1856x1392 60.00
1792x1344 60.00
2048x1152 60.00
1920x1200 60.00
1920x1080 60.00
1600x1200 60.00
1680x1050 60.00
1400x1050 60.00
1600x900 60.00
1280x1024 60.00
1400x900 60.00
1280x960 60.00
1440x810 60.00
1368x768 60.00
1280x800 60.00
1152x864 60.00
1280x720 60.00
1024x768 60.00
1024x768i 60.00
960x720 60.00
928x696 60.00
896x672 60.00
1024x576 60.00
960x600 60.00
832x624 60.00
960x540 60.00
800x600 60.00
840x525 60.00
864x486 60.00
700x525 60.00
800x450 60.00
640x512 60.00
700x450 60.00
640x480 60.00
720x405 60.00
720x400 60.00
684x384 60.00
640x400 60.00
576x432 60.00
640x360 60.00
640x350 60.00
512x384 60.00
512x384i 60.00
512x288 60.00
416x312 60.00
480x270 60.00
400x300 60.00
432x243 60.00
320x240 60.00
360x202 60.00
360x200 60.00
320x200 60.00
320x180 60.00
320x175 60.00
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
2880x1920_100 (0x7b3) 710.400MHz +HSync -VSync
h: width 2880 start 2888 end 2920 total 2960 skew 0 clock 240.00KHz
v: height 1920 start 1986 end 1994 total 2400 clock 100.00Hz
lovejoy@murmur:~$ xrandr --addmode eDP-1 2880x1920_100
lovejoy@murmur:~$ xrandr --output eDP-1 --mode 2880x1920_100 --rate 100
xrandr: Configure crtc 0 failed
lovejoy@murmur:~$ xrandr --output eDP-1 --mode 2880x1920_100
xrandr: Configure crtc 0 failed
lovejoy@murmur:~$

Hmm. Should have worked, the way you did it, and with xrandr --output eDP-1 --mode 2880x1920_100 ie. --rate is not needed.

Something is rejecting the setting. The next step would be to switch to root:
sudo su
Then enable low-level debugging:
echo 20 > /sys/module/drm/parameters/debug ; dmesg -c
Then try the xrandr --output eDP-1 --mode 2880x1920_100 again
Then report all the low-level debug output from the time when the xrandr command was executed up to after the failure. The output is available, e.g., via dmesg > failllog.txt

We are far past the free support time now though, with over 60 minutes free time spent instead of the 5 to 10 minutes i promised. You can post the output, but most likely I’d have to ask you to buy an extra hour of support to see if something can be done about it, unless the problem is trivial to solve. What Linux kernel version is this?

-mario
[150 minutes of 60 minutes paid for support spent → 90 minutes overtime]

Here are results from testing using a (modified) version of VRRTest that internally sets the delay to the specified constant.

120 Hz:

100 Hz:

75 Hz:

60 Hz

__

Here’s what happened more specifically for 75 Hz:

RandR: 2880x1920 (0x49) 710.4MHz
h: width 2880 start 2888 end 2920 total 2960 skew 0
v: height 1920 start 1986 end 1994 total 2000

ans =

 0

PTB-INFO: This is Psychtoolbox-3 for GNU/Linux X11, under Matlab 64-Bit (Version 3.0.19 - Build date: Feb 12 2023).
PTB-INFO: OS support status: Linux 6.2.8-surface Supported.
PTB-INFO: Type ‘PsychtoolboxVersion’ for more detailed version information.
PTB-INFO: Most parts of the Psychtoolbox distribution are licensed to you under terms of the MIT License, with
PTB-INFO: some restrictions. See file ‘License.txt’ in the Psychtoolbox root folder for the exact licensing conditions.

PTB-INFO: For information about paid support, support memberships and other commercial services, please type
PTB-INFO: ‘PsychPaidSupportAndServices’.

PTB-INFO: OpenGL-Renderer is Intel :: Mesa Intel(R) Xe Graphics (TGL GT2) :: 4.6 (Compatibility Profile) Mesa 22.2.5
PTB-INFO: VBL startline = 1920 , VBL Endline = -1
PTB-INFO: Measured monitor refresh interval from VBLsync = 8.333311 ms [120.000320 Hz]. (50 valid samples taken, stddev=0.002310 ms.)
PTB-INFO: Reported monitor refresh interval from operating system = 8.333333 ms [120.000000 Hz].
PTB-INFO: Small deviations between reported values are normal and no reason to worry.
PTB-INFO: Enabling Variable Refresh Rate VRR mode, using method 3 and timing style 0.
PTB-INFO: Assuming minimum VRR refresh duration 8.333333 msecs, maximum duration 33.333333 msecs.
PTB-INFO: Using initial VRR latency compensation of 0.787270 msecs.
PTB-INFO: Psychtoolbox imaging pipeline starting up for window with requested imagingmode 1025 …
PTB-INFO: Will use 8 bits per color component framebuffer for stimulus drawing.
PTB-INFO: Will use 8 bits per color component framebuffer for stimulus post-processing (if any).
PTB-INFO: Switching stimulus onset scheduling to use of our own VRR scheduler.

Actual chosen VRR mode: 3, style 0, latency compensation 0.787270 msecs.
Measured refresh interval, as reported by “GetFlipInterval” is 8.33331 ms. (nsamples = 0, stddev = 0.00000 ms)

phase =

 0

INFO: PTB’s Screen(‘Flip’, 10) command seems to have missed the requested stimulus presentation deadline
INFO: a total of 30 times out of a total of 2006 flips during this session.

INFO: This number is fairly accurate (and indicative of real timing problems in your own code or your system)
INFO: if you provided requested stimulus onset times with the ‘when’ argument of Screen(‘Flip’, window [, when]);
INFO: If you called Screen(‘Flip’, window); without the ‘when’ argument, this count is more of a ‘‘mild’’ indicator
INFO: of timing behaviour than a hard reliable measurement. Large numbers may indicate problems and should at least
INFO: deserve your closer attention. Cfe. ‘help SyncTrouble’, the FAQ section at www.psychtoolbox.org and the
INFO: examples in the PDF presentation in PsychDocumentation/Psychtoolbox3-Slides.pdf for more info and timing tips.

Avg diff target vs. true: 2.572201 msecs. stddev 0.528163 msecs. Median diff 2.536284 msecs. Too early: 0
Without 1st two samples : 2.572074 msecs. stddev 0.528308 msecs. Median diff 2.536284 msecs. Too early: 0

Based on this, I ran again with 0.0108 second delay. What I think are the most relevant parts of the PTB output:

RandR: 2880x1920 (0x49) 710.4MHz
h: width 2880 start 2888 end 2920 total 2960 skew 0
v: height 1920 start 1986 end 1994 total 2000

Avg diff target vs. true: 2.632819 msecs. stddev 1.424712 msecs. Median diff 2.549056 msecs. Too early: 0
Without 1st two samples : 2.633169 msecs. stddev 1.425362 msecs. Median diff 2.549771 msecs. Too early: 0

And here’s the plot:

On average this is 0.0134 sec per interval, so I tried 0.0107 sec:

Avg diff target vs. true: 2.555715 msecs. stddev 1.364257 msecs. Median diff 2.497422 msecs. Too early: 0
Without 1st two samples : 2.555142 msecs. stddev 1.364819 msecs. Median diff 2.496945 msecs. Too early: 0

Hi Mario, I have tried to do this but the fail log is too many characters to post. The kernel version is 6.2.8-surface

Could you invoice us for another hour of support?

Can you e-mail the log to kleiner@mi-incubator.com ?

Edit: I also need the output of cat /sys/kernel/debug/dri/0/i915_display_info