From 545d1a884ab7be89bbab4600a649a206c8667773 Mon Sep 17 00:00:00 2001 From: ocornut Date: Wed, 16 Sep 2026 16:00:18 +0200 Subject: [PATCH] Backends: DX10, DX11, DX12: fixed a crash rendering multi-viewports if a ClearRenderTargetView() or CreateSwapChain() call failed. (#9546) Likely to be incomplete for DX12. --- backends/imgui_impl_dx10.cpp | 6 ++++-- backends/imgui_impl_dx11.cpp | 2 ++ backends/imgui_impl_dx12.cpp | 2 ++ docs/CHANGELOG.txt | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/backends/imgui_impl_dx10.cpp b/backends/imgui_impl_dx10.cpp index 18bd637f3..3878916da 100644 --- a/backends/imgui_impl_dx10.cpp +++ b/backends/imgui_impl_dx10.cpp @@ -768,10 +768,12 @@ static void ImGui_ImplDX10_SetWindowSize(ImGuiViewport* viewport, ImVec2 size) } } -static void ImGui_ImplDX10_RenderViewport(ImGuiViewport* viewport, void*) +static void ImGui_ImplDX10_RenderWindow(ImGuiViewport* viewport, void*) { ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); ImGui_ImplDX10_ViewportData* vd = (ImGui_ImplDX10_ViewportData*)viewport->RendererUserData; + if (vd->RTView == nullptr) // Swap chain creation or resize failed (e.g. device removed) + return; ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); bd->pd3dDevice->OMSetRenderTargets(1, &vd->RTView, nullptr); if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) @@ -792,7 +794,7 @@ void ImGui_ImplDX10_InitMultiViewportSupport() platform_io.Renderer_CreateWindow = ImGui_ImplDX10_CreateWindow; platform_io.Renderer_DestroyWindow = ImGui_ImplDX10_DestroyWindow; platform_io.Renderer_SetWindowSize = ImGui_ImplDX10_SetWindowSize; - platform_io.Renderer_RenderWindow = ImGui_ImplDX10_RenderViewport; + platform_io.Renderer_RenderWindow = ImGui_ImplDX10_RenderWindow; platform_io.Renderer_SwapBuffers = ImGui_ImplDX10_SwapBuffers; } diff --git a/backends/imgui_impl_dx11.cpp b/backends/imgui_impl_dx11.cpp index 64aaed799..a919a8a88 100644 --- a/backends/imgui_impl_dx11.cpp +++ b/backends/imgui_impl_dx11.cpp @@ -802,6 +802,8 @@ static void ImGui_ImplDX11_RenderWindow(ImGuiViewport* viewport, void*) { ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); ImGui_ImplDX11_ViewportData* vd = (ImGui_ImplDX11_ViewportData*)viewport->RendererUserData; + if (vd->RTView == nullptr) // Swap chain creation or resize failed (e.g. device removed) + return; ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); bd->pd3dDeviceContext->OMSetRenderTargets(1, &vd->RTView, nullptr); if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) diff --git a/backends/imgui_impl_dx12.cpp b/backends/imgui_impl_dx12.cpp index af0aae730..124879df3 100644 --- a/backends/imgui_impl_dx12.cpp +++ b/backends/imgui_impl_dx12.cpp @@ -1256,6 +1256,8 @@ static void ImGui_ImplDX12_RenderWindow(ImGuiViewport* viewport, void*) { ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); ImGui_ImplDX12_ViewportData* vd = (ImGui_ImplDX12_ViewportData*)viewport->RendererUserData; + if (vd->SwapChain == nullptr) + return; ImGui_ImplDX12_FrameContext* frame_context = ImGui_WaitForNextFrameContext(vd); UINT back_buffer_idx = vd->SwapChain->GetCurrentBackBufferIndex(); diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 376f86873..94385d264 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -114,6 +114,8 @@ Other Changes: Docking+Viewports Branch: - Backends: + - DX10, DX11, DX12: fixed crash when CreateSwapChain() or CreateRenderTargetView() + calls are failing. (#9546) - GLFW: fixed applying mouse cursor shapes to secondary viewports, broken in 1.92.6 when introducing a cache. (#9545) [@JamesWrigley] - Metal: fixed resizing windows losing framebuffer scale. (#6828, #8856) [@laikoken]