X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fsyntax.cpp;h=ccdb7197e570d7f786b65129b12e9196a884ccb4;hb=9978e2f62777795bf478b301aadffdd0ee8cbd41;hp=8b00e82e46eae73f397c599f6a9e3ea0008b4e3a;hpb=ba55832910f04b90695da360b5889fa85e83c1e1;p=libs%2Fgl.git diff --git a/source/glsl/syntax.cpp b/source/glsl/syntax.cpp index 8b00e82e..ccdb7197 100644 --- a/source/glsl/syntax.cpp +++ b/source/glsl/syntax.cpp @@ -414,6 +414,32 @@ void add_to_chain(Assignment::Target &target, Assignment::Target::ChainType type ++target.chain_len; } +bool targets_overlap(const Assignment::Target &target1, const Assignment::Target &target2) +{ + bool overlap = (target1.declaration==target2.declaration); + for(unsigned i=0; (overlap && i(target1.chain[i]&0xC0); + Assignment::Target::ChainType type2 = static_cast(target2.chain[i]&0xC0); + unsigned index1 = target1.chain[i]&0x3F; + unsigned index2 = target2.chain[i]&0x3F; + if(type1==Assignment::Target::SWIZZLE || type2==Assignment::Target::SWIZZLE) + { + if(type1==Assignment::Target::SWIZZLE && type2==Assignment::Target::SWIZZLE) + overlap = index1&index2; + else if(type1==Assignment::Target::ARRAY && index1<4) + overlap = index2&(1<