HLSL: Fix an issue of frexp().
authorRex Xu <rex.xu@amd.com>
Wed, 29 Mar 2017 09:12:40 +0000 (17:12 +0800)
committerRex Xu <rex.xu@amd.com>
Wed, 29 Mar 2017 09:12:40 +0000 (17:12 +0800)
The "exp" parameter is floating-point type in HLSL intrinsic while it is
integer type in GLSL built-in function.

SPIRV/GlslangToSpv.cpp
SPIRV/SpvBuilder.h
Test/baseResults/hlsl.intrinsic.frexp.frag.out
Test/baseResults/hlsl.intrinsic.frexp.vert.out

index d30432e..a14b2bb 100755 (executable)
@@ -4609,6 +4609,9 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
     spv::Id typeId0 = 0;
     if (consumedOperands > 0)
         typeId0 = builder.getTypeId(operands[0]);
+    spv::Id typeId1 = 0;
+    if (consumedOperands > 1)
+        typeId1 = builder.getTypeId(operands[1]);
     spv::Id frexpIntType = 0;
 
     switch (op) {
@@ -4730,13 +4733,22 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
         libCall = spv::GLSLstd450Fma;
         break;
     case glslang::EOpFrexp:
-        libCall = spv::GLSLstd450FrexpStruct;
-        if (builder.getNumComponents(operands[0]) == 1)
-            frexpIntType = builder.makeIntegerType(32, true);
-        else
-            frexpIntType = builder.makeVectorType(builder.makeIntegerType(32, true), builder.getNumComponents(operands[0]));
-        typeId = builder.makeStructResultType(typeId0, frexpIntType);
-        consumedOperands = 1;
+        {
+            libCall = spv::GLSLstd450FrexpStruct;
+            assert(builder.isPointerType(typeId1));
+            typeId1 = builder.getContainedTypeId(typeId1);
+#ifdef AMD_EXTENSIONS
+            int width = builder.getScalarTypeWidth(typeId1);
+#else
+            int width = 32;
+#endif
+            if (builder.getNumComponents(operands[0]) == 1)
+                frexpIntType = builder.makeIntegerType(width, true);
+            else
+                frexpIntType = builder.makeVectorType(builder.makeIntegerType(width, true), builder.getNumComponents(operands[0]));
+            typeId = builder.makeStructResultType(typeId0, frexpIntType);
+            consumedOperands = 1;
+        }
         break;
     case glslang::EOpLdexp:
         libCall = spv::GLSLstd450Ldexp;
@@ -4844,9 +4856,18 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
         builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[2]);
         break;
     case glslang::EOpFrexp:
-        assert(operands.size() == 2);
-        builder.createStore(builder.createCompositeExtract(id, frexpIntType, 1), operands[1]);
-        id = builder.createCompositeExtract(id, typeId0, 0);
+        {
+            assert(operands.size() == 2);
+            if (builder.isFloatType(builder.getScalarTypeId(typeId1))) {
+                // "exp" is floating-point type (from HLSL intrinsic)
+                spv::Id member1 = builder.createCompositeExtract(id, frexpIntType, 1);
+                member1 = builder.createUnaryOp(spv::OpConvertSToF, typeId1, member1);
+                builder.createStore(member1, operands[1]);
+            } else
+                // "exp" is integer type (from GLSL built-in function)
+                builder.createStore(builder.createCompositeExtract(id, frexpIntType, 1), operands[1]);
+            id = builder.createCompositeExtract(id, typeId0, 0);
+        }
         break;
     default:
         break;
index 204d3e7..d93174e 100755 (executable)
@@ -134,6 +134,9 @@ public:
     bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); }
 
     bool isBoolType(Id typeId)         const { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); }
+    bool isIntType(Id typeId)          const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; }
+    bool isUintType(Id typeId)         const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; }
+    bool isFloatType(Id typeId)        const { return getTypeClass(typeId) == OpTypeFloat; }
     bool isPointerType(Id typeId)      const { return getTypeClass(typeId) == OpTypePointer; }
     bool isScalarType(Id typeId)       const { return getTypeClass(typeId) == OpTypeFloat  || getTypeClass(typeId) == OpTypeInt || getTypeClass(typeId) == OpTypeBool; }
     bool isVectorType(Id typeId)       const { return getTypeClass(typeId) == OpTypeVector; }
@@ -153,6 +156,13 @@ public:
     unsigned int getConstantScalar(Id resultId) const { return module.getInstruction(resultId)->getImmediateOperand(0); }
     StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); }
 
