HLSL: Sampler/texture declarations, method syntax, partial Sample method
authorLoopDawg <nospam@nowhere.net>
Wed, 29 Jun 2016 16:58:58 +0000 (10:58 -0600)
committerLoopDawg <nospam@nowhere.net>
Tue, 12 Jul 2016 21:57:46 +0000 (15:57 -0600)
13 files changed:
.gitignore
Test/baseResults/hlsl.sample.basicdx10.frag.out [new file with mode: 0644]
Test/hlsl.sample.basicdx10.frag [new file with mode: 0644]
glslang/Include/Types.h
glslang/Include/intermediate.h
gtests/Hlsl.FromFile.cpp
hlsl/hlslGrammar.cpp
hlsl/hlslGrammar.h
hlsl/hlslParseHelper.cpp
hlsl/hlslParseHelper.h
hlsl/hlslParseables.cpp
hlsl/hlslScanContext.cpp
hlsl/hlslTokens.h

index 66cbff9..0faf59c 100644 (file)
@@ -3,6 +3,7 @@
 *.so
 *.exe
 tags
+TAGS
 build/
 Test/localResults/
 Test/multiThread.out
diff --git a/Test/baseResults/hlsl.sample.basicdx10.frag.out b/Test/baseResults/hlsl.sample.basicdx10.frag.out
new file mode 100644 (file)
index 0000000..9c64bdf
--- /dev/null
@@ -0,0 +1,768 @@
+hlsl.sample.basicdx10.frag
+WARNING: 0:4: 'immediate sampler state' : unimplemented 
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:91  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:53    Function Parameters: 
+0:?     Sequence
+0:57      move second child to first child (temp int)
+0:57        CalculateLevelOfDetail: direct index for structure (temp int)
+0:57          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:57          Constant:
+0:57            1 (const int)
+0:57        Constant:
+0:57          1 (const int)
+0:58      move second child to first child (temp int)
+0:58        CalculateLevelOfDetailUnclamped: direct index for structure (temp int)
+0:58          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:58          Constant:
+0:58            2 (const int)
+0:58        Constant:
+0:58          1 (const int)
+0:59      move second child to first child (temp int)
+0:59        Gather: direct index for structure (temp int)
+0:59          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:59          Constant:
+0:59            3 (const int)
+0:59        Constant:
+0:59          1 (const int)
+0:60      move second child to first child (temp int)
+0:60        GetDimensions: direct index for structure (temp int)
+0:60          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:60          Constant:
+0:60            4 (const int)
+0:60        Constant:
+0:60          1 (const int)
+0:61      move second child to first child (temp int)
+0:61        GetSamplePosition: direct index for structure (temp int)
+0:61          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:61          Constant:
+0:61            5 (const int)
+0:61        Constant:
+0:61          1 (const int)
+0:62      move second child to first child (temp int)
+0:62        Load: direct index for structure (temp int)
+0:62          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:62          Constant:
+0:62            6 (const int)
+0:62        Constant:
+0:62          1 (const int)
+0:63      move second child to first child (temp int)
+0:63        Sample: direct index for structure (temp int)
+0:63          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:63          Constant:
+0:63            0 (const int)
+0:63        Constant:
+0:63          1 (const int)
+0:64      move second child to first child (temp int)
+0:64        SampleBias: direct index for structure (temp int)
+0:64          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:64          Constant:
+0:64            7 (const int)
+0:64        Constant:
+0:64          1 (const int)
+0:65      move second child to first child (temp int)
+0:65        SampleCmp: direct index for structure (temp int)
+0:65          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:65          Constant:
+0:65            8 (const int)
+0:65        Constant:
+0:65          1 (const int)
+0:66      move second child to first child (temp int)
+0:66        SampleCmpLevelZero: direct index for structure (temp int)
+0:66          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:66          Constant:
+0:66            9 (const int)
+0:66        Constant:
+0:66          1 (const int)
+0:67      move second child to first child (temp int)
+0:67        SampleGrad: direct index for structure (temp int)
+0:67          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:67          Constant:
+0:67            10 (const int)
+0:67        Constant:
+0:67          1 (const int)
+0:68      move second child to first child (temp int)
+0:68        SampleLevel: direct index for structure (temp int)
+0:68          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:68          Constant:
+0:68            11 (const int)
+0:68        Constant:
+0:68          1 (const int)
+0:70      Sequence
+0:70        move second child to first child (temp 4-component vector of float)
+0:70          'txval10' (temp 4-component vector of float)
+0:70          texture (global 4-component vector of float)
+0:70            Construct combined texture-sampler (temp sampler1D)
+0:70              'g_tTex1df4' (uniform texture1D)
+0:70              'g_sSamp' (uniform sampler)
+0:70            Constant:
+0:70              0.100000
+0:71      Sequence
+0:71        move second child to first child (temp 4-component vector of int)
+0:71          'txval11' (temp 4-component vector of int)
+0:71          texture (global 4-component vector of int)
+0:71            Construct combined texture-sampler (temp isampler1D)
+0:71              'g_tTex1di4' (uniform itexture1D)
+0:71              'g_sSamp' (uniform sampler)
+0:71            Constant:
+0:71              0.200000
+0:72      Sequence
+0:72        move second child to first child (temp 4-component vector of uint)
+0:72          'txval12' (temp 4-component vector of uint)
+0:72          texture (global 4-component vector of uint)
+0:72            Construct combined texture-sampler (temp usampler1D)
+0:72              'g_tTex1du4' (uniform utexture1D)
+0:72              'g_sSamp' (uniform sampler)
+0:72            Constant:
+0:72              0.300000
+0:74      Sequence
+0:74        move second child to first child (temp 4-component vector of float)
+0:74          'txval20' (temp 4-component vector of float)
+0:74          texture (global 4-component vector of float)
+0:74            Construct combined texture-sampler (temp sampler2D)
+0:74              'g_tTex2df4' (uniform texture2D)
+0:74              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.100000
+0:?               0.200000
+0:75      Sequence
+0:75        move second child to first child (temp 4-component vector of int)
+0:75          'txval21' (temp 4-component vector of int)
+0:75          texture (global 4-component vector of int)
+0:75            Construct combined texture-sampler (temp isampler2D)
+0:75              'g_tTex2di4' (uniform itexture2D)
+0:75              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.300000
+0:?               0.400000
+0:76      Sequence
+0:76        move second child to first child (temp 4-component vector of uint)
+0:76          'txval22' (temp 4-component vector of uint)
+0:76          texture (global 4-component vector of uint)
+0:76            Construct combined texture-sampler (temp usampler2D)
+0:76              'g_tTex2du4' (uniform utexture2D)
+0:76              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:78      Sequence
+0:78        move second child to first child (temp 4-component vector of float)
+0:78          'txval30' (temp 4-component vector of float)
+0:78          texture (global 4-component vector of float)
+0:78            Construct combined texture-sampler (temp sampler3D)
+0:78              'g_tTex3df4' (uniform texture3D)
+0:78              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.100000
+0:?               0.200000
+0:?               0.300000
+0:79      Sequence
+0:79        move second child to first child (temp 4-component vector of int)
+0:79          'txval31' (temp 4-component vector of int)
+0:79          texture (global 4-component vector of int)
+0:79            Construct combined texture-sampler (temp isampler3D)
+0:79              'g_tTex3di4' (uniform itexture3D)
+0:79              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.400000
+0:?               0.500000
+0:?               0.600000
+0:80      Sequence
+0:80        move second child to first child (temp 4-component vector of uint)
+0:80          'txval32' (temp 4-component vector of uint)
+0:80          texture (global 4-component vector of uint)
+0:80            Construct combined texture-sampler (temp usampler3D)
+0:80              'g_tTex3du4' (uniform utexture3D)
+0:80              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.700000
+0:?               0.800000
+0:?               0.900000
+0:82      Sequence
+0:82        move second child to first child (temp 4-component vector of float)
+0:82          'txval40' (temp 4-component vector of float)
+0:82          texture (global 4-component vector of float)
+0:82            Construct combined texture-sampler (temp samplerCube)
+0:82              'g_tTexcdf4' (uniform textureCube)
+0:82              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.100000
+0:?               0.200000
+0:?               0.300000
+0:83      Sequence
+0:83        move second child to first child (temp 4-component vector of int)
+0:83          'txval41' (temp 4-component vector of int)
+0:83          texture (global 4-component vector of int)
+0:83            Construct combined texture-sampler (temp isamplerCube)
+0:83              'g_tTexcdi4' (uniform itextureCube)
+0:83              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.400000
+0:?               0.500000
+0:?               0.600000
+0:84      Sequence
+0:84        move second child to first child (temp 4-component vector of uint)
+0:84          'txval42' (temp 4-component vector of uint)
+0:84          texture (global 4-component vector of uint)
+0:84            Construct combined texture-sampler (temp usamplerCube)
+0:84              'g_tTexcdu4' (uniform utextureCube)
+0:84              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.700000
+0:?               0.800000
+0:?               0.900000
+0:87      move second child to first child (temp float)
+0:87        Depth: direct index for structure (temp float FragDepth)
+0:87          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:87          Constant:
+0:87            1 (const int)
+0:87        Constant:
+0:87          1.000000
+0:89      Branch: Return with expression
+0:89        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_sSamp2D_b' (uniform sampler)
+0:?     'g_tTex1df4a' (uniform texture1D)
+0:?     'g_tTex1df4' (uniform texture1D)
+0:?     'g_tTex1di4' (uniform itexture1D)
+0:?     'g_tTex1du4' (uniform utexture1D)
+0:?     'g_tTex2df4' (uniform texture2D)
+0:?     'g_tTex2di4' (uniform itexture2D)
+0:?     'g_tTex2du4' (uniform utexture2D)
+0:?     'g_tTex3df4' (uniform texture3D)
+0:?     'g_tTex3di4' (uniform itexture3D)
+0:?     'g_tTex3du4' (uniform utexture3D)
+0:?     'g_tTexcdf4' (uniform textureCube)
+0:?     'g_tTexcdi4' (uniform itextureCube)
+0:?     'g_tTexcdu4' (uniform utextureCube)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:91  Function Definition: main( (global structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:53    Function Parameters: 
+0:?     Sequence
+0:57      move second child to first child (temp int)
+0:57        CalculateLevelOfDetail: direct index for structure (temp int)
+0:57          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:57          Constant:
+0:57            1 (const int)
+0:57        Constant:
+0:57          1 (const int)
+0:58      move second child to first child (temp int)
+0:58        CalculateLevelOfDetailUnclamped: direct index for structure (temp int)
+0:58          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:58          Constant:
+0:58            2 (const int)
+0:58        Constant:
+0:58          1 (const int)
+0:59      move second child to first child (temp int)
+0:59        Gather: direct index for structure (temp int)
+0:59          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:59          Constant:
+0:59            3 (const int)
+0:59        Constant:
+0:59          1 (const int)
+0:60      move second child to first child (temp int)
+0:60        GetDimensions: direct index for structure (temp int)
+0:60          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:60          Constant:
+0:60            4 (const int)
+0:60        Constant:
+0:60          1 (const int)
+0:61      move second child to first child (temp int)
+0:61        GetSamplePosition: direct index for structure (temp int)
+0:61          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:61          Constant:
+0:61            5 (const int)
+0:61        Constant:
+0:61          1 (const int)
+0:62      move second child to first child (temp int)
+0:62        Load: direct index for structure (temp int)
+0:62          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:62          Constant:
+0:62            6 (const int)
+0:62        Constant:
+0:62          1 (const int)
+0:63      move second child to first child (temp int)
+0:63        Sample: direct index for structure (temp int)
+0:63          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:63          Constant:
+0:63            0 (const int)
+0:63        Constant:
+0:63          1 (const int)
+0:64      move second child to first child (temp int)
+0:64        SampleBias: direct index for structure (temp int)
+0:64          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:64          Constant:
+0:64            7 (const int)
+0:64        Constant:
+0:64          1 (const int)
+0:65      move second child to first child (temp int)
+0:65        SampleCmp: direct index for structure (temp int)
+0:65          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:65          Constant:
+0:65            8 (const int)
+0:65        Constant:
+0:65          1 (const int)
+0:66      move second child to first child (temp int)
+0:66        SampleCmpLevelZero: direct index for structure (temp int)
+0:66          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:66          Constant:
+0:66            9 (const int)
+0:66        Constant:
+0:66          1 (const int)
+0:67      move second child to first child (temp int)
+0:67        SampleGrad: direct index for structure (temp int)
+0:67          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:67          Constant:
+0:67            10 (const int)
+0:67        Constant:
+0:67          1 (const int)
+0:68      move second child to first child (temp int)
+0:68        SampleLevel: direct index for structure (temp int)
+0:68          'mtest' (temp structure{temp int Sample, temp int CalculateLevelOfDetail, temp int CalculateLevelOfDetailUnclamped, temp int Gather, temp int GetDimensions, temp int GetSamplePosition, temp int Load, temp int SampleBias, temp int SampleCmp, temp int SampleCmpLevelZero, temp int SampleGrad, temp int SampleLevel})
+0:68          Constant:
+0:68            11 (const int)
+0:68        Constant:
+0:68          1 (const int)
+0:70      Sequence
+0:70        move second child to first child (temp 4-component vector of float)
+0:70          'txval10' (temp 4-component vector of float)
+0:70          texture (global 4-component vector of float)
+0:70            Construct combined texture-sampler (temp sampler1D)
+0:70              'g_tTex1df4' (uniform texture1D)
+0:70              'g_sSamp' (uniform sampler)
+0:70            Constant:
+0:70              0.100000
+0:71      Sequence
+0:71        move second child to first child (temp 4-component vector of int)
+0:71          'txval11' (temp 4-component vector of int)
+0:71          texture (global 4-component vector of int)
+0:71            Construct combined texture-sampler (temp isampler1D)
+0:71              'g_tTex1di4' (uniform itexture1D)
+0:71              'g_sSamp' (uniform sampler)
+0:71            Constant:
+0:71              0.200000
+0:72      Sequence
+0:72        move second child to first child (temp 4-component vector of uint)
+0:72          'txval12' (temp 4-component vector of uint)
+0:72          texture (global 4-component vector of uint)
+0:72            Construct combined texture-sampler (temp usampler1D)
+0:72              'g_tTex1du4' (uniform utexture1D)
+0:72              'g_sSamp' (uniform sampler)
+0:72            Constant:
+0:72              0.300000
+0:74      Sequence
+0:74        move second child to first child (temp 4-component vector of float)
+0:74          'txval20' (temp 4-component vector of float)
+0:74          texture (global 4-component vector of float)
+0:74            Construct combined texture-sampler (temp sampler2D)
+0:74              'g_tTex2df4' (uniform texture2D)
+0:74              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.100000
+0:?               0.200000
+0:75      Sequence
+0:75        move second child to first child (temp 4-component vector of int)
+0:75          'txval21' (temp 4-component vector of int)
+0:75          texture (global 4-component vector of int)
+0:75            Construct combined texture-sampler (temp isampler2D)
+0:75              'g_tTex2di4' (uniform itexture2D)
+0:75              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.300000
+0:?               0.400000
+0:76      Sequence
+0:76        move second child to first child (temp 4-component vector of uint)
+0:76          'txval22' (temp 4-component vector of uint)
+0:76          texture (global 4-component vector of uint)
+0:76            Construct combined texture-sampler (temp usampler2D)
+0:76              'g_tTex2du4' (uniform utexture2D)
+0:76              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:78      Sequence
+0:78        move second child to first child (temp 4-component vector of float)
+0:78          'txval30' (temp 4-component vector of float)
+0:78          texture (global 4-component vector of float)
+0:78            Construct combined texture-sampler (temp sampler3D)
+0:78              'g_tTex3df4' (uniform texture3D)
+0:78              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.100000
+0:?               0.200000
+0:?               0.300000
+0:79      Sequence
+0:79        move second child to first child (temp 4-component vector of int)
+0:79          'txval31' (temp 4-component vector of int)
+0:79          texture (global 4-component vector of int)
+0:79            Construct combined texture-sampler (temp isampler3D)
+0:79              'g_tTex3di4' (uniform itexture3D)
+0:79              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.400000
+0:?               0.500000
+0:?               0.600000
+0:80      Sequence
+0:80        move second child to first child (temp 4-component vector of uint)
+0:80          'txval32' (temp 4-component vector of uint)
+0:80          texture (global 4-component vector of uint)
+0:80            Construct combined texture-sampler (temp usampler3D)
+0:80              'g_tTex3du4' (uniform utexture3D)
+0:80              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.700000
+0:?               0.800000
+0:?               0.900000
+0:82      Sequence
+0:82        move second child to first child (temp 4-component vector of float)
+0:82          'txval40' (temp 4-component vector of float)
+0:82          texture (global 4-component vector of float)
+0:82            Construct combined texture-sampler (temp samplerCube)
+0:82              'g_tTexcdf4' (uniform textureCube)
+0:82              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.100000
+0:?               0.200000
+0:?               0.300000
+0:83      Sequence
+0:83        move second child to first child (temp 4-component vector of int)
+0:83          'txval41' (temp 4-component vector of int)
+0:83          texture (global 4-component vector of int)
+0:83            Construct combined texture-sampler (temp isamplerCube)
+0:83              'g_tTexcdi4' (uniform itextureCube)
+0:83              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.400000
+0:?               0.500000
+0:?               0.600000
+0:84      Sequence
+0:84        move second child to first child (temp 4-component vector of uint)
+0:84          'txval42' (temp 4-component vector of uint)
+0:84          texture (global 4-component vector of uint)
+0:84            Construct combined texture-sampler (temp usamplerCube)
+0:84              'g_tTexcdu4' (uniform utextureCube)
+0:84              'g_sSamp' (uniform sampler)
+0:?             Constant:
+0:?               0.700000
+0:?               0.800000
+0:?               0.900000
+0:87      move second child to first child (temp float)
+0:87        Depth: direct index for structure (temp float FragDepth)
+0:87          'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:87          Constant:
+0:87            1 (const int)
+0:87        Constant:
+0:87          1.000000
+0:89      Branch: Return with expression
+0:89        'psout' (temp structure{temp 4-component vector of float Color, temp float FragDepth Depth})
+0:?   Linker Objects
+0:?     'g_sSamp' (uniform sampler)
+0:?     'g_sSamp2d' (uniform sampler)
+0:?     'g_sSamp2D_b' (uniform sampler)
+0:?     'g_tTex1df4a' (uniform texture1D)
+0:?     'g_tTex1df4' (uniform texture1D)
+0:?     'g_tTex1di4' (uniform itexture1D)
+0:?     'g_tTex1du4' (uniform utexture1D)
+0:?     'g_tTex2df4' (uniform texture2D)
+0:?     'g_tTex2di4' (uniform itexture2D)
+0:?     'g_tTex2du4' (uniform utexture2D)
+0:?     'g_tTex3df4' (uniform texture3D)
+0:?     'g_tTex3di4' (uniform itexture3D)
+0:?     'g_tTex3du4' (uniform utexture3D)
+0:?     'g_tTexcdf4' (uniform textureCube)
+0:?     'g_tTexcdi4' (uniform itextureCube)
+0:?     'g_tTexcdu4' (uniform utextureCube)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 182
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "main"
+                              Name 7  "MemberTest"
+                              MemberName 7(MemberTest) 0  "Sample"
+                              MemberName 7(MemberTest) 1  "CalculateLevelOfDetail"
+                              MemberName 7(MemberTest) 2  "CalculateLevelOfDetailUnclamped"
+                              MemberName 7(MemberTest) 3  "Gather"
+                              MemberName 7(MemberTest) 4  "GetDimensions"
+                              MemberName 7(MemberTest) 5  "GetSamplePosition"
+                              MemberName 7(MemberTest) 6  "Load"
+                              MemberName 7(MemberTest) 7  "SampleBias"
+                              MemberName 7(MemberTest) 8  "SampleCmp"
+                              MemberName 7(MemberTest) 9  "SampleCmpLevelZero"
+                              MemberName 7(MemberTest) 10  "SampleGrad"
+                              MemberName 7(MemberTest) 11  "SampleLevel"
+                              Name 9  "mtest"
+                              Name 38  "txval10"
+                              Name 41  "g_tTex1df4"
+                              Name 45  "g_sSamp"
+                              Name 53  "txval11"
+                              Name 56  "g_tTex1di4"
+                              Name 66  "txval12"
+                              Name 69  "g_tTex1du4"
+                              Name 76  "txval20"
+                              Name 79  "g_tTex2df4"
+                              Name 87  "txval21"
+                              Name 90  "g_tTex2di4"
+                              Name 98  "txval22"
+                              Name 101  "g_tTex2du4"
+                              Name 110  "txval30"
+                              Name 113  "g_tTex3df4"
+                              Name 121  "txval31"
+                              Name 124  "g_tTex3di4"
+                              Name 131  "txval32"
+                              Name 134  "g_tTex3du4"
+                              Name 144  "txval40"
+                              Name 147  "g_tTexcdf4"
+                              Name 153  "txval41"
+                              Name 156  "g_tTexcdi4"
+                              Name 162  "txval42"
+                              Name 165  "g_tTexcdu4"
+                              Name 171  "PS_OUTPUT"
+                              MemberName 171(PS_OUTPUT) 0  "Color"
+                              MemberName 171(PS_OUTPUT) 1  "Depth"
+                              Name 173  "psout"
+                              Name 179  "g_sSamp2d"
+                              Name 180  "g_sSamp2D_b"
+                              Name 181  "g_tTex1df4a"
+                              Decorate 41(g_tTex1df4) DescriptorSet 0
+                              Decorate 45(g_sSamp) DescriptorSet 0
+                              Decorate 56(g_tTex1di4) DescriptorSet 0
+                              Decorate 69(g_tTex1du4) DescriptorSet 0
+                              Decorate 79(g_tTex2df4) DescriptorSet 0
+                              Decorate 90(g_tTex2di4) DescriptorSet 0
+                              Decorate 101(g_tTex2du4) DescriptorSet 0
+                              Decorate 113(g_tTex3df4) DescriptorSet 0
+                              Decorate 124(g_tTex3di4) DescriptorSet 0
+                              Decorate 134(g_tTex3du4) DescriptorSet 0
+                              Decorate 147(g_tTexcdf4) DescriptorSet 0
+                              Decorate 156(g_tTexcdi4) DescriptorSet 0
+                              Decorate 165(g_tTexcdu4) DescriptorSet 0
+                              MemberDecorate 171(PS_OUTPUT) 1 BuiltIn FragDepth
+                              Decorate 179(g_sSamp2d) DescriptorSet 0
+                              Decorate 180(g_sSamp2D_b) DescriptorSet 0
+                              Decorate 181(g_tTex1df4a) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+   7(MemberTest):             TypeStruct 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int) 6(int)
+               8:             TypePointer Function 7(MemberTest)
+              10:      6(int) Constant 1
+              11:             TypePointer Function 6(int)
+              13:      6(int) Constant 2
+              15:      6(int) Constant 3
+              17:      6(int) Constant 4
+              19:      6(int) Constant 5
+              21:      6(int) Constant 6
+              23:      6(int) Constant 0
+              25:      6(int) Constant 7
+              27:      6(int) Constant 8
+              29:      6(int) Constant 9
+              31:      6(int) Constant 10
+              33:      6(int) Constant 11
+              35:             TypeFloat 32
+              36:             TypeVector 35(float) 4
+              37:             TypePointer Function 36(fvec4)
+              39:             TypeImage 35(float) 1D sampled format:Unknown
+              40:             TypePointer UniformConstant 39
+  41(g_tTex1df4):     40(ptr) Variable UniformConstant
+              43:             TypeSampler
+              44:             TypePointer UniformConstant 43
+     45(g_sSamp):     44(ptr) Variable UniformConstant
+              47:             TypeSampledImage 39
+              49:   35(float) Constant 1036831949
+              51:             TypeVector 6(int) 4
+              52:             TypePointer Function 51(ivec4)
+              54:             TypeImage 6(int) 1D sampled format:Unknown
+              55:             TypePointer UniformConstant 54
+  56(g_tTex1di4):     55(ptr) Variable UniformConstant
+              59:             TypeSampledImage 54
+              61:   35(float) Constant 1045220557
+              63:             TypeInt 32 0
+              64:             TypeVector 63(int) 4
+              65:             TypePointer Function 64(ivec4)
+              67:             TypeImage 63(int) 1D sampled format:Unknown
+              68:             TypePointer UniformConstant 67
+  69(g_tTex1du4):     68(ptr) Variable UniformConstant
+              72:             TypeSampledImage 67
+              74:   35(float) Constant 1050253722
+              77:             TypeImage 35(float) 2D sampled format:Unknown
+              78:             TypePointer UniformConstant 77
+  79(g_tTex2df4):     78(ptr) Variable UniformConstant
+              82:             TypeSampledImage 77
+              84:             TypeVector 35(float) 2
+              85:   84(fvec2) ConstantComposite 49 61
+              88:             TypeImage 6(int) 2D sampled format:Unknown
+              89:             TypePointer UniformConstant 88
+  90(g_tTex2di4):     89(ptr) Variable UniformConstant
+              93:             TypeSampledImage 88
+              95:   35(float) Constant 1053609165
+              96:   84(fvec2) ConstantComposite 74 95
+              99:             TypeImage 63(int) 2D sampled format:Unknown
+             100:             TypePointer UniformConstant 99
+ 101(g_tTex2du4):    100(ptr) Variable UniformConstant
+             104:             TypeSampledImage 99
+             106:   35(float) Constant 1056964608
+             107:   35(float) Constant 1058642330
+             108:   84(fvec2) ConstantComposite 106 107
+             111:             TypeImage 35(float) 3D sampled format:Unknown
+             112:             TypePointer UniformConstant 111
+ 113(g_tTex3df4):    112(ptr) Variable UniformConstant
+             116:             TypeSampledImage 111
+             118:             TypeVector 35(float) 3
+             119:  118(fvec3) ConstantComposite 49 61 74
+             122:             TypeImage 6(int) 3D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex3di4):    123(ptr) Variable UniformConstant
+             127:             TypeSampledImage 122
+             129:  118(fvec3) ConstantComposite 95 106 107
+             132:             TypeImage 63(int) 3D sampled format:Unknown
+             133:             TypePointer UniformConstant 132
+ 134(g_tTex3du4):    133(ptr) Variable UniformConstant
+             137:             TypeSampledImage 132
+             139:   35(float) Constant 1060320051
+             140:   35(float) Constant 1061997773
+             141:   35(float) Constant 1063675494
+             142:  118(fvec3) ConstantComposite 139 140 141
+             145:             TypeImage 35(float) Cube sampled format:Unknown
+             146:             TypePointer UniformConstant 145
+ 147(g_tTexcdf4):    146(ptr) Variable UniformConstant
+             150:             TypeSampledImage 145
+             154:             TypeImage 6(int) Cube sampled format:Unknown
+             155:             TypePointer UniformConstant 154
+ 156(g_tTexcdi4):    155(ptr) Variable UniformConstant
+             159:             TypeSampledImage 154
+             163:             TypeImage 63(int) Cube sampled format:Unknown
+             164:             TypePointer UniformConstant 163
+ 165(g_tTexcdu4):    164(ptr) Variable UniformConstant
+             168:             TypeSampledImage 163
+  171(PS_OUTPUT):             TypeStruct 36(fvec4) 35(float)
+             172:             TypePointer Function 171(PS_OUTPUT)
+             174:   35(float) Constant 1065353216
+             175:             TypePointer Function 35(float)
+  179(g_sSamp2d):     44(ptr) Variable UniformConstant
+180(g_sSamp2D_b):     44(ptr) Variable UniformConstant
+181(g_tTex1df4a):     40(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+        9(mtest):      8(ptr) Variable Function
+     38(txval10):     37(ptr) Variable Function
+     53(txval11):     52(ptr) Variable Function
+     66(txval12):     65(ptr) Variable Function
+     76(txval20):     37(ptr) Variable Function
+     87(txval21):     52(ptr) Variable Function
+     98(txval22):     65(ptr) Variable Function
+    110(txval30):     37(ptr) Variable Function
+    121(txval31):     52(ptr) Variable Function
+    131(txval32):     65(ptr) Variable Function
+    144(txval40):     37(ptr) Variable Function
+    153(txval41):     52(ptr) Variable Function
+    162(txval42):     65(ptr) Variable Function
+      173(psout):    172(ptr) Variable Function
+              12:     11(ptr) AccessChain 9(mtest) 10
+                              Store 12 10
+              14:     11(ptr) AccessChain 9(mtest) 13
+                              Store 14 10
+              16:     11(ptr) AccessChain 9(mtest) 15
+                              Store 16 10
+              18:     11(ptr) AccessChain 9(mtest) 17
+                              Store 18 10
+              20:     11(ptr) AccessChain 9(mtest) 19
+                              Store 20 10
+              22:     11(ptr) AccessChain 9(mtest) 21
+                              Store 22 10
+              24:     11(ptr) AccessChain 9(mtest) 23
+                              Store 24 10
+              26:     11(ptr) AccessChain 9(mtest) 25
+                              Store 26 10
+              28:     11(ptr) AccessChain 9(mtest) 27
+                              Store 28 10
+              30:     11(ptr) AccessChain 9(mtest) 29
+                              Store 30 10
+              32:     11(ptr) AccessChain 9(mtest) 31
+                              Store 32 10
+              34:     11(ptr) AccessChain 9(mtest) 33
+                              Store 34 10
+              42:          39 Load 41(g_tTex1df4)
+              46:          43 Load 45(g_sSamp)
+              48:          47 SampledImage 42 46
+              50:   36(fvec4) ImageSampleImplicitLod 48 49
+                              Store 38(txval10) 50
+              57:          54 Load 56(g_tTex1di4)
+              58:          43 Load 45(g_sSamp)
+              60:          59 SampledImage 57 58
+              62:   51(ivec4) ImageSampleImplicitLod 60 61
+                              Store 53(txval11) 62
+              70:          67 Load 69(g_tTex1du4)
+              71:          43 Load 45(g_sSamp)
+              73:          72 SampledImage 70 71
+              75:   64(ivec4) ImageSampleImplicitLod 73 74
+                              Store 66(txval12) 75
+              80:          77 Load 79(g_tTex2df4)
+              81:          43 Load 45(g_sSamp)
+              83:          82 SampledImage 80 81
+              86:   36(fvec4) ImageSampleImplicitLod 83 85
+                              Store 76(txval20) 86
+              91:          88 Load 90(g_tTex2di4)
+              92:          43 Load 45(g_sSamp)
+              94:          93 SampledImage 91 92
+              97:   51(ivec4) ImageSampleImplicitLod 94 96
+                              Store 87(txval21) 97
+             102:          99 Load 101(g_tTex2du4)
+             103:          43 Load 45(g_sSamp)
+             105:         104 SampledImage 102 103
+             109:   64(ivec4) ImageSampleImplicitLod 105 108
+                              Store 98(txval22) 109
+             114:         111 Load 113(g_tTex3df4)
+             115:          43 Load 45(g_sSamp)
+             117:         116 SampledImage 114 115
+             120:   36(fvec4) ImageSampleImplicitLod 117 119
+                              Store 110(txval30) 120
+             125:         122 Load 124(g_tTex3di4)
+             126:          43 Load 45(g_sSamp)
+             128:         127 SampledImage 125 126
+             130:   51(ivec4) ImageSampleImplicitLod 128 129
+                              Store 121(txval31) 130
+             135:         132 Load 134(g_tTex3du4)
+             136:          43 Load 45(g_sSamp)
+             138:         137 SampledImage 135 136
+             143:   64(ivec4) ImageSampleImplicitLod 138 142
+                              Store 131(txval32) 143
+             148:         145 Load 147(g_tTexcdf4)
+             149:          43 Load 45(g_sSamp)
+             151:         150 SampledImage 148 149
+             152:   36(fvec4) ImageSampleImplicitLod 151 119
+                              Store 144(txval40) 152
+             157:         154 Load 156(g_tTexcdi4)
+             158:          43 Load 45(g_sSamp)
+             160:         159 SampledImage 157 158
+             161:   51(ivec4) ImageSampleImplicitLod 160 129
+                              Store 153(txval41) 161
+             166:         163 Load 165(g_tTexcdu4)
+             167:          43 Load 45(g_sSamp)
+             169:         168 SampledImage 166 167
+             170:   64(ivec4) ImageSampleImplicitLod 169 142
+                              Store 162(txval42) 170
+             176:    175(ptr) AccessChain 173(psout) 10
+                              Store 176 174
+             177:171(PS_OUTPUT) Load 173(psout)
+                              ReturnValue 177
+                              FunctionEnd
diff --git a/Test/hlsl.sample.basicdx10.frag b/Test/hlsl.sample.basicdx10.frag
new file mode 100644 (file)
index 0000000..03e83ef
--- /dev/null
@@ -0,0 +1,90 @@
+SamplerState       g_sSamp : register(s0);
+uniform sampler2D          g_sSamp2d
+{
+    AddressU = MIRROR;
+    AddressV = WRAP;
+    MinLOD = 0;
+    MaxLOD = 10;
+    MaxAnisotropy = 2;
+    MipLodBias = 0.2;
+}, g_sSamp2D_b;
+
+Texture1D          g_tTex1df4a : register(t1);
+
+uniform Texture1D <float4> g_tTex1df4 : register(t0);
+Texture1D <int4>   g_tTex1di4;
+Texture1D <uint4>  g_tTex1du4;
+
+Texture2D <float4> g_tTex2df4;
+Texture2D <int4>   g_tTex2di4;
+Texture2D <uint4>  g_tTex2du4;
+
+Texture3D <float4> g_tTex3df4;
+Texture3D <int4>   g_tTex3di4;
+Texture3D <uint4>  g_tTex3du4;
+
+TextureCube <float4> g_tTexcdf4;
+TextureCube <int4>   g_tTexcdi4;
+TextureCube <uint4>  g_tTexcdu4;
+
+struct MemberTest
+{
+    int Sample;                          // in HLSL, method names are valid struct members.
+    int CalculateLevelOfDetail;          // ...
+    int CalculateLevelOfDetailUnclamped; // ...
+    int Gather;                          // ...
+    int GetDimensions;                   // ...
+    int GetSamplePosition;               // ...
+    int Load;                            // ...
+    int SampleBias;                      // ...
+    int SampleCmp;                       // ...
+    int SampleCmpLevelZero;              // ...
+    int SampleGrad;                      // ...
+    int SampleLevel;                     // ...
+};
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   MemberTest mtest;
+   mtest.CalculateLevelOfDetail = 1;          // in HLSL, method names are valid struct members.
+   mtest.CalculateLevelOfDetailUnclamped = 1; // ...
+   mtest.Gather = 1;                          // ...
+   mtest.GetDimensions = 1;                   // ...
+   mtest.GetSamplePosition = 1;               // ...
+   mtest.Load = 1;                            // ...
+   mtest.Sample = 1;                          // ...
+   mtest.SampleBias = 1;                      // ...
+   mtest.SampleCmp = 1;                       // ...
+   mtest.SampleCmpLevelZero = 1;              // ...
+   mtest.SampleGrad = 1;                      // ...
+   mtest.SampleLevel = 1;                     // ...
+
+   float4 txval10 = g_tTex1df4 . Sample(g_sSamp, 0.1);
+   int4   txval11 = g_tTex1di4 . Sample(g_sSamp, 0.2);
+   uint4  txval12 = g_tTex1du4 . Sample(g_sSamp, 0.3);
+
+   float4 txval20 = g_tTex2df4 . Sample(g_sSamp, float2(0.1, 0.2));
+   int4   txval21 = g_tTex2di4 . Sample(g_sSamp, float2(0.3, 0.4));
+   uint4  txval22 = g_tTex2du4 . Sample(g_sSamp, float2(0.5, 0.6));
+
+   float4 txval30 = g_tTex3df4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval31 = g_tTex3di4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval32 = g_tTex3du4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   float4 txval40 = g_tTexcdf4 . Sample(g_sSamp, float3(0.1, 0.2, 0.3));
+   int4   txval41 = g_tTexcdi4 . Sample(g_sSamp, float3(0.4, 0.5, 0.6));
+   uint4  txval42 = g_tTexcdu4 . Sample(g_sSamp, float3(0.7, 0.8, 0.9));
+
+   psout.Color = 1.0;
+   psout.Depth = 1.0;
+
+   return psout;
+}
index cdf8200..59bbe9f 100644 (file)
@@ -84,6 +84,7 @@ struct TSampler {   // misnomer now; includes images, textures without sampler,
     bool isCombined()    const { return combined; }
     bool isPureSampler() const { return sampler; }
     bool isTexture()     const { return !sampler && !image; }
+    bool isShadow()      const { return shadow; }
 
     void clear()
     {
@@ -1080,6 +1081,15 @@ public:
                                     typeName = NewPoolTString(p.userDef->getTypeName().c_str());
                                 }
                             }
