From 894d9606d5c5a1b8dfff966fed8e0f7c4a9b82c0 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 29 Sep 2018 08:13:52 +0200 Subject: [PATCH] [dxgi] Add option to force-enable MAILBOX present mode Provides Enhanced Sync-like functionality (#678). --- src/dxgi/dxgi_options.cpp | 1 + src/dxgi/dxgi_options.h | 11 +++++++++++ src/dxgi/dxgi_presenter.cpp | 5 ++++- src/dxgi/dxgi_presenter.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/dxgi/dxgi_options.cpp b/src/dxgi/dxgi_options.cpp index c1ebbca51..22e1173c3 100644 --- a/src/dxgi/dxgi_options.cpp +++ b/src/dxgi/dxgi_options.cpp @@ -41,6 +41,7 @@ namespace dxvk { this->numBackBuffers = config.getOption("dxgi.numBackBuffers", 0); this->syncInterval = config.getOption("dxgi.syncInterval", -1); + this->syncMode = DxgiSyncMode(config.getOption("dxgi.syncMode", 0)); this->d3d10Enable = config.getOption("d3d10.enable", true); } diff --git a/src/dxgi/dxgi_options.h b/src/dxgi/dxgi_options.h index d7a32e6a6..e661ad26a 100644 --- a/src/dxgi/dxgi_options.h +++ b/src/dxgi/dxgi_options.h @@ -7,6 +7,14 @@ #include "dxgi_include.h" namespace dxvk { + + /** + * \brief Sync mode + */ + enum class DxgiSyncMode : int32_t { + Default = 0, + Mailbox = 1, + }; /** * \brief DXGI options @@ -46,6 +54,9 @@ namespace dxvk { /// passed to IDXGISwapChain::Present. int32_t syncInterval; + /// Vsync mode + DxgiSyncMode syncMode; + /// Enables D3D10 support bool d3d10Enable; }; diff --git a/src/dxgi/dxgi_presenter.cpp b/src/dxgi/dxgi_presenter.cpp index c1a8db854..be6f2502c 100644 --- a/src/dxgi/dxgi_presenter.cpp +++ b/src/dxgi/dxgi_presenter.cpp @@ -13,7 +13,8 @@ namespace dxvk { HWND window) : m_window (window), m_device (device), - m_context (device->createContext()) { + m_context (device->createContext()), + m_syncMode(pOptions->syncMode) { // Some games don't work with deferred surface creation, // so we should default to initializing it immediately. @@ -367,6 +368,8 @@ namespace dxvk { size_t n = 0; if (Vsync) { + if (m_syncMode == DxgiSyncMode::Mailbox) + modes[n++] = VK_PRESENT_MODE_MAILBOX_KHR; modes[n++] = VK_PRESENT_MODE_FIFO_KHR; } else { modes[n++] = VK_PRESENT_MODE_IMMEDIATE_KHR; diff --git a/src/dxgi/dxgi_presenter.h b/src/dxgi/dxgi_presenter.h index ca2918f59..25b12be6a 100644 --- a/src/dxgi/dxgi_presenter.h +++ b/src/dxgi/dxgi_presenter.h @@ -163,6 +163,7 @@ namespace dxvk { DxvkLogicOpState m_loState; DxvkBlendMode m_blendMode; DxvkSwapchainProperties m_options; + DxgiSyncMode m_syncMode; VkSurfaceFormatKHR PickSurfaceFormat(DXGI_FORMAT Fmt) const;