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;
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::Branch& node) override;

View File

@ -62,6 +62,8 @@ namespace Nz { namespace ShaderBuilder
constexpr GenBuilder<Nz::ShaderAst::Branch> Branch;
constexpr GenBuilder<Nz::ShaderAst::Constant> Constant;
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;
} }

View File

@ -24,7 +24,7 @@ namespace Nz
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 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::Branch& node) = 0;

View File

@ -25,15 +25,20 @@ namespace Nz
node->Register(*this);
for (const auto& pair : state.m_uniforms)
// Uniforms
if (state.m_uniforms.empty())
{
Append(pair.first);
Append(" ");
Append(pair.second);
AppendLine(";");
}
for (const auto& pair : state.m_uniforms)
{
Append("uniform ");
Append(pair.first);
Append(" ");
Append(pair.second);
AppendLine(";");
}
AppendLine();
AppendLine();
}
Function entryPoint;
entryPoint.name = "main"; //< GLSL has only one entry point name possible
@ -56,12 +61,52 @@ namespace Nz
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");
if (m_currentFunction)
m_currentFunction->variables.insert(std::make_pair(type, name));
switch (kind)
{
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)

View File

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