#include "D3D12WindowSwapChainPresenter.h" #include namespace XCEngine::UI::Editor::Host { using ::XCEngine::RHI::D3D12SwapChain; using ::XCEngine::RHI::D3D12Texture; bool D3D12WindowSwapChainPresenter::Resize(int width, int height) { if (width <= 0 || height <= 0 || m_swapChain == nullptr || m_hostDevice == nullptr) { return false; } if (m_width == width && m_height == height) { m_lastError.clear(); return true; } m_hostDevice->WaitForGpuIdle(); ReleaseBackBufferCommandReferences(); ReleaseBackBufferViews(); D3D12SwapChain* d3d12SwapChain = GetD3D12SwapChain(); if (d3d12SwapChain == nullptr) { m_lastError = "Resize could not resolve the native D3D12 swap chain."; return false; } d3d12SwapChain->Resize( static_cast(width), static_cast(height)); const HRESULT resizeHr = d3d12SwapChain->GetLastResizeResult(); if (FAILED(resizeHr)) { if (RecreateSwapChain(width, height)) { m_lastError.clear(); return true; } std::ostringstream error = {}; error << "ResizeBuffers failed. requested=" << width << 'x' << height << " hr=0x" << std::uppercase << std::hex << static_cast(resizeHr); m_lastError = error.str(); return false; } const D3D12Texture* backBufferTexture = GetBackBufferTexture(0u); if (backBufferTexture == nullptr) { if (RecreateSwapChain(width, height)) { m_lastError.clear(); return true; } m_lastError = "Resize failed to restore swap chain back buffers after ResizeBuffers."; return false; } m_width = static_cast(backBufferTexture->GetWidth()); m_height = static_cast(backBufferTexture->GetHeight()); m_hostDevice->ResetFrameTracking(); if (!RecreateBackBufferViews()) { if (RecreateSwapChain(width, height)) { m_lastError.clear(); return true; } m_lastError = "Resize failed to recreate swap chain back buffer views."; return false; } if (m_width != width || m_height != height) { if (RecreateSwapChain(width, height)) { m_lastError.clear(); return true; } std::ostringstream error = {}; error << "Resize ended with an unexpected swap chain size. requested=" << width << 'x' << height << " actual=" << m_width << 'x' << m_height; m_lastError = error.str(); return false; } m_lastError.clear(); return true; } } // namespace XCEngine::UI::Editor::Host