Am 09.08.2016 um 10:27 schrieb Michel Dänzer:
On 09/08/16 05:12 PM, Christian König wrote:
Am 09.08.2016 um 04:44 schrieb Michel Dänzer:

I was basically thinking out loud that doing this via different modes
might be quite natural, *if* games allowed choosing a specific mode.
But unfortunately they don't. For the video playback case, how do you
envision the video player app communicating the refresh rate of the
currently playing video to the kernel?
Again the kernel doesn't need to know the refresh rate. All the kernel
needs to know is when to do the page flip.

So coming back to my example of a mode with 1920x1080 and 20-100Hz
refresh rate a classic modeline would then look something like this:

Modeline "1920x1080_dynamic"  302.50  1920 2072 2280 2640  1080 1083
1088 5735 -hsync +vsync

Note the high vertical total scan lines. Those basically reduce the
refresh rate from 100Hz (which this mode normally would have) down to
only 20Hz.

Now what userspace does on each page flip is specifying when this flip
should happen, e.g. when the frame should be started to be scanned out.
We can either specify this as frame counter + vertical line of the
previous frame or as something like CLOCK_MONOTONIC (I think I would
prefer CLOCK_MONOTONIC, but that's not a strong opinion).

In other words you put the whole concept upside down. It's no longer the
kernel which tells userspace when a vblank happened, but rather
userspace tells the kernel when it should happen (together with the
frame that should be displayed then).
I guess that could work. Do video players set the VDPAU presentation
time accurately enough for this?

Yes, of course. We actually get a precise time stamp from the application and need to calculate on which vblank to display it from that.

This would require extensive changes across the stack though, when more
or less the same result could be achieved by just letting the kernel
know what the current refresh rate is supposed to be, e.g. via output
properties.

The problem is that you don't have a refresh rate any more. E.g. taking video playback as an example, the information you got here is that a certain frame should be displayed at a certain timestamp.

Since our minimum granularity is still a vertical refresh line you usually alternate between two or three different vertical positions when you start with the next frame.

Mostly the same applies for games as well, e.g. when you render a frame you usually render it for a certain timestamp.

Additional to that are you sure it is such a hassle to implement this? I mean let us sum up what we need: 1. A representation for the new mode attributes, e.g. minimum and maximum vertical refresh rate.

This is needed anyway to proper communicate the capabilities of the display device to userspace.

2. An extension to the page flip IOCTL to specify when exactly a flip should happen.

As far as I can see that is what your patchset already did. The only difference is that you wanted to specify a certain vertical blank when the flip would happen while I would say we should use a monotonic timestamp (64bit ns since boot) for this.

Also, this doesn't address the case of running (existing) games with
variable refresh rate.

Sure it does. For the current stack without any change a freesync capable display device just looks like a normal monitor with a high vertical refresh rate.

When we add freesync support we just extend vblank_mode with a new enum to enable it optionally for existing applications.

Regards,
Christian.
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to