From e8d21388ed66c358f8b77acc75019bfdf6921234 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Thu, 2 Nov 2017 00:05:53 -0600 Subject: [PATCH] Fix nondeterminism discussed in 258b700f5957fc13b0512b3734a1b0e81a1c271d --- Test/baseResults/310AofA.vert.out | 4 ++-- Test/baseResults/430AofA.frag.out | 4 ++-- Test/baseResults/implicitInnerAtomicUint.frag.out | 20 ++++++++++++++++++++ Test/implicitInnerAtomicUint.frag | 2 ++ glslang/Include/arrays.h | 9 +++++++++ glslang/MachineIndependent/ParseHelper.cpp | 6 ++++-- glslang/MachineIndependent/ParseHelper.h | 2 +- gtests/AST.FromFile.cpp | 2 +- 8 files changed, 41 insertions(+), 8 deletions(-) create mode 100755 Test/baseResults/implicitInnerAtomicUint.frag.out create mode 100644 Test/implicitInnerAtomicUint.frag diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out index 882c58a..70b5968 100644 --- a/Test/baseResults/310AofA.vert.out +++ b/Test/baseResults/310AofA.vert.out @@ -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) diff --git a/Test/baseResults/430AofA.frag.out b/Test/baseResults/430AofA.frag.out index 788a8d1..22dc4d3 100644 --- a/Test/baseResults/430AofA.frag.out +++ b/Test/baseResults/430AofA.frag.out @@ -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) diff --git a/Test/baseResults/implicitInnerAtomicUint.frag.out b/Test/baseResults/implicitInnerAtomicUint.frag.out new file mode 100755 index 0000000..ed9771e --- /dev/null +++ b/Test/baseResults/implicitInnerAtomicUint.frag.out @@ -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) + diff --git a/Test/implicitInnerAtomicUint.frag b/Test/implicitInnerAtomicUint.frag new file mode 100644 index 0000000..bb76516 --- /dev/null +++ b/Test/implicitInnerAtomicUint.frag @@ -0,0 +1,2 @@ +#version 460 +layout(binding = 0) uniform atomic_uint c[1][]; \ No newline at end of file diff --git a/glslang/Include/arrays.h b/glslang/Include/arrays.h index bc21c6c..1660a99 100644 --- a/glslang/Include/arrays.h +++ b/glslang/Include/arrays.h @@ -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) { diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index bc1fa02..733b74d 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -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", "[]", ""); diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h index 73b9798..0d92978 100644 --- a/glslang/MachineIndependent/ParseHelper.h +++ b/glslang/MachineIndependent/ParseHelper.h @@ -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*); diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp index 1a95925..7d77825 100644 --- a/gtests/AST.FromFile.cpp +++ b/gtests/AST.FromFile.cpp @@ -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", -- 2.7.4