refactor(new_editor/app): split native renderer lifecycle hotspots

This commit is contained in:
2026-04-15 08:49:14 +08:00
parent 6f1a7120d2
commit 302a13bc99
4 changed files with 163 additions and 147 deletions

View File

@@ -0,0 +1,72 @@
#include "NativeRendererSupport.h"
namespace XCEngine::UI::Editor::Host {
using namespace NativeRendererSupport;
bool NativeRenderer::AttachWindowRenderer(D3D12WindowRenderer& windowRenderer) {
if (m_windowRenderer != &windowRenderer) {
ReleaseWindowRendererInterop();
m_windowRenderer = &windowRenderer;
}
if (!EnsureWindowRendererInterop()) {
return false;
}
DiscardRenderTarget();
if (m_windowInterop.HasBackBufferTargets()) {
return true;
}
return m_windowInterop.RebuildBackBufferTargets();
}
void NativeRenderer::DetachWindowRenderer() {
ReleaseWindowRendererInterop();
m_windowRenderer = nullptr;
}
void NativeRenderer::ReleaseWindowRendererBackBufferTargets() {
m_windowInterop.ReleaseBackBufferTargets();
}
bool NativeRenderer::RebuildWindowRendererBackBufferTargets() {
if (!EnsureWindowRendererInterop()) {
return false;
}
DiscardRenderTarget();
ReleaseWindowRendererBackBufferTargets();
return m_windowInterop.RebuildBackBufferTargets();
}
bool NativeRenderer::HasAttachedWindowRenderer() const {
return m_windowInterop.HasAttachedWindowRenderer();
}
bool NativeRenderer::EnsureWindowRendererInterop() {
if (m_windowRenderer == nullptr) {
m_lastRenderError = "EnsureWindowRendererInterop requires an attached D3D12 window renderer.";
return false;
}
if (m_d2dFactory == nullptr || m_dwriteFactory == nullptr) {
m_lastRenderError = "EnsureWindowRendererInterop requires initialized D2D and DWrite factories.";
return false;
}
const bool attached = m_windowInterop.Attach(*m_windowRenderer, *m_d2dFactory.Get());
if (!attached) {
m_lastRenderError = m_windowInterop.GetLastError();
} else {
m_lastRenderError.clear();
}
return attached;
}
void NativeRenderer::ReleaseWindowRendererInterop() {
m_windowInterop.Detach();
}
} // namespace XCEngine::UI::Editor::Host