Files
XCEngine/new_editor/app/Rendering/D3D12/SwapChainPresenter/BackBuffers.cpp

93 lines
3.1 KiB
C++

#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<std::uint32_t>(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<std::uint32_t>(m_width),
static_cast<std::uint32_t>(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