From f20f944133b0bb92145dda88ba88d73f86f62ff1 Mon Sep 17 00:00:00 2001 From: cdozdil Date: Thu, 7 Nov 2024 17:45:46 +0300 Subject: [PATCH] fix for Dx11 UE engine issues --- OptiScaler/backends/fsr2/FSR2Feature_Dx11.cpp | 36 +++++++++++++++++-- .../backends/fsr31/FSR31Feature_Dx11.cpp | 31 +++++++++++++++- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/OptiScaler/backends/fsr2/FSR2Feature_Dx11.cpp b/OptiScaler/backends/fsr2/FSR2Feature_Dx11.cpp index 07bee480..84e53fba 100644 --- a/OptiScaler/backends/fsr2/FSR2Feature_Dx11.cpp +++ b/OptiScaler/backends/fsr2/FSR2Feature_Dx11.cpp @@ -76,7 +76,8 @@ bool FSR2FeatureDx11::CopyTexture(ID3D11Resource* InResource, D3D11_TEXTURE2D_RE OutTextureRes->usingOriginal = false; ASSIGN_DESC(OutTextureRes->Desc, desc); - desc.BindFlags = bindFlags; + if (bindFlags != 9999) + desc.BindFlags = bindFlags; result = Device->CreateTexture2D(&desc, nullptr, &OutTextureRes->Texture); @@ -287,8 +288,27 @@ bool FSR2FeatureDx11::Evaluate(ID3D11DeviceContext* InContext, NVSDK_NGX_Paramet if (!RCAS->IsInit()) Config::Instance()->RcasEnabled = false; - FfxFsr2DispatchDescription params{}; + ID3D11ShaderResourceView* restoreSRVs[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + ID3D11SamplerState* restoreSamplerStates[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + ID3D11Buffer* restoreCBVs[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + ID3D11UnorderedAccessView* restoreUAVs[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + for (size_t i = 0; i < 16; i++) + { + InContext->CSGetShaderResources(i, 1, &restoreSRVs[i]); + InContext->CSGetSamplers(i, 1, &restoreSamplerStates[i]); + InContext->CSGetConstantBuffers(i, 1, &restoreCBVs[i]); + InContext->CSGetUnorderedAccessViews(i, 1, &restoreUAVs[i]); + } + + FfxFsr2DispatchDescription params{}; params.commandList = InContext; InParameters->Get(NVSDK_NGX_Parameter_Jitter_Offset_X, ¶ms.jitterOffset.x); @@ -306,7 +326,7 @@ bool FSR2FeatureDx11::Evaluate(ID3D11DeviceContext* InContext, NVSDK_NGX_Paramet if (Config::Instance()->OverrideSharpness.value_or(false)) _sharpness = Config::Instance()->Sharpness.value_or(0.3); - else + else _sharpness = GetSharpness(InParameters); if (Config::Instance()->RcasEnabled.value_or(false)) @@ -380,11 +400,13 @@ bool FSR2FeatureDx11::Evaluate(ID3D11DeviceContext* InContext, NVSDK_NGX_Paramet LOG_ERROR("MotionVectors not exist!!"); return false; } + auto outIndex = _frameCount % 2; ID3D11Resource* paramOutput; if (InParameters->Get(NVSDK_NGX_Parameter_Output, ¶mOutput) != NVSDK_NGX_Result_Success) InParameters->Get(NVSDK_NGX_Parameter_Output, (void**)¶mOutput); + if (paramOutput) { LOG_DEBUG("Output exist.."); @@ -608,6 +630,14 @@ bool FSR2FeatureDx11::Evaluate(ID3D11DeviceContext* InContext, NVSDK_NGX_Paramet } } + for (size_t i = 0; i < 16; i++) + { + InContext->CSSetShaderResources(i, 1, &restoreSRVs[i]); + InContext->CSSetSamplers(i, 1, &restoreSamplerStates[i]); + InContext->CSSetConstantBuffers(i, 1, &restoreCBVs[i]); + InContext->CSSetUnorderedAccessViews(i, 1, &restoreUAVs[i], 0); + } + _frameCount++; return true; diff --git a/OptiScaler/backends/fsr31/FSR31Feature_Dx11.cpp b/OptiScaler/backends/fsr31/FSR31Feature_Dx11.cpp index 3003a713..e0a71e98 100644 --- a/OptiScaler/backends/fsr31/FSR31Feature_Dx11.cpp +++ b/OptiScaler/backends/fsr31/FSR31Feature_Dx11.cpp @@ -101,7 +101,8 @@ bool FSR31FeatureDx11::CopyTexture(ID3D11Resource* InResource, D3D11_TEXTURE2D_R OutTextureRes->usingOriginal = false; ASSIGN_DESC(OutTextureRes->Desc, desc); - desc.BindFlags = bindFlags; + if (bindFlags != 9999) + desc.BindFlags = bindFlags; result = Device->CreateTexture2D(&desc, nullptr, &OutTextureRes->Texture); @@ -141,6 +142,26 @@ bool FSR31FeatureDx11::Evaluate(ID3D11DeviceContext* DeviceContext, NVSDK_NGX_Pa if (!OutputScaler->IsInit()) Config::Instance()->OutputScalingEnabled = false; + ID3D11ShaderResourceView* restoreSRVs[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + ID3D11SamplerState* restoreSamplerStates[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + ID3D11Buffer* restoreCBVs[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + ID3D11UnorderedAccessView* restoreUAVs[16] = { nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr, + nullptr, nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr ,nullptr }; + + for (size_t i = 0; i < 16; i++) + { + DeviceContext->CSGetShaderResources(i, 1, &restoreSRVs[i]); + DeviceContext->CSGetSamplers(i, 1, &restoreSamplerStates[i]); + DeviceContext->CSGetConstantBuffers(i, 1, &restoreCBVs[i]); + DeviceContext->CSGetUnorderedAccessViews(i, 1, &restoreUAVs[i]); + } + Fsr31::FfxFsr3DispatchUpscaleDescription params{}; if (Config::Instance()->FsrDebugView.value_or(false)) @@ -491,6 +512,14 @@ bool FSR31FeatureDx11::Evaluate(ID3D11DeviceContext* DeviceContext, NVSDK_NGX_Pa } } + for (size_t i = 0; i < 16; i++) + { + DeviceContext->CSSetShaderResources(i, 1, &restoreSRVs[i]); + DeviceContext->CSSetSamplers(i, 1, &restoreSamplerStates[i]); + DeviceContext->CSSetConstantBuffers(i, 1, &restoreCBVs[i]); + DeviceContext->CSSetUnorderedAccessViews(i, 1, &restoreUAVs[i], 0); + } + _frameCount++; return true;