浏览代码

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.

Ivan Zinkevich 5 年之前
父节点
当前提交
1e7672acf4
共有 1 个文件被更改,包括 17 次插入11 次删除
  1. 17 11
      examples/imgui_impl_dx12.cpp

+ 17 - 11
examples/imgui_impl_dx12.cpp

@@ -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);