Merge pull request #596 from steve-lunarg/hlsl-intrinsic-parsing

HLSL: use HLSL parser for HLSL intrinsic prototypes, enable int/bool mats
diff --git a/Test/baseResults/hlsl.identifier.sample.frag.out b/Test/baseResults/hlsl.identifier.sample.frag.out
new file mode 100644
index 0000000..8e74081
--- /dev/null
+++ b/Test/baseResults/hlsl.identifier.sample.frag.out
@@ -0,0 +1,103 @@
+hlsl.identifier.sample.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: sample(i1; (temp int)
+0:9    Function Parameters: 
+0:9      'x' (in int)
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        'x' (in int)
+0:12  Function Definition: main( (temp 4-component vector of float)
+0:12    Function Parameters: 
+0:?     Sequence
+0:15      Sequence
+0:15        move second child to first child (temp int)
+0:15          'sample' (temp int)
+0:15          Constant:
+0:15            3 (const int)
+0:17      Sequence
+0:17        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:17        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: sample(i1; (temp int)
+0:9    Function Parameters: 
+0:9      'x' (in int)
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        'x' (in int)
+0:12  Function Definition: main( (temp 4-component vector of float)
+0:12    Function Parameters: 
+0:?     Sequence
+0:15      Sequence
+0:15        move second child to first child (temp int)
+0:15          'sample' (temp int)
+0:15          Constant:
+0:15            3 (const int)
+0:17      Sequence
+0:17        move second child to first child (temp 4-component vector of float)
+0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:17        Branch: Return
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 24
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 20
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 10  "sample(i1;"
+                              Name 9  "x"
+                              Name 15  "sample"
+                              Name 20  "@entryPointOutput"
+                              Decorate 20(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               8:             TypeFunction 6(int) 7(ptr)
+              16:      6(int) Constant 3
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypePointer Output 18(fvec4)
+20(@entryPointOutput):     19(ptr) Variable Output
+              21:   17(float) Constant 0
+              22:   18(fvec4) ConstantComposite 21 21 21 21
+         4(main):           2 Function None 3
+               5:             Label
+      15(sample):      7(ptr) Variable Function
+                              Store 15(sample) 16
+                              Store 20(@entryPointOutput) 22
+                              Return
+                              FunctionEnd
+  10(sample(i1;):      6(int) Function None 8
+            9(x):      7(ptr) FunctionParameter
+              11:             Label
+              12:      6(int) Load 9(x)
+                              ReturnValue 12
+                              FunctionEnd
diff --git a/Test/hlsl.identifier.sample.frag b/Test/hlsl.identifier.sample.frag
new file mode 100644
index 0000000..3281a9a
--- /dev/null
+++ b/Test/hlsl.identifier.sample.frag
@@ -0,0 +1,18 @@
+
+struct MyStruct {
+    sample        float a;
+    noperspective float b;
+    linear        float c;
+    centroid      float d;
+};
+
+int sample(int x) { return x; } // HLSL allows this as an identifier as well.
+
+float4 main() : SV_Target0
+{
+    // HLSL allows this as an identifier as well.
+    // However, this is not true of other qualifier keywords such as "linear".
+    int sample = 3;
+
+    return float4(0,0,0,0);
+}
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index e6d5cb1..f4b0bff 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -118,6 +118,7 @@
         {"hlsl.getdimensions.rw.dx10.frag", "main"},
         {"hlsl.getdimensions.dx10.vert", "main"},
         {"hlsl.getsampleposition.dx10.frag", "main"},
+        {"hlsl.identifier.sample.frag", "main"},
         {"hlsl.if.frag", "PixelShaderFunction"},
         {"hlsl.inoutquals.frag", "main"},
         {"hlsl.init.frag", "ShaderFunction"},
diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp
index e6f4b60..079a469 100755
--- a/hlsl/hlslGrammar.cpp
+++ b/hlsl/hlslGrammar.cpp
@@ -85,6 +85,19 @@
         return true;
     }
 
+    // Even though "sample" is a keyword (for interpolation modifiers), it IS still accepted as
+    // an identifier.  This appears to be a solitary exception: other interp modifier keywords such
+    // as "linear" or "centroid" NOT valid identifiers.  This code special cases "sample",
+    // so e.g, "int sample;" is accepted.
+    if (peekTokenClass(EHTokSample)) {
+        idToken.string     = NewPoolTString("sample");
+        idToken.tokenClass = EHTokIdentifier;
+        idToken.symbol     = nullptr;
+        idToken.loc        = token.loc;
+        advanceToken();
+        return true;
+    }
+
     return false;
 }