Merge pull request #1693 from sparmarNV/fix-NV_mesh_shader

Add missing support for gl_MeshViewCountNV/gl_MeshViewIndicesNV in task shaders
diff --git a/Test/baseResults/spv.meshTaskShader.task.out b/Test/baseResults/spv.meshTaskShader.task.out
index 517cbea..a835d7f 100644
--- a/Test/baseResults/spv.meshTaskShader.task.out
+++ b/Test/baseResults/spv.meshTaskShader.task.out
@@ -1,14 +1,14 @@
 spv.meshTaskShader.task
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 104
+// Id's are bound by 116
 
                               Capability StorageImageWriteWithoutFormat
                               Capability MeshShadingNV
                               Extension  "SPV_NV_mesh_shader"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TaskNV 4  "main" 11 17 80 101
+                              EntryPoint TaskNV 4  "main" 11 17 24 25 90 113
                               ExecutionMode 4 LocalSize 32 1 1
                               Source GLSL 450
                               SourceExtension  "GL_NV_mesh_shader"
@@ -17,34 +17,42 @@
                               Name 11  "gl_LocalInvocationID"
                               Name 16  "gid"
                               Name 17  "gl_WorkGroupID"
-                              Name 20  "i"
-                              Name 34  "mem"
-                              Name 37  "block0"
-                              MemberName 37(block0) 0  "uni_value"
-                              Name 39  ""
-                              Name 55  "uni_image"
-                              Name 78  "Task"
-                              MemberName 78(Task) 0  "dummy"
-                              MemberName 78(Task) 1  "submesh"
-                              Name 80  "mytask"
-                              Name 101  "gl_TaskCountNV"
+                              Name 20  "viewID"
+                              Name 24  "gl_MeshViewIndicesNV"
+                              Name 25  "gl_MeshViewCountNV"
+                              Name 30  "i"
+                              Name 44  "mem"
+                              Name 47  "block0"
+                              MemberName 47(block0) 0  "uni_value"
+                              Name 49  ""
+                              Name 65  "uni_image"
+                              Name 88  "Task"
+                              MemberName 88(Task) 0  "dummy"
+                              MemberName 88(Task) 1  "submesh"
+                              MemberName 88(Task) 2  "viewID"
+                              Name 90  "mytask"
+                              Name 113  "gl_TaskCountNV"
                               Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
                               Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
-                              MemberDecorate 37(block0) 0 Offset 0
-                              Decorate 37(block0) Block
-                              Decorate 39 DescriptorSet 0
-                              Decorate 39 Binding 0
-                              Decorate 55(uni_image) DescriptorSet 0
-                              Decorate 55(uni_image) Binding 0
-                              Decorate 55(uni_image) NonReadable
-                              Decorate 77 ArrayStride 8
-                              MemberDecorate 78(Task) 0 PerTaskNV
-                              MemberDecorate 78(Task) 0 Offset 0
-                              MemberDecorate 78(Task) 1 PerTaskNV
-                              MemberDecorate 78(Task) 1 Offset 8
-                              Decorate 78(Task) Block
-                              Decorate 101(gl_TaskCountNV) BuiltIn TaskCountNV
-                              Decorate 103 BuiltIn WorkgroupSize
+                              Decorate 24(gl_MeshViewIndicesNV) BuiltIn MeshViewIndicesNV
+                              Decorate 25(gl_MeshViewCountNV) BuiltIn MeshViewCountNV
+                              MemberDecorate 47(block0) 0 Offset 0
+                              Decorate 47(block0) Block
+                              Decorate 49 DescriptorSet 0
+                              Decorate 49 Binding 0
+                              Decorate 65(uni_image) DescriptorSet 0
+                              Decorate 65(uni_image) Binding 0
+                              Decorate 65(uni_image) NonReadable
+                              Decorate 87 ArrayStride 8
+                              MemberDecorate 88(Task) 0 PerTaskNV
+                              MemberDecorate 88(Task) 0 Offset 0
+                              MemberDecorate 88(Task) 1 PerTaskNV
+                              MemberDecorate 88(Task) 1 Offset 8
+                              MemberDecorate 88(Task) 2 PerTaskNV
+                              MemberDecorate 88(Task) 2 Offset 32
+                              Decorate 88(Task) Block
+                              Decorate 113(gl_TaskCountNV) BuiltIn TaskCountNV
+                              Decorate 115 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -55,119 +63,133 @@
               12:      6(int) Constant 0
               13:             TypePointer Input 6(int)
 17(gl_WorkGroupID):     10(ptr) Variable Input
