From e7571aa4e11e68ca3d86c46468f120596b9a96f9 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:49:02 +0200 Subject: [PATCH 1/4] Make name case consistent --- OptiScaler/nvapi/fakenvapi/fakenvapi.cpp | 56 ++++++++++++------------ OptiScaler/nvapi/fakenvapi/fakenvapi.h | 12 ++--- OptiScaler/nvapi/fakenvapi/log.cpp | 6 +-- OptiScaler/nvapi/fakenvapi/log.h | 4 +- OptiScaler/nvapi/fakenvapi/lowlatency.h | 12 ++--- OptiScaler/nvapi/fakenvapi/main.cpp | 8 ++-- OptiScaler/nvapi/fakenvapi/util.cpp | 10 ++--- OptiScaler/nvapi/fakenvapi/util.h | 4 +- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp b/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp index b5649fb6..3d31376b 100644 --- a/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp +++ b/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp @@ -2,36 +2,36 @@ namespace nvd { NvAPI_Status __cdecl NvAPI_Initialize() { - if (!deviceId) { - IDXGIFactory1* pFactory = nullptr; - if (FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory))) { + if (!device_id) { + IDXGIFactory1* factory = nullptr; + if (FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&factory))) { spdlog::error("Failed to create DXGI Factory"); return ERROR(); } - IDXGIAdapter1* pAdapter = nullptr; - if (FAILED(pFactory->EnumAdapters1(0, &pAdapter))) { + IDXGIAdapter1* adapter = nullptr; + if (FAILED(factory->EnumAdapters1(0, &adapter))) { spdlog::error("Failed to enumerate adapters"); - pFactory->Release(); + factory->Release(); return ERROR(); } - DXGI_ADAPTER_DESC1 adapterDesc; - if (FAILED(pAdapter->GetDesc1(&adapterDesc))) { + DXGI_ADAPTER_DESC1 adapter_desc; + if (FAILED(adapter->GetDesc1(&adapter_desc))) { spdlog::error("Failed to get adapter description"); - pAdapter->Release(); - pFactory->Release(); + adapter->Release(); + factory->Release(); return ERROR(); } - luid = adapterDesc.AdapterLuid; - deviceId = adapterDesc.DeviceId; - vendorId = adapterDesc.VendorId; - subSysId = adapterDesc.SubSysId; - revisionId = adapterDesc.Revision; + luid = adapter_desc.AdapterLuid; + device_id = adapter_desc.DeviceId; + vendor_id = adapter_desc.VendorId; + subsystem_id = adapter_desc.SubSysId; + revision_id = adapter_desc.Revision; - pAdapter->Release(); - pFactory->Release(); + adapter->Release(); + factory->Release(); lowlatency_ctx.init_lfx(); } @@ -94,17 +94,17 @@ namespace nvd { } NvAPI_Status __cdecl NvAPI_GetErrorMessage(NvAPI_Status status, NvAPI_ShortString szMsg) { - std::string error = fromErrorNr(status); + std::string error = from_error_nr(status); spdlog::error("NvAPI_GetErrorMessage gave this error: {}", error); tonvss(szMsg, error); return OK(); } NvAPI_Status __cdecl NvAPI_GPU_CudaEnumComputeCapableGpus(NV_COMPUTE_GPU_TOPOLOGY* pComputeTopo) { - auto pComputeTopoV1 = reinterpret_cast(pComputeTopo); - pComputeTopoV1->gpuCount = 1; - pComputeTopoV1->computeGpus[0].hPhysicalGpu = nullptr; - pComputeTopoV1->computeGpus[0].flags = NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_CAPABLE | NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_ENABLE | NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_RECOMMENDED; + auto compute_topoV1 = reinterpret_cast(pComputeTopo); + compute_topoV1->gpuCount = 1; + compute_topoV1->computeGpus[0].hPhysicalGpu = nullptr; + compute_topoV1->computeGpus[0].flags = NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_CAPABLE | NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_ENABLE | NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_RECOMMENDED; return OK(); } @@ -133,10 +133,10 @@ namespace nvd { } NvAPI_Status __cdecl NvAPI_GPU_GetPCIIdentifiers(NvPhysicalGpuHandle hPhysicalGpu, NvU32* pDeviceId, NvU32* pSubSystemId, NvU32* pRevisionId, NvU32* pExtDeviceId) { - *pDeviceId = (deviceId << 16) | vendorId; - *pSubSystemId = subSysId; - *pRevisionId = revisionId; - *pExtDeviceId = deviceId; + *pDeviceId = (device_id << 16) | vendor_id; + *pSubSystemId = subsystem_id; + *pRevisionId = revision_id; + *pExtDeviceId = device_id; return OK(); } @@ -596,7 +596,7 @@ namespace nvd { } NvAPI_Status __cdecl NvAPI_DRS_CreateSession(NvDRSSessionHandle* session) { - *session = drsSession; + *session = drs_session; return OK(); } @@ -609,7 +609,7 @@ namespace nvd { } NvAPI_Status __cdecl NvAPI_DRS_GetBaseProfile(NvDRSSessionHandle session, NvDRSProfileHandle* profile) { - *profile = drsProfile; + *profile = drs_profile; return OK(); } diff --git a/OptiScaler/nvapi/fakenvapi/fakenvapi.h b/OptiScaler/nvapi/fakenvapi/fakenvapi.h index fd7b2a52..df5d8f88 100644 --- a/OptiScaler/nvapi/fakenvapi/fakenvapi.h +++ b/OptiScaler/nvapi/fakenvapi/fakenvapi.h @@ -16,14 +16,14 @@ namespace nvd { static auto drs = 1U; - static auto drsSession = reinterpret_cast(&drs); - static auto drsProfile = reinterpret_cast(&drs); + static auto drs_session = reinterpret_cast(&drs); + static auto drs_profile = reinterpret_cast(&drs); static LUID luid = {}; - static UINT deviceId = {}; - static UINT vendorId = {}; - static UINT subSysId = {}; - static UINT revisionId = {}; + static UINT device_id = {}; + static UINT vendor_id = {}; + static UINT subsystem_id = {}; + static UINT revision_id = {}; static LowLatency lowlatency_ctx; diff --git a/OptiScaler/nvapi/fakenvapi/log.cpp b/OptiScaler/nvapi/fakenvapi/log.cpp index dfa658e7..5d4aa346 100644 --- a/OptiScaler/nvapi/fakenvapi/log.cpp +++ b/OptiScaler/nvapi/fakenvapi/log.cpp @@ -6,11 +6,11 @@ NvAPI_Status Ok(const char* function_name) { } NvAPI_Status Error(const char* function_name, NvAPI_Status status) { - spdlog::trace("{}: {}", function_name, fromErrorNr(status)); + spdlog::trace("{}: {}", function_name, from_error_nr(status)); return status; } -void prepareLogging(spdlog::level::level_enum level) { +void prepare_logging(spdlog::level::level_enum level) { try { if (level != spdlog::level::off) { auto logger = spdlog::basic_logger_mt("basic_logger", "fakenvapi.log", true); @@ -27,7 +27,7 @@ void prepareLogging(spdlog::level::level_enum level) { } } -void closeLogging() { +void close_logging() { spdlog::default_logger()->flush(); spdlog::shutdown(); } \ No newline at end of file diff --git a/OptiScaler/nvapi/fakenvapi/log.h b/OptiScaler/nvapi/fakenvapi/log.h index f17fc21f..83cbc5e5 100755 --- a/OptiScaler/nvapi/fakenvapi/log.h +++ b/OptiScaler/nvapi/fakenvapi/log.h @@ -11,5 +11,5 @@ NvAPI_Status Ok(const char* function_name); NvAPI_Status Error(const char* function_name, NvAPI_Status status = NVAPI_ERROR); -void prepareLogging(spdlog::level::level_enum level); -void closeLogging(); +void prepare_logging(spdlog::level::level_enum level); +void close_logging(); diff --git a/OptiScaler/nvapi/fakenvapi/lowlatency.h b/OptiScaler/nvapi/fakenvapi/lowlatency.h index ef475c2c..61719bf9 100644 --- a/OptiScaler/nvapi/fakenvapi/lowlatency.h +++ b/OptiScaler/nvapi/fakenvapi/lowlatency.h @@ -71,18 +71,18 @@ class LowLatency { // https://learn.microsoft.com/en-us/windows/win32/sync/using-waitable-timer-objects static inline int timer_sleep(int64_t hundred_ns){ - static HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL); - LARGE_INTEGER liDueTime; + static HANDLE timer = CreateWaitableTimer(NULL, TRUE, NULL); + LARGE_INTEGER due_time; - liDueTime.QuadPart = -hundred_ns; + due_time.QuadPart = -hundred_ns; - if(!hTimer) + if(!timer) return 1; - if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0)) + if (!SetWaitableTimer(timer, &due_time, 0, NULL, NULL, 0)) return 2; - if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0) + if (WaitForSingleObject(timer, INFINITE) != WAIT_OBJECT_0) return 3; return 0; diff --git a/OptiScaler/nvapi/fakenvapi/main.cpp b/OptiScaler/nvapi/fakenvapi/main.cpp index 2e654bb8..353baf01 100755 --- a/OptiScaler/nvapi/fakenvapi/main.cpp +++ b/OptiScaler/nvapi/fakenvapi/main.cpp @@ -19,15 +19,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { case DLL_PROCESS_ATTACH: if (get_config(L"fakenvapi", L"enable_logs", true)) if (get_config(L"fakenvapi", L"enable_trace_logs", false)) - prepareLogging(spdlog::level::trace); + prepare_logging(spdlog::level::trace); else - prepareLogging(spdlog::level::info); + prepare_logging(spdlog::level::info); else - prepareLogging(spdlog::level::off); + prepare_logging(spdlog::level::off); spdlog::critical("fakenvapi version: {}", FAKENVAPI_VERSION); break; case DLL_PROCESS_DETACH: - closeLogging(); + close_logging(); break; } return TRUE; diff --git a/OptiScaler/nvapi/fakenvapi/util.cpp b/OptiScaler/nvapi/fakenvapi/util.cpp index 7e2c2786..fa821e17 100644 --- a/OptiScaler/nvapi/fakenvapi/util.cpp +++ b/OptiScaler/nvapi/fakenvapi/util.cpp @@ -6,11 +6,11 @@ void tonvss(NvAPI_ShortString nvss, std::string str) { } static void get_ini_path(wchar_t* path) { - HMODULE hModule = GetModuleHandle(NULL); - GetModuleFileNameW(hModule, path, MAX_PATH); - wchar_t* lastSlash = wcsrchr(path, L'\\'); - if (lastSlash != nullptr) { - *lastSlash = L'\0'; + HMODULE module = GetModuleHandle(NULL); + GetModuleFileNameW(module, path, MAX_PATH); + wchar_t* last_slash = wcsrchr(path, L'\\'); + if (last_slash != nullptr) { + *last_slash = L'\0'; } wcscat(path, L"\\fakenvapi.ini"); } diff --git a/OptiScaler/nvapi/fakenvapi/util.h b/OptiScaler/nvapi/fakenvapi/util.h index 02e8df4d..61ec6911 100755 --- a/OptiScaler/nvapi/fakenvapi/util.h +++ b/OptiScaler/nvapi/fakenvapi/util.h @@ -13,7 +13,7 @@ int get_config(const wchar_t* section, const wchar_t* key, int default_value); return registry.insert({id, (void *)method}).first->second; // function taken from jp7677's dxvk-nvapi project licensed under MIT -inline std::string fromErrorNr(const int16_t errorNr) { +inline std::string from_error_nr(const int16_t error_nr) { static const std::map errors{ {-1, "NVAPI_ERROR"}, {-2, "NVAPI_LIBRARY_NOT_FOUND"}, @@ -156,6 +156,6 @@ inline std::string fromErrorNr(const int16_t errorNr) { {-223, "NVAPI_REQUIRE_FURTHER_HDCP_ACTION"}, {-224, "NVAPI_DISPLAY_MUX_TRANSITION_FAILED"} }; - auto it = errors.find(errorNr); + auto it = errors.find(error_nr); return it != errors.end() ? it->second : "UNKNOWN_ERROR"; } From eda5a12ef6ccab9baf854ec1e825add472a5ca44 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:59:38 +0200 Subject: [PATCH 2/4] Fix mingw --- OptiScaler/nvapi/fakenvapi/fakenvapi.cpp | 28 ++++++++++++------------ OptiScaler/nvapi/fakenvapi/log.h | 3 ++- OptiScaler/nvapi/fakenvapi/util.h | 1 + 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp b/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp index 3d31376b..4e7fd428 100644 --- a/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp +++ b/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp @@ -60,7 +60,7 @@ namespace nvd { if (displayId == 0) { return OK(); } - return ERROR(NVAPI_END_ENUMERATION); + return ERROR_VALUE(NVAPI_END_ENUMERATION); } NvAPI_Status __cdecl NvAPI_GetLogicalGPUFromPhysicalGPU(NvPhysicalGpuHandle physicalHandle, NvLogicalGpuHandle* logicalHandle) { @@ -152,13 +152,13 @@ namespace nvd { NvAPI_Status __cdecl NvAPI_GPU_GetAllClockFrequencies(NvPhysicalGpuHandle hPhysicalGPU, NV_GPU_CLOCK_FREQUENCIES* pClkFreqs) { if (pClkFreqs == nullptr) - return ERROR(NVAPI_INVALID_ARGUMENT); + return ERROR_VALUE(NVAPI_INVALID_ARGUMENT); if (pClkFreqs->version != NV_GPU_CLOCK_FREQUENCIES_VER_1 && pClkFreqs->version != NV_GPU_CLOCK_FREQUENCIES_VER_2 && pClkFreqs->version != NV_GPU_CLOCK_FREQUENCIES_VER_3) - return ERROR(NVAPI_INCOMPATIBLE_STRUCT_VERSION); + return ERROR_VALUE(NVAPI_INCOMPATIBLE_STRUCT_VERSION); if (pClkFreqs->ClockType != static_cast(NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ)) { - return ERROR(NVAPI_NOT_SUPPORTED); + return ERROR_VALUE(NVAPI_NOT_SUPPORTED); } // Reset all clock data for all domains @@ -314,7 +314,7 @@ namespace nvd { } NvAPI_Status __cdecl NvAPI_D3D_SetResourceHint() { - return ERROR(NVAPI_NO_IMPLEMENTATION); + return ERROR_VALUE(NVAPI_NO_IMPLEMENTATION); } NvAPI_Status __cdecl NvAPI_D3D_GetSleepStatus(IUnknown* pDevice, NV_GET_SLEEP_STATUS_PARAMS* pGetSleepStatusParams) { @@ -431,12 +431,12 @@ namespace nvd { NvAPI_Status __cdecl NvAPI_D3D12_GetRaytracingCaps(IUnknown* invalid, NVAPI_D3D12_RAYTRACING_CAPS_TYPE type, void* pData, size_t dataSize) { if (pData == nullptr) - return ERROR(NVAPI_INVALID_POINTER); + return ERROR_VALUE(NVAPI_INVALID_POINTER); switch (type) { case NVAPI_D3D12_RAYTRACING_CAPS_TYPE_THREAD_REORDERING: if (dataSize != sizeof(NVAPI_D3D12_RAYTRACING_THREAD_REORDERING_CAPS)) - return ERROR(NVAPI_INVALID_ARGUMENT); + return ERROR_VALUE(NVAPI_INVALID_ARGUMENT); // let's hope that NvAPI_D3D12_IsNvShaderExtnOpCodeSupported returning false is enough to discourage games from attempting to use Shader Execution Reordering *(NVAPI_D3D12_RAYTRACING_THREAD_REORDERING_CAPS*)pData = NVAPI_D3D12_RAYTRACING_THREAD_REORDERING_CAP_NONE; @@ -444,20 +444,20 @@ namespace nvd { case NVAPI_D3D12_RAYTRACING_CAPS_TYPE_OPACITY_MICROMAP: if (dataSize != sizeof(NVAPI_D3D12_RAYTRACING_OPACITY_MICROMAP_CAPS)) - return ERROR(NVAPI_INVALID_POINTER); + return ERROR_VALUE(NVAPI_INVALID_POINTER); *(NVAPI_D3D12_RAYTRACING_OPACITY_MICROMAP_CAPS*)pData = NVAPI_D3D12_RAYTRACING_OPACITY_MICROMAP_CAP_NONE; break; case NVAPI_D3D12_RAYTRACING_CAPS_TYPE_DISPLACEMENT_MICROMAP: if (dataSize != sizeof(NVAPI_D3D12_RAYTRACING_DISPLACEMENT_MICROMAP_CAPS)) - return ERROR(NVAPI_INVALID_POINTER); + return ERROR_VALUE(NVAPI_INVALID_POINTER); *(NVAPI_D3D12_RAYTRACING_DISPLACEMENT_MICROMAP_CAPS*)pData = NVAPI_D3D12_RAYTRACING_DISPLACEMENT_MICROMAP_CAP_NONE; break; default: - return ERROR(NVAPI_INVALID_POINTER); + return ERROR_VALUE(NVAPI_INVALID_POINTER); } return OK(); @@ -533,7 +533,7 @@ namespace nvd { D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS desc{}; if (!ConvertBuildRaytracingAccelerationStructureInputs(pParams->pDesc, geometryDescs, &desc)) - return ERROR(NVAPI_INVALID_ARGUMENT); + return ERROR_VALUE(NVAPI_INVALID_ARGUMENT); pDevice->GetRaytracingAccelerationStructurePrebuildInfo(&desc, pParams->pInfo); return OK(); @@ -549,7 +549,7 @@ namespace nvd { }; if (!ConvertBuildRaytracingAccelerationStructureInputs(&pParams->pDesc->inputs, geometryDescs, &desc.Inputs)) - return ERROR(NVAPI_INVALID_ARGUMENT); + return ERROR_VALUE(NVAPI_INVALID_ARGUMENT); pCommandList->BuildRaytracingAccelerationStructure(&desc, pParams->numPostbuildInfoDescs, pParams->pPostbuildInfoDescs); static bool logged = false; @@ -662,9 +662,9 @@ namespace nvd { } NvAPI_Status __cdecl Dummy_GetLatency(uint64_t* call_spot, uint64_t* target, uint64_t* latency, uint64_t* frame_time) { - if (!call_spot || !target || !latency || !frame_time) return ERROR(NVAPI_INVALID_POINTER); + if (!call_spot || !target || !latency || !frame_time) return ERROR_VALUE(NVAPI_INVALID_POINTER); - if (lowlatency_ctx.get_mode() != LatencyFlex) return ERROR(NVAPI_DATA_NOT_FOUND); + if (lowlatency_ctx.get_mode() != LatencyFlex) return ERROR_VALUE(NVAPI_DATA_NOT_FOUND); *call_spot = (uint64_t)lowlatency_ctx.call_spot; *target = lowlatency_ctx.lfx_stats.target; diff --git a/OptiScaler/nvapi/fakenvapi/log.h b/OptiScaler/nvapi/fakenvapi/log.h index 83cbc5e5..1c8de732 100755 --- a/OptiScaler/nvapi/fakenvapi/log.h +++ b/OptiScaler/nvapi/fakenvapi/log.h @@ -7,7 +7,8 @@ #define OK() Ok(__func__) #undef ERROR -#define ERROR(...) Error(__func__, ##__VA_ARGS__) +#define ERROR() Error(__func__) +#define ERROR_VALUE(status) Error(__func__, status) NvAPI_Status Ok(const char* function_name); NvAPI_Status Error(const char* function_name, NvAPI_Status status = NVAPI_ERROR); diff --git a/OptiScaler/nvapi/fakenvapi/util.h b/OptiScaler/nvapi/fakenvapi/util.h index 61ec6911..82474846 100755 --- a/OptiScaler/nvapi/fakenvapi/util.h +++ b/OptiScaler/nvapi/fakenvapi/util.h @@ -2,6 +2,7 @@ #include "../external/nvapi.h" #include #include +#include #define WIN32_LEAN_AND_MEAN #include From 001f4f673cd939e8a8a338dc7781bba6c901d94e Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Wed, 25 Sep 2024 01:08:30 +0200 Subject: [PATCH 3/4] Use memcpy on pstates --- OptiScaler/nvapi/fakenvapi/fakenvapi.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp b/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp index 4e7fd428..47a4d5fb 100644 --- a/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp +++ b/OptiScaler/nvapi/fakenvapi/fakenvapi.cpp @@ -218,25 +218,8 @@ namespace nvd { pPstatesInfo->pstates[0].baseVoltages[0].voltDelta_uV.valueRange.max = 0; // Fill mock data for P-state 1 + memcpy(&pPstatesInfo->pstates[1], &pPstatesInfo->pstates[0], sizeof(pPstatesInfo->pstates[0])); pPstatesInfo->pstates[1].pstateId = NVAPI_GPU_PERF_PSTATE_P1; - pPstatesInfo->pstates[1].bIsEditable = false; - pPstatesInfo->pstates[1].clocks[0].domainId = NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS; - pPstatesInfo->pstates[1].clocks[0].freqDelta_kHz.value = 1000; // 1 MHz - pPstatesInfo->pstates[1].clocks[0].freqDelta_kHz.valueRange.min = 800; - pPstatesInfo->pstates[1].clocks[0].freqDelta_kHz.valueRange.max = 1200; - pPstatesInfo->pstates[1].clocks[1].domainId = NVAPI_GPU_PUBLIC_CLOCK_MEMORY; - pPstatesInfo->pstates[1].clocks[1].freqDelta_kHz.value = 1000; // 1 MHz - pPstatesInfo->pstates[1].clocks[1].freqDelta_kHz.valueRange.min = 800; - pPstatesInfo->pstates[1].clocks[1].freqDelta_kHz.valueRange.max = 1200; - pPstatesInfo->pstates[1].clocks[2].domainId = NVAPI_GPU_PUBLIC_CLOCK_VIDEO; - pPstatesInfo->pstates[1].clocks[2].freqDelta_kHz.value = 1000; // 1 MHz - pPstatesInfo->pstates[1].clocks[2].freqDelta_kHz.valueRange.min = 800; - pPstatesInfo->pstates[1].clocks[2].freqDelta_kHz.valueRange.max = 1200; - pPstatesInfo->pstates[1].baseVoltages[0].volt_uV = 1000000; // 1V - pPstatesInfo->pstates[1].baseVoltages[0].bIsEditable = false; - pPstatesInfo->pstates[1].baseVoltages[0].voltDelta_uV.value = 1000; - pPstatesInfo->pstates[1].baseVoltages[0].voltDelta_uV.valueRange.min = 0; - pPstatesInfo->pstates[1].baseVoltages[0].voltDelta_uV.valueRange.max = 0; return OK(); } From 1dcdc399d4c7a238d6f22873ffb4ef3e0c50232e Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Wed, 25 Sep 2024 20:35:46 +0200 Subject: [PATCH 4/4] Deinitialize low latency --- OptiScaler/nvapi/fakenvapi/lowlatency.h | 10 ++++++++++ OptiScaler/nvapi/fakenvapi/main.cpp | 1 + 2 files changed, 11 insertions(+) diff --git a/OptiScaler/nvapi/fakenvapi/lowlatency.h b/OptiScaler/nvapi/fakenvapi/lowlatency.h index 61719bf9..f91775d9 100644 --- a/OptiScaler/nvapi/fakenvapi/lowlatency.h +++ b/OptiScaler/nvapi/fakenvapi/lowlatency.h @@ -154,6 +154,16 @@ public: spdlog::info("LatencyFleX initialized"); } + void deinit() { +#if _MSC_VER && _WIN64 + if (context_dx12.m_pAntiLagAPI) + AMD::AntiLag2DX12::DeInitialize(&context_dx12); + if (context_dx11.m_pAntiLagAPI) + AMD::AntiLag2DX11::DeInitialize(&context_dx11); +#endif + free(lf); + } + inline HRESULT update() { if (force_reflex == ForceDisable || (force_reflex == InGame && !active)) return S_FALSE; diff --git a/OptiScaler/nvapi/fakenvapi/main.cpp b/OptiScaler/nvapi/fakenvapi/main.cpp index 353baf01..241cf507 100755 --- a/OptiScaler/nvapi/fakenvapi/main.cpp +++ b/OptiScaler/nvapi/fakenvapi/main.cpp @@ -28,6 +28,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { break; case DLL_PROCESS_DETACH: close_logging(); + nvd::lowlatency_ctx.deinit(); break; } return TRUE;