Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
glslang
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
glslang
Commits
470026f9
Commit
470026f9
authored
Mar 29, 2017
by
Rex Xu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
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.
parent
86e49d17
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
154 additions
and
115 deletions
+154
-115
GlslangToSpv.cpp
SPIRV/GlslangToSpv.cpp
+31
-10
SpvBuilder.h
SPIRV/SpvBuilder.h
+10
-0
hlsl.intrinsic.frexp.frag.out
Test/baseResults/hlsl.intrinsic.frexp.frag.out
+70
-66
hlsl.intrinsic.frexp.vert.out
Test/baseResults/hlsl.intrinsic.frexp.vert.out
+43
-39
No files found.
SPIRV/GlslangToSpv.cpp
View file @
470026f9
...
...
@@ -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
;
...
...
SPIRV/SpvBuilder.h
View file @
470026f9
...
...
@@ -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
));
...
...
Test/baseResults/hlsl.intrinsic.frexp.frag.out
View file @
470026f9
...
...
@@ -191,12 +191,12 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 9
4
// Id's are bound by 9
8
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 9
1
EntryPoint Fragment 4 "main" 9
5
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 4
8
"r000"
Name 5
1
"ResType"
Name 6
0
"r000"
Name 6
3
"ResType"
Name 7
1
"r000"
Name 7
4
"ResType"
Name 8
3
"ps_output"
Name 9
1
"color"
Decorate 9
1
(color) Location 0
Name 4
9
"r000"
Name 5
2
"ResType"
Name 6
2
"r000"
Name 6
5
"ResType"
Name 7
4
"r000"
Name 7
7
"ResType"
Name 8
7
"ps_output"
Name 9
5
"color"
Decorate 9
5
(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)
4
5
: 6(float) Constant 0
5
0
: TypeVector 40(int) 2
5
1(ResType): TypeStruct 13(fvec2) 50
(ivec2)
5
5
: 6(float) Constant 1065353216
5
6
: 6(float) Constant 1073741824
5
7: 13(fvec2) ConstantComposite 55 56
6
2
: TypeVector 40(int) 3
6
3(ResType): TypeStruct 20(fvec3) 62
(ivec3)
67
: 6(float) Constant 1077936128
68: 20(fvec3) ConstantComposite 55 56 67
7
3
: TypeVector 40(int) 4
7
4(ResType): TypeStruct 27(fvec4) 73
(ivec4)
78
: 6(float) Constant 1082130432
79: 27(fvec4) ConstantComposite 55 56 67 78
8
2
: TypePointer Function 34(PS_OUTPUT)
8
4
: 40(int) Constant 0
8
5: 27(fvec4) ConstantComposite 55 55 55 55
9
0
: TypePointer Output 27(fvec4)
9
1(color): 90
(ptr) Variable Output
4
6
: 6(float) Constant 0
5
1
: TypeVector 40(int) 2
5
2(ResType): TypeStruct 13(fvec2) 51
(ivec2)
5
7
: 6(float) Constant 1065353216
5
8
: 6(float) Constant 1073741824
5
9: 13(fvec2) ConstantComposite 57 58
6
4
: TypeVector 40(int) 3
6
5(ResType): TypeStruct 20(fvec3) 64
(ivec3)
70
: 6(float) Constant 1077936128
71: 20(fvec3) ConstantComposite 57 58 70
7
6
: TypeVector 40(int) 4
7
7(ResType): TypeStruct 27(fvec4) 76
(ivec4)
82
: 6(float) Constant 1082130432
83: 27(fvec4) ConstantComposite 57 58 70 82
8
6
: TypePointer Function 34(PS_OUTPUT)
8
8
: 40(int) Constant 0
8
9: 27(fvec4) ConstantComposite 57 57 57 57
9
4
: TypePointer Output 27(fvec4)
9
5(color): 94
(ptr) Variable Output
4(main): 2 Function None 3
5: Label
9
2
:34(PS_OUTPUT) FunctionCall 36(@main()
9
3: 27(fvec4) CompositeExtract 92
0
Store 9
1(color) 93
9
6
:34(PS_OUTPUT) FunctionCall 36(@main()
9
7: 27(fvec4) CompositeExtract 96
0
Store 9
5(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
8
3(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
8
7(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
Test/baseResults/hlsl.intrinsic.frexp.vert.out
View file @
470026f9
...
...
@@ -114,7 +114,7 @@ Shader version: 450
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 7
4
// Id's are bound by 7
8
Capability Shader
1: ExtInstImport "GLSL.std.450"
...
...
@@ -134,9 +134,9 @@ Shader version: 450
Name 30 "inF0"
Name 31 "inF1"
Name 36 "ResType"
Name 4
5
"ResType"
Name 5
6
"ResType"
Name 6
6
"ResType"
Name 4
6
"ResType"
Name 5
8
"ResType"
Name 6
9
"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)
4
0
: 6(float) Constant 0
4
4
: TypeVector 35(int) 2
4
5(ResType): TypeStruct 13(fvec2) 44
(ivec2)
49
: 6(float) Constant 1065353216
5
0
: 6(float) Constant 1073741824
5
1: 13(fvec2) ConstantComposite 49 50
5
5
: TypeVector 35(int) 3
5
6(ResType): TypeStruct 20(fvec3) 55
(ivec3)
6
0
: 6(float) Constant 1077936128
6
1: 20(fvec3) ConstantComposite 49 50 60
6
5
: TypeVector 35(int) 4
6
6(ResType): TypeStruct 27(fvec4) 65
(ivec4)
7
0
: 6(float) Constant 1082130432
7
1: 27(fvec4) ConstantComposite 49 50 60 70
4
1
: 6(float) Constant 0
4
5
: TypeVector 35(int) 2
4
6(ResType): TypeStruct 13(fvec2) 45
(ivec2)
51
: 6(float) Constant 1065353216
5
2
: 6(float) Constant 1073741824
5
3: 13(fvec2) ConstantComposite 51 52
5
7
: TypeVector 35(int) 3
5
8(ResType): TypeStruct 20(fvec3) 57
(ivec3)
6
3
: 6(float) Constant 1077936128
6
4: 20(fvec3) ConstantComposite 51 52 63
6
8
: TypeVector 35(int) 4
6
9(ResType): TypeStruct 27(fvec4) 68
(ivec4)
7
4
: 6(float) Constant 1082130432
7
5: 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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment