From 81d81fba72c42d348c589514c774bbfe01e110fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sat, 19 Sep 2026 14:59:40 -0700 Subject: [PATCH] GL: Fixed timer query stall without a swap. WGPU: Reset read-only depth/stencil for swap chains. Fixed occlusion query result on handle reuse. (#3993) --- src/bgfx.cpp | 6 ++++++ src/bgfx_p.h | 4 ++++ src/renderer_gl.cpp | 11 +++++++++++ src/renderer_gl.h | 10 +++++++++- src/renderer_webgpu.cpp | 7 +++++-- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/bgfx.cpp b/src/bgfx.cpp index f0ca52f46..1a19ec4c9 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -2905,6 +2905,12 @@ namespace bgfx bx::swap(m_render, m_submit); + for (uint16_t ii = 0, num = m_numNewOcclusionQueryHandles; ii < num; ++ii) + { + m_submit->m_occlusion[m_newOcclusionQueryHandle[ii].idx] = INT32_MIN; + } + m_numNewOcclusionQueryHandles = 0; + bx::memCopy(m_render->m_occlusion, m_submit->m_occlusion, sizeof(m_submit->m_occlusion) ); if (!BX_ENABLED(BGFX_CONFIG_MULTITHREADED) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index cb82f2fab..7af637d81 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -5216,6 +5216,7 @@ namespace bgfx , m_numFreeDynamicIndexBufferHandles(0) , m_numFreeDynamicVertexBufferHandles(0) , m_numFreeOcclusionQueryHandles(0) + , m_numNewOcclusionQueryHandles(0) , m_colorPaletteDirty(2) , m_frames(0) , m_debug(BGFX_DEBUG_NONE) @@ -7539,6 +7540,7 @@ namespace bgfx if (isValid(handle) ) { m_submit->m_occlusion[handle.idx] = INT32_MIN; + m_newOcclusionQueryHandle[m_numNewOcclusionQueryHandles++] = handle; CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::InvalidateOcclusionQuery); cmdbuf.write(handle); @@ -7892,9 +7894,11 @@ namespace bgfx uint16_t m_numFreeDynamicIndexBufferHandles; uint16_t m_numFreeDynamicVertexBufferHandles; uint16_t m_numFreeOcclusionQueryHandles; + uint16_t m_numNewOcclusionQueryHandles; DynamicIndexBufferHandle m_freeDynamicIndexBufferHandle[BGFX_CONFIG_MAX_DYNAMIC_INDEX_BUFFERS]; DynamicVertexBufferHandle m_freeDynamicVertexBufferHandle[BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS]; OcclusionQueryHandle m_freeOcclusionQueryHandle[BGFX_CONFIG_MAX_OCCLUSION_QUERIES]; + OcclusionQueryHandle m_newOcclusionQueryHandle[BGFX_CONFIG_MAX_OCCLUSION_QUERIES]; NonLocalAllocator m_dynIndexBufferAllocator; bx::HandleAllocT m_dynamicIndexBufferHandle; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 343c2e28a..2c3d1e1a3 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -3247,6 +3247,17 @@ namespace bgfx { namespace gl m_needPresent = false; } } + + if (m_needPresent) + { + return; + } + + if (m_timerQuerySupport + && m_gpuTimer.hasPending() ) + { + GL_CHECK(glFinish() ); + } } void createIndexBuffer(IndexBufferHandle _handle, const Memory* _mem, uint16_t _flags) override diff --git a/src/renderer_gl.h b/src/renderer_gl.h index a0e38e044..4ffc91f42 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -1687,7 +1687,10 @@ namespace bgfx { namespace gl { while (0 == m_control.reserve(1) ) { - update(); + if (!update() ) + { + GL_CHECK(glFinish() ); + } } Result& result = m_result[_resultIdx]; @@ -1722,6 +1725,11 @@ namespace bgfx { namespace gl } } + bool hasPending() const + { + return 0 != m_control.getNumUsed(); + } + bool update() { if (0 != m_control.getNumUsed() ) diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index fbb111a98..d54eece7f 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -3821,6 +3821,8 @@ WGPU_IMPORT const bool isSwapChain = _fb.isSwapChain(); _murmur.add(isSwapChain); + _murmur.add(_fb.m_readOnlyDepth); + _murmur.add(_fb.m_readOnlyStencil); if (isSwapChain) { @@ -3840,8 +3842,6 @@ WGPU_IMPORT _murmur.add(NULL != _fb.m_depthStencilView); _murmur.add(_fb.m_formatDepthStencil); - _murmur.add(_fb.m_readOnlyDepth); - _murmur.add(_fb.m_readOnlyStencil); } void setDepthStencilState(WGPUDepthStencilState& _outDepthStencilState, TextureFormat::Enum _format, uint64_t _state, uint64_t _stencil, bool _readOnlyDepth, bool _readOnlyStencil, int32_t _depthBias = 0, float _slopeScale = 0.0f, float _biasClamp = 0.0f) @@ -5739,6 +5739,9 @@ WGPU_IMPORT m_width = bx::max(_desc.width, 1); m_height = bx::max(_desc.height, 1); + m_readOnlyDepth = false; + m_readOnlyStencil = false; + const bool result = m_swapChain.create(_desc.nwh, _desc); m_formatDepthStencil = m_swapChain.m_formatDepthStencil;