HLSL: Support SV_Coverage and SV_DispatchThreadId; catch SV_GroupIndex.
diff --git a/Test/baseResults/hlsl.basic.comp.out b/Test/baseResults/hlsl.basic.comp.out
new file mode 100755
index 0000000..1948ec3
--- /dev/null
+++ b/Test/baseResults/hlsl.basic.comp.out
@@ -0,0 +1,59 @@
+hlsl.basic.comp
+Shader version: 450
+local_size = (1, 1, 1)
+0:? Sequence
+0:4  Function Definition: main( (temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:5      dti: direct index for structure (layout(offset=0 ) uniform int LocalInvocationID)
+0:5        'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int LocalInvocationID dti})
+0:5        Constant:
+0:5          0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (uniform block{layout(offset=0 ) uniform int LocalInvocationID dti})
+
+
+Linked compute stage:
+
+
+Shader version: 450
+local_size = (1, 1, 1)
+0:? Sequence
+0:4  Function Definition: main( (temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:5      dti: direct index for structure (layout(offset=0 ) uniform int LocalInvocationID)
+0:5        'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int LocalInvocationID dti})
+0:5        Constant:
+0:5          0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (uniform block{layout(offset=0 ) uniform int LocalInvocationID dti})
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 11
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Name 4  "main"
+                              Name 7  "$Global"
+                              MemberName 7($Global) 0  "dti"
+                              Name 9  ""
+                              MemberDecorate 7($Global) 0 Offset 0
+                              MemberDecorate 7($Global) 0 BuiltIn LocalInvocationId
+                              Decorate 7($Global) Block
+                              Decorate 9 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+      7($Global):             TypeStruct 6(int)
+               8:             TypePointer Uniform 7($Global)
+               9:      8(ptr) Variable Uniform
+              10:      6(int) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.inoutquals.frag.out b/Test/baseResults/hlsl.inoutquals.frag.out
index 83fe24b..b2716a4 100644
--- a/Test/baseResults/hlsl.inoutquals.frag.out
+++ b/Test/baseResults/hlsl.inoutquals.frag.out
@@ -18,9 +18,10 @@
 0:11        'x' (in float)
 0:11        Constant:
 0:11          -1.000000
-0:15  Function Definition: main(vf4; (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:15  Function Definition: main(vf4;i1; (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:15    Function Parameters: 
 0:15      'inpos' (noperspective in 4-component vector of float FragCoord)
+0:15      'sampleMask' (out int SampleMaskIn)
 0:?     Sequence
 0:18      Sequence
 0:18        move second child to first child (temp float)
@@ -74,6 +75,7 @@
 0:?     'Color' (layout(location=0 ) out 4-component vector of float)
 0:?     'Depth' (out float FragDepth)
 0:?     'inpos' (noperspective in 4-component vector of float FragCoord)
+0:?     'sampleMask' (out int SampleMaskIn)
 
 
 Linked fragment stage:
@@ -98,9 +100,10 @@
 0:11        'x' (in float)
 0:11        Constant:
 0:11          -1.000000
-0:15  Function Definition: main(vf4; (temp structure{temp 4-component vector of float Color, temp float Depth})
+0:15  Function Definition: main(vf4;i1; (temp structure{temp 4-component vector of float Color, temp float Depth})
 0:15    Function Parameters: 
 0:15      'inpos' (noperspective in 4-component vector of float FragCoord)
+0:15      'sampleMask' (out int SampleMaskIn)
 0:?     Sequence
 0:18      Sequence
 0:18        move second child to first child (temp float)
@@ -154,15 +157,17 @@
 0:?     'Color' (layout(location=0 ) out 4-component vector of float)
 0:?     'Depth' (out float FragDepth)
 0:?     'inpos' (noperspective in 4-component vector of float FragCoord)
+0:?     'sampleMask' (out int SampleMaskIn)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 61
+// Id's are bound by 63
 
                               Capability Shader
+                              Capability SampleRateShading
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 45 53 57
+                              EntryPoint Fragment 4  "main" 45 53 57 62
                               ExecutionMode 4 OriginUpperLeft
                               Name 4  "main"
                               Name 12  "MyFunc(f1;f1;f1;"
@@ -182,10 +187,12 @@
                               Name 45  "inpos"
                               Name 53  "Color"
                               Name 57  "Depth"
+                              Name 62  "sampleMask"
                               Decorate 45(inpos) NoPerspective
                               Decorate 45(inpos) BuiltIn FragCoord
                               Decorate 53(Color) Location 0
                               Decorate 57(Depth) BuiltIn FragDepth
+                              Decorate 62(sampleMask) BuiltIn SampleMask
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -211,6 +218,8 @@
        53(Color):     52(ptr) Variable Output
               56:             TypePointer Output 6(float)
        57(Depth):     56(ptr) Variable Output
+              61:             TypePointer Output 34(int)
+  62(sampleMask):     61(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            17(x):      7(ptr) Variable Function
diff --git a/Test/hlsl.basic.comp b/Test/hlsl.basic.comp
new file mode 100644
index 0000000..5e43510
--- /dev/null
+++ b/Test/hlsl.basic.comp
@@ -0,0 +1,6 @@
+int dti : SV_DispatchThreadID;

+

+void main()

+{

+    dti;

+}

diff --git a/Test/hlsl.inoutquals.frag b/Test/hlsl.inoutquals.frag
index 91798d5..3234688 100644
--- a/Test/hlsl.inoutquals.frag
+++ b/Test/hlsl.inoutquals.frag
@@ -11,7 +11,7 @@
     x = -1; // no effect since x = in param
 }
 
-PS_OUTPUT main(noperspective in float4 inpos : SV_Position)
+PS_OUTPUT main(noperspective in float4 inpos : SV_Position, out int sampleMask : SV_Coverage)
 {
    PS_OUTPUT psout;
 
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 3cdfdb0..882a2d0 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "Overload400-PrecQual.1601"
+#define GLSLANG_REVISION "Overload400-PrecQual.1602"
 #define GLSLANG_DATE "16-Oct-2016"
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index f50c749..b50816a 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -86,6 +86,7 @@
         {"hlsl.array.multidim.frag", "main"},
         {"hlsl.assoc.frag", "PixelShaderFunction"},
         {"hlsl.attribute.frag", "PixelShaderFunction"},
+        {"hlsl.basic.comp", "main"},
         {"hlsl.buffer.frag", "PixelShaderFunction"},
         {"hlsl.calculatelod.dx10.frag", "main"},
         {"hlsl.calculatelodunclamped.dx10.frag", "main"},
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index 78f18b6..b4c417d 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -2935,6 +2935,8 @@
         qualifier.builtIn = EbvTessLevelInner;
     else if (semanticUpperCase == "SV_GSINSTANCEID")
         qualifier.builtIn = EbvInvocationId;
+    else if (semanticUpperCase == "SV_DISPATCHTHREADID")
+        qualifier.builtIn = EbvLocalInvocationId;
     else if (semanticUpperCase == "SV_GROUPTHREADID")
         qualifier.builtIn = EbvLocalInvocationId;
     else if (semanticUpperCase == "SV_GROUPID")
@@ -2943,6 +2945,8 @@
         qualifier.builtIn = EbvTessCoord;
     else if (semanticUpperCase == "SV_DEPTH")
         qualifier.builtIn = EbvFragDepth;
+    else if( semanticUpperCase == "SV_COVERAGE")
+        qualifier.builtIn = EbvSampleMask;
 
     //TODO, these need to get refined to be more specific 
     else if( semanticUpperCase == "SV_DEPTHGREATEREQUAL")
@@ -2950,9 +2954,9 @@
     else if( semanticUpperCase == "SV_DEPTHLESSEQUAL")
         qualifier.builtIn = EbvFragDepthLesser;
     else if( semanticUpperCase == "SV_STENCILREF")
-        error(loc, "unimplemented", "SV_STENCILREF", "");
-    else if( semanticUpperCase == "SV_COVERAGE")
-        error(loc, "unimplemented", "SV_COVERAGE", "");
+        error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
+    else if( semanticUpperCase == "SV_GROUPINDEX")
+        error(loc, "unimplemented", "SV_GROUPINDEX", "");
 }
 
 //