diff --git a/Test/baseResults/nonuniform.frag.out b/Test/baseResults/nonuniform.frag.out index 0df8cfc3..9054c2ca 100644 --- a/Test/baseResults/nonuniform.frag.out +++ b/Test/baseResults/nonuniform.frag.out @@ -40,6 +40,13 @@ ERROR: node is still EOpNull! 0:27 2 (const int) 0:28 'nu_li' ( nonuniform temp int) 0:29 'nu_li' ( nonuniform temp int) +0:30 move second child to first child ( temp int) +0:30 'nu_li' ( nonuniform temp int) +0:30 indirect index ( nonuniform temp int) +0:30 'table' ( temp 5-element array of int) +0:30 copy object ( nonuniform temp int) +0:30 Constant: +0:30 3 (const int) 0:? Linker Objects 0:? 'nonuniformEXT' ( global int) 0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float) @@ -83,6 +90,13 @@ ERROR: node is still EOpNull! 0:27 2 (const int) 0:28 'nu_li' ( nonuniform temp int) 0:29 'nu_li' ( nonuniform temp int) +0:30 move second child to first child ( temp int) +0:30 'nu_li' ( nonuniform temp int) +0:30 indirect index ( nonuniform temp int) +0:30 'table' ( temp 5-element array of int) +0:30 copy object ( nonuniform temp int) +0:30 Constant: +0:30 3 (const int) 0:? Linker Objects 0:? 'nonuniformEXT' ( global int) 0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float) diff --git a/Test/nonuniform.frag b/Test/nonuniform.frag index 3f3dd67a..e98aacc3 100644 --- a/Test/nonuniform.frag +++ b/Test/nonuniform.frag @@ -22,12 +22,12 @@ void main() nonuniformEXT const int nu_ci = 2; // ERROR, const foo(nu_li, nu_li); - + int table[5]; int a; nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2); nu_li = nonuniformEXT(a, a); // ERROR, too many arguments nu_li = nonuniformEXT(); // ERROR, no arguments + nu_li = table[nonuniformEXT(3)]; } - layout(location=1) in struct S { float a; nonuniformEXT float b; } ins; // ERROR, not on member layout(location=3) in inbName { float a; nonuniformEXT float b; } inb; // ERROR, not on member diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 17b6fe86..b5ea803d 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -2774,10 +2774,25 @@ bool TParseContext::builtInName(const TString& identifier) // bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, TFunction& function, TOperator op, TType& type) { - type.shallowCopy(function.getType()); + // See if the constructor does not establish the main type, only requalifies + // it, in which case the type comes from the argument instead of from the + // constructor function. + switch (op) { + case EOpConstructNonuniform: + if (node != nullptr && node->getAsTyped() != nullptr) { + type.shallowCopy(node->getAsTyped()->getType()); + type.getQualifier().makeTemporary(); + type.getQualifier().nonUniform = true; + } + break; + default: + type.shallowCopy(function.getType()); + break; + } + // See if it's a matrix bool constructingMatrix = false; - switch(op) { + switch (op) { #ifndef GLSLANG_WEB case EOpConstructTextureSampler: return constructorTextureSamplerError(loc, function); @@ -2871,6 +2886,8 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T } } } + if (op == EOpConstructNonuniform) + constType = false; #ifndef GLSLANG_WEB switch (op) { @@ -7093,8 +7110,7 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EOpConstructNonuniform: // Make a nonuniform copy of node - newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpCopyObject, true, node, node->getType()); - newNode->getWritableType().getQualifier().nonUniform = true; + newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpCopyObject, true, node, type); return newNode; case EOpConstructReference: