-bool LegacyConverter::supports_interface_blocks(const string &iface) const
-{
- if(features.target_api==OPENGL_ES)
- {
- if(iface=="uniform")
- return check_version(Version(3, 0));
- else
- return check_version(Version(3, 20));
- }
- else if(check_version(Version(1, 50)))
- return true;
- else if(iface=="uniform")
- return check_extension(&Features::arb_uniform_buffer_object);
- else
- return false;
-}
-
-bool LegacyConverter::supports_interface_block_location() const
-{
- if(features.target_api==OPENGL_ES)
- return check_version(Version(3, 20));
- else if(check_version(Version(4, 40)))
- return true;
- else
- return check_extension(&Features::arb_enhanced_layouts);
-}
-
-void LegacyConverter::visit(InterfaceBlock &iface)
-{
- if(iface.layout)
- {
- for(auto i=iface.layout->qualifiers.begin(); i!=iface.layout->qualifiers.end(); )
- {
- if(i->name=="location" && !supports_interface_block_location())
- i = iface.layout->qualifiers.erase(i);
- else if(i->name=="binding" && !supports_binding())
- {
- stage->uniform_block_bindings[iface.block_name] = i->value;
- i = iface.layout->qualifiers.erase(i);
- }
- else
- ++i;
- }
-
- if(iface.layout->qualifiers.empty())
- iface.layout = 0;
- }
-
- if(!supports_interface_blocks(iface.interface) && iface.type_declaration)
- {
- if(!iface.instance_name.empty())
- unsupported("ARB_uniform_buffer_object required for interface block instances");
- else if(iface.struct_declaration)
- {
- stage->content.body.splice(uniform_insert_point, iface.struct_declaration->members.body);
- nodes_to_remove.insert(&iface);
- nodes_to_remove.insert(iface.struct_declaration);
- }
- else
- /* If the interface block is an array, it should have an instance
- name too, so this should never be reached */
- throw logic_error("Unexpected interface block configuration");
- }
-}
-