X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;fp=source%2Fglsl%2Ffinalize.cpp;h=2fff7549cab5b3c150feb3f7c223d314da324999;hb=6997ed1c07c382c0f66c57c080934ad53e1d3713;hp=f005d87dcbf82749e33eb1ba8c55fdbece642b76;hpb=d03f6d46d0646c53ec3dcd00ddfd6c718ad18720;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index f005d87d..2fff7549 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -221,15 +221,25 @@ void LocationAllocator::visit(InterfaceBlock &iface) if(iface.interface=="uniform") { - int bind_point = (iface.layout ? get_layout_value(*iface.layout, "binding") : -1); + bool push_constant = false; + if(iface.layout) + { + auto i = find_member(iface.layout->qualifiers, string("push_constant"), &Layout::Qualifier::name); + push_constant = (i!=iface.layout->qualifiers.end()); + } - if(bind_point>=0) + if(!push_constant) { - used_bindings[0].insert(bind_point); - uniforms[iface.block_name].bind_point = bind_point; + 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); } - else - unbound_blocks.push_back(&iface); } } @@ -636,6 +646,7 @@ bool LegacyConverter::supports_interface_block_location() const void LegacyConverter::visit(InterfaceBlock &iface) { + bool push_constant = false; if(iface.layout) { for(auto i=iface.layout->qualifiers.begin(); i!=iface.layout->qualifiers.end(); ) @@ -648,14 +659,18 @@ void LegacyConverter::visit(InterfaceBlock &iface) i = iface.layout->qualifiers.erase(i); } else + { + if(i->name=="push_constant") + push_constant = true; ++i; + } } if(iface.layout->qualifiers.empty()) iface.layout = 0; } - if(!supports_interface_blocks(iface.interface) && iface.type_declaration) + if((!supports_interface_blocks(iface.interface) || push_constant) && iface.type_declaration) { if(!iface.instance_name.empty()) unsupported("ARB_uniform_buffer_object required for interface block instances");