+    int getScalarTypeWidth(Id typeId) const
+    {
+        Id scalarTypeId = getScalarTypeId(typeId);
+        assert(getTypeClass(scalarTypeId) == OpTypeInt || getTypeClass(scalarTypeId) == OpTypeFloat);
+        return module.getInstruction(scalarTypeId)->getImmediateOperand(0);
+    }
+
     int getTypeNumColumns(Id typeId) const
     {
         assert(isMatrixType(typeId));
index 971a34e..fc827f8 100644 (file)
@@ -191,12 +191,12 @@ gl_FragCoord origin is upper left
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 94
+// Id's are bound by 98
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 91
+                              EntryPoint Fragment 4  "main" 95
                               ExecutionMode 4 OriginUpperLeft
                               Name 4  "main"
                               Name 11  "PixelShaderFunctionS(f1;f1;"
@@ -216,15 +216,15 @@ gl_FragCoord origin is upper left
                               Name 36  "@main("
                               Name 38  "r000"
                               Name 41  "ResType"
-                              Name 48  "r000"
-                              Name 51  "ResType"
-                              Name 60  "r000"
-                              Name 63  "ResType"
-                              Name 71  "r000"
-                              Name 74  "ResType"
-                              Name 83  "ps_output"
-                              Name 91  "color"
-                              Decorate 91(color) Location 0
+                              Name 49  "r000"
+                              Name 52  "ResType"
+                              Name 62  "r000"
+                              Name 65  "ResType"
+                              Name 74  "r000"
+                              Name 77  "ResType"
+                              Name 87  "ps_output"
+                              Name 95  "color"
+                              Decorate 95(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -243,30 +243,30 @@ gl_FragCoord origin is upper left
               35:             TypeFunction 34(PS_OUTPUT)
               40:             TypeInt 32 1
      41(ResType):             TypeStruct 6(float) 40(int)
-              45:    6(float) Constant 0
-              50:             TypeVector 40(int) 2
-     51(ResType):             TypeStruct 13(fvec2) 50(ivec2)
-              55:    6(float) Constant 1065353216
-              56:    6(float) Constant 1073741824
-              57:   13(fvec2) ConstantComposite 55 56
-              62:             TypeVector 40(int) 3
-     63(ResType):             TypeStruct 20(fvec3) 62(ivec3)
-              67:    6(float) Constant 1077936128
-              68:   20(fvec3) ConstantComposite 55 56 67
-              73:             TypeVector 40(int) 4
-     74(ResType):             TypeStruct 27(fvec4) 73(ivec4)
-              78:    6(float) Constant 1082130432
-              79:   27(fvec4) ConstantComposite 55 56 67 78
-              82:             TypePointer Function 34(PS_OUTPUT)
-              84:     40(int) Constant 0
-              85:   27(fvec4) ConstantComposite 55 55 55 55
-              90:             TypePointer Output 27(fvec4)
-       91(color):     90(ptr) Variable Output
+              46:    6(float) Constant 0
+              51:             TypeVector 40(int) 2
+     52(ResType):             TypeStruct 13(fvec2) 51(ivec2)
+              57:    6(float) Constant 1065353216
+              58:    6(float) Constant 1073741824
+              59:   13(fvec2) ConstantComposite 57 58
+              64:             TypeVector 40(int) 3
+     65(ResType):             TypeStruct 20(fvec3) 64(ivec3)
+              70:    6(float) Constant 1077936128
+              71:   20(fvec3) ConstantComposite 57 58 70
+              76:             TypeVector 40(int) 4
+     77(ResType):             TypeStruct 27(fvec4) 76(ivec4)
+              82:    6(float) Constant 1082130432
+              83:   27(fvec4) ConstantComposite 57 58 70 82
+              86:             TypePointer Function 34(PS_OUTPUT)
+              88:     40(int) Constant 0
+              89:   27(fvec4) ConstantComposite 57 57 57 57
+              94:             TypePointer Output 27(fvec4)
+       95(color):     94(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              92:34(PS_OUTPUT) FunctionCall 36(@main()
-              93:   27(fvec4) CompositeExtract 92 0
-                              Store 91(color) 93
+              96:34(PS_OUTPUT) FunctionCall 36(@main()
+              97:   27(fvec4) CompositeExtract 96 0
+                              Store 95(color) 97
                               Return
                               FunctionEnd
 11(PixelShaderFunctionS(f1;f1;):    6(float) Function None 8
@@ -277,55 +277,59 @@ gl_FragCoord origin is upper left
               39:    6(float) Load 9(inF0)
               42: 41(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 39
               43:     40(int) CompositeExtract 42 1
-                              Store 10(inF1) 43
-              44:    6(float) CompositeExtract 42 0
-                              Store 38(r000) 44
-                              ReturnValue 45
+              44:    6(float) ConvertSToF 43
+                              Store 10(inF1) 44
+              45:    6(float) CompositeExtract 42 0
+                              Store 38(r000) 45
+                              ReturnValue 46
                               FunctionEnd
 18(PixelShaderFunction2(vf2;vf2;):   13(fvec2) Function None 15
         16(inF0):     14(ptr) FunctionParameter
         17(inF1):     14(ptr) FunctionParameter
               19:             Label
-        48(r000):     14(ptr) Variable Function
-              49:   13(fvec2) Load 16(inF0)
-              52: 51(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 49
-              53:   50(ivec2) CompositeExtract 52 1
-                              Store 17(inF1) 53
-              54:   13(fvec2) CompositeExtract 52 0
-                              Store 48(r000) 54
-                              ReturnValue 57
+        49(r000):     14(ptr) Variable Function
+              50:   13(fvec2) Load 16(inF0)
+              53: 52(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 50
+              54:   51(ivec2) CompositeExtract 53 1
+              55:   13(fvec2) ConvertSToF 54
+                              Store 17(inF1) 55
+              56:   13(fvec2) CompositeExtract 53 0
+                              Store 49(r000) 56
+                              ReturnValue 59
                               FunctionEnd
 25(PixelShaderFunction3(vf3;vf3;):   20(fvec3) Function None 22
         23(inF0):     21(ptr) FunctionParameter
         24(inF1):     21(ptr) FunctionParameter
               26:             Label
-        60(r000):     21(ptr) Variable Function
-              61:   20(fvec3) Load 23(inF0)
-              64: 63(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 61
-              65:   62(ivec3) CompositeExtract 64 1
-                              Store 24(inF1) 65
-              66:   20(fvec3) CompositeExtract 64 0
-                              Store 60(r000) 66
-                              ReturnValue 68
+        62(r000):     21(ptr) Variable Function
+              63:   20(fvec3) Load 23(inF0)
+              66: 65(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 63
+              67:   64(ivec3) CompositeExtract 66 1
+              68:   20(fvec3) ConvertSToF 67
+                              Store 24(inF1) 68
+              69:   20(fvec3) CompositeExtract 66 0
+                              Store 62(r000) 69
+                              ReturnValue 71
                               FunctionEnd
 32(PixelShaderFunction(vf4;vf4;):   27(fvec4) Function None 29
         30(inF0):     28(ptr) FunctionParameter
         31(inF1):     28(ptr) FunctionParameter
               33:             Label
-        71(r000):     28(ptr) Variable Function
-              72:   27(fvec4) Load 30(inF0)
-              75: 74(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 72
-              76:   73(ivec4) CompositeExtract 75 1
-                              Store 31(inF1) 76
-              77:   27(fvec4) CompositeExtract 75 0
-                              Store 71(r000) 77
-                              ReturnValue 79
+        74(r000):     28(ptr) Variable Function
+              75:   27(fvec4) Load 30(inF0)
+              78: 77(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 75
+              79:   76(ivec4) CompositeExtract 78 1
+              80:   27(fvec4) ConvertSToF 79
+                              Store 31(inF1) 80
+              81:   27(fvec4) CompositeExtract 78 0
+                              Store 74(r000) 81
+                              ReturnValue 83
                               FunctionEnd
       36(@main():34(PS_OUTPUT) Function None 35
               37:             Label
-   83(ps_output):     82(ptr) Variable Function
-              86:     28(ptr) AccessChain 83(ps_output) 84
-                              Store 86 85
-              87:34(PS_OUTPUT) Load 83(ps_output)
-                              ReturnValue 87
+   87(ps_output):     86(ptr) Variable Function
+              90:     28(ptr) AccessChain 87(ps_output) 88
+                              Store 90 89
+              91:34(PS_OUTPUT) Load 87(ps_output)
+                              ReturnValue 91
                               FunctionEnd
index b1df12d..4931b93 100644 (file)
@@ -114,7 +114,7 @@ Shader version: 450
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 74
+// Id's are bound by 78
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -134,9 +134,9 @@ Shader version: 450
                               Name 30  "inF0"
                               Name 31  "inF1"
                               Name 36  "ResType"
-                              Name 45  "ResType"
-                              Name 56  "ResType"
-                              Name 66  "ResType"
+                              Name 46  "ResType"
+                              Name 58  "ResType"
+                              Name 69  "ResType"
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -153,20 +153,20 @@ Shader version: 450
               29:             TypeFunction 27(fvec4) 28(ptr) 28(ptr)
               35:             TypeInt 32 1
      36(ResType):             TypeStruct 6(float) 35(int)
-              40:    6(float) Constant 0
-              44:             TypeVector 35(int) 2
-     45(ResType):             TypeStruct 13(fvec2) 44(ivec2)
-              49:    6(float) Constant 1065353216
-              50:    6(float) Constant 1073741824
-              51:   13(fvec2) ConstantComposite 49 50
-              55:             TypeVector 35(int) 3
-     56(ResType):             TypeStruct 20(fvec3) 55(ivec3)
-              60:    6(float) Constant 1077936128
-              61:   20(fvec3) ConstantComposite 49 50 60
-              65:             TypeVector 35(int) 4
-     66(ResType):             TypeStruct 27(fvec4) 65(ivec4)
-              70:    6(float) Constant 1082130432
-              71:   27(fvec4) ConstantComposite 49 50 60 70
+              41:    6(float) Constant 0
+              45:             TypeVector 35(int) 2
+     46(ResType):             TypeStruct 13(fvec2) 45(ivec2)
+              51:    6(float) Constant 1065353216
+              52:    6(float) Constant 1073741824
+              53:   13(fvec2) ConstantComposite 51 52
+              57:             TypeVector 35(int) 3
+     58(ResType):             TypeStruct 20(fvec3) 57(ivec3)
+              63:    6(float) Constant 1077936128
+              64:   20(fvec3) ConstantComposite 51 52 63
+              68:             TypeVector 35(int) 4
+     69(ResType):             TypeStruct 27(fvec4) 68(ivec4)
+              74:    6(float) Constant 1082130432
+              75:   27(fvec4) ConstantComposite 51 52 63 74
 4(VertexShaderFunction):           2 Function None 3
                5:             Label
                               Return
@@ -178,40 +178,44 @@ Shader version: 450
               34:    6(float) Load 9(inF0)
               37: 36(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 34
               38:     35(int) CompositeExtract 37 1
-                              Store 10(inF1) 38
-              39:    6(float) CompositeExtract 37 0
-                              ReturnValue 40
+              39:    6(float) ConvertSToF 38
+                              Store 10(inF1) 39
+              40:    6(float) CompositeExtract 37 0
+                              ReturnValue 41
                               FunctionEnd
 18(VertexShaderFunction2(vf2;vf2;):   13(fvec2) Function None 15
         16(inF0):     14(ptr) FunctionParameter
         17(inF1):     14(ptr) FunctionParameter
               19:             Label
-              43:   13(fvec2) Load 16(inF0)
-              46: 45(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 43
-              47:   44(ivec2) CompositeExtract 46 1
-                              Store 17(inF1) 47
-              48:   13(fvec2) CompositeExtract 46 0
-                              ReturnValue 51
+              44:   13(fvec2) Load 16(inF0)
+              47: 46(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 44
+              48:   45(ivec2) CompositeExtract 47 1
+              49:   13(fvec2) ConvertSToF 48
+                              Store 17(inF1) 49
+              50:   13(fvec2) CompositeExtract 47 0
+                              ReturnValue 53
                               FunctionEnd
 25(VertexShaderFunction3(vf3;vf3;):   20(fvec3) Function None 22
         23(inF0):     21(ptr) FunctionParameter
         24(inF1):     21(ptr) FunctionParameter
               26:             Label
-              54:   20(fvec3) Load 23(inF0)
-              57: 56(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 54
-              58:   55(ivec3) CompositeExtract 57 1
-                              Store 24(inF1) 58
-              59:   20(fvec3) CompositeExtract 57 0
-                              ReturnValue 61
+              56:   20(fvec3) Load 23(inF0)
+              59: 58(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 56
+              60:   57(ivec3) CompositeExtract 59 1
+              61:   20(fvec3) ConvertSToF 60
+                              Store 24(inF1) 61
+              62:   20(fvec3) CompositeExtract 59 0
+                              ReturnValue 64
                               FunctionEnd
 32(VertexShaderFunction4(vf4;vf4;):   27(fvec4) Function None 29
         30(inF0):     28(ptr) FunctionParameter
         31(inF1):     28(ptr) FunctionParameter
               33:             Label
-              64:   27(fvec4) Load 30(inF0)
-              67: 66(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 64
-              68:   65(ivec4) CompositeExtract 67 1
-                              Store 31(inF1) 68
-              69:   27(fvec4) CompositeExtract 67 0
-                              ReturnValue 71
+              67:   27(fvec4) Load 30(inF0)
+              70: 69(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 67
+              71:   68(ivec4) CompositeExtract 70 1
+              72:   27(fvec4) ConvertSToF 71
+                              Store 31(inF1) 72
+              73:   27(fvec4) CompositeExtract 70 0
+                              ReturnValue 75
                               FunctionEnd