#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