Wire viewport shell host chain and move host under app

This commit is contained in:
2026-04-12 23:13:00 +08:00
parent 89590242bd
commit 941034b387
21 changed files with 1424 additions and 14 deletions

View File

@@ -0,0 +1,63 @@
#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