From ebfd554ca627f00f7bb1717d97670546794a9a53 Mon Sep 17 00:00:00 2001 From: cdozdil Date: Thu, 7 Nov 2024 18:01:16 +0300 Subject: [PATCH] expand dx11ue fix for DLSS because of possible RCAS/OS usage --- OptiScaler/backends/dlss/DLSSFeature_Dx11.cpp | 29 +++++++++++++++++++ .../backends/dlssd/DLSSDFeature_Dx11.cpp | 29 +++++++++++++++++++ OptiScaler/resource.h | 2 +- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/OptiScaler/backends/dlss/DLSSFeature_Dx11.cpp b/OptiScaler/backends/dlss/DLSSFeature_Dx11.cpp index d88febfb..8535eb03 100644 --- a/OptiScaler/backends/dlss/DLSSFeature_Dx11.cpp +++ b/OptiScaler/backends/dlss/DLSSFeature_Dx11.cpp @@ -96,8 +96,29 @@ bool DLSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_P if (!OutputScaler->IsInit()) Config::Instance()->OutputScalingEnabled = false; + if (NVNGXProxy::D3D11_EvaluateFeature() != nullptr) { + 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++) + { + InDeviceContext->CSGetShaderResources(i, 1, &restoreSRVs[i]); + InDeviceContext->CSGetSamplers(i, 1, &restoreSamplerStates[i]); + InDeviceContext->CSGetConstantBuffers(i, 1, &restoreCBVs[i]); + InDeviceContext->CSGetUnorderedAccessViews(i, 1, &restoreUAVs[i]); + } + ProcessEvaluateParams(InParameters); ID3D11Resource* paramOutput = nullptr; @@ -214,6 +235,14 @@ bool DLSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_P // set original output texture back InParameters->Set(NVSDK_NGX_Parameter_Output, paramOutput); + + for (size_t i = 0; i < 16; i++) + { + InDeviceContext->CSSetShaderResources(i, 1, &restoreSRVs[i]); + InDeviceContext->CSSetSamplers(i, 1, &restoreSamplerStates[i]); + InDeviceContext->CSSetConstantBuffers(i, 1, &restoreCBVs[i]); + InDeviceContext->CSSetUnorderedAccessViews(i, 1, &restoreUAVs[i], 0); + } } else { diff --git a/OptiScaler/backends/dlssd/DLSSDFeature_Dx11.cpp b/OptiScaler/backends/dlssd/DLSSDFeature_Dx11.cpp index c0bee27d..4d1543c1 100644 --- a/OptiScaler/backends/dlssd/DLSSDFeature_Dx11.cpp +++ b/OptiScaler/backends/dlssd/DLSSDFeature_Dx11.cpp @@ -102,6 +102,26 @@ bool DLSSDFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_ if (NVNGXProxy::D3D11_EvaluateFeature() != nullptr) { + 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 }; + // backup compute shader resources + for (size_t i = 0; i < 16; i++) + { + InDeviceContext->CSGetShaderResources(i, 1, &restoreSRVs[i]); + InDeviceContext->CSGetSamplers(i, 1, &restoreSamplerStates[i]); + InDeviceContext->CSGetConstantBuffers(i, 1, &restoreCBVs[i]); + InDeviceContext->CSGetUnorderedAccessViews(i, 1, &restoreUAVs[i]); + } + ProcessEvaluateParams(InParameters); ID3D11Resource* paramOutput = nullptr; @@ -218,6 +238,15 @@ bool DLSSDFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_ // set original output texture back InParameters->Set(NVSDK_NGX_Parameter_Output, paramOutput); + + // restore compute shader resources + for (size_t i = 0; i < 16; i++) + { + InDeviceContext->CSSetShaderResources(i, 1, &restoreSRVs[i]); + InDeviceContext->CSSetSamplers(i, 1, &restoreSamplerStates[i]); + InDeviceContext->CSSetConstantBuffers(i, 1, &restoreCBVs[i]); + InDeviceContext->CSSetUnorderedAccessViews(i, 1, &restoreUAVs[i], 0); + } } else { diff --git a/OptiScaler/resource.h b/OptiScaler/resource.h index 71f6bb58..4a38b41f 100644 --- a/OptiScaler/resource.h +++ b/OptiScaler/resource.h @@ -21,7 +21,7 @@ #define VER_MAJOR_VERSION 0 #define VER_MINOR_VERSION 7 #define VER_HOTFIX_VERSION 0 -#define VER_BUILD_NUMBER 39 +#define VER_BUILD_NUMBER 43 #define VER_PRE_RELEASE