Merge pull request #2685 from kevin-mccullough/FixIsIoResizeArrayTesselationStageHandling
Fix isIoResizeArray() tessellation stage handling
diff --git a/Test/baseResults/link.tesselation.tese.out b/Test/baseResults/link.tesselation.tese.out
new file mode 100644
index 0000000..056459f
--- /dev/null
+++ b/Test/baseResults/link.tesselation.tese.out
@@ -0,0 +1,254 @@
+link.tesselation.tese
+Shader version: 440
+input primitive = triangles
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+0:? Sequence
+0:15 Function Definition: main( ( global void)
+0:15 Function Parameters:
+0:17 Sequence
+0:17 Sequence
+0:17 move second child to first child ( temp float)
+0:17 'u' ( temp float)
+0:17 direct index ( temp float)
+0:17 'gl_TessCoord' ( in 3-component vector of float TessCoord)
+0:17 Constant:
+0:17 0 (const int)
+0:18 Sequence
+0:18 move second child to first child ( temp float)
+0:18 'v' ( temp float)
+0:18 direct index ( temp float)
+0:18 'gl_TessCoord' ( in 3-component vector of float TessCoord)
+0:18 Constant:
+0:18 1 (const int)
+0:19 Sequence
+0:19 move second child to first child ( temp float)
+0:19 'w' ( temp float)
+0:19 direct index ( temp float)
+0:19 'gl_TessCoord' ( in 3-component vector of float TessCoord)
+0:19 Constant:
+0:19 2 (const int)
+0:21 Sequence
+0:21 move second child to first child ( temp 2-component vector of float)
+0:21 'newUv' ( temp 2-component vector of float)
+0:21 Construct vec2 ( temp 2-component vector of float)
+0:21 add ( temp 2-component vector of float)
+0:21 add ( temp 2-component vector of float)
+0:21 vector-scale ( temp 2-component vector of float)
+0:21 'u' ( temp float)
+0:21 texCoord: direct index for structure ( in 2-component vector of float)
+0:21 direct index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:21 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:21 Constant:
+0:21 0 (const int)
+0:21 Constant:
+0:21 0 (const int)
+0:21 vector-scale ( temp 2-component vector of float)
+0:21 'v' ( temp float)
+0:21 texCoord: direct index for structure ( in 2-component vector of float)
+0:21 direct index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:21 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:21 Constant:
+0:21 1 (const int)
+0:21 Constant:
+0:21 0 (const int)
+0:21 vector-scale ( temp 2-component vector of float)
+0:21 'w' ( temp float)
+0:21 texCoord: direct index for structure ( in 2-component vector of float)
+0:21 direct index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:21 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:21 Constant:
+0:21 2 (const int)
+0:21 Constant:
+0:21 0 (const int)
+0:22 move second child to first child ( temp 2-component vector of float)
+0:22 texCoord: direct index for structure ( out 2-component vector of float)
+0:22 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:22 Constant:
+0:22 0 (const int)
+0:22 'newUv' ( temp 2-component vector of float)
+0:23 move second child to first child ( temp 4-component vector of float)
+0:23 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:23 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:23 Constant:
+0:23 0 (const uint)
+0:23 gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:23 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:23 'gl_PatchVerticesIn' ( in int PatchVertices)
+0:23 Constant:
+0:23 0 (const int)
+0:? Linker Objects
+0:? 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:? 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
+
+link.tesselation.tesc
+Shader version: 440
+vertices = 3
+0:? Sequence
+0:14 Function Definition: main( ( global void)
+0:14 Function Parameters:
+0:16 Sequence
+0:16 move second child to first child ( temp 2-component vector of float)
+0:16 texCoord: direct index for structure ( out 2-component vector of float)
+0:16 indirect index (layout( location=0) temp block{ out 2-component vector of float texCoord})
+0:16 'OUT' (layout( location=0) out 3-element array of block{ out 2-component vector of float texCoord})
+0:16 'gl_InvocationID' ( in int InvocationID)
+0:16 Constant:
+0:16 0 (const int)
+0:16 texCoord: direct index for structure ( in 2-component vector of float)
+0:16 indirect index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:16 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:16 'gl_InvocationID' ( in int InvocationID)
+0:16 Constant:
+0:16 0 (const int)
+0:18 Sequence
+0:18 move second child to first child ( temp float)
+0:18 'tessLevel' ( temp float)
+0:18 Constant:
+0:18 10.000000
+0:19 move second child to first child ( temp float)
+0:19 indirect index ( patch temp float TessLevelOuter)
+0:19 'gl_TessLevelOuter' ( patch out 4-element array of float TessLevelOuter)
+0:19 'gl_InvocationID' ( in int InvocationID)
+0:19 'tessLevel' ( temp float)
+0:20 move second child to first child ( temp float)
+0:20 direct index ( patch temp float TessLevelInner)
+0:20 'gl_TessLevelInner' ( patch out 2-element array of float TessLevelInner)
+0:20 Constant:
+0:20 0 (const int)
+0:20 'tessLevel' ( temp float)
+0:? Linker Objects
+0:? 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:? 'OUT' (layout( location=0) out 3-element array of block{ out 2-component vector of float texCoord})
+
+
+Linked tessellation control stage:
+
+
+Linked tessellation evaluation stage:
+
+
+Shader version: 440
+vertices = 3
+0:? Sequence
+0:14 Function Definition: main( ( global void)
+0:14 Function Parameters:
+0:16 Sequence
+0:16 move second child to first child ( temp 2-component vector of float)
+0:16 texCoord: direct index for structure ( out 2-component vector of float)
+0:16 indirect index (layout( location=0) temp block{ out 2-component vector of float texCoord})
+0:16 'OUT' (layout( location=0) out 3-element array of block{ out 2-component vector of float texCoord})
+0:16 'gl_InvocationID' ( in int InvocationID)
+0:16 Constant:
+0:16 0 (const int)
+0:16 texCoord: direct index for structure ( in 2-component vector of float)
+0:16 indirect index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:16 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:16 'gl_InvocationID' ( in int InvocationID)
+0:16 Constant:
+0:16 0 (const int)
+0:18 Sequence
+0:18 move second child to first child ( temp float)
+0:18 'tessLevel' ( temp float)
+0:18 Constant:
+0:18 10.000000
+0:19 move second child to first child ( temp float)
+0:19 indirect index ( patch temp float TessLevelOuter)
+0:19 'gl_TessLevelOuter' ( patch out 4-element array of float TessLevelOuter)
+0:19 'gl_InvocationID' ( in int InvocationID)
+0:19 'tessLevel' ( temp float)
+0:20 move second child to first child ( temp float)
+0:20 direct index ( patch temp float TessLevelInner)
+0:20 'gl_TessLevelInner' ( patch out 2-element array of float TessLevelInner)
+0:20 Constant:
+0:20 0 (const int)
+0:20 'tessLevel' ( temp float)
+0:? Linker Objects
+0:? 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:? 'OUT' (layout( location=0) out 3-element array of block{ out 2-component vector of float texCoord})
+Shader version: 440
+input primitive = triangles
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+0:? Sequence
+0:15 Function Definition: main( ( global void)
+0:15 Function Parameters:
+0:17 Sequence
+0:17 Sequence
+0:17 move second child to first child ( temp float)
+0:17 'u' ( temp float)
+0:17 direct index ( temp float)
+0:17 'gl_TessCoord' ( in 3-component vector of float TessCoord)
+0:17 Constant:
+0:17 0 (const int)
+0:18 Sequence
+0:18 move second child to first child ( temp float)
+0:18 'v' ( temp float)
+0:18 direct index ( temp float)
+0:18 'gl_TessCoord' ( in 3-component vector of float TessCoord)
+0:18 Constant:
+0:18 1 (const int)
+0:19 Sequence
+0:19 move second child to first child ( temp float)
+0:19 'w' ( temp float)
+0:19 direct index ( temp float)
+0:19 'gl_TessCoord' ( in 3-component vector of float TessCoord)
+0:19 Constant:
+0:19 2 (const int)
+0:21 Sequence
+0:21 move second child to first child ( temp 2-component vector of float)
+0:21 'newUv' ( temp 2-component vector of float)
+0:21 Construct vec2 ( temp 2-component vector of float)
+0:21 add ( temp 2-component vector of float)
+0:21 add ( temp 2-component vector of float)
+0:21 vector-scale ( temp 2-component vector of float)
+0:21 'u' ( temp float)
+0:21 texCoord: direct index for structure ( in 2-component vector of float)
+0:21 direct index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:21 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:21 Constant:
+0:21 0 (const int)
+0:21 Constant:
+0:21 0 (const int)
+0:21 vector-scale ( temp 2-component vector of float)
+0:21 'v' ( temp float)
+0:21 texCoord: direct index for structure ( in 2-component vector of float)
+0:21 direct index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:21 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:21 Constant:
+0:21 1 (const int)
+0:21 Constant:
+0:21 0 (const int)
+0:21 vector-scale ( temp 2-component vector of float)
+0:21 'w' ( temp float)
+0:21 texCoord: direct index for structure ( in 2-component vector of float)
+0:21 direct index (layout( location=0) temp block{ in 2-component vector of float texCoord})
+0:21 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:21 Constant:
+0:21 2 (const int)
+0:21 Constant:
+0:21 0 (const int)
+0:22 move second child to first child ( temp 2-component vector of float)
+0:22 texCoord: direct index for structure ( out 2-component vector of float)
+0:22 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:22 Constant:
+0:22 0 (const int)
+0:22 'newUv' ( temp 2-component vector of float)
+0:23 move second child to first child ( temp 4-component vector of float)
+0:23 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:23 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:23 Constant:
+0:23 0 (const uint)
+0:23 gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:23 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in 1-element array of float ClipDistance gl_ClipDistance})
+0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in 1-element array of float ClipDistance gl_ClipDistance})
+0:23 'gl_PatchVerticesIn' ( in int PatchVertices)
+0:23 Constant:
+0:23 0 (const int)
+0:? Linker Objects
+0:? 'IN' (layout( location=0) in 32-element array of block{ in 2-component vector of float texCoord})
+0:? 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+
diff --git a/Test/baseResults/link.tesselation.vert.out b/Test/baseResults/link.tesselation.vert.out
new file mode 100644
index 0000000..d56c340
--- /dev/null
+++ b/Test/baseResults/link.tesselation.vert.out
@@ -0,0 +1,94 @@
+link.tesselation.vert
+Shader version: 440
+0:? Sequence
+0:11 Function Definition: main( ( global void)
+0:11 Function Parameters:
+0:13 Sequence
+0:13 move second child to first child ( temp 4-component vector of float)
+0:13 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:13 Constant:
+0:13 0 (const uint)
+0:13 'i_Pos' (layout( location=0) in 4-component vector of float)
+0:14 move second child to first child ( temp 2-component vector of float)
+0:14 texCoord: direct index for structure ( out 2-component vector of float)
+0:14 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:14 Constant:
+0:14 0 (const int)
+0:14 'i_Tex' (layout( location=1) in 2-component vector of float)
+0:? Linker Objects
+0:? 'i_Pos' (layout( location=0) in 4-component vector of float)
+0:? 'i_Tex' (layout( location=1) in 2-component vector of float)
+0:? 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:? 'gl_VertexID' ( gl_VertexId int VertexId)
+0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+link.tesselation.frag
+Shader version: 440
+0:? Sequence
+0:12 Function Definition: main( ( global void)
+0:12 Function Parameters:
+0:14 Sequence
+0:14 move second child to first child ( temp 4-component vector of float)
+0:14 'oColor' (layout( location=0) out 4-component vector of float)
+0:14 texture ( global 4-component vector of float)
+0:14 'mytex' (layout( binding=0) uniform sampler2D)
+0:14 texCoord: direct index for structure ( in 2-component vector of float)
+0:14 'IN' (layout( location=0) in block{ in 2-component vector of float texCoord})
+0:14 Constant:
+0:14 0 (const int)
+0:? Linker Objects
+0:? 'IN' (layout( location=0) in block{ in 2-component vector of float texCoord})
+0:? 'oColor' (layout( location=0) out 4-component vector of float)
+0:? 'mytex' (layout( binding=0) uniform sampler2D)
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+
+Shader version: 440
+0:? Sequence
+0:11 Function Definition: main( ( global void)
+0:11 Function Parameters:
+0:13 Sequence
+0:13 move second child to first child ( temp 4-component vector of float)
+0:13 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
+0:13 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:13 Constant:
+0:13 0 (const uint)
+0:13 'i_Pos' (layout( location=0) in 4-component vector of float)
+0:14 move second child to first child ( temp 2-component vector of float)
+0:14 texCoord: direct index for structure ( out 2-component vector of float)
+0:14 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:14 Constant:
+0:14 0 (const int)
+0:14 'i_Tex' (layout( location=1) in 2-component vector of float)
+0:? Linker Objects
+0:? 'i_Pos' (layout( location=0) in 4-component vector of float)
+0:? 'i_Tex' (layout( location=1) in 2-component vector of float)
+0:? 'OUT' (layout( location=0) out block{ out 2-component vector of float texCoord})
+0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:? 'gl_VertexID' ( gl_VertexId int VertexId)
+0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 440
+0:? Sequence
+0:12 Function Definition: main( ( global void)
+0:12 Function Parameters:
+0:14 Sequence
+0:14 move second child to first child ( temp 4-component vector of float)
+0:14 'oColor' (layout( location=0) out 4-component vector of float)
+0:14 texture ( global 4-component vector of float)
+0:14 'mytex' (layout( binding=0) uniform sampler2D)
+0:14 texCoord: direct index for structure ( in 2-component vector of float)
+0:14 'IN' (layout( location=0) in block{ in 2-component vector of float texCoord})
+0:14 Constant:
+0:14 0 (const int)
+0:? Linker Objects
+0:? 'IN' (layout( location=0) in block{ in 2-component vector of float texCoord})
+0:? 'oColor' (layout( location=0) out 4-component vector of float)
+0:? 'mytex' (layout( binding=0) uniform sampler2D)
+
diff --git a/Test/link.tesselation.frag b/Test/link.tesselation.frag
new file mode 100644
index 0000000..420384d
--- /dev/null
+++ b/Test/link.tesselation.frag
@@ -0,0 +1,15 @@
+#version 440
+
+layout(location = 0) in Primitive
+{
+ vec2 texCoord;
+} IN;
+
+layout(location = 0) out vec4 oColor;
+
+layout(binding = 0) uniform sampler2D mytex;
+
+void main()
+{
+ oColor = texture(mytex, IN.texCoord);
+}
diff --git a/Test/link.tesselation.tesc b/Test/link.tesselation.tesc
new file mode 100644
index 0000000..c47d2ad
--- /dev/null
+++ b/Test/link.tesselation.tesc
@@ -0,0 +1,21 @@
+#version 440
+
+layout(location = 0) in Primitive
+{
+ vec2 texCoord;
+} IN[];
+
+layout(location = 0) out Primitive
+{
+ vec2 texCoord;
+} OUT[];
+
+layout(vertices = 3) out;
+void main()
+{
+ OUT[gl_InvocationID].texCoord = IN[gl_InvocationID].texCoord;
+
+ float tessLevel = 10.0;
+ gl_TessLevelOuter[gl_InvocationID] = tessLevel;
+ gl_TessLevelInner[0] = tessLevel;
+}
diff --git a/Test/link.tesselation.tese b/Test/link.tesselation.tese
new file mode 100644
index 0000000..e111292
--- /dev/null
+++ b/Test/link.tesselation.tese
@@ -0,0 +1,26 @@
+#version 440
+
+layout(location = 0) in Primitive
+{
+ vec2 texCoord;
+} IN[];
+
+layout(location = 0) out Primitive
+{
+ vec2 texCoord;
+} OUT;
+
+layout(triangles, fractional_odd_spacing) in;
+layout(cw) in;
+void main()
+{
+ float u = gl_TessCoord.x;
+ float v = gl_TessCoord.y;
+ float w = gl_TessCoord.z;
+
+ vec2 newUv = vec2( u * IN[0].texCoord + v * IN[1].texCoord + w * IN[2].texCoord);
+ OUT.texCoord = newUv;
+ gl_Position = gl_in[gl_PatchVerticesIn].gl_Position;
+}
+
+
diff --git a/Test/link.tesselation.vert b/Test/link.tesselation.vert
new file mode 100644
index 0000000..daf3537
--- /dev/null
+++ b/Test/link.tesselation.vert
@@ -0,0 +1,16 @@
+#version 440
+
+layout(location = 0) in vec4 i_Pos;
+layout(location = 1) in vec2 i_Tex;
+
+layout(location = 0) out Primitive
+{
+ vec2 texCoord;
+} OUT;
+
+void main()
+{
+ gl_Position = i_Pos;
+ OUT.texCoord = i_Tex;
+}
+
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 9656e2e..4a68130 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -2159,8 +2159,9 @@
bool TIntermediate::isIoResizeArray(const TType& type, EShLanguage language) {
return type.isArray() &&
((language == EShLangGeometry && type.getQualifier().storage == EvqVaryingIn) ||
- (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut &&
+ (language == EShLangTessControl && (type.getQualifier().storage == EvqVaryingIn || type.getQualifier().storage == EvqVaryingOut) &&
! type.getQualifier().patch) ||
+ (language == EShLangTessEvaluation && type.getQualifier().storage == EvqVaryingIn) ||
(language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn &&
type.getQualifier().pervertexNV) ||
(language == EShLangMeshNV && type.getQualifier().storage == EvqVaryingOut &&
diff --git a/gtests/Link.FromFile.cpp b/gtests/Link.FromFile.cpp
index 29590c0..a83d49d 100644
--- a/gtests/Link.FromFile.cpp
+++ b/gtests/Link.FromFile.cpp
@@ -106,6 +106,8 @@
{"link.multiAnonBlocksValid.0.0.vert", "link.multiAnonBlocksValid.0.1.vert"},
{"link.multiBlocksInvalid.0.0.vert", "link.multiBlocksInvalid.0.1.vert"},
{"link.multiBlocksValid.1.0.vert", "link.multiBlocksValid.1.1.vert"},
+ {"link.tesselation.vert", "link.tesselation.frag"},
+ {"link.tesselation.tese", "link.tesselation.tesc"},
}))
);
// clang-format on