From 169f912b5bfc057317e41504f64a5cc0c6ce2b48 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Thu, 26 Jun 2025 12:01:06 +0200 Subject: [PATCH] xfree86: compat: re-add TimeCheck() for proprietary nvidia driver Yet another very internal function that the proprietary Nvidia driver is using for unknown reasons. Signed-off-by: Enrico Weigelt, metux IT consult --- hw/xfree86/compat/meson.build | 4 ++++ hw/xfree86/compat/timercheck.c | 23 +++++++++++++++++++++++ meson_options.txt | 4 ++++ os/WaitFor.c | 4 +--- os/osdep.h | 3 +++ 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 hw/xfree86/compat/timercheck.c diff --git a/hw/xfree86/compat/meson.build b/hw/xfree86/compat/meson.build index b3835efdc4..79157c9497 100644 --- a/hw/xfree86/compat/meson.build +++ b/hw/xfree86/compat/meson.build @@ -6,6 +6,10 @@ srcs_xorg_compat = [ 'xf86Helper.c', ] +if get_option('legacy_nvidia_340x') + srcs_xorg_compat += 'timercheck.c' +endif + xorg_compat = static_library('xorg_compat', srcs_xorg_compat, dependencies: common_dep, diff --git a/hw/xfree86/compat/timercheck.c b/hw/xfree86/compat/timercheck.c new file mode 100644 index 0000000000..6ddb3a5a88 --- /dev/null +++ b/hw/xfree86/compat/timercheck.c @@ -0,0 +1,23 @@ +#include + +#include + +#include "os/osdep.h" + +#include "xf86_compat.h" + +/* + * needed for NVidia proprietary driver 340.x versions + * force the server to see if any timer callbacks should be called + * + * this function had been obsolete and removed long ago, but NVidia folks + * still didn't do basic maintenance and fixed their driver + */ + +_X_EXPORT void TimerCheck(void); + +void TimerCheck(void) { + xf86NVidiaBugObsoleteFunc("TimerCheck()"); + + DoTimers(GetTimeInMillis()); +} diff --git a/meson_options.txt b/meson_options.txt index e9f4ce5f4c..83be0b5a85 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -148,6 +148,10 @@ option('devel-docs', type: 'combo', choices: ['true', 'false', 'auto'], value: ' option('docs-pdf', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', description: 'Whether to build PDF version of documentation. Setting is ignored if documentation is not built.') +# legacy nvidia driver quirks +option('legacy_nvidia_340x', type: 'boolean', value: true, + description: 'Extra entrypoints for old Nvidia 340x proprietary driver') + # testsuite fine tuning - some things might not run everywhere option('test_rendercheck_triangles', type: 'boolean', value: false, description: 'testsuite: run rendercheck triangles tests (might fail on Xephyr)') diff --git a/os/WaitFor.c b/os/WaitFor.c index 973a3495d7..32b9b5b035 100644 --- a/os/WaitFor.c +++ b/os/WaitFor.c @@ -105,7 +105,6 @@ struct _OsTimerRec { }; static void DoTimer(OsTimerPtr timer, CARD32 now); -static void DoTimers(CARD32 now); static void CheckAllTimers(void); static volatile struct xorg_list timers; @@ -276,8 +275,7 @@ DoTimer(OsTimerPtr timer, CARD32 now) TimerSet(timer, 0, newTime, timer->callback, timer->arg); } -static void -DoTimers(CARD32 now) +void DoTimers(CARD32 now) { OsTimerPtr timer; diff --git a/os/osdep.h b/os/osdep.h index 0374a79d58..0a47997393 100644 --- a/os/osdep.h +++ b/os/osdep.h @@ -219,4 +219,7 @@ Ones(unsigned long mask) } #endif +/* run timers that are expired at timestamp `now` */ +void DoTimers(CARD32 now); + #endif /* _OSDEP_H_ */