-              27:      6(int) Constant 10
-              28:             TypeBool
-              30:             TypeFloat 32
-              31:             TypeVector 30(float) 4
-              32:             TypeArray 31(fvec4) 27
-              33:             TypePointer Workgroup 32
-         34(mem):     33(ptr) Variable Workgroup
-      37(block0):             TypeStruct 6(int)
-              38:             TypePointer Uniform 37(block0)
-              39:     38(ptr) Variable Uniform
-              40:             TypeInt 32 1
-              41:     40(int) Constant 0
-              42:             TypePointer Uniform 6(int)
-              48:             TypePointer Workgroup 31(fvec4)
-              51:     40(int) Constant 1
-              53:             TypeImage 30(float) 2D nonsampled format:Unknown
-              54:             TypePointer UniformConstant 53
-   55(uni_image):     54(ptr) Variable UniformConstant
-              59:             TypeVector 40(int) 2
-              69:      6(int) Constant 1
-              73:      6(int) Constant 264
-              74:      6(int) Constant 2
-              75:             TypeVector 30(float) 2
-              76:      6(int) Constant 3
-              77:             TypeArray 75(fvec2) 76
-        78(Task):             TypeStruct 75(fvec2) 77
-              79:             TypePointer Output 78(Task)
-      80(mytask):     79(ptr) Variable Output
-              81:   30(float) Constant 1106247680
-              82:   30(float) Constant 1106771968
-              83:   75(fvec2) ConstantComposite 81 82
-              84:             TypePointer Output 75(fvec2)
-              86:   30(float) Constant 1107296256
-              87:   30(float) Constant 1107558400
-              88:   75(fvec2) ConstantComposite 86 87
-              90:   30(float) Constant 1107820544
-              91:   30(float) Constant 1108082688
-              92:   75(fvec2) ConstantComposite 90 91
-              94:     40(int) Constant 2
-             100:             TypePointer Output 6(int)
-101(gl_TaskCountNV):    100(ptr) Variable Output
-             102:      6(int) Constant 32
-             103:    9(ivec3) ConstantComposite 102 69 69
+              21:      6(int) Constant 4
+              22:             TypeArray 6(int) 21
+              23:             TypePointer Input 22
+24(gl_MeshViewIndicesNV):     23(ptr) Variable Input
+25(gl_MeshViewCountNV):     13(ptr) Variable Input
+              37:      6(int) Constant 10
+              38:             TypeBool
+              40:             TypeFloat 32
+              41:             TypeVector 40(float) 4
+              42:             TypeArray 41(fvec4) 37
+              43:             TypePointer Workgroup 42
+         44(mem):     43(ptr) Variable Workgroup
+      47(block0):             TypeStruct 6(int)
+              48:             TypePointer Uniform 47(block0)
+              49:     48(ptr) Variable Uniform
+              50:             TypeInt 32 1
+              51:     50(int) Constant 0
+              52:             TypePointer Uniform 6(int)
+              58:             TypePointer Workgroup 41(fvec4)
+              61:     50(int) Constant 1
+              63:             TypeImage 40(float) 2D nonsampled format:Unknown
+              64:             TypePointer UniformConstant 63
+   65(uni_image):     64(ptr) Variable UniformConstant
+              69:             TypeVector 50(int) 2
+              79:      6(int) Constant 1
+              83:      6(int) Constant 264
+              84:      6(int) Constant 2
+              85:             TypeVector 40(float) 2
+              86:      6(int) Constant 3
+              87:             TypeArray 85(fvec2) 86
+        88(Task):             TypeStruct 85(fvec2) 87 6(int)
+              89:             TypePointer Output 88(Task)
+      90(mytask):     89(ptr) Variable Output
+              91:   40(float) Constant 1106247680
+              92:   40(float) Constant 1106771968
+              93:   85(fvec2) ConstantComposite 91 92
+              94:             TypePointer Output 85(fvec2)
+              96:   40(float) Constant 1107296256
+              97:   40(float) Constant 1107558400
+              98:   85(fvec2) ConstantComposite 96 97
+             100:   40(float) Constant 1107820544
+             101:   40(float) Constant 1108082688
+             102:   85(fvec2) ConstantComposite 100 101
+             104:     50(int) Constant 2
+             111:             TypePointer Output 6(int)
+113(gl_TaskCountNV):    111(ptr) Variable Output
+             114:      6(int) Constant 32
+             115:    9(ivec3) ConstantComposite 114 79 79
          4(main):           2 Function None 3
                5:             Label
           8(iid):      7(ptr) Variable Function
          16(gid):      7(ptr) Variable Function
