From 3622bf3aa22a97710b5cd467d1c52ec223bfd31f Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sat, 11 Apr 2026 03:24:32 +0800 Subject: [PATCH] Fix builtin pass layout metadata lifetime --- .../Builtin/BuiltinPassLayoutUtils.h | 3 +- .../Rendering/Builtin/BuiltinPassTypes.h | 76 +++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h b/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h index 2acb6964..a74fcef5 100644 --- a/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h +++ b/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h @@ -525,8 +525,7 @@ inline void RefreshBuiltinPassSetLayoutMetadata(BuiltinPassSetLayoutMetadata& se return left.binding < right.binding; }); setLayout.shaderVisible = IsBuiltinPassShaderVisibleSet(setLayout.bindings); - setLayout.layout.bindings = setLayout.bindings.empty() ? nullptr : setLayout.bindings.data(); - setLayout.layout.bindingCount = static_cast(setLayout.bindings.size()); + setLayout.SyncLayoutView(); } inline void RefreshBuiltinPassSetLayouts(std::vector& setLayouts) { diff --git a/engine/include/XCEngine/Rendering/Builtin/BuiltinPassTypes.h b/engine/include/XCEngine/Rendering/Builtin/BuiltinPassTypes.h index 95295672..41f7fa73 100644 --- a/engine/include/XCEngine/Rendering/Builtin/BuiltinPassTypes.h +++ b/engine/include/XCEngine/Rendering/Builtin/BuiltinPassTypes.h @@ -7,6 +7,7 @@ #include #include +#include #include namespace XCEngine { @@ -142,6 +143,81 @@ struct BuiltinPassSetLayoutMetadata { bool usesSampler = false; bool usesLinearClampSampler = false; bool usesShadowMapSampler = false; + + BuiltinPassSetLayoutMetadata() = default; + + BuiltinPassSetLayoutMetadata(const BuiltinPassSetLayoutMetadata& other) + : bindings(other.bindings) + , materialBufferBindings(other.materialBufferBindings) { + CopyFlagsFrom(other); + SyncLayoutView(); + } + + BuiltinPassSetLayoutMetadata(BuiltinPassSetLayoutMetadata&& other) noexcept + : bindings(std::move(other.bindings)) + , materialBufferBindings(std::move(other.materialBufferBindings)) { + CopyFlagsFrom(other); + SyncLayoutView(); + other.layout = {}; + } + + BuiltinPassSetLayoutMetadata& operator=(const BuiltinPassSetLayoutMetadata& other) { + if (this != &other) { + bindings = other.bindings; + materialBufferBindings = other.materialBufferBindings; + CopyFlagsFrom(other); + SyncLayoutView(); + } + + return *this; + } + + BuiltinPassSetLayoutMetadata& operator=(BuiltinPassSetLayoutMetadata&& other) noexcept { + if (this != &other) { + bindings = std::move(other.bindings); + materialBufferBindings = std::move(other.materialBufferBindings); + CopyFlagsFrom(other); + SyncLayoutView(); + other.layout = {}; + } + + return *this; + } + + void SyncLayoutView() { + layout.bindings = bindings.empty() ? nullptr : bindings.data(); + layout.bindingCount = static_cast(bindings.size()); + } + +private: + void CopyFlagsFrom(const BuiltinPassSetLayoutMetadata& other) { + heapType = other.heapType; + shaderVisible = other.shaderVisible; + usesPerObject = other.usesPerObject; + usesMaterial = other.usesMaterial; + usesLighting = other.usesLighting; + usesShadowReceiver = other.usesShadowReceiver; + usesEnvironment = other.usesEnvironment; + usesPassConstants = other.usesPassConstants; + usesMaterialBuffers = other.usesMaterialBuffers; + usesVolumeField = other.usesVolumeField; + usesGaussianSplatSortDistanceBuffer = other.usesGaussianSplatSortDistanceBuffer; + usesGaussianSplatOrderBuffer = other.usesGaussianSplatOrderBuffer; + usesGaussianSplatPositionBuffer = other.usesGaussianSplatPositionBuffer; + usesGaussianSplatOtherBuffer = other.usesGaussianSplatOtherBuffer; + usesGaussianSplatColorBuffer = other.usesGaussianSplatColorBuffer; + usesGaussianSplatSHBuffer = other.usesGaussianSplatSHBuffer; + usesGaussianSplatViewDataBuffer = other.usesGaussianSplatViewDataBuffer; + usesTexture = other.usesTexture; + usesBaseColorTexture = other.usesBaseColorTexture; + usesSourceColorTexture = other.usesSourceColorTexture; + usesSkyboxPanoramicTexture = other.usesSkyboxPanoramicTexture; + usesSkyboxTexture = other.usesSkyboxTexture; + usesShadowMapTexture = other.usesShadowMapTexture; + usesSampler = other.usesSampler; + usesLinearClampSampler = other.usesLinearClampSampler; + usesShadowMapSampler = other.usesShadowMapSampler; + } }; } // namespace Rendering