JDK-8210547[linux] frame pacing etc.
Michael Zucchi
notzed at gmail.com
Fri Oct 3 03:02:55 UTC 2025
On 3/10/25 03:34, Thiago Milczarek Sayão wrote:
> I confess I did not understand much about the problem.
>
> Is it about variable refresh rates?
> If I think a message _VARIABLE_REFRESH is received on the Notify event.
>
No, I'm pretty sure I would have mentioned that if it was!
> Or
> https://docs.gtk.org/gdk3/class.FrameClock.html
>
I came across that but as far as I can tell that's only for gtk widget's
rendering pipeline which isn't relevant, apart from maybe an example of
how to do it.
> I also did an EGL version in place of GLX:
> https://github.com/openjdk/jfx/pull/1381
>
Fair enough. I may see if that makes any difference another time,
although the eglSwapBuffers() man page isn't really any different to the
glX one and afaict from a quick look at the mesa source it all ends up
at the same place internally.
> -- Thiago
>
It's a couple of things.
I experience the bug mentioned in the title with a trivial test
programme (first email to list) and default settings - I get uncapped
pulses/second on multiple AMD systems - ~600/s on a laptop and ~2000/s
on a desktop. It's just burning cpu and battery for no good reason.
It's probably due to a bug in mesa or amdgpu exposed due to the way
javafx swaps around gl contexts.
It's about incorrect assumptions about the behaviour of the GLX api -
i.e. that glXSwapBuffers() on a double-buffered window will block
waiting for vsync in the same way Direct3D's Present() with the provided
flags does. This is not correct[1], and even when GLX does throttle it
wont necessarily throttle where expected so that 'vsyncHint()' has any
meaning. The man page offers the correction: glFinish(), but that
doesn't work if executed per-window.
It's also about just poor timing code / api in general.
gdk_threads_add_timeout_full's man page:
Note that timeout functions may be delayed, due to the processing of
other event sources. Thus they should not be relied on for precise
timing. After each call to the timeout function, the time of the
next timeout is recalculated based on the current time and the given
interval (it does not try to “catch up” time lost in delays).
There is some messy code to try to account for that looseness when vsync
(the default) is requested (vsyncHint() and associated), but not
otherwise. But even without that the api has such limited precision it
just doesn't work very well. i.e. setting prism.vsync=false
javafx.animation.pulse=60 wont give you even a jittery 60/s pulse rate -
it will be a jittery higher one. It seems very low hanging fruit to fix.
Z
[1]
https://registry.khronos.org/OpenGL-Refpages/gl2.1/xhtml/glXSwapBuffers.xml
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20251003/1f858e55/attachment.htm>
More information about the openjfx-dev
mailing list