From 7a38c5ce830929f8d6a4c2d76ca79bad8f730c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Thu, 30 Jul 2026 11:15:29 -0700 Subject: [PATCH] D3D11/D3D12/GL: Fixed blit ordering: submit blits after the previous framebuffer resolve and before the view clear. (#3862) --- src/renderer_d3d11.cpp | 15 +++++++++++---- src/renderer_d3d12.cpp | 26 ++++++++++++++++++-------- src/renderer_gl.cpp | 22 ++++++++++++++++++---- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index a934c264b..f1c1ded44 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -2764,7 +2764,7 @@ namespace bgfx { namespace d3d11 } } - void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true, bool _needPresent = true) + void resolveFrameBuffer(FrameBufferHandle _fbh) { if (isValid(m_fbh) && m_fbh.idx != _fbh.idx @@ -2772,7 +2772,13 @@ namespace bgfx { namespace d3d11 { FrameBufferD3D11& frameBuffer = m_frameBuffers[m_fbh.idx]; frameBuffer.resolve(); + m_rtMsaa = false; } + } + + void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true, bool _needPresent = true) + { + resolveFrameBuffer(_fbh); if (!isValid(_fbh) ) { @@ -6223,6 +6229,10 @@ namespace bgfx { namespace d3d11 profiler.begin(view); + resolveFrameBuffer(_render->m_view[view].m_fbh); + submitUniformCache(ucs, view); + submitBlit(bs, view); + if (_render->m_view[view].m_fbh.idx != fbh.idx) { fbh = _render->m_view[view].m_fbh; @@ -6251,9 +6261,6 @@ namespace bgfx { namespace d3d11 clearQuad(_clearQuad, clippedRect, clr, _render->m_colorPalette); prim = s_primInfo[Topology::Count]; // Force primitive type update after clear quad. } - - submitUniformCache(ucs, view); - submitBlit(bs, view); } if (isCompute) diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 7ede5c8f7..c4a942c2d 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -3176,18 +3176,27 @@ namespace bgfx { namespace d3d12 return result; } + void resolveFrameBuffer(FrameBufferHandle _fbh) + { + if (isValid(m_fbh) + && m_fbh.idx != _fbh.idx + && m_rtMsaa) + { + FrameBufferD3D12& frameBuffer = m_frameBuffers[m_fbh.idx]; + frameBuffer.resolve(); + m_rtMsaa = false; + } + } + void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true) { + resolveFrameBuffer(_fbh); + if (isValid(m_fbh) && m_fbh.idx != _fbh.idx) { FrameBufferD3D12& frameBuffer = m_frameBuffers[m_fbh.idx]; - if (m_rtMsaa) - { - frameBuffer.resolve(); - } - if (NULL == frameBuffer.m_swapChain) { for (uint8_t ii = 0, num = frameBuffer.m_num; ii < num; ++ii) @@ -8050,6 +8059,10 @@ namespace bgfx { namespace d3d12 const View& renderView = _render->m_view[view]; + resolveFrameBuffer(renderView.m_fbh); + submitUniformCache(ucs, view); + submitBlit(bs, view); + fbh = _render->m_view[view].m_fbh; setFrameBuffer(fbh); @@ -8088,9 +8101,6 @@ namespace bgfx { namespace d3d12 prim = s_primInfo[Topology::Count]; // Force primitive type update. - submitUniformCache(ucs, view); - submitBlit(bs, view); - if (m_variableRateShadingSupport) { reinterpret_cast(m_commandList)->RSSetShadingRate(s_shadingRate[renderView.m_shadingRate], NULL); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index dae5352f4..f5af1a762 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -3978,13 +3978,26 @@ namespace bgfx { namespace gl ); } + void resolveFrameBuffer(FrameBufferHandle _fbh) + { + if (isValid(m_fbh) + && m_fbh.idx != _fbh.idx + && m_rtMsaa) + { + FrameBufferGL& frameBuffer = m_frameBuffers[m_fbh.idx]; + frameBuffer.resolve(); + m_rtMsaa = false; + } + } + uint32_t setFrameBuffer(FrameBufferHandle _fbh, uint32_t _height, uint16_t _discard = BGFX_CLEAR_NONE, bool _msaa = true) { + resolveFrameBuffer(_fbh); + if (isValid(m_fbh) && m_fbh.idx != _fbh.idx) { FrameBufferGL& frameBuffer = m_frameBuffers[m_fbh.idx]; - frameBuffer.resolve(); if (BGFX_CLEAR_NONE != m_fbDiscard) { @@ -7925,6 +7938,10 @@ namespace bgfx { namespace gl BGFX_GL_PROFILER_END(); + resolveFrameBuffer(_render->m_view[view].m_fbh); + submitUniformCache(ucs, view); + submitBlit(bs, view); + if (_render->m_view[view].m_fbh.idx != fbh.idx) { fbh = _render->m_view[view].m_fbh; @@ -7963,9 +7980,6 @@ namespace bgfx { namespace gl GL_CHECK(glDepthFunc(GL_LESS) ); GL_CHECK(glEnable(GL_CULL_FACE) ); GL_CHECK(glDisable(GL_BLEND) ); - - submitUniformCache(ucs, view); - submitBlit(bs, view); } if (isCompute)