#include "Rendering/D3D12/D3D12WindowSwapChainPresenter.h" namespace XCEngine::UI::Editor::Host { using ::XCEngine::RHI::D3D12SwapChain; using ::XCEngine::RHI::D3D12Texture; using ::XCEngine::RHI::Format; using ::XCEngine::RHI::ResourceStates; using ::XCEngine::RHI::ResourceViewDesc; using ::XCEngine::RHI::ResourceViewDimension; void D3D12WindowSwapChainPresenter::ReleaseBackBufferCommandReferences() { if (m_hostDevice == nullptr) { return; } for (std::uint32_t frameIndex = 0u; frameIndex < D3D12HostDevice::kFrameContextCount; ++frameIndex) { auto* commandList = m_hostDevice->GetCommandList(frameIndex); if (commandList == nullptr) { continue; } commandList->Reset(); commandList->Close(); } } void D3D12WindowSwapChainPresenter::ReleaseBackBufferViews() { for (auto* view : m_backBufferViews) { if (view != nullptr) { view->Shutdown(); delete view; } } m_backBufferViews.clear(); m_backBufferSurfaces.clear(); } bool D3D12WindowSwapChainPresenter::RecreateBackBufferViews() { D3D12SwapChain* d3d12SwapChain = GetD3D12SwapChain(); if (m_hostDevice == nullptr || m_hostDevice->GetRHIDevice() == nullptr || d3d12SwapChain == nullptr) { return false; } m_backBufferViews.resize(kSwapChainBufferCount, nullptr); m_backBufferSurfaces.resize(kSwapChainBufferCount); ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2D; for (std::uint32_t backBufferIndex = 0u; backBufferIndex < kSwapChainBufferCount; ++backBufferIndex) { D3D12Texture* backBufferTexture = d3d12SwapChain->TryGetBackBuffer(backBufferIndex); if (backBufferTexture == nullptr) { ReleaseBackBufferViews(); m_lastError = "RecreateBackBufferViews could not resolve swap chain back buffer " + std::to_string(backBufferIndex) + "."; return false; } m_backBufferViews[backBufferIndex] = m_hostDevice->GetRHIDevice()->CreateRenderTargetView( backBufferTexture, viewDesc); if (m_backBufferViews[backBufferIndex] == nullptr) { ReleaseBackBufferViews(); m_lastError = "RecreateBackBufferViews failed to create RTV for swap chain back buffer " + std::to_string(backBufferIndex) + "."; return false; } ::XCEngine::Rendering::RenderSurface& surface = m_backBufferSurfaces[backBufferIndex]; surface = ::XCEngine::Rendering::RenderSurface( static_cast(m_width), static_cast(m_height)); surface.SetColorAttachment(m_backBufferViews[backBufferIndex]); surface.SetAutoTransitionEnabled(false); surface.SetColorStateBefore(ResourceStates::RenderTarget); surface.SetColorStateAfter(ResourceStates::RenderTarget); } m_lastError.clear(); return true; } } // namespace XCEngine::UI::Editor::Host