+    // for construction of sampler types
+    TType(const TSampler& sampler, TStorageQualifier q = EvqUniform, TArraySizes* as = nullptr) :
+        basicType(EbtSampler), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false),
+        arraySizes(as), structure(nullptr), fieldName(nullptr), typeName(nullptr),
+        sampler(sampler)
+    {
+        qualifier.clear();
+        qualifier.storage = q;
+    }
     // to efficiently make a dereferenced type
     // without ever duplicating the outer structure that will be thrown away
     // and using only shallow copy
index d9982a3..29006aa 100644 (file)
@@ -525,6 +525,8 @@ enum TOperator {
     EOpLit,                              // HLSL lighting coefficient vector
     EOpTextureBias,                      // HLSL texture bias: will be lowered to EOpTexture
     EOpAsDouble,                         // slightly different from EOpUint64BitsToDouble
+
+    EOpMethodSample,
 };
 
 class TIntermTraverser;
index a004419..2acbfc4 100644 (file)
@@ -93,6 +93,7 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
         {"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.negative.vert", "VertexShaderFunction"},
+        {"hlsl.sample.basicdx10.frag", "main"},
         {"hlsl.intrinsics.vert", "VertexShaderFunction"},
         {"hlsl.matType.frag", "PixelShaderFunction"},
         {"hlsl.max.frag", "PixelShaderFunction"},
