refactor(new_editor/app): reorganize host structure and add smoke test
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
#include "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
|
||||
Reference in New Issue
Block a user