From a895e553d40b005aec245aef931a535c57f4c4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 8 Jul 2021 14:52:39 +0200 Subject: [PATCH] Graphics: rework ubershaders to prevent duplicate shaders modules Also rename all remaining conditions to options --- include/Nazara/Graphics/BasicMaterial.hpp | 6 +- include/Nazara/Graphics/BasicMaterial.inl | 18 +-- include/Nazara/Graphics/Material.hpp | 8 +- include/Nazara/Graphics/Material.inl | 47 +++---- include/Nazara/Graphics/MaterialPipeline.hpp | 6 +- include/Nazara/Graphics/MaterialPipeline.inl | 4 +- include/Nazara/Graphics/MaterialSettings.hpp | 18 ++- include/Nazara/Graphics/MaterialSettings.inl | 12 +- include/Nazara/Graphics/UberShader.hpp | 6 +- include/Nazara/Graphics/UberShader.inl | 4 + include/Nazara/Shader/Ast/AstReflect.hpp | 2 + include/Nazara/Shader/GlslWriter.hpp | 2 +- src/Nazara/Graphics/BasicMaterial.cpp | 59 +++++---- src/Nazara/Graphics/Material.cpp | 37 +++++- src/Nazara/Graphics/MaterialPipeline.cpp | 6 +- src/Nazara/Graphics/UberShader.cpp | 18 ++- src/Nazara/Shader/Ast/AstReflect.cpp | 12 ++ src/Nazara/Shader/GlslWriter.cpp | 4 +- .../DataModels/ConditionalExpression.cpp | 84 ++++++------- .../DataModels/ConditionalExpression.hpp | 12 +- src/ShaderNode/ShaderGraph.cpp | 58 ++++----- src/ShaderNode/ShaderGraph.hpp | 24 ++-- src/ShaderNode/ShaderGraph.inl | 38 +++--- src/ShaderNode/Widgets/CodeOutputWidget.cpp | 12 +- .../Widgets/ConditionEditDialog.cpp | 55 -------- .../Widgets/ConditionEditDialog.hpp | 35 ------ .../Widgets/ConditionEditDialog.inl | 1 - src/ShaderNode/Widgets/ConditionEditor.cpp | 119 ------------------ src/ShaderNode/Widgets/ConditionEditor.hpp | 36 ------ src/ShaderNode/Widgets/ConditionEditor.inl | 1 - src/ShaderNode/Widgets/MainWindow.cpp | 16 +-- src/ShaderNode/Widgets/MainWindow.hpp | 2 +- src/ShaderNode/Widgets/OptionEditDialog.cpp | 55 ++++++++ src/ShaderNode/Widgets/OptionEditDialog.hpp | 35 ++++++ src/ShaderNode/Widgets/OptionEditDialog.inl | 1 + src/ShaderNode/Widgets/OptionEditor.cpp | 119 ++++++++++++++++++ src/ShaderNode/Widgets/OptionEditor.hpp | 36 ++++++ src/ShaderNode/Widgets/OptionEditor.inl | 1 + 38 files changed, 524 insertions(+), 485 deletions(-) delete mode 100644 src/ShaderNode/Widgets/ConditionEditDialog.cpp delete mode 100644 src/ShaderNode/Widgets/ConditionEditDialog.hpp delete mode 100644 src/ShaderNode/Widgets/ConditionEditDialog.inl delete mode 100644 src/ShaderNode/Widgets/ConditionEditor.cpp delete mode 100644 src/ShaderNode/Widgets/ConditionEditor.hpp delete mode 100644 src/ShaderNode/Widgets/ConditionEditor.inl create mode 100644 src/ShaderNode/Widgets/OptionEditDialog.cpp create mode 100644 src/ShaderNode/Widgets/OptionEditDialog.hpp create mode 100644 src/ShaderNode/Widgets/OptionEditDialog.inl create mode 100644 src/ShaderNode/Widgets/OptionEditor.cpp create mode 100644 src/ShaderNode/Widgets/OptionEditor.hpp create mode 100644 src/ShaderNode/Widgets/OptionEditor.inl diff --git a/include/Nazara/Graphics/BasicMaterial.hpp b/include/Nazara/Graphics/BasicMaterial.hpp index a937529b4..415369fdd 100644 --- a/include/Nazara/Graphics/BasicMaterial.hpp +++ b/include/Nazara/Graphics/BasicMaterial.hpp @@ -56,7 +56,7 @@ namespace Nz }; private: - struct ConditionIndexes + struct OptionIndexes { std::size_t alphaTest; std::size_t hasAlphaMap; @@ -74,13 +74,13 @@ namespace Nz Material& m_material; std::size_t m_uniformBlockIndex; - ConditionIndexes m_conditionIndexes; + OptionIndexes m_optionIndexes; TextureIndexes m_textureIndexes; UniformOffsets m_uniformOffsets; static std::shared_ptr s_materialSettings; static std::size_t s_uniformBlockIndex; - static ConditionIndexes s_conditionIndexes; + static OptionIndexes s_optionIndexes; static TextureIndexes s_textureIndexes; static UniformOffsets s_uniformOffsets; }; diff --git a/include/Nazara/Graphics/BasicMaterial.inl b/include/Nazara/Graphics/BasicMaterial.inl index 48d4daf24..17ad313ad 100644 --- a/include/Nazara/Graphics/BasicMaterial.inl +++ b/include/Nazara/Graphics/BasicMaterial.inl @@ -25,8 +25,8 @@ namespace Nz */ inline void BasicMaterial::EnableAlphaTest(bool alphaTest) { - NazaraAssert(HasAlphaTest(), "Material has no alpha test condition"); - m_material.EnableCondition(m_conditionIndexes.alphaTest, alphaTest); + NazaraAssert(HasAlphaTest(), "Material has no alpha test option"); + m_material.EnableOption(m_optionIndexes.alphaTest, alphaTest); } inline const std::shared_ptr& BasicMaterial::GetAlphaMap() const @@ -55,8 +55,8 @@ namespace Nz inline bool BasicMaterial::IsAlphaTestEnabled() const { - NazaraAssert(HasAlphaTest(), "Material has no alpha test condition"); - return m_material.IsConditionEnabled(m_conditionIndexes.alphaTest); + NazaraAssert(HasAlphaTest(), "Material has no alpha test option"); + return m_material.IsOptionEnabled(m_optionIndexes.alphaTest); } inline bool BasicMaterial::HasAlphaMap() const @@ -66,7 +66,7 @@ namespace Nz inline bool BasicMaterial::HasAlphaTest() const { - return m_conditionIndexes.alphaTest != MaterialSettings::InvalidIndex; + return m_optionIndexes.alphaTest != MaterialSettings::InvalidIndex; } inline bool BasicMaterial::HasAlphaTestThreshold() const @@ -90,8 +90,8 @@ namespace Nz bool hasAlphaMap = (alphaMap != nullptr); m_material.SetTexture(m_textureIndexes.alpha, std::move(alphaMap)); - if (m_conditionIndexes.hasDiffuseMap != MaterialSettings::InvalidIndex) - m_material.EnableCondition(m_conditionIndexes.hasAlphaMap, hasAlphaMap); + if (m_optionIndexes.hasDiffuseMap != MaterialSettings::InvalidIndex) + m_material.EnableOption(m_optionIndexes.hasAlphaMap, hasAlphaMap); } inline void BasicMaterial::SetAlphaSampler(TextureSamplerInfo alphaSampler) @@ -106,8 +106,8 @@ namespace Nz bool hasDiffuseMap = (diffuseMap != nullptr); m_material.SetTexture(m_textureIndexes.diffuse, std::move(diffuseMap)); - if (m_conditionIndexes.hasDiffuseMap != MaterialSettings::InvalidIndex) - m_material.EnableCondition(m_conditionIndexes.hasDiffuseMap, hasDiffuseMap); + if (m_optionIndexes.hasDiffuseMap != MaterialSettings::InvalidIndex) + m_material.EnableOption(m_optionIndexes.hasDiffuseMap, hasDiffuseMap); } inline void BasicMaterial::SetDiffuseSampler(TextureSamplerInfo diffuseSampler) diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 3973f1e10..25ed79ba2 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -41,11 +41,11 @@ namespace Nz inline void EnableBlending(bool blending); inline void EnableColorWrite(bool colorWrite); - inline void EnableCondition(std::size_t conditionIndex, bool enable); inline void EnableDepthBuffer(bool depthBuffer); inline void EnableDepthSorting(bool depthSorting); inline void EnableDepthWrite(bool depthWrite); inline void EnableFaceCulling(bool faceCulling); + inline void EnableOption(std::size_t optionIndex, bool enable); inline void EnableReflectionMapping(bool reflection); inline void EnableScissorTest(bool scissorTest); inline void EnableShadowCasting(bool castShadows); @@ -83,11 +83,11 @@ namespace Nz inline bool IsBlendingEnabled() const; inline bool IsColorWriteEnabled() const; - inline bool IsConditionEnabled(std::size_t conditionIndex) const; inline bool IsDepthBufferEnabled() const; inline bool IsDepthSortingEnabled() const; inline bool IsDepthWriteEnabled() const; inline bool IsFaceCullingEnabled() const; + inline bool IsOptionEnabled(std::size_t optionIndex) const; inline bool IsReflectionMappingEnabled() const; inline bool IsScissorTestEnabled() const; inline bool IsStencilTestEnabled() const; @@ -117,7 +117,7 @@ namespace Nz inline void InvalidateShaderBinding(); inline void InvalidateTextureSampler(std::size_t textureIndex); inline void InvalidateUniformData(std::size_t uniformBufferIndex); - inline void UpdatePipeline() const; + void UpdatePipeline() const; void UpdateShaderBinding(); struct MaterialTexture @@ -138,7 +138,7 @@ namespace Nz std::vector m_textures; std::vector m_uniformBuffers; mutable std::shared_ptr m_pipeline; - UInt64 m_enabledConditions; + UInt64 m_enabledOptions; mutable MaterialPipelineInfo m_pipelineInfo; ShaderBindingPtr m_shaderBinding; mutable bool m_pipelineUpdated; diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index 9ef6f13cf..3aba0acb4 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -90,15 +90,6 @@ namespace Nz InvalidatePipeline(); } - inline void Material::EnableCondition(std::size_t conditionIndex, bool enable) - { - if (TestBit(m_enabledConditions, conditionIndex) != enable) - { - m_enabledConditions = ToggleBit(m_enabledConditions, conditionIndex); - InvalidatePipeline(); - } - } - /*! * \brief Enable/Disable depth buffer for this material * @@ -189,6 +180,15 @@ namespace Nz InvalidatePipeline(); } + inline void Material::EnableOption(std::size_t optionIndex, bool enable) + { + if (TestBit(m_enabledOptions, optionIndex) != enable) + { + m_enabledOptions = ToggleBit(m_enabledOptions, optionIndex); + InvalidatePipeline(); + } + } + /*! * \brief Enable/Disable reflection mapping for this material * @@ -515,11 +515,6 @@ namespace Nz return m_pipelineInfo.colorWrite; } - inline bool Material::IsConditionEnabled(std::size_t conditionIndex) const - { - return TestBit(m_enabledConditions, conditionIndex); - } - /*! * \brief Checks whether this material has depth buffer enabled * \return true If it is the case @@ -556,6 +551,11 @@ namespace Nz return m_pipelineInfo.faceCulling; } + inline bool Material::IsOptionEnabled(std::size_t optionIndex) const + { + return TestBit(m_enabledOptions, optionIndex); + } + /*! * \brief Checks whether this material has reflection mapping enabled * \return true If it is the case @@ -766,25 +766,6 @@ namespace Nz OnMaterialInvalidated(this); } - - inline void Material::UpdatePipeline() const - { - for (auto& shader : m_pipelineInfo.shaders) - shader.enabledConditions = 0; - - const auto& conditions = m_settings->GetConditions(); - for (std::size_t conditionIndex = 0; conditionIndex < conditions.size(); ++conditionIndex) - { - if (TestBit(m_enabledConditions, conditionIndex)) - { - for (std::size_t shaderStage = 0; shaderStage < ShaderStageTypeCount; ++shaderStage) - m_pipelineInfo.shaders[shaderStage].enabledConditions |= conditions[conditionIndex].enabledConditions[shaderStage]; - } - } - - m_pipeline = MaterialPipeline::Get(m_pipelineInfo); - m_pipelineUpdated = true; - } } #include diff --git a/include/Nazara/Graphics/MaterialPipeline.hpp b/include/Nazara/Graphics/MaterialPipeline.hpp index 951320269..3922a5b98 100644 --- a/include/Nazara/Graphics/MaterialPipeline.hpp +++ b/include/Nazara/Graphics/MaterialPipeline.hpp @@ -21,10 +21,10 @@ namespace Nz struct MaterialPipelineInfo : RenderStates { - struct ShaderStage + struct Shader { std::shared_ptr uberShader; - Nz::UInt64 enabledConditions = 0; + Nz::UInt64 enabledOptions = 0; }; bool depthSorting = false; @@ -32,7 +32,7 @@ namespace Nz bool reflectionMapping = false; bool shadowReceive = true; - std::array shaders; + std::vector shaders; std::shared_ptr settings; }; diff --git a/include/Nazara/Graphics/MaterialPipeline.inl b/include/Nazara/Graphics/MaterialPipeline.inl index 0131b7153..8677754fa 100644 --- a/include/Nazara/Graphics/MaterialPipeline.inl +++ b/include/Nazara/Graphics/MaterialPipeline.inl @@ -40,7 +40,7 @@ namespace Nz for (std::size_t i = 0; i < lhs.shaders.size(); ++i) { - if (lhs.shaders[i].enabledConditions != rhs.shaders[i].enabledConditions) + if (lhs.shaders[i].enabledOptions != rhs.shaders[i].enabledOptions) return false; if (lhs.shaders[i].uberShader != rhs.shaders[i].uberShader) @@ -85,7 +85,7 @@ namespace std for (const auto& shader : pipelineInfo.shaders) { - Nz::HashCombine(seed, shader.enabledConditions); + Nz::HashCombine(seed, shader.enabledOptions); Nz::HashCombine(seed, shader.uberShader.get()); } diff --git a/include/Nazara/Graphics/MaterialSettings.hpp b/include/Nazara/Graphics/MaterialSettings.hpp index b8425e0ed..98955f976 100644 --- a/include/Nazara/Graphics/MaterialSettings.hpp +++ b/include/Nazara/Graphics/MaterialSettings.hpp @@ -24,10 +24,8 @@ namespace Nz class MaterialSettings { public: - using Shaders = std::array, ShaderStageTypeCount>; - struct Builder; - struct Condition; + struct Option; struct SharedUniformBlock; struct Texture; struct UniformBlock; @@ -39,11 +37,11 @@ namespace Nz ~MaterialSettings() = default; inline const Builder& GetBuilderData() const; - inline const std::vector& GetConditions() const; - inline std::size_t GetConditionIndex(const std::string_view& name) const; + inline const std::vector