refactor: ShaderManager 引用计数句柄——shader 生命周期自动化

- ShaderObject 值类型 → ShaderRef(shared_ptr 语义,UE TShaderRef
  对标):拷贝共享所有权,最后一个引用析构时自动销毁 VkShaderEXT,
  持有方零清理代码——"新 pass 忘销毁"整类 bug 被机制消灭
- 删除公开 Destroy 与全部持有方手工 destroyShaderEXT(8 处);
  各类析构只清 sampler/layout/set 等其余原生句柄
- RecordFullscreen 参数收窄为 const ShaderRef&(裸 handle 无法
  再被误传);bind 点统一 GetHandle()
- Outline/SelectionMask 撤掉上一轮补的 Device&(不再需要)
- 验证:5s 探针自动退出 → exit 0、无 VUID-05137 泄漏、无 SIGSEGV
This commit is contained in:
2026-10-02 20:20:07 +08:00
parent 47dd879977
commit b0d5ed4550
21 changed files with 223 additions and 217 deletions
+9 -12
View File
@@ -78,19 +78,19 @@ namespace Engine
m_ToCubeShader = shaders.CreateFromFile(
dir + "ibl_equirect_to_cube.comp.spv",
vk::ShaderStageFlagBits::eCompute,
{m_IblSetLayout}).Handle;
{m_IblSetLayout});
m_IrrShader = shaders.CreateFromFile(
dir + "ibl_irradiance.comp.spv",
vk::ShaderStageFlagBits::eCompute,
{m_IblSetLayout}).Handle;
{m_IblSetLayout});
m_PrefShader = shaders.CreateFromFile(
dir + "ibl_prefilter.comp.spv",
vk::ShaderStageFlagBits::eCompute,
{m_IblSetLayout}, sizeof(f32)).Handle;
{m_IblSetLayout}, sizeof(f32));
m_LutShader = shaders.CreateFromFile(
dir + "ibl_brdf_lut.comp.spv",
vk::ShaderStageFlagBits::eCompute,
{m_LutSetLayout}).Handle;
{m_LutSetLayout});
if (!m_ToCubeShader || !m_IrrShader || !m_PrefShader || !m_LutShader) {
ENGINE_FATAL("IblGenerator: failed to create compute shaders");
@@ -125,10 +125,7 @@ namespace Engine
{
const auto& vkDevice = m_Device.GetDevice();
for (const vk::ShaderEXT s : {m_ToCubeShader, m_IrrShader,
m_PrefShader, m_LutShader}) {
if (s) vkDevice.destroyShaderEXT(s);
}
// shader 随 ShaderRef 引用计数自动销毁,此处只清其余原生句柄
vkDevice.destroySampler(m_EquirectSampler);
vkDevice.destroyPipelineLayout(m_IblLayout);
vkDevice.destroyPipelineLayout(m_IblLayoutPush);
@@ -412,7 +409,7 @@ namespace Engine
// 4c. ① equirect → env cube
std::array<vk::ShaderStageFlagBits, 1> computeStage = {
vk::ShaderStageFlagBits::eCompute};
std::array<vk::ShaderEXT, 1> toCubeShaders = {m_ToCubeShader};
std::array<vk::ShaderEXT, 1> toCubeShaders = {m_ToCubeShader.GetHandle()};
m_Cmd.bindShadersEXT(computeStage, toCubeShaders);
m_Cmd.bindDescriptorSets(vk::PipelineBindPoint::eCompute,
m_IblLayout, 0, setToCube, {});
@@ -434,7 +431,7 @@ namespace Engine
vk::DependencyInfo{}.setImageMemoryBarriers(envToRead));
// 4d. ② irradiance(env → irr)
std::array<vk::ShaderEXT, 1> irrShaders = {m_IrrShader};
std::array<vk::ShaderEXT, 1> irrShaders = {m_IrrShader.GetHandle()};
m_Cmd.bindShadersEXT(computeStage, irrShaders);
m_Cmd.bindDescriptorSets(vk::PipelineBindPoint::eCompute,
m_IblLayout, 0, setIrr, {});
@@ -443,7 +440,7 @@ namespace Engine
kFaceCount);
// 4e. ③ prefilter(env → pref,每 mip 一次 dispatch + push roughness)
std::array<vk::ShaderEXT, 1> prefShaders = {m_PrefShader};
std::array<vk::ShaderEXT, 1> prefShaders = {m_PrefShader.GetHandle()};
m_Cmd.bindShadersEXT(computeStage, prefShaders);
for (u32 m = 0; m < kPrefilterMips; ++m) {
const u32 dim = kPrefilterFaceSize >> m;
@@ -459,7 +456,7 @@ namespace Engine
}
// 4f. ④ BRDF LUT(独立纯数学)
std::array<vk::ShaderEXT, 1> lutShaders = {m_LutShader};
std::array<vk::ShaderEXT, 1> lutShaders = {m_LutShader.GetHandle()};
m_Cmd.bindShadersEXT(computeStage, lutShaders);
m_Cmd.bindDescriptorSets(vk::PipelineBindPoint::eCompute,
m_LutLayout, 0, setLut, {});