index ee8ebf3..1d08e15 100755 (executable)
@@ -69,6 +69,11 @@ void HlslGrammar::expected(const char* syntax)
     parseContext.error(token.loc, "Expected", syntax, "");
 }
 
+void HlslGrammar::unimplemented(const char* error)
+{
+    parseContext.error(token.loc, "Unimplemented", error, "");
+}
+
 // Only process the next token if it is an identifier.
 // Return true if it was an identifier.
 bool HlslGrammar::acceptIdentifier(HlslToken& idToken)
@@ -105,9 +110,136 @@ bool HlslGrammar::acceptCompilationUnit()
     return true;
 }
 
+// sampler_state
+//      : LEFT_BRACE [sampler_state_assignment ... ] RIGHT_BRACE 
+//
+// sampler_state_assignment
+//     : sampler_state_identifier EQUAL value SEMICOLON
+//
+// sampler_state_identifier
+//     : ADDRESSU
+//     | ADDRESSV
+//     | ADDRESSW
+//     | BORDERCOLOR
+//     | FILTER
+//     | MAXANISOTROPY
+//     | MAXLOD
+//     | MINLOD
+//     | MIPLODBIAS
+//
+bool HlslGrammar::acceptSamplerState()
+{
+    // TODO: this should be genericized to accept a list of valid tokens and
+    // return token/value pairs.  Presently it is specific to texture values.
+
+    if (! acceptTokenClass(EHTokLeftBrace))
+        return true;
+
+    parseContext.warn(token.loc, "unimplemented", "immediate sampler state", "");
+    
+    do {
+        // read state name
+        HlslToken state;
+        if (! acceptIdentifier(state))
+            break;  // end of list
+
+        // FXC accepts any case
+        TString stateName = *state.string;
+        std::transform(stateName.begin(), stateName.end(), stateName.begin(), ::tolower);
+
+        if (! acceptTokenClass(EHTokAssign)) {
+            expected("assign");
+            return false;
+        }
+
+        if (stateName == "minlod" || stateName == "maxlod") {
+            if (! peekTokenClass(EHTokIntConstant)) {
+                expected("integer");
+                return false;
+            }
+
+            TIntermTyped* lod = nullptr;
+            if (! acceptLiteral(lod))  // should never fail, since we just looked for an integer
+                return false;
+        } else if (stateName == "maxanisotropy") {
+            if (! peekTokenClass(EHTokIntConstant)) {
+                expected("integer");
+                return false;
+            }
+
+            TIntermTyped* maxAnisotropy = nullptr;
+            if (! acceptLiteral(maxAnisotropy))  // should never fail, since we just looked for an integer
+                return false;
+        } else if (stateName == "filter") {
+            HlslToken filterMode;
+            if (! acceptIdentifier(filterMode)) {
+                expected("filter mode");
+                return false;
+            }
+        } else if (stateName == "addressu" || stateName == "addressv" || stateName == "addressw") {
+            HlslToken addrMode;
+            if (! acceptIdentifier(addrMode)) {
+                expected("texture address mode");
+                return false;
+            }
+        } else if (stateName == "miplodbias") {
+            TIntermTyped* lodBias = nullptr;
+            if (! acceptLiteral(lodBias)) {
+                expected("lod bias");
+                return false;
+            }
+        } else if (stateName == "bordercolor") {
+            return false;
+        } else {
+            expected("texture state");
+            return false;
+        }
+
+        // SEMICOLON
+        if (! acceptTokenClass(EHTokSemicolon)) {
+            expected("semicolon");
+            return false;
+        }
+    } while (true);
+
+    if (! acceptTokenClass(EHTokRightBrace))
+        return false;
+
+    return true;
+}
+
+// sampler_declaration_dx9
+//    : SAMPLER identifier EQUAL sampler_type sampler_state
+//
+bool HlslGrammar::acceptSamplerDeclarationDX9(TType& type)
+{
+    if (! acceptTokenClass(EHTokSampler))
+        return false;
+    // TODO: remove this when DX9 style declarations are implemented.
+    unimplemented("Direct3D 9 sampler declaration");
+
+    // read sampler name
+    HlslToken name;
+    if (! acceptIdentifier(name)) {
+        expected("sampler name");
+        return false;
+    }
+
+    if (! acceptTokenClass(EHTokAssign)) {
+        expected("=");
+        return false;
+    }
+
+    return false;
+}
+
+
 // declaration
