mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-10 04:20:06 +00:00
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:
parent
86e49d1773
commit
470026f9d7
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user