diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index 060428bf..42a46cee 100755 --- a/StandAlone/StandAlone.cpp +++ b/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 IncludeDirectoryList; // Source environment @@ -509,6 +510,8 @@ void ProcessArguments(std::vector>& 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" diff --git a/Test/baseResults/hlsl.sample.dx9.frag.out b/Test/baseResults/hlsl.sample.dx9.frag.out new file mode 100644 index 00000000..7b3432af --- /dev/null +++ b/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 diff --git a/Test/baseResults/hlsl.sample.dx9.vert.out b/Test/baseResults/hlsl.sample.dx9.vert.out new file mode 100644 index 00000000..732b0439 --- /dev/null +++ b/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 diff --git a/Test/hlsl.sample.dx9.frag b/Test/hlsl.sample.dx9.frag new file mode 100644 index 00000000..26094193 --- /dev/null +++ b/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; +} diff --git a/Test/hlsl.sample.dx9.vert b/Test/hlsl.sample.dx9.vert new file mode 100644 index 00000000..82d52b16 --- /dev/null +++ b/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; +} diff --git a/glslang/MachineIndependent/parseVersions.h b/glslang/MachineIndependent/parseVersions.h index be468da5..e42cde04 100644 --- a/glslang/MachineIndependent/parseVersions.h +++ b/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; diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h index c5eca4e1..9ce794d7 100755 --- a/glslang/Public/ShaderLang.h +++ b/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) }; // diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp old mode 100644 new mode 100755 index d4c2202e..74d6fc26 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -62,6 +62,7 @@ using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam>; using HlslLegalizeTest = GlslangTest<::testing::TestWithParam>; using HlslDebugTest = GlslangTest<::testing::TestWithParam>; +using HlslDX9CompatibleTest = GlslangTest<::testing::TestWithParam>; // 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{ + {"hlsl.sample.dx9.frag", "main"}, + {"hlsl.sample.dx9.vert", "main"}, + }), + FileNameAsCustomTestSuffix +); // clang-format on + } // anonymous namespace } // namespace glslangtest diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h index 49320126..6bca38e4 100755 --- a/gtests/TestFixture.h +++ b/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(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, diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 6acaccbf..7b3bb10f 100644 --- a/hlsl/hlslGrammar.cpp +++ b/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; diff --git a/hlsl/hlslGrammar.h b/hlsl/hlslGrammar.h index 323f3b13..a41220b1 100644 --- a/hlsl/hlslGrammar.h +++ b/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&); diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 699c524b..e3e72106 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/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: { diff --git a/hlsl/hlslParseables.cpp b/hlsl/hlslParseables.cpp index 65000912..a63ecb60 100644 --- a/hlsl/hlslParseables.cpp +++ b/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 },