aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/latencyflex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NorthstarDedicatedTest/latencyflex.cpp')
-rw-r--r--NorthstarDedicatedTest/latencyflex.cpp50
1 files changed, 41 insertions, 9 deletions
diff --git a/NorthstarDedicatedTest/latencyflex.cpp b/NorthstarDedicatedTest/latencyflex.cpp
index 4ac1c760..3e2cecd7 100644
--- a/NorthstarDedicatedTest/latencyflex.cpp
+++ b/NorthstarDedicatedTest/latencyflex.cpp
@@ -9,13 +9,19 @@ OnRenderStartType OnRenderStart;
ConVar* Cvar_r_latencyflex;
HMODULE m_lfxModule {};
-typedef void (*PFN_winelfx_WaitAndBeginFrame)();
-PFN_winelfx_WaitAndBeginFrame m_winelfx_WaitAndBeginFrame {};
+typedef void (*PFN_lfx_WaitAndBeginFrame)();
+PFN_lfx_WaitAndBeginFrame m_lfx_WaitAndBeginFrame {};
void OnRenderStartHook()
{
+ // Sleep before next frame as needed to reduce latency.
if (Cvar_r_latencyflex->GetInt())
- m_winelfx_WaitAndBeginFrame();
+ {
+ if (m_lfx_WaitAndBeginFrame)
+ {
+ m_lfx_WaitAndBeginFrame();
+ }
+ }
OnRenderStart();
}
@@ -25,17 +31,43 @@ void InitialiseLatencyFleX(HMODULE baseAddress)
// Connect to the LatencyFleX service
// LatencyFleX is an open source vendor agnostic replacement for Nvidia Reflex input latency reduction technology.
// https://ishitatsuyuki.github.io/post/latencyflex/
- m_lfxModule = LoadLibraryA("latencyflex_wine.dll");
+ const auto lfxModuleName = "latencyflex_layer.dll";
+ const auto lfxModuleNameFallback = "latencyflex_wine.dll";
+ auto useFallbackEntrypoints = false;
+
+ // Load LatencyFleX library.
+ m_lfxModule = ::LoadLibraryA(lfxModuleName);
+ if (m_lfxModule == nullptr && ::GetLastError() == ERROR_MOD_NOT_FOUND)
+ {
+ spdlog::info("LFX: Primary LatencyFleX library not found, trying fallback.");
- if (m_lfxModule == nullptr)
+ m_lfxModule = ::LoadLibraryA(lfxModuleNameFallback);
+ if (m_lfxModule == nullptr)
+ {
+ if (::GetLastError() == ERROR_MOD_NOT_FOUND)
+ {
+ spdlog::info("LFX: Fallback LatencyFleX library not found.");
+ }
+ else
+ {
+ spdlog::info("LFX: Error loading fallback LatencyFleX library - Code: {}", ::GetLastError());
+ }
+
+ return;
+ }
+
+ useFallbackEntrypoints = true;
+ }
+ else if (m_lfxModule == nullptr)
{
- spdlog::info("Unable to load LatencyFleX library, LatencyFleX disabled.");
+ spdlog::info("LFX: Error loading primary LatencyFleX library - Code: {}", ::GetLastError());
return;
}
- m_winelfx_WaitAndBeginFrame =
- reinterpret_cast<PFN_winelfx_WaitAndBeginFrame>(reinterpret_cast<void*>(GetProcAddress(m_lfxModule, "winelfx_WaitAndBeginFrame")));
- spdlog::info("LatencyFleX initialized.");
+ m_lfx_WaitAndBeginFrame = reinterpret_cast<PFN_lfx_WaitAndBeginFrame>(reinterpret_cast<void*>(
+ GetProcAddress(m_lfxModule, !useFallbackEntrypoints ? "lfx_WaitAndBeginFrame" : "winelfx_WaitAndBeginFrame")));
+
+ spdlog::info("LFX: Initialized.");
Cvar_r_latencyflex = new ConVar("r_latencyflex", "1", FCVAR_ARCHIVE, "Whether or not to use LatencyFleX input latency reduction.");