Don't present BGFX_FRAME_FLUSH frames. Fixed D3D12/VK flush sync. (#3771)

This commit is contained in:
Branimir Karadžić
2026-06-19 19:39:42 +00:00
committed by GitHub
parent 09eaac37ae
commit 4f101d98be
5 changed files with 20 additions and 6 deletions
+3 -1
View File
@@ -2778,7 +2778,7 @@ namespace bgfx
if (!m_flipAfterRender)
{
if (!m_render->m_flush)
if (!m_flushPrevFrame)
{
BGFX_PROFILER_SCOPE("bgfx/flip", kColorSubmit);
flip();
@@ -2825,6 +2825,8 @@ namespace bgfx
flip();
}
}
m_flushPrevFrame = m_render->m_flush;
}
else
{
+2
View File
@@ -3928,6 +3928,7 @@ namespace bgfx
, m_exit(false)
, m_flipAfterRender(false)
, m_singleThreaded(false)
, m_flushPrevFrame(false)
{
}
@@ -6209,6 +6210,7 @@ namespace bgfx
bool m_flipAfterRender;
bool m_singleThreaded;
bool m_flipped;
bool m_flushPrevFrame;
typedef UpdateBatchT<256> TextureUpdateBatch;
BX_ALIGN_DECL_CACHE_LINE(TextureUpdateBatch m_textureUpdateBatch);
+1
View File
@@ -7248,6 +7248,7 @@ namespace bgfx { namespace d3d12
D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle;
ScratchBufferD3D12& scratchBuffer = m_scratchBuffer[m_backBufferColorIdx];
m_cmd.finish(m_backBufferColorFence[m_backBufferColorIdx]);
scratchBuffer.reset(gpuHandle);
m_uniformScratchBuffer.begin();
+13 -5
View File
@@ -8384,6 +8384,9 @@ VK_DESTROY
m_lastImageRenderedSemaphore = m_renderDoneSemaphore[m_backBufferColorIdx];
m_needPresent = true;
s_renderVK->m_cmd.addWaitSemaphore(m_lastImageAcquiredSemaphore, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
m_lastImageAcquiredSemaphore = VK_NULL_HANDLE;
}
return true;
@@ -8903,15 +8906,20 @@ VK_DESTROY
return result;
}
void CommandQueueVK::addWaitSemaphore(VkSemaphore _semaphore, VkPipelineStageFlags _waitStage)
{
BX_ASSERT(m_numWaitSemaphores < BX_COUNTOF(m_waitSemaphores), "Too many wait semaphores.");
m_waitSemaphores[m_numWaitSemaphores] = _semaphore;
m_waitSemaphoreStages[m_numWaitSemaphores] = _waitStage;
m_numWaitSemaphores++;
}
void CommandQueueVK::addSwapChain(SwapChainVK& _swapChain)
{
if (VK_NULL_HANDLE != _swapChain.m_lastImageAcquiredSemaphore)
{
BX_ASSERT(m_numWaitSemaphores < BX_COUNTOF(m_waitSemaphores), "Too many wait semaphores.");
m_waitSemaphores[m_numWaitSemaphores] = _swapChain.m_lastImageAcquiredSemaphore;
m_waitSemaphoreStages[m_numWaitSemaphores] = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
m_numWaitSemaphores++;
addWaitSemaphore(_swapChain.m_lastImageAcquiredSemaphore, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
_swapChain.m_lastImageAcquiredSemaphore = VK_NULL_HANDLE;
}
+1
View File
@@ -912,6 +912,7 @@ VK_DESTROY_FUNC(DescriptorSet);
void shutdown();
VkResult alloc(VkCommandBuffer* _outCommandBuffer);
void addWaitSemaphore(VkSemaphore _semaphore, VkPipelineStageFlags _waitStage);
void addSwapChain(SwapChainVK& _swapChain);
void kick(bool _wait = false);
void finish(bool _finishAll = false);