It appears that at least on my current system (GeForce 980 Ti, driver
460.91.03) vertex attributes somehow block the flat qualifier from
working on the same location. It feels like a driver bug but that
remains to be confirmed.
stage.content.visit(*this);
allocate_locations("in");
+ if(stage.type==Stage::VERTEX)
+ swap(used_locations["in"], used_vertex_attribs);
allocate_locations("out");
}
if(!alloc_new)
continue;
+ bool flat = ((*i)->interpolation=="flat" || ((*i)->linked_declaration && (*i)->linked_declaration->interpolation=="flat"));
+
set<unsigned> &used = used_locations[(*i)->interface];
unsigned size = LocationCounter().apply(**i);
{
int blocking = -1;
for(unsigned j=0; j<size; ++j)
- if(used.count(next+j))
+ if(used.count(next+j) || (flat && used_vertex_attribs.count(next+j)))
blocking = next+j;
if(blocking<0)
break;
std::vector<VariableDeclaration *> unbound_textures;
std::vector<VariableDeclaration *> unbound_blocks;
+ /* Dirty hack to work around an issue where vertex attributes prevent the
+ flat qualifier from working on the same location. */
+ std::set<unsigned> used_vertex_attribs;
+
public:
void apply(Module &, const Features &, bool = true);
private: