Merge pull request #1386 from zeux/master
Fix TextureUpgradeAndSamplerRemovalTransform when used with qualifiers
This commit is contained in:
commit
92d05c0c83
@ -3769,23 +3769,39 @@ struct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {
|
|||||||
bool visitAggregate(TVisit, TIntermAggregate* ag) override {
|
bool visitAggregate(TVisit, TIntermAggregate* ag) override {
|
||||||
using namespace std;
|
using namespace std;
|
||||||
TIntermSequence& seq = ag->getSequence();
|
TIntermSequence& seq = ag->getSequence();
|
||||||
// remove pure sampler variables
|
TQualifierList& qual = ag->getQualifierList();
|
||||||
TIntermSequence::iterator newEnd = remove_if(seq.begin(), seq.end(), [](TIntermNode* node) {
|
|
||||||
TIntermSymbol* symbol = node->getAsSymbolNode();
|
|
||||||
if (!symbol)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isPureSampler());
|
// qual and seq are indexed using the same indices, so we have to modify both in lock-step
|
||||||
});
|
assert(seq.size() == qual.size() || qual.empty());
|
||||||
seq.erase(newEnd, seq.end());
|
|
||||||
// replace constructors with sampler/textures
|
size_t write = 0;
|
||||||
for_each(seq.begin(), seq.end(), [](TIntermNode*& node) {
|
for (size_t i = 0; i < seq.size(); ++i) {
|
||||||
TIntermAggregate *constructor = node->getAsAggregate();
|
TIntermSymbol* symbol = seq[i]->getAsSymbolNode();
|
||||||
|
if (symbol && symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isPureSampler()) {
|
||||||
|
// remove pure sampler variables
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TIntermNode* result = seq[i];
|
||||||
|
|
||||||
|
// replace constructors with sampler/textures
|
||||||
|
TIntermAggregate *constructor = seq[i]->getAsAggregate();
|
||||||
if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
|
if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
|
||||||
if (!constructor->getSequence().empty())
|
if (!constructor->getSequence().empty())
|
||||||
node = constructor->getSequence()[0];
|
result = constructor->getSequence()[0];
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
// write new node & qualifier
|
||||||
|
seq[write] = result;
|
||||||
|
if (!qual.empty())
|
||||||
|
qual[write] = qual[i];
|
||||||
|
write++;
|
||||||
|
}
|
||||||
|
|
||||||
|
seq.resize(write);
|
||||||
|
if (!qual.empty())
|
||||||
|
qual.resize(write);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user