diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp
index 98e107eb0..c14fc53fa 100644
--- a/src/d3d11/d3d11_swapchain.cpp
+++ b/src/d3d11/d3d11_swapchain.cpp
@@ -239,9 +239,6 @@ namespace dxvk {
     uint64_t frameId = ++m_frameId;
     m_frameLatencySignal->wait(frameId - GetActualFrameLatency());
     
-    if (m_hud != nullptr)
-      m_hud->update();
-
     for (uint32_t i = 0; i < SyncInterval || i < 1; i++) {
       SynchronizePresent();
 
@@ -340,7 +337,7 @@ namespace dxvk {
       if (i + 1 >= SyncInterval)
         m_context->signal(m_frameLatencySignal, frameId);
 
-      SubmitPresent(immediateContext, sync);
+      SubmitPresent(immediateContext, sync, i);
     }
 
     SignalFrameLatencyEvent();
@@ -349,18 +346,24 @@ namespace dxvk {
 
   void D3D11SwapChain::SubmitPresent(
           D3D11ImmediateContext*  pContext,
-    const vk::PresenterSync&      Sync) {
+    const vk::PresenterSync&      Sync,
+          uint32_t                FrameId) {
     // Present from CS thread so that we don't
     // have to synchronize with it first.
     m_presentStatus.result = VK_NOT_READY;
 
     pContext->EmitCs([this,
+      cFrameId     = FrameId,
       cSync        = Sync,
+      cHud         = m_hud,
       cCommandList = m_context->endRecording()
     ] (DxvkContext* ctx) {
       m_device->submitCommandList(cCommandList,
         cSync.acquire, cSync.present);
 
+      if (cHud != nullptr && !cFrameId)
+        cHud->update();
+
       m_device->presentImage(m_presenter,
         cSync.present, &m_presentStatus);
     });
diff --git a/src/d3d11/d3d11_swapchain.h b/src/d3d11/d3d11_swapchain.h
index f85044285..11b6a437e 100644
--- a/src/d3d11/d3d11_swapchain.h
+++ b/src/d3d11/d3d11_swapchain.h
@@ -139,7 +139,8 @@ namespace dxvk {
 
     void SubmitPresent(
             D3D11ImmediateContext*  pContext,
-      const vk::PresenterSync&      Sync);
+      const vk::PresenterSync&      Sync,
+            uint32_t                FrameId);
 
     void SynchronizePresent();