#include "D3D12WindowRenderLoop.h" namespace XCEngine::UI::Editor::Host { bool RenderD3D12WindowFrame( D3D12WindowRenderer& windowRenderer, const float clearColor[4], const D3D12WindowRenderCallback& beforePresent, const D3D12WindowRenderCallback& afterPresent) { const ::XCEngine::Rendering::RenderSurface* renderSurface = windowRenderer.GetCurrentRenderSurface(); ::XCEngine::Rendering::RenderContext renderContext = windowRenderer.GetRenderContext(); if (!renderContext.IsValid() || renderContext.commandList == nullptr || renderContext.commandQueue == nullptr || windowRenderer.GetSwapChain() == nullptr || renderSurface == nullptr) { return false; } auto* d3d12CommandList = static_cast<::XCEngine::RHI::D3D12CommandList*>(renderContext.commandList); if (d3d12CommandList == nullptr) { return false; } const auto& colorAttachments = renderSurface->GetColorAttachments(); if (colorAttachments.empty() || colorAttachments[0] == nullptr) { return false; } ::XCEngine::RHI::RHIResourceView* renderTargetView = colorAttachments[0]; renderContext.commandList->TransitionBarrier( renderTargetView, ::XCEngine::RHI::ResourceStates::Present, ::XCEngine::RHI::ResourceStates::RenderTarget); renderContext.commandList->SetRenderTargets(1, &renderTargetView, nullptr); renderContext.commandList->ClearRenderTarget(renderTargetView, clearColor); if (beforePresent) { beforePresent(renderContext, *renderSurface); renderContext.commandList->SetRenderTargets(1, &renderTargetView, nullptr); } if (afterPresent) { afterPresent(renderContext, *renderSurface); renderContext.commandList->SetRenderTargets(1, &renderTargetView, nullptr); } renderContext.commandList->TransitionBarrier( renderTargetView, ::XCEngine::RHI::ResourceStates::RenderTarget, ::XCEngine::RHI::ResourceStates::Present); renderContext.commandList->Close(); void* commandLists[] = { renderContext.commandList }; renderContext.commandQueue->ExecuteCommandLists(1, commandLists); windowRenderer.GetSwapChain()->Present(1, 0); return true; } } // namespace XCEngine::UI::Editor::Host