-//      : fully_specified_type declarator_list SEMICOLON
+//      : sampler_declaration_dx9 post_decls SEMICOLON
+//      | fully_specified_type declarator_list SEMICOLON
 //      | fully_specified_type identifier function_parameters post_decls compound_statement  // function definition
+//      | fully_specified_type identifier sampler_state post_decls compound_statement        // sampler definition
 //      | typedef declaration
 //
 // declarator_list
@@ -134,12 +266,26 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
     // typedef
     bool typedefDecl = acceptTokenClass(EHTokTypedef);
 
-    // fully_specified_type
     TType type;
+
+    // DX9 sampler declaration use a different syntax
+    if (acceptSamplerDeclarationDX9(type))
+        return true;
+
+    // fully_specified_type
     if (! acceptFullySpecifiedType(type))
         return false;
-    if (type.getQualifier().storage == EvqTemporary && parseContext.symbolTable.atGlobalLevel())
-        type.getQualifier().storage = EvqGlobal;
+
+    if (type.getQualifier().storage == EvqTemporary && parseContext.symbolTable.atGlobalLevel()) {
+        if (type.getBasicType() == EbtSampler) {
+            // Sampler/textures are uniform by default (if no explicit qualifier is present) in
+            // HLSL.  This line silently converts samplers *explicitly* declared static to uniform,
+            // which is incorrect but harmless.
+            type.getQualifier().storage = EvqUniform; 
+        } else {
+            type.getQualifier().storage = EvqGlobal;
+        }
+    }
 
     // identifier
     HlslToken idToken;
