More conservative frame sync: wait before vs after DX12 / Vulkan present operations

This commit is contained in:
Stephen Saunders 2023-03-04 21:15:32 -05:00
parent 0c217ebbe9
commit b1c2cdbec8
2 changed files with 11 additions and 20 deletions

View file

@ -636,6 +636,11 @@ void DeviceManager_DX12::EndFrame()
void DeviceManager_DX12::Present()
{
// SRS - Sync on previous frame's command queue completion vs. waitForIdle() on whole device
nvrhiDevice->waitEventQuery( m_FrameWaitQuery );
nvrhiDevice->resetEventQuery( m_FrameWaitQuery );
nvrhiDevice->setEventQuery( m_FrameWaitQuery, nvrhi::CommandQueue::Graphics );
if( !windowVisible )
{
return;
@ -654,11 +659,6 @@ void DeviceManager_DX12::Present()
// SRS - Don't change deviceParms.vsyncEnabled here, simply test for vsync mode 2 to set DXGI SyncInterval
m_SwapChain->Present( deviceParms.vsyncEnabled && r_swapInterval.GetInteger() == 2 ? 1 : 0, presentFlags );
// SRS - Sync on previous frame's command queue completion vs. waitForIdle() on whole device
nvrhiDevice->waitEventQuery( m_FrameWaitQuery );
nvrhiDevice->resetEventQuery( m_FrameWaitQuery );
nvrhiDevice->setEventQuery( m_FrameWaitQuery, nvrhi::CommandQueue::Graphics );
m_FrameFence->SetEventOnCompletion( m_FrameCount, m_FrameFenceEvents[bufferIndex] );
m_GraphicsQueue->Signal( m_FrameFence, m_FrameCount );
m_FrameCount++;

View file

@ -1270,6 +1270,11 @@ void DeviceManager_VK::EndFrame()
void DeviceManager_VK::Present()
{
// SRS - Sync on previous frame's command queue completion vs. waitForIdle() on whole device
m_NvrhiDevice->waitEventQuery( m_FrameWaitQuery );
m_NvrhiDevice->resetEventQuery( m_FrameWaitQuery );
m_NvrhiDevice->setEventQuery( m_FrameWaitQuery, nvrhi::CommandQueue::Graphics );
vk::PresentInfoKHR info = vk::PresentInfoKHR()
.setWaitSemaphoreCount( 1 )
.setPWaitSemaphores( &m_PresentSemaphore )
@ -1280,26 +1285,12 @@ void DeviceManager_VK::Present()
const vk::Result res = m_PresentQueue.presentKHR( &info );
assert( res == vk::Result::eSuccess || res == vk::Result::eErrorOutOfDateKHR || res == vk::Result::eSuboptimalKHR );
if( deviceParms.enableDebugRuntime )
if( deviceParms.enableDebugRuntime || deviceParms.vsyncEnabled )
{
// according to vulkan-tutorial.com, "the validation layer implementation expects
// the application to explicitly synchronize with the GPU"
m_PresentQueue.waitIdle();
}
else
{
if( deviceParms.vsyncEnabled )
{
m_PresentQueue.waitIdle();
}
// SRS - Sync on previous frame's command queue completion vs. waitForIdle() on whole device
else
{
m_NvrhiDevice->waitEventQuery( m_FrameWaitQuery );
m_NvrhiDevice->resetEventQuery( m_FrameWaitQuery );
m_NvrhiDevice->setEventQuery( m_FrameWaitQuery, nvrhi::CommandQueue::Graphics );
}
}
}
DeviceManager* DeviceManager::CreateVK()