Commit 96f65521 by John Kessenich

HLSL: Implement half matrices, and map all half* -> float*.

parent f6deacd5
...@@ -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
...@@ -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;
} }
...@@ -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;
} }
...@@ -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;
......
...@@ -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:
......
...@@ -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,
......
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