X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Foutput.cpp;h=6b76167468b73d52b16d67e78995dc0961c6c62d;hp=b85c45e30149cf38cfc7c8bc415124d6d3cc6eff;hb=76cc18518fc8b0b4fa11fda153e7d9b3899ed112;hpb=a4cd67f1c9f1f375bacacfbb421d40f78a22644b diff --git a/source/glsl/output.cpp b/source/glsl/output.cpp index b85c45e3..6b761674 100644 --- a/source/glsl/output.cpp +++ b/source/glsl/output.cpp @@ -8,16 +8,7 @@ namespace Msp { namespace GL { namespace SL { -Formatter::Formatter(): - stage(0), - source_index(0), - source_line(1), - indent(0), - parameter_list(false), - omit_builtin(false) -{ } - -const string &Formatter::apply(Stage &s) +string Formatter::apply(Stage &s) { stage = &s; omit_builtin = true; @@ -27,21 +18,27 @@ const string &Formatter::apply(Stage &s) if(ver) { append(format("#version %d%02d", ver.major, ver.minor)); - if(s.required_features.gl_api==OPENGL_ES2 && ver>=Version(3, 0)) + if(s.required_features.target_api==OPENGL_ES && ver>=Version(3, 0)) append(" es"); formatted += '\n'; } + if(s.required_features.arb_enhanced_layouts) + append("#extension GL_ARB_enhanced_layouts: require\n"); if(s.required_features.arb_explicit_attrib_location) - append("#extension arb_explicit_attrib_location: require\n"); + append("#extension GL_ARB_explicit_attrib_location: require\n"); + if(s.required_features.arb_explicit_uniform_location) + append("#extension GL_ARB_explicit_uniform_location: require\n"); if(s.required_features.arb_gpu_shader5) - append("#extension arb_gpu_shader5: require\n"); + append("#extension GL_ARB_gpu_shader5: require\n"); + if(s.required_features.arb_separate_shader_objects) + append("#extension GL_ARB_separate_shader_objects: require\n"); if(s.required_features.arb_uniform_buffer_object) - append("#extension arb_uniform_buffer_object: require\n"); + append("#extension GL_ARB_uniform_buffer_object: require\n"); if(s.required_features.ext_gpu_shader4) - append("#extension ext_gpu_shader4: require\n"); + append("#extension GL_EXT_gpu_shader4: require\n"); if(s.required_features.ext_texture_array) - append("#extension ext_texture_array: require\n"); + append("#extension GL_EXT_texture_array: require\n"); formatted += '\n'; s.content.visit(*this); @@ -52,8 +49,8 @@ const string &Formatter::apply(Stage &s) void Formatter::append(const string &text) { formatted += text; - for(string::const_iterator i=text.begin(); i!=text.end(); ++i) - if(*i=='\n') + for(char c: text) + if(c=='\n') ++source_line; } @@ -92,16 +89,16 @@ void Formatter::visit(Block &block) SetForScope set(indent, indent+(indent>0 || use_braces)); string spaces(indent*2, ' '); bool first = true; - for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) + for(const RefPtr &s: block.body) { - if(omit_builtin && (*i)->source<=BUILTIN_SOURCE) + if(omit_builtin && s->source<=BUILTIN_SOURCE) continue; if(!first) append('\n'); first = false; - set_source((*i)->source, (*i)->line); + set_source(s->source, s->line); append(spaces); - (*i)->visit(*this); + s->visit(*this); } if(use_braces) @@ -148,17 +145,23 @@ void Formatter::visit(Literal &literal) void Formatter::visit(VariableReference &var) { append(var.name); + r_empty_name = false; } void Formatter::visit(InterfaceBlockReference &iface) { - append(iface.name); + r_empty_name = iface.declaration->instance_name.empty(); + if(!r_empty_name) + append(iface.declaration->instance_name); } void Formatter::visit(MemberAccess &memacc) { visit_expression(*memacc.left, memacc.oper, false); - append(format(".%s", memacc.member)); + if(!r_empty_name) + append('.'); + append(memacc.member); + r_empty_name = false; } void Formatter::visit(Swizzle &swizzle) @@ -197,7 +200,7 @@ void Formatter::visit(TernaryExpression &ternary) visit_expression(*ternary.condition, ternary.oper, false); append(ternary.oper->token); visit_expression(*ternary.true_expr, ternary.oper, false); - if(ternary.oper->token2) + if(ternary.oper->token2[0]) append(ternary.oper->token2); visit_expression(*ternary.false_expr, ternary.oper, true); } @@ -205,7 +208,7 @@ void Formatter::visit(TernaryExpression &ternary) void Formatter::visit(FunctionCall &call) { append(format("%s(", call.name)); - for(NodeArray::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i) + for(auto i=call.arguments.begin(); i!=call.arguments.end(); ++i) { if(i!=call.arguments.begin()) append(", "); @@ -233,7 +236,7 @@ void Formatter::visit(Precision &prec) void Formatter::visit(Layout &layout) { append("layout("); - for(vector::const_iterator i=layout.qualifiers.begin(); i!=layout.qualifiers.end(); ++i) + for(auto i=layout.qualifiers.begin(); i!=layout.qualifiers.end(); ++i) { if(i!=layout.qualifiers.begin()) append(", "); @@ -306,7 +309,12 @@ void Formatter::visit(VariableDeclaration &var) void Formatter::visit(InterfaceBlock &iface) { - append(format("%s %s\n", iface.interface, iface.name)); + if(iface.layout) + { + iface.layout->visit(*this); + append(' '); + } + append(format("%s %s\n", iface.interface, iface.block_name)); if(iface.struct_declaration) iface.struct_declaration->members.visit(*this); if(!iface.instance_name.empty()) @@ -322,7 +330,7 @@ void Formatter::visit(InterfaceBlock &iface) void Formatter::visit(FunctionDeclaration &func) { append(format("%s %s(", func.return_type_declaration->name, func.name)); - for(NodeArray::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) + for(auto i=func.parameters.begin(); i!=func.parameters.end(); ++i) { if(i!=func.parameters.begin()) append(", ");