Files
XCEngine/new_editor/app/Rendering/Native/NativeRendererWindowInterop.cpp

73 lines
1.9 KiB
C++
Raw Normal View History

#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