X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foutput.cpp;h=364e5e4b23c02356a2c72743103ba212a32abd91;hb=3a1fe833ea04df75449706f1d773f6e65521a392;hp=6e88fd1f870e6ba554a0fbfa0ddaba93d6347720;hpb=1fa69bb8eec3070f5da296d6dd0bd67aea62d3bf;p=libs%2Fgl.git diff --git a/source/glsl/output.cpp b/source/glsl/output.cpp index 6e88fd1f..364e5e4b 100644 --- a/source/glsl/output.cpp +++ b/source/glsl/output.cpp @@ -13,30 +13,38 @@ Formatter::Formatter(): source_index(0), source_line(1), indent(0), - parameter_list(false) + parameter_list(false), + omit_builtin(false) { } const string &Formatter::apply(Stage &s) { - SetForScope set_stage(stage, &s); + stage = &s; + omit_builtin = true; - GLApi api = get_gl_api(); - const Version &ver = s.required_version; + 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'; + 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'; - visit(s.content); + s.content.visit(*this); return formatted; } @@ -65,7 +73,7 @@ void Formatter::set_source(unsigned index, unsigned line) else { unsigned l = line; - if(stage->required_versionrequired_features.glsl_version && stage->required_features.glsl_version 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(omit_builtin && (*i)->source<=BUILTIN_SOURCE) + continue; + if(!first) + append('\n'); + first = false; + set_source((*i)->source, (*i)->line); + append(spaces); + (*i)->visit(*this); + } + + if(use_braces) + append(format("\n%s}", string(brace_indent*2, ' '))); +} + void Formatter::visit(Literal &literal) { append(literal.token); @@ -91,36 +125,58 @@ void Formatter::visit(VariableReference &var) append(var.name); } +void Formatter::visit(InterfaceBlockReference &iface) +{ + append(iface.name); +} + void Formatter::visit(MemberAccess &memacc) { memacc.left->visit(*this); append(format(".%s", memacc.member)); } +void Formatter::visit(Swizzle &swizzle) +{ + swizzle.left->visit(*this); + append(format(".%s", swizzle.component_group)); +} + 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); } +void Formatter::visit(TernaryExpression &ternary) +{ + ternary.condition->visit(*this); + append(ternary.oper->token); + ternary.true_expr->visit(*this); + if(ternary.oper->token[0]=='?') + append(':'); + ternary.false_expr->visit(*this); +} + void Formatter::visit(FunctionCall &call) { append(format("%s(", call.name)); @@ -139,28 +195,6 @@ void Formatter::visit(ExpressionStatement &expr) append(';'); } -void Formatter::visit(Block &block) -{ - unsigned brace_indent = indent; - bool use_braces = (block.use_braces || (indent && block.body.size()!=1)); - if(use_braces) - append(format("%s{\n", string(brace_indent*2, ' '))); - - SetForScope set(indent, indent+(indent>0 || use_braces)); - string spaces(indent*2, ' '); - for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) - { - if(i!=block.body.begin()) - append('\n'); - set_source((*i)->source, (*i)->line); - append(spaces); - (*i)->visit(*this); - } - - if(use_braces) - append(format("\n%s}", string(brace_indent*2, ' '))); -} - void Formatter::visit(Import &import) { append(format("import %s;", import.module)); @@ -178,9 +212,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(')'); } @@ -211,10 +245,10 @@ void Formatter::visit(VariableDeclaration &var) append(format("%s ", var.interpolation)); if(!var.sampling.empty()) append(format("%s ", var.sampling)); - if(!var.interface.empty() && var.interface!=block_interface) + if(!var.interface.empty()) { string interface = var.interface; - if(stage->required_versionrequired_features.glsl_version && stage->required_features.glsl_versiontype==Stage::VERTEX && var.interface=="in") interface = "attribute"; @@ -225,7 +259,10 @@ void Formatter::visit(VariableDeclaration &var) } if(!var.precision.empty()) append(format("%s ", var.precision)); - append(format("%s %s", var.type, var.name)); + string type_name = var.type_declaration->name; + if(var.array) + type_name = type_name.substr(0, type_name.find('[')); + append(format("%s %s", type_name, var.name)); if(var.array) { append('['); @@ -244,15 +281,22 @@ void Formatter::visit(VariableDeclaration &var) 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.struct_declaration) + iface.struct_declaration->members.visit(*this); + if(!iface.instance_name.empty()) + { + append(' '); + append(iface.instance_name); + if(iface.array) + append("[]"); + } append(';'); } void Formatter::visit(FunctionDeclaration &func) { - append(format("%s %s(", func.return_type, func.name)); + append(format("%s %s(", func.return_type_declaration->name, func.name)); for(NodeArray::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) { if(i!=func.parameters.begin()) @@ -333,6 +377,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");