@@ -169,6 +315,12 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
             TArraySizes* arraySizes = nullptr;
             acceptArraySpecifier(arraySizes);
 
+            // samplers accept immediate sampler state
+            if (type.getBasicType() == EbtSampler) {
+                if (! acceptSamplerState())
+                    return false;
+            }
+
             // post_decls
             acceptPostDecls(type);
 
@@ -487,6 +639,143 @@ bool HlslGrammar::acceptMatrixTemplateType(TType& type)
 }
 
 
+// sampler_type
+//      : SAMPLER
+//      | SAMPLER1D
+//      | SAMPLER2D
+//      | SAMPLER3D
+//      | SAMPLERCUBE
+//      | SAMPLERSTATE
+//      | SAMPLERCOMPARISONSTATE
+bool HlslGrammar::acceptSamplerType(TType& type)
+{
+    // read sampler type
+    const EHlslTokenClass samplerType = peek();
+
+    TSamplerDim dim = EsdNone;
+
+    switch (samplerType) {
+    case EHTokSampler:      break;
+    case EHTokSampler1d:    dim = Esd1D; break;
+    case EHTokSampler2d:    dim = Esd2D; break;
+    case EHTokSampler3d:    dim = Esd3D; break;
+    case EHTokSamplerCube:  dim = EsdCube; break;
+    case EHTokSamplerState: break;
+    case EHTokSamplerComparisonState: break;
+    default:
+        return false;  // not a sampler declaration
+    }
+
+    advanceToken();  // consume the sampler type keyword
+
+    TArraySizes* arraySizes = nullptr; // TODO: array
+    bool shadow = false;               // TODO: shadow
+
+    TSampler sampler;
+    sampler.setPureSampler(shadow);
+
+    type.shallowCopy(TType(sampler, EvqUniform, arraySizes));
+
+    return true;
+}
+
+// texture_type
+//      | BUFFER
+//      | TEXTURE1D
+//      | TEXTURE1DARRAY
+//      | TEXTURE2D
+//      | TEXTURE2DARRAY
+//      | TEXTURE3D
+//      | TEXTURECUBE
+//      | TEXTURECUBEARRAY
+//      | TEXTURE2DMS
+//      | TEXTURE2DMSARRAY
+bool HlslGrammar::acceptTextureType(TType& type)
+{
+    const EHlslTokenClass textureType = peek();
+
+    TSamplerDim dim = EsdNone;
+    bool array = false;
+    bool ms    = false;
+
+    switch (textureType) {
+    case EHTokBuffer:            dim = EsdBuffer;                      break;
+    case EHTokTexture1d:         dim = Esd1D;                          break;
+    case EHTokTexture1darray:    dim = Esd1D; array = true;            break;
+    case EHTokTexture2d:         dim = Esd2D;                          break;
+    case EHTokTexture2darray:    dim = Esd2D; array = true;            break;
+    case EHTokTexture3d:         dim = Esd3D;                          break; 
+    case EHTokTextureCube:       dim = EsdCube;                        break;
+    case EHTokTextureCubearray:  dim = EsdCube; array = true;          break;
+    case EHTokTexture2DMS:       dim = Esd2D; ms = true;               break;
+    case EHTokTexture2DMSarray:  dim = Esd2D; array = true; ms = true; break;
+    default:
+        return false;  // not a texture declaration
+    }
+
+    advanceToken();  // consume the texture object keyword
+
+    TType txType(EbtFloat, EvqUniform, 4); // default type is float4
+    
+    TIntermTyped* msCount = nullptr;
+
+    // texture type: required for multisample types!
+    if (acceptTokenClass(EHTokLeftAngle)) {
+        if (! acceptType(txType)) {
+            expected("scalar or vector type");
+            return false;
+        }
+
+        const TBasicType basicRetType = txType.getBasicType() ;
+
+        if (basicRetType != EbtFloat && basicRetType != EbtUint && basicRetType != EbtInt) {
+            unimplemented("basic type in texture");
+            return false;
+        }
+
+        if (!txType.isScalar() && !txType.isVector()) {
+            expected("scalar or vector type");
+            return false;
+        }
+
+        if (txType.getVectorSize() != 1 && txType.getVectorSize() != 4) {
+            // TODO: handle vec2/3 types
+            expected("vector size not yet supported in texture type");
+            return false;
+        }
+
+        if (ms && acceptTokenClass(EHTokComma)) {
+            // read sample count for multisample types, if given
+            if (! peekTokenClass(EHTokIntConstant)) {
+                expected("multisample count");
+                return false;
+            }
+
+            if (! acceptLiteral(msCount))  // should never fail, since we just found an integer
+                return false;
+        }
+
+        if (! acceptTokenClass(EHTokRightAngle)) {
+            expected("right angle bracket");
+            return false;
+        }
+    } else if (ms) {
+        expected("texture type for multisample");
+        return false;
+    }
+
+    TArraySizes* arraySizes = nullptr;
+    const bool shadow = txType.isScalar() || (txType.isVector() && txType.getVectorSize() == 1);
+
+    TSampler sampler;
+    sampler.setTexture(txType.getBasicType(), dim, array, shadow, ms);
+    
+    type.shallowCopy(TType(sampler, EvqUniform, arraySizes));
+
+    return true;
+}
+
+
 // If token is for a type, update 'type' with the type information,
 // and return true and advance.
 // Otherwise, return false, and don't advance
