From: Mikko Rasa Date: Thu, 11 Nov 2021 10:49:08 +0000 (+0200) Subject: Propagate locations from existing variables before optimization X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=89de98315588ec89ad66e9a4f3f90bf03e1f7733;hp=efbce87192ce73ba577684369f759693dccec67c Propagate locations from existing variables before optimization Uniform location and binding qualifiers should apply to all copies of the variable even if the one originally containing them is optimized out. --- diff --git a/source/glsl/compiler.cpp b/source/glsl/compiler.cpp index e676fcc8..4e9f94d8 100644 --- a/source/glsl/compiler.cpp +++ b/source/glsl/compiler.cpp @@ -75,6 +75,7 @@ void Compiler::compile(Mode mode) for(Stage &s: module->stages) generate(s); ConstantIdAssigner().apply(*module, features); + LocationAllocator().apply(*module, features, false); for(Stage &s: module->stages) validate(s); diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 7eb0165d..cb304aa3 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) +void LocationAllocator::apply(Module &module, const Features &features, bool a) { + alloc_new = a; for(Stage &s: module.stages) apply(s); @@ -111,6 +112,9 @@ void LocationAllocator::allocate_locations(const string &iface) } } + if(!alloc_new) + continue; + set &used = used_locations[(*i)->interface]; unsigned size = LocationCounter().apply(**i); @@ -142,7 +146,7 @@ void LocationAllocator::bind_uniform(RefPtr &layout, const string &name, auto i = uniforms.find(name); if(i!=uniforms.end() && i->second.bind_point>=0) add_layout_qualifier(layout, Layout::Qualifier("binding", i->second.bind_point)); - else + else if(alloc_new) { set &used = used_bindings[0]; diff --git a/source/glsl/finalize.h b/source/glsl/finalize.h index bde0618a..ab4276f5 100644 --- a/source/glsl/finalize.h +++ b/source/glsl/finalize.h @@ -36,6 +36,7 @@ private: Uniform(): location(-1), desc_set(-1), bind_point(-1) { } }; + bool alloc_new = true; std::map > used_locations; std::map uniforms; std::map > used_bindings; @@ -44,7 +45,7 @@ private: std::vector unbound_blocks; public: - void apply(Module &, const Features &); + void apply(Module &, const Features &, bool = true); private: void apply(Stage &);