Refactor new_editor window architecture and routing
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user