refactor(new_editor/app): split viewport render target cleanup

This commit is contained in:
2026-04-15 10:40:37 +08:00
parent 2606d15e26
commit e95bdb3149
3 changed files with 57 additions and 43 deletions

View File

@@ -266,6 +266,7 @@ if(XCENGINE_BUILD_XCUI_EDITOR_APP)
app/Rendering/Viewport/ViewportHostServiceFrame.cpp
app/Rendering/Viewport/ViewportHostServiceLifecycle.cpp
app/Rendering/Viewport/ViewportRenderTargetManager.cpp
app/Rendering/Viewport/ViewportRenderTargetManagerCleanup.cpp
app/Rendering/Viewport/ViewportRenderTargetManagerResources.cpp
app/Rendering/Viewport/ViewportRenderTargetManagerSurfaces.cpp
app/Rendering/Viewport/ViewportRenderTargets.cpp

View File

@@ -0,0 +1,56 @@
#include "ViewportRenderTargets.h"
namespace XCEngine::UI::Editor::App {
namespace {
template <typename ResourceType>
void ShutdownAndDeleteViewportResource(ResourceType*& resource) {
if (resource == nullptr) {
return;
}
resource->Shutdown();
delete resource;
resource = nullptr;
}
void ResetViewportTargetMetadata(ViewportRenderTargets& targets) {
targets.width = 0;
targets.height = 0;
targets.srvCpuHandle = {};
targets.srvGpuHandle = {};
targets.textureHandle = {};
targets.colorState = ::XCEngine::RHI::ResourceStates::Common;
targets.objectIdState = ::XCEngine::RHI::ResourceStates::Common;
targets.selectionMaskState = ::XCEngine::RHI::ResourceStates::Common;
targets.hasValidObjectIdFrame = false;
}
} // namespace
void ViewportRenderTargetManager::DestroyTargets(
Host::D3D12ShaderResourceDescriptorAllocator* textureDescriptorAllocator,
ViewportRenderTargets& targets) const {
if (textureDescriptorAllocator != nullptr && targets.srvCpuHandle.ptr != 0) {
textureDescriptorAllocator->Free(targets.srvCpuHandle, targets.srvGpuHandle);
}
ShutdownAndDeleteViewportResource(targets.objectIdView);
ShutdownAndDeleteViewportResource(targets.objectIdShaderView);
ShutdownAndDeleteViewportResource(targets.objectIdDepthView);
ShutdownAndDeleteViewportResource(targets.objectIdDepthTexture);
ShutdownAndDeleteViewportResource(targets.objectIdTexture);
ShutdownAndDeleteViewportResource(targets.selectionMaskView);
ShutdownAndDeleteViewportResource(targets.selectionMaskShaderView);
ShutdownAndDeleteViewportResource(targets.selectionMaskTexture);
ShutdownAndDeleteViewportResource(targets.depthShaderView);
ShutdownAndDeleteViewportResource(targets.depthView);
ShutdownAndDeleteViewportResource(targets.depthTexture);
ShutdownAndDeleteViewportResource(targets.colorView);
ShutdownAndDeleteViewportResource(targets.colorTexture);
ResetViewportTargetMetadata(targets);
}
} // namespace XCEngine::UI::Editor::App

View File

@@ -4,17 +4,6 @@ namespace XCEngine::UI::Editor::App {
namespace {
template <typename ResourceType>
void ShutdownAndDeleteViewportResource(ResourceType*& resource) {
if (resource == nullptr) {
return;
}
resource->Shutdown();
delete resource;
resource = nullptr;
}
bool CreateViewportColorResources(
::XCEngine::RHI::RHIDevice& device,
ViewportRenderTargets& targets) {
@@ -174,36 +163,4 @@ bool ViewportRenderTargetManager::EnsureTargets(
return true;
}
void ViewportRenderTargetManager::DestroyTargets(
Host::D3D12ShaderResourceDescriptorAllocator* textureDescriptorAllocator,
ViewportRenderTargets& targets) const {
if (textureDescriptorAllocator != nullptr && targets.srvCpuHandle.ptr != 0) {
textureDescriptorAllocator->Free(targets.srvCpuHandle, targets.srvGpuHandle);
}
ShutdownAndDeleteViewportResource(targets.objectIdView);
ShutdownAndDeleteViewportResource(targets.objectIdShaderView);
ShutdownAndDeleteViewportResource(targets.objectIdDepthView);
ShutdownAndDeleteViewportResource(targets.objectIdDepthTexture);
ShutdownAndDeleteViewportResource(targets.objectIdTexture);
ShutdownAndDeleteViewportResource(targets.selectionMaskView);
ShutdownAndDeleteViewportResource(targets.selectionMaskShaderView);
ShutdownAndDeleteViewportResource(targets.selectionMaskTexture);
ShutdownAndDeleteViewportResource(targets.depthShaderView);
ShutdownAndDeleteViewportResource(targets.depthView);
ShutdownAndDeleteViewportResource(targets.depthTexture);
ShutdownAndDeleteViewportResource(targets.colorView);
ShutdownAndDeleteViewportResource(targets.colorTexture);
targets.width = 0;
targets.height = 0;
targets.srvCpuHandle = {};
targets.srvGpuHandle = {};
targets.textureHandle = {};
targets.colorState = ::XCEngine::RHI::ResourceStates::Common;
targets.objectIdState = ::XCEngine::RHI::ResourceStates::Common;
targets.selectionMaskState = ::XCEngine::RHI::ResourceStates::Common;
targets.hasValidObjectIdFrame = false;
}
} // namespace XCEngine::UI::Editor::App