Backends: DX10, DX11, DX12: fixed a crash rendering multi-viewports if a ClearRenderTargetView() or CreateSwapChain() call failed. (#9546)

Likely to be incomplete for DX12.
This commit is contained in:
ocornut 2026-09-16 16:00:18 +02:00
parent d7950e2c42
commit 545d1a884a
4 changed files with 10 additions and 2 deletions

View File

@ -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_Data* bd = ImGui_ImplDX10_GetBackendData();
ImGui_ImplDX10_ViewportData* vd = (ImGui_ImplDX10_ViewportData*)viewport->RendererUserData; 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); ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
bd->pd3dDevice->OMSetRenderTargets(1, &vd->RTView, nullptr); bd->pd3dDevice->OMSetRenderTargets(1, &vd->RTView, nullptr);
if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear))
@ -792,7 +794,7 @@ void ImGui_ImplDX10_InitMultiViewportSupport()
platform_io.Renderer_CreateWindow = ImGui_ImplDX10_CreateWindow; platform_io.Renderer_CreateWindow = ImGui_ImplDX10_CreateWindow;
platform_io.Renderer_DestroyWindow = ImGui_ImplDX10_DestroyWindow; platform_io.Renderer_DestroyWindow = ImGui_ImplDX10_DestroyWindow;
platform_io.Renderer_SetWindowSize = ImGui_ImplDX10_SetWindowSize; 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; platform_io.Renderer_SwapBuffers = ImGui_ImplDX10_SwapBuffers;
} }

View File

@ -802,6 +802,8 @@ static void ImGui_ImplDX11_RenderWindow(ImGuiViewport* viewport, void*)
{ {
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
ImGui_ImplDX11_ViewportData* vd = (ImGui_ImplDX11_ViewportData*)viewport->RendererUserData; 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); ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
bd->pd3dDeviceContext->OMSetRenderTargets(1, &vd->RTView, nullptr); bd->pd3dDeviceContext->OMSetRenderTargets(1, &vd->RTView, nullptr);
if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear))

View File

@ -1256,6 +1256,8 @@ static void ImGui_ImplDX12_RenderWindow(ImGuiViewport* viewport, void*)
{ {
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
ImGui_ImplDX12_ViewportData* vd = (ImGui_ImplDX12_ViewportData*)viewport->RendererUserData; ImGui_ImplDX12_ViewportData* vd = (ImGui_ImplDX12_ViewportData*)viewport->RendererUserData;
if (vd->SwapChain == nullptr)
return;
ImGui_ImplDX12_FrameContext* frame_context = ImGui_WaitForNextFrameContext(vd); ImGui_ImplDX12_FrameContext* frame_context = ImGui_WaitForNextFrameContext(vd);
UINT back_buffer_idx = vd->SwapChain->GetCurrentBackBufferIndex(); UINT back_buffer_idx = vd->SwapChain->GetCurrentBackBufferIndex();

View File

@ -114,6 +114,8 @@ Other Changes:
Docking+Viewports Branch: Docking+Viewports Branch:
- Backends: - 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 - GLFW: fixed applying mouse cursor shapes to secondary viewports, broken in 1.92.6
when introducing a cache. (#9545) [@JamesWrigley] when introducing a cache. (#9545) [@JamesWrigley]
- Metal: fixed resizing windows losing framebuffer scale. (#6828, #8856) [@laikoken] - Metal: fixed resizing windows losing framebuffer scale. (#6828, #8856) [@laikoken]