From a7acf32886c77799c6885fc0b396ea05aa7b61a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 6 Mar 2022 19:13:38 +0100 Subject: [PATCH] Shader: Replace indices-based option keys by CRC32 --- include/Nazara/Graphics/MaterialPipeline.hpp | 9 +++- include/Nazara/Graphics/MaterialPipeline.inl | 22 +++++--- include/Nazara/Graphics/MaterialSettings.hpp | 4 +- include/Nazara/Graphics/MaterialSettings.inl | 30 +++-------- include/Nazara/Graphics/UberShader.hpp | 6 +-- include/Nazara/Graphics/UberShader.inl | 15 +++--- include/Nazara/Shader/Ast/SanitizeVisitor.hpp | 2 +- include/Nazara/Shader/GlslWriter.hpp | 2 +- include/Nazara/Shader/ShaderWriter.hpp | 2 +- src/Nazara/Graphics/BasicMaterial.cpp | 40 +++----------- src/Nazara/Graphics/MaterialPass.cpp | 19 ++++--- src/Nazara/Graphics/MaterialPipeline.cpp | 9 +++- src/Nazara/Graphics/PhongLightingMaterial.cpp | 52 ++++--------------- src/Nazara/Graphics/UberShader.cpp | 12 +---- src/Nazara/Shader/Ast/SanitizeVisitor.cpp | 7 +-- src/Nazara/Shader/GlslWriter.cpp | 4 +- src/ShaderNode/Widgets/CodeOutputWidget.cpp | 5 +- tests/Engine/Shader/Const.cpp | 4 +- 18 files changed, 92 insertions(+), 152 deletions(-) diff --git a/include/Nazara/Graphics/MaterialPipeline.hpp b/include/Nazara/Graphics/MaterialPipeline.hpp index d6674d237..fe1e395c5 100644 --- a/include/Nazara/Graphics/MaterialPipeline.hpp +++ b/include/Nazara/Graphics/MaterialPipeline.hpp @@ -22,12 +22,19 @@ namespace Nz struct MaterialPipelineInfo : RenderStates { + struct Option + { + UInt32 hash; + ShaderAst::ConstantValue value; + }; + struct Shader { - std::array optionValues; std::shared_ptr uberShader; }; + std::array optionValues; + std::size_t optionCount = 0; std::vector shaders; std::shared_ptr settings; }; diff --git a/include/Nazara/Graphics/MaterialPipeline.inl b/include/Nazara/Graphics/MaterialPipeline.inl index 3b7289164..35f6176c2 100644 --- a/include/Nazara/Graphics/MaterialPipeline.inl +++ b/include/Nazara/Graphics/MaterialPipeline.inl @@ -32,13 +32,20 @@ namespace Nz #define NazaraPipelineMember(field) if (lhs.field != rhs.field) return false NazaraPipelineMember(settings); + NazaraPipelineMember(optionCount); for (std::size_t i = 0; i < lhs.shaders.size(); ++i) { - if (lhs.shaders[i].optionValues != rhs.shaders[i].optionValues) + if (lhs.shaders[i].uberShader != rhs.shaders[i].uberShader) + return false; + } + + for (std::size_t i = 0; i < lhs.optionCount; ++i) + { + if (lhs.optionValues[i].hash != rhs.optionValues[i].hash) return false; - if (lhs.shaders[i].uberShader != rhs.shaders[i].uberShader) + if (lhs.optionValues[i].value != rhs.optionValues[i].value) return false; } @@ -72,14 +79,15 @@ namespace std NazaraPipelineMember(settings.get()); //< Hash pointer - for (const auto& shader : pipelineInfo.shaders) + for (std::size_t i = 0; i < pipelineInfo.optionCount; ++i) { - for (const auto& value : shader.optionValues) - Nz::HashCombine(seed, value); - - Nz::HashCombine(seed, shader.uberShader.get()); + Nz::HashCombine(seed, pipelineInfo.optionValues[i].hash); + Nz::HashCombine(seed, pipelineInfo.optionValues[i].value); } + for (const auto& shader : pipelineInfo.shaders) + Nz::HashCombine(seed, shader.uberShader.get()); + NazaraUnused(parameterIndex); #undef NazaraPipelineMember diff --git a/include/Nazara/Graphics/MaterialSettings.hpp b/include/Nazara/Graphics/MaterialSettings.hpp index 33d9cb207..5b5f434cb 100644 --- a/include/Nazara/Graphics/MaterialSettings.hpp +++ b/include/Nazara/Graphics/MaterialSettings.hpp @@ -57,7 +57,7 @@ namespace Nz static constexpr std::size_t InvalidIndex = std::numeric_limits::max(); - static inline void BuildOption(std::vector