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; spv::Id typeId0 = 0;
if (consumedOperands > 0) if (consumedOperands > 0)
typeId0 = builder.getTypeId(operands[0]); typeId0 = builder.getTypeId(operands[0]);
spv::Id typeId1 = 0;
if (consumedOperands > 1)
typeId1 = builder.getTypeId(operands[1]);
spv::Id frexpIntType = 0; spv::Id frexpIntType = 0;
switch (op) { switch (op) {
@ -4730,13 +4733,22 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
libCall = spv::GLSLstd450Fma; libCall = spv::GLSLstd450Fma;
break; break;
case glslang::EOpFrexp: case glslang::EOpFrexp:
{
libCall = spv::GLSLstd450FrexpStruct; 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) if (builder.getNumComponents(operands[0]) == 1)
frexpIntType = builder.makeIntegerType(32, true); frexpIntType = builder.makeIntegerType(width, true);
else else
frexpIntType = builder.makeVectorType(builder.makeIntegerType(32, true), builder.getNumComponents(operands[0])); frexpIntType = builder.makeVectorType(builder.makeIntegerType(width, true), builder.getNumComponents(operands[0]));
typeId = builder.makeStructResultType(typeId0, frexpIntType); typeId = builder.makeStructResultType(typeId0, frexpIntType);
consumedOperands = 1; consumedOperands = 1;
}
break; break;
case glslang::EOpLdexp: case glslang::EOpLdexp:
libCall = spv::GLSLstd450Ldexp; libCall = spv::GLSLstd450Ldexp;
@ -4844,9 +4856,18 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[2]); builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[2]);
break; break;
case glslang::EOpFrexp: case glslang::EOpFrexp:
{
assert(operands.size() == 2); 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]); builder.createStore(builder.createCompositeExtract(id, frexpIntType, 1), operands[1]);
id = builder.createCompositeExtract(id, typeId0, 0); id = builder.createCompositeExtract(id, typeId0, 0);
}
break; break;
default: default:
break; break;

View File

