From 1be8063e011bc41516400a8e242f53134e09f6c4 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Sat, 28 Nov 2015 15:19:11 -0700 Subject: [PATCH] Require l-value patch-out indexing to be gl_InvocationID. Also, generally allow ES variable indexing of in/out blocks. --- Test/150.tesc | 6 +- Test/310.frag | 2 +- Test/310.tesc | 36 +++- Test/400.tesc | 6 +- Test/420.tesc | 4 +- Test/450.tesc | 4 +- Test/baseResults/150.tesc.out | 80 ++++----- Test/baseResults/310.frag.out | 3 +- Test/baseResults/310.tesc.out | 184 ++++++++++++++++++--- Test/baseResults/400.tesc.out | 30 ++-- Test/baseResults/420.tesc.out | 20 +-- Test/baseResults/450.tesc.out | 18 +- Test/baseResults/spv.400.tesc.out | 129 ++++++++------- Test/spv.400.tesc | 6 +- glslang/Include/revision.h | 2 +- glslang/MachineIndependent/ParseHelper.cpp | 20 ++- 16 files changed, 354 insertions(+), 196 deletions(-) diff --git a/Test/150.tesc b/Test/150.tesc index b72f0def..66c0f3ea 100644 --- a/Test/150.tesc +++ b/Test/150.tesc @@ -25,9 +25,9 @@ void main() int pid = gl_PrimitiveID; int iid = gl_InvocationID; - gl_out[1].gl_Position = p; - gl_out[1].gl_PointSize = ps; - gl_out[1].gl_ClipDistance[1] = cd; + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; gl_TessLevelOuter[3] = 3.2; gl_TessLevelInner[1] = 1.3; diff --git a/Test/310.frag b/Test/310.frag index 78f13f60..b08391a5 100644 --- a/Test/310.frag +++ b/Test/310.frag @@ -166,7 +166,7 @@ void fooIO() { vec4 v = inbinst.v + vAnon; v *= arrayedInst[2].f; - v *= arrayedInst[i].f; // ERROR, not constant + v *= arrayedInst[i].f; } in vec4 gl_FragCoord; diff --git a/Test/310.tesc b/Test/310.tesc index 8220021e..29c39323 100644 --- a/Test/310.tesc +++ b/Test/310.tesc @@ -3,7 +3,7 @@ #extension GL_OES_tessellation_shader : enable layout(vertices = 4) out; -int outa[gl_out.length()]; +out int outa[gl_out.length()]; layout(quads) in; // ERROR layout(ccw) out; // ERROR @@ -30,9 +30,9 @@ void main() int pid = gl_PrimitiveID; int iid = gl_InvocationID; - gl_out[1].gl_Position = p; - gl_out[1].gl_PointSize = ps; // ERROR, need point_size extension - gl_out[1].gl_ClipDistance[1] = cd; // ERROR, not in ES + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; // ERROR, not in ES gl_TessLevelOuter[3] = 3.2; gl_TessLevelInner[1] = 1.3; @@ -112,7 +112,7 @@ out float okaySize[4]; void pointSize2() { float ps = gl_in[1].gl_PointSize; - gl_out[1].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_PointSize = ps; } #extension GL_OES_gpu_shader5 : enable @@ -141,3 +141,29 @@ void bb() gl_BoundingBoxOES[1] = vec4(1.0); gl_BoundingBoxOES[2] = vec4(2.0); // ERROR, overflow } + +out patch badpatchBName { // ERROR, array size required + float f; +} badpatchIName[]; + +out patch patchBName { + float f; +} patchIName[4]; + +void outputtingOutparam(out int a) +{ + a = 2; +} + +void outputting() +{ + outa[gl_InvocationID] = 2; + outa[1] = 2; // ERROR, not gl_InvocationID + gl_out[0].gl_Position = vec4(1.0); // ERROR, not gl_InvocationID + outa[1]; + gl_out[0]; + outputtingOutparam(outa[0]); // ERROR, not gl_InvocationID + outputtingOutparam(outa[gl_InvocationID]); + patchIName[1].f = 3.14; + outa[(gl_InvocationID)] = 2; +} diff --git a/Test/400.tesc b/Test/400.tesc index cf9ba517..950f5de1 100644 --- a/Test/400.tesc +++ b/Test/400.tesc @@ -28,9 +28,9 @@ void main() int pid = gl_PrimitiveID; int iid = gl_InvocationID; - gl_out[1].gl_Position = p; - gl_out[1].gl_PointSize = ps; - gl_out[1].gl_ClipDistance[1] = cd; + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; gl_TessLevelOuter[3] = 3.2; gl_TessLevelInner[1] = 1.3; diff --git a/Test/420.tesc b/Test/420.tesc index 93f2386a..04ac4433 100644 --- a/Test/420.tesc +++ b/Test/420.tesc @@ -22,8 +22,8 @@ void main() int pid = gl_PrimitiveID; int iid = gl_InvocationID; - gl_out[1].gl_Position = p; - gl_out[1].gl_PointSize = ps; // ERROR + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR } out float outf; // ERROR, no array diff --git a/Test/450.tesc b/Test/450.tesc index 9cbf71c0..75a9bf46 100644 --- a/Test/450.tesc +++ b/Test/450.tesc @@ -6,9 +6,9 @@ in gl_PerVertex { out gl_PerVertex { float gl_CullDistance[3]; -} gl_out[]; +} gl_out[4]; void main() { - gl_out[0].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; + gl_out[gl_InvocationID].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; } diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out index 8e50b815..185789ca 100644 --- a/Test/baseResults/150.tesc.out +++ b/Test/baseResults/150.tesc.out @@ -59,29 +59,26 @@ vertices = 4 0:26 'gl_InvocationID' (in int InvocationID) 0:28 move second child to first child (temp 4-component vector of float) 0:28 gl_Position: direct index for structure (out 4-component vector of float Position) -0:28 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:28 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:28 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:28 Constant: -0:28 1 (const int) +0:28 'gl_InvocationID' (in int InvocationID) 0:28 Constant: 0:28 0 (const int) 0:28 'p' (temp 4-component vector of float) 0:29 move second child to first child (temp float) 0:29 gl_PointSize: direct index for structure (out float PointSize) -0:29 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:29 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:29 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:29 Constant: -0:29 1 (const int) +0:29 'gl_InvocationID' (in int InvocationID) 0:29 Constant: 0:29 1 (const int) 0:29 'ps' (temp float) 0:30 move second child to first child (temp float) 0:30 direct index (temp float ClipDistance) 0:30 gl_ClipDistance: direct index for structure (out implicitly-sized array of float ClipDistance) -0:30 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:30 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:30 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:30 Constant: -0:30 1 (const int) +0:30 'gl_InvocationID' (in int InvocationID) 0:30 Constant: 0:30 2 (const int) 0:30 Constant: @@ -295,29 +292,26 @@ ERROR: node is still EOpNull! 0:29 'gl_InvocationID' (in int InvocationID) 0:31 move second child to first child (temp 4-component vector of float) 0:31 gl_Position: direct index for structure (out 4-component vector of float Position) -0:31 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:31 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:31 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:31 Constant: -0:31 1 (const int) +0:31 'gl_InvocationID' (in int InvocationID) 0:31 Constant: 0:31 0 (const int) 0:31 'p' (temp 4-component vector of float) 0:32 move second child to first child (temp float) 0:32 gl_PointSize: direct index for structure (out float PointSize) -0:32 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:32 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:32 Constant: -0:32 1 (const int) +0:32 'gl_InvocationID' (in int InvocationID) 0:32 Constant: 0:32 1 (const int) 0:32 'ps' (temp float) 0:33 move second child to first child (temp float) 0:33 direct index (temp float ClipDistance) 0:33 gl_ClipDistance: direct index for structure (out implicitly-sized array of float ClipDistance) -0:33 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:33 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 Constant: -0:33 1 (const int) +0:33 'gl_InvocationID' (in int InvocationID) 0:33 Constant: 0:33 2 (const int) 0:33 Constant: @@ -666,17 +660,15 @@ ERROR: node is still EOpNull! 0:23 'gl_InvocationID' (in int InvocationID) 0:25 move second child to first child (temp 4-component vector of float) 0:25 gl_Position: direct index for structure (out 4-component vector of float Position) -0:25 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:25 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:25 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:25 Constant: -0:25 1 (const int) +0:25 'gl_InvocationID' (in int InvocationID) 0:25 Constant: 0:25 0 (const int) 0:25 'p' (temp 4-component vector of float) -0:26 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:26 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:26 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:26 Constant: -0:26 1 (const int) +0:26 'gl_InvocationID' (in int InvocationID) 0:34 Function Definition: foo( (global void) 0:34 Function Parameters: 0:36 Sequence @@ -982,29 +974,26 @@ vertices = 4 0:26 'gl_InvocationID' (in int InvocationID) 0:28 move second child to first child (temp 4-component vector of float) 0:28 gl_Position: direct index for structure (out 4-component vector of float Position) -0:28 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:28 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:28 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:28 Constant: -0:28 1 (const int) +0:28 'gl_InvocationID' (in int InvocationID) 0:28 Constant: 0:28 0 (const int) 0:28 'p' (temp 4-component vector of float) 0:29 move second child to first child (temp float) 0:29 gl_PointSize: direct index for structure (out float PointSize) -0:29 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:29 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:29 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:29 Constant: -0:29 1 (const int) +0:29 'gl_InvocationID' (in int InvocationID) 0:29 Constant: 0:29 1 (const int) 0:29 'ps' (temp float) 0:30 move second child to first child (temp float) 0:30 direct index (temp float ClipDistance) 0:30 gl_ClipDistance: direct index for structure (out 1-element array of float ClipDistance) -0:30 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:30 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:30 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:30 Constant: -0:30 1 (const int) +0:30 'gl_InvocationID' (in int InvocationID) 0:30 Constant: 0:30 2 (const int) 0:30 Constant: @@ -1080,29 +1069,26 @@ vertices = 4 0:29 'gl_InvocationID' (in int InvocationID) 0:31 move second child to first child (temp 4-component vector of float) 0:31 gl_Position: direct index for structure (out 4-component vector of float Position) -0:31 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:31 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:31 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:31 Constant: -0:31 1 (const int) +0:31 'gl_InvocationID' (in int InvocationID) 0:31 Constant: 0:31 0 (const int) 0:31 'p' (temp 4-component vector of float) 0:32 move second child to first child (temp float) 0:32 gl_PointSize: direct index for structure (out float PointSize) -0:32 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:32 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:32 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:32 Constant: -0:32 1 (const int) +0:32 'gl_InvocationID' (in int InvocationID) 0:32 Constant: 0:32 1 (const int) 0:32 'ps' (temp float) 0:33 move second child to first child (temp float) 0:33 direct index (temp float ClipDistance) 0:33 gl_ClipDistance: direct index for structure (out 1-element array of float ClipDistance) -0:33 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:33 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:33 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:33 Constant: -0:33 1 (const int) +0:33 'gl_InvocationID' (in int InvocationID) 0:33 Constant: 0:33 2 (const int) 0:33 Constant: @@ -1248,17 +1234,15 @@ vertices = 4 0:23 'gl_InvocationID' (in int InvocationID) 0:25 move second child to first child (temp 4-component vector of float) 0:25 gl_Position: direct index for structure (out 4-component vector of float Position) -0:25 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:25 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:25 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:25 Constant: -0:25 1 (const int) +0:25 'gl_InvocationID' (in int InvocationID) 0:25 Constant: 0:25 0 (const int) 0:25 'p' (temp 4-component vector of float) -0:26 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:26 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:26 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:26 Constant: -0:26 1 (const int) +0:26 'gl_InvocationID' (in int InvocationID) 0:34 Function Definition: foo( (global void) 0:34 Function Parameters: 0:36 Sequence diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out index 9769eb6a..9cfd0ef8 100644 --- a/Test/baseResults/310.frag.out +++ b/Test/baseResults/310.frag.out @@ -49,7 +49,6 @@ ERROR: 0:148: 'inbname2' : Cannot reuse block name within the same interface: in ERROR: 0:153: 'badmember' : nameless block contains a member that already has a name at global scope ERROR: 0:157: 'inbname' : redefinition ERROR: 0:159: 'vAnon' : redefinition -ERROR: 0:169: 'variable indexing in/out block array' : not supported with this profile: es ERROR: 0:173: 'origin_upper_left' : not supported with this profile: es ERROR: 0:173: 'pixel_center_integer' : not supported with this profile: es ERROR: 0:173: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord @@ -130,7 +129,7 @@ ERROR: 0:427: 'blend equation' : can only apply to a standalone qualifier ERROR: 0:428: 'blend equation' : can only apply to a standalone qualifier ERROR: 0:429: 'blend_support' : unknown blend equation ERROR: 0:431: 'fragment-shader array-of-array output' : not supported with this profile: es -ERROR: 122 compilation errors. No code generated. +ERROR: 121 compilation errors. No code generated. Shader version: 310 diff --git a/Test/baseResults/310.tesc.out b/Test/baseResults/310.tesc.out index 9bf8ab52..a498674e 100644 --- a/Test/baseResults/310.tesc.out +++ b/Test/baseResults/310.tesc.out @@ -41,7 +41,11 @@ ERROR: 0:133: 'gl_BoundingBoxOES' : required extension not requested: Possible e GL_EXT_primitive_bounding_box GL_OES_primitive_bounding_box ERROR: 0:142: '[' : array index out of range '2' -ERROR: 33 compilation errors. No code generated. +ERROR: 0:145: '' : array size required +ERROR: 0:161: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID +ERROR: 0:162: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID +ERROR: 0:165: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID +ERROR: 37 compilation errors. No code generated. Shader version: 310 @@ -101,19 +105,17 @@ ERROR: node is still EOpNull! 0:31 'gl_InvocationID' (in highp int InvocationID) 0:33 move second child to first child (temp highp 4-component vector of float) 0:33 gl_Position: direct index for structure (out highp 4-component vector of float Position) -0:33 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:33 indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) 0:33 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:33 Constant: -0:33 1 (const int) +0:33 'gl_InvocationID' (in highp int InvocationID) 0:33 Constant: 0:33 0 (const int) 0:33 'p' (temp highp 4-component vector of float) 0:34 move second child to first child (temp highp float) 0:34 gl_PointSize: direct index for structure (out highp float PointSize) -0:34 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:34 indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) 0:34 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:34 Constant: -0:34 1 (const int) +0:34 'gl_InvocationID' (in highp int InvocationID) 0:34 Constant: 0:34 1 (const int) 0:34 'ps' (temp highp float) @@ -215,10 +217,9 @@ ERROR: node is still EOpNull! 0:114 1 (const int) 0:115 move second child to first child (temp highp float) 0:115 gl_PointSize: direct index for structure (out highp float PointSize) -0:115 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:115 indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) 0:115 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:115 Constant: -0:115 1 (const int) +0:115 'gl_InvocationID' (in highp int InvocationID) 0:115 Constant: 0:115 1 (const int) 0:115 'ps' (temp highp float) @@ -277,9 +278,79 @@ ERROR: node is still EOpNull! 0:142 2.000000 0:142 2.000000 0:142 2.000000 +0:153 Function Definition: outputtingOutparam(i1; (global void) +0:153 Function Parameters: +0:153 'a' (out highp int) +0:155 Sequence +0:155 move second child to first child (temp highp int) +0:155 'a' (out highp int) +0:155 Constant: +0:155 2 (const int) +0:158 Function Definition: outputting( (global void) +0:158 Function Parameters: +0:160 Sequence +0:160 move second child to first child (temp highp int) +0:160 indirect index (temp highp int) +0:160 'outa' (out 4-element array of highp int) +0:160 'gl_InvocationID' (in highp int InvocationID) +0:160 Constant: +0:160 2 (const int) +0:161 move second child to first child (temp highp int) +0:161 direct index (temp highp int) +0:161 'outa' (out 4-element array of highp int) +0:161 Constant: +0:161 1 (const int) +0:161 Constant: +0:161 2 (const int) +0:162 move second child to first child (temp highp 4-component vector of float) +0:162 gl_Position: direct index for structure (out highp 4-component vector of float Position) +0:162 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:162 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:162 Constant: +0:162 0 (const int) +0:162 Constant: +0:162 0 (const int) +0:162 Constant: +0:162 1.000000 +0:162 1.000000 +0:162 1.000000 +0:162 1.000000 +0:163 direct index (temp highp int) +0:163 'outa' (out 4-element array of highp int) +0:163 Constant: +0:163 1 (const int) +0:164 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:164 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:164 Constant: +0:164 0 (const int) +0:165 Function Call: outputtingOutparam(i1; (global void) +0:165 direct index (temp highp int) +0:165 'outa' (out 4-element array of highp int) +0:165 Constant: +0:165 0 (const int) +0:166 Function Call: outputtingOutparam(i1; (global void) +0:166 indirect index (temp highp int) +0:166 'outa' (out 4-element array of highp int) +0:166 'gl_InvocationID' (in highp int InvocationID) +0:167 move second child to first child (temp highp float) +0:167 f: direct index for structure (out highp float) +0:167 direct index (patch temp block{out highp float f}) +0:167 'patchIName' (patch out 4-element array of block{out highp float f}) +0:167 Constant: +0:167 1 (const int) +0:167 Constant: +0:167 0 (const int) +0:167 Constant: +0:167 3.140000 +0:168 move second child to first child (temp highp int) +0:168 indirect index (temp highp int) +0:168 'outa' (out 4-element array of highp int) +0:168 'gl_InvocationID' (in highp int InvocationID) +0:168 Constant: +0:168 2 (const int) 0:? Linker Objects 0:? 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:? 'outa' (global 4-element array of highp int) +0:? 'outa' (out 4-element array of highp int) 0:? 'patchIn' (patch in highp 4-component vector of float) 0:? 'patchOut' (patch out highp 4-component vector of float) 0:? 'ina' (in highp 2-component vector of float) @@ -301,6 +372,8 @@ ERROR: node is still EOpNull! 0:? 'misSized' (out 5-element array of highp float) 0:? 'okaySize' (out 4-element array of highp float) 0:? 'pv3' (temp highp 3-component vector of float) +0:? 'badpatchIName' (patch out implicitly-sized array of block{out highp float f}) +0:? 'patchIName' (patch out 4-element array of block{out highp float f}) Linked tessellation control stage: @@ -363,19 +436,17 @@ ERROR: node is still EOpNull! 0:31 'gl_InvocationID' (in highp int InvocationID) 0:33 move second child to first child (temp highp 4-component vector of float) 0:33 gl_Position: direct index for structure (out highp 4-component vector of float Position) -0:33 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:33 indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) 0:33 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:33 Constant: -0:33 1 (const int) +0:33 'gl_InvocationID' (in highp int InvocationID) 0:33 Constant: 0:33 0 (const int) 0:33 'p' (temp highp 4-component vector of float) 0:34 move second child to first child (temp highp float) 0:34 gl_PointSize: direct index for structure (out highp float PointSize) -0:34 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:34 indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) 0:34 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:34 Constant: -0:34 1 (const int) +0:34 'gl_InvocationID' (in highp int InvocationID) 0:34 Constant: 0:34 1 (const int) 0:34 'ps' (temp highp float) @@ -477,10 +548,9 @@ ERROR: node is still EOpNull! 0:114 1 (const int) 0:115 move second child to first child (temp highp float) 0:115 gl_PointSize: direct index for structure (out highp float PointSize) -0:115 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:115 indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) 0:115 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:115 Constant: -0:115 1 (const int) +0:115 'gl_InvocationID' (in highp int InvocationID) 0:115 Constant: 0:115 1 (const int) 0:115 'ps' (temp highp float) @@ -539,9 +609,79 @@ ERROR: node is still EOpNull! 0:142 2.000000 0:142 2.000000 0:142 2.000000 +0:153 Function Definition: outputtingOutparam(i1; (global void) +0:153 Function Parameters: +0:153 'a' (out highp int) +0:155 Sequence +0:155 move second child to first child (temp highp int) +0:155 'a' (out highp int) +0:155 Constant: +0:155 2 (const int) +0:158 Function Definition: outputting( (global void) +0:158 Function Parameters: +0:160 Sequence +0:160 move second child to first child (temp highp int) +0:160 indirect index (temp highp int) +0:160 'outa' (out 4-element array of highp int) +0:160 'gl_InvocationID' (in highp int InvocationID) +0:160 Constant: +0:160 2 (const int) +0:161 move second child to first child (temp highp int) +0:161 direct index (temp highp int) +0:161 'outa' (out 4-element array of highp int) +0:161 Constant: +0:161 1 (const int) +0:161 Constant: +0:161 2 (const int) +0:162 move second child to first child (temp highp 4-component vector of float) +0:162 gl_Position: direct index for structure (out highp 4-component vector of float Position) +0:162 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:162 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:162 Constant: +0:162 0 (const int) +0:162 Constant: +0:162 0 (const int) +0:162 Constant: +0:162 1.000000 +0:162 1.000000 +0:162 1.000000 +0:162 1.000000 +0:163 direct index (temp highp int) +0:163 'outa' (out 4-element array of highp int) +0:163 Constant: +0:163 1 (const int) +0:164 direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:164 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) +0:164 Constant: +0:164 0 (const int) +0:165 Function Call: outputtingOutparam(i1; (global void) +0:165 direct index (temp highp int) +0:165 'outa' (out 4-element array of highp int) +0:165 Constant: +0:165 0 (const int) +0:166 Function Call: outputtingOutparam(i1; (global void) +0:166 indirect index (temp highp int) +0:166 'outa' (out 4-element array of highp int) +0:166 'gl_InvocationID' (in highp int InvocationID) +0:167 move second child to first child (temp highp float) +0:167 f: direct index for structure (out highp float) +0:167 direct index (patch temp block{out highp float f}) +0:167 'patchIName' (patch out 4-element array of block{out highp float f}) +0:167 Constant: +0:167 1 (const int) +0:167 Constant: +0:167 0 (const int) +0:167 Constant: +0:167 3.140000 +0:168 move second child to first child (temp highp int) +0:168 indirect index (temp highp int) +0:168 'outa' (out 4-element array of highp int) +0:168 'gl_InvocationID' (in highp int InvocationID) +0:168 Constant: +0:168 2 (const int) 0:? Linker Objects 0:? 'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize}) -0:? 'outa' (global 4-element array of highp int) +0:? 'outa' (out 4-element array of highp int) 0:? 'patchIn' (patch in highp 4-component vector of float) 0:? 'patchOut' (patch out highp 4-component vector of float) 0:? 'ina' (in highp 2-component vector of float) @@ -563,4 +703,6 @@ ERROR: node is still EOpNull! 0:? 'misSized' (out 5-element array of highp float) 0:? 'okaySize' (out 4-element array of highp float) 0:? 'pv3' (temp highp 3-component vector of float) +0:? 'badpatchIName' (patch out 1-element array of block{out highp float f}) +0:? 'patchIName' (patch out 4-element array of block{out highp float f}) diff --git a/Test/baseResults/400.tesc.out b/Test/baseResults/400.tesc.out index 7430cffa..a1401d33 100644 --- a/Test/baseResults/400.tesc.out +++ b/Test/baseResults/400.tesc.out @@ -81,29 +81,26 @@ ERROR: node is still EOpNull! 0:29 'gl_InvocationID' (in int InvocationID) 0:31 move second child to first child (temp 4-component vector of float) 0:31 gl_Position: direct index for structure (out 4-component vector of float Position) -0:31 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:31 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:31 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:31 Constant: -0:31 1 (const int) +0:31 'gl_InvocationID' (in int InvocationID) 0:31 Constant: 0:31 0 (const int) 0:31 'p' (temp 4-component vector of float) 0:32 move second child to first child (temp float) 0:32 gl_PointSize: direct index for structure (out float PointSize) -0:32 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:32 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:32 Constant: -0:32 1 (const int) +0:32 'gl_InvocationID' (in int InvocationID) 0:32 Constant: 0:32 1 (const int) 0:32 'ps' (temp float) 0:33 move second child to first child (temp float) 0:33 direct index (temp float ClipDistance) 0:33 gl_ClipDistance: direct index for structure (out implicitly-sized array of float ClipDistance) -0:33 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) 0:33 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 Constant: -0:33 1 (const int) +0:33 'gl_InvocationID' (in int InvocationID) 0:33 Constant: 0:33 2 (const int) 0:33 Constant: @@ -279,29 +276,26 @@ ERROR: node is still EOpNull! 0:29 'gl_InvocationID' (in int InvocationID) 0:31 move second child to first child (temp 4-component vector of float) 0:31 gl_Position: direct index for structure (out 4-component vector of float Position) -0:31 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:31 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:31 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:31 Constant: -0:31 1 (const int) +0:31 'gl_InvocationID' (in int InvocationID) 0:31 Constant: 0:31 0 (const int) 0:31 'p' (temp 4-component vector of float) 0:32 move second child to first child (temp float) 0:32 gl_PointSize: direct index for structure (out float PointSize) -0:32 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:32 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:32 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:32 Constant: -0:32 1 (const int) +0:32 'gl_InvocationID' (in int InvocationID) 0:32 Constant: 0:32 1 (const int) 0:32 'ps' (temp float) 0:33 move second child to first child (temp float) 0:33 direct index (temp float ClipDistance) 0:33 gl_ClipDistance: direct index for structure (out 1-element array of float ClipDistance) -0:33 direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) +0:33 indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) 0:33 'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance}) -0:33 Constant: -0:33 1 (const int) +0:33 'gl_InvocationID' (in int InvocationID) 0:33 Constant: 0:33 2 (const int) 0:33 Constant: diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out index 999c1c6f..c0875138 100644 --- a/Test/baseResults/420.tesc.out +++ b/Test/baseResults/420.tesc.out @@ -63,17 +63,15 @@ ERROR: node is still EOpNull! 0:23 'gl_InvocationID' (in int InvocationID) 0:25 move second child to first child (temp 4-component vector of float) 0:25 gl_Position: direct index for structure (out 4-component vector of float Position) -0:25 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:25 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:25 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:25 Constant: -0:25 1 (const int) +0:25 'gl_InvocationID' (in int InvocationID) 0:25 Constant: 0:25 0 (const int) 0:25 'p' (temp 4-component vector of float) -0:26 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:26 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:26 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:26 Constant: -0:26 1 (const int) +0:26 'gl_InvocationID' (in int InvocationID) 0:34 Function Definition: foo( (global void) 0:34 Function Parameters: 0:36 Sequence @@ -176,17 +174,15 @@ ERROR: node is still EOpNull! 0:23 'gl_InvocationID' (in int InvocationID) 0:25 move second child to first child (temp 4-component vector of float) 0:25 gl_Position: direct index for structure (out 4-component vector of float Position) -0:25 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:25 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:25 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:25 Constant: -0:25 1 (const int) +0:25 'gl_InvocationID' (in int InvocationID) 0:25 Constant: 0:25 0 (const int) 0:25 'p' (temp 4-component vector of float) -0:26 direct index (temp block{out 4-component vector of float Position gl_Position}) +0:26 indirect index (temp block{out 4-component vector of float Position gl_Position}) 0:26 'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position}) -0:26 Constant: -0:26 1 (const int) +0:26 'gl_InvocationID' (in int InvocationID) 0:34 Function Definition: foo( (global void) 0:34 Function Parameters: 0:36 Sequence diff --git a/Test/baseResults/450.tesc.out b/Test/baseResults/450.tesc.out index 6eaf6f9d..26d93075 100644 --- a/Test/baseResults/450.tesc.out +++ b/Test/baseResults/450.tesc.out @@ -10,10 +10,9 @@ vertices = 0 0:13 move second child to first child (temp float) 0:13 direct index (temp float CullDistance) 0:13 gl_CullDistance: direct index for structure (out implicitly-sized array of float CullDistance) -0:13 direct index (temp block{out implicitly-sized array of float CullDistance gl_CullDistance}) -0:13 'gl_out' (out implicitly-sized array of block{out implicitly-sized array of float CullDistance gl_CullDistance}) -0:13 Constant: -0:13 0 (const int) +0:13 indirect index (temp block{out implicitly-sized array of float CullDistance gl_CullDistance}) +0:13 'gl_out' (out 4-element array of block{out implicitly-sized array of float CullDistance gl_CullDistance}) +0:13 'gl_InvocationID' (in int InvocationID) 0:13 Constant: 0:13 0 (const int) 0:13 Constant: @@ -30,7 +29,7 @@ vertices = 0 0:13 2 (const int) 0:? Linker Objects 0:? 'gl_in' (in 32-element array of block{in implicitly-sized array of float CullDistance gl_CullDistance}) -0:? 'gl_out' (out implicitly-sized array of block{out implicitly-sized array of float CullDistance gl_CullDistance}) +0:? 'gl_out' (out 4-element array of block{out implicitly-sized array of float CullDistance gl_CullDistance}) Linked tessellation control stage: @@ -46,10 +45,9 @@ vertices = 0 0:13 move second child to first child (temp float) 0:13 direct index (temp float CullDistance) 0:13 gl_CullDistance: direct index for structure (out 1-element array of float CullDistance) -0:13 direct index (temp block{out 1-element array of float CullDistance gl_CullDistance}) -0:13 'gl_out' (out 1-element array of block{out 1-element array of float CullDistance gl_CullDistance}) -0:13 Constant: -0:13 0 (const int) +0:13 indirect index (temp block{out 1-element array of float CullDistance gl_CullDistance}) +0:13 'gl_out' (out 4-element array of block{out 1-element array of float CullDistance gl_CullDistance}) +0:13 'gl_InvocationID' (in int InvocationID) 0:13 Constant: 0:13 0 (const int) 0:13 Constant: @@ -66,5 +64,5 @@ vertices = 0 0:13 2 (const int) 0:? Linker Objects 0:? 'gl_in' (in 32-element array of block{in 1-element array of float CullDistance gl_CullDistance}) -0:? 'gl_out' (out 1-element array of block{out 1-element array of float CullDistance gl_CullDistance}) +0:? 'gl_out' (out 4-element array of block{out 1-element array of float CullDistance gl_CullDistance}) diff --git a/Test/baseResults/spv.400.tesc.out b/Test/baseResults/spv.400.tesc.out index c1bee837..dee214d6 100755 --- a/Test/baseResults/spv.400.tesc.out +++ b/Test/baseResults/spv.400.tesc.out @@ -7,12 +7,12 @@ Linked tessellation control stage: // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 90 +// Id's are bound by 93 Capability Tessellation 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint TessellationControl 4 "main" 52 76 80 81 84 85 88 89 + EntryPoint TessellationControl 4 "main" 52 79 83 84 87 88 91 92 ExecutionMode 4 OutputVertices 4 Source GLSL 400 SourceExtension "GL_ARB_separate_shader_objects" @@ -37,16 +37,16 @@ Linked tessellation control stage: MemberName 48(gl_PerVertex) 1 "gl_PointSize" MemberName 48(gl_PerVertex) 2 "gl_ClipDistance" Name 52 "gl_out" - Name 63 "gl_TessLevelOuter" - Name 70 "gl_TessLevelInner" - Name 75 "outa" - Name 76 "patchOut" - Name 80 "inb" - Name 81 "ind" - Name 84 "ivla" - Name 85 "ivlb" - Name 88 "ovla" - Name 89 "ovlb" + Name 66 "gl_TessLevelOuter" + Name 73 "gl_TessLevelInner" + Name 78 "outa" + Name 79 "patchOut" + Name 83 "inb" + Name 84 "ind" + Name 87 "ivla" + Name 88 "ivlb" + Name 91 "ovla" + Name 92 "ovlb" MemberDecorate 19(gl_PerVertex) 0 BuiltIn Position MemberDecorate 19(gl_PerVertex) 1 BuiltIn PointSize MemberDecorate 19(gl_PerVertex) 2 BuiltIn ClipDistance @@ -58,15 +58,15 @@ Linked tessellation control stage: MemberDecorate 48(gl_PerVertex) 1 BuiltIn PointSize MemberDecorate 48(gl_PerVertex) 2 BuiltIn ClipDistance Decorate 48(gl_PerVertex) Block - Decorate 63(gl_TessLevelOuter) Patch - Decorate 63(gl_TessLevelOuter) BuiltIn TessLevelOuter - Decorate 70(gl_TessLevelInner) Patch - Decorate 70(gl_TessLevelInner) BuiltIn TessLevelInner - Decorate 76(patchOut) Patch - Decorate 84(ivla) Location 3 - Decorate 85(ivlb) Location 4 - Decorate 88(ovla) Location 3 - Decorate 89(ovlb) Location 4 + Decorate 66(gl_TessLevelOuter) Patch + Decorate 66(gl_TessLevelOuter) BuiltIn TessLevelOuter + Decorate 73(gl_TessLevelInner) Patch + Decorate 73(gl_TessLevelInner) BuiltIn TessLevelInner + Decorate 79(patchOut) Patch + Decorate 87(ivla) Location 3 + Decorate 88(ivlb) Location 4 + Decorate 91(ovla) Location 3 + Decorate 92(ovlb) Location 4 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 @@ -100,35 +100,35 @@ Linked tessellation control stage: 50: TypeArray 48(gl_PerVertex) 49 51: TypePointer Output 50 52(gl_out): 51(ptr) Variable Output - 54: TypePointer Output 15(fvec4) - 57: TypePointer Output 14(float) - 61: TypeArray 14(float) 49 - 62: TypePointer Output 61 -63(gl_TessLevelOuter): 62(ptr) Variable Output - 64: 10(int) Constant 3 - 65: 14(float) Constant 1078774989 - 67: 6(int) Constant 2 - 68: TypeArray 14(float) 67 - 69: TypePointer Output 68 -70(gl_TessLevelInner): 69(ptr) Variable Output - 71: 14(float) Constant 1067869798 - 73: TypeArray 10(int) 49 - 74: TypePointer Private 73 - 75(outa): 74(ptr) Variable Private - 76(patchOut): 54(ptr) Variable Output - 77: TypeVector 14(float) 2 - 78: TypeArray 77(fvec2) 20 - 79: TypePointer Input 78 - 80(inb): 79(ptr) Variable Input - 81(ind): 79(ptr) Variable Input - 82: TypeArray 15(fvec4) 20 - 83: TypePointer Input 82 - 84(ivla): 83(ptr) Variable Input - 85(ivlb): 83(ptr) Variable Input - 86: TypeArray 15(fvec4) 49 - 87: TypePointer Output 86 - 88(ovla): 87(ptr) Variable Output - 89(ovlb): 87(ptr) Variable Output + 55: TypePointer Output 15(fvec4) + 59: TypePointer Output 14(float) + 64: TypeArray 14(float) 49 + 65: TypePointer Output 64 +66(gl_TessLevelOuter): 65(ptr) Variable Output + 67: 10(int) Constant 3 + 68: 14(float) Constant 1078774989 + 70: 6(int) Constant 2 + 71: TypeArray 14(float) 70 + 72: TypePointer Output 71 +73(gl_TessLevelInner): 72(ptr) Variable Output + 74: 14(float) Constant 1067869798 + 76: TypeArray 10(int) 49 + 77: TypePointer Private 76 + 78(outa): 77(ptr) Variable Private + 79(patchOut): 55(ptr) Variable Output + 80: TypeVector 14(float) 2 + 81: TypeArray 80(fvec2) 20 + 82: TypePointer Input 81 + 83(inb): 82(ptr) Variable Input + 84(ind): 82(ptr) Variable Input + 85: TypeArray 15(fvec4) 20 + 86: TypePointer Input 85 + 87(ivla): 86(ptr) Variable Input + 88(ivlb): 86(ptr) Variable Input + 89: TypeArray 15(fvec4) 49 + 90: TypePointer Output 89 + 91(ovla): 90(ptr) Variable Output + 92(ovlb): 90(ptr) Variable Output 4(main): 2 Function None 3 5: Label 12(a): 11(ptr) Variable Function @@ -156,18 +156,21 @@ Linked tessellation control stage: Store 42(pid) 44 47: 10(int) Load 46(gl_InvocationID) Store 45(iid) 47 - 53: 15(fvec4) Load 17(p) - 55: 54(ptr) AccessChain 52(gl_out) 24 25 - Store 55 53 - 56: 14(float) Load 30(ps) - 58: 57(ptr) AccessChain 52(gl_out) 24 24 - Store 58 56 - 59: 14(float) Load 34(cd) - 60: 57(ptr) AccessChain 52(gl_out) 24 35 24 - Store 60 59 - 66: 57(ptr) AccessChain 63(gl_TessLevelOuter) 64 - Store 66 65 - 72: 57(ptr) AccessChain 70(gl_TessLevelInner) 24 - Store 72 71 + 53: 10(int) Load 46(gl_InvocationID) + 54: 15(fvec4) Load 17(p) + 56: 55(ptr) AccessChain 52(gl_out) 53 25 + Store 56 54 + 57: 10(int) Load 46(gl_InvocationID) + 58: 14(float) Load 30(ps) + 60: 59(ptr) AccessChain 52(gl_out) 57 24 + Store 60 58 + 61: 10(int) Load 46(gl_InvocationID) + 62: 14(float) Load 34(cd) + 63: 59(ptr) AccessChain 52(gl_out) 61 35 24 + Store 63 62 + 69: 59(ptr) AccessChain 66(gl_TessLevelOuter) 67 + Store 69 68 + 75: 59(ptr) AccessChain 73(gl_TessLevelInner) 24 + Store 75 74 Return FunctionEnd diff --git a/Test/spv.400.tesc b/Test/spv.400.tesc index 348e6214..1c926d08 100644 --- a/Test/spv.400.tesc +++ b/Test/spv.400.tesc @@ -23,9 +23,9 @@ void main() int pid = gl_PrimitiveID; int iid = gl_InvocationID; - gl_out[1].gl_Position = p; - gl_out[1].gl_PointSize = ps; - gl_out[1].gl_ClipDistance[1] = cd; + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; gl_TessLevelOuter[3] = 3.2; gl_TessLevelInner[1] = 1.3; diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 7f6f6774..90b2697d 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // For the version, it uses the latest git tag followed by the number of commits. // For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "SPIRV99.807" +#define GLSLANG_REVISION "SPIRV99.809" #define GLSLANG_DATE "28-Nov-2015" diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 6d50cbe6..55c0ee03 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -518,8 +518,9 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn requireProfile(base->getLoc(), ~EEsProfile, "variable indexing buffer block array"); else if (base->getQualifier().storage == EvqUniform) profileRequires(base->getLoc(), EEsProfile, 0, Num_AEP_gpu_shader5, AEP_gpu_shader5, "variable indexing uniform block array"); - else - requireProfile(base->getLoc(), ~EEsProfile, "variable indexing in/out block array"); + else { + // input/output blocks either don't exist or can be variable indexed + } } else if (language == EShLangFragment && base->getQualifier().isPipeOutput()) requireProfile(base->getLoc(), ~EEsProfile, "variable indexing fragment shader ouput array"); else if (base->getBasicType() == EbtSampler && version >= 130) { @@ -1871,6 +1872,21 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt switch(binaryNode->getOp()) { case EOpIndexDirect: case EOpIndexIndirect: + // ... tessellation control shader ... + // If a per-vertex output variable is used as an l-value, it is a + // compile-time or link-time error if the expression indicating the + // vertex index is not the identifier gl_InvocationID. + if (language == EShLangTessControl) { + const TType& leftType = binaryNode->getLeft()->getType(); + if (leftType.getQualifier().storage == EvqVaryingOut && ! leftType.getQualifier().patch && binaryNode->getLeft()->getAsSymbolNode()) { + // we have a per-vertex output + const TIntermSymbol* rightSymbol = binaryNode->getRight()->getAsSymbolNode(); + if (! rightSymbol || rightSymbol->getQualifier().builtIn != EbvInvocationId) + error(loc, "tessellation-control per-vertex output l-value must be indexed with gl_InvocationID", "[]", ""); + } + } + + // fall through case EOpIndexDirectStruct: return lValueErrorCheck(loc, op, binaryNode->getLeft()); case EOpVectorSwizzle: