mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Backends: DX12: Fixed OBJECT_DELETED_WHILE_STILL_IN_USE on viewport resizing. (#3210)
Tested with detaching/attaching a viewport and resizing it. DX12 debug layer is clean.
This commit is contained in:
		| @@ -846,22 +846,26 @@ static void ImGui_ImplDX12_CreateWindow(ImGuiViewport* viewport) | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void ImGui_WaitForPendingOperations(ImGuiViewportDataDx12* data) | ||||
| { | ||||
|     HRESULT hr = S_FALSE; | ||||
|     if (data && data->CommandQueue && data->Fence && data->FenceEvent) | ||||
|     { | ||||
|         hr = data->CommandQueue->Signal(data->Fence, ++data->FenceSignaledValue); | ||||
|         IM_ASSERT(hr == S_OK); | ||||
|         ::WaitForSingleObject(data->FenceEvent, 0); // Reset any forgotten waits | ||||
|         hr = data->Fence->SetEventOnCompletion(data->FenceSignaledValue, data->FenceEvent); | ||||
|         IM_ASSERT(hr == S_OK); | ||||
|         ::WaitForSingleObject(data->FenceEvent, INFINITE); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void ImGui_ImplDX12_DestroyWindow(ImGuiViewport* viewport) | ||||
| { | ||||
|     // The main viewport (owned by the application) will always have RendererUserData == NULL since we didn't create the data for it. | ||||
|     if (ImGuiViewportDataDx12* data = (ImGuiViewportDataDx12*)viewport->RendererUserData) | ||||
|     { | ||||
|         // Wait for pending operations to complete to safely release objects below | ||||
|         HRESULT hr; | ||||
|         if (data->CommandQueue && data->Fence && data->FenceEvent) | ||||
|         { | ||||
|            hr = data->CommandQueue->Signal(data->Fence, ++data->FenceSignaledValue); | ||||
|            IM_ASSERT(hr == S_OK); | ||||
|            ::WaitForSingleObject(data->FenceEvent, 0); // Reset any forgotten waits | ||||
|            hr = data->Fence->SetEventOnCompletion(data->FenceSignaledValue, data->FenceEvent); | ||||
|            IM_ASSERT(hr == S_OK); | ||||
|            ::WaitForSingleObject(data->FenceEvent, INFINITE); | ||||
|         } | ||||
|         ImGui_WaitForPendingOperations(data); | ||||
|  | ||||
|         SafeRelease(data->CommandQueue); | ||||
|         SafeRelease(data->CommandList); | ||||
| @@ -887,6 +891,8 @@ static void ImGui_ImplDX12_SetWindowSize(ImGuiViewport* viewport, ImVec2 size) | ||||
| { | ||||
|     ImGuiViewportDataDx12* data = (ImGuiViewportDataDx12*)viewport->RendererUserData; | ||||
|  | ||||
|     ImGui_WaitForPendingOperations(data); | ||||
|  | ||||
|     for (UINT i = 0; i < g_numFramesInFlight; i++) | ||||
|         SafeRelease(data->FrameCtx[i].RenderTarget); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user