Commit current work
Reworked conditions, added uber-shaders, comparison nodes, fixed Discard
This commit is contained in:
@@ -41,6 +41,8 @@ namespace Nz
|
||||
void AddStruct(std::string name, std::vector<StructMember> members);
|
||||
void AddUniform(std::string name, ShaderExpressionType type, std::optional<std::size_t> bindingIndex = {}, std::optional<ShaderNodes::MemoryLayout> memoryLayout = {});
|
||||
|
||||
inline std::size_t FindConditionByName(const std::string_view& conditionName) const;
|
||||
|
||||
inline const Condition& GetCondition(std::size_t i) const;
|
||||
inline std::size_t GetConditionCount() const;
|
||||
inline const std::vector<Condition>& GetConditions() const;
|
||||
@@ -110,6 +112,8 @@ namespace Nz
|
||||
ShaderExpressionType type;
|
||||
};
|
||||
|
||||
static constexpr std::size_t InvalidCondition = std::numeric_limits<std::size_t>::max();
|
||||
|
||||
private:
|
||||
std::vector<Condition> m_conditions;
|
||||
std::vector<Function> m_functions;
|
||||
|
||||
@@ -12,6 +12,17 @@ namespace Nz
|
||||
{
|
||||
}
|
||||
|
||||
inline std::size_t ShaderAst::FindConditionByName(const std::string_view& conditionName) const
|
||||
{
|
||||
for (std::size_t i = 0; i < m_conditions.size(); ++i)
|
||||
{
|
||||
if (m_conditions[i].name == conditionName)
|
||||
return i;
|
||||
}
|
||||
|
||||
return InvalidCondition;
|
||||
}
|
||||
|
||||
inline auto Nz::ShaderAst::GetCondition(std::size_t i) const -> const Condition&
|
||||
{
|
||||
assert(i < m_functions.size());
|
||||
|
||||
@@ -141,6 +141,7 @@ namespace Nz
|
||||
};
|
||||
|
||||
NAZARA_SHADER_API ByteArray SerializeShader(const ShaderAst& shader);
|
||||
inline ShaderAst UnserializeShader(const void* data, std::size_t size);
|
||||
NAZARA_SHADER_API ShaderAst UnserializeShader(ByteStream& stream);
|
||||
}
|
||||
|
||||
|
||||
@@ -128,6 +128,12 @@ namespace Nz
|
||||
m_stream(stream)
|
||||
{
|
||||
}
|
||||
|
||||
inline ShaderAst UnserializeShader(const void* data, std::size_t size)
|
||||
{
|
||||
ByteStream byteStream(data, size);
|
||||
return UnserializeShader(byteStream);
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/Shader/DebugOff.hpp>
|
||||
|
||||
@@ -56,7 +56,12 @@ namespace Nz::ShaderBuilder
|
||||
constexpr GenBuilder<ShaderNodes::DeclareVariable> DeclareVariable;
|
||||
constexpr GenBuilder<ShaderNodes::Discard> Discard;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::Divide> Divide;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::Equality> Equal;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::CompEq> Equal;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::CompGt> GreaterThan;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::CompGe> GreaterThanOrEqual;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::CompLt> LessThan;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::CompLe> LessThanOrEqual;
|
||||
constexpr BinOpBuilder<ShaderNodes::BinaryType::CompNe> NotEqual;
|
||||
constexpr GenBuilder<ShaderNodes::ExpressionStatement> ExprStatement;
|
||||
constexpr GenBuilder<ShaderNodes::Identifier> Identifier;
|
||||
constexpr GenBuilder<ShaderNodes::IntrinsicCall> IntrinsicCall;
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace Nz::ShaderNodes
|
||||
UInt1, //< uint
|
||||
UInt2, //< uvec2
|
||||
UInt3, //< uvec3
|
||||
UInt4 //< uvec4
|
||||
UInt4 //< uvec4
|
||||
};
|
||||
|
||||
enum class BinaryType
|
||||
@@ -43,7 +43,12 @@ namespace Nz::ShaderNodes
|
||||
Multiply, //< *
|
||||
Divide, //< /
|
||||
|
||||
Equality //< ==
|
||||
CompEq, //< ==
|
||||
CompGe, //< >=
|
||||
CompGt, //< >
|
||||
CompLe, //< <=
|
||||
CompLt, //< <
|
||||
CompNe //< <=
|
||||
};
|
||||
|
||||
enum class BuiltinEntry
|
||||
@@ -87,7 +92,9 @@ namespace Nz::ShaderNodes
|
||||
IntrinsicCall,
|
||||
Sample2D,
|
||||
SwizzleOp,
|
||||
StatementBlock
|
||||
StatementBlock,
|
||||
|
||||
Max = StatementBlock
|
||||
};
|
||||
|
||||
enum class SsaInstruction
|
||||
|
||||
@@ -149,7 +149,7 @@ namespace Nz::ShaderNodes
|
||||
|
||||
|
||||
inline Discard::Discard() :
|
||||
Statement(NodeType::DeclareVariable)
|
||||
Statement(NodeType::Discard)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace Nz
|
||||
|
||||
struct States
|
||||
{
|
||||
std::unordered_set<std::string> enabledConditions;
|
||||
Nz::UInt64 enabledConditions = 0;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -3,13 +3,17 @@
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Shader/SpirvWriter.hpp>
|
||||
#include <Nazara/Math/Algorithm.hpp>
|
||||
#include <Nazara/Shader/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline bool SpirvWriter::IsConditionEnabled(const std::string& condition) const
|
||||
{
|
||||
return m_context.states->enabledConditions.find(condition) != m_context.states->enabledConditions.end();
|
||||
std::size_t conditionIndex = m_context.shader->FindConditionByName(condition);
|
||||
assert(conditionIndex != ShaderAst::InvalidCondition);
|
||||
|
||||
return TestBit<Nz::UInt64>(m_context.states->enabledConditions, conditionIndex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user