X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=f005d87dcbf82749e33eb1ba8c55fdbece642b76;hb=d03f6d46d0646c53ec3dcd00ddfd6c718ad18720;hp=e444974ae9fbe26cc4e0168e063cd4b8177f8416;hpb=e6077f9f25b794c174e1017c2c0763e77a6fddda;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index e444974a..f005d87d 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -12,10 +12,6 @@ namespace Msp { namespace GL { namespace SL { -StructOrganizer::StructOrganizer(): - offset(-1) -{ } - void StructOrganizer::visit(StructDeclaration &strct) { SetForScope set_offset(offset, 0); @@ -238,10 +234,6 @@ void LocationAllocator::visit(InterfaceBlock &iface) } -PrecisionConverter::PrecisionConverter(): - stage(0) -{ } - void PrecisionConverter::apply(Stage &s) { stage = &s; @@ -308,10 +300,6 @@ void PrecisionConverter::visit(VariableDeclaration &var) } -LegacyConverter::LegacyConverter(): - frag_out(0) -{ } - void LegacyConverter::apply(Stage &s, const Features &feat) { stage = &s; @@ -348,6 +336,15 @@ void LegacyConverter::visit(Block &block) } } +void LegacyConverter::visit(RefPtr &expr) +{ + r_replaced_reference = 0; + expr->visit(*this); + if(r_replaced_reference) + expr = r_replaced_reference; + r_replaced_reference = 0; +} + bool LegacyConverter::check_version(const Version &feature_version) const { if(features.glsl_versionname = memacc.member; + r_replaced_reference = var; + } +} + void LegacyConverter::visit(Assignment &assign) { TraversingVisitor::visit(assign); @@ -586,6 +600,10 @@ void LegacyConverter::visit(VariableDeclaration &var) } } + if(var.name=="gl_ClipDistance") + if(const Literal *literal_size = dynamic_cast(var.array_size.get())) + stage->n_clip_distances = literal_size->value.value(); + TraversingVisitor::visit(var); } @@ -643,6 +661,9 @@ void LegacyConverter::visit(InterfaceBlock &iface) unsupported("ARB_uniform_buffer_object required for interface block instances"); else if(iface.struct_declaration) { + for(const RefPtr &s: iface.struct_declaration->members.body) + if(VariableDeclaration *var = dynamic_cast(s.get())) + var->interface = iface.interface; stage->content.body.splice(uniform_insert_point, iface.struct_declaration->members.body); nodes_to_remove.insert(&iface); nodes_to_remove.insert(iface.struct_declaration);