@ -134,6 +134,9 @@ public:
bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); } 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 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 isPointerType(Id typeId) const { return getTypeClass(typeId) == OpTypePointer; }
bool isScalarType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat || getTypeClass(typeId) == OpTypeInt || getTypeClass(typeId) == OpTypeBool; } bool isScalarType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat || getTypeClass(typeId) == OpTypeInt || getTypeClass(typeId) == OpTypeBool; }
bool isVectorType(Id typeId) const { return getTypeClass(typeId) == OpTypeVector; } 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); } unsigned int getConstantScalar(Id resultId) const { return module.getInstruction(resultId)->getImmediateOperand(0); }
StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); } 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 int getTypeNumColumns(Id typeId) const
{ {
assert(isMatrixType(typeId)); assert(isMatrixType(typeId));

View File

@ -191,12 +191,12 @@ gl_FragCoord origin is upper left
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 94 // Id's are bound by 98
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 91 EntryPoint Fragment 4 "main" 95
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Name 4 "main" Name 4 "main"
Name 11 "PixelShaderFunctionS(f1;f1;" Name 11 "PixelShaderFunctionS(f1;f1;"
@ -216,15 +216,15 @@ gl_FragCoord origin is upper left
Name 36 "@main(" Name 36 "@main("
Name 38 "r000" Name 38 "r000"
Name 41 "ResType" Name 41 "ResType"
Name 48 "r000" Name 49 "r000"
Name 51 "ResType" Name 52 "ResType"
Name 60 "r000" Name 62 "r000"
Name 63 "ResType" Name 65 "ResType"
Name 71 "r000" Name 74 "r000"
Name 74 "ResType" Name 77 "ResType"
Name 83 "ps_output" Name 87 "ps_output"
Name 91 "color" Name 95 "color"
Decorate 91(color) Location 0 Decorate 95(color) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -243,30 +243,30 @@ gl_FragCoord origin is upper left
35: TypeFunction 34(PS_OUTPUT) 35: TypeFunction 34(PS_OUTPUT)
40: TypeInt 32 1 40: TypeInt 32 1
41(ResType): TypeStruct 6(float) 40(int) 41(ResType): TypeStruct 6(float) 40(int)
45: 6(float) Constant 0 46: 6(float) Constant 0
50: TypeVector 40(int) 2 51: TypeVector 40(int) 2
51(ResType): TypeStruct 13(fvec2) 50(ivec2) 52(ResType): TypeStruct 13(fvec2) 51(ivec2)
55: 6(float) Constant 1065353216 57: 6(float) Constant 1065353216
56: 6(float) Constant 1073741824 58: 6(float) Constant 1073741824
57: 13(fvec2) ConstantComposite 55 56 59: 13(fvec2) ConstantComposite 57 58
62: TypeVector 40(int) 3 64: TypeVector 40(int) 3
63(ResType): TypeStruct 20(fvec3) 62(ivec3) 65(ResType): TypeStruct 20(fvec3) 64(ivec3)
67: 6(float) Constant 1077936128 70: 6(float) Constant 1077936128
68: 20(fvec3) ConstantComposite 55 56 67 71: 20(fvec3) ConstantComposite 57 58 70
73: TypeVector 40(int) 4 76: TypeVector 40(int) 4
74(ResType): TypeStruct 27(fvec4) 73(ivec4) 77(ResType): TypeStruct 27(fvec4) 76(ivec4)
78: 6(float) Constant 1082130432 82: 6(float) Constant 1082130432
79: 27(fvec4) ConstantComposite 55 56 67 78 83: 27(fvec4) ConstantComposite 57 58 70 82
82: TypePointer Function 34(PS_OUTPUT) 86: TypePointer Function 34(PS_OUTPUT)
84: 40(int) Constant 0 88: 40(int) Constant 0
85: 27(fvec4) ConstantComposite 55 55 55 55 89: 27(fvec4) ConstantComposite 57 57 57 57
90: TypePointer Output 27(fvec4) 94: TypePointer Output 27(fvec4)
91(color): 90(ptr) Variable Output 95(color): 94(ptr) Variable Output
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
92:34(PS_OUTPUT) FunctionCall 36(@main() 96:34(PS_OUTPUT) FunctionCall 36(@main()
93: 27(fvec4) CompositeExtract 92 0 97: 27(fvec4) CompositeExtract 96 0
Store 91(color) 93 Store 95(color) 97
Return Return
FunctionEnd FunctionEnd
11(PixelShaderFunctionS(f1;f1;): 6(float) Function None 8 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) 39: 6(float) Load 9(inF0)
42: 41(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 39 42: 41(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 39
43: 40(int) CompositeExtract 42 1 43: 40(int) CompositeExtract 42 1
Store 10(inF1) 43 44: 6(float) ConvertSToF 43
44: 6(float) CompositeExtract 42 0 Store 10(inF1) 44
Store 38(r000) 44 45: 6(float) CompositeExtract 42 0
ReturnValue 45 Store 38(r000) 45
ReturnValue 46
FunctionEnd FunctionEnd
18(PixelShaderFunction2(vf2;vf2;): 13(fvec2) Function None 15 18(PixelShaderFunction2(vf2;vf2;): 13(fvec2) Function None 15
16(inF0): 14(ptr) FunctionParameter 16(inF0): 14(ptr) FunctionParameter
17(inF1): 14(ptr) FunctionParameter 17(inF1): 14(ptr) FunctionParameter
19: Label 19: Label
48(r000): 14(ptr) Variable Function 49(r000): 14(ptr) Variable Function
49: 13(fvec2) Load 16(inF0) 50: 13(fvec2) Load 16(inF0)
52: 51(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 49 53: 52(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 50
53: 50(ivec2) CompositeExtract 52 1 54: 51(ivec2) CompositeExtract 53 1
Store 17(inF1) 53 55: 13(fvec2) ConvertSToF 54
54: 13(fvec2) CompositeExtract 52 0 Store 17(inF1) 55
Store 48(r000) 54 56: 13(fvec2) CompositeExtract 53 0
ReturnValue 57 Store 49(r000) 56
ReturnValue 59
FunctionEnd FunctionEnd
25(PixelShaderFunction3(vf3;vf3;): 20(fvec3) Function None 22 25(PixelShaderFunction3(vf3;vf3;): 20(fvec3) Function None 22
23(inF0): 21(ptr) FunctionParameter 23(inF0): 21(ptr) FunctionParameter
24(inF1): 21(ptr) FunctionParameter 24(inF1): 21(ptr) FunctionParameter
26: Label 26: Label
60(r000): 21(ptr) Variable Function 62(r000): 21(ptr) Variable Function
61: 20(fvec3) Load 23(inF0) 63: 20(fvec3) Load 23(inF0)
64: 63(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 61 66: 65(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 63
65: 62(ivec3) CompositeExtract 64 1 67: 64(ivec3) CompositeExtract 66 1
Store 24(inF1) 65 68: 20(fvec3) ConvertSToF 67
66: 20(fvec3) CompositeExtract 64 0 Store 24(inF1) 68
Store 60(r000) 66 69: 20(fvec3) CompositeExtract 66 0
ReturnValue 68 Store 62(r000) 69
ReturnValue 71
FunctionEnd FunctionEnd
32(PixelShaderFunction(vf4;vf4;): 27(fvec4) Function None 29 32(PixelShaderFunction(vf4;vf4;): 27(fvec4) Function None 29
30(inF0): 28(ptr) FunctionParameter 30(inF0): 28(ptr) FunctionParameter
31(inF1): 28(ptr) FunctionParameter 31(inF1): 28(ptr) FunctionParameter
33: Label 33: Label
71(r000): 28(ptr) Variable Function 74(r000): 28(ptr) Variable Function
72: 27(fvec4) Load 30(inF0) 75: 27(fvec4) Load 30(inF0)
75: 74(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 72 78: 77(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 75
76: 73(ivec4) CompositeExtract 75 1 79: 76(ivec4) CompositeExtract 78 1
Store 31(inF1) 76 80: 27(fvec4) ConvertSToF 79
77: 27(fvec4) CompositeExtract 75 0 Store 31(inF1) 80
Store 71(r000) 77 81: 27(fvec4) CompositeExtract 78 0
ReturnValue 79 Store 74(r000) 81
ReturnValue 83
FunctionEnd FunctionEnd
36(@main():34(PS_OUTPUT) Function None 35 36(@main():34(PS_OUTPUT) Function None 35
37: Label 37: Label
83(ps_output): 82(ptr) Variable Function 87(ps_output): 86(ptr) Variable Function
86: 28(ptr) AccessChain 83(ps_output) 84 90: 28(ptr) AccessChain 87(ps_output) 88
Store 86 85 Store 90 89
87:34(PS_OUTPUT) Load 83(ps_output) 91:34(PS_OUTPUT) Load 87(ps_output)
ReturnValue 87 ReturnValue 91
FunctionEnd FunctionEnd

View File

@ -114,7 +114,7 @@ Shader version: 450
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 74 // Id's are bound by 78
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
@ -134,9 +134,9 @@ Shader version: 450
Name 30 "inF0" Name 30 "inF0"
Name 31 "inF1" Name 31 "inF1"
Name 36 "ResType" Name 36 "ResType"
Name 45 "ResType" Name 46 "ResType"
Name 56 "ResType" Name 58 "ResType"
Name 66 "ResType" Name 69 "ResType"
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -153,20 +153,20 @@ Shader version: 450
29: TypeFunction 27(fvec4) 28(ptr) 28(ptr) 29: TypeFunction 27(fvec4) 28(ptr) 28(ptr)
35: TypeInt 32 1 35: TypeInt 32 1
36(ResType): TypeStruct 6(float) 35(int) 36(ResType): TypeStruct 6(float) 35(int)
40: 6(float) Constant 0 41: 6(float) Constant 0
44: TypeVector 35(int) 2 45: TypeVector 35(int) 2
45(ResType): TypeStruct 13(fvec2) 44(ivec2) 46(ResType): TypeStruct 13(fvec2) 45(ivec2)
49: 6(float) Constant 1065353216 51: 6(float) Constant 1065353216
50: 6(float) Constant 1073741824 52: 6(float) Constant 1073741824
51: 13(fvec2) ConstantComposite 49 50 53: 13(fvec2) ConstantComposite 51 52
55: TypeVector 35(int) 3 57: TypeVector 35(int) 3
56(ResType): TypeStruct 20(fvec3) 55(ivec3) 58(ResType): TypeStruct 20(fvec3) 57(ivec3)
60: 6(float) Constant 1077936128 63: 6(float) Constant 1077936128
61: 20(fvec3) ConstantComposite 49 50 60 64: 20(fvec3) ConstantComposite 51 52 63
65: TypeVector 35(int) 4 68: TypeVector 35(int) 4
66(ResType): TypeStruct 27(fvec4) 65(ivec4) 69(ResType): TypeStruct 27(fvec4) 68(ivec4)
70: 6(float) Constant 1082130432 74: 6(float) Constant 1082130432
71: 27(fvec4) ConstantComposite 49 50 60 70 75: 27(fvec4) ConstantComposite 51 52 63 74
4(VertexShaderFunction): 2 Function None 3 4(VertexShaderFunction): 2 Function None 3
5: Label 5: Label
Return Return
@ -178,40 +178,44 @@ Shader version: 450
34: 6(float) Load 9(inF0) 34: 6(float) Load 9(inF0)
37: 36(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 34 37: 36(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 34
38: 35(int) CompositeExtract 37 1 38: 35(int) CompositeExtract 37 1
Store 10(inF1) 38 39: 6(float) ConvertSToF 38
39: 6(float) CompositeExtract 37 0 Store 10(inF1) 39
ReturnValue 40 40: 6(float) CompositeExtract 37 0
ReturnValue 41
FunctionEnd FunctionEnd
18(VertexShaderFunction2(vf2;vf2;): 13(fvec2) Function None 15 18(VertexShaderFunction2(vf2;vf2;): 13(fvec2) Function None 15
16(inF0): 14(ptr) FunctionParameter 16(inF0): 14(ptr) FunctionParameter
17(inF1): 14(ptr) FunctionParameter 17(inF1): 14(ptr) FunctionParameter
19: Label 19: Label
43: 13(fvec2) Load 16(inF0) 44: 13(fvec2) Load 16(inF0)
46: 45(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 43 47: 46(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 44
47: 44(ivec2) CompositeExtract 46 1 48: 45(ivec2) CompositeExtract 47 1
Store 17(inF1) 47 49: 13(fvec2) ConvertSToF 48
48: 13(fvec2) CompositeExtract 46 0 Store 17(inF1) 49
ReturnValue 51 50: 13(fvec2) CompositeExtract 47 0
ReturnValue 53
FunctionEnd FunctionEnd
25(VertexShaderFunction3(vf3;vf3;): 20(fvec3) Function None 22 25(VertexShaderFunction3(vf3;vf3;): 20(fvec3) Function None 22
23(inF0): 21(ptr) FunctionParameter 23(inF0): 21(ptr) FunctionParameter
24(inF1): 21(ptr) FunctionParameter 24(inF1): 21(ptr) FunctionParameter
26: Label 26: Label
54: 20(fvec3) Load 23(inF0) 56: 20(fvec3) Load 23(inF0)
57: 56(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 54 59: 58(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 56
58: 55(ivec3) CompositeExtract 57 1 60: 57(ivec3) CompositeExtract 59 1
Store 24(inF1) 58 61: 20(fvec3) ConvertSToF 60
59: 20(fvec3) CompositeExtract 57 0 Store 24(inF1) 61
ReturnValue 61 62: 20(fvec3) CompositeExtract 59 0
ReturnValue 64
FunctionEnd FunctionEnd
32(VertexShaderFunction4(vf4;vf4;): 27(fvec4) Function None 29 32(VertexShaderFunction4(vf4;vf4;): 27(fvec4) Function None 29
30(inF0): 28(ptr) FunctionParameter 30(inF0): 28(ptr) FunctionParameter
31(inF1): 28(ptr) FunctionParameter 31(inF1): 28(ptr) FunctionParameter
33: Label 33: Label
64: 27(fvec4) Load 30(inF0) 67: 27(fvec4) Load 30(inF0)
67: 66(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 64 70: 69(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 67
68: 65(ivec4) CompositeExtract 67 1 71: 68(ivec4) CompositeExtract 70 1
Store 31(inF1) 68 72: 27(fvec4) ConvertSToF 71
69: 27(fvec4) CompositeExtract 67 0 Store 31(inF1) 72
ReturnValue 71 73: 27(fvec4) CompositeExtract 70 0
ReturnValue 75
FunctionEnd FunctionEnd