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 {