HLSL: Accept SV_Cull/ClipDistanceN, by refactoring the way semantics are mapped.
authorJohn Kessenich <cepheus@frii.com>
Thu, 9 Mar 2017 21:37:32 +0000 (14:37 -0700)
committerJohn Kessenich <cepheus@frii.com>
Thu, 9 Mar 2017 21:37:32 +0000 (14:37 -0700)
13 files changed:
Test/baseResults/hlsl.semantic.geom.out [new file with mode: 0755]
Test/baseResults/hlsl.semantic.vert.out [new file with mode: 0755]
Test/hlsl.semantic.geom [new file with mode: 0644]
Test/hlsl.semantic.vert [new file with mode: 0644]
glslang/Include/BaseTypes.h
glslang/Include/revision.h
gtests/Hlsl.FromFile.cpp
hlsl/hlslGrammar.cpp
hlsl/hlslParseHelper.cpp
hlsl/hlslParseHelper.h
hlsl/hlslScanContext.cpp
hlsl/hlslScanContext.h
hlsl/hlslTokenStream.h

diff --git a/Test/baseResults/hlsl.semantic.geom.out b/Test/baseResults/hlsl.semantic.geom.out
new file mode 100755 (executable)
index 0000000..76a69f3
--- /dev/null
@@ -0,0 +1,246 @@
+hlsl.semantic.geom
+Shader version: 450
+invocations = -1
+max_vertices = 4
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:12  Function Definition: @main(u1[3];struct-S-f1-f1-u1-u1-i11; (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12    Function Parameters: 
+0:12      'VertexID' (in 3-element array of uint)
+0:12      'OutputStream' (out structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:?     Sequence
+0:14      Branch: Return with expression
+0:14        's' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12  Function Definition: main( (temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child (temp 3-element array of uint)
+0:?         'VertexID' (temp 3-element array of uint)
+0:?         'VertexID' (layout(location=0 ) in 3-element array of uint)
+0:12      Sequence
+0:12        move second child to first child (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12          'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12          Function Call: @main(u1[3];struct-S-f1-f1-u1-u1-i11; (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:?             'VertexID' (temp 3-element array of uint)
+0:?             'OutputStream' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip0' (out float ClipDistance)
+0:12          clip0: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull0' (out float CullDistance)
+0:12          cull0: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child (temp uint)
+0:?           '@entryPointOutput_vpai' (out uint ViewportIndex)
+0:12          vpai: direct index for structure (temp uint)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child (temp uint)
+0:?           '@entryPointOutput_rtai' (out uint Layer)
+0:12          rtai: direct index for structure (temp uint)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child (temp int)
+0:12          ii: direct index for structure (temp int)
+0:12            '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12          ii: direct index for structure (temp int)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              4 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:?     'VertexID' (layout(location=0 ) in 3-element array of uint)
+0:?     '@entryPointOutput_vpai' (out uint ViewportIndex)
+
+
+Linked geometry stage:
+
+
+Shader version: 450
+invocations = 1
+max_vertices = 4
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:12  Function Definition: @main(u1[3];struct-S-f1-f1-u1-u1-i11; (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12    Function Parameters: 
+0:12      'VertexID' (in 3-element array of uint)
+0:12      'OutputStream' (out structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:?     Sequence
+0:14      Branch: Return with expression
+0:14        's' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12  Function Definition: main( (temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child (temp 3-element array of uint)
+0:?         'VertexID' (temp 3-element array of uint)
+0:?         'VertexID' (layout(location=0 ) in 3-element array of uint)
+0:12      Sequence
+0:12        move second child to first child (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12          'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12          Function Call: @main(u1[3];struct-S-f1-f1-u1-u1-i11; (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:?             'VertexID' (temp 3-element array of uint)
+0:?             'OutputStream' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip0' (out float ClipDistance)
+0:12          clip0: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull0' (out float CullDistance)
+0:12          cull0: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child (temp uint)
+0:?           '@entryPointOutput_vpai' (out uint ViewportIndex)
+0:12          vpai: direct index for structure (temp uint)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child (temp uint)
+0:?           '@entryPointOutput_rtai' (out uint Layer)
+0:12          rtai: direct index for structure (temp uint)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child (temp int)
+0:12          ii: direct index for structure (temp int)
+0:12            '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12          ii: direct index for structure (temp int)
+0:12            'flattenTemp' (temp structure{temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
+0:12            Constant:
+0:12              4 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:?     'VertexID' (layout(location=0 ) in 3-element array of uint)
+0:?     '@entryPointOutput_vpai' (out uint ViewportIndex)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 62
+
+                              Capability Geometry
+                              Capability ClipDistance
+                              Capability CullDistance
+                              Capability MultiViewport
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 25 34 39 44 49 55
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputLineStrip
+                              ExecutionMode 4 OutputVertices 4
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "clip0"
+                              MemberName 12(S) 1  "cull0"
+                              MemberName 12(S) 2  "vpai"
+                              MemberName 12(S) 3  "rtai"
+                              MemberName 12(S) 4  "ii"
+                              Name 17  "@main(u1[3];struct-S-f1-f1-u1-u1-i11;"
+                              Name 15  "VertexID"
+                              Name 16  "OutputStream"
+                              Name 19  "s"
+                              Name 23  "VertexID"
+                              Name 25  "VertexID"
+                              Name 27  "flattenTemp"
+                              Name 28  "OutputStream"
+                              Name 29  "param"
+                              Name 31  "param"
+                              Name 34  "@entryPointOutput_clip0"
+                              Name 39  "@entryPointOutput_cull0"
+                              Name 44  "@entryPointOutput_vpai"
+                              Name 49  "@entryPointOutput_rtai"
+                              Name 53  "S"
+                              MemberName 53(S) 0  "ii"
+                              Name 55  "@entryPointOutput"
+                              Decorate 25(VertexID) Location 0
+                              Decorate 34(@entryPointOutput_clip0) BuiltIn ClipDistance
+                              Decorate 39(@entryPointOutput_cull0) BuiltIn CullDistance
+                              Decorate 44(@entryPointOutput_vpai) BuiltIn ViewportIndex
+                              Decorate 49(@entryPointOutput_rtai) BuiltIn Layer
+                              Decorate 55(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:      6(int) Constant 3
+               8:             TypeArray 6(int) 7
+               9:             TypePointer Function 8
+              10:             TypeFloat 32
+              11:             TypeInt 32 1
+           12(S):             TypeStruct 10(float) 10(float) 6(int) 6(int) 11(int)
+              13:             TypePointer Function 12(S)
+              14:             TypeFunction 12(S) 9(ptr) 13(ptr)
+              24:             TypePointer Input 8
+    25(VertexID):     24(ptr) Variable Input
+              33:             TypePointer Output 10(float)
+34(@entryPointOutput_clip0):     33(ptr) Variable Output
+              35:     11(int) Constant 0
+              36:             TypePointer Function 10(float)
+39(@entryPointOutput_cull0):     33(ptr) Variable Output
+              40:     11(int) Constant 1
+              43:             TypePointer Output 6(int)
+44(@entryPointOutput_vpai):     43(ptr) Variable Output
+              45:     11(int) Constant 2
+              46:             TypePointer Function 6(int)
+49(@entryPointOutput_rtai):     43(ptr) Variable Output
+              50:     11(int) Constant 3
+           53(S):             TypeStruct 11(int)
+              54:             TypePointer Output 53(S)
+55(@entryPointOutput):     54(ptr) Variable Output
+              56:     11(int) Constant 4
+              57:             TypePointer Function 11(int)
+              60:             TypePointer Output 11(int)
+         4(main):           2 Function None 3
+               5:             Label
+    23(VertexID):      9(ptr) Variable Function
+ 27(flattenTemp):     13(ptr) Variable Function
+28(OutputStream):     13(ptr) Variable Function
+       29(param):      9(ptr) Variable Function
+       31(param):     13(ptr) Variable Function
+              26:           8 Load 25(VertexID)
+                              Store 23(VertexID) 26
+              30:           8 Load 23(VertexID)
+                              Store 29(param) 30
+              32:       12(S) FunctionCall 17(@main(u1[3];struct-S-f1-f1-u1-u1-i11;) 29(param) 31(param)
+                              Store 27(flattenTemp) 32
+              37:     36(ptr) AccessChain 27(flattenTemp) 35
+              38:   10(float) Load 37
+                              Store 34(@entryPointOutput_clip0) 38
+              41:     36(ptr) AccessChain 27(flattenTemp) 40
+              42:   10(float) Load 41
+                              Store 39(@entryPointOutput_cull0) 42
+              47:     46(ptr) AccessChain 27(flattenTemp) 45
+              48:      6(int) Load 47
+                              Store 44(@entryPointOutput_vpai) 48
+              51:     46(ptr) AccessChain 27(flattenTemp) 50
+              52:      6(int) Load 51
+                              Store 49(@entryPointOutput_rtai) 52
+              58:     57(ptr) AccessChain 27(flattenTemp) 56
+              59:     11(int) Load 58
+              61:     60(ptr) AccessChain 55(@entryPointOutput) 35
+                              Store 61 59
+                              Return
+                              FunctionEnd
+17(@main(u1[3];struct-S-f1-f1-u1-u1-i11;):       12(S) Function None 14
+    15(VertexID):      9(ptr) FunctionParameter
+16(OutputStream):     13(ptr) FunctionParameter
+              18:             Label
+           19(s):     13(ptr) Variable Function
+              20:       12(S) Load 19(s)
+                              ReturnValue 20
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.semantic.vert.out b/Test/baseResults/hlsl.semantic.vert.out
new file mode 100755 (executable)
index 0000000..7ed8d8b
--- /dev/null
@@ -0,0 +1,373 @@
+hlsl.semantic.vert
+Shader version: 450
+0:? Sequence
+0:12  Function Definition: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12    Function Parameters: 
+0:12      'ins' (in structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:?     Sequence
+0:14      Branch: Return with expression
+0:14        's' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12  Function Definition: main( (temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Sequence
+0:12        move second child to first child (temp float)
+0:12          clip: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:?           'clip' (layout(location=0 ) in float)
+0:12        move second child to first child (temp float)
+0:12          clip0: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              1 (const int)
+0:?           'clip0' (layout(location=1 ) in float)
+0:12        move second child to first child (temp float)
+0:12          clip7: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              2 (const int)
+0:?           'clip7' (layout(location=2 ) in float)
+0:12        move second child to first child (temp float)
+0:12          cull: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              3 (const int)
+0:?           'cull' (layout(location=3 ) in float)
+0:12        move second child to first child (temp float)
+0:12          cull2: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              4 (const int)
+0:?           'cull2' (layout(location=4 ) in float)
+0:12        move second child to first child (temp float)
+0:12          cull5: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              5 (const int)
+0:?           'cull5' (layout(location=5 ) in float)
+0:12        move second child to first child (temp int)
+0:12          ii: direct index for structure (temp int)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              6 (const int)
+0:?           'ii' (in int InstanceIndex)
+0:12      Sequence
+0:12        move second child to first child (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12          'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12          Function Call: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip7' (out float ClipDistance)
+0:12          clip: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip7' (out float ClipDistance)
+0:12          clip0: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip7' (out float ClipDistance)
+0:12          clip7: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull5' (out float CullDistance)
+0:12          cull: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull5' (out float CullDistance)
+0:12          cull2: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              4 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull5' (out float CullDistance)
+0:12          cull5: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              5 (const int)
+0:12        move second child to first child (temp int)
+0:12          ii: direct index for structure (temp int)
+0:12            '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12          ii: direct index for structure (temp int)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              6 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:?     'clip' (layout(location=0 ) in float)
+0:?     'clip0' (layout(location=1 ) in float)
+0:?     'clip7' (layout(location=2 ) in float)
+0:?     'cull' (layout(location=3 ) in float)
+0:?     'cull2' (layout(location=4 ) in float)
+0:?     'cull5' (layout(location=5 ) in float)
+0:?     'ii' (in int InstanceIndex)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+0:? Sequence
+0:12  Function Definition: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12    Function Parameters: 
+0:12      'ins' (in structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:?     Sequence
+0:14      Branch: Return with expression
+0:14        's' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12  Function Definition: main( (temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Sequence
+0:12        move second child to first child (temp float)
+0:12          clip: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:?           'clip' (layout(location=0 ) in float)
+0:12        move second child to first child (temp float)
+0:12          clip0: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              1 (const int)
+0:?           'clip0' (layout(location=1 ) in float)
+0:12        move second child to first child (temp float)
+0:12          clip7: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              2 (const int)
+0:?           'clip7' (layout(location=2 ) in float)
+0:12        move second child to first child (temp float)
+0:12          cull: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              3 (const int)
+0:?           'cull' (layout(location=3 ) in float)
+0:12        move second child to first child (temp float)
+0:12          cull2: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              4 (const int)
+0:?           'cull2' (layout(location=4 ) in float)
+0:12        move second child to first child (temp float)
+0:12          cull5: direct index for structure (temp float)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              5 (const int)
+0:?           'cull5' (layout(location=5 ) in float)
+0:12        move second child to first child (temp int)
+0:12          ii: direct index for structure (temp int)
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              6 (const int)
+0:?           'ii' (in int InstanceIndex)
+0:12      Sequence
+0:12        move second child to first child (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12          'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12          Function Call: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:?             'ins' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip7' (out float ClipDistance)
+0:12          clip: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip7' (out float ClipDistance)
+0:12          clip0: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_clip7' (out float ClipDistance)
+0:12          clip7: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull5' (out float CullDistance)
+0:12          cull: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull5' (out float CullDistance)
+0:12          cull2: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              4 (const int)
+0:12        move second child to first child (temp float)
+0:?           '@entryPointOutput_cull5' (out float CullDistance)
+0:12          cull5: direct index for structure (temp float)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              5 (const int)
+0:12        move second child to first child (temp int)
+0:12          ii: direct index for structure (temp int)
+0:12            '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:12            Constant:
+0:12              0 (const int)
+0:12          ii: direct index for structure (temp int)
+0:12            'flattenTemp' (temp structure{temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii})
+0:12            Constant:
+0:12              6 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out structure{temp int ii})
+0:?     'clip' (layout(location=0 ) in float)
+0:?     'clip0' (layout(location=1 ) in float)
+0:?     'clip7' (layout(location=2 ) in float)
+0:?     'cull' (layout(location=3 ) in float)
+0:?     'cull2' (layout(location=4 ) in float)
+0:?     'cull5' (layout(location=5 ) in float)
+0:?     'ii' (in int InstanceIndex)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 77
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 21 26 30 34 38 42 47 56 63 72
+                              Name 4  "main"
+                              Name 8  "S"
+                              MemberName 8(S) 0  "clip"
+                              MemberName 8(S) 1  "clip0"
+                              MemberName 8(S) 2  "clip7"
+                              MemberName 8(S) 3  "cull"
+                              MemberName 8(S) 4  "cull2"
+                              MemberName 8(S) 5  "cull5"
+                              MemberName 8(S) 6  "ii"
+                              Name 12  "@main(struct-S-f1-f1-f1-f1-f1-f1-i11;"
+                              Name 11  "ins"
+                              Name 14  "s"
+                              Name 18  "ins"
+                              Name 21  "clip"
+                              Name 26  "clip0"
+                              Name 30  "clip7"
+                              Name 34  "cull"
+                              Name 38  "cull2"
+                              Name 42  "cull5"
+                              Name 47  "ii"
+                              Name 51  "flattenTemp"
+                              Name 52  "param"
+                              Name 56  "@entryPointOutput_clip7"
+                              Name 63  "@entryPointOutput_cull5"
+                              Name 70  "S"
+                              MemberName 70(S) 0  "ii"
+                              Name 72  "@entryPointOutput"
+                              Decorate 21(clip) Location 0
+                              Decorate 26(clip0) Location 1
+                              Decorate 30(clip7) Location 2
+                              Decorate 34(cull) Location 3
+                              Decorate 38(cull2) Location 4
+                              Decorate 42(cull5) Location 5
+                              Decorate 47(ii) BuiltIn InstanceIndex
+                              Decorate 56(@entryPointOutput_clip7) BuiltIn ClipDistance
+                              Decorate 63(@entryPointOutput_cull5) BuiltIn CullDistance
+                              Decorate 72(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeInt 32 1
+            8(S):             TypeStruct 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 7(int)
+               9:             TypePointer Function 8(S)
+              10:             TypeFunction 8(S) 9(ptr)
+              19:      7(int) Constant 0
+              20:             TypePointer Input 6(float)
+        21(clip):     20(ptr) Variable Input
+              23:             TypePointer Function 6(float)
+              25:      7(int) Constant 1
+       26(clip0):     20(ptr) Variable Input
+              29:      7(int) Constant 2
+       30(clip7):     20(ptr) Variable Input
+              33:      7(int) Constant 3
+        34(cull):     20(ptr) Variable Input
+              37:      7(int) Constant 4
+       38(cull2):     20(ptr) Variable Input
+              41:      7(int) Constant 5
+       42(cull5):     20(ptr) Variable Input
+              45:      7(int) Constant 6
+              46:             TypePointer Input 7(int)
+          47(ii):     46(ptr) Variable Input
+              49:             TypePointer Function 7(int)
+              55:             TypePointer Output 6(float)
+56(@entryPointOutput_clip7):     55(ptr) Variable Output
+63(@entryPointOutput_cull5):     55(ptr) Variable Output
+           70(S):             TypeStruct 7(int)
+              71:             TypePointer Output 70(S)
+72(@entryPointOutput):     71(ptr) Variable Output
+              75:             TypePointer Output 7(int)
+         4(main):           2 Function None 3
+               5:             Label
+         18(ins):      9(ptr) Variable Function
+ 51(flattenTemp):      9(ptr) Variable Function
+       52(param):      9(ptr) Variable Function
+              22:    6(float) Load 21(clip)
+              24:     23(ptr) AccessChain 18(ins) 19
+                              Store 24 22
+              27:    6(float) Load 26(clip0)
+              28:     23(ptr) AccessChain 18(ins) 25
+                              Store 28 27
+              31:    6(float) Load 30(clip7)
+              32:     23(ptr) AccessChain 18(ins) 29
+                              Store 32 31
+              35:    6(float) Load 34(cull)
+              36:     23(ptr) AccessChain 18(ins) 33
+                              Store 36 35
+              39:    6(float) Load 38(cull2)
+              40:     23(ptr) AccessChain 18(ins) 37
+                              Store 40 39
+              43:    6(float) Load 42(cull5)
+              44:     23(ptr) AccessChain 18(ins) 41
+                              Store 44 43
+              48:      7(int) Load 47(ii)
+              50:     49(ptr) AccessChain 18(ins) 45
+                              Store 50 48
+              53:        8(S) Load 18(ins)
+                              Store 52(param) 53
+              54:        8(S) FunctionCall 12(@main(struct-S-f1-f1-f1-f1-f1-f1-i11;) 52(param)
+                              Store 51(flattenTemp) 54
+              57:     23(ptr) AccessChain 51(flattenTemp) 19
+              58:    6(float) Load 57
+                              Store 56(@entryPointOutput_clip7) 58
+              59:     23(ptr) AccessChain 51(flattenTemp) 25
+              60:    6(float) Load 59
+                              Store 56(@entryPointOutput_clip7) 60
+              61:     23(ptr) AccessChain 51(flattenTemp) 29
+              62:    6(float) Load 61
+                              Store 56(@entryPointOutput_clip7) 62
+              64:     23(ptr) AccessChain 51(flattenTemp) 33
+              65:    6(float) Load 64
+                              Store 63(@entryPointOutput_cull5) 65
+              66:     23(ptr) AccessChain 51(flattenTemp) 37
+              67:    6(float) Load 66
+                              Store 63(@entryPointOutput_cull5) 67
+              68:     23(ptr) AccessChain 51(flattenTemp) 41
+              69:    6(float) Load 68
+                              Store 63(@entryPointOutput_cull5) 69
+              73:     49(ptr) AccessChain 51(flattenTemp) 45
+              74:      7(int) Load 73
+              76:     75(ptr) AccessChain 72(@entryPointOutput) 19
+                              Store 76 74
+                              Return
+                              FunctionEnd
+12(@main(struct-S-f1-f1-f1-f1-f1-f1-i11;):        8(S) Function None 10
+         11(ins):      9(ptr) FunctionParameter
+              13:             Label
+           14(s):      9(ptr) Variable Function
+              15:        8(S) Load 14(s)
+                              ReturnValue 15
+                              FunctionEnd
diff --git a/Test/hlsl.semantic.geom b/Test/hlsl.semantic.geom
new file mode 100644 (file)
index 0000000..c4d7aba
--- /dev/null
@@ -0,0 +1,15 @@
+struct S {
+    float clip0 : SV_ClipDistance0;
+    float cull0 : SV_CullDistance0;
+    uint vpai   : SV_ViewportArrayIndex;
+    uint rtai   : SV_RenderTargetArrayIndex;
+    int ii      : SV_InstanceID;
+};
+
+[maxvertexcount(4)]
+S main(triangle in uint VertexID[3] : VertexID,
+       inout LineStream<S> OutputStream)
+{
+    S s;
+    return s;
+}
diff --git a/Test/hlsl.semantic.vert b/Test/hlsl.semantic.vert
new file mode 100644 (file)
index 0000000..16bba37
--- /dev/null
@@ -0,0 +1,15 @@
+struct S {
+    float clip  : SV_ClipDistance;
+    float clip0 : SV_ClipDistance0;
+    float clip7 : SV_ClipDistance7;
+    float cull  : SV_CullDistance;
+    float cull2 : SV_CullDistance2;
+    float cull5 : SV_CullDistance5;
+    int ii      : SV_InstanceID;
+};
+
+S main(S ins)
+{
+    S s;
+    return s;
+}
index 9ac587f427338d8377491b7681b98f593c99a1bc..e9a6ac1bb18fb2429bc7982f51077ef462a3fa05 100644 (file)
@@ -218,6 +218,7 @@ enum TBuiltInVariable {
     // to one of the above.
     EbvFragDepthGreater,
     EbvFragDepthLesser,
+    EbvStencilRef,
 
     EbvLast
 };
index 342c5d1fe0548275f63c5e30843aeb03c29e643c..c96734ffb2deb657069fd0e1a9c08e7b909a4d4b 100644 (file)
@@ -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.1887"
-#define GLSLANG_DATE "08-Mar-2017"
+#define GLSLANG_REVISION "Overload400-PrecQual.1892"
+#define GLSLANG_DATE "09-Mar-2017"
index 16c4455769884960d2f4b9b7a55be96d50562080..3ac6585d844e7d0a143aa034a324115da1de5c47 100644 (file)
@@ -240,6 +240,8 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.max.frag", "PixelShaderFunction"},
         {"hlsl.precedence.frag", "PixelShaderFunction"},
         {"hlsl.precedence2.frag", "PixelShaderFunction"},
+        {"hlsl.semantic.geom", "main"},
+        {"hlsl.semantic.vert", "main"},
         {"hlsl.scope.frag", "PixelShaderFunction"},
         {"hlsl.sin.frag", "PixelShaderFunction"},
         {"hlsl.struct.frag", "PixelShaderFunction"},
index 4b4b0de04c07901a38f213eac503a72f60ab27db..fd88c619c58d0d4b2cd0a0192ccd90293dc4f1ef 100755 (executable)
@@ -3401,7 +3401,7 @@ bool HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                 parseContext.handleRegister(registerDesc.loc, qualifier, profile.string, *registerDesc.string, subComponent, spaceDesc.string);
             } else {
                 // semantic, in idToken.string
-                parseContext.handleSemantic(idToken.loc, qualifier, *idToken.string);
+                parseContext.handleSemantic(idToken.loc, qualifier, mapSemantic(*idToken.string));
             }
         } else if (peekTokenClass(EHTokLeftAngle)) {
             found = true;
index 7f751dadfcc08d88ffc3a19a97fa83f67eaeb8cf..0779ec33bd2f20b2fbafdd9c6d2b39af4386b1e7 100755 (executable)
@@ -4194,118 +4194,23 @@ TFunction* HlslParseContext::handleConstructorCall(const TSourceLoc& loc, const
 // Handle seeing a "COLON semantic" at the end of a type declaration,
 // by updating the type according to the semantic.
 //
-void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, const TString& semantic)
-{
-    // TODO: need to know if it's an input or an output
-    // The following sketches what needs to be done, but can't be right
-    // without taking into account stage and input/output.
-
-    TString semanticUpperCase = semantic;
-    std::transform(semanticUpperCase.begin(), semanticUpperCase.end(), semanticUpperCase.begin(), ::toupper);
-    // in DX9, all outputs had to have a semantic associated with them, that was either consumed
-    // by the system or was a specific register assignment
-    // in DX10+, only semantics with the SV_ prefix have any meaning beyond decoration
-    // Fxc will only accept DX9 style semantics in compat mode
-    // Also, in DX10 if a SV value is present as the input of a stage, but isn't appropriate for that
-    // stage, it would just be ignored as it is likely there as part of an output struct from one stage
-    // to the next
-
-    bool bParseDX9 = false;
-    if (bParseDX9) {
-        if (semanticUpperCase == "PSIZE")
-            qualifier.builtIn = EbvPointSize;
-        else if (semantic == "FOG")
-            qualifier.builtIn = EbvFogFragCoord;
-        else if (semanticUpperCase == "DEPTH")
-            qualifier.builtIn = EbvFragDepth;
-        else if (semanticUpperCase == "VFACE")
-            qualifier.builtIn = EbvFace;
-        else if (semanticUpperCase == "VPOS")
-            qualifier.builtIn = EbvFragCoord;
-    }
-
-    // SV Position has a different meaning in vertex vs fragment
-    if (semanticUpperCase == "SV_POSITION" && language != EShLangFragment)
-        qualifier.builtIn = EbvPosition;
-    else if (semanticUpperCase == "SV_POSITION" && language == EShLangFragment)
-        qualifier.builtIn = EbvFragCoord;
-    else if (semanticUpperCase == "SV_CLIPDISTANCE")
-        qualifier.builtIn = EbvClipDistance;
-    else if (semanticUpperCase == "SV_CULLDISTANCE")
-        qualifier.builtIn = EbvCullDistance;
-    else if (semanticUpperCase == "SV_VERTEXID")
-        qualifier.builtIn = EbvVertexIndex;
-    else if (semanticUpperCase == "SV_VIEWPORTARRAYINDEX")
-        qualifier.builtIn = EbvViewportIndex;
-    else if (semanticUpperCase == "SV_TESSFACTOR")
-        qualifier.builtIn = EbvTessLevelOuter;
-
-    // Targets are defined 0-7
-    else if (semanticUpperCase == "SV_TARGET") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 0;
-    } else if (semanticUpperCase == "SV_TARGET0") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 0;
-    } else if (semanticUpperCase == "SV_TARGET1") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 1;
-    } else if (semanticUpperCase == "SV_TARGET2") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 2;
-    } else if (semanticUpperCase == "SV_TARGET3") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 3;
-    } else if (semanticUpperCase == "SV_TARGET4") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 4;
-    } else if (semanticUpperCase == "SV_TARGET5") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 5;
-    } else if (semanticUpperCase == "SV_TARGET6") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 6;
-    } else if (semanticUpperCase == "SV_TARGET7") {
-        qualifier.builtIn = EbvNone;
-        // qualifier.layoutLocation = 7;
-    } else if (semanticUpperCase == "SV_SAMPLEINDEX")
-        qualifier.builtIn = EbvSampleId;
-    else if (semanticUpperCase == "SV_RENDERTARGETARRAYINDEX")
-        qualifier.builtIn = EbvLayer;
-    else if (semanticUpperCase == "SV_PRIMITIVEID")
-        qualifier.builtIn = EbvPrimitiveId;
-    else if (semanticUpperCase == "SV_OUTPUTCONTROLPOINTID")
-        qualifier.builtIn = EbvInvocationId;
-    else if (semanticUpperCase == "SV_ISFRONTFACE")
-        qualifier.builtIn = EbvFace;
-    else if (semanticUpperCase == "SV_INSTANCEID")
-        qualifier.builtIn = EbvInstanceIndex;
-    else if (semanticUpperCase == "SV_INSIDETESSFACTOR")
-        qualifier.builtIn = EbvTessLevelInner;
-    else if (semanticUpperCase == "SV_GSINSTANCEID")
-        qualifier.builtIn = EbvInvocationId;
-    else if (semanticUpperCase == "SV_DISPATCHTHREADID")
-        qualifier.builtIn = EbvGlobalInvocationId;
-    else if (semanticUpperCase == "SV_GROUPTHREADID")
-        qualifier.builtIn = EbvLocalInvocationId;
-    else if (semanticUpperCase == "SV_GROUPINDEX")
-        qualifier.builtIn = EbvLocalInvocationIndex;
-    else if (semanticUpperCase == "SV_GROUPID")
-        qualifier.builtIn = EbvWorkGroupId;
-    else if (semanticUpperCase == "SV_DOMAINLOCATION")
-        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")
-        qualifier.builtIn = EbvFragDepthGreater;
-    else if( semanticUpperCase == "SV_DEPTHLESSEQUAL")
-        qualifier.builtIn = EbvFragDepthLesser;
-    else if( semanticUpperCase == "SV_STENCILREF")
+void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBuiltInVariable builtIn)
+{
+    // adjust for stage in/out
+
+    switch(builtIn) {
+    case EbvPosition:
+        if (language == EShLangFragment)
+            builtIn = EbvFragCoord;
+        break;
+    case EbvStencilRef:
         error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
+        break;
+    default:
+        break;
+    }
+
+    qualifier.builtIn = builtIn;
 }
 
 //
index ecfdaa7c8f5f33d1988f04abecce87c6b81bf5c5..747862f00956db1dccab3908b12a47cdbd6d7963 100755 (executable)
@@ -91,7 +91,7 @@ public:
     TIntermTyped* addOutputArgumentConversions(const TFunction&, TIntermOperator&);
     void builtInOpCheck(const TSourceLoc&, const TFunction&, TIntermOperator&);
     TFunction* handleConstructorCall(const TSourceLoc&, const TType&);
-    void handleSemantic(TSourceLoc, TQualifier&, const TString& semantic);
+    void handleSemantic(TSourceLoc, TQualifier&, TBuiltInVariable);
     void handlePackOffset(const TSourceLoc&, TQualifier&, const glslang::TString& location,
                           const glslang::TString* component);
     void handleRegister(const TSourceLoc&, TQualifier&, const glslang::TString* profile, const glslang::TString& desc,
index a80ee93f8043471bdafc7f866d98621368ef2ee5..297f26396d25ac74279c3a7a4d17ca95cf945b76 100755 (executable)
@@ -47,7 +47,6 @@
 #include "../glslang/MachineIndependent/ParseHelper.h"
 #include "hlslScanContext.h"
 #include "hlslTokens.h"
-//#include "Scan.h"
 
 // preprocessor includes
 #include "../glslang/MachineIndependent/preprocessor/PpContext.h"
@@ -82,6 +81,7 @@ struct str_hash
 // After a single process-level initialization, this is read only and thread safe
 std::unordered_map<const char*, glslang::EHlslTokenClass, str_hash, str_eq>* KeywordMap = nullptr;
 std::unordered_set<const char*, str_hash, str_eq>* ReservedSet = nullptr;
+std::unordered_map<const char*, glslang::TBuiltInVariable, str_hash, str_eq>* SemanticMap = nullptr;
 
 };
 
@@ -381,6 +381,73 @@ void HlslScanContext::fillInKeywordMap()
     ReservedSet->insert("unsigned");
     ReservedSet->insert("using");
     ReservedSet->insert("virtual");
+
+    SemanticMap = new std::unordered_map<const char*, glslang::TBuiltInVariable, str_hash, str_eq>;
+
+    // in DX9, all outputs had to have a semantic associated with them, that was either consumed
+    // by the system or was a specific register assignment
+    // in DX10+, only semantics with the SV_ prefix have any meaning beyond decoration
+    // Fxc will only accept DX9 style semantics in compat mode
+    // Also, in DX10 if a SV value is present as the input of a stage, but isn't appropriate for that
+    // stage, it would just be ignored as it is likely there as part of an output struct from one stage
+    // to the next
+    bool bParseDX9 = false;
+    if (bParseDX9) {
+        (*SemanticMap)["PSIZE"] = EbvPointSize;
+        (*SemanticMap)["FOG"] =   EbvFogFragCoord;
+        (*SemanticMap)["DEPTH"] = EbvFragDepth;
+        (*SemanticMap)["VFACE"] = EbvFace;
+        (*SemanticMap)["VPOS"] =  EbvFragCoord;
+    }
+
+    (*SemanticMap)["SV_POSITION"] =               EbvPosition;
+    (*SemanticMap)["SV_CLIPDISTANCE"] =           EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE0"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE1"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE2"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE3"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE4"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE5"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE6"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE7"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE8"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE9"] =          EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE10"] =         EbvClipDistance;
+    (*SemanticMap)["SV_CLIPDISTANCE11"] =         EbvClipDistance;
+    (*SemanticMap)["SV_CULLDISTANCE"] =           EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE0"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE1"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE2"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE3"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE4"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE5"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE6"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE7"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE8"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE9"] =          EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE10"] =         EbvCullDistance;
+    (*SemanticMap)["SV_CULLDISTANCE11"] =         EbvCullDistance;
+    (*SemanticMap)["SV_VERTEXID"] =               EbvVertexIndex;
+    (*SemanticMap)["SV_VIEWPORTARRAYINDEX"] =     EbvViewportIndex;
+    (*SemanticMap)["SV_TESSFACTOR"] =             EbvTessLevelOuter;
+    (*SemanticMap)["SV_SAMPLEINDEX"] =            EbvSampleId;
+    (*SemanticMap)["SV_RENDERTARGETARRAYINDEX"] = EbvLayer;
+    (*SemanticMap)["SV_PRIMITIVEID"] =            EbvPrimitiveId;
+    (*SemanticMap)["SV_OUTPUTCONTROLPOINTID"] =   EbvInvocationId;
+    (*SemanticMap)["SV_ISFRONTFACE"] =            EbvFace;
+    (*SemanticMap)["SV_INSTANCEID"] =             EbvInstanceIndex;
+    (*SemanticMap)["SV_INSIDETESSFACTOR"] =       EbvTessLevelInner;
+    (*SemanticMap)["SV_GSINSTANCEID"] =           EbvInvocationId;
+    (*SemanticMap)["SV_DISPATCHTHREADID"] =       EbvGlobalInvocationId;
+    (*SemanticMap)["SV_GROUPTHREADID"] =          EbvLocalInvocationId;
+    (*SemanticMap)["SV_GROUPINDEX"] =             EbvLocalInvocationIndex;
+    (*SemanticMap)["SV_GROUPID"] =                EbvWorkGroupId;
+    (*SemanticMap)["SV_DOMAINLOCATION"] =         EbvTessCoord;
+    (*SemanticMap)["SV_DEPTH"] =                  EbvFragDepth;
+    (*SemanticMap)["SV_COVERAGE"] =               EbvSampleMask;
+    (*SemanticMap)["SV_DEPTHGREATEREQUAL"] =      EbvFragDepthGreater;
+    (*SemanticMap)["SV_DEPTHLESSEQUAL"] =         EbvFragDepthLesser;
+    (*SemanticMap)["SV_STENCILREF"] =             EbvStencilRef;
 }
 
 void HlslScanContext::deleteKeywordMap()
@@ -389,15 +456,29 @@ void HlslScanContext::deleteKeywordMap()
     KeywordMap = nullptr;
     delete ReservedSet;
     ReservedSet = nullptr;
+    delete SemanticMap;
+    SemanticMap = nullptr;
 }
 
-// Wrapper for tokenizeClass()"] =  to get everything inside the token.
+// Wrapper for tokenizeClass() to get everything inside the token.
 void HlslScanContext::tokenize(HlslToken& token)
 {
     EHlslTokenClass tokenClass = tokenizeClass(token);
     token.tokenClass = tokenClass;
 }
 
+glslang::TBuiltInVariable HlslScanContext::mapSemantic(const TString& semantic)
+{
+    TString semanticUpperCase = semantic;
+    std::transform(semanticUpperCase.begin(), semanticUpperCase.end(), semanticUpperCase.begin(), ::toupper);
+
+    auto it = SemanticMap->find(semanticUpperCase.c_str());
+    if (it != SemanticMap->end())
+        return it->second;
+    else
+        return glslang::EbvNone;
+}
+
 //
 // Fill in token information for the next token, except for the token class.
 // Returns the enum value of the token class of the next token found.
index b931d9be9bdfbb97aeb891e5bc3c1493172329ee..bb8b09e85dd823036ac8079c52fed133be2441f3 100755 (executable)
@@ -82,6 +82,7 @@ public:
     static void deleteKeywordMap();
 
     void tokenize(HlslToken&);
+    glslang::TBuiltInVariable mapSemantic(const TString& semantic);
 
 protected:
     HlslScanContext(HlslScanContext&);
index 9558998888588e6f012f8f7bde9e893c5bad40b1..70cfc446c3ea6488598c45d97b1d647aed812553 100755 (executable)
@@ -52,6 +52,7 @@ namespace glslang {
         bool acceptTokenClass(EHlslTokenClass);
         EHlslTokenClass peek() const;
         bool peekTokenClass(EHlslTokenClass) const;
+        glslang::TBuiltInVariable mapSemantic(const TString& semantic) { return scanner.mapSemantic(semantic); }
 
     protected:
         HlslToken token;                  // the token we are currently looking at, but have not yet accepted