73 lines
1.9 KiB
C++
73 lines
1.9 KiB
C++
|
|
#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
|