-           20(i):      7(ptr) Variable Function
+      20(viewID):      7(ptr) Variable Function
+           30(i):      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
-                              Store 20(i) 12
-                              Branch 21
-              21:             Label
-                              LoopMerge 23 24 None
-                              Branch 25
-              25:             Label
-              26:      6(int) Load 20(i)
-              29:    28(bool) ULessThan 26 27
-                              BranchConditional 29 22 23
-              22:               Label
-              35:      6(int)   Load 20(i)
-              36:      6(int)   Load 20(i)
-              43:     42(ptr)   AccessChain 39 41
-              44:      6(int)   Load 43
-              45:      6(int)   IAdd 36 44
-              46:   30(float)   ConvertUToF 45
-              47:   31(fvec4)   CompositeConstruct 46 46 46 46
-              49:     48(ptr)   AccessChain 34(mem) 35
-                                Store 49 47
-                                Branch 24
-              24:               Label
-              50:      6(int)   Load 20(i)
-              52:      6(int)   IAdd 50 51
-                                Store 20(i) 52
-                                Branch 21
-              23:             Label
-              56:          53 Load 55(uni_image)
-              57:      6(int) Load 8(iid)
-              58:     40(int) Bitcast 57
-              60:   59(ivec2) CompositeConstruct 58 58
-              61:      6(int) Load 16(gid)
-              62:     48(ptr) AccessChain 34(mem) 61
-              63:   31(fvec4) Load 62
-                              ImageWrite 56 60 63
-              64:          53 Load 55(uni_image)
-              65:      6(int) Load 8(iid)
-              66:     40(int) Bitcast 65
-              67:   59(ivec2) CompositeConstruct 66 66
-              68:      6(int) Load 16(gid)
-              70:      6(int) IAdd 68 69
-              71:     48(ptr) AccessChain 34(mem) 70
-              72:   31(fvec4) Load 71
-                              ImageWrite 64 67 72
-                              MemoryBarrier 69 73
-                              ControlBarrier 74 74 73
-              85:     84(ptr) AccessChain 80(mytask) 41
-                              Store 85 83
-              89:     84(ptr) AccessChain 80(mytask) 51 41
-                              Store 89 88
-              93:     84(ptr) AccessChain 80(mytask) 51 51
-                              Store 93 92
-              95:      6(int) Load 16(gid)
-              96:      6(int) UMod 95 74
-              97:     84(ptr) AccessChain 80(mytask) 51 96
-              98:   75(fvec2) Load 97
-              99:     84(ptr) AccessChain 80(mytask) 51 94
+              26:      6(int) Load 25(gl_MeshViewCountNV)
+              27:      6(int) UMod 26 21
+              28:     13(ptr) AccessChain 24(gl_MeshViewIndicesNV) 27
+              29:      6(int) Load 28
+                              Store 20(viewID) 29
+                              Store 30(i) 12
+                              Branch 31
+              31:             Label
+                              LoopMerge 33 34 None
+                              Branch 35
+              35:             Label
+              36:      6(int) Load 30(i)
+              39:    38(bool) ULessThan 36 37
+                              BranchConditional 39 32 33
+              32:               Label
+              45:      6(int)   Load 30(i)
+              46:      6(int)   Load 30(i)
+              53:     52(ptr)   AccessChain 49 51
+              54:      6(int)   Load 53
+              55:      6(int)   IAdd 46 54
+              56:   40(float)   ConvertUToF 55
+              57:   41(fvec4)   CompositeConstruct 56 56 56 56
+              59:     58(ptr)   AccessChain 44(mem) 45
+                                Store 59 57
+                                Branch 34
+              34:               Label
+              60:      6(int)   Load 30(i)
+              62:      6(int)   IAdd 60 61
+                                Store 30(i) 62
+                                Branch 31
+              33:             Label
+              66:          63 Load 65(uni_image)
+              67:      6(int) Load 8(iid)
+              68:     50(int) Bitcast 67
+              70:   69(ivec2) CompositeConstruct 68 68
+              71:      6(int) Load 16(gid)
+              72:     58(ptr) AccessChain 44(mem) 71
+              73:   41(fvec4) Load 72
+                              ImageWrite 66 70 73
+              74:          63 Load 65(uni_image)
+              75:      6(int) Load 8(iid)
+              76:     50(int) Bitcast 75
+              77:   69(ivec2) CompositeConstruct 76 76
+              78:      6(int) Load 16(gid)
+              80:      6(int) IAdd 78 79
+              81:     58(ptr) AccessChain 44(mem) 80
+              82:   41(fvec4) Load 81
+                              ImageWrite 74 77 82
+                              MemoryBarrier 79 83
+                              ControlBarrier 84 84 83
+              95:     94(ptr) AccessChain 90(mytask) 51
+                              Store 95 93
+              99:     94(ptr) AccessChain 90(mytask) 61 51
                               Store 99 98
