59 lines
2.1 KiB
C++
59 lines
2.1 KiB
C++
#include "D3D12WindowRenderLoop.h"
|
|
|
|
namespace XCEngine::UI::Editor::Host {
|
|
|
|
bool RenderD3D12WindowFrame(
|
|
D3D12WindowRenderer& windowRenderer,
|
|
const float clearColor[4],
|
|
const D3D12WindowRenderCallback& beforePresent,
|
|
const D3D12WindowRenderCallback& afterPresent) {
|
|
const ::XCEngine::Rendering::RenderSurface* renderSurface =
|
|
windowRenderer.GetCurrentRenderSurface();
|
|
::XCEngine::Rendering::RenderContext renderContext =
|
|
windowRenderer.GetRenderContext();
|
|
if (!renderContext.IsValid() ||
|
|
renderContext.commandList == nullptr ||
|
|
renderContext.commandQueue == nullptr ||
|
|
windowRenderer.GetSwapChain() == nullptr ||
|
|
renderSurface == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
auto* d3d12CommandList =
|
|
static_cast<::XCEngine::RHI::D3D12CommandList*>(renderContext.commandList);
|
|
if (d3d12CommandList == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
const auto& colorAttachments = renderSurface->GetColorAttachments();
|
|
if (colorAttachments.empty() || colorAttachments[0] == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
::XCEngine::RHI::RHIResourceView* renderTargetView = colorAttachments[0];
|
|
renderContext.commandList->TransitionBarrier(
|
|
renderTargetView,
|
|
::XCEngine::RHI::ResourceStates::Present,
|
|
::XCEngine::RHI::ResourceStates::RenderTarget);
|
|
renderContext.commandList->SetRenderTargets(1, &renderTargetView, nullptr);
|
|
renderContext.commandList->ClearRenderTarget(renderTargetView, clearColor);
|
|
|
|
if (beforePresent) {
|
|
beforePresent(renderContext, *renderSurface);
|
|
renderContext.commandList->SetRenderTargets(1, &renderTargetView, nullptr);
|
|
}
|
|
|
|
if (afterPresent) {
|
|
afterPresent(renderContext, *renderSurface);
|
|
renderContext.commandList->SetRenderTargets(1, &renderTargetView, nullptr);
|
|
}
|
|
|
|
renderContext.commandList->TransitionBarrier(
|
|
renderTargetView,
|
|
::XCEngine::RHI::ResourceStates::RenderTarget,
|
|
::XCEngine::RHI::ResourceStates::Present);
|
|
return windowRenderer.SubmitFrame(true);
|
|
}
|
|
|
|
} // namespace XCEngine::UI::Editor::Host
|