@@ -501,6 +790,29 @@ bool HlslGrammar::acceptType(TType& type)
         return acceptMatrixTemplateType(type);
         break;
 
+    case EHTokSampler:                // fall through
+    case EHTokSampler1d:              // ...
+    case EHTokSampler2d:              // ...
+    case EHTokSampler3d:              // ...
+    case EHTokSamplerCube:            // ...
+    case EHTokSamplerState:           // ...
+    case EHTokSamplerComparisonState: // ...
+        return acceptSamplerType(type);
+        break;
+
+    case EHTokBuffer:                 // fall through
+    case EHTokTexture1d:              // ...
+    case EHTokTexture1darray:         // ...
+    case EHTokTexture2d:              // ...
+    case EHTokTexture2darray:         // ...
+    case EHTokTexture3d:              // ...
+    case EHTokTextureCube:            // ...
+    case EHTokTextureCubearray:       // ...
+    case EHTokTexture2DMS:            // ...
+    case EHTokTexture2DMSarray:       // ...
+        return acceptTextureType(type);
+        break;
+
     case EHTokStruct:
         return acceptStruct(type);
         break;
@@ -1420,13 +1732,23 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
         {
             // DOT IDENTIFIER
             // includes swizzles and struct members
-            // TODO: possibly includes "method" syntax
             HlslToken field;
             if (! acceptIdentifier(field)) {
                 expected("swizzle or member");
                 return false;
             }
+
+            TIntermTyped* base = node; // preserve for method function calls
             node = parseContext.handleDotDereference(field.loc, node, *field.string);
+
+            // In the event of a method node, we look for an open paren and accept the function call.
+            if (node->getAsMethodNode() != nullptr && peekTokenClass(EHTokLeftParen)) {
+                if (! acceptFunctionCall(field, node, base)) {
+                    expected("function parameters");
+                    return false;
+                }
+            }
+
             break;
         }
         case EOpIndexIndirect:
@@ -1489,11 +1811,16 @@ bool HlslGrammar::acceptConstructor(TIntermTyped*& node)
 // function_call
 //      : [idToken] arguments
 //
-bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*& node)
+bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*& node, TIntermTyped* base)
 {
     // arguments
     TFunction* function = new TFunction(idToken.string, TType(EbtVoid));
     TIntermTyped* arguments = nullptr;
+
+    // methods have an implicit first argument of the calling object.
+    if (base != nullptr)
+        parseContext.handleFunctionArgument(function, arguments, base);
+
     if (! acceptArguments(function, arguments))
         return false;
 
index 437c316..9f224fe 100755 (executable)
@@ -59,16 +59,21 @@ namespace glslang {
         HlslGrammar& operator=(const HlslGrammar&);
 
         void expected(const char*);
+        void unimplemented(const char*);
         bool acceptIdentifier(HlslToken&);
         bool acceptCompilationUnit();
         bool acceptDeclaration(TIntermNode*& node);
         bool acceptControlDeclaration(TIntermNode*& node);
+        bool acceptSamplerDeclarationDX9(TType&);
+        bool acceptSamplerState();
         bool acceptFullySpecifiedType(TType&);
         void acceptQualifier(TQualifier&);
         bool acceptType(TType&);
         bool acceptTemplateType(TBasicType&);
         bool acceptVectorTemplateType(TType&);
         bool acceptMatrixTemplateType(TType&);
+        bool acceptSamplerType(TType&);
+        bool acceptTextureType(TType&);
         bool acceptStruct(TType&);
         bool acceptStructDeclarationList(TTypeList*&);
         bool acceptFunctionParameters(TFunction&);
@@ -82,7 +87,7 @@ namespace glslang {
         bool acceptUnaryExpression(TIntermTyped*&);
         bool acceptPostfixExpression(TIntermTyped*&);
         bool acceptConstructor(TIntermTyped*&);
-        bool acceptFunctionCall(HlslToken, TIntermTyped*&);
+        bool acceptFunctionCall(HlslToken, TIntermTyped*&, TIntermTyped* base = nullptr);
         bool acceptArguments(TFunction*, TIntermTyped*&);
         bool acceptLiteral(TIntermTyped*&);
         bool acceptCompoundStatement(TIntermNode*&);
index 02c9c58..dc0f2db 100755 (executable)
@@ -564,12 +564,32 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
     variableCheck(base);
 
     //
-    // .length() can't be resolved until we later see the function-calling syntax.
+    // methods can't be resolved until we later see the function-calling syntax.
     // Save away the name in the AST for now.  Processing is completed in 
-    // handleLengthMethod().
+    // handleLengthMethod(), etc.
     //
     if (field == "length") {
         return intermediate.addMethod(base, TType(EbtInt), &field, loc);
+    } else if (field == "CalculateLevelOfDetail"          ||
+               field == "CalculateLevelOfDetailUnclamped" ||
+               field == "Gather"                          ||
+               field == "GetDimensions"                   ||
+               field == "GetSamplePosition"               ||
+               field == "Load"                            ||
+               field == "Sample"                          ||
+               field == "SampleBias"                      ||
+               field == "SampleCmp"                       ||
+               field == "SampleCmpLevelZero"              ||
+               field == "SampleGrad"                      ||
+               field == "SampleLevel") {
+        // If it's not a method on a sampler object, we fall through in case it is a struct member.
+        if (base->getType().getBasicType() == EbtSampler) {
+            const TSampler& texType = base->getType().getSampler();
+            if (! texType.isPureSampler()) {
+                const int vecSize = texType.isShadow() ? 1 : 4;
+                return intermediate.addMethod(base, TType(texType.type, EvqTemporary, vecSize), &field, loc);
+            }
+        }
     }
 
     // It's not .length() if we get to here.
@@ -1006,9 +1026,7 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
 
             TIntermTyped* arg0 = argAggregate->getSequence()[0]->getAsTyped();
             TIntermTyped* arg1 = argAggregate->getSequence()[1]->getAsTyped();
-            TBasicType    type0 = arg0->getBasicType();
 
-            TIntermTyped* x = intermediate.addConstantUnion(0, loc, true);
             TIntermTyped* y = intermediate.addConstantUnion(1, loc, true);
             TIntermTyped* z = intermediate.addConstantUnion(2, loc, true);
             TIntermTyped* w = intermediate.addConstantUnion(3, loc, true);
@@ -1205,6 +1223,49 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
 }
 
 //
+// Decompose sample methods into AST
+//
+void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermTyped*& node, TIntermNode* arguments)
+{
+    if (!node || !node->getAsOperator())
+        return;
+
+    const TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr;
+    const TOperator op  = node->getAsOperator()->getOp();
+
+    switch (op) {
+    case EOpMethodSample:
+        {
+            TIntermTyped* argTex   = argAggregate->getSequence()[0]->getAsTyped();
+            TIntermTyped* argSamp  = argAggregate->getSequence()[1]->getAsTyped();
+            TIntermTyped* argCoord = argAggregate->getSequence()[2]->getAsTyped();
+
+            TIntermAggregate* txcombine = new TIntermAggregate(EOpConstructTextureSampler);
+
+            txcombine->getSequence().push_back(argTex);
+            txcombine->getSequence().push_back(argSamp);
+            TSampler samplerType = argTex->getType().getSampler();
+            samplerType.combined = true;
+            txcombine->setType(TType(samplerType, EvqTemporary));
+            txcombine->setLoc(loc);
+
+            TIntermAggregate* txsample = new TIntermAggregate(EOpTexture);
+            txsample->getSequence().push_back(txcombine);
+            txsample->getSequence().push_back(argCoord);
+            txsample->setType(node->getType());
+            txsample->setLoc(loc);
+            node = txsample;
+
+            break;
+        }
+        
+    default:
+        break; // most pass through unchanged
+    }
+}
+
+
+//
 // Handle seeing function call syntax in the grammar, which could be any of
 //  - .length() method
 //  - constructor
@@ -1307,8 +1368,9 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct
                 result = addOutputArgumentConversions(*fnCandidate, *result->getAsAggregate());
             }
 
