From 2faa15bab5e16bcfddf917628426a36a456ab0cf Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 24 Mar 2023 10:04:34 -0400 Subject: [PATCH] Fix Vsync mode switching to support all modes: 0 (off), 1 (smart), 2 (on) --- neo/renderer/NVRHI/RenderBackend_NVRHI.cpp | 2 +- neo/sys/DeviceManager.h | 8 ++++---- neo/sys/DeviceManager_DX12.cpp | 4 ++-- neo/sys/DeviceManager_VK.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp b/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp index babf2a7e..8402091c 100644 --- a/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp +++ b/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp @@ -1836,7 +1836,7 @@ void idRenderBackend::CheckCVars() if( r_swapInterval.IsModified() ) { r_swapInterval.ClearModified(); - deviceManager->SetVsyncEnabled( r_swapInterval.GetBool() ); + deviceManager->SetVsyncEnabled( r_swapInterval.GetInteger() ); } // filtering diff --git a/neo/sys/DeviceManager.h b/neo/sys/DeviceManager.h index 91d2492b..c7daa514 100644 --- a/neo/sys/DeviceManager.h +++ b/neo/sys/DeviceManager.h @@ -59,7 +59,7 @@ struct DeviceCreationParameters uint32_t swapChainSampleQuality = 0; bool enableDebugRuntime = false; bool enableNvrhiValidationLayer = false; - bool vsyncEnabled = false; + int vsyncEnabled = 0; bool enableRayTracingExtensions = false; // for vulkan bool enableComputeQueue = false; bool enableCopyQueue = false; @@ -158,7 +158,7 @@ protected: float m_DPIScaleFactorX = 1.f; float m_DPIScaleFactorY = 1.f; - bool m_RequestedVSync = false; + int m_RequestedVSync = 0; uint32_t m_FrameIndex = 0; @@ -181,9 +181,9 @@ public: [[nodiscard]] virtual nvrhi::GraphicsAPI GetGraphicsAPI() const = 0; const DeviceCreationParameters& GetDeviceParams(); - virtual void SetVsyncEnabled( bool enabled ) + virtual void SetVsyncEnabled( int vsyncMode ) { - m_RequestedVSync = enabled; /* will be processed later */ + m_RequestedVSync = vsyncMode; /* will be processed later */ } virtual void ReportLiveObjects() {} diff --git a/neo/sys/DeviceManager_DX12.cpp b/neo/sys/DeviceManager_DX12.cpp index 32ee36c9..022a021c 100644 --- a/neo/sys/DeviceManager_DX12.cpp +++ b/neo/sys/DeviceManager_DX12.cpp @@ -662,7 +662,7 @@ void DeviceManager_DX12::Present() UINT presentFlags = 0; // SRS - DXGI docs say fullscreen must be disabled for unlocked fps/tear, but this does not seem to be true - if( !m_DeviceParams.vsyncEnabled && m_TearingSupported ) //&& !glConfig.isFullscreen ) + if( m_DeviceParams.vsyncEnabled == 0 && m_TearingSupported ) //&& !glConfig.isFullscreen ) { presentFlags |= DXGI_PRESENT_ALLOW_TEARING; } @@ -671,7 +671,7 @@ void DeviceManager_DX12::Present() OPTICK_CATEGORY( "Present", Optick::Category::Wait ); // SRS - Don't change m_DeviceParams.vsyncEnabled here, simply test for vsync mode 2 to set DXGI SyncInterval - m_SwapChain->Present( m_DeviceParams.vsyncEnabled && r_swapInterval.GetInteger() == 2 ? 1 : 0, presentFlags ); + m_SwapChain->Present( m_DeviceParams.vsyncEnabled == 2 ? 1 : 0, presentFlags ); m_FrameFence->SetEventOnCompletion( m_FrameCount, m_FrameFenceEvents[bufferIndex] ); m_GraphicsQueue->Signal( m_FrameFence, m_FrameCount ); diff --git a/neo/sys/DeviceManager_VK.cpp b/neo/sys/DeviceManager_VK.cpp index 8400b9b7..99f93b6d 100644 --- a/neo/sys/DeviceManager_VK.cpp +++ b/neo/sys/DeviceManager_VK.cpp @@ -1020,7 +1020,7 @@ bool DeviceManager_VK::createSwapChain() .setPQueueFamilyIndices( enableSwapChainSharing ? queues.data() : nullptr ) .setPreTransform( vk::SurfaceTransformFlagBitsKHR::eIdentity ) .setCompositeAlpha( vk::CompositeAlphaFlagBitsKHR::eOpaque ) - .setPresentMode( m_DeviceParams.vsyncEnabled ? ( r_swapInterval.GetInteger() == 2 || !enablePModeFifoRelaxed ? vk::PresentModeKHR::eFifo : vk::PresentModeKHR::eFifoRelaxed ) : vk::PresentModeKHR::eImmediate ) + .setPresentMode( m_DeviceParams.vsyncEnabled > 0 ? ( m_DeviceParams.vsyncEnabled == 2 || !enablePModeFifoRelaxed ? vk::PresentModeKHR::eFifo : vk::PresentModeKHR::eFifoRelaxed ) : vk::PresentModeKHR::eImmediate ) .setClipped( true ) .setOldSwapchain( nullptr );