GLSL/SPV: Fix #1900: Drop const on literal when doing an object copy.
This commit is contained in:
parent
f7a48b153f
commit
c2fafea970
@ -40,6 +40,13 @@ ERROR: node is still EOpNull!
|
|||||||
0:27 2 (const int)
|
0:27 2 (const int)
|
||||||
0:28 'nu_li' ( nonuniform temp int)
|
0:28 'nu_li' ( nonuniform temp int)
|
||||||
0:29 '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:? Linker Objects
|
||||||
0:? 'nonuniformEXT' ( global int)
|
0:? 'nonuniformEXT' ( global int)
|
||||||
0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float)
|
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:27 2 (const int)
|
||||||
0:28 'nu_li' ( nonuniform temp int)
|
0:28 'nu_li' ( nonuniform temp int)
|
||||||
0:29 '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:? Linker Objects
|
||||||
0:? 'nonuniformEXT' ( global int)
|
0:? 'nonuniformEXT' ( global int)
|
||||||
0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float)
|
0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float)
|
||||||
|
@ -22,12 +22,12 @@ void main()
|
|||||||
nonuniformEXT const int nu_ci = 2; // ERROR, const
|
nonuniformEXT const int nu_ci = 2; // ERROR, const
|
||||||
|
|
||||||
foo(nu_li, nu_li);
|
foo(nu_li, nu_li);
|
||||||
|
int table[5];
|
||||||
int a;
|
int a;
|
||||||
nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);
|
nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);
|
||||||
nu_li = nonuniformEXT(a, a); // ERROR, too many arguments
|
nu_li = nonuniformEXT(a, a); // ERROR, too many arguments
|
||||||
nu_li = nonuniformEXT(); // ERROR, no 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=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
|
layout(location=3) in inbName { float a; nonuniformEXT float b; } inb; // ERROR, not on member
|
||||||
|
@ -2774,10 +2774,25 @@ bool TParseContext::builtInName(const TString& identifier)
|
|||||||
//
|
//
|
||||||
bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, TFunction& function, TOperator op, TType& type)
|
bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, TFunction& function, TOperator op, TType& type)
|
||||||
{
|
{
|
||||||
|
// 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());
|
type.shallowCopy(function.getType());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// See if it's a matrix
|
||||||
bool constructingMatrix = false;
|
bool constructingMatrix = false;
|
||||||
switch(op) {
|
switch (op) {
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
case EOpConstructTextureSampler:
|
case EOpConstructTextureSampler:
|
||||||
return constructorTextureSamplerError(loc, function);
|
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
|
#ifndef GLSLANG_WEB
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@ -7093,8 +7110,7 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T
|
|||||||
|
|
||||||
case EOpConstructNonuniform:
|
case EOpConstructNonuniform:
|
||||||
// Make a nonuniform copy of node
|
// Make a nonuniform copy of node
|
||||||
newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpCopyObject, true, node, node->getType());
|
newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpCopyObject, true, node, type);
|
||||||
newNode->getWritableType().getQualifier().nonUniform = true;
|
|
||||||
return newNode;
|
return newNode;
|
||||||
|
|
||||||
case EOpConstructReference:
|
case EOpConstructReference:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user