diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 1661d5b1ea97bba666ae8682918c4d1b37aad591..4833cd76c0320351d6fe5e2a650f5db09e87b2df 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -2465,6 +2465,10 @@ bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) if (member.getFieldName() == "gl_ViewportMaskPerViewNV" && extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end()) return true; + if ((member.getFieldName() == "gl_ViewportIndex" || member.getFieldName() == "gl_Layer") && + extensions.find(glslang::E_GL_ARB_shader_viewport_layer_array) == extensions.end() && + extensions.find(glslang::E_GL_NV_viewport_array2) == extensions.end()) + return true; return false; }; diff --git a/Test/baseResults/spv.450.geom.out b/Test/baseResults/spv.450.geom.out index 4d012c415d655b1edc9937ed3304cc2a904363eb..9c851c343fe19f8fe5dd186f3680b327663b8502 100755 --- a/Test/baseResults/spv.450.geom.out +++ b/Test/baseResults/spv.450.geom.out @@ -1,13 +1,14 @@ spv.450.geom // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 26 +// Id's are bound by 31 Capability Geometry Capability GeometryPointSize + Capability MultiViewport 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Geometry 4 "main" 13 20 + EntryPoint Geometry 4 "main" 13 20 27 29 ExecutionMode 4 Triangles ExecutionMode 4 Invocations 4 ExecutionMode 4 OutputLineStrip @@ -26,6 +27,8 @@ spv.450.geom MemberName 16(gl_PerVertex) 2 "gl_ClipDistance" MemberName 16(gl_PerVertex) 3 "gl_CullDistance" Name 20 "gl_in" + Name 27 "gl_Layer" + Name 29 "gl_ViewportIndex" MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance @@ -36,6 +39,8 @@ spv.450.geom MemberDecorate 16(gl_PerVertex) 2 BuiltIn ClipDistance MemberDecorate 16(gl_PerVertex) 3 BuiltIn CullDistance Decorate 16(gl_PerVertex) Block + Decorate 27(gl_Layer) BuiltIn Layer + Decorate 29(gl_ViewportIndex) BuiltIn ViewportIndex 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -55,11 +60,18 @@ spv.450.geom 20(gl_in): 19(ptr) Variable Input 21: TypePointer Input 6(float) 24: TypePointer Output 6(float) + 26: TypePointer Output 14(int) + 27(gl_Layer): 26(ptr) Variable Output + 28: 14(int) Constant 2 +29(gl_ViewportIndex): 26(ptr) Variable Output + 30: 14(int) Constant 3 4(main): 2 Function None 3 5: Label 22: 21(ptr) AccessChain 20(gl_in) 15 15 23: 6(float) Load 22 25: 24(ptr) AccessChain 13 15 Store 25 23 + Store 27(gl_Layer) 28 + Store 29(gl_ViewportIndex) 30 Return FunctionEnd diff --git a/Test/baseResults/spv.450.tesc.out b/Test/baseResults/spv.450.tesc.out index 6b4325b953c6dfc4b603c5183b41671fdd88e9f8..5ccea066f12c9df1764ddf86008ec5f24adc6618 100755 --- a/Test/baseResults/spv.450.tesc.out +++ b/Test/baseResults/spv.450.tesc.out @@ -1,72 +1,120 @@ spv.450.tesc // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 23 +// Id's are bound by 45 Capability Tessellation 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint TessellationControl 4 "main" 9 16 19 22 + EntryPoint TessellationControl 4 "main" 15 18 25 32 38 41 44 ExecutionMode 4 OutputVertices 4 Source GLSL 450 Name 4 "main" - Name 9 "patchOut" - Name 10 "S" - MemberName 10(S) 0 "sMem1" - MemberName 10(S) 1 "sMem2" - Name 11 "TheBlock" - MemberName 11(TheBlock) 0 "bMem1" - MemberName 11(TheBlock) 1 "bMem2" - MemberName 11(TheBlock) 2 "s" - Name 16 "tcBlock" - Name 17 "SingleBlock" - MemberName 17(SingleBlock) 0 "bMem1" - MemberName 17(SingleBlock) 1 "bMem2" - MemberName 17(SingleBlock) 2 "s" - Name 19 "singleBlock" - Name 20 "bn" - MemberName 20(bn) 0 "v1" - MemberName 20(bn) 1 "v2" - MemberName 20(bn) 2 "v3" - Name 22 "" - Decorate 9(patchOut) Patch - MemberDecorate 11(TheBlock) 0 Patch - MemberDecorate 11(TheBlock) 1 Patch - MemberDecorate 11(TheBlock) 2 Patch - Decorate 11(TheBlock) Block - Decorate 16(tcBlock) Location 12 - MemberDecorate 17(SingleBlock) 0 Patch - MemberDecorate 17(SingleBlock) 1 Patch - MemberDecorate 17(SingleBlock) 2 Patch - Decorate 17(SingleBlock) Block - Decorate 19(singleBlock) Location 2 - MemberDecorate 20(bn) 0 Patch - MemberDecorate 20(bn) 0 Location 20 - MemberDecorate 20(bn) 1 Patch - MemberDecorate 20(bn) 1 Location 24 - MemberDecorate 20(bn) 2 Patch - MemberDecorate 20(bn) 2 Location 25 - Decorate 20(bn) Block + Name 11 "gl_PerVertex" + MemberName 11(gl_PerVertex) 0 "gl_Position" + MemberName 11(gl_PerVertex) 1 "gl_PointSize" + MemberName 11(gl_PerVertex) 2 "gl_ClipDistance" + MemberName 11(gl_PerVertex) 3 "gl_CullDistance" + Name 15 "gl_out" + Name 18 "gl_InvocationID" + Name 21 "gl_PerVertex" + MemberName 21(gl_PerVertex) 0 "gl_Position" + MemberName 21(gl_PerVertex) 1 "gl_PointSize" + MemberName 21(gl_PerVertex) 2 "gl_ClipDistance" + MemberName 21(gl_PerVertex) 3 "gl_CullDistance" + Name 25 "gl_in" + Name 32 "patchOut" + Name 33 "S" + MemberName 33(S) 0 "sMem1" + MemberName 33(S) 1 "sMem2" + Name 34 "TheBlock" + MemberName 34(TheBlock) 0 "bMem1" + MemberName 34(TheBlock) 1 "bMem2" + MemberName 34(TheBlock) 2 "s" + Name 38 "tcBlock" + Name 39 "SingleBlock" + MemberName 39(SingleBlock) 0 "bMem1" + MemberName 39(SingleBlock) 1 "bMem2" + MemberName 39(SingleBlock) 2 "s" + Name 41 "singleBlock" + Name 42 "bn" + MemberName 42(bn) 0 "v1" + MemberName 42(bn) 1 "v2" + MemberName 42(bn) 2 "v3" + Name 44 "" + MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position + MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize + MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance + MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance + Decorate 11(gl_PerVertex) Block + Decorate 18(gl_InvocationID) BuiltIn InvocationId + MemberDecorate 21(gl_PerVertex) 0 BuiltIn Position + MemberDecorate 21(gl_PerVertex) 1 BuiltIn PointSize + MemberDecorate 21(gl_PerVertex) 2 BuiltIn ClipDistance + MemberDecorate 21(gl_PerVertex) 3 BuiltIn CullDistance + Decorate 21(gl_PerVertex) Block + Decorate 32(patchOut) Patch + Decorate 32(patchOut) Location 1 + MemberDecorate 34(TheBlock) 0 Patch + MemberDecorate 34(TheBlock) 1 Patch + MemberDecorate 34(TheBlock) 2 Patch + Decorate 34(TheBlock) Block + Decorate 38(tcBlock) Location 12 + MemberDecorate 39(SingleBlock) 0 Patch + MemberDecorate 39(SingleBlock) 1 Patch + MemberDecorate 39(SingleBlock) 2 Patch + Decorate 39(SingleBlock) Block + Decorate 41(singleBlock) Location 2 + MemberDecorate 42(bn) 0 Patch + MemberDecorate 42(bn) 0 Location 20 + MemberDecorate 42(bn) 1 Patch + MemberDecorate 42(bn) 1 Location 24 + MemberDecorate 42(bn) 2 Patch + MemberDecorate 42(bn) 2 Location 25 + Decorate 42(bn) Block 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 7: TypeVector 6(float) 4 - 8: TypePointer Output 7(fvec4) - 9(patchOut): 8(ptr) Variable Output - 10(S): TypeStruct 6(float) 6(float) - 11(TheBlock): TypeStruct 6(float) 6(float) 10(S) - 12: TypeInt 32 0 - 13: 12(int) Constant 2 - 14: TypeArray 11(TheBlock) 13 - 15: TypePointer Output 14 - 16(tcBlock): 15(ptr) Variable Output - 17(SingleBlock): TypeStruct 6(float) 6(float) 10(S) - 18: TypePointer Output 17(SingleBlock) - 19(singleBlock): 18(ptr) Variable Output - 20(bn): TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) - 21: TypePointer Output 20(bn) - 22: 21(ptr) Variable Output + 8: TypeInt 32 0 + 9: 8(int) Constant 1 + 10: TypeArray 6(float) 9 +11(gl_PerVertex): TypeStruct 7(fvec4) 6(float) 10 10 + 12: 8(int) Constant 4 + 13: TypeArray 11(gl_PerVertex) 12 + 14: TypePointer Output 13 + 15(gl_out): 14(ptr) Variable Output + 16: TypeInt 32 1 + 17: TypePointer Input 16(int) +18(gl_InvocationID): 17(ptr) Variable Input + 20: 16(int) Constant 0 +21(gl_PerVertex): TypeStruct 7(fvec4) 6(float) 10 10 + 22: 8(int) Constant 32 + 23: TypeArray 21(gl_PerVertex) 22 + 24: TypePointer Input 23 + 25(gl_in): 24(ptr) Variable Input + 27: TypePointer Input 7(fvec4) + 30: TypePointer Output 7(fvec4) + 32(patchOut): 30(ptr) Variable Output + 33(S): TypeStruct 6(float) 6(float) + 34(TheBlock): TypeStruct 6(float) 6(float) 33(S) + 35: 8(int) Constant 2 + 36: TypeArray 34(TheBlock) 35 + 37: TypePointer Output 36 + 38(tcBlock): 37(ptr) Variable Output + 39(SingleBlock): TypeStruct 6(float) 6(float) 33(S) + 40: TypePointer Output 39(SingleBlock) + 41(singleBlock): 40(ptr) Variable Output + 42(bn): TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) + 43: TypePointer Output 42(bn) + 44: 43(ptr) Variable Output 4(main): 2 Function None 3 5: Label + 19: 16(int) Load 18(gl_InvocationID) + 26: 16(int) Load 18(gl_InvocationID) + 28: 27(ptr) AccessChain 25(gl_in) 26 20 + 29: 7(fvec4) Load 28 + 31: 30(ptr) AccessChain 15(gl_out) 19 20 + Store 31 29 Return FunctionEnd diff --git a/Test/spv.450.geom b/Test/spv.450.geom index 8aefe507665ce11ae225a2fc5f7457904285aff1..3489a888146e42f753c88220554cc5e14764a2d2 100644 --- a/Test/spv.450.geom +++ b/Test/spv.450.geom @@ -9,4 +9,6 @@ layout(invocations = 4) in; void main() { gl_PointSize = gl_in[1].gl_PointSize; + gl_Layer = 2; + gl_ViewportIndex = 3; } diff --git a/Test/spv.450.tesc b/Test/spv.450.tesc index c3719f96d1795c6e7ed94e5901a30ab6c308c420..47b9a40876e580bc1c0f6537c26c941c420ec47f 100644 --- a/Test/spv.450.tesc +++ b/Test/spv.450.tesc @@ -2,7 +2,7 @@ layout(vertices = 4) out; -patch out vec4 patchOut; +layout(location=1) patch out vec4 patchOut; struct S { float sMem1; // should not see a patch decoration @@ -17,6 +17,7 @@ layout(location = 12) patch out TheBlock { void main() { + gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; } layout(location = 2) patch out SingleBlock {