mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-02 01:24:11 +01:00
[dxgi] Don't use FIFO present mode if IMMEDIATE is not available
Might fix potential performance issues on Nvidia when VSYNC is disabled. Based on RPCS3/rpcs3@25ec3789fe
This commit is contained in:
parent
08a9963734
commit
5f42950650
@ -293,13 +293,13 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DxgiVkPresenter::RecreateSwapchain(DXGI_FORMAT Format, VkPresentModeKHR PresentMode, VkExtent2D WindowSize) {
|
void DxgiVkPresenter::RecreateSwapchain(DXGI_FORMAT Format, BOOL Vsync, VkExtent2D WindowSize) {
|
||||||
if (m_surface == nullptr)
|
if (m_surface == nullptr)
|
||||||
m_surface = CreateSurface();
|
m_surface = CreateSurface();
|
||||||
|
|
||||||
DxvkSwapchainProperties options;
|
DxvkSwapchainProperties options;
|
||||||
options.preferredSurfaceFormat = PickSurfaceFormat(Format);
|
options.preferredSurfaceFormat = PickSurfaceFormat(Format);
|
||||||
options.preferredPresentMode = PickPresentMode(PresentMode);
|
options.preferredPresentMode = PickPresentMode(Vsync);
|
||||||
options.preferredBufferSize = WindowSize;
|
options.preferredBufferSize = WindowSize;
|
||||||
|
|
||||||
const bool doRecreate =
|
const bool doRecreate =
|
||||||
@ -360,8 +360,19 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VkPresentModeKHR DxgiVkPresenter::PickPresentMode(VkPresentModeKHR Preferred) const {
|
VkPresentModeKHR DxgiVkPresenter::PickPresentMode(BOOL Vsync) const {
|
||||||
return m_surface->pickPresentMode(1, &Preferred);
|
std::array<VkPresentModeKHR, 4> modes;
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
if (Vsync) {
|
||||||
|
modes[n++] = VK_PRESENT_MODE_FIFO_KHR;
|
||||||
|
} else {
|
||||||
|
modes[n++] = VK_PRESENT_MODE_IMMEDIATE_KHR;
|
||||||
|
modes[n++] = VK_PRESENT_MODE_MAILBOX_KHR;
|
||||||
|
modes[n++] = VK_PRESENT_MODE_FIFO_RELAXED_KHR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_surface->pickPresentMode(n, modes.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -103,12 +103,12 @@ namespace dxvk {
|
|||||||
* if any of the properties have changed. If no
|
* if any of the properties have changed. If no
|
||||||
* properties have changed, this is a no-op.
|
* properties have changed, this is a no-op.
|
||||||
* \param [in] Format New surface format
|
* \param [in] Format New surface format
|
||||||
* \param [in] PresentMode Present mode
|
* \param [in] Vsync Enable vertical sync
|
||||||
* \param [in] WindowSize Window size
|
* \param [in] WindowSize Window size
|
||||||
*/
|
*/
|
||||||
void RecreateSwapchain(
|
void RecreateSwapchain(
|
||||||
DXGI_FORMAT Format,
|
DXGI_FORMAT Format,
|
||||||
VkPresentModeKHR PresentMode,
|
BOOL Vsync,
|
||||||
VkExtent2D WindowSize);
|
VkExtent2D WindowSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -164,7 +164,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
VkSurfaceFormatKHR PickSurfaceFormat(DXGI_FORMAT Fmt) const;
|
VkSurfaceFormatKHR PickSurfaceFormat(DXGI_FORMAT Fmt) const;
|
||||||
|
|
||||||
VkPresentModeKHR PickPresentMode(VkPresentModeKHR Preferred) const;
|
VkPresentModeKHR PickPresentMode(BOOL Vsync) const;
|
||||||
|
|
||||||
Rc<DxvkSurface> CreateSurface();
|
Rc<DxvkSurface> CreateSurface();
|
||||||
|
|
||||||
|
@ -298,11 +298,7 @@ namespace dxvk {
|
|||||||
// up vertical synchronization properly, but also apply
|
// up vertical synchronization properly, but also apply
|
||||||
// changes that were made to the window size even if the
|
// changes that were made to the window size even if the
|
||||||
// Vulkan swap chain itself remains valid.
|
// Vulkan swap chain itself remains valid.
|
||||||
VkPresentModeKHR presentMode = SyncInterval == 0
|
m_presenter->RecreateSwapchain(m_desc.Format, SyncInterval != 0, GetWindowSize());
|
||||||
? VK_PRESENT_MODE_IMMEDIATE_KHR
|
|
||||||
: VK_PRESENT_MODE_FIFO_KHR;
|
|
||||||
|
|
||||||
m_presenter->RecreateSwapchain(m_desc.Format, presentMode, GetWindowSize());
|
|
||||||
m_presenter->PresentImage(SyncInterval, m_device->GetFrameSyncEvent());
|
m_presenter->PresentImage(SyncInterval, m_device->GetFrameSyncEvent());
|
||||||
return S_OK;
|
return S_OK;
|
||||||
} catch (const DxvkError& err) {
|
} catch (const DxvkError& err) {
|
||||||
|
Loading…
Reference in New Issue
Block a user