2
0
Эх сурвалжийг харах

Merge branch 'ClemensRognerSD-dx9-sampler'

John Kessenich 6 жил өмнө
parent
commit
dc4fe2d648

+ 6 - 0
StandAlone/StandAlone.cpp

@@ -160,6 +160,7 @@ const char* sourceEntryPointName = nullptr;
 const char* shaderStageName = nullptr;
 const char* variableName = nullptr;
 bool HlslEnable16BitTypes = false;
+bool HlslDX9compatible = false;
 std::vector<std::string> IncludeDirectoryList;
 
 // Source environment
@@ -509,6 +510,8 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
                         Options |= EOptionHlslIoMapping;
                     } else if (lowerword == "hlsl-enable-16bit-types") {
                         HlslEnable16BitTypes = true;
+                    } else if (lowerword == "hlsl-dx9-compatible") {
+                        HlslDX9compatible = true;
                     } else if (lowerword == "invert-y" ||  // synonyms
                                lowerword == "iy") {
                         Options |= EOptionInvertY;
@@ -815,6 +818,8 @@ void SetMessageOptions(EShMessages& messages)
         messages = (EShMessages)(messages | EShMsgHlslEnable16BitTypes);
     if ((Options & EOptionOptimizeDisable) || !ENABLE_OPT)
         messages = (EShMessages)(messages | EShMsgHlslLegalization);
+    if (HlslDX9compatible)
+        messages = (EShMessages)(messages | EShMsgHlslDX9Compatible);
 }
 
 //
@@ -1509,6 +1514,7 @@ void usage()
            "                                    works independently of source language\n"
            "  --hlsl-iomap                      perform IO mapping in HLSL register space\n"
            "  --hlsl-enable-16bit-types         allow 16-bit types in SPIR-V for HLSL\n"
+           "  --hlsl-dx9-compatible             interprets sampler declarations as a texture/sampler combo like DirectX9 would."
            "  --invert-y | --iy                 invert position.Y output in vertex shader\n"
            "  --keep-uncalled | --ku            don't eliminate uncalled functions\n"
            "  --no-storage-format | --nsf       use Unknown image format\n"

+ 592 - 0
Test/baseResults/hlsl.sample.dx9.frag.out

