- stage->locations[var.name] = i->value;
- var.layout->qualifiers.erase(i);
- }
- else if(stage->type==Stage::FRAGMENT && var.interface=="out")
- {
- if(check_extension(&Features::ext_gpu_shader4))
- stage->locations[var.name] = i->value;
- else if(i->value!=0)
- unsupported("EXT_gpu_shader4 required for multiple fragment shader outputs");
- var.layout->qualifiers.erase(i);
- }
+ bool supported = true;
+ bool external = false;
+ if(var.interface=="in")
+ {
+ external = (stage->type==Stage::VERTEX);
+ supported = (external ? supports_interface_layouts() : supports_stage_interface_layouts());
+ }
+ else if(var.interface=="out")
+ {
+ external = (stage->type==Stage::FRAGMENT);
+ supported = (external ? supports_interface_layouts() : supports_stage_interface_layouts());
+ if(external && !supported && !check_extension(&Features::ext_gpu_shader4))
+ {
+ external = false;
+ if(i->value!=0)
+ unsupported("EXT_gpu_shader4 required for multiple fragment shader outputs");
+ }
+ }
+ else if(var.interface=="uniform")
+ supported = supports_uniform_location();