]> git.tdb.fi Git - libs/gl.git/commitdiff
Handle descriptor sets when allocating uniform locations
authorMikko Rasa <tdb@tdb.fi>
Thu, 11 Nov 2021 10:56:28 +0000 (12:56 +0200)
committerMikko Rasa <tdb@tdb.fi>
Thu, 11 Nov 2021 10:56:28 +0000 (12:56 +0200)
source/glsl/finalize.cpp
source/glsl/finalize.h
source/glsl/validate.cpp

index cb304aa31d6b979efab1d9e3f63659be10334e3d..60312be8adf8fc09cdb6a55ed76de342b9f3da46 100644 (file)
@@ -62,8 +62,9 @@ void StructOrganizer::visit(VariableDeclaration &var)
 }
 
 
-void LocationAllocator::apply(Module &module, const Features &features, bool a)
+void LocationAllocator::apply(Module &module, const Features &f, bool a)
 {
+       features = f;
        alloc_new = a;
        for(Stage &s: module.stages)
                apply(s);
@@ -144,11 +145,16 @@ void LocationAllocator::allocate_locations(const string &iface)
 void LocationAllocator::bind_uniform(RefPtr<Layout> &layout, const string &name, unsigned range)
 {
        auto i = uniforms.find(name);
+
+       int desc_set = (i!=uniforms.end() ? i->second.desc_set : 0);
+       if(features.target_api==VULKAN && get_layout_value(layout.get(), "set")<0)
+               add_layout_qualifier(layout, Layout::Qualifier("set", desc_set));
+
        if(i!=uniforms.end() && i->second.bind_point>=0)
                add_layout_qualifier(layout, Layout::Qualifier("binding", i->second.bind_point));
        else if(alloc_new)
        {
-               set<unsigned> &used = used_bindings[0];
+               set<unsigned> &used = used_bindings[desc_set];
 
                unsigned bind_point = fold32(hash64(name))%range;
                while(used.count(bind_point))
@@ -162,12 +168,28 @@ void LocationAllocator::bind_uniform(RefPtr<Layout> &layout, const string &name,
 
 bool LocationAllocator::visit_uniform(const string &name, RefPtr<Layout> &layout)
 {
+       int desc_set = 0;
        int bind_point = get_layout_value(layout.get(), "binding");
+
+       if(features.target_api==VULKAN)
+       {
+               desc_set = get_layout_value(layout.get(), "set");
+               if(desc_set<0 && bind_point>=0)
+               {
+                       desc_set = 0;
+                       add_layout_qualifier(layout, Layout::Qualifier("set", desc_set));
+               }
+
+               if(desc_set>=0)
+                       uniforms[name].desc_set = desc_set;
+       }
+
        if(bind_point>=0)
        {
-               used_bindings[0].insert(bind_point);
+               used_bindings[desc_set].insert(bind_point);
                uniforms[name].bind_point = bind_point;
        }
+
        return bind_point>=0;
 }
 
index ab4276f560420b3e289cd7d1a912efa1a83c22b4..19ad594781825a5cef996fe9c1958cb392074395 100644 (file)
@@ -33,9 +33,10 @@ private:
                int desc_set;
                int bind_point;
 
-               Uniform(): location(-1), desc_set(-1), bind_point(-1) { }
+               Uniform(): location(-1), desc_set(0), bind_point(-1) { }
        };
 
+       Features features;
        bool alloc_new = true;
        std::map<std::string, std::set<unsigned> > used_locations;
        std::map<std::string, Uniform> uniforms;
index 6a4b8eb0dc0e34ced99b82fcc08d41c22c569bf0..7d3d20d1c78eb104c85ac8ef511a099b5115ae5e 100644 (file)
@@ -834,6 +834,11 @@ void GlobalInterfaceValidator::check_uniform(const Uniform &uni)
                        error(*uni.node, format("Mismatched location %d for uniform '%s'", uni.location, uni.name));
                        add_info(*i->second->node, format("Previously declared here with location %d", i->second->location));
                }
+               if(i->second->desc_set!=uni.desc_set)
+               {
+                       error(*uni.node, format("Mismatched descriptor set %d for uniform '%s'", uni.desc_set, uni.name));
+                       add_info(*i->second->node, format("Previously declared here with descriptor set %d", i->second->desc_set));
+               }
                if(uni.bind_point>=0 && i->second->bind_point>=0 && i->second->bind_point!=uni.bind_point)
                {
                        error(*uni.node, format("Mismatched binding %d for uniform '%s'", uni.bind_point, uni.name));