From f6f75ddf0118ac45f447e2babbe18dbda3451edd Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:05:18 +0200 Subject: [PATCH] Prevent NvngxFFX errors from causing a memory leak --- OptiScaler/framegen/nvngx/Nvngx_FFX.cpp | 11 ++++++++++- OptiScaler/framegen/nvngx/Nvngx_FFX.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/OptiScaler/framegen/nvngx/Nvngx_FFX.cpp b/OptiScaler/framegen/nvngx/Nvngx_FFX.cpp index a7ff2ac8..b54d583e 100644 --- a/OptiScaler/framegen/nvngx/Nvngx_FFX.cpp +++ b/OptiScaler/framegen/nvngx/Nvngx_FFX.cpp @@ -381,6 +381,11 @@ NVSDK_NGX_Result Nvngx_FFX::D3D12_EvaluateFeature(ID3D12GraphicsCommandList* InC const bool outputMismatch = outputFfx.description.width != InOurHandle->swapchainWidth || outputFfx.description.height != InOurHandle->swapchainHeight; + if (State::Instance().fgChanged || outputMismatch) + InOurHandle->createFailed = false; + else if (InOurHandle->createFailed) + return NVSDK_NGX_Result_Fail; + if ((State::Instance().fgChanged || outputMismatch) && InOurHandle->fgContext && InOurHandle->fgContext->ctx) { if (outputMismatch) @@ -496,7 +501,11 @@ NVSDK_NGX_Result Nvngx_FFX::D3D12_EvaluateFeature(ID3D12GraphicsCommandList* InC if (retCode != FFX_API_RETURN_OK) { - LOG_ERROR("Failed to create FFX context"); + LOG_ERROR("Failed to create FFX context: {:X}", retCode); + + // Only retry on change, failed create context seems to leak memory + InOurHandle->createFailed = true; + return NVSDK_NGX_Result_Fail; } } diff --git a/OptiScaler/framegen/nvngx/Nvngx_FFX.h b/OptiScaler/framegen/nvngx/Nvngx_FFX.h index d5f9576c..f5978c08 100644 --- a/OptiScaler/framegen/nvngx/Nvngx_FFX.h +++ b/OptiScaler/framegen/nvngx/Nvngx_FFX.h @@ -29,6 +29,7 @@ struct Nvngx_FFX_Handle uint32_t swapchainWidth = 0; uint32_t swapchainHeight = 0; uint64_t lastFrameId = 0; + bool createFailed = false; // for HDR bool hdrRangeSet = false;