101 lines
2.8 KiB
C++
101 lines
2.8 KiB
C++
#include "D3D12WindowSwapChainPresenter.h"
|
|
|
|
#include <sstream>
|
|
|
|
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<std::uint32_t>(width),
|
|
static_cast<std::uint32_t>(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<unsigned long>(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<int>(backBufferTexture->GetWidth());
|
|
m_height = static_cast<int>(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
|