@@ -0,0 +1,592 @@
+hlsl.sample.dx9.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+using depth_any
+0:? Sequence
+0:15  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15    Function Parameters: 
+0:?     Sequence
+0:18      Sequence
+0:18        move second child to first child ( temp 4-component vector of float)
+0:18          'ColorOut' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:20      add second child into first child ( temp 4-component vector of float)
+0:20        'ColorOut' ( temp 4-component vector of float)
+0:20        texture ( temp 4-component vector of float)
+0:20          'g_sam' (layout( binding=0) uniform sampler2D)
+0:?           Constant:
+0:?             0.400000
+0:?             0.300000
+0:21      add second child into first child ( temp 4-component vector of float)
+0:21        'ColorOut' ( temp 4-component vector of float)
+0:21        texture ( temp 4-component vector of float)
+0:21          'g_sam1D' (layout( binding=1) uniform sampler1D)
+0:21          Constant:
+0:21            0.500000
+0:22      add second child into first child ( temp 4-component vector of float)
+0:22        'ColorOut' ( temp 4-component vector of float)
+0:22        texture ( temp 4-component vector of float)
+0:22          'g_sam2D' (layout( binding=2) uniform sampler2D)
+0:?           Constant:
+0:?             0.500000
+0:?             0.600000
+0:23      add second child into first child ( temp 4-component vector of float)
+0:23        'ColorOut' ( temp 4-component vector of float)
+0:23        texture ( temp 4-component vector of float)
+0:23          'g_sam3D' (layout( binding=3) uniform sampler3D)
+0:?           Constant:
+0:?             0.500000
+0:?             0.600000
+0:?             0.400000
+0:24      add second child into first child ( temp 4-component vector of float)
+0:24        'ColorOut' ( temp 4-component vector of float)
+0:24        texture ( temp 4-component vector of float)
+0:24          'g_samCube' (layout( binding=4) uniform samplerCube)
+0:?           Constant:
+0:?             0.500000
+0:?             0.600000
+0:?             0.400000
+0:26      add second child into first child ( temp 4-component vector of float)
+0:26        'ColorOut' ( temp 4-component vector of float)
+0:26        textureLod ( temp 4-component vector of float)
+0:26          'g_sam' (layout( binding=0) uniform sampler2D)
+0:26          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.400000
+0:?               0.300000
+0:?               0.000000
+0:?               0.000000
+0:26          direct index ( temp float)
+0:?             Constant:
+0:?               0.400000
+0:?               0.300000
+0:?               0.000000
+0:?               0.000000
+0:26            Constant:
+0:26              3 (const int)
+0:27      add second child into first child ( temp 4-component vector of float)
+0:27        'ColorOut' ( temp 4-component vector of float)
+0:27        textureLod ( temp 4-component vector of float)
+0:27          'g_sam1D' (layout( binding=1) uniform sampler1D)
+0:27          Construct float ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.000000
+0:?               0.000000
+0:?               0.000000
+0:27          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.000000
+0:?               0.000000
+0:?               0.000000
+0:27            Constant:
+0:27              3 (const int)
+0:28      add second child into first child ( temp 4-component vector of float)
+0:28        'ColorOut' ( temp 4-component vector of float)
+0:28        textureLod ( temp 4-component vector of float)
+0:28          'g_sam2D' (layout( binding=2) uniform sampler2D)
+0:28          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               0.000000
+0:28          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               0.000000
+0:28            Constant:
+0:28              3 (const int)
+0:29      add second child into first child ( temp 4-component vector of float)
+0:29        'ColorOut' ( temp 4-component vector of float)
+0:29        textureLod ( temp 4-component vector of float)
+0:29          'g_sam3D' (layout( binding=3) uniform sampler3D)
+0:29          Construct vec3 ( temp 3-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:29          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:29            Constant:
+0:29              3 (const int)
+0:30      add second child into first child ( temp 4-component vector of float)
+0:30        'ColorOut' ( temp 4-component vector of float)
+0:30        textureLod ( temp 4-component vector of float)
+0:30          'g_samCube' (layout( binding=4) uniform samplerCube)
+0:30          Construct vec3 ( temp 3-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:30          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:30            Constant:
+0:30              3 (const int)
+0:32      move second child to first child ( temp 4-component vector of float)
+0:32        Color: direct index for structure ( temp 4-component vector of float)
+0:32          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:32          Constant:
+0:32            0 (const int)
+0:32        divide ( temp 4-component vector of float)
+0:32          'ColorOut' ( temp 4-component vector of float)
+0:32          Constant:
+0:32            10.000000
+0:33      move second child to first child ( temp float)
+0:33        Depth: direct index for structure ( temp float)
+0:33          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:33          Constant:
+0:33            1 (const int)
+0:33        Constant:
+0:33          1.000000
+0:35      Branch: Return with expression
+0:35        'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      Sequence
+0:15        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+0:15          Color: direct index for structure ( temp 4-component vector of float)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15            Constant:
+0:15              0 (const int)
+0:15        move second child to first child ( temp float)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
+0:15          Depth: direct index for structure ( temp float)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15            Constant:
+0:15              1 (const int)
+0:?   Linker Objects
+0:?     'g_sam' (layout( binding=0) uniform sampler2D)
+0:?     'g_sam1D' (layout( binding=1) uniform sampler1D)
+0:?     'g_sam2D' (layout( binding=2) uniform sampler2D)
+0:?     'g_sam3D' (layout( binding=3) uniform sampler3D)
+0:?     'g_samCube' (layout( binding=4) uniform samplerCube)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+using depth_any
+0:? Sequence
+0:15  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15    Function Parameters: 
+0:?     Sequence
+0:18      Sequence
+0:18        move second child to first child ( temp 4-component vector of float)
+0:18          'ColorOut' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:20      add second child into first child ( temp 4-component vector of float)
+0:20        'ColorOut' ( temp 4-component vector of float)
+0:20        texture ( temp 4-component vector of float)
+0:20          'g_sam' (layout( binding=0) uniform sampler2D)
+0:?           Constant:
+0:?             0.400000
+0:?             0.300000
+0:21      add second child into first child ( temp 4-component vector of float)
+0:21        'ColorOut' ( temp 4-component vector of float)
+0:21        texture ( temp 4-component vector of float)
+0:21          'g_sam1D' (layout( binding=1) uniform sampler1D)
+0:21          Constant:
+0:21            0.500000
+0:22      add second child into first child ( temp 4-component vector of float)
+0:22        'ColorOut' ( temp 4-component vector of float)
+0:22        texture ( temp 4-component vector of float)
+0:22          'g_sam2D' (layout( binding=2) uniform sampler2D)
+0:?           Constant:
+0:?             0.500000
+0:?             0.600000
+0:23      add second child into first child ( temp 4-component vector of float)
+0:23        'ColorOut' ( temp 4-component vector of float)
+0:23        texture ( temp 4-component vector of float)
+0:23          'g_sam3D' (layout( binding=3) uniform sampler3D)
+0:?           Constant:
+0:?             0.500000
+0:?             0.600000
+0:?             0.400000
+0:24      add second child into first child ( temp 4-component vector of float)
+0:24        'ColorOut' ( temp 4-component vector of float)
+0:24        texture ( temp 4-component vector of float)
+0:24          'g_samCube' (layout( binding=4) uniform samplerCube)
+0:?           Constant:
+0:?             0.500000
+0:?             0.600000
+0:?             0.400000
+0:26      add second child into first child ( temp 4-component vector of float)
+0:26        'ColorOut' ( temp 4-component vector of float)
+0:26        textureLod ( temp 4-component vector of float)
+0:26          'g_sam' (layout( binding=0) uniform sampler2D)
+0:26          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.400000
+0:?               0.300000
+0:?               0.000000
+0:?               0.000000
+0:26          direct index ( temp float)
+0:?             Constant:
+0:?               0.400000
+0:?               0.300000
+0:?               0.000000
+0:?               0.000000
+0:26            Constant:
+0:26              3 (const int)
+0:27      add second child into first child ( temp 4-component vector of float)
+0:27        'ColorOut' ( temp 4-component vector of float)
+0:27        textureLod ( temp 4-component vector of float)
+0:27          'g_sam1D' (layout( binding=1) uniform sampler1D)
+0:27          Construct float ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.000000
+0:?               0.000000
+0:?               0.000000
+0:27          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.000000
+0:?               0.000000
+0:?               0.000000
+0:27            Constant:
+0:27              3 (const int)
+0:28      add second child into first child ( temp 4-component vector of float)
+0:28        'ColorOut' ( temp 4-component vector of float)
+0:28        textureLod ( temp 4-component vector of float)
+0:28          'g_sam2D' (layout( binding=2) uniform sampler2D)
+0:28          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               0.000000
+0:28          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               0.000000
+0:28            Constant:
+0:28              3 (const int)
+0:29      add second child into first child ( temp 4-component vector of float)
+0:29        'ColorOut' ( temp 4-component vector of float)
+0:29        textureLod ( temp 4-component vector of float)
+0:29          'g_sam3D' (layout( binding=3) uniform sampler3D)
+0:29          Construct vec3 ( temp 3-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:29          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:29            Constant:
+0:29              3 (const int)
+0:30      add second child into first child ( temp 4-component vector of float)
+0:30        'ColorOut' ( temp 4-component vector of float)
+0:30        textureLod ( temp 4-component vector of float)
+0:30          'g_samCube' (layout( binding=4) uniform samplerCube)
+0:30          Construct vec3 ( temp 3-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:30          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.400000
+0:?               0.000000
+0:30            Constant:
+0:30              3 (const int)
+0:32      move second child to first child ( temp 4-component vector of float)
+0:32        Color: direct index for structure ( temp 4-component vector of float)
+0:32          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:32          Constant:
+0:32            0 (const int)
+0:32        divide ( temp 4-component vector of float)
+0:32          'ColorOut' ( temp 4-component vector of float)
+0:32          Constant:
+0:32            10.000000
+0:33      move second child to first child ( temp float)
+0:33        Depth: direct index for structure ( temp float)
+0:33          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:33          Constant:
+0:33            1 (const int)
+0:33        Constant:
+0:33          1.000000
+0:35      Branch: Return with expression
+0:35        'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      Sequence
+0:15        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+0:15          Color: direct index for structure ( temp 4-component vector of float)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15            Constant:
+0:15              0 (const int)
+0:15        move second child to first child ( temp float)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
+0:15          Depth: direct index for structure ( temp float)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:15            Constant:
+0:15              1 (const int)
+0:?   Linker Objects
+0:?     'g_sam' (layout( binding=0) uniform sampler2D)
+0:?     'g_sam1D' (layout( binding=1) uniform sampler1D)
+0:?     'g_sam2D' (layout( binding=2) uniform sampler2D)
+0:?     'g_sam3D' (layout( binding=3) uniform sampler3D)
+0:?     'g_samCube' (layout( binding=4) uniform samplerCube)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 135
+
+                              Capability Shader
+                              Capability Sampled1D
+               2:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5  "main" 128 132
+                              ExecutionMode 5 OriginUpperLeft
+                              ExecutionMode 5 DepthReplacing
+               1:             String  ""
+                              Source HLSL 500 1  "// OpModuleProcessed auto-map-locations
+// OpModuleProcessed auto-map-bindings
+// OpModuleProcessed entry-point main
+// OpModuleProcessed client vulkan100
+// OpModuleProcessed target-env vulkan1.0
+// OpModuleProcessed keep-uncalled
+// OpModuleProcessed hlsl-offsets
+#line 1
+"
+                              Name 5  "main"
+                              Name 9  "PS_OUTPUT"
+                              MemberName 9(PS_OUTPUT) 0  "Color"
+                              MemberName 9(PS_OUTPUT) 1  "Depth"
+                              Name 11  "@main("
+                              Name 14  "ColorOut"
+                              Name 20  "g_sam"
+                              Name 32  "g_sam1D"
+                              Name 38  "g_sam2D"
+                              Name 48  "g_sam3D"
+                              Name 58  "g_samCube"
+                              Name 110  "psout"
+                              Name 125  "flattenTemp"
+                              Name 128  "@entryPointOutput.Color"
+                              Name 132  "@entryPointOutput.Depth"
+                              Decorate 20(g_sam) DescriptorSet 0
+                              Decorate 20(g_sam) Binding 0
+                              Decorate 32(g_sam1D) DescriptorSet 0
+                              Decorate 32(g_sam1D) Binding 1
+                              Decorate 38(g_sam2D) DescriptorSet 0
+                              Decorate 38(g_sam2D) Binding 2
+                              Decorate 48(g_sam3D) DescriptorSet 0
+                              Decorate 48(g_sam3D) Binding 3
+                              Decorate 58(g_samCube) DescriptorSet 0
+                              Decorate 58(g_samCube) Binding 4
+                              Decorate 128(@entryPointOutput.Color) Location 0
+                              Decorate 132(@entryPointOutput.Depth) BuiltIn FragDepth
+               3:             TypeVoid
+               4:             TypeFunction 3
+               7:             TypeFloat 32
+               8:             TypeVector 7(float) 4
+    9(PS_OUTPUT):             TypeStruct 8(fvec4) 7(float)
+              10:             TypeFunction 9(PS_OUTPUT)
+              13:             TypePointer Function 8(fvec4)
+              15:    7(float) Constant 0
+              16:    8(fvec4) ConstantComposite 15 15 15 15
+              17:             TypeImage 7(float) 2D sampled format:Unknown
+              18:             TypeSampledImage 17
+              19:             TypePointer UniformConstant 18
+       20(g_sam):     19(ptr) Variable UniformConstant
+              22:             TypeVector 7(float) 2
+              23:    7(float) Constant 1053609165
+              24:    7(float) Constant 1050253722
+              25:   22(fvec2) ConstantComposite 23 24
+              29:             TypeImage 7(float) 1D sampled format:Unknown
+              30:             TypeSampledImage 29
+              31:             TypePointer UniformConstant 30
+     32(g_sam1D):     31(ptr) Variable UniformConstant
+              34:    7(float) Constant 1056964608
+     38(g_sam2D):     19(ptr) Variable UniformConstant
+              40:    7(float) Constant 1058642330
+              41:   22(fvec2) ConstantComposite 34 40
+              45:             TypeImage 7(float) 3D sampled format:Unknown
+              46:             TypeSampledImage 45
+              47:             TypePointer UniformConstant 46
+     48(g_sam3D):     47(ptr) Variable UniformConstant
+              50:             TypeVector 7(float) 3
+              51:   50(fvec3) ConstantComposite 34 40 23
+              55:             TypeImage 7(float) Cube sampled format:Unknown
+              56:             TypeSampledImage 55
+              57:             TypePointer UniformConstant 56
+   58(g_samCube):     57(ptr) Variable UniformConstant
+              64:    8(fvec4) ConstantComposite 23 24 15 15
+              68:             TypeInt 32 0
+              69:     68(int) Constant 3
+              75:    8(fvec4) ConstantComposite 34 15 15 15
+              82:    8(fvec4) ConstantComposite 34 40 15 15
+              91:    8(fvec4) ConstantComposite 34 40 23 15
+             109:             TypePointer Function 9(PS_OUTPUT)
+             111:             TypeInt 32 1
+             112:    111(int) Constant 0
+             114:    7(float) Constant 1092616192
+             118:    111(int) Constant 1
+             119:    7(float) Constant 1065353216
+             120:             TypePointer Function 7(float)
+             127:             TypePointer Output 8(fvec4)
+128(@entryPointOutput.Color):    127(ptr) Variable Output
+             131:             TypePointer Output 7(float)
+132(@entryPointOutput.Depth):    131(ptr) Variable Output
+         5(main):           3 Function None 4
+               6:             Label
+125(flattenTemp):    109(ptr) Variable Function
+                              Line 1 15 0
+             126:9(PS_OUTPUT) FunctionCall 11(@main()
+                              Store 125(flattenTemp) 126
+             129:     13(ptr) AccessChain 125(flattenTemp) 112
+             130:    8(fvec4) Load 129
+                              Store 128(@entryPointOutput.Color) 130
+             133:    120(ptr) AccessChain 125(flattenTemp) 118
+             134:    7(float) Load 133
+                              Store 132(@entryPointOutput.Depth) 134
+                              Return
+                              FunctionEnd
+      11(@main():9(PS_OUTPUT) Function None 10
+              12:             Label
+    14(ColorOut):     13(ptr) Variable Function
+      110(psout):    109(ptr) Variable Function
+                              Line 1 18 0
+                              Store 14(ColorOut) 16
+                              Line 1 20 0
+              21:          18 Load 20(g_sam)
+              26:    8(fvec4) ImageSampleImplicitLod 21 25
+              27:    8(fvec4) Load 14(ColorOut)
+              28:    8(fvec4) FAdd 27 26
+                              Store 14(ColorOut) 28
+                              Line 1 21 0
+              33:          30 Load 32(g_sam1D)
+              35:    8(fvec4) ImageSampleImplicitLod 33 34
+              36:    8(fvec4) Load 14(ColorOut)
+              37:    8(fvec4) FAdd 36 35
+                              Store 14(ColorOut) 37
+                              Line 1 22 0
+              39:          18 Load 38(g_sam2D)
+              42:    8(fvec4) ImageSampleImplicitLod 39 41
+              43:    8(fvec4) Load 14(ColorOut)
+              44:    8(fvec4) FAdd 43 42
+                              Store 14(ColorOut) 44
+                              Line 1 23 0
+              49:          46 Load 48(g_sam3D)
+              52:    8(fvec4) ImageSampleImplicitLod 49 51
+              53:    8(fvec4) Load 14(ColorOut)
+              54:    8(fvec4) FAdd 53 52
+                              Store 14(ColorOut) 54
+                              Line 1 24 0
+              59:          56 Load 58(g_samCube)
+              60:    8(fvec4) ImageSampleImplicitLod 59 51
+              61:    8(fvec4) Load 14(ColorOut)
+              62:    8(fvec4) FAdd 61 60
+                              Store 14(ColorOut) 62
+                              Line 1 26 0
+              63:          18 Load 20(g_sam)
+              65:    7(float) CompositeExtract 64 0
+              66:    7(float) CompositeExtract 64 1
+              67:   22(fvec2) CompositeConstruct 65 66
+              70:    7(float) CompositeExtract 64 3
+              71:    8(fvec4) ImageSampleExplicitLod 63 67 Lod 70
+              72:    8(fvec4) Load 14(ColorOut)
+              73:    8(fvec4) FAdd 72 71
+                              Store 14(ColorOut) 73
+                              Line 1 27 0
+              74:          30 Load 32(g_sam1D)
+              76:    7(float) CompositeExtract 75 0
+              77:    7(float) CompositeExtract 75 3
+              78:    8(fvec4) ImageSampleExplicitLod 74 76 Lod 77
+              79:    8(fvec4) Load 14(ColorOut)
+              80:    8(fvec4) FAdd 79 78
+                              Store 14(ColorOut) 80
+                              Line 1 28 0
+              81:          18 Load 38(g_sam2D)
+              83:    7(float) CompositeExtract 82 0
+              84:    7(float) CompositeExtract 82 1
+              85:   22(fvec2) CompositeConstruct 83 84
+              86:    7(float) CompositeExtract 82 3
+              87:    8(fvec4) ImageSampleExplicitLod 81 85 Lod 86
+              88:    8(fvec4) Load 14(ColorOut)
+              89:    8(fvec4) FAdd 88 87
+                              Store 14(ColorOut) 89
+                              Line 1 29 0
+              90:          46 Load 48(g_sam3D)
+              92:    7(float) CompositeExtract 91 0
+              93:    7(float) CompositeExtract 91 1
+              94:    7(float) CompositeExtract 91 2
+              95:   50(fvec3) CompositeConstruct 92 93 94
+              96:    7(float) CompositeExtract 91 3
+              97:    8(fvec4) ImageSampleExplicitLod 90 95 Lod 96
+              98:    8(fvec4) Load 14(ColorOut)
+              99:    8(fvec4) FAdd 98 97
+                              Store 14(ColorOut) 99
+                              Line 1 30 0
+             100:          56 Load 58(g_samCube)
+             101:    7(float) CompositeExtract 91 0
+             102:    7(float) CompositeExtract 91 1
+             103:    7(float) CompositeExtract 91 2
+             104:   50(fvec3) CompositeConstruct 101 102 103
+             105:    7(float) CompositeExtract 91 3
+             106:    8(fvec4) ImageSampleExplicitLod 100 104 Lod 105
+             107:    8(fvec4) Load 14(ColorOut)
+             108:    8(fvec4) FAdd 107 106
+                              Store 14(ColorOut) 108
+                              Line 1 32 0
+             113:    8(fvec4) Load 14(ColorOut)
+             115:    8(fvec4) CompositeConstruct 114 114 114 114
+             116:    8(fvec4) FDiv 113 115
+             117:     13(ptr) AccessChain 110(psout) 112
+                              Store 117 116
+                              Line 1 33 0
+             121:    120(ptr) AccessChain 110(psout) 118
+                              Store 121 119
+                              Line 1 35 0
+             122:9(PS_OUTPUT) Load 110(psout)
+                              ReturnValue 122
+                              FunctionEnd

+ 261 - 0
Test/baseResults/hlsl.sample.dx9.vert.out

@@ -0,0 +1,261 @@
+hlsl.sample.dx9.vert
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main( ( temp structure{ temp 4-component vector of float Pos})
+0:11    Function Parameters: 
+0:?     Sequence
+0:14      Sequence
+0:14        move second child to first child ( temp 4-component vector of float)
+0:14          'PosOut' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:16      add second child into first child ( temp 4-component vector of float)
+0:16        'PosOut' ( temp 4-component vector of float)
+0:16        textureLod ( temp 4-component vector of float)
+0:16          'g_sam' (layout( binding=0) uniform sampler2D)
+0:16          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.300000
+0:?               0.400000
+0:?               0.000000
+0:?               1.000000
+0:16          direct index ( temp float)
+0:?             Constant:
+0:?               0.300000
+0:?               0.400000
+0:?               0.000000
+0:?               1.000000
+0:16            Constant:
+0:16              3 (const int)
+0:17      add second child into first child ( temp 4-component vector of float)
+0:17        'PosOut' ( temp 4-component vector of float)
+0:17        textureLod ( temp 4-component vector of float)
+0:17          'g_sam2D' (layout( binding=1) uniform sampler2D)
+0:17          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               1.000000
+0:17          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               1.000000
+0:17            Constant:
+0:17              3 (const int)
+0:19      move second child to first child ( temp 4-component vector of float)
+0:19        Pos: direct index for structure ( temp 4-component vector of float)
+0:19          'vsout' ( temp structure{ temp 4-component vector of float Pos})
+0:19          Constant:
+0:19            0 (const int)
+0:19        divide ( temp 4-component vector of float)
+0:19          'PosOut' ( temp 4-component vector of float)
+0:19          Constant:
+0:19            2.000000
+0:21      Branch: Return with expression
+0:21        'vsout' ( temp structure{ temp 4-component vector of float Pos})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:11          Pos: direct index for structure ( temp 4-component vector of float)
+0:11            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
+0:11            Constant:
+0:11              0 (const int)
+0:?   Linker Objects
+0:?     'g_sam' (layout( binding=0) uniform sampler2D)
+0:?     'g_sam2D' (layout( binding=1) uniform sampler2D)
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main( ( temp structure{ temp 4-component vector of float Pos})
+0:11    Function Parameters: 
+0:?     Sequence
+0:14      Sequence
+0:14        move second child to first child ( temp 4-component vector of float)
+0:14          'PosOut' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:16      add second child into first child ( temp 4-component vector of float)
+0:16        'PosOut' ( temp 4-component vector of float)
+0:16        textureLod ( temp 4-component vector of float)
+0:16          'g_sam' (layout( binding=0) uniform sampler2D)
+0:16          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.300000
+0:?               0.400000
+0:?               0.000000
+0:?               1.000000
+0:16          direct index ( temp float)
+0:?             Constant:
+0:?               0.300000
+0:?               0.400000
+0:?               0.000000
+0:?               1.000000
+0:16            Constant:
+0:16              3 (const int)
+0:17      add second child into first child ( temp 4-component vector of float)
+0:17        'PosOut' ( temp 4-component vector of float)
+0:17        textureLod ( temp 4-component vector of float)
+0:17          'g_sam2D' (layout( binding=1) uniform sampler2D)
+0:17          Construct vec2 ( temp 2-component vector of float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               1.000000
+0:17          direct index ( temp float)
+0:?             Constant:
+0:?               0.500000
+0:?               0.600000
+0:?               0.000000
+0:?               1.000000
+0:17            Constant:
+0:17              3 (const int)
+0:19      move second child to first child ( temp 4-component vector of float)
+0:19        Pos: direct index for structure ( temp 4-component vector of float)
+0:19          'vsout' ( temp structure{ temp 4-component vector of float Pos})
+0:19          Constant:
+0:19            0 (const int)
+0:19        divide ( temp 4-component vector of float)
+0:19          'PosOut' ( temp 4-component vector of float)
+0:19          Constant:
+0:19            2.000000
+0:21      Branch: Return with expression
+0:21        'vsout' ( temp structure{ temp 4-component vector of float Pos})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:11          Pos: direct index for structure ( temp 4-component vector of float)
+0:11            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
+0:11            Constant:
+0:11              0 (const int)
+0:?   Linker Objects
+0:?     'g_sam' (layout( binding=0) uniform sampler2D)
+0:?     'g_sam2D' (layout( binding=1) uniform sampler2D)
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 64
+
+                              Capability Shader
+               2:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 5  "main" 61
+               1:             String  ""
+                              Source HLSL 500 1  "// OpModuleProcessed auto-map-locations
+// OpModuleProcessed auto-map-bindings
+// OpModuleProcessed entry-point main
+// OpModuleProcessed client vulkan100
+// OpModuleProcessed target-env vulkan1.0
+// OpModuleProcessed keep-uncalled
+// OpModuleProcessed hlsl-offsets
+#line 1
+"
+                              Name 5  "main"
+                              Name 9  "VS_OUTPUT"
+                              MemberName 9(VS_OUTPUT) 0  "Pos"
+                              Name 11  "@main("
+                              Name 14  "PosOut"
+                              Name 20  "g_sam"
+                              Name 36  "g_sam2D"
+                              Name 49  "vsout"
+                              Name 61  "@entryPointOutput.Pos"
+                              Decorate 20(g_sam) DescriptorSet 0
+                              Decorate 20(g_sam) Binding 0
+                              Decorate 36(g_sam2D) DescriptorSet 0
+                              Decorate 36(g_sam2D) Binding 1
+                              Decorate 61(@entryPointOutput.Pos) BuiltIn Position
+               3:             TypeVoid
+               4:             TypeFunction 3
+               7:             TypeFloat 32
+               8:             TypeVector 7(float) 4
+    9(VS_OUTPUT):             TypeStruct 8(fvec4)
+              10:             TypeFunction 9(VS_OUTPUT)
+              13:             TypePointer Function 8(fvec4)
+              15:    7(float) Constant 0
+              16:    8(fvec4) ConstantComposite 15 15 15 15
+              17:             TypeImage 7(float) 2D sampled format:Unknown
+              18:             TypeSampledImage 17
+              19:             TypePointer UniformConstant 18
+       20(g_sam):     19(ptr) Variable UniformConstant
+              22:    7(float) Constant 1050253722
+              23:    7(float) Constant 1053609165
+              24:    7(float) Constant 1065353216
+              25:    8(fvec4) ConstantComposite 22 23 15 24
+              26:             TypeVector 7(float) 2
+              30:             TypeInt 32 0
+              31:     30(int) Constant 3
+     36(g_sam2D):     19(ptr) Variable UniformConstant
+              38:    7(float) Constant 1056964608
+              39:    7(float) Constant 1058642330
+              40:    8(fvec4) ConstantComposite 38 39 15 24
+              48:             TypePointer Function 9(VS_OUTPUT)
+              50:             TypeInt 32 1
+              51:     50(int) Constant 0
+              53:    7(float) Constant 1073741824
+              60:             TypePointer Output 8(fvec4)
+61(@entryPointOutput.Pos):     60(ptr) Variable Output
+         5(main):           3 Function None 4
+               6:             Label
+                              Line 1 11 0
+              62:9(VS_OUTPUT) FunctionCall 11(@main()
+              63:    8(fvec4) CompositeExtract 62 0
+                              Store 61(@entryPointOutput.Pos) 63
+                              Return
+                              FunctionEnd
+      11(@main():9(VS_OUTPUT) Function None 10
+              12:             Label
+      14(PosOut):     13(ptr) Variable Function
+       49(vsout):     48(ptr) Variable Function
+                              Line 1 14 0
+                              Store 14(PosOut) 16
+                              Line 1 16 0
+              21:          18 Load 20(g_sam)
+              27:    7(float) CompositeExtract 25 0
+              28:    7(float) CompositeExtract 25 1
+              29:   26(fvec2) CompositeConstruct 27 28
+              32:    7(float) CompositeExtract 25 3
+              33:    8(fvec4) ImageSampleExplicitLod 21 29 Lod 32
+              34:    8(fvec4) Load 14(PosOut)
+              35:    8(fvec4) FAdd 34 33
+                              Store 14(PosOut) 35
+                              Line 1 17 0
+              37:          18 Load 36(g_sam2D)
+              41:    7(float) CompositeExtract 40 0
+              42:    7(float) CompositeExtract 40 1
+              43:   26(fvec2) CompositeConstruct 41 42
+              44:    7(float) CompositeExtract 40 3
+              45:    8(fvec4) ImageSampleExplicitLod 37 43 Lod 44
+              46:    8(fvec4) Load 14(PosOut)
+              47:    8(fvec4) FAdd 46 45
+                              Store 14(PosOut) 47
+                              Line 1 19 0
+              52:    8(fvec4) Load 14(PosOut)
+              54:    8(fvec4) CompositeConstruct 53 53 53 53
+              55:    8(fvec4) FDiv 52 54
+              56:     13(ptr) AccessChain 49(vsout) 51
+                              Store 56 55
+                              Line 1 21 0
+              57:9(VS_OUTPUT) Load 49(vsout)
+                              ReturnValue 57
+                              FunctionEnd

+ 36 - 0
Test/hlsl.sample.dx9.frag

@@ -0,0 +1,36 @@
+
+sampler            g_sam     : register(t0);
+sampler1D          g_sam1D   : register(t1);
+sampler2D          g_sam2D   : register(t2);
+sampler3D          g_sam3D	 : register(t3);
+samplerCube        g_samCube : register(t4);
+
+struct PS_OUTPUT
+{
+    float4 Color : SV_Target0;
+    float  Depth : SV_Depth;
+};
+
+PS_OUTPUT main()
+{
+   PS_OUTPUT psout;
+
+   float4 ColorOut = float4(0,0,0,0);
+   
+   ColorOut += tex2D(   g_sam  ,   float2(0.4,0.3));
+   ColorOut += tex1D(   g_sam1D,   0.5);
+   ColorOut += tex2D(   g_sam2D,   float2(0.5,0.6));
+   ColorOut += tex3D(   g_sam3D,   float3(0.5,0.6,0.4));
+   ColorOut += texCUBE( g_samCube, float3(0.5,0.6,0.4));
+   
+   ColorOut += tex2Dlod(   g_sam  ,   float4(0.4,0.3,0.0,0.0));
+   ColorOut += tex1Dlod(   g_sam1D,   float4(0.5,0.0,0.0,0.0));
+   ColorOut += tex2Dlod(   g_sam2D,   float4(0.5,0.6,0.0,0.0));
+   ColorOut += tex3Dlod(   g_sam3D,   float4(0.5,0.6,0.4,0.0));
+   ColorOut += texCUBElod( g_samCube, float4(0.5,0.6,0.4,0.0));
+  
+   psout.Color = ColorOut / 10.0f;
+   psout.Depth = 1.0;
+
+   return psout;
+}

+ 22 - 0
Test/hlsl.sample.dx9.vert

@@ -0,0 +1,22 @@
+
+sampler            g_sam   : register(t0);
+sampler2D          g_sam2D : register(t1);
+
+struct VS_OUTPUT
+{
+    float4 Pos : SV_Position;
+};
+
+VS_OUTPUT main()
+{
+   VS_OUTPUT vsout;
+
+   float4 PosOut = float4(0,0,0,0);
+   
+   PosOut += tex2Dlod(   g_sam  ,  float4(0.3f, 0.4f, 0.0f, 1.0f));
+   PosOut += tex2Dlod(   g_sam2D,  float4(0.5f, 0.6f, 0.0f, 1.0f));
+   
+   vsout.Pos = PosOut / 2.0f;
+
+   return vsout;
+}

+ 1 - 0
glslang/MachineIndependent/parseVersions.h

@@ -130,6 +130,7 @@ public:
     bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; }
     bool isReadingHLSL()    const { return (messages & EShMsgReadHlsl) == EShMsgReadHlsl; }
     bool hlslEnable16BitTypes() const { return (messages & EShMsgHlslEnable16BitTypes) != 0; }
+    bool hlslDX9Compatible() const { return (messages & EShMsgHlslDX9Compatible) != 0; }
 
     TInfoSink& infoSink;
 

+ 1 - 0
glslang/Public/ShaderLang.h

@@ -235,6 +235,7 @@ enum EShMessages {
     EShMsgDebugInfo        = (1 << 10), // save debug information
     EShMsgHlslEnable16BitTypes  = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
     EShMsgHlslLegalization  = (1 << 12), // enable HLSL Legalization messages
+    EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
 };
 
 //

+ 18 - 0
gtests/Hlsl.FromFile.cpp

@@ -62,6 +62,7 @@ using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEn
 using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslDebugTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
+using HlslDX9CompatibleTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 
 // Compiling HLSL to pre-legalized SPIR-V under Vulkan semantics. Expected
 // to successfully generate both AST and SPIR-V.
@@ -106,6 +107,14 @@ TEST_P(HlslDebugTest, FromFile)
                             "/baseResults/", false, true);
 }
 
+TEST_P(HlslDX9CompatibleTest, FromFile)
+{
+    loadFileCompileAndCheckWithOptions(GlobalTestSettings.testRoot, GetParam().fileName, Source::HLSL,
+                                       Semantics::Vulkan, glslang::EShTargetVulkan_1_0, Target::BothASTAndSpv, true,
+                                       GetParam().entryPoint, "/baseResults/",
+                                       EShMessages::EShMsgHlslDX9Compatible);
+}
+
 // clang-format off
 INSTANTIATE_TEST_CASE_P(
     ToSpirv, HlslCompileTest,
@@ -457,6 +466,15 @@ INSTANTIATE_TEST_CASE_P(
     FileNameAsCustomTestSuffix
 );
 
+INSTANTIATE_TEST_CASE_P(
+    ToSpirv, HlslDX9CompatibleTest,
+    ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
+        {"hlsl.sample.dx9.frag", "main"},
+        {"hlsl.sample.dx9.vert", "main"},
+    }),
+    FileNameAsCustomTestSuffix
+);
 // clang-format on
+
 }  // anonymous namespace
 }  // namespace glslangtest

+ 28 - 0
gtests/TestFixture.h

@@ -460,6 +460,34 @@ public:
                                     expectedOutputFname, result.spirvWarningsErrors);
     }
 
+	void loadFileCompileAndCheckWithOptions(const std::string &testDir, 
+											const std::string &testName, 
+											Source source,
+											Semantics semantics, 
+											glslang::EShTargetClientVersion clientTargetVersion,
+                                            Target target, bool automap = true, const std::string &entryPointName = "",
+                                            const std::string &baseDir = "/baseResults/",
+                                            const EShMessages additionalOptions = EShMessages::EShMsgDefault)
+    {
+        const std::string inputFname = testDir + "/" + testName;
+        const std::string expectedOutputFname = testDir + baseDir + testName + ".out";
+        std::string input, expectedOutput;
+
+        tryLoadFile(inputFname, "input", &input);
+        tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
+
+        EShMessages controls = DeriveOptions(source, semantics, target);
+        controls = static_cast<EShMessages>(controls | additionalOptions);
+        GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false,
+                                              EShTexSampTransKeep, false, automap);
+
+        // Generate the hybrid output in the way of glslangValidator.
+        std::ostringstream stream;
+        outputResultToStream(&stream, result, controls);
+
+        checkEqAndUpdateIfRequested(expectedOutput, stream.str(), expectedOutputFname);
+	}
+
     void loadFileCompileFlattenUniformsAndCheck(const std::string& testDir,
                                                 const std::string& testName,
                                                 Source source,

+ 50 - 1
hlsl/hlslGrammar.cpp

@@ -1163,6 +1163,49 @@ bool HlslGrammar::acceptSubpassInputType(TType& type)
     return true;
 }
 
+// sampler_type for DX9 compatibility 
+//      : SAMPLER
+//      | SAMPLER1D
+//      | SAMPLER2D
+//      | SAMPLER3D
+//      | SAMPLERCUBE
+bool HlslGrammar::acceptSamplerTypeDX9(TType &type)
+{
+    // read sampler type
+    const EHlslTokenClass samplerType = peek();
+
+    TSamplerDim dim = EsdNone;
+    TType txType(EbtFloat, EvqUniform, 4); // default type is float4
+
+    bool isShadow = false;
+
+    switch (samplerType)
+    {
+    case EHTokSampler:		dim = Esd2D;	break;
+    case EHTokSampler1d:	dim = Esd1D;	break;
+    case EHTokSampler2d:	dim = Esd2D;	break;
+    case EHTokSampler3d:	dim = Esd3D;	break;
+    case EHTokSamplerCube:	dim = EsdCube;	break;
+    default:
+        return false; // not a dx9 sampler declaration
+    }
+
+    advanceToken(); // consume the sampler type keyword
+
+    TArraySizes *arraySizes = nullptr; // TODO: array
+
+    TSampler sampler;
+    sampler.set(txType.getBasicType(), dim, false, isShadow, false);
+
+	if (!parseContext.setTextureReturnType(sampler, txType, token.loc))
+        return false;
+
+    type.shallowCopy(TType(sampler, EvqUniform, arraySizes));
+    type.getQualifier().layoutFormat = ElfNone;
+
+    return true;
+}
+
 // sampler_type
 //      : SAMPLER
 //      | SAMPLER1D
@@ -1445,7 +1488,13 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList)
     case EHTokSampler2d:              // ...
     case EHTokSampler3d:              // ...
     case EHTokSamplerCube:            // ...
-    case EHTokSamplerState:           // ...
+        if (parseContext.hlslDX9Compatible())
+			return acceptSamplerTypeDX9(type);
+        else
+            return acceptSamplerType(type);
+        break;
+
+    case EHTokSamplerState:           // fall through
     case EHTokSamplerComparisonState: // ...
         return acceptSamplerType(type);
         break;

+ 1 - 0
hlsl/hlslGrammar.h

@@ -84,6 +84,7 @@ namespace glslang {
         bool acceptStreamOutTemplateType(TType&, TLayoutGeometry&);
         bool acceptOutputPrimitiveGeometry(TLayoutGeometry&);
         bool acceptAnnotations(TQualifier&);
+        bool acceptSamplerTypeDX9(TType &);
         bool acceptSamplerType(TType&);
         bool acceptTextureType(TType&);
         bool acceptSubpassInputType(TType&);

+ 37 - 0
hlsl/hlslParseHelper.cpp

@@ -3770,6 +3770,43 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
 
             break;
         }
+    case EOpTextureLod: //is almost EOpTextureBias (only args & operations are different)
+        {
+            TIntermTyped *argSamp = argAggregate->getSequence()[0]->getAsTyped();   // sampler
+            TIntermTyped *argCoord = argAggregate->getSequence()[1]->getAsTyped();  // coord
+
+            assert(argCoord->getVectorSize() == 4);
+            TIntermTyped *w = intermediate.addConstantUnion(3, loc, true);
+            TIntermTyped *argLod = intermediate.addIndex(EOpIndexDirect, argCoord, w, loc);
+
+            TOperator constructOp = EOpNull;
+            const TSampler &sampler = argSamp->getType().getSampler();
+            int coordSize = 0;
+
+            switch (sampler.dim)
+            {
+            case Esd1D:   constructOp = EOpConstructFloat; coordSize = 1; break; // 1D
+            case Esd2D:   constructOp = EOpConstructVec2;  coordSize = 2; break; // 2D
+            case Esd3D:   constructOp = EOpConstructVec3;  coordSize = 3; break; // 3D
+            case EsdCube: constructOp = EOpConstructVec3;  coordSize = 3; break; // also 3D
+            default:
+                break;
+            }
+
+            TIntermAggregate *constructCoord = new TIntermAggregate(constructOp);
+            constructCoord->getSequence().push_back(argCoord);
+            constructCoord->setLoc(loc);
+            constructCoord->setType(TType(argCoord->getBasicType(), EvqTemporary, coordSize));
+
+            TIntermAggregate *tex = new TIntermAggregate(EOpTextureLod);
+            tex->getSequence().push_back(argSamp);        // sampler
+            tex->getSequence().push_back(constructCoord); // coordinate
+            tex->getSequence().push_back(argLod);         // lod
+
+            node = convertReturn(tex, sampler);
+
+            break;
+        }
 
     case EOpTextureBias:
         {

+ 7 - 7
hlsl/hlslParseables.cpp

@@ -698,17 +698,17 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
         { "step",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false },
         { "tan",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
         { "tanh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
-        { "tex1D",                            "V4",    "F",       "V1,S",           "S,F",           EShLangPS,     false },
-        { "tex1D",                            "V4",    "F",       "V1,S,V1,",       "S,F,,",         EShLangPS,     false },
-        { "tex1Dbias",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS,     false },
-        { "tex1Dgrad",                        "V4",    "F",       "V1,,,",          "S,F,,",         EShLangPS,     false },
-        { "tex1Dlod",                         "V4",    "F",       "V1,V4",          "S,F",           EShLangPS,     false },
-        { "tex1Dproj",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS,     false },
+        { "tex1D",                            "V4",    "F",       "S,S",            "S,F",           EShLangPS,     false },
+        { "tex1D",                            "V4",    "F",       "S,S,V1,",        "S,F,,",         EShLangPS,     false },
+        { "tex1Dbias",                        "V4",    "F",       "S,V4",           "S,F",           EShLangPS,     false },
+        { "tex1Dgrad",                        "V4",    "F",       "S,,,",           "S,F,,",         EShLangPS,     false },
+        { "tex1Dlod",                         "V4",    "F",       "S,V4",           "S,F",           EShLangPS,     false },
+        { "tex1Dproj",                        "V4",    "F",       "S,V4",           "S,F",           EShLangPS,     false },
         { "tex2D",                            "V4",    "F",       "V2,",            "S,F",           EShLangPS,     false },
         { "tex2D",                            "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS,     false },
         { "tex2Dbias",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS,     false },
         { "tex2Dgrad",                        "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS,     false },
-        { "tex2Dlod",                         "V4",    "F",       "V2,V4",          "S,F",           EShLangPS,     false },
+        { "tex2Dlod",                         "V4",    "F",       "V2,V4",          "S,F",           EShLangAll,    false },
         { "tex2Dproj",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS,     false },
         { "tex3D",                            "V4",    "F",       "V3,",            "S,F",           EShLangPS,     false },
         { "tex3D",                            "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS,     false },