decomp: ocean-transition (#616)

* some work on `ocean-transition`

* decomp: finished non-blocked `ocean-transition` functions

* decompiler: Support <0 unsigned comparison

* decompiler/goalc: Support half-word and byte parallel extend ops

* attempt to add support for byte stack spills, assertion errors

`Assertion failed: idx < n_src, file ..\..\..\decompiler\Disasm\Instruction.cpp, line 353`

* decomp: fix byte stack spills, only 1 issue remains in `draw-ocean-transition`

* almost there...

* closer, but unknowns about `dma-buffer` blocking

* dealing with dma-buffer issues

* some more fixes, only an obscure xmm issue remains

* add two problematic functions to blacklists, avoid goal_src additions for now

* fix building/compilation but TypeConsistency hits an assertion error

the `ocean-mid-masks`'s `data` field is none of the types

* decomp: finalize `ocean-transition`

* address feedback - 1 issue remains

* decomp: finalize `ocean-transition`
This commit is contained in:
Tyler Wilding
2021-08-01 17:42:40 -04:00
committed by GitHub
parent 87b44d982a
commit 75f7609baa
16 changed files with 3837 additions and 1248 deletions
+9 -9
View File
@@ -3636,15 +3636,6 @@ FormElement* ConditionElement::make_generic(const Env& env,
return make_less_than_zero_signed_check_generic(env, pool, source_forms, types);
}
case IR2_Condition::Kind::LEQ_ZERO_SIGNED: {
auto casted = make_casts_if_needed(source_forms, types, TypeSpec("int"), pool, env);
auto zero = pool.alloc_single_element_form<SimpleAtomElement>(
nullptr, SimpleAtom::make_int_constant(0));
casted.push_back(zero);
return pool.alloc_element<GenericElement>(GenericOperator::make_fixed(FixedOperatorKind::LEQ),
casted);
}
case IR2_Condition::Kind::LESS_THAN_ZERO_UNSIGNED: {
auto casted = make_casts_if_needed(source_forms, types, TypeSpec("uint"), pool, env);
auto zero = pool.alloc_single_element_form<SimpleAtomElement>(
@@ -3654,6 +3645,15 @@ FormElement* ConditionElement::make_generic(const Env& env,
casted);
}
case IR2_Condition::Kind::LEQ_ZERO_SIGNED: {
auto casted = make_casts_if_needed(source_forms, types, TypeSpec("int"), pool, env);
auto zero = pool.alloc_single_element_form<SimpleAtomElement>(
nullptr, SimpleAtom::make_int_constant(0));
casted.push_back(zero);
return pool.alloc_element<GenericElement>(GenericOperator::make_fixed(FixedOperatorKind::LEQ),
casted);
}
case IR2_Condition::Kind::GEQ_ZERO_SIGNED: {
return make_geq_zero_signed_check_generic(env, pool, source_forms, types);
}
+3 -1
View File
@@ -84,7 +84,9 @@ constexpr StackInstrInfo stack_instrs[] = {{InstructionKind::SQ, false, 16, fals
//{InstructionKind::LWU, true, 4, false}
{InstructionKind::SD, false, 8, false},
{InstructionKind::SWC1, false, 4, false},
{InstructionKind::LWC1, true, 4, false}};
{InstructionKind::LWC1, true, 4, false},
{InstructionKind::SB, false, 1, false},
{InstructionKind::LBU, true, 1, false}};
} // namespace
StackSpillMap build_spill_map(const std::vector<Instruction>& instructions, Range<int> range) {
+28 -27
View File
@@ -4284,9 +4284,7 @@
(debug-buf dma-buffer :offset 36)
(global-buf dma-buffer :offset 40)
(bucket-group dma-bucket :offset 44)
(buffer uint32 11 :offset 4) ;; for debugging?
(buffer dma-buffer 11 :offset 4)
(profile-bar profile-bar 2 :offset 48)
(run-time uint64 :offset 56)
)
@@ -6615,7 +6613,7 @@
)
(deftype ocean-mid-mask (structure)
((mask uint8 8 :offset-assert 0 :do-not-decompile) ;; avoid huge arrays.
((mask uint8 8 :offset-assert 0) ;; avoid huge arrays. (this causes an ocean-transition function to not decompile!)
(dword uint64 :offset 0)
)
:pack-me
@@ -6642,7 +6640,7 @@
)
(deftype ocean-trans-mask (structure)
((mask uint16 4 :offset-assert 0)
((mask uint8 4 :offset-assert 0)
(word uint64 :offset 0)
)
:pack-me
@@ -6751,9 +6749,9 @@
(corner-array ocean-corner 25 :inline :offset-assert 80)
(corner-count int32 :offset-assert 2080)
(temp-vecs vector 4 :inline :offset-assert 2096)
(mid-mask-ptrs pointer 36 :offset-assert 2160)
(mid-mask-ptrs (pointer int32) 36 :offset-assert 2160)
(mid-camera-masks uint64 36 :offset-assert 2304)
(trans-mask-ptrs pointer 64 :offset-assert 2592)
(trans-mask-ptrs (pointer int32) 64 :offset-assert 2592)
(trans-camera-masks ocean-trans-mask 16 :inline :offset-assert 2848)
(trans-temp-masks ocean-trans-mask 16 :inline :offset-assert 2976)
(near-mask-indices uint16 16 :offset-assert 3104)
@@ -6992,9 +6990,9 @@
(define-extern *ocean-trans-down-right-table* (pointer float))
(define-extern *ocean-trans-up-right-table* (pointer float))
(define-extern *ocean-trans-up-left-table* (pointer float))
(define-extern *ocean-trans-corner-table* (pointer float))
(define-extern *ocean-trans-strip-array* (pointer float))
(define-extern *ocean-trans-st-table* (pointer float))
(define-extern *ocean-trans-corner-table* (inline-array vector4w-2))
(define-extern *ocean-trans-strip-array* (pointer float)) ;; TODO this should probably be a ocean-trans-strip-array ?
(define-extern *ocean-trans-st-table* (inline-array vector))
;; ----------------------
@@ -20901,10 +20899,10 @@
(define-extern ocean-interp-wave function)
(define-extern ocean-generate-verts function)
(define-extern draw-ocean-texture function)
(define-extern ocean-init-buffer function)
(define-extern draw-ocean-far function)
(define-extern draw-ocean-mid function)
(define-extern ocean-end-buffer function)
(define-extern ocean-init-buffer (function dma-buffer none)) ; not confirmed
(define-extern draw-ocean-far (function dma-buffer none)) ; not confirmed
(define-extern draw-ocean-mid (function dma-buffer none)) ; not confirmed
(define-extern ocean-end-buffer (function dma-buffer none)) ; not confirmed
(define-extern draw-ocean-near function)
(define-extern init-ocean-far-regs function)
(define-extern render-ocean-far function)
@@ -20913,9 +20911,12 @@
(define-extern draw-ocean (function none))
(define-extern update-ocean (function none))
;; - Symbols
(define-extern *ocean-map* ocean-map)
;; - Unknowns
(define-extern *ocean-map* ocean-map) ;; unknown type
;;(define-extern *swamp-low-ocean-marker* object) ;; unknown type
@@ -20963,7 +20964,7 @@
;; - Functions
(define-extern ocean-mid-add-constants function)
(define-extern ocean-mid-add-call function)
(define-extern ocean-mid-add-call (function dma-buffer int none))
(define-extern ocean-mid-add-upload function)
(define-extern ocean-mid-add-call-flush (function dma-buffer uint none))
(define-extern draw-ocean-transition (function dma-buffer none))
@@ -20976,7 +20977,7 @@
(define-extern ocean-mid-mask-ptrs-bit? (function uint uint))
(define-extern ocean-mid-add-upload-table function)
(define-extern ocean-mid-camera-masks-set! function)
(define-extern ocean-mid-add-matrices function)
(define-extern ocean-mid-add-matrices (function dma-buffer none)) ;; not verified
(define-extern ocean-mid-check function)
(define-extern ocean-matrix*! function)
(define-extern ocean-mid-setup-constants function)
@@ -20995,16 +20996,16 @@
;; - Functions
(define-extern ocean-make-trans-camera-masks (function uint uint uint uint none))
(define-extern ocean-trans-add-upload-strip (function dma-buffer uint uint uint uint none))
(define-extern ocean-trans-add-constants (function dma-buffer none))
(define-extern draw-ocean-transition-seams (function dma-buffer none))
(define-extern ocean-trans-camera-masks-bit? function)
(define-extern ocean-trans-add-upload function)
(define-extern ocean-trans-mask-ptrs-bit? function)
(define-extern ocean-trans-add-upload-table function)
(define-extern ocean-transition-check function)
(define-extern ocean-trans-mask-ptrs-set! function)
(define-extern ocean-make-trans-camera-masks (function uint uint uint uint symbol))
(define-extern ocean-trans-add-upload-strip (function dma-buffer uint uint uint uint uint none))
(define-extern ocean-trans-add-constants (function dma-buffer pointer))
(define-extern draw-ocean-transition-seams (function dma-buffer symbol))
(define-extern ocean-trans-camera-masks-bit? (function uint uint symbol))
(define-extern ocean-trans-add-upload (function dma-buffer int int none))
(define-extern ocean-trans-mask-ptrs-bit? (function int int symbol))
(define-extern ocean-trans-add-upload-table (function dma-buffer int int (pointer float) int symbol none))
(define-extern ocean-transition-check (function ocean-trans-mask int int vector symbol))
(define-extern ocean-trans-mask-ptrs-set! (function int int symbol))
;; ----------------------
@@ -121,7 +121,7 @@
"ocean-h": [["L2", "ocean-work", true]],
"ocean-trans-tables": [
["L1", "(pointer float)", true, 16],
["L1", "(inline-array vector)", true, 4],
["L2", "(pointer float)", true, 160],
["L3", "(pointer float)", true, 100],
["L4", "(pointer float)", true, 72],
@@ -216,8 +216,6 @@
[32, "vector"]
],
"make-light-kit": [[16, "matrix"]],
"(method 23 trsqv)": [[16, "vector"]],
"(method 24 trsqv)": [[16, "vector"]],
@@ -391,9 +389,19 @@
[32, "matrix"]
],
"draw-ocean-transition": [[16, "sphere"]],
"(method 18 tracking-spline)": [
[16, "tracking-spline-sampler"],
[32, "tracking-spline-sampler"]
],
"draw-ocean-transition": [
[16, "sphere"]
],
"dm-cam-mode-func": [[16, "event-message-block"]],
"ocean-trans-add-upload-table": [
[16, "vector"]
],
"dm-cam-settings-func": [[16, "event-message-block"]],
@@ -719,6 +727,11 @@
[32, "quaternion"],
[48, "vector"]
],
"ocean-make-trans-camera-masks": [
[16, "vector"],
[32, "vector"]
],
"(anon-function 28 task-control)": [[16, "event-message-block"]],
@@ -796,5 +809,17 @@
[96, "vector"]
],
"ocean-transition-check": [
[16, "vector"]
],
"ocean-trans-add-upload-strip": [
[16, "vector"]
],
"draw-ocean-transition-seams": [
[16, "sphere"]
],
"placeholder-do-not-add-below!": []
}
@@ -1745,5 +1745,42 @@
[110, "s5", "vector"]
],
"ocean-trans-add-upload-table": [
[44, "a0", "dma-packet"],
[46, "a0", "dma-packet"],
[51, "a0", "dma-packet"],
[[55, 59], "v1", "vector4w"], // TODO - very likely wrong, but it's something that has 4 int32's,
[[87, 228], "v1", "(inline-array vector)"],
[241, "a0", "dma-packet"],
[243, "a0", "dma-packet"],
[248, "a0", "dma-packet"]
],
"ocean-trans-add-upload-strip": [
[39, "a0", "dma-packet"],
[41, "a0", "dma-packet"],
[46, "a0", "dma-packet"],
[[57, 61], "v1", "vector4w"], // TODO - very likely wrong, but it's something that has 4 int32's,
[[64, 147], "v1", "(inline-array vector)"], // TODO - very likely wrong, but it's something that has 4 int32's,
[166, "a0", "dma-packet"],
[168, "a0", "dma-packet"],
[173, "a0", "dma-packet"]
],
"ocean-trans-add-constants": [
[7, "a1", "dma-packet"],
[9, "a1", "dma-packet"],
[14, "a1", "dma-packet"],
[[17, 46], "v1", "matrix"]
],
"draw-ocean-transition": [
[255, "v1", "ocean-mid-mask"]
],
// "ocean-trans-mask-ptrs-bit?": [
// [[32, 41], "a0", "(pointer ocean-trans-mask)"]
// ],
"placeholder-do-not-add-below": []
}
+1 -1
View File
@@ -75,7 +75,7 @@
(debug-buf dma-buffer :offset 36)
(global-buf dma-buffer :offset 40)
(bucket-group dma-bucket :offset 44)
(buffer uint32 11 :offset 4) ;; for debugging?
(buffer dma-buffer 11 :offset 4)
(profile-bar profile-bar 2 :offset 48)
(run-time uint64 :offset 56)
)
+6 -8
View File
@@ -80,7 +80,7 @@
)
(deftype ocean-mid-masks (basic)
((data (inline-array ocean-mid-mask) :offset-assert 4)
((data (inline-array ocean-mid-mask) :offset-assert 4)
)
:pack-me
:method-count-assert 9
@@ -89,7 +89,7 @@
)
(deftype ocean-trans-mask (structure)
((mask uint16 4 :offset-assert 0)
((mask uint8 4 :offset-assert 0)
(word uint64 :offset 0)
)
:pack-me
@@ -124,7 +124,6 @@
:flag-assert #x900000020
)
(deftype ocean-near-indices (basic)
((data (inline-array ocean-near-index) :offset-assert 4)
)
@@ -175,7 +174,6 @@
:flag-assert #x900000280
)
(deftype ocean-wave-data (structure)
((data uint8 1024 :offset-assert 0)
)
@@ -184,7 +182,6 @@
:flag-assert #x900000400
)
;; the size of this type overflows.
(deftype ocean-wave-frames (structure)
((frame ocean-wave-data 64 :inline :offset-assert 0)
)
@@ -201,9 +198,9 @@
(corner-array ocean-corner 25 :inline :offset-assert 80)
(corner-count int32 :offset-assert 2080)
(temp-vecs vector 4 :inline :offset-assert 2096)
(mid-mask-ptrs pointer 36 :offset-assert 2160)
(mid-camera-masks uint64 36 :offset-assert 2304)
(trans-mask-ptrs pointer 64 :offset-assert 2592)
(mid-mask-ptrs (pointer int32) 36 :offset-assert 2160)
(mid-camera-masks uint64 36 :offset-assert 2304)
(trans-mask-ptrs (pointer int32) 64 :offset-assert 2592)
(trans-camera-masks ocean-trans-mask 16 :inline :offset-assert 2848)
(trans-temp-masks ocean-trans-mask 16 :inline :offset-assert 2976)
(near-mask-indices uint16 16 :offset-assert 3104)
@@ -416,3 +413,4 @@
:flag-assert #x900000110
)
(define-extern *ocean-trans-corner-table* (inline-array vector4w-2))
+7
View File
@@ -5,3 +5,10 @@
;; name in dgo: ocean-mid
;; dgos: GAME, ENGINE
;; TODO - for ocean-transition
(define-extern ocean-mid-add-matrices (function dma-buffer none)) ;; not verified
(define-extern ocean-mid-add-call-flush (function dma-buffer uint none))
(define-extern draw-ocean-transition (function dma-buffer none))
(define-extern ocean-mid-add-call (function dma-buffer int none))
(define-extern ocean-mid-camera-masks-bit? (function uint uint))
(define-extern ocean-mid-mask-ptrs-bit? (function uint uint))
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2
View File
@@ -5,3 +5,5 @@
;; name in dgo: ocean
;; dgos: GAME, ENGINE
;; TODO - for ocean-transition
(define-extern *ocean-map* ocean-map)
@@ -90,7 +90,7 @@
(debug-buf dma-buffer :offset 36)
(global-buf dma-buffer :offset 40)
(bucket-group dma-bucket :offset 44)
(buffer uint32 11 :offset 4)
(buffer dma-buffer 11 :offset 4)
(profile-bar profile-bar 2 :offset 48)
(run-time uint64 :offset 56)
)
@@ -121,7 +121,7 @@
;; definition for method 3 of type ocean-mid-mask
(defmethod inspect ocean-mid-mask ((obj ocean-mid-mask))
(format #t "[~8x] ~A~%" obj 'ocean-mid-mask)
(format #t "~Tmask[8] @ #x~X~%" (&-> obj dword))
(format #t "~Tmask[8] @ #x~X~%" (-> obj mask))
(format #t "~Tdword: #x~X~%" (-> obj dword))
obj
)
@@ -161,7 +161,7 @@
;; definition of type ocean-trans-mask
(deftype ocean-trans-mask (structure)
((mask uint16 4 :offset-assert 0)
((mask uint8 4 :offset-assert 0)
(word uint64 :offset 0)
)
:pack-me
@@ -374,9 +374,9 @@
(corner-array ocean-corner 25 :inline :offset-assert 80)
(corner-count int32 :offset-assert 2080)
(temp-vecs vector 4 :inline :offset-assert 2096)
(mid-mask-ptrs pointer 36 :offset-assert 2160)
(mid-mask-ptrs (pointer int32) 36 :offset-assert 2160)
(mid-camera-masks uint64 36 :offset-assert 2304)
(trans-mask-ptrs pointer 64 :offset-assert 2592)
(trans-mask-ptrs (pointer int32) 64 :offset-assert 2592)
(trans-camera-masks ocean-trans-mask 16 :inline :offset-assert 2848)
(trans-temp-masks ocean-trans-mask 16 :inline :offset-assert 2976)
(near-mask-indices uint16 16 :offset-assert 3104)
@@ -849,110 +849,112 @@
)
)
;; definition for symbol *ocean-trans-corner-table*, type (pointer float)
;; definition for symbol *ocean-trans-corner-table*, type (inline-array vector4w-2)
(define
*ocean-trans-corner-table*
(new 'static 'array float 100
1.0
0.0
0.0
0.0
0.75
0.25
0.0
0.0
0.5
0.5
0.0
0.0
0.25
0.75
0.0
0.0
0.0
1.0
0.0
0.0
0.75
0.0
0.25
0.0
0.5625
0.1875
0.1875
0.0625
0.375
0.375
0.125
0.125
0.1875
0.5625
0.0625
0.1875
0.0
0.75
0.0
0.25
0.5
0.0
0.5
0.0
0.375
0.125
0.375
0.125
0.25
0.25
0.25
0.25
0.125
0.375
0.125
0.375
0.0
0.5
0.0
0.5
0.25
0.0
0.75
0.0
0.1875
0.0625
0.5625
0.1875
0.125
0.125
0.375
0.375
0.0625
0.1875
0.1875
0.5625
0.0
0.25
0.0
0.75
0.0
0.0
1.0
0.0
0.0
0.0
0.75
0.25
0.0
0.0
0.5
0.5
0.0
0.0
0.25
0.75
0.0
0.0
0.0
1.0
(the-as (inline-array vector4w-2)
(new 'static 'array float 100
1.0
0.0
0.0
0.0
0.75
0.25
0.0
0.0
0.5
0.5
0.0
0.0
0.25
0.75
0.0
0.0
0.0
1.0
0.0
0.0
0.75
0.0
0.25
0.0
0.5625
0.1875
0.1875
0.0625
0.375
0.375
0.125
0.125
0.1875
0.5625
0.0625
0.1875
0.0
0.75
0.0
0.25
0.5
0.0
0.5
0.0
0.375
0.125
0.375
0.125
0.25
0.25
0.25
0.25
0.125
0.375
0.125
0.375
0.0
0.5
0.0
0.5
0.25
0.0
0.75
0.0
0.1875
0.0625
0.5625
0.1875
0.125
0.125
0.375
0.375
0.0625
0.1875
0.1875
0.5625
0.0
0.25
0.0
0.75
0.0
0.0
1.0
0.0
0.0
0.0
0.75
0.25
0.0
0.0
0.5
0.5
0.0
0.0
0.25
0.75
0.0
0.0
0.0
1.0
)
)
)
@@ -1123,29 +1125,13 @@
)
)
;; definition for symbol *ocean-trans-st-table*, type (pointer float)
;; definition for symbol *ocean-trans-st-table*, type (inline-array vector)
(define
*ocean-trans-st-table*
(new 'static 'array float 16
0.0
0.0
1.0
0.0
1.0
0.0
1.0
0.0
0.0
1.0
1.0
0.0
1.0
1.0
1.0
0.0
(new 'static 'inline-array vector 4
(new 'static 'vector :z 1.0)
(new 'static 'vector :x 1.0 :z 1.0)
(new 'static 'vector :y 1.0 :z 1.0)
(new 'static 'vector :x 1.0 :y 1.0 :z 1.0)
)
)
File diff suppressed because it is too large Load Diff