simplified stuff

This commit is contained in:
2026-06-29 15:08:11 +03:00
parent 0a072b0d56
commit 8b4614eb89
+83 -36
View File
@@ -283,41 +283,56 @@ namespace
} }
} }
void on_present(IDXGISwapChain* swap_chain, UINT, UINT) bool ensure_initialized(IDXGISwapChain* swap_chain)
{ {
if (!g_initialized) if (g_initialized)
{ return true;
if (!g_init_attempted && g_command_queue)
init(swap_chain);
return;
}
if (!g_command_queue) if (!g_init_attempted && g_command_queue)
return; init(swap_chain);
if (g_frames.empty() || !g_rtv_heap) return false;
{ }
if (!create_render_targets(swap_chain))
return;
}
if (!g_command_list) bool ensure_render_targets(IDXGISwapChain* swap_chain)
{ {
if (!create_command_objects()) if (!g_frames.empty() && g_rtv_heap)
return; return true;
}
if (!g_fence) return create_render_targets(swap_chain);
{ }
if (!create_sync_objects())
return;
}
bool ensure_command_list()
{
if (g_command_list)
return true;
return create_command_objects();
}
bool ensure_sync_ready()
{
if (g_fence)
return true;
return create_sync_objects();
}
bool ensure_present_resources(IDXGISwapChain* swap_chain)
{
if (!ensure_initialized(swap_chain) || !g_command_queue)
return false;
return ensure_render_targets(swap_chain) && ensure_command_list() && ensure_sync_ready();
}
bool begin_imgui_frame()
{
if (GetAsyncKeyState(VK_INSERT) & 1) if (GetAsyncKeyState(VK_INSERT) & 1)
show_menu = !show_menu; show_menu = !show_menu;
if (!show_menu) if (!show_menu)
return; return false;
ImGui_ImplDX12_NewFrame(); ImGui_ImplDX12_NewFrame();
ImGui_ImplWin32_NewFrame(); ImGui_ImplWin32_NewFrame();
@@ -325,45 +340,77 @@ namespace
ImGui::GetIO().MouseDrawCursor = true; ImGui::GetIO().MouseDrawCursor = true;
ImGui::ShowDemoWindow(); ImGui::ShowDemoWindow();
ImGui::EndFrame(); ImGui::EndFrame();
return true;
}
frame_context* current_frame_context()
{
const UINT buf_idx = g_swap_chain->GetCurrentBackBufferIndex(); const UINT buf_idx = g_swap_chain->GetCurrentBackBufferIndex();
if (buf_idx >= g_frames.size()) if (buf_idx >= g_frames.size())
return; return nullptr;
auto& fc = g_frames[buf_idx]; return &g_frames[buf_idx];
}
bool reset_overlay_command_list(frame_context& fc)
{
wait_for_frame(fc); wait_for_frame(fc);
// Both resets depend on wait_for_frame(); otherwise DLSSG/Streamline can observe invalid GPU work. // Both resets depend on wait_for_frame(); otherwise DLSSG/Streamline can observe invalid GPU work.
if (FAILED(fc.command_allocator->Reset())) if (FAILED(fc.command_allocator->Reset()))
return; return false;
if (FAILED(g_command_list->Reset(fc.command_allocator, nullptr))) if (FAILED(g_command_list->Reset(fc.command_allocator, nullptr)))
return; return false;
return true;
}
void transition_render_target(frame_context& fc, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after)
{
D3D12_RESOURCE_BARRIER barrier{}; D3D12_RESOURCE_BARRIER barrier{};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
barrier.Transition.pResource = fc.render_target; barrier.Transition.pResource = fc.render_target;
barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; barrier.Transition.StateBefore = before;
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; barrier.Transition.StateAfter = after;
g_command_list->ResourceBarrier(1, &barrier); g_command_list->ResourceBarrier(1, &barrier);
}
void record_overlay_commands(frame_context& fc)
{
transition_render_target(fc, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
g_command_list->OMSetRenderTargets(1, &fc.rtv_handle, FALSE, nullptr); g_command_list->OMSetRenderTargets(1, &fc.rtv_handle, FALSE, nullptr);
g_command_list->SetDescriptorHeaps(1, &g_srv_heap); g_command_list->SetDescriptorHeaps(1, &g_srv_heap);
ImGui::Render(); ImGui::Render();
ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_command_list); ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_command_list);
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; transition_render_target(fc, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT; }
g_command_list->ResourceBarrier(1, &barrier);
bool submit_overlay_commands(frame_context& fc)
{
if (FAILED(g_command_list->Close())) if (FAILED(g_command_list->Close()))
return; return false;
ID3D12CommandList* cmd_lists[] = {g_command_list}; ID3D12CommandList* cmd_lists[] = {g_command_list};
g_command_queue->ExecuteCommandLists(1, cmd_lists); g_command_queue->ExecuteCommandLists(1, cmd_lists);
std::ignore = signal_frame(fc); return signal_frame(fc);
}
void on_present(IDXGISwapChain* swap_chain, UINT, UINT)
{
if (!ensure_present_resources(swap_chain) || !begin_imgui_frame())
return;
frame_context* fc = current_frame_context();
if (!fc || !reset_overlay_command_list(*fc))
return;
record_overlay_commands(*fc);
std::ignore = submit_overlay_commands(*fc);
} }
void on_resize_buffers(IDXGISwapChain*, UINT, UINT, UINT, DXGI_FORMAT, UINT) void on_resize_buffers(IDXGISwapChain*, UINT, UINT, UINT, DXGI_FORMAT, UINT)