From 1fb47dca7a8496fcbff54e9e7df85ec4a44d1d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Fri, 18 Sep 2026 06:41:57 -0700 Subject: [PATCH] VK/WGPU: drain a view's blits and uniform cache before its dispatches. VK: block on the swapchain image of window framebuffers on a headless device (#3989) --- src/renderer_vk.cpp | 12 +++++++++++- src/renderer_webgpu.cpp | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index b9aefc034..623099d08 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -3476,8 +3476,12 @@ VK_IMPORT_DEVICE ); } + const bool block = !isValid(_fbh) + || NULL == m_backBuffer.m_swapChain.m_nwh + ; + int64_t start = bx::getHPCounter(); - newFrameBuffer.acquire(m_commandBuffer, !isValid(_fbh) ); + newFrameBuffer.acquire(m_commandBuffer, block); m_presentElapsed += bx::getHPCounter() - start; } @@ -10778,6 +10782,12 @@ VK_DESTROY } } + if (viewChanged) + { + submitUniformCache(ucs, view); + submitBlit(bs, view); + } + // renderpass external subpass dependencies handle graphics -> compute and compute -> graphics // but not compute -> compute (possibly also across views if they contain no draw calls) setMemoryBarrier( diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index 63a159925..29dcb308e 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -7220,6 +7220,13 @@ WGPU_IMPORT if (isCompute) { + if (viewChanged + && NULL != computePassEncoder) + { + WGPU_CHECK(wgpuComputePassEncoderEnd(computePassEncoder) ); + wgpuRelease(computePassEncoder); + } + if (NULL == computePassEncoder) { BGFX_WGPU_PROFILER_END(); @@ -7232,6 +7239,12 @@ WGPU_IMPORT wgpuRelease(renderPassEncoder); } + if (viewChanged) + { + submitUniformCache(ucs, view); + submitBlit(bs, view); + } + WGPUCommandEncoder cmdEncoder = m_cmd.alloc(); computePassEncoder = WGPU_CHECK(wgpuCommandEncoderBeginComputePass(cmdEncoder, NULL) ); }