X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foutput.cpp;h=7d502739903a6cd8708cfc758aac470cad2fa17f;hb=223e295e4404a3913b8243d3b7eb12da39a68144;hp=aaba1dc4a0a638f15145dc48726344256056727a;hpb=696a97bd7411d69953c1a9e4b5f3dfb4c1d848f1;p=libs%2Fgl.git diff --git a/source/glsl/output.cpp b/source/glsl/output.cpp index aaba1dc4..7d502739 100644 --- a/source/glsl/output.cpp +++ b/source/glsl/output.cpp @@ -9,31 +9,44 @@ namespace GL { namespace SL { Formatter::Formatter(): + stage(0), + mode(Compiler::PROGRAM), source_index(0), source_line(1), indent(0), parameter_list(false) { } -void Formatter::apply(Stage &s) +const string &Formatter::apply(Stage &s, Compiler::Mode m) { - GLApi api = get_gl_api(); - const Version &ver = s.required_version; + mode = m; + stage = &s; + + const Version &ver = s.required_features.glsl_version; if(ver) { append(format("#version %d%02d", ver.major, ver.minor)); - if(api==OPENGL_ES2 && ver>=Version(3, 0)) + if(s.required_features.gl_api==OPENGL_ES2 && ver>=Version(3, 0)) append(" es"); formatted += '\n'; } - for(vector::const_iterator i=s.required_extensions.begin(); i!=s.required_extensions.end(); ++i) - append(format("#extension %s: require\n", (*i)->get_name())); - if(!s.required_extensions.empty()) - formatted += '\n'; - - StageVisitor::apply(s); + if(s.required_features.arb_explicit_attrib_location) + append("#extension arb_explicit_attrib_location: require\n"); + if(s.required_features.arb_gpu_shader5) + append("#extension arb_gpu_shader5: require\n"); + if(s.required_features.arb_uniform_buffer_object) + append("#extension arb_uniform_buffer_object: require\n"); + if(s.required_features.ext_gpu_shader4) + append("#extension ext_gpu_shader4: require\n"); + if(s.required_features.ext_texture_array) + append("#extension ext_texture_array: require\n"); + formatted += '\n'; + + s.content.visit(*this); + + return formatted; } void Formatter::append(const string &text) @@ -60,7 +73,7 @@ void Formatter::set_source(unsigned index, unsigned line) else { unsigned l = line; - if(stage->required_versionrequired_features.glsl_versionvisit(*this); @@ -94,25 +112,26 @@ void Formatter::visit(MemberAccess &memacc) void Formatter::visit(UnaryExpression &unary) { - if(unary.prefix) - append(unary.oper); + if(unary.oper->type==Operator::PREFIX) + append(unary.oper->token); unary.expression->visit(*this); - if(!unary.prefix) - append(unary.oper); + if(unary.oper->type==Operator::POSTFIX) + append(unary.oper->token); } void Formatter::visit(BinaryExpression &binary) { binary.left->visit(*this); - append(binary.oper); + append(binary.oper->token); binary.right->visit(*this); - append(binary.after); + if(binary.oper->token[0]=='[') + append(']'); } void Formatter::visit(Assignment &assign) { assign.left->visit(*this); - append(format(" %s ", assign.oper)); + append(format(" %s ", assign.oper->token)); assign.right->visit(*this); } @@ -143,10 +162,14 @@ 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) { - if(i!=block.body.begin()) + if((*i)->source==BUILTIN_SOURCE) + continue; + if(!first) append('\n'); + first = false; set_source((*i)->source, (*i)->line); append(spaces); (*i)->visit(*this); @@ -173,9 +196,9 @@ void Formatter::visit(Layout &layout) { if(i!=layout.qualifiers.begin()) append(", "); - append(i->identifier); - if(!i->value.empty()) - append(format("=%s", i->value)); + append(i->name); + if(i->has_value) + append(format("=%d", i->value)); } append(')'); } @@ -209,11 +232,11 @@ void Formatter::visit(VariableDeclaration &var) if(!var.interface.empty() && var.interface!=block_interface) { string interface = var.interface; - if(stage->required_versionrequired_features.glsl_versiontype==VERTEX && var.interface=="in") + if(stage->type==Stage::VERTEX && var.interface=="in") interface = "attribute"; - else if((stage->type==VERTEX && var.interface=="out") || (stage->type==FRAGMENT && var.interface=="in")) + else if((stage->type==Stage::VERTEX && var.interface=="out") || (stage->type==Stage::FRAGMENT && var.interface=="in")) interface = "varying"; } append(format("%s ", interface)); @@ -242,6 +265,13 @@ void Formatter::visit(InterfaceBlock &iface) SetForScope set(block_interface, iface.interface); append(format("%s %s\n", iface.interface, iface.name)); iface.members.visit(*this); + if(!iface.instance_name.empty()) + { + append(' '); + append(iface.instance_name); + if(iface.array) + append("[]"); + } append(';'); } @@ -328,6 +358,18 @@ void Formatter::visit(Iteration &iter) } } +void Formatter::visit(Passthrough &pass) +{ + append("passthrough"); + if(pass.subscript) + { + append('['); + pass.subscript->visit(*this); + append(']'); + } + append(';'); +} + void Formatter::visit(Return &ret) { append("return");