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
96f65521
Commit
96f65521
authored
Jun 06, 2017
by
John Kessenich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HLSL: Implement half matrices, and map all half* -> float*.
parent
f6deacd5
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
184 additions
and
28 deletions
+184
-28
hlsl.type.half.frag.out
Test/baseResults/hlsl.type.half.frag.out
+0
-0
hlsl.type.identifier.frag.out
Test/baseResults/hlsl.type.identifier.frag.out
+45
-21
hlsl.type.half.frag
Test/hlsl.type.half.frag
+18
-1
hlsl.type.identifier.frag
Test/hlsl.type.identifier.frag
+3
-1
hlslGrammar.cpp
hlsl/hlslGrammar.cpp
+70
-5
hlslScanContext.cpp
hlsl/hlslScanContext.cpp
+32
-0
hlslTokens.h
hlsl/hlslTokens.h
+16
-0
No files found.
Test/baseResults/hlsl.type.half.frag.out
View file @
96f65521
This diff is collapsed.
Click to expand it.
Test/baseResults/hlsl.type.identifier.frag.out
View file @
96f65521
...
@@ -50,8 +50,8 @@ gl_FragCoord origin is upper left
...
@@ -50,8 +50,8 @@ gl_FragCoord origin is upper left
0:15 'min10float' ( temp mediump float)
0:15 'min10float' ( temp mediump float)
0:15 'min16float' ( temp mediump float)
0:15 'min16float' ( temp mediump float)
0:16 Sequence
0:16 Sequence
0:16 move second child to first child ( temp
mediump
float)
0:16 move second child to first child ( temp float)
0:16 'half' ( temp
mediump
float)
0:16 'half' ( temp float)
0:16 Constant:
0:16 Constant:
0:16 0.500000
0:16 0.500000
0:? Sequence
0:? Sequence
...
@@ -99,9 +99,17 @@ gl_FragCoord origin is upper left
...
@@ -99,9 +99,17 @@ gl_FragCoord origin is upper left
0:25 'float' ( temp mediump float)
0:25 'float' ( temp mediump float)
0:25 Function Call: fn(f1; ( temp mediump float)
0:25 Function Call: fn(f1; ( temp mediump float)
0:25 'float' ( temp mediump float)
0:25 'float' ( temp mediump float)
0:27 Branch: Return with expression
0:29 Branch: Return with expression
0:27 Construct vec4 ( temp 4-component vector of float)
0:29 Construct vec4 ( temp 4-component vector of float)
0:27 'float' ( temp float)
0:29 add ( temp float)
0:29 'float' ( temp float)
0:29 direct index ( temp float)
0:29 direct index ( temp 3-component vector of float)
0:29 'half2x3' ( temp 2X3 matrix of float)
0:29 Constant:
0:29 0 (const int)
0:29 Constant:
0:29 0 (const int)
0:9 Function Definition: main( ( temp void)
0:9 Function Definition: main( ( temp void)
0:9 Function Parameters:
0:9 Function Parameters:
0:? Sequence
0:? Sequence
...
@@ -166,8 +174,8 @@ gl_FragCoord origin is upper left
...
@@ -166,8 +174,8 @@ gl_FragCoord origin is upper left
0:15 'min10float' ( temp mediump float)
0:15 'min10float' ( temp mediump float)
0:15 'min16float' ( temp mediump float)
0:15 'min16float' ( temp mediump float)
0:16 Sequence
0:16 Sequence
0:16 move second child to first child ( temp
mediump
float)
0:16 move second child to first child ( temp float)
0:16 'half' ( temp
mediump
float)
0:16 'half' ( temp float)
0:16 Constant:
0:16 Constant:
0:16 0.500000
0:16 0.500000
0:? Sequence
0:? Sequence
...
@@ -215,9 +223,17 @@ gl_FragCoord origin is upper left
...
@@ -215,9 +223,17 @@ gl_FragCoord origin is upper left
0:25 'float' ( temp mediump float)
0:25 'float' ( temp mediump float)
0:25 Function Call: fn(f1; ( temp mediump float)
0:25 Function Call: fn(f1; ( temp mediump float)
0:25 'float' ( temp mediump float)
0:25 'float' ( temp mediump float)
0:27 Branch: Return with expression
0:29 Branch: Return with expression
0:27 Construct vec4 ( temp 4-component vector of float)
0:29 Construct vec4 ( temp 4-component vector of float)
0:27 'float' ( temp float)
0:29 add ( temp float)
0:29 'float' ( temp float)
0:29 direct index ( temp float)
0:29 direct index ( temp 3-component vector of float)
0:29 'half2x3' ( temp 2X3 matrix of float)
0:29 Constant:
0:29 0 (const int)
0:29 Constant:
0:29 0 (const int)
0:9 Function Definition: main( ( temp void)
0:9 Function Definition: main( ( temp void)
0:9 Function Parameters:
0:9 Function Parameters:
0:? Sequence
0:? Sequence
...
@@ -229,12 +245,12 @@ gl_FragCoord origin is upper left
...
@@ -229,12 +245,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
97
// Id's are bound by
105
Capability Shader
Capability Shader
1: ExtInstImport "GLSL.std.450"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main"
95
EntryPoint Fragment 4 "main"
103
ExecutionMode 4 OriginUpperLeft
ExecutionMode 4 OriginUpperLeft
Source HLSL 500
Source HLSL 500
Name 4 "main"
Name 4 "main"
...
@@ -252,13 +268,13 @@ gl_FragCoord origin is upper left
...
@@ -252,13 +268,13 @@ gl_FragCoord origin is upper left
MemberName 56(foo_t) 0 "float"
MemberName 56(foo_t) 0 "float"
Name 58 "float"
Name 58 "float"
Name 86 "param"
Name 86 "param"
Name 95 "@entryPointOutput"
Name 94 "half2x3"
Name 103 "@entryPointOutput"
Decorate 49(min16float) RelaxedPrecision
Decorate 49(min16float) RelaxedPrecision
Decorate 50 RelaxedPrecision
Decorate 50 RelaxedPrecision
Decorate 51 RelaxedPrecision
Decorate 51 RelaxedPrecision
Decorate 52(min10float) RelaxedPrecision
Decorate 52(min10float) RelaxedPrecision
Decorate 53 RelaxedPrecision
Decorate 53 RelaxedPrecision
Decorate 54(half) RelaxedPrecision
Decorate 64 RelaxedPrecision
Decorate 64 RelaxedPrecision
Decorate 65 RelaxedPrecision
Decorate 65 RelaxedPrecision
Decorate 66 RelaxedPrecision
Decorate 66 RelaxedPrecision
...
@@ -278,7 +294,7 @@ gl_FragCoord origin is upper left
...
@@ -278,7 +294,7 @@ gl_FragCoord origin is upper left
Decorate 87 RelaxedPrecision
Decorate 87 RelaxedPrecision
Decorate 88 RelaxedPrecision
Decorate 88 RelaxedPrecision
Decorate 89 RelaxedPrecision
Decorate 89 RelaxedPrecision
Decorate
95
(@entryPointOutput) Location 0
Decorate
103
(@entryPointOutput) Location 0
2: TypeVoid
2: TypeVoid
3: TypeFunction 2
3: TypeFunction 2
6: TypeFloat 32
6: TypeFloat 32
...
@@ -303,12 +319,16 @@ gl_FragCoord origin is upper left
...
@@ -303,12 +319,16 @@ gl_FragCoord origin is upper left
56(foo_t): TypeStruct 6(float)
56(foo_t): TypeStruct 6(float)
57: TypePointer Function 56(foo_t)
57: TypePointer Function 56(foo_t)
59: 6(float) Constant 1109917696
59: 6(float) Constant 1109917696
94: TypePointer Output 12(fvec4)
91: TypeVector 6(float) 3
95(@entryPointOutput): 94(ptr) Variable Output
92: TypeMatrix 91(fvec3) 2
93: TypePointer Function 92
95: 22(int) Constant 0
102: TypePointer Output 12(fvec4)
103(@entryPointOutput): 102(ptr) Variable Output
4(main): 2 Function None 3
4(main): 2 Function None 3
5: Label
5: Label
96
: 12(fvec4) FunctionCall 14(@main()
104
: 12(fvec4) FunctionCall 14(@main()
Store
95(@entryPointOutput) 96
Store
103(@entryPointOutput) 104
Return
Return
FunctionEnd
FunctionEnd
10(fn(f1;): 6(float) Function None 8
10(fn(f1;): 6(float) Function None 8
...
@@ -329,6 +349,7 @@ gl_FragCoord origin is upper left
...
@@ -329,6 +349,7 @@ gl_FragCoord origin is upper left
58(float): 57(ptr) Variable Function
58(float): 57(ptr) Variable Function
75: 7(ptr) Variable Function
75: 7(ptr) Variable Function
86(param): 7(ptr) Variable Function
86(param): 7(ptr) Variable Function
94(half2x3): 93(ptr) Variable Function
Store 19(float) 20
Store 19(float) 20
27: 6(float) Load 19(float)
27: 6(float) Load 19(float)
29: 21(bool) FOrdNotEqual 27 28
29: 21(bool) FOrdNotEqual 27 28
...
@@ -391,6 +412,9 @@ gl_FragCoord origin is upper left
...
@@ -391,6 +412,9 @@ gl_FragCoord origin is upper left
89: 6(float) FAdd 85 88
89: 6(float) FAdd 85 88
Store 19(float) 89
Store 19(float) 89
90: 6(float) Load 19(float)
90: 6(float) Load 19(float)
91: 12(fvec4) CompositeConstruct 90 90 90 90
96: 7(ptr) AccessChain 94(half2x3) 40 95
ReturnValue 91
97: 6(float) Load 96
98: 6(float) FAdd 90 97
99: 12(fvec4) CompositeConstruct 98 98 98 98
ReturnValue 99
FunctionEnd
FunctionEnd
Test/hlsl.type.half.frag
View file @
96f65521
...
@@ -7,5 +7,22 @@ float4 main() : SV_Target0
...
@@ -7,5 +7,22 @@ float4 main() : SV_Target0
half3
h3
=
3
;
half3
h3
=
3
;
half4
h4
=
4
;
half4
h4
=
4
;
return
0
.
0
;
half1x1
h11
;
half1x2
h12
;
half1x3
h13
;
half1x4
h14
;
half2x1
h21
;
half2x2
h22
=
half2x2
(
1
,
2
,
3
,
4
);
half2x3
h23
=
(
half2x3
)
4
.
9
;
half2x4
h24
;
half3x1
h31
;
half3x2
h32
;
half3x3
h33
;
half3x4
h34
;
half4x1
h41
;
half4x2
h42
;
half4x3
h43
;
half4x4
h44
;
return
h23
.
_11
+
h4
.
y
+
h0
;
}
}
Test/hlsl.type.identifier.frag
View file @
96f65521
...
@@ -24,5 +24,7 @@ float4 main() : SV_Target0
...
@@ -24,5 +24,7 @@ float4 main() : SV_Target0
float
=
float
+
int
+
uint
+
min16float
+
min10float
+
(
bool
[
0
]
?
int
:
float
)
+
fn
(
float
);
float
=
float
+
int
+
uint
+
min16float
+
min10float
+
(
bool
[
0
]
?
int
:
float
)
+
fn
(
float
);
return
float
;
half2x3
half2x3
;
return
float
+
half2x3
.
_11
;
}
}
hlsl/hlslGrammar.cpp
View file @
96f65521
...
@@ -111,6 +111,22 @@ bool HlslGrammar::acceptIdentifier(HlslToken& idToken)
...
@@ -111,6 +111,22 @@ bool HlslGrammar::acceptIdentifier(HlslToken& idToken)
switch
(
peek
())
{
switch
(
peek
())
{
case
EHTokSample
:
idString
=
NewPoolTString
(
"sample"
);
break
;
case
EHTokSample
:
idString
=
NewPoolTString
(
"sample"
);
break
;
case
EHTokHalf
:
idString
=
NewPoolTString
(
"half"
);
break
;
case
EHTokHalf
:
idString
=
NewPoolTString
(
"half"
);
break
;
case
EHTokHalf1x1
:
idString
=
NewPoolTString
(
"half1x1"
);
break
;
case
EHTokHalf1x2
:
idString
=
NewPoolTString
(
"half1x2"
);
break
;
case
EHTokHalf1x3
:
idString
=
NewPoolTString
(
"half1x3"
);
break
;
case
EHTokHalf1x4
:
idString
=
NewPoolTString
(
"half1x4"
);
break
;
case
EHTokHalf2x1
:
idString
=
NewPoolTString
(
"half2x1"
);
break
;
case
EHTokHalf2x2
:
idString
=
NewPoolTString
(
"half2x2"
);
break
;
case
EHTokHalf2x3
:
idString
=
NewPoolTString
(
"half2x3"
);
break
;
case
EHTokHalf2x4
:
idString
=
NewPoolTString
(
"half2x4"
);
break
;
case
EHTokHalf3x1
:
idString
=
NewPoolTString
(
"half3x1"
);
break
;
case
EHTokHalf3x2
:
idString
=
NewPoolTString
(
"half3x2"
);
break
;
case
EHTokHalf3x3
:
idString
=
NewPoolTString
(
"half3x3"
);
break
;
case
EHTokHalf3x4
:
idString
=
NewPoolTString
(
"half3x4"
);
break
;
case
EHTokHalf4x1
:
idString
=
NewPoolTString
(
"half4x1"
);
break
;
case
EHTokHalf4x2
:
idString
=
NewPoolTString
(
"half4x2"
);
break
;
case
EHTokHalf4x3
:
idString
=
NewPoolTString
(
"half4x3"
);
break
;
case
EHTokHalf4x4
:
idString
=
NewPoolTString
(
"half4x4"
);
break
;
case
EHTokBool
:
idString
=
NewPoolTString
(
"bool"
);
break
;
case
EHTokBool
:
idString
=
NewPoolTString
(
"bool"
);
break
;
case
EHTokFloat
:
idString
=
NewPoolTString
(
"float"
);
break
;
case
EHTokFloat
:
idString
=
NewPoolTString
(
"float"
);
break
;
case
EHTokDouble
:
idString
=
NewPoolTString
(
"double"
);
break
;
case
EHTokDouble
:
idString
=
NewPoolTString
(
"double"
);
break
;
...
@@ -1479,20 +1495,20 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList)
...
@@ -1479,20 +1495,20 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList)
break
;
break
;
case
EHTokHalf
:
case
EHTokHalf
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
EpqMedium
);
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
);
break
;
break
;
case
EHTokHalf1
:
case
EHTokHalf1
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
EpqMedium
);
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
);
type
.
makeVector
();
type
.
makeVector
();
break
;
break
;
case
EHTokHalf2
:
case
EHTokHalf2
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
EpqMedium
,
2
);
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
2
);
break
;
break
;
case
EHTokHalf3
:
case
EHTokHalf3
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
EpqMedium
,
3
);
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
3
);
break
;
break
;
case
EHTokHalf4
:
case
EHTokHalf4
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
EpqMedium
,
4
);
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
4
);
break
;
break
;
case
EHTokMin16float
:
case
EHTokMin16float
:
...
@@ -1776,6 +1792,55 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList)
...
@@ -1776,6 +1792,55 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList)
new
(
&
type
)
TType
(
EbtFloat
,
EvqTemporary
,
0
,
4
,
4
);
new
(
&
type
)
TType
(
EbtFloat
,
EvqTemporary
,
0
,
4
,
4
);
break
;
break
;
case
EHTokHalf1x1
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
1
,
1
);
break
;
case
EHTokHalf1x2
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
1
,
2
);
break
;
case
EHTokHalf1x3
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
1
,
3
);
break
;
case
EHTokHalf1x4
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
1
,
4
);
break
;
case
EHTokHalf2x1
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
2
,
1
);
break
;
case
EHTokHalf2x2
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
2
,
2
);
break
;
case
EHTokHalf2x3
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
2
,
3
);
break
;
case
EHTokHalf2x4
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
2
,
4
);
break
;
case
EHTokHalf3x1
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
3
,
1
);
break
;
case
EHTokHalf3x2
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
3
,
2
);
break
;
case
EHTokHalf3x3
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
3
,
3
);
break
;
case
EHTokHalf3x4
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
3
,
4
);
break
;
case
EHTokHalf4x1
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
4
,
1
);
break
;
case
EHTokHalf4x2
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
4
,
2
);
break
;
case
EHTokHalf4x3
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
4
,
3
);
break
;
case
EHTokHalf4x4
:
new
(
&
type
)
TType
(
half_bt
,
EvqTemporary
,
0
,
4
,
4
);
break
;
case
EHTokDouble1x1
:
case
EHTokDouble1x1
:
new
(
&
type
)
TType
(
EbtDouble
,
EvqTemporary
,
0
,
1
,
1
);
new
(
&
type
)
TType
(
EbtDouble
,
EvqTemporary
,
0
,
1
,
1
);
break
;
break
;
...
...
hlsl/hlslScanContext.cpp
View file @
96f65521
...
@@ -279,6 +279,22 @@ void HlslScanContext::fillInKeywordMap()
...
@@ -279,6 +279,22 @@ void HlslScanContext::fillInKeywordMap()
(
*
KeywordMap
)[
"float4x2"
]
=
EHTokFloat4x2
;
(
*
KeywordMap
)[
"float4x2"
]
=
EHTokFloat4x2
;
(
*
KeywordMap
)[
"float4x3"
]
=
EHTokFloat4x3
;
(
*
KeywordMap
)[
"float4x3"
]
=
EHTokFloat4x3
;
(
*
KeywordMap
)[
"float4x4"
]
=
EHTokFloat4x4
;
(
*
KeywordMap
)[
"float4x4"
]
=
EHTokFloat4x4
;
(
*
KeywordMap
)[
"half1x1"
]
=
EHTokHalf1x1
;
(
*
KeywordMap
)[
"half1x2"
]
=
EHTokHalf1x2
;
(
*
KeywordMap
)[
"half1x3"
]
=
EHTokHalf1x3
;
(
*
KeywordMap
)[
"half1x4"
]
=
EHTokHalf1x4
;
(
*
KeywordMap
)[
"half2x1"
]
=
EHTokHalf2x1
;
(
*
KeywordMap
)[
"half2x2"
]
=
EHTokHalf2x2
;
(
*
KeywordMap
)[
"half2x3"
]
=
EHTokHalf2x3
;
(
*
KeywordMap
)[
"half2x4"
]
=
EHTokHalf2x4
;
(
*
KeywordMap
)[
"half3x1"
]
=
EHTokHalf3x1
;
(
*
KeywordMap
)[
"half3x2"
]
=
EHTokHalf3x2
;
(
*
KeywordMap
)[
"half3x3"
]
=
EHTokHalf3x3
;
(
*
KeywordMap
)[
"half3x4"
]
=
EHTokHalf3x4
;
(
*
KeywordMap
)[
"half4x1"
]
=
EHTokHalf4x1
;
(
*
KeywordMap
)[
"half4x2"
]
=
EHTokHalf4x2
;
(
*
KeywordMap
)[
"half4x3"
]
=
EHTokHalf4x3
;
(
*
KeywordMap
)[
"half4x4"
]
=
EHTokHalf4x4
;
(
*
KeywordMap
)[
"double1x1"
]
=
EHTokDouble1x1
;
(
*
KeywordMap
)[
"double1x1"
]
=
EHTokDouble1x1
;
(
*
KeywordMap
)[
"double1x2"
]
=
EHTokDouble1x2
;
(
*
KeywordMap
)[
"double1x2"
]
=
EHTokDouble1x2
;
(
*
KeywordMap
)[
"double1x3"
]
=
EHTokDouble1x3
;
(
*
KeywordMap
)[
"double1x3"
]
=
EHTokDouble1x3
;
...
@@ -773,6 +789,22 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
...
@@ -773,6 +789,22 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
case
EHTokFloat4x2
:
case
EHTokFloat4x2
:
case
EHTokFloat4x3
:
case
EHTokFloat4x3
:
case
EHTokFloat4x4
:
case
EHTokFloat4x4
:
case
EHTokHalf1x1
:
case
EHTokHalf1x2
:
case
EHTokHalf1x3
:
case
EHTokHalf1x4
:
case
EHTokHalf2x1
:
case
EHTokHalf2x2
:
case
EHTokHalf2x3
:
case
EHTokHalf2x4
:
case
EHTokHalf3x1
:
case
EHTokHalf3x2
:
case
EHTokHalf3x3
:
case
EHTokHalf3x4
:
case
EHTokHalf4x1
:
case
EHTokHalf4x2
:
case
EHTokHalf4x3
:
case
EHTokHalf4x4
:
case
EHTokDouble1x1
:
case
EHTokDouble1x1
:
case
EHTokDouble1x2
:
case
EHTokDouble1x2
:
case
EHTokDouble1x3
:
case
EHTokDouble1x3
:
...
...
hlsl/hlslTokens.h
View file @
96f65521
...
@@ -216,6 +216,22 @@ enum EHlslTokenClass {
...
@@ -216,6 +216,22 @@ enum EHlslTokenClass {
EHTokFloat4x2
,
EHTokFloat4x2
,
EHTokFloat4x3
,
EHTokFloat4x3
,
EHTokFloat4x4
,
EHTokFloat4x4
,
EHTokHalf1x1
,
EHTokHalf1x2
,
EHTokHalf1x3
,
EHTokHalf1x4
,
EHTokHalf2x1
,
EHTokHalf2x2
,
EHTokHalf2x3
,
EHTokHalf2x4
,
EHTokHalf3x1
,
EHTokHalf3x2
,
EHTokHalf3x3
,
EHTokHalf3x4
,
EHTokHalf4x1
,
EHTokHalf4x2
,
EHTokHalf4x3
,
EHTokHalf4x4
,
EHTokDouble1x1
,
EHTokDouble1x1
,
EHTokDouble1x2
,
EHTokDouble1x2
,
EHTokDouble1x3
,
EHTokDouble1x3
,
...
...
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