Skip to content

Commit

Permalink
Backends: DX12: Fixed OBJECT_DELETED_WHILE_STILL_IN_USE on viewport r…
Browse files Browse the repository at this point in the history
…esizing. (#3210)

Tested with detaching/attaching a viewport and resizing it. DX12 debug
layer is clean.
  • Loading branch information
IvanZinkevich authored and ocornut committed May 8, 2020
1 parent 8596f2b commit 1e7672a
Showing 1 changed file with 17 additions and 11 deletions.
28 changes: 17 additions & 11 deletions examples/imgui_impl_dx12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand Down

0 comments on commit 1e7672a

Please sign in to comment.