diff --git a/OptiScaler/inputs/FSR2_Dx12.cpp b/OptiScaler/inputs/FSR2_Dx12.cpp index 465ce1d8..7ea5b78c 100644 --- a/OptiScaler/inputs/FSR2_Dx12.cpp +++ b/OptiScaler/inputs/FSR2_Dx12.cpp @@ -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; diff --git a/OptiScaler/inputs/FSR3_Dx12.cpp b/OptiScaler/inputs/FSR3_Dx12.cpp index 78e1370b..c2aec2f5 100644 --- a/OptiScaler/inputs/FSR3_Dx12.cpp +++ b/OptiScaler/inputs/FSR3_Dx12.cpp @@ -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; diff --git a/OptiScaler/inputs/FfxApi_Dx12.cpp b/OptiScaler/inputs/FfxApi_Dx12.cpp index 24a33405..70b06269 100644 --- a/OptiScaler/inputs/FfxApi_Dx12.cpp +++ b/OptiScaler/inputs/FfxApi_Dx12.cpp @@ -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; diff --git a/OptiScaler/upscalers/dlss/DLSSFeature_Dx12.cpp b/OptiScaler/upscalers/dlss/DLSSFeature_Dx12.cpp index ceaf277e..9cb7454a 100644 --- a/OptiScaler/upscalers/dlss/DLSSFeature_Dx12.cpp +++ b/OptiScaler/upscalers/dlss/DLSSFeature_Dx12.cpp @@ -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) { diff --git a/OptiScaler/upscalers/dlssd/DLSSDFeature_Dx12.cpp b/OptiScaler/upscalers/dlssd/DLSSDFeature_Dx12.cpp index ac922680..40c8c602 100644 --- a/OptiScaler/upscalers/dlssd/DLSSDFeature_Dx12.cpp +++ b/OptiScaler/upscalers/dlssd/DLSSDFeature_Dx12.cpp @@ -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) {