Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWinterSnowfall <WinterSnowfall@users.noreply.github.com>2023-09-17 21:53:12 +0300
committerPhilip Rebohle <25567304+doitsujin@users.noreply.github.com>2023-10-06 15:05:39 +0300
commit4d974685c9c26e41df4406f9fbf30ce46c9234f6 (patch)
tree8b44efeee08d634a652b62efc6ae08138c5bf627
parentf0ff0007dc7bfc76383b61bad011078758caa3c7 (diff)
[d3d9] Mark presenter for recreation on device reset with deferSurfaceCreation
-rw-r--r--src/d3d9/d3d9_device.cpp3
-rw-r--r--src/d3d9/d3d9_device.h7
-rw-r--r--src/d3d9/d3d9_swapchain.cpp2
3 files changed, 12 insertions, 0 deletions
diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp
index a2f6e9c3..30a4a5b2 100644
--- a/src/d3d9/d3d9_device.cpp
+++ b/src/d3d9/d3d9_device.cpp
@@ -482,6 +482,9 @@ namespace dxvk {
Flush();
SynchronizeCsThread(DxvkCsThread::SynchronizeAll);
+ if (m_d3d9Options.deferSurfaceCreation)
+ m_deviceHasBeenReset = true;
+
return D3D_OK;
}
diff --git a/src/d3d9/d3d9_device.h b/src/d3d9/d3d9_device.h
index b4a29285..99a2a743 100644
--- a/src/d3d9/d3d9_device.h
+++ b/src/d3d9/d3d9_device.h
@@ -1033,6 +1033,12 @@ namespace dxvk {
bool CanSWVP() const {
return m_behaviorFlags & (D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_SOFTWARE_VERTEXPROCESSING);
}
+
+ // Device Reset detection for D3D9SwapChainEx::Present
+ bool IsDeviceReset() {
+ return std::exchange(m_deviceHasBeenReset, false);
+ }
+
void DetermineConstantLayouts(bool canSWVP);
D3D9BufferSlice AllocUPBuffer(VkDeviceSize size);
@@ -1337,6 +1343,7 @@ namespace dxvk {
VkImageLayout m_hazardLayout = VK_IMAGE_LAYOUT_GENERAL;
bool m_usingGraphicsPipelines = false;
+ bool m_deviceHasBeenReset = false;
DxvkDepthBiasRepresentation m_depthBiasRepresentation = { VK_DEPTH_BIAS_REPRESENTATION_LEAST_REPRESENTABLE_VALUE_FORMAT_EXT, false };
float m_depthBiasScale = 0.0f;
diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp
index 9e950be0..1d9c50c1 100644
--- a/src/d3d9/d3d9_swapchain.cpp
+++ b/src/d3d9/d3d9_swapchain.cpp
@@ -147,6 +147,8 @@ namespace dxvk {
bool recreate = false;
recreate |= m_wctx->presenter == nullptr;
recreate |= m_dialog != m_lastDialog;
+ if (options->deferSurfaceCreation)
+ recreate |= m_parent->IsDeviceReset();
if (m_wctx->presenter != nullptr) {
m_dirty |= m_wctx->presenter->setSyncInterval(presentInterval) != VK_SUCCESS;