Graphics/UberShader: Hotreload shader when an imported module is modified

This commit is contained in:
SirLynix 2023-11-04 17:55:04 +01:00
parent fa54f1a3e4
commit 5382dd3ccd
2 changed files with 6 additions and 1 deletions

View File

@ -15,6 +15,7 @@
#include <NZSL/ModuleResolver.hpp>
#include <NZSL/Ast/Module.hpp>
#include <unordered_map>
#include <unordered_set>
namespace Nz
{
@ -70,6 +71,7 @@ namespace Nz
std::unordered_map<Config, std::shared_ptr<ShaderModule>, ConfigHasher, ConfigEqual> m_combinations;
std::unordered_map<std::string, Option> m_optionIndexByName;
std::unordered_set<std::string> m_usedModules;
nzsl::Ast::ModulePtr m_shaderModule;
ConfigCallback m_configCallback;
nzsl::ShaderStageTypeFlags m_shaderStages;

View File

@ -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;