From 3ca5a634288ac960b973eaeffdedafb02fdcc67c Mon Sep 17 00:00:00 2001 From: vrimar <5660247+vrimar@users.noreply.github.com> Date: Thu, 17 Sep 2026 21:05:41 -0400 Subject: [PATCH] Recreate the main swap chain when only its flags change on reset. (#3986) Context::reset moves the per-surface flags (MSAA, sRGB, HiDPI) off the reset flags onto SwapChain::flags, but every backend's updateResolution gate still compared only the stripped reset flags, so a runtime MSAA change was dropped. (cherry picked from commit 1ffb270f91a63403c069fcf652bd2411d962b437) --- src/renderer_d3d11.cpp | 1 + src/renderer_d3d12.cpp | 1 + src/renderer_gl.cpp | 1 + src/renderer_mtl.cpp | 1 + src/renderer_vk.cpp | 1 + src/renderer_webgpu.cpp | 1 + 6 files changed, 6 insertions(+) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index cbcb76237..e0af1e45d 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -2541,6 +2541,7 @@ namespace bgfx { namespace d3d11 || m_mainSwapChain.formatDepthStencil != _swapChain.formatDepthStencil || m_mainSwapChain.nwh != _swapChain.nwh || m_mainSwapChain.ndt != _swapChain.ndt + || m_mainSwapChain.flags != _swapChain.flags || (m_reset&maskFlags) != (_reset&maskFlags) ) { diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index b1d12e5f7..19f4d1c72 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -3206,6 +3206,7 @@ namespace bgfx { namespace d3d12 || m_mainSwapChain.formatDepthStencil != _swapChain.formatDepthStencil || m_mainSwapChain.nwh != _swapChain.nwh || m_mainSwapChain.ndt != _swapChain.ndt + || m_mainSwapChain.flags != _swapChain.flags || (m_reset&maskFlags) != (_reset&maskFlags) ) { uint32_t flags = _reset & (~BGFX_RESET_INTERNAL_FORCE); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index cafc8fcfc..b0cf366c1 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -4010,6 +4010,7 @@ namespace bgfx { namespace gl || m_mainSwapChain.height != _swapChain.height || m_mainSwapChain.nwh != _swapChain.nwh || m_mainSwapChain.ndt != _swapChain.ndt + || m_mainSwapChain.flags != _swapChain.flags || (m_reset&maskFlags) != (_reset&maskFlags) ) { uint32_t flags = _reset & (~BGFX_RESET_INTERNAL_FORCE); diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp index 3f7cef368..78bed9efc 100644 --- a/src/renderer_mtl.cpp +++ b/src/renderer_mtl.cpp @@ -2131,6 +2131,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames || m_mainSwapChain.height != _swapChain.height || m_mainSwapChain.nwh != _swapChain.nwh || m_mainSwapChain.ndt != _swapChain.ndt + || m_mainSwapChain.flags != _swapChain.flags || (m_reset&maskFlags) != (_reset&maskFlags) ) { m_mainSwapChain = _swapChain; diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index 853e65055..b9aefc034 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -3290,6 +3290,7 @@ VK_IMPORT_DEVICE || m_mainSwapChain.height != _swapChain.height || m_mainSwapChain.nwh != _swapChain.nwh || m_mainSwapChain.ndt != _swapChain.ndt + || m_mainSwapChain.flags != _swapChain.flags || (m_reset&maskFlags) != (_reset&maskFlags) || m_backBuffer.m_swapChain.m_needToRecreateSurface || m_backBuffer.m_swapChain.m_needToRecreateSwapchain diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index 4fb260c70..63a159925 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -2696,6 +2696,7 @@ WGPU_IMPORT || m_mainSwapChain.height != _swapChain.height || m_mainSwapChain.nwh != _swapChain.nwh || m_mainSwapChain.ndt != _swapChain.ndt + || m_mainSwapChain.flags != _swapChain.flags || m_reset != flags ) {