]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/finalize.cpp
Allow a push constant block to be specified, but flatten it for now
[libs/gl.git] / source / glsl / finalize.cpp
index f005d87dcbf82749e33eb1ba8c55fdbece642b76..2fff7549cab5b3c150feb3f7c223d314da324999 100644 (file)
@@ -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");