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