-            decomposeIntrinsic(loc, result, arguments);
-            textureParameters(loc, result, arguments);
+            decomposeIntrinsic(loc, result, arguments);      // HLSL->AST intrinsic decompositions
+            decomposeSampleMethods(loc, result, arguments);  // HLSL->AST sample method decompositions
+            textureParameters(loc, result, arguments);       // HLSL->AST texture intrinsics
         }
     }
 
index ed1955e..fdb2afe 100755 (executable)
@@ -87,6 +87,7 @@ public:
     void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
+    void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void textureParameters(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*);
     void addInputArgumentConversions(const TFunction&, TIntermNode*&) const;
index b454d4b..4085800 100755 (executable)
@@ -65,6 +65,12 @@ const char* BaseTypeName(const char* argOrder, const char* scalarName, const cha
     default:  return "UNKNOWN_TYPE";
     }
 }
+
+bool IsTextureType(const char argType)
+{
+    return argType == 'T' || argType == 'i' || argType == 'u';
+}
+
     
 // Create and return a type name.  This is done in GLSL, not HLSL conventions, until such
 // time as builtins are parsed using the HLSL parser.
@@ -95,6 +101,9 @@ glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, cons
         case 'U': s += "uint";    break;
         case 'B': s += "bool";    break;
         case 'S': s += "sampler"; break;
+        case 'T': s += "Texture"; break;
+        case 'i': assert(0); // TODO: ...
+        case 'u': assert(0); // TODO: ...
         default:  s += "UNKNOWN_TYPE"; break;
         }
     } else {
@@ -105,7 +114,10 @@ glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, cons
         case 'I': s += BaseTypeName(argOrder, "int",     "ivec",    "imat"); break;
         case 'U': s += BaseTypeName(argOrder, "uint",    "uvec",    "umat"); break;
         case 'B': s += BaseTypeName(argOrder, "bool",    "bvec",    "bmat"); break;
-        case 'S': s += BaseTypeName(argOrder, "sampler", "sampler", "sampler"); break; // TODO: 
+        case 'S': s += BaseTypeName(argOrder, "sampler", "sampler", "sampler"); break;
+        case 'T': s += BaseTypeName(argOrder, "texture", "texture", "texture"); break;
+        case 'i': s += BaseTypeName(argOrder, "itexture", "itexture", "itexture"); break;
+        case 'u': s += BaseTypeName(argOrder, "utexture", "utexture", "utexture"); break;
         default:  s += "UNKNOWN_TYPE"; break;
         }
     }
@@ -116,35 +128,38 @@ glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, cons
         dim0 = dim1 = fixedVecSize;
 
     // Add sampler dimensions
