diff --git a/CyberXeSS/CyberXeSS.vcxproj b/CyberXeSS/CyberXeSS.vcxproj
index eaf763b5..96500f1b 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;$(IncludePath)
$(SolutionDir)CyberXess\cas\lib;$(SolutionDir)CyberXess\fsr2\lib;$(SolutionDir)CyberXess\fsr2_212\lib;$(SolutionDir)CyberXess\vulkan;$(SolutionDir)external\xess\lib;$(LibraryPath)
nvngx
- D:\code\CyberFSR-XeSS\DLSS_Sample_App\out\build\x64-Debug\ngx_dlss_demo
+ E:\Games\God of War\
.\x64\Debug
diff --git a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.cpp b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.cpp
index ac500c47..69a150e6 100644
--- a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.cpp
+++ b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.cpp
@@ -214,6 +214,10 @@ bool FSR2FeatureDx11::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
return true;
}
+FSR2FeatureDx11::FSR2FeatureDx11(unsigned int InHandleId, const NVSDK_NGX_Parameter* InParameters) : FSR2Feature(InHandleId, InParameters), IFeature_Dx11(InHandleId, InParameters), IFeature(InHandleId, InParameters)
+{
+}
+
bool FSR2FeatureDx11::Evaluate(ID3D11DeviceContext* InContext, const NVSDK_NGX_Parameter* InParameters)
{
spdlog::debug("FSR2FeatureDx11::Evaluate");
@@ -422,26 +426,38 @@ FSR2FeatureDx11::~FSR2FeatureDx11()
{
spdlog::debug("FSR2FeatureDx11::~FSR2FeatureDx11");
- D3D11_QUERY_DESC pQueryDesc{};
- pQueryDesc.Query = D3D11_QUERY_EVENT;
- pQueryDesc.MiscFlags = 0;
- ID3D11Query* query = nullptr;
- auto result = Device->CreateQuery(&pQueryDesc, &query);
-
- if (DeviceContext != nullptr && result != S_OK)
+ if (Device)
{
- DeviceContext->Begin(query);
- DeviceContext->End(query);
- DeviceContext->Flush();
+ D3D11_QUERY_DESC pQueryDesc;
+ pQueryDesc.Query = D3D11_QUERY_EVENT;
+ pQueryDesc.MiscFlags = 0;
- while (DeviceContext->GetData(query, nullptr, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE);
+ ID3D11Query* query = nullptr;
+ auto result = Device->CreateQuery(&pQueryDesc, &query);
- query->Release();
+ if (result == S_OK)
+ {
+ // Associate the query with the copy operation
+ DeviceContext->Begin(query);
+
+ // Execute dx11 commands
+ DeviceContext->End(query);
+ DeviceContext->Flush();
+
+ // Wait for the query to be ready
+ while (DeviceContext->GetData(query, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE)
+ std::this_thread::yield();
+
+ // Release the query
+ query->Release();
+ }
}
ReleaseResources();
if (Imgui)
Imgui.reset();
+
+ DeviceContext->Flush();
}
diff --git a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.h b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.h
index 482828d9..aaf019aa 100644
--- a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.h
+++ b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11.h
@@ -36,9 +36,7 @@ protected:
bool InitFSR2(const NVSDK_NGX_Parameter* InParameters) override;
public:
- FSR2FeatureDx11(unsigned int InHandleId, const NVSDK_NGX_Parameter* InParameters) : FSR2Feature(InHandleId, InParameters), IFeature_Dx11(InHandleId, InParameters), IFeature(InHandleId, InParameters)
- {
- }
+ FSR2FeatureDx11(unsigned int InHandleId, const NVSDK_NGX_Parameter* InParameters);
// Inherited via IFeature_Dx11
diff --git a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp
index 4bacd157..088e678c 100644
--- a/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp
+++ b/CyberXeSS/backends/fsr2/FSR2Feature_Dx11On12.cpp
@@ -6,7 +6,6 @@
#include
-
#define ASSIGN_DESC(dest, src) dest.Width = src.Width; dest.Height = src.Height; dest.Format = src.Format; dest.BindFlags = src.BindFlags;
#define SAFE_RELEASE(p) \
@@ -368,7 +367,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N
ID3D11Query* query0 = nullptr;
// 3 is query sync
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1));
@@ -518,13 +517,16 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N
#pragma endregion
// 3 is query sync
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1)
Dx11DeviceContext->Flush();
- Dx11DeviceContext->Signal(dx11fence_1, 10);
- Dx12CommandQueue->Wait(dx12fence_1, 10);
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ {
+ Dx11DeviceContext->Signal(dx11fence_1, 10);
+ Dx12CommandQueue->Wait(dx12fence_1, 10);
+ }
}
else
{
@@ -721,7 +723,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N
HANDLE dx12_sharedHandle;
// dispatch fences
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2));
@@ -754,15 +756,18 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, const N
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
// fsr done
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
- Dx12CommandQueue->Signal(dx12fence_2, 20);
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ {
+ Dx12CommandQueue->Signal(dx12fence_2, 20);
- // wait for fsr on dx12
- Dx11DeviceContext->Wait(dx11fence_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) > 2)
{
ID3D11Query* query1 = nullptr;
result = Dx11Device->CreateQuery(&pQueryDesc, &query1);
@@ -869,15 +874,50 @@ FSR2FeatureDx11on12::~FSR2FeatureDx11on12()
{
spdlog::debug("FSR2FeatureDx11on12::~FSR2FeatureDx11on12");
+ if (Dx11Device)
+ {
+ D3D11_QUERY_DESC pQueryDesc;
+ pQueryDesc.Query = D3D11_QUERY_EVENT;
+ pQueryDesc.MiscFlags = 0;
+
+ ID3D11Query* query = nullptr;
+ auto result = Dx11Device->CreateQuery(&pQueryDesc, &query);
+
+ if (result == S_OK)
+ {
+ // Associate the query with the copy operation
+ DeviceContext->Begin(query);
+
+ //copy output back
+
+ // Execute dx11 commands
+ DeviceContext->End(query);
+ DeviceContext->Flush();
+
+ // Wait for the query to be ready
+ while (DeviceContext->GetData(query, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE)
+ std::this_thread::yield();
+
+ // Release the query
+ query->Release();
+ }
+ }
+
if (Dx12on11Device && Dx12CommandQueue && Dx12CommandList)
{
+ auto errorCode = ffxFsr2ContextDestroy(&_context);
+
+ if (errorCode != FFX_OK)
+ spdlog::error("FSR2Feature::~FSR2Feature ffxFsr2ContextDestroy error: {0:x}", errorCode);
+
+ free(_contextDesc.callbacks.scratchBuffer);
+
ID3D12Fence* d3d12Fence;
Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d12Fence));
- Dx12CommandQueue->Signal(d3d12Fence, 999);
-
Dx12CommandList->Close();
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
+ Dx12CommandQueue->Signal(d3d12Fence, 999);
auto fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
@@ -901,6 +941,9 @@ FSR2FeatureDx11on12::~FSR2FeatureDx11on12()
if (Imgui)
Imgui.reset();
+
+ DeviceContext->Flush();
+ SetInit(false);
}
bool FSR2FeatureDx11on12::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
diff --git a/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp b/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp
index e1a4dd42..477319a8 100644
--- a/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp
+++ b/CyberXeSS/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp
@@ -108,17 +108,17 @@ void FSR2FeatureDx11on12_212::ReleaseSharedResources()
spdlog::debug("FSR2FeatureDx11on12::ReleaseSharedResources start!");
SAFE_RELEASE(dx11Color.SharedTexture)
- SAFE_RELEASE(dx11Mv.SharedTexture)
- SAFE_RELEASE(dx11Out.SharedTexture)
- SAFE_RELEASE(dx11Depth.SharedTexture)
- SAFE_RELEASE(dx11Tm.SharedTexture)
- SAFE_RELEASE(dx11Exp.SharedTexture)
- SAFE_RELEASE(dx11Color.Dx12Resource)
- SAFE_RELEASE(dx11Mv.Dx12Resource)
- SAFE_RELEASE(dx11Out.Dx12Resource)
- SAFE_RELEASE(dx11Depth.Dx12Resource)
- SAFE_RELEASE(dx11Tm.Dx12Resource)
- SAFE_RELEASE(dx11Exp.Dx12Resource)
+ SAFE_RELEASE(dx11Mv.SharedTexture)
+ SAFE_RELEASE(dx11Out.SharedTexture)
+ SAFE_RELEASE(dx11Depth.SharedTexture)
+ SAFE_RELEASE(dx11Tm.SharedTexture)
+ SAFE_RELEASE(dx11Exp.SharedTexture)
+ SAFE_RELEASE(dx11Color.Dx12Resource)
+ SAFE_RELEASE(dx11Mv.Dx12Resource)
+ SAFE_RELEASE(dx11Out.Dx12Resource)
+ SAFE_RELEASE(dx11Depth.Dx12Resource)
+ SAFE_RELEASE(dx11Tm.Dx12Resource)
+ SAFE_RELEASE(dx11Exp.Dx12Resource)
}
void FSR2FeatureDx11on12_212::GetHardwareAdapter(IDXGIFactory1* InFactory, IDXGIAdapter** InAdapter, D3D_FEATURE_LEVEL InFeatureLevel, bool InRequestHighPerformanceAdapter)
@@ -367,7 +367,7 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con
ID3D11Query* query0 = nullptr;
// 3 is query sync
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1));
@@ -415,7 +415,6 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con
DeviceContext->Begin(query0);
}
-
#pragma region Texture copies
@@ -517,13 +516,16 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con
#pragma endregion
// 3 is query sync
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1)
Dx11DeviceContext->Flush();
- Dx11DeviceContext->Signal(dx11fence_1, 10);
- Dx12CommandQueue->Wait(dx12fence_1, 10);
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ {
+ Dx11DeviceContext->Signal(dx11fence_1, 10);
+ Dx12CommandQueue->Wait(dx12fence_1, 10);
+ }
}
else
{
@@ -720,7 +722,7 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con
HANDLE dx12_sharedHandle;
// dispatch fences
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2));
@@ -753,15 +755,18 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, con
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
// fsr done
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
- Dx12CommandQueue->Signal(dx12fence_2, 20);
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ {
+ Dx12CommandQueue->Signal(dx12fence_2, 20);
- // wait for fsr on dx12
- Dx11DeviceContext->Wait(dx11fence_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) > 2)
{
ID3D11Query* query1 = nullptr;
result = Dx11Device->CreateQuery(&pQueryDesc, &query1);
@@ -868,15 +873,50 @@ FSR2FeatureDx11on12_212::~FSR2FeatureDx11on12_212()
{
spdlog::debug("FSR2FeatureDx11on12::~FSR2FeatureDx11on12");
+ if (Dx11Device)
+ {
+ D3D11_QUERY_DESC pQueryDesc;
+ pQueryDesc.Query = D3D11_QUERY_EVENT;
+ pQueryDesc.MiscFlags = 0;
+
+ ID3D11Query* query = nullptr;
+ auto result = Dx11Device->CreateQuery(&pQueryDesc, &query);
+
+ if (result == S_OK)
+ {
+ // Associate the query with the copy operation
+ DeviceContext->Begin(query);
+
+ //copy output back
+
+ // Execute dx11 commands
+ DeviceContext->End(query);
+ DeviceContext->Flush();
+
+ // Wait for the query to be ready
+ while (DeviceContext->GetData(query, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE)
+ std::this_thread::yield();
+
+ // Release the query
+ query->Release();
+ }
+ }
+
if (Dx12on11Device && Dx12CommandQueue && Dx12CommandList)
{
+ auto errorCode = Fsr212::ffxFsr2ContextDestroy212(&_context);
+
+ if (errorCode != Fsr212::FFX_OK)
+ spdlog::error("FSR2Feature::~FSR2Feature ffxFsr2ContextDestroy error: {0:x}", errorCode);
+
+ free(_contextDesc.callbacks.scratchBuffer);
+
ID3D12Fence* d3d12Fence;
Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d12Fence));
- Dx12CommandQueue->Signal(d3d12Fence, 999);
-
Dx12CommandList->Close();
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
+ Dx12CommandQueue->Signal(d3d12Fence, 999);
auto fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
@@ -900,6 +940,9 @@ FSR2FeatureDx11on12_212::~FSR2FeatureDx11on12_212()
if (Imgui)
Imgui.reset();
+
+ DeviceContext->Flush();
+ SetInit(false);
}
bool FSR2FeatureDx11on12_212::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
diff --git a/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp b/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp
index 2044ef55..e0c6ab16 100644
--- a/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp
+++ b/CyberXeSS/backends/xess/XeSSFeature_Dx11.cpp
@@ -259,6 +259,10 @@ HRESULT XeSSFeatureDx11::CreateDx12Device(D3D_FEATURE_LEVEL InFeatureLevel)
return S_OK;
}
+XeSSFeatureDx11::XeSSFeatureDx11(unsigned int InHandleId, const NVSDK_NGX_Parameter* InParameters) : XeSSFeature(InHandleId, InParameters), IFeature_Dx11(InHandleId, InParameters), IFeature(InHandleId, InParameters)
+{
+}
+
bool XeSSFeatureDx11::Init(ID3D11Device* InDevice, ID3D11DeviceContext* InContext, const NVSDK_NGX_Parameter* InParameters)
{
spdlog::debug("XeSSFeatureDx11::Init!");
@@ -368,7 +372,7 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
ID3D11Query* query0 = nullptr;
// 3 is query sync
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
fr = Dx11Device->CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx11fence_1));
@@ -416,7 +420,6 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
DeviceContext->Begin(query0);
}
-
#pragma region Texture copies
ID3D11Resource* paramColor;
@@ -518,13 +521,16 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
#pragma endregion
// 3 is query sync
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 1)
Dx11DeviceContext->Flush();
- Dx11DeviceContext->Signal(dx11fence_1, 10);
- Dx12CommandQueue->Wait(dx12fence_1, 10);
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ {
+ Dx11DeviceContext->Signal(dx11fence_1, 10);
+ Dx12CommandQueue->Wait(dx12fence_1, 10);
+ }
}
else
{
@@ -697,7 +703,7 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
HANDLE dx12_sharedHandle;
// dispatch fences
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
fr = Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&dx12fence_2));
@@ -730,15 +736,18 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
// xess done
- if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 3)
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) < 4)
{
- Dx12CommandQueue->Signal(dx12fence_2, 20);
+ if (Config::Instance()->UseSafeSyncQueries.value_or(0) > 0)
+ {
+ Dx12CommandQueue->Signal(dx12fence_2, 20);
- // wait for fsr on dx12
- Dx11DeviceContext->Wait(dx11fence_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) > 2)
{
ID3D11Query* query1 = nullptr;
result = Dx11Device->CreateQuery(&pQueryDesc, &query1);
@@ -845,15 +854,43 @@ XeSSFeatureDx11::~XeSSFeatureDx11()
{
spdlog::debug("XeSSFeatureDx11::XeSSFeatureDx11");
+ if (Dx11Device)
+ {
+ D3D11_QUERY_DESC pQueryDesc;
+ pQueryDesc.Query = D3D11_QUERY_EVENT;
+ pQueryDesc.MiscFlags = 0;
+
+ ID3D11Query* query = nullptr;
+ auto result = Dx11Device->CreateQuery(&pQueryDesc, &query);
+
+ if (result == S_OK)
+ {
+ // Associate the query with the copy operation
+ DeviceContext->Begin(query);
+
+ //copy output back
+
+ // Execute dx11 commands
+ DeviceContext->End(query);
+ DeviceContext->Flush();
+
+ // Wait for the query to be ready
+ while (DeviceContext->GetData(query, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH) == S_FALSE)
+ std::this_thread::yield();
+
+ // Release the query
+ query->Release();
+ }
+ }
+
if (Dx12on11Device && Dx12CommandQueue && Dx12CommandList)
{
ID3D12Fence* d3d12Fence;
Dx12on11Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d12Fence));
- Dx12CommandQueue->Signal(d3d12Fence, 999);
-
Dx12CommandList->Close();
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
+ Dx12CommandQueue->Signal(d3d12Fence, 999);
auto fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
@@ -867,6 +904,17 @@ XeSSFeatureDx11::~XeSSFeatureDx11()
d3d12Fence->Release();
+ auto result = xessDestroyContext(_xessContext);
+ _xessContext = nullptr;
+
+ if (result != XESS_RESULT_SUCCESS)
+ spdlog::error("XeSSFeature::Destroy xessDestroyContext error: {0}", ResultToString(result));
+
+ DestroyCasContext();
+
+ if (casBuffer != nullptr)
+ casBuffer->Release();
+
SAFE_RELEASE(Dx12CommandList);
SAFE_RELEASE(Dx12CommandQueue);
SAFE_RELEASE(Dx12CommandAllocator);
@@ -875,7 +923,11 @@ XeSSFeatureDx11::~XeSSFeatureDx11()
ReleaseSharedResources();
- if(Imgui)
+ if (Imgui)
Imgui.reset();
+
+ DeviceContext->Flush();
+
+ SetInit(false);
}
diff --git a/CyberXeSS/backends/xess/XeSSFeature_Dx11.h b/CyberXeSS/backends/xess/XeSSFeature_Dx11.h
index e8362417..2645a33b 100644
--- a/CyberXeSS/backends/xess/XeSSFeature_Dx11.h
+++ b/CyberXeSS/backends/xess/XeSSFeature_Dx11.h
@@ -50,9 +50,7 @@ private:
protected:
public:
- XeSSFeatureDx11(unsigned int InHandleId, const NVSDK_NGX_Parameter* InParameters) : XeSSFeature(InHandleId, InParameters), IFeature_Dx11(InHandleId, InParameters), IFeature(InHandleId, InParameters)
- {
- }
+ XeSSFeatureDx11(unsigned int InHandleId, const NVSDK_NGX_Parameter* InParameters);
bool Init(ID3D11Device* InDevice, ID3D11DeviceContext* InContext, const NVSDK_NGX_Parameter* InParameters) override;
bool Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK_NGX_Parameter* InParameters) override;
diff --git a/CyberXeSS/backends/xess/XeSSFeature_Dx12.cpp b/CyberXeSS/backends/xess/XeSSFeature_Dx12.cpp
index dad43cb0..b4dfe061 100644
--- a/CyberXeSS/backends/xess/XeSSFeature_Dx12.cpp
+++ b/CyberXeSS/backends/xess/XeSSFeature_Dx12.cpp
@@ -253,6 +253,26 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, const N
XeSSFeatureDx12::~XeSSFeatureDx12()
{
+ if (Device)
+ {
+ ID3D12Fence* d3d12Fence;
+ Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d12Fence));
+
+ d3d12Fence->Signal(999);
+
+ auto fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
+
+ if (d3d12Fence->SetEventOnCompletion(999, fenceEvent) == S_OK)
+ {
+ WaitForSingleObject(fenceEvent, INFINITE);
+ CloseHandle(fenceEvent);
+ }
+ else
+ spdlog::warn("XeSSFeatureDx12::~XeSSFeatureDx12 can't get fenceEvent handle");
+
+ d3d12Fence->Release();
+ }
+
if (Imgui)
Imgui.reset();
}
diff --git a/CyberXeSS/imgui/Imgui_Base.cpp b/CyberXeSS/imgui/Imgui_Base.cpp
index 9747d0cb..987709b3 100644
--- a/CyberXeSS/imgui/Imgui_Base.cpp
+++ b/CyberXeSS/imgui/Imgui_Base.cpp
@@ -425,6 +425,26 @@ void Imgui_Base::RenderMenu()
if (ImGui::Button("Revert"))
Config::Instance()->newBackend = "";
+ // Dx11
+ ImGui::BeginDisabled(Config::Instance()->Api != NVNGX_DX11);
+
+ const char* sync[] = { "No Syncing", "Shared Fences", "Shared Fences + Flush", "Shared Fences + Query", "Mostly Queries" };
+
+ const char* selectedSync = sync[Config::Instance()->UseSafeSyncQueries.value_or(0)];
+
+ if (ImGui::BeginCombo("Dx12wDx11 Sync", selectedSync))
+ {
+ for (int n = 0; n < 5; n++)
+ {
+ if (ImGui::Selectable(sync[n], (Config::Instance()->UseSafeSyncQueries.value_or(0) == n)))
+ Config::Instance()->UseSafeSyncQueries = n;
+ }
+
+ ImGui::EndCombo();
+ }
+
+ ImGui::EndDisabled();
+
// UPSCALER SPECIFIC -----------------------------
// XeSS
ImGui::BeginDisabled(currentBackend != "xess");
@@ -522,26 +542,6 @@ void Imgui_Base::RenderMenu()
Config::Instance()->FsrHorizontalFov = fov;
}
- // Dx11
- ImGui::BeginDisabled((currentBackend != "fsr21_12") && (currentBackend != "fsr22_12"));
-
- const char* sync[] = { "Shared Fences", "Shared Fences + Flush", "Shared Fences + Query", "Only Queries" };
-
- const char* selectedSync = sync[Config::Instance()->UseSafeSyncQueries.value_or(0)];
-
- if (ImGui::BeginCombo("Sync", selectedSync))
- {
- for (int n = 0; n < 4; n++)
- {
- if (ImGui::Selectable(sync[n], (Config::Instance()->UseSafeSyncQueries.value_or(0) == n)))
- Config::Instance()->UseSafeSyncQueries = n;
- }
-
- ImGui::EndCombo();
- }
-
- ImGui::EndDisabled();
-
ImGui::EndDisabled();
// SHARPNESS -----------------------------
diff --git a/nvngx.ini b/nvngx.ini
index bb02f5e7..ff5c0283 100644
--- a/nvngx.ini
+++ b/nvngx.ini
@@ -17,9 +17,10 @@ VulkanUpscaler=auto
;
; Valid values are;
; 0 - Safe syncing is off (fastest)
-; 1 - Flush after Dx11 texture copies
-; 2 - Sync after output copy
-; 3 - No fences, all sync done with queries (slowest)
+; 1 - Only Fences
+; 2 - Fences + Flush after Dx11 texture copies
+; 3 - Sync after output copy
+; 4 - No fences, all sync done with queries (slowest)
;
; 0 is fastest, 3 is slowest
;