diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 9c77565ed..9ad1b6fe0 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -1806,6 +1806,16 @@ namespace bgfx { namespace d3d11 void createFrameBuffer(FrameBufferHandle _handle, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _format, TextureFormat::Enum _depthFormat) override { + for (uint32_t ii = 0, num = m_numWindows; ii < num; ++ii) + { + FrameBufferHandle handle = m_windows[ii]; + if (isValid(handle) + && m_frameBuffers[handle.idx].m_nwh == _nwh) + { + destroyFrameBuffer(handle); + } + } + uint16_t denseIdx = m_numWindows++; m_windows[denseIdx] = _handle; m_frameBuffers[_handle.idx].create(denseIdx, _nwh, _width, _height, _format, _depthFormat); @@ -1820,8 +1830,12 @@ namespace bgfx { namespace d3d11 if (m_numWindows > 1) { FrameBufferHandle handle = m_windows[m_numWindows]; - m_windows[denseIdx] = handle; - m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + m_windows[m_numWindows] = {kInvalidHandle}; + if (m_numWindows != denseIdx) + { + m_windows[denseIdx] = handle; + m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + } } } } @@ -4564,6 +4578,7 @@ namespace bgfx { namespace d3d11 DX_RELEASE(depthStencil, 0); m_srv[0] = NULL; + m_nwh = _nwh; m_denseIdx = _denseIdx; m_num = 1; } @@ -4575,6 +4590,7 @@ namespace bgfx { namespace d3d11 DX_RELEASE(m_swapChain, 0); m_num = 0; + m_nwh = NULL; m_numTh = 0; m_needPresent = false; diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index 6740e62bb..9786547b4 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -305,6 +305,7 @@ namespace bgfx { namespace d3d11 FrameBufferD3D11() : m_dsv(NULL) , m_swapChain(NULL) + , m_nwh(NULL) , m_width(0) , m_height(0) , m_denseIdx(UINT16_MAX) @@ -328,6 +329,7 @@ namespace bgfx { namespace d3d11 ID3D11ShaderResourceView* m_srv[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS-1]; ID3D11DepthStencilView* m_dsv; Dxgi::SwapChainI* m_swapChain; + void* m_nwh; uint32_t m_width; uint32_t m_height; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index cd49c6285..09e183fa0 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -1658,11 +1658,13 @@ namespace bgfx { namespace d3d12 { finishAll(true); - for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii) + for (uint32_t ii = 0, num = m_numWindows; ii < num; ++ii) { - if (m_frameBuffers[ii].m_nwh == _nwh) + FrameBufferHandle handle = m_windows[ii]; + if (isValid(handle) + && m_frameBuffers[handle.idx].m_nwh == _nwh) { - m_frameBuffers[ii].destroy(); + destroyFrameBuffer(handle); } } @@ -1687,8 +1689,12 @@ namespace bgfx { namespace d3d12 if (m_numWindows > 1) { FrameBufferHandle handle = m_windows[m_numWindows]; - m_windows[denseIdx] = handle; - m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + m_windows[m_numWindows] = {kInvalidHandle}; + if (m_numWindows != denseIdx) + { + m_windows[denseIdx] = handle; + m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + } } } } diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 97ecee55f..789cb214e 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -1161,8 +1161,12 @@ namespace bgfx { namespace d3d9 if (m_numWindows > 1) { FrameBufferHandle handle = m_windows[m_numWindows]; - m_windows[denseIdx] = handle; - m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + m_windows[m_numWindows] = {kInvalidHandle}; + if (m_numWindows != denseIdx) + { + m_windows[denseIdx] = handle; + m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + } } } } diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 8219b4ef5..273b4afa8 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -2881,8 +2881,12 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) ); if (m_numWindows > 1) { FrameBufferHandle handle = m_windows[m_numWindows]; - m_windows[denseIdx] = handle; - m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + m_windows[m_numWindows] = {kInvalidHandle}; + if (m_numWindows != denseIdx) + { + m_windows[denseIdx] = handle; + m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + } } } } diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index cf1013502..76f1ed9cb 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -937,8 +937,12 @@ namespace bgfx { namespace mtl if (m_numWindows > 1) { FrameBufferHandle handle = m_windows[m_numWindows]; - m_windows[denseIdx] = handle; - m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + m_windows[m_numWindows] = {kInvalidHandle}; + if (m_numWindows != denseIdx) + { + m_windows[denseIdx] = handle; + m_frameBuffers[handle.idx].m_denseIdx = denseIdx; + } } } }