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:
@@ -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, {});
|
||||
|
||||
Reference in New Issue
Block a user