On 12/17/2014 04:17 AM, Keith Packard wrote:
Mario Kleiner <mario.kleiner...@gmail.com> writes:

Hmm. For benchmarking i think i'd consider that a mild form of cheating.
You get higher fps because you skip processing like the whole gpu blit
overhead and host processing overhead for queuing / validating /
processing the copy command in the command stream, so the benchmark
numbers don't translate very well anymore in how the system would behave
in a non-benchmark situation?
It's still a very useful mode -- imagine wanting the lowest possible
latency between the user and the display; normally, you process input
and generate a frame just after vblank, then (if the rendering is really
quick), end up waiting most of the frame time not doing anything before
finally updating it at the next vblank.

With vblank_mode=0 and DRI3, you have the ability to try and generate
another frame before vblank comes; if you manage, then you get that data
on the screen, rather than the older version.

So, it offers latency closer to the tearing vblank_mode=0 but without
any tearing.

That's why I did it; the fact that it offers a small performance benefit
for benchmarks is an unintentional bonus feature.


It is a useful mode for some applications, no disagreement here. I can think of use cases where i would exactly want to have that, e.g., VR stuff with head-tracking -> rendering -> Occulus Rift style display. I actually want to tinker with something like that early next year and see if i can make use of it.

It's just that i need access to both, the old behaviour i described, and the new "drop frame" behaviour, and i need a way to select what i want at runtime via api without the need for easily overwhelmed and confused users to change config files or environment variables. I also always need meaningful and trustworthy feedback, at least for page-flipped presents, about what really happened for a presented frame - was it flipped, copied, exchanged, skipped, or did some error happen?

That's why i'd like to have an extension to INTEL_swap_events to also report some new completion type "skipped" and "error" and that one patch 5/5 of mine for mesa reviewed and included, to make sure the swap_events don't fall apart so easily.

That's why i think we could (ab)use the swap_control_tear extension to implement this behaviour:

swapinterval > 0 - sync to vblank, swap only at most every swapinterval'th refresh. swapinterval = 0 - Don't sync to vblank (PresentOptionAsync), swap immediately.

swapinterval < 0 - Do what your current implementation does for swapinterval = abs(swapinterval);

The first two would restore consistent behaviour with all other implementations.

The last one would implement something at least close to the spirit of of swap_control_tear. Although it would be even better to think of some extension to the extension so one can select if one really wants "tearing if late" as swap_control_tear defines, to squeeze out a few more msecs, or rather your tear free "skip old frames" method.

Essentially i'd love to have more control over how this stuff is done, and a default behaviour close to what all other implementations do, to reduce confusion.

As some kind of stop gap measure one could also think about defining a new vblank_mode to enable the new behaviour instead of the old one.

-mario

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to