HLSL: Fix an issue of frexp().
The "exp" parameter is floating-point type in HLSL intrinsic while it is
integer type in GLSL built-in function.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index d30432e..a14b2bb 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -4609,6 +4609,9 @@
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 @@
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 @@
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;
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index 204d3e7..d93174e 100755
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -134,6 +134,9 @@
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 @@
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));
diff --git a/Test/baseResults/hlsl.intrinsic.frexp.frag.out b/Test/baseResults/hlsl.intrinsic.frexp.frag.out
index 971a34e..fc827f8 100644
--- a/Test/baseResults/hlsl.intrinsic.frexp.frag.out
+++ b/Test/baseResults/hlsl.intrinsic.frexp.frag.out
@@ -191,12 +191,12 @@
// 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 @@
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 @@
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 @@
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
diff --git a/Test/baseResults/hlsl.intrinsic.frexp.vert.out b/Test/baseResults/hlsl.intrinsic.frexp.vert.out
index b1df12d..4931b93 100644
--- a/Test/baseResults/hlsl.intrinsic.frexp.vert.out
+++ b/Test/baseResults/hlsl.intrinsic.frexp.vert.out
@@ -114,7 +114,7 @@
// 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 @@
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 @@
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 @@
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