[graphics] TIE extractor (#1026)

* temp

* temp

* wip

* more progress on the instance asm

* first half of tie extraction, up to dma lists

* more tie extraction

* first part figured out maybe

* bp1 loop seems to work, bp2 loop does not

* bp1 and bp2 appear working. sadly ip is needed

* ip1 outline, not working ip2

* just kidding, ip2 seems to work

* extraction seems to work

* basic rendering working

* tie fixes

* performance optimization of tie renderer

* hook up tie to engine

* fix more bugs

* cleanup and perf improvements

* fix tests

* ref tests

* mm256i for gcc

* CLANG

* windows

* more compile fixes

* fix fast time of day

* small fixes

* fix after merge

* clang
This commit is contained in:
water111
2021-12-26 12:33:51 -05:00
committed by GitHub
parent ff61d32095
commit a8342aef31
71 changed files with 13430 additions and 733 deletions
+112
View File
@@ -0,0 +1,112 @@
xtop vi02 | nop
nop | nop
ilwr.x vi04, vi02 | nop
iaddi vi02, vi02, 0x1 | nop
iaddiu vi03, vi02, 0x90 | nop
L1:
ilw.y vi08, 1(vi02) | nop
lq.xyzw vf25, 900(vi00) | nop
lq.xyzw vf26, 901(vi00) | nop
lq.xyzw vf27, 902(vi00) | nop
lq.xyzw vf28, 903(vi00) | nop
lq.xyzw vf30, 904(vi00) | nop
lqi.xyzw vf01, vi02 | nop
lqi.xyzw vf05, vi02 | nop
lqi.xyzw vf11, vi02 | nop
lq.xyzw vf12, 1020(vi00) | mulaw.xyzw ACC, vf28, vf00
nop | maddax.xyzw ACC, vf25, vf01
nop | madday.xyzw ACC, vf26, vf01
nop | maddz.xyzw vf02, vf27, vf01
move.w vf05, vf00 | addw.z vf01, vf00, vf05
nop | nop
div Q, vf31.x, vf02.w | muly.z vf05, vf05, vf31
nop | mul.xyzw vf03, vf02, vf29
nop | nop
nop | nop
nop | mulz.z vf04, vf05, vf05
lq.xyzw vf14, 1001(vi00) | clipw.xyz vf03, vf03
iaddi vi06, vi00, 0x1 | adda.xyzw ACC, vf11, vf11
L2:
ior vi05, vi15, vi00 | mul.zw vf01, vf01, Q
lq.xyzw vf06, 998(vi00) | mulz.xyzw vf15, vf05, vf04
lq.xyzw vf14, 1002(vi00) | mula.xyzw ACC, vf05, vf14
fmand vi01, vi06 | mul.xyz vf02, vf02, Q
ibne vi00, vi01, L5 | addz.x vf01, vf00, vf01
lqi.xyzw vf07, vi03 | mulz.xyzw vf16, vf15, vf04
lq.xyzw vf14, 1003(vi00) | madda.xyzw ACC, vf15, vf14
lqi.xyzw vf08, vi03 | add.xyzw vf10, vf02, vf30
lqi.xyzw vf09, vi03 | mulw.x vf01, vf01, vf01
sqi.xyzw vf06, vi05 | mulz.xyzw vf15, vf16, vf04
lq.xyzw vf14, 1004(vi00) | madda.xyzw ACC, vf16, vf14
sqi.xyzw vf07, vi05 | maxx.w vf10, vf10, vf12
sqi.xyzw vf08, vi05 | maxz.zw vf01, vf01, vf31
sqi.xyzw vf09, vi05 | mulz.xyzw vf16, vf15, vf04
lq.xyzw vf14, 1005(vi00) | madda.xyzw ACC, vf15, vf14
lqi.xyzw vf06, vi03 | mulw.x vf01, vf01, vf31
lqi.xyzw vf07, vi03 | miniy.w vf10, vf10, vf12
lq.xyzw vf08, 999(vi08) | miniz.zw vf01, vf01, vf12
ilw.x vi07, -2(vi02) | madd.xyzw vf05, vf16, vf14
lqi.xyzw vf23, vi02 | miniw.x vf01, vf01, vf00
nop | suby.w vf02, vf10, vf12
lqi.xyzw vf24, vi02 | mulx.w vf11, vf11, vf01
fcand vi01, 0x3f | mulaw.xyzw ACC, vf28, vf00
lq.xyzw vf17, 1006(vi00) | maddax.xyzw ACC, vf25, vf23
fmand vi09, vi06 | nop
ibne vi00, vi09, L6 | nop
lq.xyzw vf18, 1007(vi00) | madday.xyzw ACC, vf26, vf23
L3:
lq.xyzw vf19, 980(vi07) | ftoi0.xyzw vf11, vf11
lq.xyzw vf20, 981(vi07) | maddz.xyzw vf02, vf27, vf23
lq.xyzw vf21, 982(vi07) | mulaw.xyzw ACC, vf17, vf05
lq.xyzw vf22, 983(vi07) | msubz.xyzw vf12, vf18, vf05
sq.xyzw vf11, 3(vi05) | mulaz.xyzw ACC, vf17, vf05
lqi.xyzw vf11, vi02 | maddw.xyzw vf13, vf18, vf05
move.w vf24, vf00 | addw.z vf23, vf00, vf24
div Q, vf31.x, vf02.w | mulw.xyzw vf12, vf12, vf01
ibne vi00, vi01, L4 | muly.z vf24, vf24, vf31
ilw.y vi08, -2(vi02) | mulz.xyzw vf13, vf13, vf01
sqi.xyzw vf06, vi05 | mul.xyzw vf03, vf02, vf29
sqi.xyzw vf07, vi05 | mulaw.xyzw ACC, vf10, vf00
sqi.xyzw vf08, vi05 | maddax.xyzw ACC, vf12, vf19
lq.xyzw vf06, 988(vi00) | maddy.xyzw vf19, vf13, vf19
lq.xyzw vf07, 989(vi00) | mulaw.xyzw ACC, vf10, vf00
lq.xyzw vf08, 990(vi00) | maddax.xyzw ACC, vf12, vf20
lq.xyzw vf09, 991(vi00) | maddy.xyzw vf20, vf13, vf20
sq.xyzw vf06, 1(vi05) | mulaw.xyzw ACC, vf10, vf00
sq.xyzw vf07, 3(vi05) | maddax.xyzw ACC, vf12, vf21
sq.xyzw vf08, 5(vi05) | maddy.xyzw vf21, vf13, vf21
sq.xyzw vf09, 7(vi05) | mulaw.xyzw ACC, vf10, vf00
nop | maddax.xyzw ACC, vf12, vf22
nop | maddy.xyzw vf22, vf13, vf22
lq.xyzw vf12, 1020(vi00) | ftoi4.xyzw vf19, vf19
lq.xyzw vf14, 1001(vi00) | ftoi4.xyzw vf20, vf20
move.xyzw vf05, vf24 | ftoi4.xyzw vf21, vf21
move.xyzw vf01, vf23 | ftoi4.xyzw vf22, vf22
sq.xyzw vf19, 2(vi05) | mulz.z vf04, vf24, vf24
sq.xyzw vf20, 4(vi05) | clipw.xyz vf03, vf03
sq.xyzw vf21, 6(vi05) | nop
sq.xyzw vf22, 8(vi05) | nop
xgkick vi15 | nop
iaddi vi04, vi04, -0x1 | nop
iaddiu vi01, vi00, 0x672 | nop
ibne vi00, vi04, L2 | nop
isub vi15, vi01, vi15 | adda.xyzw ACC, vf11, vf11
nop | nop :e
nop | nop
L4:
iaddi vi04, vi04, -0x1 | nop
iaddi vi02, vi02, -0x3 | nop
ibne vi00, vi04, L1 | nop
nop | nop
nop | nop :e
nop | nop
L5:
iaddi vi04, vi04, -0x1 | nop
iaddi vi03, vi03, 0x4 | nop
ibne vi00, vi04, L1 | nop
nop | nop
nop | nop :e
nop | nop
L6:
b L3 | nop
lq.xyzw vf08, 1000(vi00) | nop
+105
View File
@@ -0,0 +1,105 @@
xtop vi02 | nop
nop | nop
ilwr.x vi04, vi02 | nop
iaddi vi02, vi02, 0x1 | nop
iaddiu vi03, vi02, 0x90 | nop
L7:
ilw.y vi08, 1(vi02) | nop
lq.xyzw vf25, 900(vi00) | nop
lq.xyzw vf26, 901(vi00) | nop
lq.xyzw vf27, 902(vi00) | nop
lq.xyzw vf28, 903(vi00) | nop
lq.xyzw vf30, 904(vi08) | nop
lqi.xyzw vf01, vi02 | nop
lqi.xyzw vf05, vi02 | nop
lqi.xyzw vf11, vi02 | nop
lq.xyzw vf12, 1020(vi00) | mulaw.xyzw ACC, vf28, vf00
ilw.y vi08, 1(vi02) | maddax.xyzw ACC, vf25, vf01
nop | madday.xyzw ACC, vf26, vf01
nop | maddz.xyzw vf02, vf27, vf01
move.w vf05, vf00 | addw.z vf01, vf00, vf05
nop | nop
div Q, vf31.x, vf02.w | muly.z vf05, vf05, vf31
nop | mul.xyzw vf03, vf02, vf29
nop | nop
nop | nop
nop | mulz.z vf04, vf05, vf05
lq.xyzw vf14, 1001(vi00) | clipw.xyz vf03, vf03
iaddi vi06, vi00, 0x1 | adda.xyzw ACC, vf11, vf11
L8:
ior vi05, vi15, vi00 | mul.zw vf01, vf01, Q
lq.xyzw vf06, 998(vi00) | mulz.xyzw vf15, vf05, vf04
lq.xyzw vf14, 1002(vi00) | mula.xyzw ACC, vf05, vf14
fmand vi01, vi06 | mul.xyz vf02, vf02, Q
ibne vi00, vi01, L10 | addz.x vf01, vf00, vf01
lqi.xyzw vf07, vi03 | mulz.xyzw vf16, vf15, vf04
lq.xyzw vf14, 1003(vi00) | madda.xyzw ACC, vf15, vf14
lqi.xyzw vf08, vi03 | add.xyzw vf10, vf02, vf30
lqi.xyzw vf09, vi03 | mulw.x vf01, vf01, vf01
sqi.xyzw vf06, vi05 | mulz.xyzw vf15, vf16, vf04
lq.xyzw vf14, 1004(vi00) | madda.xyzw ACC, vf16, vf14
sqi.xyzw vf07, vi05 | maxx.w vf10, vf10, vf12
sqi.xyzw vf08, vi05 | maxz.zw vf01, vf01, vf31
sqi.xyzw vf09, vi05 | mulz.xyzw vf16, vf15, vf04
lq.xyzw vf14, 1005(vi00) | madda.xyzw ACC, vf15, vf14
lqi.xyzw vf06, vi03 | mulw.x vf01, vf01, vf31
lqi.xyzw vf07, vi03 | miniy.w vf10, vf10, vf12
lq.xyzw vf08, 1000(vi00) | nop
ilw.x vi07, -2(vi02) | madd.xyzw vf05, vf16, vf14
lq.xyzw vf30, 904(vi08) | nop
lqi.xyzw vf23, vi02 | miniw.x vf01, vf01, vf00
lqi.xyzw vf24, vi02 | mulx.w vf11, vf11, vf01
fcand vi01, 0x3f | mulaw.xyzw ACC, vf28, vf00
lq.xyzw vf17, 1006(vi00) | maddax.xyzw ACC, vf25, vf23
lq.xyzw vf18, 1007(vi00) | madday.xyzw ACC, vf26, vf23
lq.xyzw vf19, 980(vi07) | ftoi0.xyzw vf11, vf11
lq.xyzw vf20, 981(vi07) | maddz.xyzw vf02, vf27, vf23
lq.xyzw vf21, 982(vi07) | mulaw.xyzw ACC, vf17, vf05
lq.xyzw vf22, 983(vi07) | msubz.xyzw vf12, vf18, vf05
sq.xyzw vf11, 3(vi05) | mulaz.xyzw ACC, vf17, vf05
lqi.xyzw vf11, vi02 | maddw.xyzw vf13, vf18, vf05
move.w vf24, vf00 | addw.z vf23, vf00, vf24
div Q, vf31.x, vf02.w | mulw.xyzw vf12, vf12, vf01
ibne vi00, vi01, L9 | muly.z vf24, vf24, vf31
ilw.y vi08, 1(vi02) | mulz.xyzw vf13, vf13, vf01
sqi.xyzw vf06, vi05 | mul.xyzw vf03, vf02, vf29
sqi.xyzw vf07, vi05 | mulaw.xyzw ACC, vf10, vf00
sqi.xyzw vf08, vi05 | maddax.xyzw ACC, vf12, vf19
lq.xyzw vf06, 988(vi00) | maddy.xyzw vf19, vf13, vf19
lq.xyzw vf07, 989(vi00) | mulaw.xyzw ACC, vf10, vf00
lq.xyzw vf08, 990(vi00) | maddax.xyzw ACC, vf12, vf20
lq.xyzw vf09, 991(vi00) | maddy.xyzw vf20, vf13, vf20
sq.xyzw vf06, 1(vi05) | mulaw.xyzw ACC, vf10, vf00
sq.xyzw vf07, 3(vi05) | maddax.xyzw ACC, vf12, vf21
sq.xyzw vf08, 5(vi05) | maddy.xyzw vf21, vf13, vf21
sq.xyzw vf09, 7(vi05) | mulaw.xyzw ACC, vf10, vf00
nop | maddax.xyzw ACC, vf12, vf22
nop | maddy.xyzw vf22, vf13, vf22
lq.xyzw vf12, 1020(vi00) | ftoi4.xyzw vf19, vf19
lq.xyzw vf14, 1001(vi00) | ftoi4.xyzw vf20, vf20
move.xyzw vf05, vf24 | ftoi4.xyzw vf21, vf21
move.xyzw vf01, vf23 | ftoi4.xyzw vf22, vf22
sq.xyzw vf19, 2(vi05) | mulz.z vf04, vf24, vf24
sq.xyzw vf20, 4(vi05) | clipw.xyz vf03, vf03
sq.xyzw vf21, 6(vi05) | nop
sq.xyzw vf22, 8(vi05) | nop
xgkick vi15 | nop
iaddi vi04, vi04, -0x1 | nop
iaddiu vi01, vi00, 0x672 | nop
ibne vi00, vi04, L8 | nop
isub vi15, vi01, vi15 | adda.xyzw ACC, vf11, vf11
nop | nop :e
nop | nop
L9:
iaddi vi04, vi04, -0x1 | nop
iaddi vi02, vi02, -0x3 | nop
ibne vi00, vi04, L7 | nop
nop | nop
nop | nop :e
nop | nop
L10:
iaddi vi04, vi04, -0x1 | nop
iaddi vi03, vi03, 0x4 | nop
ibne vi00, vi04, L7 | nop
nop | nop
nop | nop :e
File diff suppressed because it is too large Load Diff
+1041
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+63
View File
@@ -0,0 +1,63 @@
TIE Format Document
--------------------
TIE Instances
----------------
The instances are arranged into a BVH like with tfrag.
The visibility bit strings work exactly the same way too.
The "origin" matrix stores 16-bits per entry.
The final row is set with (x << 16) >> 10 and vitof0
The other rows are set with (x << 16) >> 16 and vitof12
row0's w is set to 0 manually.
There are 64 winds. The wind index of an instance is (wind-index + wind-time) & 0b111111. The wind time is stored in *wind-work*.
This indexes into the wind-vectors in the proxy-prototype-array-tie of the drawable-tree-instance-tie.
(and also the wind-vectors of *wind-work*, but this isn't known yet)
The flags mean:
0b01 : Do not generate instance DMA, in all conditions. Likely rare because it's checked pretty late.
0b10 : Use the GENERIC renderer.
DMA in work:
work.upload-color-0.addr = output_ptr
work.generic-color-0.addr = output_ptr
calculation of clipped w:
multiply bsphere by camera matrix
add hvdf_offset.w to w
clamp to within (hmge-d.x hmdge-d.y)
calculation of total camera matrix:
vf10+ is origin, vf20+ is the SHRUB MATRIX!!!
vmulax.xyzw acc, vf20, vf10
vmadday.xyzw acc, vf21, vf10
vmaddz.xyzw vf10, vf22, vf10
vmulax.xyzw acc, vf20, vf11
vmadday.xyzw acc, vf21, vf11
vmaddz.xyzw vf11, vf22, vf11
vmulax.xyzw acc, vf20, vf12
vmadday.xyzw acc, vf21, vf12
vmaddz.xyzw vf12, vf22, vf12
vmulax.xyzw acc, vf20, vf13
vmadday.xyzw acc, vf21, vf13
vmaddaz.xyzw acc, vf22, vf13
vmaddw.xyzw vf13, vf23, vf0
Out data (6 qw = 96 bytes):
0-64 : matrix.
64 : morph constants
80 : [flags & 2, clipping/dists, 0, clipped_w]
Next are 3x "color" tags.
The final one will link to the "next" instance in the proto bucket
For the final instance in the bucket, it will be a ret.
96: color0