93 lines
3.1 KiB
C++
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
|