-    if (*argType == 'S') {
-        switch (dim0) {
-        case 1: s += "1D";   break;
-        case 2: s += "2D";   break;
-        case 3: s += "3D";   break;
-        case 4: s += "Cube"; break;
-        default: s += "UNKNOWN_SAMPLER"; break;
+    if (*argType == 'S' || IsTextureType(*argType)) {
+        if (*argOrder == 'V') {
+            switch (dim0) {
+            case 1: s += "1D";   break;
+            case 2: s += "2D";   break;
+            case 3: s += "3D";   break;
+            case 4: s += "Cube"; break;
+            default: s += "UNKNOWN_SAMPLER"; break;
+            }
+        }
+    } else {
+        // Non-sampler type:
+        // verify dimensions
+        if (((*argOrder == 'V' || *argOrder == 'M') && (dim0 < 1 || dim0 > 4)) ||
+            (*argOrder == 'M' && (dim1 < 1 || dim1 > 4))) {
+            s += "UNKNOWN_DIMENSION";
+            return s;
         }
-    }
-
-    // verify dimensions
-    if ((*argOrder == 'V' || *argOrder == 'M') && (dim0 < 1 || dim0 > 4) ||
-        (*argOrder == 'M' && (dim1 < 1 || dim1 > 4))) {
-        s += "UNKNOWN_DIMENSION";
-        return s;
-    }
 
-    switch (*argOrder) {
-    case '-': break;  // no dimensions for voids
-    case 'S': break;  // no dimensions on scalars
-    case 'V': s += ('0' + (char)dim0); break;
-    case 'M': 
-        {
-            if (!UseHlslTypes)  // GLSL has column first for mat types
-                std::swap(dim0, dim1);
-            s += ('0' + (char)dim0);
-            s += 'x';
-            s += ('0' + (char)dim1);
-            break;
+        switch (*argOrder) {
+        case '-': break;  // no dimensions for voids
+        case 'S': break;  // no dimensions on scalars
+        case 'V': s += ('0' + (char)dim0); break;
+        case 'M': 
+            {
+                if (!UseHlslTypes)  // GLSL has column first for mat types
+                    std::swap(dim0, dim1);
+                s += ('0' + (char)dim0);
+                s += 'x';
+                s += ('0' + (char)dim1);
+                break;
+            }
         }
     }
 
@@ -160,17 +175,18 @@ inline bool IsValidGlsl(const char* cname, char retOrder, char retType, char /*a
     const bool isVec = dim0Max > 1 || argType == 'V';
     const bool isMat = dim1Max > 1 || argType == 'M';
 
-    if ((isVec && dim0 == 1)            ||  // avoid vec1
-        (isMat && dim0 == 1 && dim1 == 1))  // avoid mat1x1
+    if (!IsTextureType(argType) &&
+        ((isVec && dim0 == 1)            ||  // avoid vec1
+         (isMat && dim0 == 1 && dim1 == 1)))  // avoid mat1x1
         return false;
 
     const std::string name(cname);  // for ease of comparison. slow, but temporary, until HLSL parser is online.
-                                
+
     if (isMat && dim1 == 1)  // TODO: avoid mat Nx1 until we find the right GLSL profile
         return false;
 
-    if (isMat && (argType == 'I' || argType == 'U' || argType == 'B') ||
-        retOrder == 'M' && (retType == 'I' || retType == 'U' || retType == 'B'))
+    if ((isMat && (argType == 'I' || argType == 'U' || argType == 'B')) ||
+        (retOrder == 'M' && (retType == 'I' || retType == 'U' || retType == 'B')))
         return false;
 
     if (name == "GetRenderTargetSamplePosition" ||
@@ -284,7 +300,8 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
     // orderKey can be:
     //   S = scalar, V = vector, M = matrix, - = void
     // typekey can be:
-    //   D = double, F = float, U = uint, I = int, B = bool, S = sampler, - = void
+    //   D = double, F = float, U = uint, I = int, B = bool,
+    //   S = sampler, T = texture, i = itexture, u = utexture, - = void
     // An empty order or type key repeats the first one.  E.g: SVM,, means 3 args each of SVM.
     // '>' as first letter of order creates an output parameter
     // '<' as first letter of order creates an input parameter
@@ -429,33 +446,39 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
         { "step",                             nullptr, nullptr,   "SVM,",       "F,",     EShLangAll },
         { "tan",                              nullptr, nullptr,   "SVM",        "F",      EShLangAll },
         { "tanh",                             nullptr, nullptr,   "SVM",        "F",      EShLangAll },
-        { "tex1D",                            "V4",    "F",       "S1,S",       "S,F",    EShLangFragmentMask },
-        { "tex1D",                            "V4",    "F",       "S1,S,V1,V1", "S,F,F,F",EShLangFragmentMask },
-        { "tex1Dbias",                        "V4",    "F",       "S1,V4",      "S,F",    EShLangFragmentMask },
-        { "tex1Dgrad",                        "V4",    "F",       "S1,V1,V1,V1","S,F,F,F",EShLangFragmentMask },
-        { "tex1Dlod",                         "V4",    "F",       "S1,V4",      "S,F",    EShLangFragmentMask },
-        { "tex1Dproj",                        "V4",    "F",       "S1,V4",      "S,F",    EShLangFragmentMask },
-        { "tex2D",                            "V4",    "F",       "S2,V2",      "S,F",    EShLangFragmentMask },
-        { "tex2D",                            "V4",    "F",       "S2,V2,V2,V2","S,F,F,F",EShLangFragmentMask },
-        { "tex2Dbias",                        "V4",    "F",       "S2,V4",      "S,F",    EShLangFragmentMask },
-        { "tex2Dgrad",                        "V4",    "F",       "S2,V2,V2,V2","S,F,F,F",EShLangFragmentMask },
-        { "tex2Dlod",                         "V4",    "F",       "S2,V4",      "S,F",    EShLangFragmentMask },
-        { "tex2Dproj",                        "V4",    "F",       "S2,V4",      "S,F",    EShLangFragmentMask },
-        { "tex3D",                            "V4",    "F",       "S3,V3",      "S,F",    EShLangFragmentMask },
-        { "tex3D",                            "V4",    "F",       "S3,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
-        { "tex3Dbias",                        "V4",    "F",       "S3,V4",      "S,F",    EShLangFragmentMask },
-        { "tex3Dgrad",                        "V4",    "F",       "S3,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
-        { "tex3Dlod",                         "V4",    "F",       "S3,V4",      "S,F",    EShLangFragmentMask },
-        { "tex3Dproj",                        "V4",    "F",       "S3,V4",      "S,F",    EShLangFragmentMask },
-        { "texCUBE",                          "V4",    "F",       "S4,V3",      "S,F",    EShLangFragmentMask },
-        { "texCUBE",                          "V4",    "F",       "S4,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
-        { "texCUBEbias",                      "V4",    "F",       "S4,V4",      "S,F",    EShLangFragmentMask },
-        { "texCUBEgrad",                      "V4",    "F",       "S4,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
-        { "texCUBElod",                       "V4",    "F",       "S4,V4",      "S,F",    EShLangFragmentMask },
-        { "texCUBEproj",                      "V4",    "F",       "S4,V4",      "S,F",    EShLangFragmentMask },
+        { "tex1D",                            "V4",    "F",       "V1,S",       "S,F",    EShLangFragmentMask },
+        { "tex1D",                            "V4",    "F",       "V1,S,V1,V1", "S,F,F,F",EShLangFragmentMask },
+        { "tex1Dbias",                        "V4",    "F",       "V1,V4",      "S,F",    EShLangFragmentMask },
+        { "tex1Dgrad",                        "V4",    "F",       "V1,V1,V1,V1","S,F,F,F",EShLangFragmentMask },
+        { "tex1Dlod",                         "V4",    "F",       "V1,V4",      "S,F",    EShLangFragmentMask },
+        { "tex1Dproj",                        "V4",    "F",       "V1,V4",      "S,F",    EShLangFragmentMask },
+        { "tex2D",                            "V4",    "F",       "V2,V2",      "S,F",    EShLangFragmentMask },
+        { "tex2D",                            "V4",    "F",       "V2,V2,V2,V2","S,F,F,F",EShLangFragmentMask },
+        { "tex2Dbias",                        "V4",    "F",       "V2,V4",      "S,F",    EShLangFragmentMask },
+        { "tex2Dgrad",                        "V4",    "F",       "V2,V2,V2,V2","S,F,F,F",EShLangFragmentMask },
+        { "tex2Dlod",                         "V4",    "F",       "V2,V4",      "S,F",    EShLangFragmentMask },
+        { "tex2Dproj",                        "V4",    "F",       "V2,V4",      "S,F",    EShLangFragmentMask },
+        { "tex3D",                            "V4",    "F",       "V3,V3",      "S,F",    EShLangFragmentMask },
+        { "tex3D",                            "V4",    "F",       "V3,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
+        { "tex3Dbias",                        "V4",    "F",       "V3,V4",      "S,F",    EShLangFragmentMask },
+        { "tex3Dgrad",                        "V4",    "F",       "V3,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
+        { "tex3Dlod",                         "V4",    "F",       "V3,V4",      "S,F",    EShLangFragmentMask },
+        { "tex3Dproj",                        "V4",    "F",       "V3,V4",      "S,F",    EShLangFragmentMask },
+        { "texCUBE",                          "V4",    "F",       "V4,V3",      "S,F",    EShLangFragmentMask },
+        { "texCUBE",                          "V4",    "F",       "V4,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
+        { "texCUBEbias",                      "V4",    "F",       "V4,V4",      "S,F",    EShLangFragmentMask },
+        { "texCUBEgrad",                      "V4",    "F",       "V4,V3,V3,V3","S,F,F,F",EShLangFragmentMask },
+        { "texCUBElod",                       "V4",    "F",       "V4,V4",      "S,F",    EShLangFragmentMask },
+        { "texCUBEproj",                      "V4",    "F",       "V4,V4",      "S,F",    EShLangFragmentMask },
         { "transpose",                        "^M",    nullptr,   "M",          "F",      EShLangAll },
         { "trunc",                            nullptr, nullptr,   "SVM",        "F",      EShLangAll },
 
+        // Texture object methods.  Return type can be overridden by shader declaration.
+        { "Sample",                           "V4",    "F",       "V,S,V",      "T,S,F",  EShLangFragmentMask },
+        { "Sample",                           "V4",    "I",       "V,S,V",      "i,S,F",  EShLangFragmentMask },
+        { "Sample",                           "V4",    "U",       "V,S,V",      "u,S,F",  EShLangFragmentMask },
+        // TODO: forms with texel-space offset parameter
+
         // Mark end of list, since we want to avoid a range-based for, as some compilers don't handle it yet.
         { nullptr,                            nullptr, nullptr,   nullptr,      nullptr,  0 },
     };
@@ -501,6 +524,8 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
                             s.append(intrinsic.name);                          // intrinsic name
                             s.append("(");                                     // open paren
 
+                            const bool isTexture = IsTextureType(*argType);
+
                             // Append argument types, if any.
                             for (int arg = 0; ; ++arg) {
                                 const char* nthArgOrder(NthArg(argOrder, arg));
@@ -509,6 +534,13 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
                                 if (nthArgOrder == nullptr || nthArgType == nullptr)
                                     break;
 
+                                // For textures, the 1D case isn't a 1-vector, but a scalar.
+                                if (isTexture && dim0 == 1 && arg > 0 && *nthArgOrder == 'V')
+                                    nthArgOrder = "S";
+
+                                // cube textures use vec3 coordinates
+                                const int argDim0 = isTexture && arg > 0 ? std::min(dim0, 3) : dim0;
+
                                 s.append(arg > 0 ? ", ": "");  // comma separator if needed
                                 
                                 if (*nthArgOrder == '>') {           // output params
@@ -523,7 +555,7 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
                                 if (*nthArgOrder == ',' || *nthArgOrder == '\0') nthArgOrder = argOrder;
                                 if (*nthArgType == ',' || *nthArgType == '\0') nthArgType = argType;
 
-                                AppendTypeName(s, nthArgOrder, nthArgType, dim0, dim1); // Add arguments
+                                AppendTypeName(s, nthArgOrder, nthArgType, argDim0, dim1); // Add arguments
                             }
                             
                             s.append(");\n");            // close paren and trailing semicolon
@@ -606,7 +638,7 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int /*version*/, EProfile /*profil
     symbolTable.relateToOperator("ddy_fine",                    EOpDPdyFine);
     symbolTable.relateToOperator("degrees",                     EOpDegrees);
     symbolTable.relateToOperator("determinant",                 EOpDeterminant);
-    symbolTable.relateToOperator("DeviceMemoryBarrier",         EOpGroupMemoryBarrier); // == ScopeDevice+CrossWorkGroup
+    symbolTable.relateToOperator("DeviceMemoryBarrier",         EOpGroupMemoryBarrier);
     symbolTable.relateToOperator("DeviceMemoryBarrierWithGroupSync", EOpGroupMemoryBarrierWithGroupSync); // ...
     symbolTable.relateToOperator("distance",                    EOpDistance);
     symbolTable.relateToOperator("dot",                         EOpDot);
@@ -710,6 +742,9 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int /*version*/, EProfile /*profil
     symbolTable.relateToOperator("texCUBEproj",                 EOpTextureProj);
     symbolTable.relateToOperator("transpose",                   EOpTranspose);
     symbolTable.relateToOperator("trunc",                       EOpTrunc);
+
+    // Texture methods
+    symbolTable.relateToOperator("Sample",                      EOpMethodSample);
 }
 
 //
index 69e582f..4bb0e99 100755 (executable)
@@ -1,5 +1,6 @@
 //
 //Copyright (C) 2016 Google, Inc.
+//Copyright (C) 2016 LunarG, Inc.
 //
 //All rights reserved.
 //
@@ -249,6 +250,9 @@ void HlslScanContext::fillInKeywordMap()
     (*KeywordMap)["Texture2DArray"] =          EHTokTexture2darray;
     (*KeywordMap)["Texture3D"] =               EHTokTexture3d;
     (*KeywordMap)["TextureCube"] =             EHTokTextureCube;
+    (*KeywordMap)["TextureCubeArray"] =        EHTokTextureCubearray;
+    (*KeywordMap)["Texture2DMS"] =             EHTokTexture2DMS;
+    (*KeywordMap)["Texture2DMSArray"] =        EHTokTexture2DMSarray;
 
     (*KeywordMap)["struct"] =                  EHTokStruct;
     (*KeywordMap)["typedef"] =                 EHTokTypedef;
@@ -556,6 +560,9 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
     case EHTokTexture2darray:
     case EHTokTexture3d:
     case EHTokTextureCube:
+    case EHTokTextureCubearray:
+    case EHTokTexture2DMS:
+    case EHTokTexture2DMSarray:
         return keyword;
 
     // variable, user type, ...
index b3c1227..ebd9b63 100755 (executable)
@@ -1,5 +1,6 @@
 //
 //Copyright (C) 2016 Google, Inc.
+//Copyright (C) 2016 LunarG, Inc.
 //
 //All rights reserved.
 //
@@ -200,6 +201,9 @@ enum EHlslTokenClass {
     EHTokTexture2darray,
     EHTokTexture3d,
     EHTokTextureCube,
+    EHTokTextureCubearray,
+    EHTokTexture2DMS,
+    EHTokTexture2DMSarray,
 
     // variable, user type, ...
     EHTokIdentifier,
@@ -278,4 +282,4 @@ enum EHlslTokenClass {
 
 } // end namespace glslang
 
-#endif // EHLSLTOKENS_H_
\ No newline at end of file
+#endif // EHLSLTOKENS_H_