Renderer/GlslWriter: Add support for Uniform and Parameters variables

This commit is contained in:
Lynix 2017-01-04 12:34:47 +01:00
parent 5c3e67bb26
commit d538a7ddf5
5 changed files with 60 additions and 13 deletions

View File

@ -28,7 +28,7 @@ namespace Nz
Nz::String Generate(const ShaderAst::StatementPtr& node) override; Nz::String Generate(const ShaderAst::StatementPtr& node) override;
void RegisterFunction(const String& name, ShaderAst::StatementPtr statement, std::initializer_list<ShaderAst::VariablePtr> parameters, ShaderAst::ExpressionType ret) override; void RegisterFunction(const String& name, ShaderAst::StatementPtr statement, std::initializer_list<ShaderAst::VariablePtr> parameters, ShaderAst::ExpressionType ret) override;
void RegisterVariable(const String& name, ShaderAst::ExpressionType type) override; void RegisterVariable(ShaderAst::VariableType kind, const String& name, ShaderAst::ExpressionType type) override;
void Write(const ShaderAst::AssignOp& node) override; void Write(const ShaderAst::AssignOp& node) override;
void Write(const ShaderAst::Branch& node) override; void Write(const ShaderAst::Branch& node) override;

View File

@ -62,6 +62,8 @@ namespace Nz { namespace ShaderBuilder
constexpr GenBuilder<Nz::ShaderAst::Branch> Branch; constexpr GenBuilder<Nz::ShaderAst::Branch> Branch;
constexpr GenBuilder<Nz::ShaderAst::Constant> Constant; constexpr GenBuilder<Nz::ShaderAst::Constant> Constant;
constexpr GenBuilder<Nz::ShaderAst::ExpressionStatement> ExprStatement; constexpr GenBuilder<Nz::ShaderAst::ExpressionStatement> ExprStatement;
constexpr VarBuilder<Nz::ShaderAst::VariableType::Parameter> Parameter;
constexpr VarBuilder<Nz::ShaderAst::VariableType::Uniform> Uniform;
constexpr VarBuilder<Nz::ShaderAst::VariableType::Variable> Variable; constexpr VarBuilder<Nz::ShaderAst::VariableType::Variable> Variable;
} } } }

View File

@ -24,7 +24,7 @@ namespace Nz
virtual Nz::String Generate(const ShaderAst::StatementPtr& node) = 0; virtual Nz::String Generate(const ShaderAst::StatementPtr& node) = 0;
virtual void RegisterFunction(const String& name, ShaderAst::StatementPtr node, std::initializer_list<ShaderAst::VariablePtr> parameters, ShaderAst::ExpressionType ret) = 0; virtual void RegisterFunction(const String& name, ShaderAst::StatementPtr node, std::initializer_list<ShaderAst::VariablePtr> parameters, ShaderAst::ExpressionType ret) = 0;
virtual void RegisterVariable(const String& name, ShaderAst::ExpressionType type) = 0; virtual void RegisterVariable(ShaderAst::VariableType kind, const String& name, ShaderAst::ExpressionType type) = 0;
virtual void Write(const ShaderAst::AssignOp& node) = 0; virtual void Write(const ShaderAst::AssignOp& node) = 0;
virtual void Write(const ShaderAst::Branch& node) = 0; virtual void Write(const ShaderAst::Branch& node) = 0;

View File

@ -25,15 +25,20 @@ namespace Nz
node->Register(*this); node->Register(*this);
for (const auto& pair : state.m_uniforms) // Uniforms
if (state.m_uniforms.empty())
{ {
Append(pair.first); for (const auto& pair : state.m_uniforms)
Append(" "); {
Append(pair.second); Append("uniform ");
AppendLine(";"); Append(pair.first);
} Append(" ");
Append(pair.second);
AppendLine(";");
}
AppendLine(); AppendLine();
}
Function entryPoint; Function entryPoint;
entryPoint.name = "main"; //< GLSL has only one entry point name possible entryPoint.name = "main"; //< GLSL has only one entry point name possible
@ -56,12 +61,52 @@ namespace Nz
m_functions[name] = std::move(func); m_functions[name] = std::move(func);
} }
void GlslWriter::RegisterVariable(const String& name, ShaderAst::ExpressionType type) void GlslWriter::RegisterVariable(ShaderAst::VariableType kind, const String& name, ShaderAst::ExpressionType type)
{ {
NazaraAssert(m_currentState, "This function should only be called while processing an AST"); NazaraAssert(m_currentState, "This function should only be called while processing an AST");
if (m_currentFunction) switch (kind)
m_currentFunction->variables.insert(std::make_pair(type, name)); {
case ShaderAst::VariableType::Parameter:
{
if (m_currentFunction)
{
bool found = false;
for (const auto& varPtr : m_currentFunction->parameters)
{
if (varPtr->name == name)
{
found = true;
if (varPtr->type != type)
{
//TODO: AstParseError
throw std::runtime_error("Function uses parameter \"" + name + "\" with a different type than specified in the function arguments");
}
break;
}
}
if (!found)
//TODO: AstParseError
throw std::runtime_error("Function has no parameter \"" + name + "\"");
}
break;
}
case ShaderAst::VariableType::Uniform:
m_currentState->m_uniforms.insert(std::make_pair(type, name));
break;
case ShaderAst::VariableType::Variable:
{
if (m_currentFunction)
m_currentFunction->variables.insert(std::make_pair(type, name));
break;
}
}
} }
void GlslWriter::Write(const ShaderAst::NodePtr& node) void GlslWriter::Write(const ShaderAst::NodePtr& node)

View File

@ -33,7 +33,7 @@ namespace Nz { namespace ShaderAst
void Variable::Register(ShaderWriter& visitor) void Variable::Register(ShaderWriter& visitor)
{ {
visitor.RegisterVariable(name, type); visitor.RegisterVariable(kind, name, type);
} }
void Variable::Visit(ShaderWriter& visitor) void Variable::Visit(ShaderWriter& visitor)