-                              MemoryBarrier 69 73
-                              ControlBarrier 74 74 73
-                              Store 101(gl_TaskCountNV) 76
+             103:     94(ptr) AccessChain 90(mytask) 61 61
+                              Store 103 102
+             105:      6(int) Load 16(gid)
+             106:      6(int) UMod 105 84
+             107:     94(ptr) AccessChain 90(mytask) 61 106
+             108:   85(fvec2) Load 107
+             109:     94(ptr) AccessChain 90(mytask) 61 104
+                              Store 109 108
+             110:      6(int) Load 20(viewID)
+             112:    111(ptr) AccessChain 90(mytask) 104
+                              Store 112 110
+                              MemoryBarrier 79 83
+                              ControlBarrier 84 84 83
+                              Store 113(gl_TaskCountNV) 86
                               Return
                               FunctionEnd
diff --git a/Test/spv.meshTaskShader.task b/Test/spv.meshTaskShader.task
index c12b3bd..ff94e6d 100644
--- a/Test/spv.meshTaskShader.task
+++ b/Test/spv.meshTaskShader.task
@@ -1,5 +1,7 @@
 #version 450
 
+#define MAX_VIEWS gl_MaxMeshViewCountNV
+
 #define BARRIER() \
     memoryBarrierShared(); \
     barrier();
@@ -19,12 +21,14 @@
 taskNV out Task {
     vec2 dummy;
     vec2 submesh[3];
+    uint viewID;
 } mytask;
 
 void main()
 {
     uint iid = gl_LocalInvocationID.x;
     uint gid = gl_WorkGroupID.x;
+    uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];
 
     // 1. shared memory load and stores
     for (uint i = 0; i < 10; ++i) {
@@ -41,6 +45,7 @@
     mytask.submesh[0] = vec2(32.0, 33.0);
     mytask.submesh[1] = vec2(34.0, 35.0);
     mytask.submesh[2] = mytask.submesh[gid%2];
+    mytask.viewID     = viewID;
 
     BARRIER();
 
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index a71d5aa..e399ead 100755
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -5357,6 +5357,9 @@
             "in highp uvec3 gl_GlobalInvocationID;"
             "in highp uint gl_LocalInvocationIndex;"
 
+            "in uint gl_MeshViewCountNV;"
+            "in uint gl_MeshViewIndicesNV[4];"
+
             "\n");
     }
 
@@ -8843,6 +8846,8 @@
             symbolTable.setVariableExtensions("gl_LocalInvocationID",    1, &E_GL_NV_mesh_shader);
             symbolTable.setVariableExtensions("gl_GlobalInvocationID",   1, &E_GL_NV_mesh_shader);
             symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MeshViewCountNV",      1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MeshViewIndicesNV",    1, &E_GL_NV_mesh_shader);
 
             BuiltInVariable("gl_TaskCountNV",          EbvTaskCountNV,          symbolTable);
             BuiltInVariable("gl_WorkGroupSize",        EbvWorkGroupSize,        symbolTable);
@@ -8850,8 +8855,11 @@
             BuiltInVariable("gl_LocalInvocationID",    EbvLocalInvocationId,    symbolTable);
             BuiltInVariable("gl_GlobalInvocationID",   EbvGlobalInvocationId,   symbolTable);
             BuiltInVariable("gl_LocalInvocationIndex", EbvLocalInvocationIndex, symbolTable);
+            BuiltInVariable("gl_MeshViewCountNV",      EbvMeshViewCountNV,      symbolTable);
+            BuiltInVariable("gl_MeshViewIndicesNV",    EbvMeshViewIndicesNV,    symbolTable);
 
             symbolTable.setVariableExtensions("gl_MaxTaskWorkGroupSizeNV", 1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MaxMeshViewCountNV",     1, &E_GL_NV_mesh_shader);
 
             symbolTable.setFunctionExtensions("barrier",                   1, &E_GL_NV_mesh_shader);
             symbolTable.setFunctionExtensions("memoryBarrierShared",       1, &E_GL_NV_mesh_shader);