Refactor new_editor window architecture and routing

This commit is contained in:
2026-04-23 14:11:33 +08:00
parent 5c0a878aa0
commit af5690395d
121 changed files with 1647 additions and 1592 deletions

View File

@@ -1,6 +1,6 @@
#include "ViewportHostService.h"
#include "Ports/ViewportRenderPort.h"
#include "Rendering/Host/ViewportRenderHost.h"
#include <XCEngine/RHI/RHICommandList.h>
@@ -19,15 +19,17 @@ ViewportHostService::ViewportHostService() = default;
ViewportHostService::~ViewportHostService() = default;
void ViewportHostService::AttachWindowRenderer(
Ports::ViewportRenderPort& windowRenderer) {
Rendering::Host::ViewportRenderHost& windowRenderer) {
if (m_windowRenderer == &windowRenderer) {
m_device = windowRenderer.GetRHIDevice();
m_retiredTargetsBySlot.resize(windowRenderer.GetViewportResourceRetirementSlotCount());
return;
}
ReleaseWindowResources();
m_windowRenderer = &windowRenderer;
m_device = windowRenderer.GetRHIDevice();
m_retiredTargetsBySlot.resize(windowRenderer.GetViewportResourceRetirementSlotCount());
}
void ViewportHostService::DetachWindowRenderer() {
@@ -51,14 +53,17 @@ void ViewportHostService::Shutdown() {
for (auto& [viewportId, entry] : m_entries) {
DestroyViewportEntry(entry);
}
DestroyRetiredTargets();
m_windowRenderer = nullptr;
m_device = nullptr;
m_surfacePresentationEnabled = false;
m_entries.clear();
m_retiredTargetsBySlot.clear();
}
void ViewportHostService::BeginFrame() {
ReclaimRetiredTargetsForCurrentSlot();
for (auto& [viewportId, entry] : m_entries) {
entry.requestedWidth = 0;
entry.requestedHeight = 0;
@@ -71,10 +76,12 @@ void ViewportHostService::ReleaseWindowResources() {
for (auto& [viewportId, entry] : m_entries) {
DestroyViewportEntry(entry);
}
DestroyRetiredTargets();
m_windowRenderer = nullptr;
m_device = nullptr;
m_surfacePresentationEnabled = false;
m_retiredTargetsBySlot.clear();
}
ViewportHostService::ViewportEntry& ViewportHostService::GetOrCreateEntry(
@@ -96,6 +103,58 @@ void ViewportHostService::DestroyViewportEntry(ViewportEntry& entry) {
entry.statusText.clear();
}
void ViewportHostService::DestroyRetiredTargets() {
for (auto& retiredTargets : m_retiredTargetsBySlot) {
for (ViewportRenderTargets& targets : retiredTargets) {
m_renderTargetManager.DestroyTargets(m_windowRenderer, targets);
}
retiredTargets.clear();
}
}
void ViewportHostService::ReclaimRetiredTargetsForCurrentSlot() {
if (m_windowRenderer == nullptr || m_retiredTargetsBySlot.empty()) {
return;
}
std::uint32_t activeSlot = 0u;
if (!m_windowRenderer->TryGetActiveViewportResourceRetirementSlot(activeSlot) ||
activeSlot >= m_retiredTargetsBySlot.size()) {
return;
}
for (ViewportRenderTargets& targets : m_retiredTargetsBySlot[activeSlot]) {
m_renderTargetManager.DestroyTargets(m_windowRenderer, targets);
}
m_retiredTargetsBySlot[activeSlot].clear();
}
void ViewportHostService::RetireViewportTargets(ViewportRenderTargets& targets) {
if (targets.colorTexture == nullptr &&
targets.colorView == nullptr &&
targets.depthTexture == nullptr &&
targets.depthView == nullptr &&
!targets.textureHandle.IsValid()) {
targets = {};
return;
}
if (m_windowRenderer == nullptr || m_retiredTargetsBySlot.empty()) {
m_renderTargetManager.DestroyTargets(nullptr, targets);
return;
}
std::uint32_t activeSlot = 0u;
if (!m_windowRenderer->TryGetActiveViewportResourceRetirementSlot(activeSlot) ||
activeSlot >= m_retiredTargetsBySlot.size()) {
m_renderTargetManager.DestroyTargets(m_windowRenderer, targets);
return;
}
m_retiredTargetsBySlot[activeSlot].push_back({});
std::swap(m_retiredTargetsBySlot[activeSlot].back(), targets);
}
ViewportFrame ViewportHostService::RequestViewport(
std::string_view viewportId,
const ::XCEngine::UI::UISize& requestedSize) {
@@ -175,13 +234,22 @@ bool ViewportHostService::EnsureViewportResources(ViewportEntry& entry) {
return false;
}
return m_renderTargetManager.EnsureTargets(
ViewportRenderTargets nextTargets = {};
if (!m_renderTargetManager.CreateTargets(
entry.requirements,
entry.requestedWidth,
entry.requestedHeight,
*m_device,
*m_windowRenderer,
entry.renderTargets);
nextTargets)) {
return false;
}
ViewportRenderTargets retiredTargets = {};
std::swap(retiredTargets, entry.renderTargets);
std::swap(entry.renderTargets, nextTargets);
RetireViewportTargets(retiredTargets);
return true;
}
void ViewportHostService::ApplyViewportFallback(