diff --git a/CyberXeSS/CyberXeSS.vcxproj b/CyberXeSS/CyberXeSS.vcxproj index 78843086..ecff5e33 100644 --- a/CyberXeSS/CyberXeSS.vcxproj +++ b/CyberXeSS/CyberXeSS.vcxproj @@ -82,7 +82,7 @@ $(SolutionDir)external\vulkan\include;$(SolutionDir)external\nvngx_dlss_sdk;$(SolutionDir)external\xess\inc\xess;$(SolutionDir)external\simpleini;$(SolutionDir)external\unordered_dense\include;$(SolutionDir)external\spdlog\include;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) $(SolutionDir)CyberXess\cas\lib;$(SolutionDir)CyberXess\fsr2\lib;$(SolutionDir)CyberXess\fsr2_212\lib;$(SolutionDir)CyberXess\vulkan;$(SolutionDir)external\xess\lib;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath) nvngx - E:\Games\No Man%27s Sky\Binaries + E:\Games\God of War .\x64\Debug diff --git a/CyberXeSS/NVNGX_DLSS_Dx11.cpp b/CyberXeSS/NVNGX_DLSS_Dx11.cpp index e80e4e90..e4271576 100644 --- a/CyberXeSS/NVNGX_DLSS_Dx11.cpp +++ b/CyberXeSS/NVNGX_DLSS_Dx11.cpp @@ -198,11 +198,11 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D11_CreateFeature(ID3D11DeviceContext // Create feature auto handleId = IFeature::GetNextHandleId(); - if (Config::Instance()->Dx11Upscaler.value_or("fsr") == "fsr") + if (Config::Instance()->Dx11Upscaler.value_or("fsr22") == "fsr22") Dx11Contexts[handleId] = std::make_unique(handleId, InParameters); - else if (Config::Instance()->Dx11Upscaler.value_or("fsr") == "fsr22_12") + else if (Config::Instance()->Dx11Upscaler.value_or("fsr22") == "fsr22_12") Dx11Contexts[handleId] = std::make_unique(handleId, InParameters); - else if (Config::Instance()->Dx11Upscaler.value_or("fsr") == "fsr21_12") + else if (Config::Instance()->Dx11Upscaler.value_or("fsr22") == "fsr21_12") Dx11Contexts[handleId] = std::make_unique(handleId, InParameters); else Dx11Contexts[handleId] = std::make_unique(handleId, InParameters); diff --git a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp index 61429b32..28b5c681 100644 --- a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp +++ b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp @@ -357,7 +357,6 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N // fence operation results HRESULT fr; - ID3D11Fence* dx11fence_1 = nullptr; ID3D12Fence* dx12fence_1 = nullptr; HANDLE dx11_sharedHandle; @@ -367,6 +366,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N pQueryDesc.MiscFlags = 0; ID3D11Query* query0 = nullptr; + // 3 is query sync if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1)); @@ -395,6 +395,14 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N } else { + auto result = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&dx12fence_1)); + + if (result != S_OK) + { + spdlog::debug("FeatureContext::FSR2FeatureDx11on12 CreateFence d3d12fence error: {0:x}", result); + return false; + } + result = Device->CreateQuery(&pQueryDesc, &query0); if (result != S_OK || query0 == nullptr) @@ -506,11 +514,30 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N spdlog::warn("FSR2FeatureDx11on12::Evaluate bias mask not exist and its enabled in config, it may cause problems!!"); } - if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0) - Dx11DeviceContext->Flush(); +#pragma endregion - Dx11DeviceContext->Signal(dx11fence_1, 10); - Dx12CommandQueue->Wait(dx12fence_1, 10); + // 3 is query sync + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) + { + if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0) + Dx11DeviceContext->Flush(); + + Dx11DeviceContext->Signal(dx11fence_1, 10); + Dx12CommandQueue->Wait(dx12fence_1, 10); + } + else + { + DeviceContext->End(query0); + DeviceContext->Flush(); + + // Wait for the query to be ready + while (Dx11DeviceContext->GetData(query0, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + + // Release the query + query0->Release(); + } + +#pragma region shared handles if (paramColor) { @@ -644,7 +671,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N float shapness = 0.0f; if (InParameters->Get(NVSDK_NGX_Parameter_Sharpness, &shapness) == NVSDK_NGX_Result_Success) { - params.enableSharpening = !(shapness == 0.0f || shapness == -1.0f); + params.enableSharpening = !(shapness == 0.0f || shapness == -1.0f) && shapness >= -1.0f && shapness <= 1.0f; if (params.enableSharpening) { @@ -686,31 +713,36 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N return false; } - ID3D12Fence* dx12fence_2; - fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2)); - - if (fr != S_OK) - { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx12fence_2 {0:x}", fr); - return false; - } - + ID3D12Fence* dx12fence_2 = nullptr; + ID3D11Fence* dx11fence_2 = nullptr; HANDLE dx12_sharedHandle; - fr = Dx12on11Device->CreateSharedHandle(dx12fence_2, nullptr, GENERIC_ALL, nullptr, &dx12_sharedHandle); - if (fr != S_OK) + // dispatch fences + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx12fence_2 {0:x}", fr); - return false; - } + fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2)); - ID3D11Fence* dx11fence_2; - fr = Dx11Device->OpenSharedFence(dx12_sharedHandle, IID_PPV_ARGS(&dx11fence_2)); + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx12fence_2 {0:x}", fr); + return false; + } - if (fr != S_OK) - { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx11fence_2 {0:x}", fr); - return false; + fr = Dx12on11Device->CreateSharedHandle(dx12fence_2, nullptr, GENERIC_ALL, nullptr, &dx12_sharedHandle); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx12fence_2 {0:x}", fr); + return false; + } + + fr = Dx11Device->OpenSharedFence(dx12_sharedHandle, IID_PPV_ARGS(&dx11fence_2)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx11fence_2 {0:x}", fr); + return false; + } } // Execute dx12 commands to process fsr @@ -719,51 +751,99 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists); // fsr done - Dx12CommandQueue->Signal(dx12fence_2, 20); - - // wait for fsr on dx12 - Dx11DeviceContext->Wait(dx11fence_2, 20); - - // copy back output - if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1) + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - // intel arc fix - D3D11_QUERY_DESC pQueryDesc{}; - pQueryDesc.Query = D3D11_QUERY_EVENT; - pQueryDesc.MiscFlags = 0; - ID3D11Query* query1 = nullptr; - result = Dx11Device->CreateQuery(&pQueryDesc, &query1); + Dx12CommandQueue->Signal(dx12fence_2, 20); - if (result != S_OK || !query1) + // wait for fsr on dx12 + Dx11DeviceContext->Wait(dx11fence_2, 20); + + // copy back output + if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1) { - spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query1!"); + ID3D11Query* query1 = nullptr; + result = Dx11Device->CreateQuery(&pQueryDesc, &query1); + + if (result != S_OK || !query1) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query1!"); + return false; + } + + Dx11DeviceContext->Begin(query1); + + // copy back output + Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + + Dx11DeviceContext->End(query1); + + // Execute dx11 commands + Dx11DeviceContext->Flush(); + + // wait for completion + while (Dx11DeviceContext->GetData(query1, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + + // Release the query + query1->Release(); + } + else + Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + } + else + { + Dx12CommandQueue->Signal(dx12fence_1, 20); + + // wait for end of operation + if (dx12fence_1->GetCompletedValue() < 20) + { + auto fenceEvent12 = CreateEvent(nullptr, FALSE, FALSE, nullptr); + + if (fenceEvent12) + { + dx12fence_1->SetEventOnCompletion(20, fenceEvent12); + WaitForSingleObject(fenceEvent12, INFINITE); + CloseHandle(fenceEvent12); + } + } + + ID3D11Query* query2 = nullptr; + result = Dx11Device->CreateQuery(&pQueryDesc, &query2); + + if (result != S_OK || query2 == nullptr) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query2!"); return false; } - Dx11DeviceContext->Begin(query1); - - // copy back output - Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); - - Dx11DeviceContext->End(query1); + // Associate the query with the copy operation + DeviceContext->Begin(query2); + //copy output back + DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + // Execute dx11 commands - //Dx11DeviceContext->Flush(); + DeviceContext->End(query2); + Dx11DeviceContext->Flush(); - // wait for completion - while (Dx11DeviceContext->GetData(query1, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + // Wait for the query to be ready + while (Dx11DeviceContext->GetData(query2, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); // Release the query - query1->Release(); + query2->Release(); } - else - Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); // release fences - dx11fence_1->Release(); - dx11fence_2->Release(); - dx12fence_1->Release(); - dx12fence_2->Release(); + if (dx11fence_1) + dx11fence_1->Release(); + + if (dx11fence_2) + dx11fence_2->Release(); + + if (dx12fence_1) + dx12fence_1->Release(); + + if (dx12fence_2) + dx12fence_2->Release(); Dx12CommandAllocator->Reset(); Dx12CommandList->Reset(Dx12CommandAllocator, nullptr); @@ -862,7 +942,7 @@ bool FSR2FeatureDx11on12::InitFSR2(const NVSDK_NGX_Parameter* InParameters) Config::Instance()->AutoExposure = true; _contextDesc.flags |= FFX_FSR2_ENABLE_AUTO_EXPOSURE; spdlog::info("FSR2Feature::InitFSR2 contextDesc.initFlags (AutoExposure) {0:b}", _contextDesc.flags); - } +} else { Config::Instance()->AutoExposure = false; diff --git a/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp b/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp index 18353746..10fe5164 100644 --- a/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp +++ b/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp @@ -357,33 +357,64 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con // fence operation results HRESULT fr; - - ID3D11Fence* dx11fence_1; - fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1)); - - if (fr != S_OK) - { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx11fence_1 {0:x}", fr); - return false; - } - + ID3D11Fence* dx11fence_1 = nullptr; + ID3D12Fence* dx12fence_1 = nullptr; HANDLE dx11_sharedHandle; - fr = dx11fence_1->CreateSharedHandle(nullptr, GENERIC_ALL, nullptr, &dx11_sharedHandle); - if (fr != S_OK) + D3D11_QUERY_DESC pQueryDesc; + pQueryDesc.Query = D3D11_QUERY_EVENT; + pQueryDesc.MiscFlags = 0; + ID3D11Query* query0 = nullptr; + + // 3 is query sync + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx11fence_1 {0:x}", fr); - return false; + fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx11fence_1 {0:x}", fr); + return false; + } + + fr = dx11fence_1->CreateSharedHandle(nullptr, GENERIC_ALL, nullptr, &dx11_sharedHandle); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx11fence_1 {0:x}", fr); + return false; + } + + fr = Dx12on11Device->OpenSharedHandle(dx11_sharedHandle, IID_PPV_ARGS(&dx12fence_1)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx12fence_1 {0:x}", fr); + return false; + } + } + else + { + auto result = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&dx12fence_1)); + + if (result != S_OK) + { + spdlog::debug("FeatureContext::FSR2FeatureDx11on12 CreateFence d3d12fence error: {0:x}", result); + return false; + } + + result = Device->CreateQuery(&pQueryDesc, &query0); + + if (result != S_OK || query0 == nullptr) + { + spdlog::error("FeatureContext::FSR2FeatureDx11on12 can't create query1!"); + return false; + } + + // Associate the query with the copy operation + DeviceContext->Begin(query0); } - ID3D12Fence* dx12fence_1; - fr = Dx12on11Device->OpenSharedHandle(dx11_sharedHandle, IID_PPV_ARGS(&dx12fence_1)); - - if (fr != S_OK) - { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx12fence_1 {0:x}", fr); - return false; - } #pragma region Texture copies @@ -483,12 +514,30 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con else spdlog::warn("FSR2FeatureDx11on12::Evaluate bias mask not exist and its enabled in config, it may cause problems!!"); } +#pragma endregion - if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0) - Dx11DeviceContext->Flush(); + // 3 is query sync + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) + { + if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0) + Dx11DeviceContext->Flush(); - Dx11DeviceContext->Signal(dx11fence_1, 10); - Dx12CommandQueue->Wait(dx12fence_1, 10); + Dx11DeviceContext->Signal(dx11fence_1, 10); + Dx12CommandQueue->Wait(dx12fence_1, 10); + } + else + { + DeviceContext->End(query0); + DeviceContext->Flush(); + + // Wait for the query to be ready + while (Dx11DeviceContext->GetData(query0, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + + // Release the query + query0->Release(); + } + +#pragma region shared handles if (paramColor) { @@ -664,31 +713,36 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con return false; } - ID3D12Fence* dx12fence_2; - fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2)); - - if (fr != S_OK) - { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx12fence_2 {0:x}", fr); - return false; - } - + ID3D12Fence* dx12fence_2 = nullptr; + ID3D11Fence* dx11fence_2 = nullptr; HANDLE dx12_sharedHandle; - fr = Dx12on11Device->CreateSharedHandle(dx12fence_2, nullptr, GENERIC_ALL, nullptr, &dx12_sharedHandle); - if (fr != S_OK) + // dispatch fences + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx12fence_2 {0:x}", fr); - return false; - } + fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2)); - ID3D11Fence* dx11fence_2; - fr = Dx11Device->OpenSharedFence(dx12_sharedHandle, IID_PPV_ARGS(&dx11fence_2)); + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx12fence_2 {0:x}", fr); + return false; + } - if (fr != S_OK) - { - spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx11fence_2 {0:x}", fr); - return false; + fr = Dx12on11Device->CreateSharedHandle(dx12fence_2, nullptr, GENERIC_ALL, nullptr, &dx12_sharedHandle); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx12fence_2 {0:x}", fr); + return false; + } + + fr = Dx11Device->OpenSharedFence(dx12_sharedHandle, IID_PPV_ARGS(&dx11fence_2)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx11fence_2 {0:x}", fr); + return false; + } } // Execute dx12 commands to process fsr @@ -697,51 +751,99 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists); // fsr done - Dx12CommandQueue->Signal(dx12fence_2, 20); - - // wait for fsr on dx12 - Dx11DeviceContext->Wait(dx11fence_2, 20); - - // copy back output - if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1) + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - // intel arc fix - D3D11_QUERY_DESC pQueryDesc{}; - pQueryDesc.Query = D3D11_QUERY_EVENT; - pQueryDesc.MiscFlags = 0; - ID3D11Query* query1 = nullptr; - result = Dx11Device->CreateQuery(&pQueryDesc, &query1); + Dx12CommandQueue->Signal(dx12fence_2, 20); - if (result != S_OK || !query1) + // wait for fsr on dx12 + Dx11DeviceContext->Wait(dx11fence_2, 20); + + // copy back output + if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1) { - spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query1!"); + ID3D11Query* query1 = nullptr; + result = Dx11Device->CreateQuery(&pQueryDesc, &query1); + + if (result != S_OK || !query1) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query1!"); + return false; + } + + Dx11DeviceContext->Begin(query1); + + // copy back output + Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + + Dx11DeviceContext->End(query1); + + // Execute dx11 commands + Dx11DeviceContext->Flush(); + + // wait for completion + while (Dx11DeviceContext->GetData(query1, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + + // Release the query + query1->Release(); + } + else + Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + } + else + { + Dx12CommandQueue->Signal(dx12fence_1, 20); + + // wait for end of operation + if (dx12fence_1->GetCompletedValue() < 20) + { + auto fenceEvent12 = CreateEvent(nullptr, FALSE, FALSE, nullptr); + + if (fenceEvent12) + { + dx12fence_1->SetEventOnCompletion(20, fenceEvent12); + WaitForSingleObject(fenceEvent12, INFINITE); + CloseHandle(fenceEvent12); + } + } + + ID3D11Query* query2 = nullptr; + result = Dx11Device->CreateQuery(&pQueryDesc, &query2); + + if (result != S_OK || query2 == nullptr) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query2!"); return false; } - Dx11DeviceContext->Begin(query1); + // Associate the query with the copy operation + DeviceContext->Begin(query2); - // copy back output - Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); - - Dx11DeviceContext->End(query1); + //copy output back + DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); // Execute dx11 commands - //Dx11DeviceContext->Flush(); + DeviceContext->End(query2); + Dx11DeviceContext->Flush(); - // wait for completion - while (Dx11DeviceContext->GetData(query1, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + // Wait for the query to be ready + while (Dx11DeviceContext->GetData(query2, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); // Release the query - query1->Release(); + query2->Release(); } - else - Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); // release fences - dx11fence_1->Release(); - dx11fence_2->Release(); - dx12fence_1->Release(); - dx12fence_2->Release(); + if (dx11fence_1) + dx11fence_1->Release(); + + if (dx11fence_2) + dx11fence_2->Release(); + + if (dx12fence_1) + dx12fence_1->Release(); + + if (dx12fence_2) + dx12fence_2->Release(); Dx12CommandAllocator->Reset(); Dx12CommandList->Reset(Dx12CommandAllocator, nullptr); diff --git a/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp b/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp index f38a19d2..4909b1a8 100644 --- a/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp +++ b/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp @@ -340,17 +340,6 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK Dx11DeviceContext = dc; } - - // Fence for syncing - ID3D12Fence* d3d12Fence; - result = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d12Fence)); - - if (result != S_OK) - { - spdlog::error("XeSSFeatureDx11::Evaluate CreateFence d3d12fence error: {0:x}", result); - return false; - } - // creatimg params for XeSS xess_result_t xessResult; xess_d3d12_execute_params_t params{}; @@ -367,34 +356,66 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK spdlog::debug("XeSSFeatureDx11::Evaluate Input Resolution: {0}x{1}", params.inputWidth, params.inputHeight); + // fence operation results HRESULT fr; - - ID3D11Fence* dx11fence_1; - fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1)); - - if (fr != S_OK) - { - spdlog::error("XeSSFeatureDx11::Evaluate Can't create dx11fence_1 {0:x}", fr); - return false; - } - + ID3D11Fence* dx11fence_1 = nullptr; + ID3D12Fence* dx12fence_1 = nullptr; HANDLE dx11_sharedHandle; - fr = dx11fence_1->CreateSharedHandle(nullptr, GENERIC_ALL, nullptr, &dx11_sharedHandle); - if (fr != S_OK) + D3D11_QUERY_DESC pQueryDesc; + pQueryDesc.Query = D3D11_QUERY_EVENT; + pQueryDesc.MiscFlags = 0; + ID3D11Query* query0 = nullptr; + + // 3 is query sync + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - spdlog::error("XeSSFeatureDx11::Evaluate Can't create sharedhandle for dx11fence_1 {0:x}", fr); - return false; + fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx11fence_1 {0:x}", fr); + return false; + } + + fr = dx11fence_1->CreateSharedHandle(nullptr, GENERIC_ALL, nullptr, &dx11_sharedHandle); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx11fence_1 {0:x}", fr); + return false; + } + + fr = Dx12on11Device->OpenSharedHandle(dx11_sharedHandle, IID_PPV_ARGS(&dx12fence_1)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx12fence_1 {0:x}", fr); + return false; + } + } + else + { + auto result = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&dx12fence_1)); + + if (result != S_OK) + { + spdlog::debug("FeatureContext::FSR2FeatureDx11on12 CreateFence d3d12fence error: {0:x}", result); + return false; + } + + result = Device->CreateQuery(&pQueryDesc, &query0); + + if (result != S_OK || query0 == nullptr) + { + spdlog::error("FeatureContext::FSR2FeatureDx11on12 can't create query1!"); + return false; + } + + // Associate the query with the copy operation + DeviceContext->Begin(query0); } - ID3D12Fence* dx12fence_1; - fr = Dx12on11Device->OpenSharedHandle(dx11_sharedHandle, IID_PPV_ARGS(&dx12fence_1)); - - if (fr != S_OK) - { - spdlog::error("XeSSFeatureDx11::Evaluate Can't create open sharedhandle for dx12fence_1 {0:x}", fr); - return false; - } #pragma region Texture copies @@ -494,11 +515,30 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK spdlog::warn("XeSSFeatureDx11::Evaluate bias mask not exist and its enabled in config, it may cause problems!!"); } - if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0) - Dx11DeviceContext->Flush(); +#pragma endregion - Dx11DeviceContext->Signal(dx11fence_1, 10); - Dx12CommandQueue->Wait(dx12fence_1, 10); + // 3 is query sync + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) + { + if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0) + Dx11DeviceContext->Flush(); + + Dx11DeviceContext->Signal(dx11fence_1, 10); + Dx12CommandQueue->Wait(dx12fence_1, 10); + } + else + { + DeviceContext->End(query0); + DeviceContext->Flush(); + + // Wait for the query to be ready + while (Dx11DeviceContext->GetData(query0, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + + // Release the query + query0->Release(); + } + +#pragma region shared handles if (paramColor) { @@ -652,31 +692,36 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK if (casActive && casSharpness > 0.0f && !CasDispatch(Dx12CommandList, InParameters, casBuffer, dx11Out.Dx12Resource)) return false; - ID3D12Fence* dx12fence_2; - fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2)); - - if (fr != S_OK) - { - spdlog::error("XeSSFeatureDx11::Evaluate Can't create dx12fence_2 {0:x}", fr); - return false; - } - + ID3D12Fence* dx12fence_2 = nullptr; + ID3D11Fence* dx11fence_2 = nullptr; HANDLE dx12_sharedHandle; - fr = Dx12on11Device->CreateSharedHandle(dx12fence_2, nullptr, GENERIC_ALL, nullptr, &dx12_sharedHandle); - if (fr != S_OK) + // dispatch fences + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - spdlog::error("XeSSFeatureDx11::Evaluate Can't create sharedhandle for dx12fence_2 {0:x}", fr); - return false; - } + fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2)); - ID3D11Fence* dx11fence_2; - fr = Dx11Device->OpenSharedFence(dx12_sharedHandle, IID_PPV_ARGS(&dx11fence_2)); + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create dx12fence_2 {0:x}", fr); + return false; + } - if (fr != S_OK) - { - spdlog::error("XeSSFeatureDx11::Evaluate Can't create open sharedhandle for dx11fence_2 {0:x}", fr); - return false; + fr = Dx12on11Device->CreateSharedHandle(dx12fence_2, nullptr, GENERIC_ALL, nullptr, &dx12_sharedHandle); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create sharedhandle for dx12fence_2 {0:x}", fr); + return false; + } + + fr = Dx11Device->OpenSharedFence(dx12_sharedHandle, IID_PPV_ARGS(&dx11fence_2)); + + if (fr != S_OK) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate Can't create open sharedhandle for dx11fence_2 {0:x}", fr); + return false; + } } // Execute dx12 commands to process xess @@ -685,51 +730,99 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists); // xess done - Dx12CommandQueue->Signal(dx12fence_2, 20); - - // wait for xess on dx12 - Dx11DeviceContext->Wait(dx11fence_2, 20); - - - // copy back output - if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1) + if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3) { - D3D11_QUERY_DESC pQueryDesc{}; - pQueryDesc.Query = D3D11_QUERY_EVENT; - pQueryDesc.MiscFlags = 0; - ID3D11Query* query1 = nullptr; - result = Dx11Device->CreateQuery(&pQueryDesc, &query1); + Dx12CommandQueue->Signal(dx12fence_2, 20); - if (result != S_OK || !query1) + // wait for fsr on dx12 + Dx11DeviceContext->Wait(dx11fence_2, 20); + + // copy back output + if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1) { - spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query1!"); + ID3D11Query* query1 = nullptr; + result = Dx11Device->CreateQuery(&pQueryDesc, &query1); + + if (result != S_OK || !query1) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query1!"); + return false; + } + + Dx11DeviceContext->Begin(query1); + + // copy back output + Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + + Dx11DeviceContext->End(query1); + + // Execute dx11 commands + Dx11DeviceContext->Flush(); + + // wait for completion + while (Dx11DeviceContext->GetData(query1, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + + // Release the query + query1->Release(); + } + else + Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); + } + else + { + Dx12CommandQueue->Signal(dx12fence_1, 20); + + // wait for end of operation + if (dx12fence_1->GetCompletedValue() < 20) + { + auto fenceEvent12 = CreateEvent(nullptr, FALSE, FALSE, nullptr); + + if (fenceEvent12) + { + dx12fence_1->SetEventOnCompletion(20, fenceEvent12); + WaitForSingleObject(fenceEvent12, INFINITE); + CloseHandle(fenceEvent12); + } + } + + ID3D11Query* query2 = nullptr; + result = Dx11Device->CreateQuery(&pQueryDesc, &query2); + + if (result != S_OK || query2 == nullptr) + { + spdlog::error("FSR2FeatureDx11on12::Evaluate can't create query2!"); return false; } - Dx11DeviceContext->Begin(query1); + // Associate the query with the copy operation + DeviceContext->Begin(query2); - // copy back output - Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); - - Dx11DeviceContext->End(query1); + //copy output back + DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); // Execute dx11 commands + DeviceContext->End(query2); Dx11DeviceContext->Flush(); - // wait for completion - while (Dx11DeviceContext->GetData(query1, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); + // Wait for the query to be ready + while (Dx11DeviceContext->GetData(query2, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE); // Release the query - query1->Release(); + query2->Release(); } - else - Dx11DeviceContext->CopyResource(paramOutput, dx11Out.SharedTexture); // release fences - dx11fence_1->Release(); - dx11fence_2->Release(); - dx12fence_1->Release(); - dx12fence_2->Release(); + if (dx11fence_1) + dx11fence_1->Release(); + + if (dx11fence_2) + dx11fence_2->Release(); + + if (dx12fence_1) + dx12fence_1->Release(); + + if (dx12fence_2) + dx12fence_2->Release(); Dx12CommandAllocator->Reset(); Dx12CommandList->Reset(Dx12CommandAllocator, nullptr); diff --git a/nvngx.ini b/nvngx.ini index c2a37f3c..2e33209e 100644 --- a/nvngx.ini +++ b/nvngx.ini @@ -1,6 +1,6 @@ [Upscalers] ; Select upscaler for Dx11 games -; xess, fsr (native dx11), fsr21_12 (dx11 with dx12) or fsr22_12 (dx11 with dx12) - Default (auto) is fsr +; xess, fsr22 (native dx11), fsr21_12 (dx11 with dx12) or fsr22_12 (dx11 with dx12) - Default (auto) is fsr Dx11Upscaler=auto ; Select upscaler for Dx12 games