namespace SL {
DefaultPrecisionGenerator::DefaultPrecisionGenerator():
- toplevel(true)
+ stage(0)
{ }
+void DefaultPrecisionGenerator::apply(Stage &s)
+{
+ stage = &s;
+ visit(s.content);
+}
+
void DefaultPrecisionGenerator::visit(Block &block)
{
- if(toplevel)
+ for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
{
- SetForScope<bool> set(toplevel, false);
- BlockModifier::visit(block);
+ if(&block==&stage->content)
+ insert_point = i;
+ (*i)->visit(*this);
}
- else
- StageVisitor::visit(block);
}
void DefaultPrecisionGenerator::visit(Precision &prec)
else
prec->precision = "highp";
prec->type = type;
- insert_nodes.push_back(prec);
+ stage->content.body.insert(insert_point, prec);
have_default.insert(type);
}
}
-void PrecisionRemover::visit(Precision &)
+void PrecisionRemover::apply(Stage &stage)
{
- remove_node = true;
+ visit(stage.content);
+ NodeRemover().apply(stage, nodes_to_remove);
+}
+
+void PrecisionRemover::visit(Precision &prec)
+{
+ nodes_to_remove.insert(&prec);
}
void PrecisionRemover::visit(VariableDeclaration &var)
frag_out(0)
{ }
-LegacyConverter::LegacyConverter(const Version &v):
- target_api(get_gl_api()),
- target_version(v),
- frag_out(0)
-{ }
+void LegacyConverter::apply(Stage &s)
+{
+ stage = &s;
+ visit(s.content);
+}
+
+void LegacyConverter::visit(Block &block)
+{
+ for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+ {
+ if(&block==&stage->content)
+ uniform_insert_point = i;
+ (*i)->visit(*this);
+ }
+}
bool LegacyConverter::check_version(const Version &feature_version) const
{
void LegacyConverter::visit(FunctionCall &call)
{
- if(call.name=="texture" && !call.declaration && !supports_unified_sampling_functions())
+ if(call.name=="texture")
{
+ string sampler_type;
+ type = string();
NodeArray<Expression>::iterator i = call.arguments.begin();
if(i!=call.arguments.end())
{
(*i)->visit(*this);
- if(type=="sampler1D")
+ sampler_type = type;
+
+ for(; i!=call.arguments.end(); ++i)
+ (*i)->visit(*this);
+ }
+
+ if(!supports_unified_sampling_functions())
+ {
+ if(sampler_type=="sampler1D")
call.name = "texture1D";
- else if(type=="sampler2D")
+ else if(sampler_type=="sampler2D")
call.name = "texture2D";
- else if(type=="sampler3D")
+ else if(sampler_type=="sampler3D")
call.name = "texture3D";
- else if(type=="samplerCube")
+ else if(sampler_type=="samplerCube")
call.name = "textureCube";
- else if(type=="sampler1DShadow")
+ else if(sampler_type=="sampler1DShadow")
call.name = "shadow1D";
- else if(type=="sampler2DShadow")
+ else if(sampler_type=="sampler2DShadow")
call.name = "shadow2D";
- else if(type=="sampler1DArray")
+ else if(sampler_type=="sampler1DArray")
{
check_extension(EXT_texture_array);
call.name = "texture1DArray";
}
- else if(type=="sampler2DArray")
+ else if(sampler_type=="sampler2DArray")
{
check_extension(EXT_texture_array);
call.name = "texture2DArray";
}
- else if(type=="sampler1DArrayShadow")
+ else if(sampler_type=="sampler1DArrayShadow")
{
check_extension(EXT_texture_array);
call.name = "shadow1DArray";
}
- else if(type=="sampler2DArrayShadow")
+ else if(sampler_type=="sampler2DArrayShadow")
{
check_extension(EXT_texture_array);
call.name = "shadow2DArray";
}
-
- for(; i!=call.arguments.end(); ++i)
- (*i)->visit(*this);
}
}
else
if(stage->type==Stage::FRAGMENT && var.interface=="out")
{
frag_out = &var;
- remove_node = true;
+ nodes_to_remove.insert(&var);
}
}
void LegacyConverter::visit(InterfaceBlock &iface)
{
if(!supports_interface_blocks(iface.interface))
- flatten_block(iface.members);
+ {
+ stage->content.body.splice(uniform_insert_point, iface.members.body);
+ nodes_to_remove.insert(&iface);
+ }
}
} // namespace SL