mirror of https://github.com/ocornut/imgui
Backends: DX12, Viewports: Tidying up, renaming.
This commit is contained in:
parent
cb1d578470
commit
b626dd57d3
|
@ -50,7 +50,7 @@ static ID3D12DescriptorHeap* g_pd3dSrvDescHeap = NULL;
|
||||||
static UINT g_numFramesInFlight = 0;
|
static UINT g_numFramesInFlight = 0;
|
||||||
|
|
||||||
// Buffers used during the rendering of a frame
|
// Buffers used during the rendering of a frame
|
||||||
struct FrameResources
|
struct ImGui_ImplDX12_RenderBuffers
|
||||||
{
|
{
|
||||||
ID3D12Resource* IndexBuffer;
|
ID3D12Resource* IndexBuffer;
|
||||||
ID3D12Resource* VertexBuffer;
|
ID3D12Resource* VertexBuffer;
|
||||||
|
@ -59,28 +59,31 @@ struct FrameResources
|
||||||
};
|
};
|
||||||
|
|
||||||
// Buffers used for secondary viewports created by the multi-viewports systems
|
// Buffers used for secondary viewports created by the multi-viewports systems
|
||||||
struct FrameContext
|
struct ImGui_ImplDX12_FrameContext
|
||||||
{
|
{
|
||||||
ID3D12CommandAllocator* CommandAllocator;
|
ID3D12CommandAllocator* CommandAllocator;
|
||||||
ID3D12Resource* RenderTarget;
|
ID3D12Resource* RenderTarget;
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE RenderTargetCpuDescriptors;
|
D3D12_CPU_DESCRIPTOR_HANDLE RenderTargetCpuDescriptors;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper structure we store in the void* RendererUserData field of each ImGuiViewport to easily retrieve our backend data.
|
// Helper structure we store in the void* RendererUserData field of each ImGuiViewport to easily retrieve our backend data.
|
||||||
|
// Main viewport created by application will only use the Resources field.
|
||||||
|
// Secondary viewports created by this back-end will use all the fields (including Window fields),
|
||||||
struct ImGuiViewportDataDx12
|
struct ImGuiViewportDataDx12
|
||||||
{
|
{
|
||||||
ID3D12CommandQueue* CommandQueue;
|
// Window
|
||||||
ID3D12GraphicsCommandList* CommandList;
|
ID3D12CommandQueue* CommandQueue;
|
||||||
ID3D12DescriptorHeap* RtvDescHeap;
|
ID3D12GraphicsCommandList* CommandList;
|
||||||
IDXGISwapChain3* SwapChain;
|
ID3D12DescriptorHeap* RtvDescHeap;
|
||||||
|
IDXGISwapChain3* SwapChain;
|
||||||
|
ID3D12Fence* Fence;
|
||||||
|
UINT64 FenceSignaledValue;
|
||||||
|
HANDLE FenceEvent;
|
||||||
|
ImGui_ImplDX12_FrameContext* FrameCtx;
|
||||||
|
|
||||||
ID3D12Fence* Fence;
|
// Render buffers
|
||||||
UINT64 FenceSignaledValue;
|
UINT FrameIndex;
|
||||||
HANDLE FenceEvent;
|
ImGui_ImplDX12_RenderBuffers* FrameRenderBuffers;
|
||||||
|
|
||||||
UINT FrameIndex;
|
|
||||||
FrameContext* FrameCtx;
|
|
||||||
FrameResources* Resources;
|
|
||||||
|
|
||||||
ImGuiViewportDataDx12()
|
ImGuiViewportDataDx12()
|
||||||
{
|
{
|
||||||
|
@ -88,13 +91,12 @@ struct ImGuiViewportDataDx12
|
||||||
CommandList = NULL;
|
CommandList = NULL;
|
||||||
RtvDescHeap = NULL;
|
RtvDescHeap = NULL;
|
||||||
SwapChain = NULL;
|
SwapChain = NULL;
|
||||||
|
|
||||||
Fence = NULL;
|
Fence = NULL;
|
||||||
FenceSignaledValue = 0;
|
FenceSignaledValue = 0;
|
||||||
FenceEvent = NULL;
|
FenceEvent = NULL;
|
||||||
|
FrameCtx = new ImGui_ImplDX12_FrameContext[g_numFramesInFlight];
|
||||||
FrameIndex = UINT_MAX;
|
FrameIndex = UINT_MAX;
|
||||||
FrameCtx = new FrameContext[g_numFramesInFlight];
|
FrameRenderBuffers = new ImGui_ImplDX12_RenderBuffers[g_numFramesInFlight];
|
||||||
Resources = new FrameResources[g_numFramesInFlight];
|
|
||||||
|
|
||||||
for (UINT i = 0; i < g_numFramesInFlight; ++i)
|
for (UINT i = 0; i < g_numFramesInFlight; ++i)
|
||||||
{
|
{
|
||||||
|
@ -102,10 +104,10 @@ struct ImGuiViewportDataDx12
|
||||||
FrameCtx[i].RenderTarget = NULL;
|
FrameCtx[i].RenderTarget = NULL;
|
||||||
|
|
||||||
// Create buffers with a default size (they will later be grown as needed)
|
// Create buffers with a default size (they will later be grown as needed)
|
||||||
Resources[i].IndexBuffer = NULL;
|
FrameRenderBuffers[i].IndexBuffer = NULL;
|
||||||
Resources[i].VertexBuffer = NULL;
|
FrameRenderBuffers[i].VertexBuffer = NULL;
|
||||||
Resources[i].VertexBufferSize = 5000;
|
FrameRenderBuffers[i].VertexBufferSize = 5000;
|
||||||
Resources[i].IndexBufferSize = 10000;
|
FrameRenderBuffers[i].IndexBufferSize = 10000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
~ImGuiViewportDataDx12()
|
~ImGuiViewportDataDx12()
|
||||||
|
@ -119,11 +121,11 @@ struct ImGuiViewportDataDx12
|
||||||
for (UINT i = 0; i < g_numFramesInFlight; ++i)
|
for (UINT i = 0; i < g_numFramesInFlight; ++i)
|
||||||
{
|
{
|
||||||
IM_ASSERT(FrameCtx[i].CommandAllocator == NULL && FrameCtx[i].RenderTarget == NULL);
|
IM_ASSERT(FrameCtx[i].CommandAllocator == NULL && FrameCtx[i].RenderTarget == NULL);
|
||||||
IM_ASSERT(Resources[i].IndexBuffer == NULL && Resources[i].VertexBuffer == NULL);
|
IM_ASSERT(FrameRenderBuffers[i].IndexBuffer == NULL && FrameRenderBuffers[i].VertexBuffer == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] FrameCtx; FrameCtx = NULL;
|
delete[] FrameCtx; FrameCtx = NULL;
|
||||||
delete[] Resources; Resources = NULL;
|
delete[] FrameRenderBuffers; FrameRenderBuffers = NULL;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -135,11 +137,11 @@ static void SafeRelease(T*& res)
|
||||||
res = NULL;
|
res = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui_ImplDX12_DestroyFrameResources(FrameResources* resources)
|
static void ImGui_ImplDX12_DestroyRenderBuffers(ImGui_ImplDX12_RenderBuffers* render_buffers)
|
||||||
{
|
{
|
||||||
SafeRelease(resources->IndexBuffer);
|
SafeRelease(render_buffers->IndexBuffer);
|
||||||
SafeRelease(resources->VertexBuffer);
|
SafeRelease(render_buffers->VertexBuffer);
|
||||||
resources->IndexBufferSize = resources->VertexBufferSize = 0;
|
render_buffers->IndexBufferSize = render_buffers->VertexBufferSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct VERTEX_CONSTANT_BUFFER
|
struct VERTEX_CONSTANT_BUFFER
|
||||||
|
@ -151,7 +153,7 @@ struct VERTEX_CONSTANT_BUFFER
|
||||||
static void ImGui_ImplDX12_InitPlatformInterface();
|
static void ImGui_ImplDX12_InitPlatformInterface();
|
||||||
static void ImGui_ImplDX12_ShutdownPlatformInterface();
|
static void ImGui_ImplDX12_ShutdownPlatformInterface();
|
||||||
|
|
||||||
static void ImGui_ImplDX12_SetupRenderState(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx, FrameResources* fr)
|
static void ImGui_ImplDX12_SetupRenderState(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx, ImGui_ImplDX12_RenderBuffers* fr)
|
||||||
{
|
{
|
||||||
// Setup orthographic projection matrix into our constant buffer
|
// Setup orthographic projection matrix into our constant buffer
|
||||||
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
|
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
|
||||||
|
@ -216,7 +218,7 @@ void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandL
|
||||||
|
|
||||||
ImGuiViewportDataDx12* render_data = (ImGuiViewportDataDx12*)draw_data->OwnerViewport->RendererUserData;
|
ImGuiViewportDataDx12* render_data = (ImGuiViewportDataDx12*)draw_data->OwnerViewport->RendererUserData;
|
||||||
render_data->FrameIndex++;
|
render_data->FrameIndex++;
|
||||||
FrameResources* fr = &render_data->Resources[render_data->FrameIndex % g_numFramesInFlight];
|
ImGui_ImplDX12_RenderBuffers* fr = &render_data->FrameRenderBuffers[render_data->FrameIndex % g_numFramesInFlight];
|
||||||
|
|
||||||
// Create and grow vertex/index buffers if needed
|
// Create and grow vertex/index buffers if needed
|
||||||
if (fr->VertexBuffer == NULL || fr->VertexBufferSize < draw_data->TotalVtxCount)
|
if (fr->VertexBuffer == NULL || fr->VertexBufferSize < draw_data->TotalVtxCount)
|
||||||
|
@ -729,7 +731,7 @@ void ImGui_ImplDX12_Shutdown()
|
||||||
{
|
{
|
||||||
// We could just call ImGui_ImplDX12_DestroyWindow(main_viewport) as a convenience but that would be misleading since we only use data->Resources[]
|
// We could just call ImGui_ImplDX12_DestroyWindow(main_viewport) as a convenience but that would be misleading since we only use data->Resources[]
|
||||||
for (UINT i = 0; i < g_numFramesInFlight; i++)
|
for (UINT i = 0; i < g_numFramesInFlight; i++)
|
||||||
ImGui_ImplDX12_DestroyFrameResources(&data->Resources[i]);
|
ImGui_ImplDX12_DestroyRenderBuffers(&data->FrameRenderBuffers[i]);
|
||||||
IM_DELETE(data);
|
IM_DELETE(data);
|
||||||
main_viewport->RendererUserData = NULL;
|
main_viewport->RendererUserData = NULL;
|
||||||
}
|
}
|
||||||
|
@ -859,7 +861,7 @@ static void ImGui_ImplDX12_CreateWindow(ImGuiViewport* viewport)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (UINT i = 0; i < g_numFramesInFlight; i++)
|
for (UINT i = 0; i < g_numFramesInFlight; i++)
|
||||||
ImGui_ImplDX12_DestroyFrameResources(&data->Resources[i]);
|
ImGui_ImplDX12_DestroyRenderBuffers(&data->FrameRenderBuffers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui_WaitForPendingOperations(ImGuiViewportDataDx12* data)
|
static void ImGui_WaitForPendingOperations(ImGuiViewportDataDx12* data)
|
||||||
|
@ -895,7 +897,7 @@ static void ImGui_ImplDX12_DestroyWindow(ImGuiViewport* viewport)
|
||||||
{
|
{
|
||||||
SafeRelease(data->FrameCtx[i].RenderTarget);
|
SafeRelease(data->FrameCtx[i].RenderTarget);
|
||||||
SafeRelease(data->FrameCtx[i].CommandAllocator);
|
SafeRelease(data->FrameCtx[i].CommandAllocator);
|
||||||
ImGui_ImplDX12_DestroyFrameResources(&data->Resources[i]);
|
ImGui_ImplDX12_DestroyRenderBuffers(&data->FrameRenderBuffers[i]);
|
||||||
}
|
}
|
||||||
IM_DELETE(data);
|
IM_DELETE(data);
|
||||||
}
|
}
|
||||||
|
@ -928,7 +930,7 @@ static void ImGui_ImplDX12_RenderWindow(ImGuiViewport* viewport, void*)
|
||||||
{
|
{
|
||||||
ImGuiViewportDataDx12* data = (ImGuiViewportDataDx12*)viewport->RendererUserData;
|
ImGuiViewportDataDx12* data = (ImGuiViewportDataDx12*)viewport->RendererUserData;
|
||||||
|
|
||||||
FrameContext* frame_context = &data->FrameCtx[data->FrameIndex % g_numFramesInFlight];
|
ImGui_ImplDX12_FrameContext* frame_context = &data->FrameCtx[data->FrameIndex % g_numFramesInFlight];
|
||||||
UINT back_buffer_idx = data->SwapChain->GetCurrentBackBufferIndex();
|
UINT back_buffer_idx = data->SwapChain->GetCurrentBackBufferIndex();
|
||||||
|
|
||||||
const ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
const ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
Loading…
Reference in New Issue