From 5382dd3ccd823dc373c815594c41b196b9bb5e12 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Sat, 4 Nov 2023 17:55:04 +0100 Subject: [PATCH] Graphics/UberShader: Hotreload shader when an imported module is modified --- include/Nazara/Graphics/UberShader.hpp | 2 ++ src/Nazara/Graphics/UberShader.cpp | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Graphics/UberShader.hpp b/include/Nazara/Graphics/UberShader.hpp index a2a18316b..91f5de5c3 100644 --- a/include/Nazara/Graphics/UberShader.hpp +++ b/include/Nazara/Graphics/UberShader.hpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace Nz { @@ -70,6 +71,7 @@ namespace Nz std::unordered_map, ConfigHasher, ConfigEqual> m_combinations; std::unordered_map m_optionIndexByName; + std::unordered_set m_usedModules; nzsl::Ast::ModulePtr m_shaderModule; ConfigCallback m_configCallback; nzsl::ShaderStageTypeFlags m_shaderStages; diff --git a/src/Nazara/Graphics/UberShader.cpp b/src/Nazara/Graphics/UberShader.cpp index 1428530ba..eab6143d8 100644 --- a/src/Nazara/Graphics/UberShader.cpp +++ b/src/Nazara/Graphics/UberShader.cpp @@ -37,7 +37,7 @@ namespace Nz m_onShaderModuleUpdated.Connect(moduleResolver.OnModuleUpdated, [this, name = std::move(moduleName)](nzsl::ModuleResolver* resolver, const std::string& updatedModuleName) { - if (updatedModuleName != name) + if (m_usedModules.find(updatedModuleName) == m_usedModules.end()) return; nzsl::Ast::ModulePtr newShaderModule = resolver->Resolve(name); @@ -120,6 +120,9 @@ namespace Nz sanitizeOptions.moduleResolver = Graphics::Instance()->GetShaderModuleResolver(); nzsl::Ast::ModulePtr sanitizedModule = nzsl::Ast::Sanitize(module, sanitizeOptions); + m_usedModules.insert(sanitizedModule->metadata->moduleName); + for (auto&& importedModule : sanitizedModule->importedModules) + m_usedModules.insert(importedModule.module->metadata->moduleName); nzsl::ShaderStageTypeFlags supportedStageType;