Commit 714e58b2 by John Kessenich Committed by GitHub

Merge pull request #801 from amdrexu/bugfix

HLSL: Fix an issue of frexp().
parents 3feac2eb 470026f9
......@@ -4618,6 +4618,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) {
......@@ -4739,13 +4742,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;
......@@ -4853,9 +4865,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));
......
hlsl.intrinsic.frexp.vert
Shader version: 450
0:? Sequence
0:2 Function Definition: VertexShaderFunctionS(f1;f1; ( temp float)
0:2 Function Parameters:
0:2 'inF0' ( in float)
0:2 'inF1' ( in float)
0:? Sequence
0:3 frexp ( temp float)
0:3 'inF0' ( in float)
0:3 'inF1' ( in float)
0:4 Branch: Return with expression
0:4 Constant:
0:4 0.000000
0:8 Function Definition: VertexShaderFunction2(vf2;vf2; ( temp 2-component vector of float)
0:8 Function Parameters:
0:8 'inF0' ( in 2-component vector of float)
0:8 'inF1' ( in 2-component vector of float)
0:? Sequence
0:9 frexp ( temp 2-component vector of float)
0:9 'inF0' ( in 2-component vector of float)
0:9 'inF1' ( in 2-component vector of float)
0:10 Branch: Return with expression
0:? Constant:
0:? 1.000000
0:? 2.000000
0:14 Function Definition: VertexShaderFunction3(vf3;vf3; ( temp 3-component vector of float)
0:14 Function Parameters:
0:14 'inF0' ( in 3-component vector of float)
0:14 'inF1' ( in 3-component vector of float)
0:? Sequence
0:15 frexp ( temp 3-component vector of float)
0:15 'inF0' ( in 3-component vector of float)
0:15 'inF1' ( in 3-component vector of float)
0:16 Branch: Return with expression
0:? Constant:
0:? 1.000000
0:? 2.000000
0:? 3.000000
0:20 Function Definition: VertexShaderFunction4(vf4;vf4; ( temp 4-component vector of float)
0:20 Function Parameters:
0:20 'inF0' ( in 4-component vector of float)
0:20 'inF1' ( in 4-component vector of float)
0:? Sequence
0:21 frexp ( temp 4-component vector of float)
0:21 'inF0' ( in 4-component vector of float)
0:21 'inF1' ( in 4-component vector of float)
0:22 Branch: Return with expression
0:? Constant:
0:? 1.000000
0:? 2.000000
0:? 3.000000
0:? 4.000000
0:? Linker Objects
Linked vertex stage:
WARNING: Linking vertex stage: Entry point not found
Shader version: 450
0:? Sequence
0:2 Function Definition: VertexShaderFunctionS(f1;f1; ( temp float)
0:2 Function Parameters:
0:2 'inF0' ( in float)
0:2 'inF1' ( in float)
0:? Sequence
0:3 frexp ( temp float)
0:3 'inF0' ( in float)
0:3 'inF1' ( in float)
0:4 Branch: Return with expression
0:4 Constant:
0:4 0.000000
0:8 Function Definition: VertexShaderFunction2(vf2;vf2; ( temp 2-component vector of float)
0:8 Function Parameters:
0:8 'inF0' ( in 2-component vector of float)
0:8 'inF1' ( in 2-component vector of float)
0:? Sequence
0:9 frexp ( temp 2-component vector of float)
0:9 'inF0' ( in 2-component vector of float)
0:9 'inF1' ( in 2-component vector of float)
0:10 Branch: Return with expression
0:? Constant:
0:? 1.000000
0:? 2.000000
0:14 Function Definition: VertexShaderFunction3(vf3;vf3; ( temp 3-component vector of float)
0:14 Function Parameters:
0:14 'inF0' ( in 3-component vector of float)
0:14 'inF1' ( in 3-component vector of float)
0:? Sequence
0:15 frexp ( temp 3-component vector of float)
0:15 'inF0' ( in 3-component vector of float)
0:15 'inF1' ( in 3-component vector of float)
0:16 Branch: Return with expression
0:? Constant:
0:? 1.000000
0:? 2.000000
0:? 3.000000
0:20 Function Definition: VertexShaderFunction4(vf4;vf4; ( temp 4-component vector of float)
0:20 Function Parameters:
0:20 'inF0' ( in 4-component vector of float)
0:20 'inF1' ( in 4-component vector of float)
0:? Sequence
0:21 frexp ( temp 4-component vector of float)
0:21 'inF0' ( in 4-component vector of float)
0:21 'inF1' ( in 4-component vector of float)
0:22 Branch: Return with expression
0:? Constant:
0:? 1.000000
0:? 2.000000
0:? 3.000000
0:? 4.000000
0:? Linker Objects
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 78
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "VertexShaderFunction"
Name 4 "VertexShaderFunction"
Name 11 "VertexShaderFunctionS(f1;f1;"
Name 9 "inF0"
Name 10 "inF1"
Name 18 "VertexShaderFunction2(vf2;vf2;"
Name 16 "inF0"
Name 17 "inF1"
Name 25 "VertexShaderFunction3(vf3;vf3;"
Name 23 "inF0"
Name 24 "inF1"
Name 32 "VertexShaderFunction4(vf4;vf4;"
Name 30 "inF0"
Name 31 "inF1"
Name 36 "ResType"
Name 46 "ResType"
Name 58 "ResType"
Name 69 "ResType"
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypePointer Function 6(float)
8: TypeFunction 6(float) 7(ptr) 7(ptr)
13: TypeVector 6(float) 2
14: TypePointer Function 13(fvec2)
15: TypeFunction 13(fvec2) 14(ptr) 14(ptr)
20: TypeVector 6(float) 3
21: TypePointer Function 20(fvec3)
22: TypeFunction 20(fvec3) 21(ptr) 21(ptr)
27: TypeVector 6(float) 4
28: TypePointer Function 27(fvec4)
29: TypeFunction 27(fvec4) 28(ptr) 28(ptr)
35: TypeInt 32 1
36(ResType): TypeStruct 6(float) 35(int)
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
FunctionEnd
11(VertexShaderFunctionS(f1;f1;): 6(float) Function None 8
9(inF0): 7(ptr) FunctionParameter
10(inF1): 7(ptr) FunctionParameter
12: Label
34: 6(float) Load 9(inF0)
37: 36(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 34
38: 35(int) CompositeExtract 37 1
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
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
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
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
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
float PixelShaderFunctionS(float inF0, float inF1)
{
float r000 = frexp(inF0, inF1);
return 0.0;
}
float2 PixelShaderFunction2(float2 inF0, float2 inF1)
{
float2 r000 = frexp(inF0, inF1);
return float2(1,2);
}
float3 PixelShaderFunction3(float3 inF0, float3 inF1)
{
float3 r000 = frexp(inF0, inF1);
return float3(1,2,3);
}
float4 PixelShaderFunction(float4 inF0, float4 inF1)
{
float4 r000 = frexp(inF0, inF1);
return float4(1,2,3,4);
}
// TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
#define MATFNS(MT) \
MT r000 = frexp(inF0, inF1);
struct PS_OUTPUT { float4 color : SV_Target0; };
PS_OUTPUT main()
{
PS_OUTPUT ps_output;
ps_output.color = 1.0;
return ps_output;
};
float VertexShaderFunctionS(float inF0, float inF1)
{
frexp(inF0, inF1);
return 0.0;
}
float2 VertexShaderFunction2(float2 inF0, float2 inF1)
{
frexp(inF0, inF1);
return float2(1,2);
}
float3 VertexShaderFunction3(float3 inF0, float3 inF1)
{
frexp(inF0, inF1);
return float3(1,2,3);
}
float4 VertexShaderFunction4(float4 inF0, float4 inF1)
{
frexp(inF0, inF1);
return float4(1,2,3,4);
}
// TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
#define MATFNS() \
frexp(inF0, inF1);
......@@ -52,7 +52,6 @@ float PixelShaderFunctionS(float inF0, float inF1, float inF2, uint inU0, uint i
// TODO: fma(inD0, inD1, inD2);
float r033 = fmod(inF0, inF1);
float r034 = frac(inF0);
float r035 = frexp(inF0, inF1);
float r036 = fwidth(inF0);
bool r037 = isinf(inF0);
bool r038 = isnan(inF0);
......@@ -136,7 +135,6 @@ float2 PixelShaderFunction2(float2 inF0, float2 inF1, float2 inF2, uint2 inU0, u
// TODO: fma(inD0, inD1, inD2);
float2 r035 = fmod(inF0, inF1);
float2 r036 = frac(inF0);
float2 r037 = frexp(inF0, inF1);
float2 r038 = fwidth(inF0);
bool2 r039 = isinf(inF0);
bool2 r040 = isnan(inF0);
......@@ -217,7 +215,6 @@ float3 PixelShaderFunction3(float3 inF0, float3 inF1, float3 inF2, uint3 inU0, u
// TODO: fma(inD0, inD1, inD2);
float3 r036 = fmod(inF0, inF1);
float3 r037 = frac(inF0);
float3 r038 = frexp(inF0, inF1);
float3 r039 = fwidth(inF0);
bool3 r040 = isinf(inF0);
bool3 r041 = isnan(inF0);
......@@ -299,7 +296,6 @@ float4 PixelShaderFunction(float4 inF0, float4 inF1, float4 inF2, uint4 inU0, ui
// TODO: fma(inD0, inD1, inD2);
float4 r036 = fmod(inF0, inF1);
float4 r037 = frac(inF0);
float4 r038 = frexp(inF0, inF1);
float4 r039 = fwidth(inF0);
bool4 r040 = isinf(inF0);
bool4 r041 = isnan(inF0);
......@@ -369,7 +365,6 @@ float4 PixelShaderFunction(float4 inF0, float4 inF1, float4 inF2, uint4 inU0, ui
MT r021 = floor(inF0); \
MT r022 = fmod(inF0, inF1); \
MT r023 = frac(inF0); \
MT r024 = frexp(inF0, inF1); \
MT r025 = fwidth(inF0); \
MT r026 = ldexp(inF0, inF1); \
MT r026a = lerp(inF0, inF1, inF2); \
......
......@@ -28,7 +28,6 @@ float VertexShaderFunctionS(float inF0, float inF1, float inF2, uint inU0, uint
// TODO: fma(inD0, inD1, inD2);
fmod(inF0, inF1);
frac(inF0);
frexp(inF0, inF1);
isinf(inF0);
isnan(inF0);
ldexp(inF0, inF1);
......@@ -99,7 +98,6 @@ float2 VertexShaderFunction2(float2 inF0, float2 inF1, float2 inF2, uint2 inU0,
// TODO: fma(inD0, inD1, inD2);
fmod(inF0, inF1);
frac(inF0);
frexp(inF0, inF1);
isinf(inF0);
isnan(inF0);
ldexp(inF0, inF1);
......@@ -170,7 +168,6 @@ float3 VertexShaderFunction3(float3 inF0, float3 inF1, float3 inF2, uint3 inU0,
// TODO: fma(inD0, inD1, inD2);
fmod(inF0, inF1);
frac(inF0);
frexp(inF0, inF1);
isinf(inF0);
isnan(inF0);
ldexp(inF0, inF1);
......@@ -241,7 +238,6 @@ float4 VertexShaderFunction4(float4 inF0, float4 inF1, float4 inF2, uint4 inU0,
// TODO: fma(inD0, inD1, inD2);
fmod(inF0, inF1);
frac(inF0);
frexp(inF0, inF1);
isinf(inF0);
isnan(inF0);
ldexp(inF0, inF1);
......@@ -305,7 +301,6 @@ float4 VertexShaderFunction4(float4 inF0, float4 inF1, float4 inF2, uint4 inU0,
floor(inF0); \
fmod(inF0, inF1); \
frac(inF0); \
frexp(inF0, inF1); \
ldexp(inF0, inF1); \
lerp(inF0, inF1, inF2); \
log(inF0); \
......
......@@ -138,6 +138,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.intrinsics.f1632.frag", "main"},
{"hlsl.intrinsics.f3216.frag", "main"},
{"hlsl.intrinsics.frag", "main"},
{"hlsl.intrinsic.frexp.frag", "main"},
{"hlsl.intrinsics.lit.frag", "PixelShaderFunction"},
{"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
{"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
......@@ -239,6 +240,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.structStructName.frag", "main"},
{"hlsl.this.frag", "main"},
{"hlsl.intrinsics.vert", "VertexShaderFunction"},
{"hlsl.intrinsic.frexp.vert", "VertexShaderFunction"},
{"hlsl.matType.frag", "PixelShaderFunction"},
{"hlsl.matType.bool.frag", "main"},
{"hlsl.matType.int.frag", "main"},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment