X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=60312be8adf8fc09cdb6a55ed76de342b9f3da46;hp=cb304aa31d6b979efab1d9e3f63659be10334e3d;hb=76cc18518fc8b0b4fa11fda153e7d9b3899ed112;hpb=89de98315588ec89ad66e9a4f3f90bf03e1f7733 diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index cb304aa3..60312be8 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -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, 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 &used = used_bindings[0]; + set &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, const string &name, bool LocationAllocator::visit_uniform(const string &name, RefPtr &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; }