Fix nondeterminism discussed in 258b700f59

This commit is contained in:
John Kessenich 2017-11-02 00:05:53 -06:00
parent ac51602455
commit e8d21388ed
8 changed files with 41 additions and 8 deletions

View File

@ -320,7 +320,7 @@ ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
0:? 'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform implicitly-sized array of highp 4-component vector of float v})
0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of implicitly-sized array of highp 4-component vector of float v})
0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 1-element array of highp 4-component vector of float v})
0:? 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})
0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float)
0:? 'gu' ( global implicitly-sized array of 7-element array of highp float)
@ -361,7 +361,7 @@ ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
0:? 'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform 1-element array of highp 4-component vector of float v})
0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of implicitly-sized array of highp 4-component vector of float v})
0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 1-element array of highp 4-component vector of float v})
0:? 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})
0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float)
0:? 'gu' ( global 1-element array of 7-element array of highp float)

View File

@ -405,7 +405,7 @@ ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of float)
0:? 'gu' ( global implicitly-sized array of 7-element array of float)
0:? 'gimp' ( global implicitly-sized array of implicitly-sized array of float)
0:? 'gimp' ( global implicitly-sized array of 1-element array of float)
0:? 'g4' ( global 4-element array of 7-element array of float)
0:? 'g5' ( global 5-element array of 7-element array of float)
@ -768,7 +768,7 @@ ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of float)
0:? 'gu' ( global 1-element array of 7-element array of float)
0:? 'gimp' ( global 1-element array of implicitly-sized array of float)
0:? 'gimp' ( global 1-element array of 1-element array of float)
0:? 'g4' ( global 4-element array of 7-element array of float)
0:? 'g5' ( global 5-element array of 7-element array of float)

View File

@ -0,0 +1,20 @@
implicitInnerAtomicUint.frag
ERROR: 0:2: '[]' : only outermost dimension of an array of arrays can be implicitly sized
ERROR: 1 compilation errors. No code generated.
Shader version: 460
ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'c' (layout( binding=0 offset=0) uniform 1-element array of 1-element array of atomic_uint)
Linked fragment stage:
ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
Shader version: 460
ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'c' (layout( binding=0 offset=0) uniform 1-element array of 1-element array of atomic_uint)

View File

@ -0,0 +1,2 @@
#version 460
layout(binding = 0) uniform atomic_uint c[1][];

View File

@ -264,6 +264,15 @@ struct TArraySizes {
return false;
}
bool clearInnerImplicit()
{
for (int d = 1; d < sizes.size(); ++d) {
if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
setDimSize(d, 1);
}
return false;
}
bool isInnerSpecialization() const
{
for (int d = 1; d < sizes.size(); ++d) {

View File

@ -3002,7 +3002,7 @@ void TParseContext::structArrayCheck(const TSourceLoc& /*loc*/, const TType& typ
}
}
void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qualifier, const TArraySizes* arraySizes, bool initializer, bool lastMember)
void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qualifier, TArraySizes* arraySizes, bool initializer, bool lastMember)
{
assert(arraySizes);
@ -3015,8 +3015,10 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua
return;
// No environment allows any non-outer-dimension to be implicitly sized
if (arraySizes->isInnerImplicit())
if (arraySizes->isInnerImplicit()) {
error(loc, "only outermost dimension of an array of arrays can be implicitly sized", "[]", "");
arraySizes->clearInnerImplicit();
}
if (arraySizes->isInnerSpecialization())
error(loc, "only outermost dimension of an array of arrays can be a specialization constant", "[]", "");

View File

@ -338,7 +338,7 @@ public:
bool arrayError(const TSourceLoc&, const TType&);
void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
void structArrayCheck(const TSourceLoc&, const TType& structure);
void arraySizesCheck(const TSourceLoc&, const TQualifier&, const TArraySizes*, bool initializer, bool lastMember);
void arraySizesCheck(const TSourceLoc&, const TQualifier&, TArraySizes*, bool initializer, bool lastMember);
void arrayOfArrayVersionCheck(const TSourceLoc&);
void arrayDimCheck(const TSourceLoc&, const TArraySizes* sizes1, const TArraySizes* sizes2);
void arrayDimCheck(const TSourceLoc&, const TType*, const TArraySizes*);

View File

@ -160,7 +160,7 @@ INSTANTIATE_TEST_CASE_P(
"460.vert",
"dce.frag",
"atomic_uint.frag",
// "implicitInnerAtomicUint.frag",
"implicitInnerAtomicUint.frag",
"aggOps.frag",
"always-discard.frag",
"always-discard2.frag",