Add Float16/Int8/Int16 capabilities for private variables and function parameters
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
old mode 100755
new mode 100644
index 9bf3704..55b0ec6
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2878,6 +2878,11 @@
             builder.addCapability(spv::CapabilityStorageUniformBufferBlock16);
             break;
         default:
+            if (node->getType().containsBasicType(glslang::EbtFloat16))
+                builder.addCapability(spv::CapabilityFloat16);
+            if (node->getType().containsBasicType(glslang::EbtInt16) ||
+                node->getType().containsBasicType(glslang::EbtUint16))
+                builder.addCapability(spv::CapabilityInt16);
             break;
         }
     }
@@ -2894,6 +2899,8 @@
         } else if (storageClass == spv::StorageClassStorageBuffer) {
             builder.addExtension(spv::E_SPV_KHR_8bit_storage);
             builder.addCapability(spv::CapabilityStorageBuffer8BitAccess);
+        } else {
+            builder.addCapability(spv::CapabilityInt8);
         }
     }
 
@@ -3799,6 +3806,16 @@
             symbolValues[parameters[p]->getAsSymbolNode()->getId()] = function->getParamId(p);
             // give a name too
             builder.addName(function->getParamId(p), parameters[p]->getAsSymbolNode()->getName().c_str());
+
+            const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();
+            if (paramType.containsBasicType(glslang::EbtInt8) ||
+                paramType.containsBasicType(glslang::EbtUint8))
+                builder.addCapability(spv::CapabilityInt8);
+            if (paramType.containsBasicType(glslang::EbtInt16) ||
+                paramType.containsBasicType(glslang::EbtUint16))
+                builder.addCapability(spv::CapabilityInt16);
+            if (paramType.containsBasicType(glslang::EbtFloat16))
+                builder.addCapability(spv::CapabilityFloat16);
         }
     }
 }
diff --git a/Test/baseResults/spv.functionParameterTypes.frag.out b/Test/baseResults/spv.functionParameterTypes.frag.out
new file mode 100644
index 0000000..24e780e
--- /dev/null
+++ b/Test/baseResults/spv.functionParameterTypes.frag.out
@@ -0,0 +1,62 @@
+spv.functionParameterTypes.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 34
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 29  "f(i81;u81;i161;u161;i641;u641;f161;"
+                              Name 22  "i8"
+                              Name 23  "u8"
+                              Name 24  "i16"
+                              Name 25  "u16"
+                              Name 26  "i64"
+                              Name 27  "u64"
+                              Name 28  "f16"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 8 1
+               7:             TypePointer Function 6(int8_t)
+               8:             TypeInt 8 0
+               9:             TypePointer Function 8(int8_t)
+              10:             TypeInt 16 1
+              11:             TypePointer Function 10(int16_t)
+              12:             TypeInt 16 0
+              13:             TypePointer Function 12(int16_t)
+              14:             TypeInt 64 1
+              15:             TypePointer Function 14(int64_t)
+              16:             TypeInt 64 0
+              17:             TypePointer Function 16(int64_t)
+              18:             TypeFloat 16
+              19:             TypePointer Function 18(float16_t)
+              20:             TypeInt 32 1
+              21:             TypeFunction 20(int) 7(ptr) 9(ptr) 11(ptr) 13(ptr) 15(ptr) 17(ptr) 19(ptr)
+              31:     20(int) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+29(f(i81;u81;i161;u161;i641;u641;f161;):     20(int) Function None 21
+          22(i8):      7(ptr) FunctionParameter
+          23(u8):      9(ptr) FunctionParameter
+         24(i16):     11(ptr) FunctionParameter
+         25(u16):     13(ptr) FunctionParameter
+         26(i64):     15(ptr) FunctionParameter
+         27(u64):     17(ptr) FunctionParameter
+         28(f16):     19(ptr) FunctionParameter
+              30:             Label
+                              ReturnValue 31
+                              FunctionEnd
diff --git a/Test/baseResults/spv.privateVariableTypes.frag.out b/Test/baseResults/spv.privateVariableTypes.frag.out
new file mode 100644
index 0000000..9b4063e
--- /dev/null
+++ b/Test/baseResults/spv.privateVariableTypes.frag.out
@@ -0,0 +1,54 @@
+spv.privateVariableTypes.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 27
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 8  "i8"
+                              Name 11  "u8"
+                              Name 14  "i16"
+                              Name 17  "u16"
+                              Name 20  "i64"
+                              Name 23  "u64"
+                              Name 26  "f16"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 8 1
+               7:             TypePointer Private 6(int8_t)
+           8(i8):      7(ptr) Variable Private
+               9:             TypeInt 8 0
+              10:             TypePointer Private 9(int8_t)
+          11(u8):     10(ptr) Variable Private
+              12:             TypeInt 16 1
+              13:             TypePointer Private 12(int16_t)
+         14(i16):     13(ptr) Variable Private
+              15:             TypeInt 16 0
+              16:             TypePointer Private 15(int16_t)
+         17(u16):     16(ptr) Variable Private
+              18:             TypeInt 64 1
+              19:             TypePointer Private 18(int64_t)
+         20(i64):     19(ptr) Variable Private
+              21:             TypeInt 64 0
+              22:             TypePointer Private 21(int64_t)
+         23(u64):     22(ptr) Variable Private
+              24:             TypeFloat 16
+              25:             TypePointer Private 24(float16_t)
+         26(f16):     25(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.functionParameterTypes.frag b/Test/spv.functionParameterTypes.frag
new file mode 100644
index 0000000..08c1687
--- /dev/null
+++ b/Test/spv.functionParameterTypes.frag
@@ -0,0 +1,20 @@
+#version 460 core

+#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable

+#extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable

+#extension GL_EXT_shader_explicit_arithmetic_types_int16 : enable

+#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable

+

+int f(int8_t i8,

+       uint8_t u8,

+       int16_t i16,

+       uint16_t u16,

+       int64_t i64,

+       uint64_t u64,

+       float16_t f16)

+{

+    return 0;

+}

+

+void main()

+{

+}

diff --git a/Test/spv.privateVariableTypes.frag b/Test/spv.privateVariableTypes.frag
new file mode 100644
index 0000000..cb6981f
--- /dev/null
+++ b/Test/spv.privateVariableTypes.frag
@@ -0,0 +1,17 @@
+#version 460 core

+#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable

+#extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable

+#extension GL_EXT_shader_explicit_arithmetic_types_int16 : enable

+#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable

+

+int8_t i8;

+uint8_t u8;

+int16_t i16;

+uint16_t u16;

+int64_t i64;

+uint64_t u64;

+float16_t f16;

+

+void main()

+{

+}

diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 1a14407..28981ac 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -307,6 +307,7 @@
         "spv.functionCall.frag",
         "spv.functionNestedOpaque.vert",
         "spv.functionSemantics.frag",
+        "spv.functionParameterTypes.frag",
         "spv.GeometryShaderPassthrough.geom",
         "spv.interpOps.frag",
         "spv.int64.frag",
@@ -334,6 +335,7 @@
         "spv.precision.frag",
         "spv.precisionNonESSamp.frag",
         "spv.prepost.frag",
+        "spv.privateVariableTypes.frag",
         "spv.qualifiers.vert",
         "spv.sample.frag",
         "spv.sampleId.frag",