Allow redeclaration of builtin interface blocks in mesh shader

Apart from allowing redeclaration of gl_MeshPerVertexNV and gl_MeshPerPrimitiveNV blocks, this change also -
- Resize clip/cull perview distances based on static index use
- Error out use of both single-view and per-view builtins
- Add new gtests with redeclared blocks and edit existing test output
- Fix couple of typos
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index fd14476..4571805 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -1222,6 +1222,8 @@
 //   .rchit = ray closest hit
 //   .rmiss = ray miss
 //   .rcall = ray callable
+//   .mesh  = mesh
+//   .task  = task
 //   Additionally, the file names may end in .<stage>.glsl and .<stage>.hlsl
 //   where <stage> is one of the stages listed above.
 //
@@ -1360,7 +1362,7 @@
            "    .rahit   for a ray any hit shader\n"
            "    .rchit   for a ray closest hit shader\n"
            "    .rmiss   for a ray miss shader\n"
-           "    .rcall   for a ray callable shader"
+           "    .rcall   for a ray callable shader\n"
 #endif
            "    .glsl   for .vert.glsl, .tesc.glsl, ..., .comp.glsl compound suffixes\n"
            "    .hlsl   for .vert.hlsl, .tesc.hlsl, ..., .comp.hlsl compound suffixes\n"
diff --git a/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out b/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
index ef39907..20b6fa2 100644
--- a/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
+++ b/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
@@ -1,4 +1,4 @@
-spv.meshShaderUserDefined.mesh
+spv.320.meshShaderUserDefined.mesh
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 140
diff --git a/Test/baseResults/spv.meshShaderBuiltins.mesh.out b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
index ef4ff4d..8090f7b 100644
--- a/Test/baseResults/spv.meshShaderBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
@@ -1,7 +1,7 @@
 spv.meshShaderBuiltins.mesh
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 147
+// Id's are bound by 146
 
                               Capability ClipDistance
                               Capability CullDistance
@@ -14,7 +14,7 @@
                               Extension  "SPV_NV_viewport_array2"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MeshNV 4  "main" 11 17 34 89 129 140 144
+                              EntryPoint MeshNV 4  "main" 11 17 34 88 128 139 143
                               ExecutionMode 4 LocalSize 32 1 1
                               ExecutionMode 4 OutputVertices 81
                               ExecutionMode 4 OutputPrimitivesNV 32
@@ -35,17 +35,17 @@
                               MemberName 30(gl_MeshPerVertexNV) 5  "gl_ClipDistancePerViewNV"
                               MemberName 30(gl_MeshPerVertexNV) 6  "gl_CullDistancePerViewNV"
                               Name 34  "gl_MeshVerticesNV"
