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.
This commit is contained in:
Rex Xu 2017-03-29 17:12:40 +08:00
parent 86e49d1773
commit 470026f9d7
4 changed files with 154 additions and 115 deletions

View File

@ -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;

View File

@ -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));

View 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

View 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