Prevented tracking of upscaler heaps

This commit is contained in:
cdozdil
2025-11-03 14:53:14 +03:00
parent 7196cb1728
commit 1f439f522e
5 changed files with 75 additions and 36 deletions
+30 -14
View File
@@ -362,8 +362,12 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Dx12(Fsr212::FfxFsr2Context* co
if (contextDescription == nullptr || contextDescription->device == nullptr)
return Fsr212::FFX_ERROR_INVALID_ARGUMENT;
auto& state = State::Instance();
_skipCreate = true;
state.skipHeapCapture = true;
auto ccResult = o_ffxFsr2ContextCreate_Dx12(context, contextDescription);
state.skipHeapCapture = false;
_skipCreate = false;
if (ccResult != Fsr212::FFX_OK)
@@ -378,9 +382,9 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Dx12(Fsr212::FfxFsr2Context* co
{
auto bDevice = (ID3D12Device*) contextDescription->device;
for (size_t i = 0; i < State::Instance().d3d12Devices.size(); i++)
for (size_t i = 0; i < state.d3d12Devices.size(); i++)
{
if (State::Instance().d3d12Devices[i] == bDevice)
if (state.d3d12Devices[i] == bDevice)
{
_d3d12Device = bDevice;
break;
@@ -390,8 +394,8 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Dx12(Fsr212::FfxFsr2Context* co
// if still no device use latest created one
// Might fixed TLOU but FMF2 still crashes
if (_d3d12Device == nullptr && State::Instance().d3d12Devices.size() > 0)
_d3d12Device = State::Instance().d3d12Devices[State::Instance().d3d12Devices.size() - 1];
if (_d3d12Device == nullptr && state.d3d12Devices.size() > 0)
_d3d12Device = state.d3d12Devices[state.d3d12Devices.size() - 1];
if (_d3d12Device == nullptr)
{
@@ -399,7 +403,7 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Dx12(Fsr212::FfxFsr2Context* co
return ccResult;
}
if (!State::Instance().NvngxDx12Inited)
if (!state.NvngxDx12Inited)
{
NVSDK_NGX_FeatureCommonInfo fcInfo {};
@@ -435,8 +439,8 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Dx12(Fsr212::FfxFsr2Context* co
fcInfo.PathListInfo.Length = (int) pathStorage.size();
auto nvResult = NVSDK_NGX_D3D12_Init_with_ProjectID(
"OptiScaler", State::Instance().NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device,
&fcInfo, State::Instance().NVNGX_Version == 0 ? NVSDK_NGX_Version_API : State::Instance().NVNGX_Version);
"OptiScaler", state.NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device, &fcInfo,
state.NVNGX_Version == 0 ? NVSDK_NGX_Version_API : state.NVNGX_Version);
if (nvResult != NVSDK_NGX_Result_Success)
return Fsr212::FFX_ERROR_BACKEND_API_ERROR;
@@ -470,8 +474,20 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Pattern_Dx12(Fsr212::FfxFsr2Con
if (contextDescription == nullptr || contextDescription->device == nullptr)
return Fsr212::FFX_ERROR_INVALID_ARGUMENT;
auto& state = State::Instance();
bool skip = false;
if (!state.skipHeapCapture)
{
skip = true;
state.skipHeapCapture = true;
}
auto ccResult = o_ffxFsr2ContextCreate_Pattern_Dx12(context, contextDescription);
if (skip)
state.skipHeapCapture = false;
if (_skipCreate)
return ccResult;
@@ -487,9 +503,9 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Pattern_Dx12(Fsr212::FfxFsr2Con
{
auto bDevice = (ID3D12Device*) contextDescription->device;
for (size_t i = 0; i < State::Instance().d3d12Devices.size(); i++)
for (size_t i = 0; i < state.d3d12Devices.size(); i++)
{
if (State::Instance().d3d12Devices[i] == bDevice)
if (state.d3d12Devices[i] == bDevice)
{
_d3d12Device = bDevice;
break;
@@ -499,8 +515,8 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Pattern_Dx12(Fsr212::FfxFsr2Con
// if still no device use latest created one
// Might fixed TLOU but FMF2 still crashes
if (_d3d12Device == nullptr && State::Instance().d3d12Devices.size() > 0)
_d3d12Device = State::Instance().d3d12Devices[State::Instance().d3d12Devices.size() - 1];
if (_d3d12Device == nullptr && state.d3d12Devices.size() > 0)
_d3d12Device = state.d3d12Devices[state.d3d12Devices.size() - 1];
if (_d3d12Device == nullptr)
{
@@ -508,7 +524,7 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Pattern_Dx12(Fsr212::FfxFsr2Con
return ccResult;
}
if (!State::Instance().NvngxDx12Inited)
if (!state.NvngxDx12Inited)
{
NVSDK_NGX_FeatureCommonInfo fcInfo {};
@@ -544,8 +560,8 @@ static Fsr212::FfxErrorCode ffxFsr2ContextCreate_Pattern_Dx12(Fsr212::FfxFsr2Con
fcInfo.PathListInfo.Length = (int) pathStorage.size();
auto nvResult = NVSDK_NGX_D3D12_Init_with_ProjectID(
"OptiScaler", State::Instance().NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device,
&fcInfo, State::Instance().NVNGX_Version == 0 ? NVSDK_NGX_Version_API : State::Instance().NVNGX_Version);
"OptiScaler", state.NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device, &fcInfo,
state.NVNGX_Version == 0 ? NVSDK_NGX_Version_API : state.NVNGX_Version);
if (nvResult != NVSDK_NGX_Result_Success)
return Fsr212::FFX_ERROR_BACKEND_API_ERROR;
+30 -14
View File
@@ -213,8 +213,12 @@ static Fsr3::FfxErrorCode ffxFsr3ContextCreate_Dx12(Fsr3::FfxFsr3UpscalerContext
if (pContext == nullptr || pContextDescription->backendInterface.device == nullptr)
return Fsr3::FFX_ERROR_INVALID_ARGUMENT;
auto& state = State::Instance();
_skipCreate = true;
state.skipHeapCapture = true;
auto ccResult = o_ffxFsr3UpscalerContextCreate_Dx12(pContext, pContextDescription);
state.skipHeapCapture = false;
_skipCreate = false;
if (ccResult != Fsr3::FFX_OK)
@@ -229,9 +233,9 @@ static Fsr3::FfxErrorCode ffxFsr3ContextCreate_Dx12(Fsr3::FfxFsr3UpscalerContext
{
auto bDevice = (ID3D12Device*) pContextDescription->backendInterface.device;
for (size_t i = 0; i < State::Instance().d3d12Devices.size(); i++)
for (size_t i = 0; i < state.d3d12Devices.size(); i++)
{
if (State::Instance().d3d12Devices[i] == bDevice)
if (state.d3d12Devices[i] == bDevice)
{
_d3d12Device = bDevice;
break;
@@ -241,8 +245,8 @@ static Fsr3::FfxErrorCode ffxFsr3ContextCreate_Dx12(Fsr3::FfxFsr3UpscalerContext
// if still no device use latest created one
// Might fixed TLOU but FMF2 still crashes
if (_d3d12Device == nullptr && State::Instance().d3d12Devices.size() > 0)
_d3d12Device = State::Instance().d3d12Devices[State::Instance().d3d12Devices.size() - 1];
if (_d3d12Device == nullptr && state.d3d12Devices.size() > 0)
_d3d12Device = state.d3d12Devices[state.d3d12Devices.size() - 1];
if (_d3d12Device == nullptr)
{
@@ -250,7 +254,7 @@ static Fsr3::FfxErrorCode ffxFsr3ContextCreate_Dx12(Fsr3::FfxFsr3UpscalerContext
return ccResult;
}
if (!State::Instance().NvngxDx12Inited)
if (!state.NvngxDx12Inited)
{
NVSDK_NGX_FeatureCommonInfo fcInfo {};
@@ -286,8 +290,8 @@ static Fsr3::FfxErrorCode ffxFsr3ContextCreate_Dx12(Fsr3::FfxFsr3UpscalerContext
fcInfo.PathListInfo.Length = (int) pathStorage.size();
auto nvResult = NVSDK_NGX_D3D12_Init_with_ProjectID(
"OptiScaler", State::Instance().NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device,
&fcInfo, State::Instance().NVNGX_Version == 0 ? NVSDK_NGX_Version_API : State::Instance().NVNGX_Version);
"OptiScaler", state.NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device, &fcInfo,
state.NVNGX_Version == 0 ? NVSDK_NGX_Version_API : state.NVNGX_Version);
if (nvResult != NVSDK_NGX_Result_Success)
return Fsr3::FFX_ERROR_BACKEND_API_ERROR;
@@ -436,8 +440,20 @@ ffxFsr3ContextCreate_Pattern_Dx12(Fsr3::FfxFsr3UpscalerContext* pContext,
if (pContext == nullptr || pContextDescription->backendInterface.device == nullptr)
return Fsr3::FFX_ERROR_INVALID_ARGUMENT;
auto& state = State::Instance();
bool skip = false;
if (!state.skipHeapCapture)
{
skip = true;
state.skipHeapCapture = true;
}
auto ccResult = o_ffxFsr3UpscalerContextCreate_Pattern_Dx12(pContext, pContextDescription);
if (skip)
state.skipHeapCapture = false;
if (_skipCreate)
return ccResult;
@@ -453,9 +469,9 @@ ffxFsr3ContextCreate_Pattern_Dx12(Fsr3::FfxFsr3UpscalerContext* pContext,
{
auto bDevice = (ID3D12Device*) pContextDescription->backendInterface.device;
for (size_t i = 0; i < State::Instance().d3d12Devices.size(); i++)
for (size_t i = 0; i < state.d3d12Devices.size(); i++)
{
if (State::Instance().d3d12Devices[i] == bDevice)
if (state.d3d12Devices[i] == bDevice)
{
_d3d12Device = bDevice;
break;
@@ -465,8 +481,8 @@ ffxFsr3ContextCreate_Pattern_Dx12(Fsr3::FfxFsr3UpscalerContext* pContext,
// if still no device use latest created one
// Might fixed TLOU but FMF2 still crashes
if (_d3d12Device == nullptr && State::Instance().d3d12Devices.size() > 0)
_d3d12Device = State::Instance().d3d12Devices[State::Instance().d3d12Devices.size() - 1];
if (_d3d12Device == nullptr && state.d3d12Devices.size() > 0)
_d3d12Device = state.d3d12Devices[state.d3d12Devices.size() - 1];
if (_d3d12Device == nullptr)
{
@@ -474,7 +490,7 @@ ffxFsr3ContextCreate_Pattern_Dx12(Fsr3::FfxFsr3UpscalerContext* pContext,
return ccResult;
}
if (!State::Instance().NvngxDx12Inited)
if (!state.NvngxDx12Inited)
{
NVSDK_NGX_FeatureCommonInfo fcInfo {};
@@ -510,8 +526,8 @@ ffxFsr3ContextCreate_Pattern_Dx12(Fsr3::FfxFsr3UpscalerContext* pContext,
fcInfo.PathListInfo.Length = (int) pathStorage.size();
auto nvResult = NVSDK_NGX_D3D12_Init_with_ProjectID(
"OptiScaler", State::Instance().NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device,
&fcInfo, State::Instance().NVNGX_Version == 0 ? NVSDK_NGX_Version_API : State::Instance().NVNGX_Version);
"OptiScaler", state.NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device, &fcInfo,
state.NVNGX_Version == 0 ? NVSDK_NGX_Version_API : state.NVNGX_Version);
if (nvResult != NVSDK_NGX_Result_Success)
return Fsr3::FFX_ERROR_BACKEND_API_ERROR;
+11 -8
View File
@@ -273,15 +273,16 @@ ffxReturnCode_t ffxCreateContext_Dx12(ffxContext* context, ffxCreateContextDescH
LOG_DEBUG("type: {}", FfxGetGetDescTypeName(desc->type));
auto& state = State::Instance();
// Extra checks added for Silent Hill f
// Game is creating FSR-FG swapchain and calling present twice per frame
// So when using OptiFG I am hijacking FSR-FG swapchain
// It would crash the games which uses swapchain for FG
if (IsFGType(desc->type) &&
(State::Instance().activeFgInput == FGInput::FSRFG ||
(Config::Instance()->FGAlwaysCaptureFSRFGSwapchain.value_or_default() &&
State::Instance().activeFgOutput != FGOutput::NoFG && State::Instance().activeFgOutput != FGOutput::Nukems &&
(desc->type == 0x30005 || desc->type == 0x30006))))
if (IsFGType(desc->type) && (state.activeFgInput == FGInput::FSRFG ||
(Config::Instance()->FGAlwaysCaptureFSRFGSwapchain.value_or_default() &&
state.activeFgOutput != FGOutput::NoFG && state.activeFgOutput != FGOutput::Nukems &&
(desc->type == 0x30005 || desc->type == 0x30006))))
{
auto result = ffxCreateContext_Dx12FG(context, desc, memCb);
@@ -314,7 +315,9 @@ ffxReturnCode_t ffxCreateContext_Dx12(ffxContext* context, ffxCreateContextDescH
if (!upscaleContext || Config::Instance()->EnableHotSwapping.value_or_default())
{
state.skipHeapCapture = true;
auto ffxApiResult = FfxApiProxy::D3D12_CreateContext(context, desc, memCb);
state.skipHeapCapture = false;
LOG_ERROR("D3D12_CreateContext result: {:X} ({}), context: {:X}", (UINT) ffxApiResult,
FfxApiProxy::ReturnCodeToString(ffxApiResult), (size_t) *context);
@@ -323,7 +326,7 @@ ffxReturnCode_t ffxCreateContext_Dx12(ffxContext* context, ffxCreateContextDescH
return ffxApiResult;
}
if (!State::Instance().NvngxDx12Inited)
if (!state.NvngxDx12Inited)
{
NVSDK_NGX_FeatureCommonInfo fcInfo {};
@@ -359,8 +362,8 @@ ffxReturnCode_t ffxCreateContext_Dx12(ffxContext* context, ffxCreateContextDescH
fcInfo.PathListInfo.Length = (int) pathStorage.size();
auto nvResult = NVSDK_NGX_D3D12_Init_with_ProjectID(
"OptiScaler", State::Instance().NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device,
&fcInfo, State::Instance().NVNGX_Version == 0 ? NVSDK_NGX_Version_API : State::Instance().NVNGX_Version);
"OptiScaler", state.NVNGX_Engine, VER_PRODUCT_VERSION_STR, dllPath.c_str(), _d3d12Device, &fcInfo,
state.NVNGX_Version == 0 ? NVSDK_NGX_Version_API : state.NVNGX_Version);
if (nvResult != NVSDK_NGX_Result_Success)
return FFX_API_RETURN_ERROR_RUNTIME_ERROR;
@@ -45,8 +45,10 @@ bool DLSSFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* In
ProcessInitParams(InParameters);
_p_dlssHandle = &_dlssHandle;
State::Instance().skipHeapCapture = true;
nvResult = NVNGXProxy::D3D12_CreateFeature()(InCommandList, NVSDK_NGX_Feature_SuperSampling, InParameters,
&_p_dlssHandle);
State::Instance().skipHeapCapture = false;
if (nvResult != NVSDK_NGX_Result_Success)
{
@@ -45,8 +45,10 @@ bool DLSSDFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* I
ProcessInitParams(InParameters);
_p_dlssdHandle = &_dlssdHandle;
State::Instance().skipHeapCapture = true;
nvResult = NVNGXProxy::D3D12_CreateFeature()(InCommandList, NVSDK_NGX_Feature_RayReconstruction,
InParameters, &_p_dlssdHandle);
State::Instance().skipHeapCapture = false;
if (nvResult != NVSDK_NGX_Result_Success)
{