Skip to content

Commit 6734569

Browse files
authored
use NvLL_VK_Sleep detour from reflex.cpp in Arknights: Endfield slDLSSGSetOptions hook (#352)
1 parent fd10519 commit 6734569

2 files changed

Lines changed: 13 additions & 64 deletions

File tree

src/plugins/arknights_endfield.cpp

Lines changed: 6 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -660,23 +660,7 @@ SK_AKEF_GetExistingEndfieldPids (void)
660660
Global Variables and Plugin Settings (Hooks, CodePatches, etc.)
661661
*/
662662

663-
// Update the struct-layout if reflex.cpp is updated
664-
extern struct SK_VK_REFLEX {
665-
VkDevice device;
666-
VkSwapchainKHR swapchain;
667-
uint64_t last_frame;
668-
VkSemaphore NvLL_semaphore;
669-
};
670-
671-
extern struct NVLL_VK_SET_SLEEP_MODE_PARAMS {
672-
bool bLowLatencyMode;
673-
bool bLowLatencyBoost;
674-
uint32_t minimumIntervalUs;
675-
};
676-
677-
extern DWORD NvLL_VK_SetSleepMode_Detour (VkDevice device, NVLL_VK_SET_SLEEP_MODE_PARAMS* sleepModeParams);
678-
extern SK_VK_REFLEX SK_VK_Reflex;
679-
extern NVLL_VK_SET_SLEEP_MODE_PARAMS SK_NVLL_LastSleepParams;
663+
extern DWORD NvLL_VK_Sleep_Detour (VkDevice device, uint64_t signalValue);
680664
extern PFN_vkWaitSemaphores vkWaitSemaphores_SK = nullptr;
681665

682666
bool __g_SK_AKEF_KeepOriginalSwapchain = false;
@@ -838,11 +822,11 @@ namespace SK::ArknightsEndfield
838822
}
839823

840824
__forceinline int __fastcall
841-
NvLL_VK_Sleep (const NvLL_VK_Sleep_pfn NvLL_VK_Sleep_Original, NvLowLatencyVk* nvLowLatencyVk)
825+
NvLL_VK_Sleep (NvLowLatencyVk* nvLowLatencyVk)
842826
{
843827
++nvLowLatencyVk->reflexSemaphoreValue;
844828

845-
const int ret = NvLL_VK_Sleep_Original (nvLowLatencyVk->device, nvLowLatencyVk->reflexSemaphoreValue);
829+
const int ret = NvLL_VK_Sleep_Detour (nvLowLatencyVk->device, nvLowLatencyVk->reflexSemaphoreValue);
846830

847831
if (ret == 0)
848832
{
@@ -858,16 +842,9 @@ namespace SK::ArknightsEndfield
858842
const auto result = vkWaitSemaphores_SK (nvLowLatencyVk->device, &waitInfo, 500000000);
859843
if (result == VK_TIMEOUT)
860844
{
845+
SK_LOGi0 (L"Timeout while waiting (500 ms) for Reflex semaphore.");
861846
config.nvidia.reflex.use_limiter = false;
862847
}
863-
else if (result == VK_SUCCESS)
864-
{
865-
auto& rb =
866-
SK_GetCurrentRenderBackend ();
867-
868-
if (config.render.framerate.enforcement_policy == 2 && rb.vulkan_reflex.isPacingEligible ())
869-
SK::Framerate::Tick (true, 0.0, { 0,0 }, rb.swapchain.p);
870-
}
871848
}
872849
return ret;
873850
}
@@ -876,49 +853,14 @@ namespace SK::ArknightsEndfield
876853
slCommon_ReflexSleep_Detour (NvLowLatencyVk* nvLowLatencyVk)
877854
{
878855
SK_LOG_FIRST_CALL
879-
880-
SK_VK_Reflex.device = nvLowLatencyVk->device;
881-
if (config.nvidia.reflex.override || __SK_ForceDLSSGPacing)
882-
NvLL_VK_SetSleepMode_Detour (nvLowLatencyVk->device, &SK_NVLL_LastSleepParams);
883-
884-
static NvLL_VK_Sleep_pfn NvLL_VK_Sleep_Original = nullptr;
885-
if (NvLL_VK_Sleep_Original == nullptr)
886-
{
887-
if (nvLowLatencyVk->m_hmodReflex != nullptr)
888-
{
889-
NvLL_VK_Sleep_Original = reinterpret_cast <NvLL_VK_Sleep_pfn> (
890-
SK_GetProcAddress (nvLowLatencyVk->m_hmodReflex, "NvLL_VK_Sleep"));
891-
892-
if (NvLL_VK_Sleep_Original == nullptr)
893-
return slCommon_ReflexSleep_Hook.call<int> (nvLowLatencyVk);
894-
}
895-
}
896-
897-
return NvLL_VK_Sleep (NvLL_VK_Sleep_Original, nvLowLatencyVk);
856+
return NvLL_VK_Sleep (nvLowLatencyVk);
898857
}
899858

900859
static int __fastcall
901860
slCommon_ReflexSleep_OTA_Detour (NvLowLatencyVk* nvLowLatencyVk)
902861
{
903862
SK_LOG_FIRST_CALL
904-
905-
if (config.nvidia.reflex.override || __SK_ForceDLSSGPacing)
906-
NvLL_VK_SetSleepMode_Detour (nvLowLatencyVk->device, &SK_NVLL_LastSleepParams);
907-
908-
static NvLL_VK_Sleep_pfn NvLL_VK_Sleep_Original = nullptr;
909-
if (NvLL_VK_Sleep_Original == nullptr)
910-
{
911-
if (nvLowLatencyVk->m_hmodReflex != nullptr)
912-
{
913-
NvLL_VK_Sleep_Original = reinterpret_cast <NvLL_VK_Sleep_pfn> (
914-
SK_GetProcAddress (nvLowLatencyVk->m_hmodReflex, "NvLL_VK_Sleep"));
915-
916-
if (NvLL_VK_Sleep_Original == nullptr)
917-
return slCommon_ReflexSleep_OTA_Hook.call<int> (nvLowLatencyVk);
918-
}
919-
}
920-
921-
return NvLL_VK_Sleep (NvLL_VK_Sleep_Original, nvLowLatencyVk);
863+
return NvLL_VK_Sleep (nvLowLatencyVk);
922864
}
923865
}
924866

src/render/reflex/reflex.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,13 @@ void SK_VK_HookReflex (void)
17741774
NvLL_VK_Sleep_Detour,
17751775
static_cast_p2p <void>(&NvLL_VK_Sleep_Original));
17761776
}
1777+
else
1778+
{
1779+
NvLL_VK_Sleep_Original =
1780+
reinterpret_cast<NvLL_VK_Sleep_pfn> (
1781+
SK_GetProcAddress (L"NvLowLatencyVk.dll", "NvLL_VK_Sleep")
1782+
);
1783+
}
17771784

17781785
SK_CreateDLLHook2 ( L"NvLowLatencyVk.dll",
17791786
"NvLL_VK_SetLatencyMarker",

0 commit comments

Comments
 (0)