-                              Name 85  "gl_MeshPerPrimitiveNV"
-                              MemberName 85(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
-                              MemberName 85(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
-                              MemberName 85(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
-                              MemberName 85(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
-                              MemberName 85(gl_MeshPerPrimitiveNV) 4  "gl_LayerPerViewNV"
-                              MemberName 85(gl_MeshPerPrimitiveNV) 5  "gl_ViewportMaskPerViewNV"
-                              Name 89  "gl_MeshPrimitivesNV"
-                              Name 129  "gl_PrimitiveIndicesNV"
-                              Name 140  "gl_DrawID"
-                              Name 144  "gl_PrimitiveCountNV"
+                              Name 84  "gl_MeshPerPrimitiveNV"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 4  "gl_LayerPerViewNV"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 5  "gl_ViewportMaskPerViewNV"
+                              Name 88  "gl_MeshPrimitivesNV"
+                              Name 128  "gl_PrimitiveIndicesNV"
+                              Name 139  "gl_DrawID"
+                              Name 143  "gl_PrimitiveCountNV"
                               Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
                               Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
                               MemberDecorate 30(gl_MeshPerVertexNV) 0 BuiltIn Position
@@ -59,25 +59,25 @@
                               MemberDecorate 30(gl_MeshPerVertexNV) 6 PerViewNV
                               MemberDecorate 30(gl_MeshPerVertexNV) 6 BuiltIn CullDistancePerViewNV
                               Decorate 30(gl_MeshPerVertexNV) Block
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 4 PerPrimitiveNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 4 PerViewNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 4 BuiltIn LayerPerViewNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 5 PerPrimitiveNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 5 PerViewNV
-                              MemberDecorate 85(gl_MeshPerPrimitiveNV) 5 BuiltIn ViewportMaskPerViewNV
-                              Decorate 85(gl_MeshPerPrimitiveNV) Block
-                              Decorate 129(gl_PrimitiveIndicesNV) BuiltIn PrimitiveIndicesNV
-                              Decorate 140(gl_DrawID) BuiltIn DrawIndex
-                              Decorate 144(gl_PrimitiveCountNV) BuiltIn PrimitiveCountNV
-                              Decorate 146 BuiltIn WorkgroupSize
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 4 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 4 PerViewNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 4 BuiltIn LayerPerViewNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 5 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 5 PerViewNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 5 BuiltIn ViewportMaskPerViewNV
+                              Decorate 84(gl_MeshPerPrimitiveNV) Block
+                              Decorate 128(gl_PrimitiveIndicesNV) BuiltIn PrimitiveIndicesNV
+                              Decorate 139(gl_DrawID) BuiltIn DrawIndex
+                              Decorate 143(gl_PrimitiveCountNV) BuiltIn PrimitiveCountNV
+                              Decorate 145 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -95,7 +95,7 @@
               24:      6(int) Constant 3
               25:             TypeArray 20(float) 24
               26:             TypeArray 21(fvec4) 22
-              27:      6(int) Constant 8
+              27:      6(int) Constant 1
               28:             TypeArray 20(float) 27
               29:             TypeArray 28 22
 30(gl_MeshPerVertexNV):             TypeStruct 21(fvec4) 20(float) 23 25 26 29 29
@@ -115,33 +115,32 @@
               49:     36(int) Constant 3
               50:   20(float) Constant 1077936128
               53:   20(float) Constant 1082130432
-              55:      6(int) Constant 1
-              56:      6(int) Constant 264
-              57:      6(int) Constant 2
-              82:             TypeArray 36(int) 55
-              83:             TypeArray 36(int) 22
-              84:             TypeArray 82 22
-85(gl_MeshPerPrimitiveNV):             TypeStruct 36(int) 36(int) 36(int) 82 83 84
-              86:      6(int) Constant 32
-              87:             TypeArray 85(gl_MeshPerPrimitiveNV) 86
-              88:             TypePointer Output 87
-89(gl_MeshPrimitivesNV):     88(ptr) Variable Output
-              91:     36(int) Constant 6
-              92:             TypePointer Output 36(int)
-              95:     36(int) Constant 7
-              98:     36(int) Constant 8
-             101:     36(int) Constant 9
-             127:             TypeArray 6(int) 31
-             128:             TypePointer Output 127
-129(gl_PrimitiveIndicesNV):    128(ptr) Variable Output
-             130:      6(int) Constant 257
-             131:             TypePointer Output 6(int)
-             139:             TypePointer Input 36(int)
-  140(gl_DrawID):    139(ptr) Variable Input
-             143:      6(int) Constant 16909060
-144(gl_PrimitiveCountNV):    131(ptr) Variable Output
-             145:      6(int) Constant 96
-             146:    9(ivec3) ConstantComposite 86 55 55
+              55:      6(int) Constant 264
+              56:      6(int) Constant 2
+              81:             TypeArray 36(int) 27
+              82:             TypeArray 36(int) 22
+              83:             TypeArray 81 22
+84(gl_MeshPerPrimitiveNV):             TypeStruct 36(int) 36(int) 36(int) 81 82 83
+              85:      6(int) Constant 32
+              86:             TypeArray 84(gl_MeshPerPrimitiveNV) 85
+              87:             TypePointer Output 86
+88(gl_MeshPrimitivesNV):     87(ptr) Variable Output
+              90:     36(int) Constant 6
+              91:             TypePointer Output 36(int)
+              94:     36(int) Constant 7
+              97:     36(int) Constant 8
+             100:     36(int) Constant 9
+             126:             TypeArray 6(int) 31
+             127:             TypePointer Output 126
+128(gl_PrimitiveIndicesNV):    127(ptr) Variable Output
+             129:      6(int) Constant 257
+             130:             TypePointer Output 6(int)
+             138:             TypePointer Input 36(int)
+  139(gl_DrawID):    138(ptr) Variable Input
+             142:      6(int) Constant 16909060
+143(gl_PrimitiveCountNV):    130(ptr) Variable Output
+             144:      6(int) Constant 96
+             145:    9(ivec3) ConstantComposite 85 27 27
          4(main):           2 Function None 3
                5:             Label
           8(iid):      7(ptr) Variable Function
@@ -164,96 +163,96 @@
               52:      6(int) Load 8(iid)
               54:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 52 49 48
                               Store 54 53
-                              MemoryBarrier 55 56
-                              ControlBarrier 57 57 56
-              58:      6(int) Load 8(iid)
-              59:      6(int) IAdd 58 55
-              60:      6(int) Load 8(iid)
-              61:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 60 37
-              62:   21(fvec4) Load 61
-              63:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 59 37
-                              Store 63 62
-              64:      6(int) Load 8(iid)
-              65:      6(int) IAdd 64 55
-              66:      6(int) Load 8(iid)
-              67:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 66 43
-              68:   20(float) Load 67
-              69:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 65 43
-                              Store 69 68
-              70:      6(int) Load 8(iid)
-              71:      6(int) IAdd 70 55
-              72:      6(int) Load 8(iid)
-              73:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 72 48 49
-              74:   20(float) Load 73
-              75:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 71 48 49
-                              Store 75 74
-              76:      6(int) Load 8(iid)
-              77:      6(int) IAdd 76 55
-              78:      6(int) Load 8(iid)
-              79:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 78 49 48
-              80:   20(float) Load 79
-              81:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 77 49 48
-                              Store 81 80
-                              MemoryBarrier 55 56
-                              ControlBarrier 57 57 56
-              90:      6(int) Load 8(iid)
-              93:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 90 37
-                              Store 93 91
-              94:      6(int) Load 8(iid)
-              96:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 94 43
-                              Store 96 95
-              97:      6(int) Load 8(iid)
-              99:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 97 48
-                              Store 99 98
-             100:      6(int) Load 8(iid)
-             102:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 100 49 37
-                              Store 102 101
-                              MemoryBarrier 55 56
-                              ControlBarrier 57 57 56
-             103:      6(int) Load 8(iid)
-             104:      6(int) IAdd 103 55
-             105:      6(int) Load 8(iid)
-             106:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 105 37
-             107:     36(int) Load 106
-             108:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 104 37
-                              Store 108 107
-             109:      6(int) Load 8(iid)
-             110:      6(int) IAdd 109 55
-             111:      6(int) Load 8(iid)
-             112:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 111 43
-             113:     36(int) Load 112
-             114:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 110 43
-                              Store 114 113
-             115:      6(int) Load 8(iid)
-             116:      6(int) IAdd 115 55
-             117:      6(int) Load 8(iid)
-             118:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 117 48
-             119:     36(int) Load 118
-             120:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 116 48
-                              Store 120 119
-             121:      6(int) Load 8(iid)
-             122:      6(int) IAdd 121 55
-             123:      6(int) Load 8(iid)
-             124:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 123 49 37
-             125:     36(int) Load 124
-             126:     92(ptr) AccessChain 89(gl_MeshPrimitivesNV) 122 49 37
-                              Store 126 125
-                              MemoryBarrier 55 56
-                              ControlBarrier 57 57 56
-             132:    131(ptr) AccessChain 129(gl_PrimitiveIndicesNV) 37
-                              Store 132 130
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+              57:      6(int) Load 8(iid)
+              58:      6(int) IAdd 57 27
+              59:      6(int) Load 8(iid)
+              60:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 59 37
+              61:   21(fvec4) Load 60
+              62:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 58 37
+                              Store 62 61
+              63:      6(int) Load 8(iid)
+              64:      6(int) IAdd 63 27
+              65:      6(int) Load 8(iid)
+              66:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 65 43
+              67:   20(float) Load 66
+              68:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 64 43
+                              Store 68 67
+              69:      6(int) Load 8(iid)
+              70:      6(int) IAdd 69 27
+              71:      6(int) Load 8(iid)
+              72:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 71 48 49
+              73:   20(float) Load 72
+              74:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 70 48 49
+                              Store 74 73
+              75:      6(int) Load 8(iid)
+              76:      6(int) IAdd 75 27
+              77:      6(int) Load 8(iid)
+              78:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 77 49 48
+              79:   20(float) Load 78
+              80:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 76 49 48
+                              Store 80 79
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+              89:      6(int) Load 8(iid)
+              92:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 89 37
+                              Store 92 90
+              93:      6(int) Load 8(iid)
+              95:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 93 43
+                              Store 95 94
+              96:      6(int) Load 8(iid)
+              98:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 96 48
+                              Store 98 97
+              99:      6(int) Load 8(iid)
+             101:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 99 49 37
+                              Store 101 100
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+             102:      6(int) Load 8(iid)
+             103:      6(int) IAdd 102 27
+             104:      6(int) Load 8(iid)
+             105:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 104 37
+             106:     36(int) Load 105
+             107:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 103 37
+                              Store 107 106
+             108:      6(int) Load 8(iid)
+             109:      6(int) IAdd 108 27
+             110:      6(int) Load 8(iid)
+             111:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 110 43
+             112:     36(int) Load 111
+             113:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 109 43
+                              Store 113 112
+             114:      6(int) Load 8(iid)
+             115:      6(int) IAdd 114 27
+             116:      6(int) Load 8(iid)
+             117:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 116 48
+             118:     36(int) Load 117
+             119:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 115 48
+                              Store 119 118
+             120:      6(int) Load 8(iid)
+             121:      6(int) IAdd 120 27
+             122:      6(int) Load 8(iid)
+             123:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 122 49 37
+             124:     36(int) Load 123
+             125:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 121 49 37
+                              Store 125 124
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+             131:    130(ptr) AccessChain 128(gl_PrimitiveIndicesNV) 37
+                              Store 131 129
+             132:      6(int) Load 16(gid)
              133:      6(int) Load 16(gid)
-             134:      6(int) Load 16(gid)
-             135:      6(int) ISub 134 55
-             136:    131(ptr) AccessChain 129(gl_PrimitiveIndicesNV) 135
-             137:      6(int) Load 136
-             138:    131(ptr) AccessChain 129(gl_PrimitiveIndicesNV) 133
-                              Store 138 137
-             141:     36(int) Load 140(gl_DrawID)
-             142:      6(int) Bitcast 141
-             143:         142 WritePackedPrimitiveIndices4x8NV
-                              Store 144(gl_PrimitiveCountNV) 145
-                              MemoryBarrier 55 56
-                              ControlBarrier 57 57 56
+             134:      6(int) ISub 133 27
+             135:    130(ptr) AccessChain 128(gl_PrimitiveIndicesNV) 134
+             136:      6(int) Load 135
+             137:    130(ptr) AccessChain 128(gl_PrimitiveIndicesNV) 132
+                              Store 137 136
+             140:     36(int) Load 139(gl_DrawID)
+             141:      6(int) Bitcast 140
+             142:         141 WritePackedPrimitiveIndices4x8NV
+                              Store 143(gl_PrimitiveCountNV) 144
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
index c79a5c3..b912aca 100644
--- a/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
@@ -1,7 +1,7 @@
 spv.meshShaderPerViewBuiltins.mesh
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 124
+// Id's are bound by 126
 
                               Capability MultiViewport
                               Capability PerViewAttributesNV
@@ -10,7 +10,7 @@
                               Extension  "SPV_NV_mesh_shader"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MeshNV 4  "main" 11 20 21 38 70
+                              EntryPoint MeshNV 4  "main" 11 20 21 40 72
                               ExecutionMode 4 LocalSize 32 1 1
                               ExecutionMode 4 OutputVertices 81
                               ExecutionMode 4 OutputPrimitivesNV 32
@@ -23,53 +23,53 @@
                               Name 16  "viewID"
                               Name 20  "gl_MeshViewIndicesNV"
                               Name 21  "gl_MeshViewCountNV"
-                              Name 34  "gl_MeshPerVertexNV"
-                              MemberName 34(gl_MeshPerVertexNV) 0  "gl_Position"
-                              MemberName 34(gl_MeshPerVertexNV) 1  "gl_PointSize"
-                              MemberName 34(gl_MeshPerVertexNV) 2  "gl_ClipDistance"
-                              MemberName 34(gl_MeshPerVertexNV) 3  "gl_CullDistance"
-                              MemberName 34(gl_MeshPerVertexNV) 4  "gl_PositionPerViewNV"
-                              MemberName 34(gl_MeshPerVertexNV) 5  "gl_ClipDistancePerViewNV"
-                              MemberName 34(gl_MeshPerVertexNV) 6  "gl_CullDistancePerViewNV"
-                              Name 38  "gl_MeshVerticesNV"
-                              Name 66  "gl_MeshPerPrimitiveNV"
-                              MemberName 66(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
-                              MemberName 66(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
-                              MemberName 66(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
-                              MemberName 66(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
-                              MemberName 66(gl_MeshPerPrimitiveNV) 4  "gl_LayerPerViewNV"
-                              MemberName 66(gl_MeshPerPrimitiveNV) 5  "gl_ViewportMaskPerViewNV"
-                              Name 70  "gl_MeshPrimitivesNV"
+                              Name 36  "gl_MeshPerVertexNV"
+                              MemberName 36(gl_MeshPerVertexNV) 0  "gl_Position"
+                              MemberName 36(gl_MeshPerVertexNV) 1  "gl_PointSize"
+                              MemberName 36(gl_MeshPerVertexNV) 2  "gl_ClipDistance"
+                              MemberName 36(gl_MeshPerVertexNV) 3  "gl_CullDistance"
+                              MemberName 36(gl_MeshPerVertexNV) 4  "gl_PositionPerViewNV"
+                              MemberName 36(gl_MeshPerVertexNV) 5  "gl_ClipDistancePerViewNV"
+                              MemberName 36(gl_MeshPerVertexNV) 6  "gl_CullDistancePerViewNV"
+                              Name 40  "gl_MeshVerticesNV"
+                              Name 68  "gl_MeshPerPrimitiveNV"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 4  "gl_LayerPerViewNV"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 5  "gl_ViewportMaskPerViewNV"
+                              Name 72  "gl_MeshPrimitivesNV"
                               Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
                               Decorate 20(gl_MeshViewIndicesNV) BuiltIn MeshViewIndicesNV
                               Decorate 21(gl_MeshViewCountNV) BuiltIn MeshViewCountNV
-                              MemberDecorate 34(gl_MeshPerVertexNV) 0 BuiltIn Position
-                              MemberDecorate 34(gl_MeshPerVertexNV) 1 BuiltIn PointSize
-                              MemberDecorate 34(gl_MeshPerVertexNV) 2 BuiltIn ClipDistance
-                              MemberDecorate 34(gl_MeshPerVertexNV) 3 BuiltIn CullDistance
-                              MemberDecorate 34(gl_MeshPerVertexNV) 4 PerViewNV
-                              MemberDecorate 34(gl_MeshPerVertexNV) 4 BuiltIn PositionPerViewNV
-                              MemberDecorate 34(gl_MeshPerVertexNV) 5 PerViewNV
-                              MemberDecorate 34(gl_MeshPerVertexNV) 5 BuiltIn ClipDistancePerViewNV
-                              MemberDecorate 34(gl_MeshPerVertexNV) 6 PerViewNV
-                              MemberDecorate 34(gl_MeshPerVertexNV) 6 BuiltIn CullDistancePerViewNV
-                              Decorate 34(gl_MeshPerVertexNV) Block
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 4 PerPrimitiveNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 4 PerViewNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 4 BuiltIn LayerPerViewNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 5 PerPrimitiveNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 5 PerViewNV
-                              MemberDecorate 66(gl_MeshPerPrimitiveNV) 5 BuiltIn ViewportMaskPerViewNV
-                              Decorate 66(gl_MeshPerPrimitiveNV) Block
-                              Decorate 123 BuiltIn WorkgroupSize
+                              MemberDecorate 36(gl_MeshPerVertexNV) 0 BuiltIn Position
+                              MemberDecorate 36(gl_MeshPerVertexNV) 1 BuiltIn PointSize
+                              MemberDecorate 36(gl_MeshPerVertexNV) 2 BuiltIn ClipDistance
+                              MemberDecorate 36(gl_MeshPerVertexNV) 3 BuiltIn CullDistance
+                              MemberDecorate 36(gl_MeshPerVertexNV) 4 PerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 4 BuiltIn PositionPerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 5 PerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 5 BuiltIn ClipDistancePerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 6 PerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 6 BuiltIn CullDistancePerViewNV
+                              Decorate 36(gl_MeshPerVertexNV) Block
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 4 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 4 PerViewNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 4 BuiltIn LayerPerViewNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 5 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 5 PerViewNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 5 BuiltIn ViewportMaskPerViewNV
+                              Decorate 68(gl_MeshPerPrimitiveNV) Block
+                              Decorate 125 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -89,44 +89,46 @@
               28:      6(int) Constant 1
               29:             TypeArray 26(float) 28
               30:             TypeArray 27(fvec4) 17
-              31:      6(int) Constant 8
+              31:      6(int) Constant 3
               32:             TypeArray 26(float) 31
               33:             TypeArray 32 17
-34(gl_MeshPerVertexNV):             TypeStruct 27(fvec4) 26(float) 29 29 30 33 33
-              35:      6(int) Constant 81
-              36:             TypeArray 34(gl_MeshPerVertexNV) 35
-              37:             TypePointer Output 36
-38(gl_MeshVerticesNV):     37(ptr) Variable Output
-              40:             TypeInt 32 1
-              41:     40(int) Constant 4
-              43:   26(float) Constant 1065353216
-              44:   26(float) Constant 1073741824
-              45:   26(float) Constant 1077936128
-              46:   26(float) Constant 1082130432
-              47:   27(fvec4) ConstantComposite 43 44 45 46
-              48:             TypePointer Output 27(fvec4)
-              51:     40(int) Constant 5
-              53:     40(int) Constant 2
-              54:   26(float) Constant 1084227584
-              55:             TypePointer Output 26(float)
-              58:     40(int) Constant 6
-              60:     40(int) Constant 3
-              61:   26(float) Constant 1086324736
-              63:             TypeArray 40(int) 28
-              64:             TypeArray 40(int) 17
-              65:             TypeArray 63 17
-66(gl_MeshPerPrimitiveNV):             TypeStruct 40(int) 40(int) 40(int) 63 64 65
-              67:      6(int) Constant 32
-              68:             TypeArray 66(gl_MeshPerPrimitiveNV) 67
-              69:             TypePointer Output 68
-70(gl_MeshPrimitivesNV):     69(ptr) Variable Output
-              73:     40(int) Constant 7
-              74:             TypePointer Output 40(int)
-              78:     40(int) Constant 0
-              79:     40(int) Constant 8
-              81:      6(int) Constant 264
-              82:      6(int) Constant 2
-             123:    9(ivec3) ConstantComposite 67 28 28
+              34:             TypeArray 26(float) 17
+              35:             TypeArray 34 17
+36(gl_MeshPerVertexNV):             TypeStruct 27(fvec4) 26(float) 29 29 30 33 35
+              37:      6(int) Constant 81
+              38:             TypeArray 36(gl_MeshPerVertexNV) 37
+              39:             TypePointer Output 38
+40(gl_MeshVerticesNV):     39(ptr) Variable Output
+              42:             TypeInt 32 1
+              43:     42(int) Constant 4
+              45:   26(float) Constant 1065353216
+              46:   26(float) Constant 1073741824
+              47:   26(float) Constant 1077936128
+              48:   26(float) Constant 1082130432
+              49:   27(fvec4) ConstantComposite 45 46 47 48
+              50:             TypePointer Output 27(fvec4)
+              53:     42(int) Constant 5
+              55:     42(int) Constant 2
+              56:   26(float) Constant 1084227584
+              57:             TypePointer Output 26(float)
+              60:     42(int) Constant 6
+              62:     42(int) Constant 3
+              63:   26(float) Constant 1086324736
+              65:             TypeArray 42(int) 28
+              66:             TypeArray 42(int) 17
+              67:             TypeArray 65 17
+68(gl_MeshPerPrimitiveNV):             TypeStruct 42(int) 42(int) 42(int) 65 66 67
+              69:      6(int) Constant 32
+              70:             TypeArray 68(gl_MeshPerPrimitiveNV) 69
+              71:             TypePointer Output 70
+72(gl_MeshPrimitivesNV):     71(ptr) Variable Output
+              75:     42(int) Constant 7
+              76:             TypePointer Output 42(int)
+              80:     42(int) Constant 0
+              81:     42(int) Constant 8
+              83:      6(int) Constant 264
+              84:      6(int) Constant 2
+             125:    9(ivec3) ConstantComposite 69 28 28
          4(main):           2 Function None 3
                5:             Label
           8(iid):      7(ptr) Variable Function
@@ -139,74 +141,74 @@
               24:     13(ptr) AccessChain 20(gl_MeshViewIndicesNV) 23
               25:      6(int) Load 24
                               Store 16(viewID) 25
-              39:      6(int) Load 8(iid)
-              42:      6(int) Load 16(viewID)
-              49:     48(ptr) AccessChain 38(gl_MeshVerticesNV) 39 41 42
-                              Store 49 47
-              50:      6(int) Load 8(iid)
-              52:      6(int) Load 16(viewID)
-              56:     55(ptr) AccessChain 38(gl_MeshVerticesNV) 50 51 52 53
-                              Store 56 54
-              57:      6(int) Load 8(iid)
-              59:      6(int) Load 16(viewID)
-              62:     55(ptr) AccessChain 38(gl_MeshVerticesNV) 57 58 59 60
-                              Store 62 61
-              71:      6(int) Load 8(iid)
-              72:      6(int) Load 16(viewID)
-              75:     74(ptr) AccessChain 70(gl_MeshPrimitivesNV) 71 41 72
-                              Store 75 73
-              76:      6(int) Load 8(iid)
-              77:      6(int) Load 16(viewID)
-              80:     74(ptr) AccessChain 70(gl_MeshPrimitivesNV) 76 51 77 78
-                              Store 80 79
-                              MemoryBarrier 28 81
-                              ControlBarrier 82 82 81
-              83:      6(int) Load 8(iid)
-              84:      6(int) IAdd 83 28
-              85:      6(int) Load 16(viewID)
-              86:      6(int) Load 8(iid)
+              41:      6(int) Load 8(iid)
+              44:      6(int) Load 16(viewID)
+              51:     50(ptr) AccessChain 40(gl_MeshVerticesNV) 41 43 44
+                              Store 51 49
+              52:      6(int) Load 8(iid)
+              54:      6(int) Load 16(viewID)
+              58:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 52 53 54 55
+                              Store 58 56
+              59:      6(int) Load 8(iid)
+              61:      6(int) Load 16(viewID)
+              64:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 59 60 61 62
+                              Store 64 63
+              73:      6(int) Load 8(iid)
+              74:      6(int) Load 16(viewID)
+              77:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 73 43 74
+                              Store 77 75
+              78:      6(int) Load 8(iid)
+              79:      6(int) Load 16(viewID)
+              82:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 78 53 79 80
+                              Store 82 81
+                              MemoryBarrier 28 83
+                              ControlBarrier 84 84 83
+              85:      6(int) Load 8(iid)
+              86:      6(int) IAdd 85 28
               87:      6(int) Load 16(viewID)
-              88:     48(ptr) AccessChain 38(gl_MeshVerticesNV) 86 41 87
-              89:   27(fvec4) Load 88
-              90:     48(ptr) AccessChain 38(gl_MeshVerticesNV) 84 41 85
-                              Store 90 89
-              91:      6(int) Load 8(iid)
-              92:      6(int) IAdd 91 28
-              93:      6(int) Load 16(viewID)
-              94:      6(int) Load 8(iid)
+              88:      6(int) Load 8(iid)
+              89:      6(int) Load 16(viewID)
+              90:     50(ptr) AccessChain 40(gl_MeshVerticesNV) 88 43 89
+              91:   27(fvec4) Load 90
+              92:     50(ptr) AccessChain 40(gl_MeshVerticesNV) 86 43 87
+                              Store 92 91
+              93:      6(int) Load 8(iid)
+              94:      6(int) IAdd 93 28
               95:      6(int) Load 16(viewID)
-              96:     55(ptr) AccessChain 38(gl_MeshVerticesNV) 94 51 95 53
-              97:   26(float) Load 96
-              98:     55(ptr) AccessChain 38(gl_MeshVerticesNV) 92 51 93 53
-                              Store 98 97
-              99:      6(int) Load 8(iid)
-             100:      6(int) IAdd 99 28
-             101:      6(int) Load 16(viewID)
-             102:      6(int) Load 8(iid)
+              96:      6(int) Load 8(iid)
+              97:      6(int) Load 16(viewID)
+              98:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 96 53 97 55
+              99:   26(float) Load 98
+             100:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 94 53 95 55
+                              Store 100 99
+             101:      6(int) Load 8(iid)
+             102:      6(int) IAdd 101 28
              103:      6(int) Load 16(viewID)
-             104:     55(ptr) AccessChain 38(gl_MeshVerticesNV) 102 58 103 60
-             105:   26(float) Load 104
-             106:     55(ptr) AccessChain 38(gl_MeshVerticesNV) 100 58 101 60
-                              Store 106 105
-             107:      6(int) Load 8(iid)
-             108:      6(int) IAdd 107 28
-             109:      6(int) Load 16(viewID)
-             110:      6(int) Load 8(iid)
+             104:      6(int) Load 8(iid)
+             105:      6(int) Load 16(viewID)
+             106:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 104 60 105 62
+             107:   26(float) Load 106
+             108:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 102 60 103 62
+                              Store 108 107
+             109:      6(int) Load 8(iid)
+             110:      6(int) IAdd 109 28
              111:      6(int) Load 16(viewID)
-             112:     74(ptr) AccessChain 70(gl_MeshPrimitivesNV) 110 41 111
-             113:     40(int) Load 112
-             114:     74(ptr) AccessChain 70(gl_MeshPrimitivesNV) 108 41 109
-                              Store 114 113
-             115:      6(int) Load 8(iid)
-             116:      6(int) IAdd 115 28
-             117:      6(int) Load 16(viewID)
-             118:      6(int) Load 8(iid)
+             112:      6(int) Load 8(iid)
+             113:      6(int) Load 16(viewID)
+             114:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 112 43 113
+             115:     42(int) Load 114
+             116:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 110 43 111
+                              Store 116 115
+             117:      6(int) Load 8(iid)
+             118:      6(int) IAdd 117 28
              119:      6(int) Load 16(viewID)
-             120:     74(ptr) AccessChain 70(gl_MeshPrimitivesNV) 118 51 119 78
-             121:     40(int) Load 120
-             122:     74(ptr) AccessChain 70(gl_MeshPrimitivesNV) 116 51 117 78
-                              Store 122 121
-                              MemoryBarrier 28 81
-                              ControlBarrier 82 82 81
+             120:      6(int) Load 8(iid)
+             121:      6(int) Load 16(viewID)
+             122:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 120 53 121 80
+             123:     42(int) Load 122
+             124:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 118 53 119 80
+                              Store 124 123
+                              MemoryBarrier 28 83
+                              ControlBarrier 84 84 83
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
new file mode 100644
index 0000000..f4491c0
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
@@ -0,0 +1,201 @@
+spv.meshShaderRedeclBuiltins.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 120
+
+                              Capability ClipDistance
+                              Capability CullDistance
+                              Capability MultiViewport
+                              Capability ShaderViewportMaskNV
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+                              Extension  "SPV_NV_viewport_array2"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 17 28 81
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "gid"
+                              Name 17  "gl_WorkGroupID"
+                              Name 24  "gl_MeshPerVertexNV"
+                              MemberName 24(gl_MeshPerVertexNV) 0  "gl_Position"
+                              MemberName 24(gl_MeshPerVertexNV) 1  "gl_PointSize"
+                              MemberName 24(gl_MeshPerVertexNV) 2  "gl_ClipDistance"
+                              MemberName 24(gl_MeshPerVertexNV) 3  "gl_CullDistance"
+                              Name 28  "gl_MeshVerticesNV"
+                              Name 77  "gl_MeshPerPrimitiveNV"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
+                              Name 81  "gl_MeshPrimitivesNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 24(gl_MeshPerVertexNV) 0 BuiltIn Position
+                              MemberDecorate 24(gl_MeshPerVertexNV) 1 BuiltIn PointSize
+                              MemberDecorate 24(gl_MeshPerVertexNV) 2 BuiltIn ClipDistance
+                              MemberDecorate 24(gl_MeshPerVertexNV) 3 BuiltIn CullDistance
+                              Decorate 24(gl_MeshPerVertexNV) Block
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
+                              Decorate 77(gl_MeshPerPrimitiveNV) Block
+                              Decorate 119 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+17(gl_WorkGroupID):     10(ptr) Variable Input
+              20:             TypeFloat 32
+              21:             TypeVector 20(float) 4
+              22:      6(int) Constant 4
+              23:             TypeArray 20(float) 22
+24(gl_MeshPerVertexNV):             TypeStruct 21(fvec4) 20(float) 23 23
+              25:      6(int) Constant 81
+              26:             TypeArray 24(gl_MeshPerVertexNV) 25
+              27:             TypePointer Output 26
+28(gl_MeshVerticesNV):     27(ptr) Variable Output
+              30:             TypeInt 32 1
+              31:     30(int) Constant 0
+              32:   20(float) Constant 1065353216
+              33:   21(fvec4) ConstantComposite 32 32 32 32
+              34:             TypePointer Output 21(fvec4)
+              37:     30(int) Constant 1
+              38:   20(float) Constant 1073741824
+              39:             TypePointer Output 20(float)
+              42:     30(int) Constant 2
+              43:     30(int) Constant 3
+              44:   20(float) Constant 1077936128
+              47:   20(float) Constant 1082130432
+              49:      6(int) Constant 1
+              50:      6(int) Constant 264
+              51:      6(int) Constant 2
+              76:             TypeArray 30(int) 49
+77(gl_MeshPerPrimitiveNV):             TypeStruct 30(int) 30(int) 30(int) 76
+              78:      6(int) Constant 32
+              79:             TypeArray 77(gl_MeshPerPrimitiveNV) 78
+              80:             TypePointer Output 79
+81(gl_MeshPrimitivesNV):     80(ptr) Variable Output
+              83:     30(int) Constant 6
+              84:             TypePointer Output 30(int)
+              87:     30(int) Constant 7
+              90:     30(int) Constant 8
+              93:     30(int) Constant 9
+             119:    9(ivec3) ConstantComposite 78 49 49
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         16(gid):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              18:     13(ptr) AccessChain 17(gl_WorkGroupID) 12
+              19:      6(int) Load 18
+                              Store 16(gid) 19
+              29:      6(int) Load 8(iid)
+              35:     34(ptr) AccessChain 28(gl_MeshVerticesNV) 29 31
+                              Store 35 33
+              36:      6(int) Load 8(iid)
+              40:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 36 37
+                              Store 40 38
+              41:      6(int) Load 8(iid)
+              45:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 41 42 43
+                              Store 45 44
+              46:      6(int) Load 8(iid)
+              48:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 46 43 42
+                              Store 48 47
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+              52:      6(int) Load 8(iid)
+              53:      6(int) IAdd 52 49
+              54:      6(int) Load 8(iid)
+              55:     34(ptr) AccessChain 28(gl_MeshVerticesNV) 54 31
+              56:   21(fvec4) Load 55
+              57:     34(ptr) AccessChain 28(gl_MeshVerticesNV) 53 31
+                              Store 57 56
+              58:      6(int) Load 8(iid)
+              59:      6(int) IAdd 58 49
+              60:      6(int) Load 8(iid)
+              61:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 60 37
+              62:   20(float) Load 61
+              63:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 59 37
+                              Store 63 62
+              64:      6(int) Load 8(iid)
+              65:      6(int) IAdd 64 49
+              66:      6(int) Load 8(iid)
+              67:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 66 42 43
+              68:   20(float) Load 67
+              69:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 65 42 43
+                              Store 69 68
+              70:      6(int) Load 8(iid)
+              71:      6(int) IAdd 70 49
+              72:      6(int) Load 8(iid)
+              73:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 72 43 42
+              74:   20(float) Load 73
+              75:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 71 43 42
+                              Store 75 74
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+              82:      6(int) Load 8(iid)
+              85:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 82 31
+                              Store 85 83
+              86:      6(int) Load 8(iid)
+              88:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 86 37
+                              Store 88 87
+              89:      6(int) Load 8(iid)
+              91:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 89 42
+                              Store 91 90
+              92:      6(int) Load 8(iid)
+              94:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 92 43 31
+                              Store 94 93
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+              95:      6(int) Load 8(iid)
+              96:      6(int) IAdd 95 49
+              97:      6(int) Load 8(iid)
+              98:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 97 31
+              99:     30(int) Load 98
+             100:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 96 31
+                              Store 100 99
+             101:      6(int) Load 8(iid)
+             102:      6(int) IAdd 101 49
+             103:      6(int) Load 8(iid)
+             104:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 103 37
+             105:     30(int) Load 104
+             106:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 102 37
+                              Store 106 105
+             107:      6(int) Load 8(iid)
+             108:      6(int) IAdd 107 49
+             109:      6(int) Load 8(iid)
+             110:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 109 42
+             111:     30(int) Load 110
+             112:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 108 42
+                              Store 112 111
+             113:      6(int) Load 8(iid)
+             114:      6(int) IAdd 113 49
+             115:      6(int) Load 8(iid)
+             116:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 115 43 31
+             117:     30(int) Load 116
+             118:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 114 43 31
+                              Store 118 117
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
new file mode 100644
index 0000000..6672dc2
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
@@ -0,0 +1,187 @@
+spv.meshShaderRedeclPerViewBuiltins.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 120
+
+                              Capability PerViewAttributesNV
+                              Capability MeshShadingNV
+                              Extension  "SPV_NVX_multiview_per_view_attributes"
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 20 21 35 67
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "viewID"
+                              Name 20  "gl_MeshViewIndicesNV"
+                              Name 21  "gl_MeshViewCountNV"
+                              Name 31  "gl_MeshPerVertexNV"
+                              MemberName 31(gl_MeshPerVertexNV) 0  "gl_PositionPerViewNV"
+                              MemberName 31(gl_MeshPerVertexNV) 1  "gl_ClipDistancePerViewNV"
+                              MemberName 31(gl_MeshPerVertexNV) 2  "gl_CullDistancePerViewNV"
+                              Name 35  "gl_MeshVerticesNV"
+                              Name 63  "gl_MeshPerPrimitiveNV"
+                              MemberName 63(gl_MeshPerPrimitiveNV) 0  "gl_LayerPerViewNV"
+                              MemberName 63(gl_MeshPerPrimitiveNV) 1  "gl_ViewportMaskPerViewNV"
+                              Name 67  "gl_MeshPrimitivesNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 20(gl_MeshViewIndicesNV) BuiltIn MeshViewIndicesNV
+                              Decorate 21(gl_MeshViewCountNV) BuiltIn MeshViewCountNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 0 PerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 0 BuiltIn PositionPerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 1 PerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 1 BuiltIn ClipDistancePerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 2 PerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 2 BuiltIn CullDistancePerViewNV
+                              Decorate 31(gl_MeshPerVertexNV) Block
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 0 PerViewNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 0 BuiltIn LayerPerViewNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 1 PerViewNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 1 BuiltIn ViewportMaskPerViewNV
+                              Decorate 63(gl_MeshPerPrimitiveNV) Block
+                              Decorate 119 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 4
+              18:             TypeArray 6(int) 17
+              19:             TypePointer Input 18
+20(gl_MeshViewIndicesNV):     19(ptr) Variable Input
+21(gl_MeshViewCountNV):     13(ptr) Variable Input
+              26:             TypeFloat 32
+              27:             TypeVector 26(float) 4
+              28:             TypeArray 27(fvec4) 17
+              29:             TypeArray 26(float) 17
+              30:             TypeArray 29 17
+31(gl_MeshPerVertexNV):             TypeStruct 28 30 30
+              32:      6(int) Constant 81
+              33:             TypeArray 31(gl_MeshPerVertexNV) 32
+              34:             TypePointer Output 33
+35(gl_MeshVerticesNV):     34(ptr) Variable Output
+              37:             TypeInt 32 1
+              38:     37(int) Constant 0
+              40:   26(float) Constant 1065353216
+              41:   26(float) Constant 1073741824
+              42:   26(float) Constant 1077936128
+              43:   26(float) Constant 1082130432
+              44:   27(fvec4) ConstantComposite 40 41 42 43
+              45:             TypePointer Output 27(fvec4)
+              48:     37(int) Constant 1
+              50:     37(int) Constant 2
+              51:   26(float) Constant 1084227584
+              52:             TypePointer Output 26(float)
+              56:     37(int) Constant 3
+              57:   26(float) Constant 1086324736
+              59:             TypeArray 37(int) 17
+              60:      6(int) Constant 1
+              61:             TypeArray 37(int) 60
+              62:             TypeArray 61 17
+63(gl_MeshPerPrimitiveNV):             TypeStruct 59 62
+              64:      6(int) Constant 32
+              65:             TypeArray 63(gl_MeshPerPrimitiveNV) 64
+              66:             TypePointer Output 65
+67(gl_MeshPrimitivesNV):     66(ptr) Variable Output
+              70:     37(int) Constant 7
+              71:             TypePointer Output 37(int)
+              75:     37(int) Constant 8
+              77:      6(int) Constant 264
+              78:      6(int) Constant 2
+             119:    9(ivec3) ConstantComposite 64 60 60
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+      16(viewID):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              22:      6(int) Load 21(gl_MeshViewCountNV)
+              23:      6(int) UMod 22 17
+              24:     13(ptr) AccessChain 20(gl_MeshViewIndicesNV) 23
+              25:      6(int) Load 24
+                              Store 16(viewID) 25
+              36:      6(int) Load 8(iid)
+              39:      6(int) Load 16(viewID)
+              46:     45(ptr) AccessChain 35(gl_MeshVerticesNV) 36 38 39
+                              Store 46 44
+              47:      6(int) Load 8(iid)
+              49:      6(int) Load 16(viewID)
+              53:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 47 48 49 50
+                              Store 53 51
+              54:      6(int) Load 8(iid)
+              55:      6(int) Load 16(viewID)
+              58:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 54 50 55 56
+                              Store 58 57
+              68:      6(int) Load 8(iid)
+              69:      6(int) Load 16(viewID)
+              72:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 68 38 69
+                              Store 72 70
+              73:      6(int) Load 8(iid)
+              74:      6(int) Load 16(viewID)
+              76:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 73 48 74 38
+                              Store 76 75
+                              MemoryBarrier 60 77
+                              ControlBarrier 78 78 77
+              79:      6(int) Load 8(iid)
+              80:      6(int) IAdd 79 60
+              81:      6(int) Load 16(viewID)
+              82:      6(int) Load 8(iid)
+              83:      6(int) Load 16(viewID)
+              84:     45(ptr) AccessChain 35(gl_MeshVerticesNV) 82 38 83
+              85:   27(fvec4) Load 84
+              86:     45(ptr) AccessChain 35(gl_MeshVerticesNV) 80 38 81
+                              Store 86 85
+              87:      6(int) Load 8(iid)
+              88:      6(int) IAdd 87 60
+              89:      6(int) Load 16(viewID)
+              90:      6(int) Load 8(iid)
+              91:      6(int) Load 16(viewID)
+              92:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 90 48 91 50
+              93:   26(float) Load 92
+              94:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 88 48 89 50
+                              Store 94 93
+              95:      6(int) Load 8(iid)
+              96:      6(int) IAdd 95 60
+              97:      6(int) Load 16(viewID)
+              98:      6(int) Load 8(iid)
+              99:      6(int) Load 16(viewID)
+             100:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 98 50 99 56
+             101:   26(float) Load 100
+             102:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 96 50 97 56
+                              Store 102 101
+             103:      6(int) Load 8(iid)
+             104:      6(int) IAdd 103 60
+             105:      6(int) Load 16(viewID)
+             106:      6(int) Load 8(iid)
+             107:      6(int) Load 16(viewID)
+             108:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 106 38 107
+             109:     37(int) Load 108
+             110:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 104 38 105
+                              Store 110 109
+             111:      6(int) Load 8(iid)
+             112:      6(int) IAdd 111 60
+             113:      6(int) Load 16(viewID)
+             114:      6(int) Load 8(iid)
+             115:      6(int) Load 16(viewID)
+             116:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 114 48 115 38
+             117:     37(int) Load 116
+             118:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 112 48 113 38
+                              Store 118 117
+                              MemoryBarrier 60 77
+                              ControlBarrier 78 78 77
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.meshShaderRedeclBuiltins.mesh b/Test/spv.meshShaderRedeclBuiltins.mesh
new file mode 100644
index 0000000..38107b2
--- /dev/null
+++ b/Test/spv.meshShaderRedeclBuiltins.mesh
@@ -0,0 +1,66 @@
+#version 460
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of redeclared single-view builtins in mesh shaders:
+
+out gl_MeshPerVertexNV {
+    vec4 gl_Position;
+    float gl_PointSize;
+    float gl_ClipDistance[4];
+    float gl_CullDistance[4];
+} gl_MeshVerticesNV[];
+
+perprimitiveNV out gl_MeshPerPrimitiveNV {
+    int gl_PrimitiveID;
+    int gl_Layer;
+    int gl_ViewportIndex;
+    int gl_ViewportMask[];
+} gl_MeshPrimitivesNV[];
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint gid = gl_WorkGroupID.x;
+
+    gl_MeshVerticesNV[iid].gl_Position = vec4(1.0);
+    gl_MeshVerticesNV[iid].gl_PointSize = 2.0;
+    gl_MeshVerticesNV[iid].gl_ClipDistance[3] = 3.0;
+    gl_MeshVerticesNV[iid].gl_CullDistance[2] = 4.0;
+
+    BARRIER();
+
+    gl_MeshVerticesNV[iid+1].gl_Position = gl_MeshVerticesNV[iid].gl_Position;
+    gl_MeshVerticesNV[iid+1].gl_PointSize = gl_MeshVerticesNV[iid].gl_PointSize;
+    gl_MeshVerticesNV[iid+1].gl_ClipDistance[3] = gl_MeshVerticesNV[iid].gl_ClipDistance[3];
+    gl_MeshVerticesNV[iid+1].gl_CullDistance[2] = gl_MeshVerticesNV[iid].gl_CullDistance[2];
+
+    BARRIER();
+
+    gl_MeshPrimitivesNV[iid].gl_PrimitiveID = 6;
+    gl_MeshPrimitivesNV[iid].gl_Layer = 7;
+    gl_MeshPrimitivesNV[iid].gl_ViewportIndex = 8;
+    gl_MeshPrimitivesNV[iid].gl_ViewportMask[0] = 9;
+
+    BARRIER();
+
+    gl_MeshPrimitivesNV[iid+1].gl_PrimitiveID = gl_MeshPrimitivesNV[iid].gl_PrimitiveID;
+    gl_MeshPrimitivesNV[iid+1].gl_Layer = gl_MeshPrimitivesNV[iid].gl_Layer;
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportIndex = gl_MeshPrimitivesNV[iid].gl_ViewportIndex;
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportMask[0] = gl_MeshPrimitivesNV[iid].gl_ViewportMask[0];
+
+    BARRIER();
+}
diff --git a/Test/spv.meshShaderRedeclPerViewBuiltins.mesh b/Test/spv.meshShaderRedeclPerViewBuiltins.mesh
new file mode 100644
index 0000000..3b75b55
--- /dev/null
+++ b/Test/spv.meshShaderRedeclPerViewBuiltins.mesh
@@ -0,0 +1,53 @@
+#version 450

+

+#define MAX_VER  81

+#define MAX_PRIM 32

+#define MAX_VIEWS gl_MaxMeshViewCountNV

+

+#define BARRIER() \

+    memoryBarrierShared(); \

+    barrier();

+

+#extension GL_NV_mesh_shader : enable

+

+layout(local_size_x = 32) in;

+

+layout(max_vertices=MAX_VER) out;

+layout(max_primitives=MAX_PRIM) out;

+layout(triangles) out;

+

+// test use of redeclared per-view builtin attributes

+

+out gl_MeshPerVertexNV {

+    perviewNV vec4 gl_PositionPerViewNV[MAX_VIEWS];         // explicitly sized view dim

+    perviewNV float gl_ClipDistancePerViewNV[MAX_VIEWS][4]; // explicitly sized view dim

+    perviewNV float gl_CullDistancePerViewNV[MAX_VIEWS][4]; // explicitly sized view dim

+} gl_MeshVerticesNV[];

+

+perprimitiveNV out gl_MeshPerPrimitiveNV {

+    perviewNV int gl_LayerPerViewNV[];                      // implicitly sized view dim

+    perviewNV int gl_ViewportMaskPerViewNV[][1];            // implicitly sized view dim

+} gl_MeshPrimitivesNV[];

+

+void main()

+{

+    uint iid = gl_LocalInvocationID.x;

+    uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];

+

+    gl_MeshVerticesNV[iid].gl_PositionPerViewNV[viewID]          = vec4(1.0, 2.0, 3.0, 4.0);

+    gl_MeshVerticesNV[iid].gl_ClipDistancePerViewNV[viewID][2]   = 5.0;

+    gl_MeshVerticesNV[iid].gl_CullDistancePerViewNV[viewID][3]   = 6.0;

+    gl_MeshPrimitivesNV[iid].gl_LayerPerViewNV[viewID]           = 7;

+    gl_MeshPrimitivesNV[iid].gl_ViewportMaskPerViewNV[viewID][0] = 8;

+

+    BARRIER();

+

+    gl_MeshVerticesNV[iid+1].gl_PositionPerViewNV[viewID]          = gl_MeshVerticesNV[iid].gl_PositionPerViewNV[viewID];

+    gl_MeshVerticesNV[iid+1].gl_ClipDistancePerViewNV[viewID][2]   = gl_MeshVerticesNV[iid].gl_ClipDistancePerViewNV[viewID][2];

+    gl_MeshVerticesNV[iid+1].gl_CullDistancePerViewNV[viewID][3]   = gl_MeshVerticesNV[iid].gl_CullDistancePerViewNV[viewID][3];

+    gl_MeshPrimitivesNV[iid+1].gl_LayerPerViewNV[viewID]           = gl_MeshPrimitivesNV[iid].gl_LayerPerViewNV[viewID];

+    gl_MeshPrimitivesNV[iid+1].gl_ViewportMaskPerViewNV[viewID][0] = gl_MeshPrimitivesNV[iid].gl_ViewportMaskPerViewNV[viewID][0];

+

+    BARRIER();

+}

+

diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index 7793c2c..4536860 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -1644,6 +1644,11 @@
     {
         if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed()))
             changeOuterArraySize(getImplicitArraySize());
+#ifdef NV_EXTENSIONS
+        // For multi-dim per-view arrays, set unsized inner dimension size to 1
+        if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized())
+            arraySizes->clearInnerUnsized();
+#endif
         if (isStruct() && structure->size() > 0) {
             int lastMember = (int)structure->size() - 1;
             for (int i = 0; i < lastMember; ++i)
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index ff5417b..7e7eaba 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -5296,8 +5296,8 @@
                 "float gl_ClipDistance[];"
                 "float gl_CullDistance[];"
                 "perviewNV vec4 gl_PositionPerViewNV[];"
-                "perviewNV float gl_ClipDistancePerViewNV[][8];"
-                "perviewNV float gl_CullDistancePerViewNV[][8];"
+                "perviewNV float gl_ClipDistancePerViewNV[][];"
+                "perviewNV float gl_CullDistancePerViewNV[][];"
             "} gl_MeshVerticesNV[];"
         );
 
@@ -5309,7 +5309,7 @@
                 "int gl_ViewportIndex;"
                 "int gl_ViewportMask[];"
                 "perviewNV int gl_LayerPerViewNV[];"
-                "perviewNV int gl_ViewportMaskPerViewNV[][1];"
+                "perviewNV int gl_ViewportMaskPerViewNV[][];"
             "} gl_MeshPrimitivesNV[];"
         );
 
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 40c5674..caf70bd 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -400,9 +400,21 @@
         handleIoResizeArrayAccess(loc, base);
 
     if (index->getQualifier().isFrontEndConstant()) {
-        if (base->getType().isUnsizedArray())
+        if (base->getType().isUnsizedArray()) {
             base->getWritableType().updateImplicitArraySize(indexValue + 1);
-        else
+#ifdef NV_EXTENSIONS
+            // For 2D per-view builtin arrays, update the inner dimension size in parent type
+            if (base->getQualifier().isPerView() && base->getQualifier().builtIn != EbvNone) {
+                TIntermBinary* binaryNode = base->getAsBinaryNode();
+                if (binaryNode) {
+                    TType& leftType = binaryNode->getLeft()->getWritableType();
+                    TArraySizes& arraySizes = *leftType.getArraySizes();
+                    assert(arraySizes.getNumDims() == 2);
+                    arraySizes.setDimSize(1, std::max(arraySizes.getDimSize(1), indexValue + 1));
+                }
+            }
+#endif
+        } else
             checkIndex(loc, base->getType(), indexValue);
         result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
     } else {
@@ -813,6 +825,8 @@
                 TIntermTyped* index = intermediate.addConstantUnion(member, loc);
                 result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
                 result->setType(*(*fields)[member].type);
+                if ((*fields)[member].type->getQualifier().isIo())
+                    intermediate.addIoAccessed(field);
             }
         } else
             error(loc, "no such field in structure", field.c_str(), "");
@@ -4059,10 +4073,31 @@
                 error(memberLoc, "cannot redeclare block member with a different type", member->type->getFieldName().c_str(), "");
             if (oldType.isArray() != newType.isArray())
                 error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
-            else if (! oldType.sameArrayness(newType) && oldType.isSizedArray())
+            else if (! oldType.getQualifier().isPerView() && ! oldType.sameArrayness(newType) && oldType.isSizedArray())
                 error(memberLoc, "cannot change array size of redeclared block member", member->type->getFieldName().c_str(), "");
-            else if (newType.isArray())
+            else if (! oldType.getQualifier().isPerView() && newType.isArray())
                 arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize());
+#ifdef NV_EXTENSIONS
+            if (oldType.getQualifier().isPerView() && ! newType.getQualifier().isPerView())
+                error(memberLoc, "missing perviewNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+            else if (! oldType.getQualifier().isPerView() && newType.getQualifier().isPerView())
+                error(memberLoc, "cannot add perviewNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+            else if (newType.getQualifier().isPerView()) {
+                if (oldType.getArraySizes()->getNumDims() != newType.getArraySizes()->getNumDims())
+                    error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
+                else if (! newType.isUnsizedArray() && newType.getOuterArraySize() != resources.maxMeshViewCountNV)
+                    error(loc, "mesh view output array size must be gl_MaxMeshViewCountNV or implicitly sized", "[]", "");
+                else if (newType.getArraySizes()->getNumDims() == 2) {
+                    int innerDimSize = newType.getArraySizes()->getDimSize(1);
+                    arrayLimitCheck(memberLoc, member->type->getFieldName(), innerDimSize);
+                    oldType.getArraySizes()->setDimSize(1, innerDimSize);
+                }
+            }
+            if (oldType.getQualifier().isPerPrimitive() && ! newType.getQualifier().isPerPrimitive())
+                error(memberLoc, "missing perprimitiveNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+            else if (! oldType.getQualifier().isPerPrimitive() && newType.getQualifier().isPerPrimitive())
+                error(memberLoc, "cannot add perprimitiveNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+#endif
             if (newType.getQualifier().isMemory())
                 error(memberLoc, "cannot add memory qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
             if (newType.getQualifier().hasNonXfbLayout())
@@ -4421,6 +4456,12 @@
         limitCheck(loc, size, "gl_MaxClipDistances", "gl_ClipDistance array size");
     else if (identifier.compare("gl_CullDistance") == 0)
         limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistance array size");
+#ifdef NV_EXTENSIONS
+    else if (identifier.compare("gl_ClipDistancePerViewNV") == 0)
+        limitCheck(loc, size, "gl_MaxClipDistances", "gl_ClipDistancePerViewNV array size");
+    else if (identifier.compare("gl_CullDistancePerViewNV") == 0)
+        limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistancePerViewNV array size");
+#endif
 }
 
 // See if the provided value is less than or equal to the symbol indicated by limit,
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 7ce7cdd..596cc56 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -723,6 +723,17 @@
             error(infoSink, "Only one shaderRecordNVX buffer block is allowed per stage");
         break;
     case EShLangMeshNV:
+        // NV_mesh_shader doesn't allow use of both single-view and per-view builtins.
+        if (inIoAccessed("gl_Position") && inIoAccessed("gl_PositionPerViewNV"))
+            error(infoSink, "Can only use one of gl_Position or gl_PositionPerViewNV");
+        if (inIoAccessed("gl_ClipDistance") && inIoAccessed("gl_ClipDistancePerViewNV"))
+            error(infoSink, "Can only use one of gl_ClipDistance or gl_ClipDistancePerViewNV");
+        if (inIoAccessed("gl_CullDistance") && inIoAccessed("gl_CullDistancePerViewNV"))
+            error(infoSink, "Can only use one of gl_CullDistance or gl_CullDistancePerViewNV");
+        if (inIoAccessed("gl_Layer") && inIoAccessed("gl_LayerPerViewNV"))
+            error(infoSink, "Can only use one of gl_Layer or gl_LayerPerViewNV");
+        if (inIoAccessed("gl_ViewportMask") && inIoAccessed("gl_ViewportMaskPerViewNV"))
+            error(infoSink, "Can only use one of gl_ViewportMask or gl_ViewportMaskPerViewNV");
         if (outputPrimitive == ElgNone)
             error(infoSink, "At least one shader must specify an output layout primitive");
         if (vertices == TQualifier::layoutNotSet)
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 29e75bb..8158391 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -524,6 +524,9 @@
     "spv.meshShaderPerViewUserDefined.mesh",
     "spv.meshShaderSharedMem.mesh",
     "spv.meshShaderTaskMem.mesh",
+    "spv.320.meshShaderUserDefined.mesh",
+    "spv.meshShaderRedeclBuiltins.mesh",
+    "spv.meshShaderRedeclPerViewBuiltins.mesh",
     "spv.meshTaskShader.task",
 })),
 FileNameAsCustomTestSuffix