X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=3bdca5cb7d02dcbf786e69dd60d9f0b3b394d554;hb=ea844415db7fb7705ecbfea9cf27df2a8f00b802;hp=e89aa4942ad768bb32318dad10cde682de7c78f8;hpb=25629675e83449d986ef8896e830db562a8ae64e;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index e89aa494..3bdca5cb 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -169,6 +169,17 @@ void LocationAllocator::add_layout_value(RefPtr &layout, const string &n layout->qualifiers.push_back(Layout::Qualifier(name, value)); } +bool LocationAllocator::visit_uniform(const string &name, RefPtr &layout) +{ + int bind_point = (layout ? get_layout_value(*layout, "binding") : -1); + if(bind_point>=0) + { + used_bindings[0].insert(bind_point); + uniforms[name].bind_point = bind_point; + } + return bind_point>=0; +} + void LocationAllocator::visit(VariableDeclaration &var) { if(!var.name.compare(0, 3, "gl_")) @@ -199,20 +210,9 @@ void LocationAllocator::visit(VariableDeclaration &var) if(var.interface=="uniform") { - const TypeDeclaration *type = var.type_declaration; - while(const BasicTypeDeclaration *basic = dynamic_cast(type)) - type = basic->base_type; - if(dynamic_cast(type)) - { - int bind_point = (var.layout ? get_layout_value(*var.layout, "binding") : -1); - if(bind_point>=0) - { - used_bindings[0].insert(bind_point); - uniforms[var.name].bind_point = bind_point; - } - else - unbound_textures.push_back(&var); - } + const TypeDeclaration *base_type = get_ultimate_base_type(var.type_declaration); + if(dynamic_cast(base_type) && !visit_uniform(var.name, var.layout)) + unbound_textures.push_back(&var); } } @@ -230,18 +230,8 @@ void LocationAllocator::visit(InterfaceBlock &iface) push_constant = (i!=iface.layout->qualifiers.end()); } - if(!push_constant) - { - int bind_point = (iface.layout ? get_layout_value(*iface.layout, "binding") : -1); - - if(bind_point>=0) - { - used_bindings[0].insert(bind_point); - uniforms[iface.block_name].bind_point = bind_point; - } - else - unbound_blocks.push_back(&iface); - } + if(!push_constant && !visit_uniform(iface.block_name, iface.layout)) + unbound_blocks.push_back(&iface); } } @@ -667,10 +657,7 @@ void QualifierConverter::visit(VariableDeclaration &var) } else if(i->name=="binding" && !supports_binding()) { - const TypeDeclaration *type = var.type_declaration; - while(const BasicTypeDeclaration *basic = dynamic_cast(type)) - type = basic->base_type; - if(dynamic_cast(type)) + if(dynamic_cast(get_ultimate_base_type(var.type_declaration))) stage->texture_bindings[var.name] = i->value; i = var.layout->qualifiers.erase(i);