From 804f96625bcb5f3aae15d2192faecd91df1d4c79 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 12 Sep 2023 00:08:46 +0200 Subject: [PATCH] Move NVIDIA Reflex implementation to library function Improve code, there will be more NVIDIA GeForce related stuff soon. --- r5dev/CMakeLists.txt | 1 + r5dev/core/CMakeLists.txt | 1 + r5dev/engine/sys_dll2.cpp | 18 ++---------------- r5dev/geforce/CMakeLists.txt | 13 +++++++++++++ r5dev/geforce/reflex.cpp | 37 ++++++++++++++++++++++++++++++++++++ r5dev/geforce/reflex.h | 7 +++++++ 6 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 r5dev/geforce/CMakeLists.txt create mode 100644 r5dev/geforce/reflex.cpp create mode 100644 r5dev/geforce/reflex.h diff --git a/r5dev/CMakeLists.txt b/r5dev/CMakeLists.txt index e72e3de1..99731864 100644 --- a/r5dev/CMakeLists.txt +++ b/r5dev/CMakeLists.txt @@ -15,6 +15,7 @@ add_subdirectory( vstdlib ) add_subdirectory( vphysics ) add_subdirectory( ebisusdk ) add_subdirectory( codecs ) +add_subdirectory( geforce ) set( FOLDER_CONTEXT "Protocols" ) add_subdirectory( protoc ) diff --git a/r5dev/core/CMakeLists.txt b/r5dev/core/CMakeLists.txt index 0c1c6161..aa88ae2d 100644 --- a/r5dev/core/CMakeLists.txt +++ b/r5dev/core/CMakeLists.txt @@ -76,6 +76,7 @@ target_link_libraries( ${PROJECT_NAME} PRIVATE "filesystem" "datacache" "EbisuSDK" + "GFSDK" "localize" diff --git a/r5dev/engine/sys_dll2.cpp b/r5dev/engine/sys_dll2.cpp index dd140702..815c8e09 100644 --- a/r5dev/engine/sys_dll2.cpp +++ b/r5dev/engine/sys_dll2.cpp @@ -19,6 +19,7 @@ #include "engine/sys_mainwind.h" #include "windows/id3dx.h" #include "client/vengineclient_impl.h" +#include "geforce/reflex.h" #endif // !DEDICATED #include "rtech/rtech_utils.h" #include "filesystem/filesystem.h" @@ -191,22 +192,7 @@ bool CEngineAPI::MainLoop() fpsMax = 0.0f; // Don't let NVIDIA limit the frame rate. } - NV_SET_SLEEP_MODE_PARAMS_V1 params = {}; - params.version = NV_SET_SLEEP_MODE_PARAMS_VER1; - - params.bLowLatencyMode = bUseLowLatencyMode; - params.bLowLatencyBoost = bUseLowLatencyMode && bUseLowLatencyBoost; - params.minimumIntervalUs = fpsMax > 0 ? (NvU32)((1000.0f / fpsMax) * 1000.0f) : 0; - params.bUseMarkersToOptimize = false; - - ID3D11Device* pGameDevice = D3D11Device(); - Assert(pGameDevice); - - NvAPI_Status status = NvAPI_D3D_SetSleepMode(pGameDevice, ¶ms); - - if (status == NVAPI_OK) - NvAPI_D3D_Sleep(pGameDevice); - + GFX_RunLowLatencySDK(D3D11Device(), bUseLowLatencyMode, bUseLowLatencyBoost, fpsMax); CEngineAPI_PumpMessages(); #endif // !DEDICATED diff --git a/r5dev/geforce/CMakeLists.txt b/r5dev/geforce/CMakeLists.txt new file mode 100644 index 00000000..264e90c3 --- /dev/null +++ b/r5dev/geforce/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required( VERSION 3.16 ) +add_module( "lib" "GFSDK" "vpc" ${FOLDER_CONTEXT} TRUE TRUE ) + +start_sources() + +add_sources( SOURCE_GROUP "Runtime" + "reflex.cpp" + "reflex.h" +) + +end_sources() + +target_include_directories( ${PROJECT_NAME} PRIVATE "${ENGINE_SOURCE_DIR}/tier0/" "${ENGINE_SOURCE_DIR}/tier1/" ) diff --git a/r5dev/geforce/reflex.cpp b/r5dev/geforce/reflex.cpp new file mode 100644 index 00000000..8fde52d0 --- /dev/null +++ b/r5dev/geforce/reflex.cpp @@ -0,0 +1,37 @@ +//===========================================================================// +// +// Purpose: NVIDIA Reflex utilities +// +//===========================================================================// +#include "reflex.h" +#include "mathlib/mathlib.h" + + +//----------------------------------------------------------------------------- +// Purpose: runs the low latency sdk +// Input : device - +// useLowLatencyMode - +// useLowLatencyBoost - +// maxFramesPerSecond - +//----------------------------------------------------------------------------- +void GFX_RunLowLatencySDK(IUnknown* device, const bool useLowLatencyMode, + const bool useLowLatencyBoost, const float maxFramesPerSecond) +{ + Assert(device); + Assert(IsFinite(maxFramesPerSecond)); + + NV_SET_SLEEP_MODE_PARAMS params = {}; + params.version = NV_SET_SLEEP_MODE_PARAMS_VER1; + + params.bLowLatencyMode = useLowLatencyMode; + params.bLowLatencyBoost = useLowLatencyMode && useLowLatencyBoost; + params.minimumIntervalUs = maxFramesPerSecond > 0 + ? (NvU32)((1000.0f / maxFramesPerSecond) * 1000.0f) + : 0; + params.bUseMarkersToOptimize = false; + + NvAPI_Status status = NvAPI_D3D_SetSleepMode(device, ¶ms); + + if (status == NVAPI_OK) + NvAPI_D3D_Sleep(device); +} diff --git a/r5dev/geforce/reflex.h b/r5dev/geforce/reflex.h new file mode 100644 index 00000000..fe7b1047 --- /dev/null +++ b/r5dev/geforce/reflex.h @@ -0,0 +1,7 @@ +#ifndef GFSDK_REFLEX_H +#define GFSDK_REFLEX_H + +void GFX_RunLowLatencySDK(IUnknown* device, const bool useLowLatencyMode, + const bool useLowLatencyBoost, const float maxFramesPerSecond); + +#endif // GFSDK_REFLEX_H