decomp: merc, merc-vu1 (#1865)

The merc VU1 program is identical to Jak 1. Jak 2's merc is doing some
new texture login stuff and the DMA buffer setup is a bit different, but
overall very similar.
This commit is contained in:
Hat Kid
2022-09-11 01:02:58 +02:00
committed by GitHub
parent 81b6d5fe08
commit 7339b2b965
19 changed files with 7709 additions and 28 deletions
+13 -15
View File
@@ -3016,8 +3016,8 @@
(rn10)
(rn11)
(rn12)
(rn13)
(rn14)
(merc)
(emerc)
(rn15)
(rn16)
(rn17)
@@ -7461,7 +7461,7 @@
(define-extern adgif-shader-update! (function adgif-shader texture none))
;; (define-extern adgif-shader<-texture-with-update! function) ;; (function adgif-shader texture adgif-shader)
;; (define-extern hack-texture function)
;; (define-extern adgif-shader-login function) ;; (function adgif-shader texture)
(define-extern adgif-shader-login (function adgif-shader texture))
(define-extern adgif-shader-login-no-remap (function adgif-shader texture))
;; (define-extern adgif-shader-login-fast function) ;; (function adgif-shader texture)
;; (define-extern adgif-shader-login-no-remap-fast function) ;; (function adgif-shader texture)
@@ -10344,7 +10344,7 @@
:size-assert #x18
:flag-assert #xa00000018
(:methods
(login-adgifs (_type_) none 9)
(login-adgifs (_type_) merc-fragment 9)
)
)
@@ -22016,7 +22016,7 @@
;; merc-vu1 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (define-extern merc-vu1-block object) ;; vu-function
(define-extern merc-vu1-block vu-function)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; emerc-vu1 ;;
@@ -22107,7 +22107,6 @@
;; merc ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype texture-login-data (structure)
((default-texture-index int32 :offset-assert 0)
(current-texture-index int32 :offset-assert 4)
@@ -22119,7 +22118,6 @@
:size-assert #x14
:flag-assert #x900000014
)
|#
#|
(deftype merc-fragment-control (structure)
@@ -22143,15 +22141,15 @@
)
|#
;; (define-extern *texture-login-data* object)
;; (define-extern texture-usage-init function)
;; (define-extern texture-usage-update function)
;; (define-extern merc-stats-display function) ;; (function merc-ctrl none)
(define-extern *texture-login-data* texture-login-data)
(define-extern texture-usage-init (function merc-ctrl symbol))
(define-extern texture-usage-update (function texture symbol))
(define-extern merc-stats-display (function merc-ctrl none))
(define-extern merc-stats (function none))
;; (define-extern merc-edge-stats function) ;; (function none)
(define-extern merc-edge-stats (function none))
(define-extern merc-vu1-add-vu-function (function dma-packet vu-function int dma-gif-packet))
;; (define-extern merc-vu1-initialize-chain function) ;; (function dma-gif-packet dma-packet)
;; (define-extern merc-vu1-init-buffer function) ;; (function bucket-id gs-test int none)
(define-extern merc-vu1-initialize-chain (function dma-gif-packet int dma-packet))
(define-extern merc-vu1-init-buffer (function bucket-id int symbol int))
(define-extern merc-vu1-init-buffers (function none))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -28927,7 +28925,7 @@
;; (define-extern render-eyes-64-different function)
;; (define-extern debug-eyes function)
(define-extern update-eyes (function none))
;; (define-extern get-eye-block function) ;; (function int int int)
(define-extern get-eye-block (function int int int))
;; (define-extern convert-eye-data function) ;; (function eye uint float)
;; (define-extern merc-eye-anim function) ;; (function process-drawable none)
;; (define-extern set-eye-draw-flag function)
+2 -1
View File
@@ -165,5 +165,6 @@
["L480", "vector"],
["L479", "vector"],
["L474", "vector"]
]
],
"merc-vu1": [["L1", "vu-function"]]
}
+33
View File
@@ -1909,6 +1909,39 @@
[9, "t9", "(function editable-light editable-array none)"]
],
"(method 25 editable)": [[[12, 17], "a0", "editable"]],
"merc-edge-stats": [[31, "v1", "merc-ctrl"]],
"(method 8 merc-ctrl)": [
[46, "s2", "pointer"], // was merc-fragment-control
[[22, 45], "s2", "merc-fragment-control"],
[[89, 93], "a1", "merc-blend-ctrl"],
[103, "a1", "pointer"]
],
"merc-vu1-initialize-chain": [
[[13, 19], "gp", "(pointer vif-tag)"],
[[19, 116], "s5", "merc-vu1-low-mem"],
[127, "gp", "(inline-array dma-packet)"]
],
"(method 9 merc-fragment)": [[[13, 265], "s3", "adgif-shader"]],
"(method 9 merc-effect)": [
[46, "s4", "pointer"],
[47, "s5", "pointer"],
[[0, 46], "s4", "merc-fragment"],
[[0, 47], "s5", "merc-fragment-control"]
],
"merc-vu1-init-buffer": [
[[21, 37], "a0", "dma-packet"],
[[37, 40], "a0", "gs-gif-tag"],
[45, "a0", "(pointer gs-test)"],
[47, "a0", "(pointer gs-reg64)"],
[49, "a1", "(pointer gs-reg64)"],
[52, "a0", "(pointer gs-test)"],
[54, "a0", "(pointer gs-test)"],
[[63, 68], "v1", "dma-packet"]
],
"texture-usage-init": [
[23, "a1", "texture-masks"],
[24, "a1", "texture-mask"]
],
// placeholder
"placeholder-do-not-add-below": []
}
+28
View File
@@ -665,5 +665,33 @@
"v1-48": "time-after-vsync",
"s5-1": "next-dma-buf"
}
},
"merc-vu1-add-vu-function": {
"args": ["dma", "func", "flush-mode"],
"vars": {
"v1-0": "func-data",
"a3-0": "qwc",
"a1-1": "dst",
"t0-1": "qwc-this-time"
}
},
"merc-vu1-init-buffer": {
"args": ["dma-bucket"],
"vars": {
"gp-0": "bucket",
"s4-0": "dma-buf"
}
},
"(method 9 merc-effect)": {
"vars": {
"v1-0": "data",
"v1-1": "tex",
"a0-8": "seg",
"s3-0": "frag-idx",
"s2-0": "ctrl-size",
"s1-0": "geo-size",
"s4-0": ["geo", "merc-fragment"],
"s5-0": ["ctrl", "merc-fragment-control"]
}
}
}
+1 -1
View File
@@ -8,7 +8,7 @@
// if you want to filter to only some object names.
// it will make the decompiler much faster.
"allowed_objects": [],
"banned_objects": ["effect-control"],
"banned_objects": ["effect-control", "time-of-day"],
////////////////////////////
// CODE ANALYSIS OPTIONS
+1 -1
View File
@@ -94,7 +94,7 @@
(defconstant DEFAULT_ALL_RENDERERS
(vu1-renderer-mask
rn3 rn4 rn5 rn6 rn7 rn8 rn9 rn10 rn11 rn12 rn13 rn14 rn15 rn16
rn3 rn4 rn5 rn6 rn7 rn8 rn9 rn10 rn11 rn12 merc emerc rn15 rn16
rn17 rn18 rn19 rn20 rn21 rn22 rn23 rn24 rn25 rn26 rn27 rn28 rn29
rn30 rn31 rn32 rn34
)
+1 -1
View File
@@ -117,7 +117,7 @@
)
(defun emerc-vu1-init-buffers ()
(when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask rn14))
(when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask emerc))
(emerc-vu1-init-buffer (bucket-id bucket-15) (new 'static 'gs-test :zte #x1 :ztst (gs-ztest greater-equal)) 0)
(emerc-vu1-init-buffer (bucket-id bucket-26) (new 'static 'gs-test :zte #x1 :ztst (gs-ztest greater-equal)) 0)
(emerc-vu1-init-buffer (bucket-id bucket-37) (new 'static 'gs-test :zte #x1 :ztst (gs-ztest greater-equal)) 0)
+1 -1
View File
@@ -49,7 +49,7 @@
:size-assert #x18
:flag-assert #xa00000018
(:methods
(login-adgifs (_type_) none 9)
(login-adgifs (_type_) merc-fragment 9)
)
)
@@ -7,3 +7,4 @@
;; DECOMP BEGINS
(define merc-vu1-block (new 'static 'vu-function :length #x7e5 :qlength #x3f3))
+649
View File
@@ -5,5 +5,654 @@
;; name in dgo: merc
;; dgos: ENGINE, GAME
;; TODO uncomment usages of adgif-shader-login and get-eye-block once their respective files are finished
;; (define-extern adgif-shader-login (function adgif-shader texture))
;; (define-extern get-eye-block (function int int int))
;; DECOMP BEGINS
(format 0 "SKIP: calls to adgif-shader-login and get-eye-block in merc~%")
(deftype texture-login-data (structure)
((default-texture-index int32 :offset-assert 0)
(current-texture-index int32 :offset-assert 4)
(texture-usage-group texture-usage-group :offset-assert 8)
(merc-ctrl-header merc-ctrl-header :offset-assert 12)
(name basic :offset-assert 16)
)
:method-count-assert 9
:size-assert #x14
:flag-assert #x900000014
)
(define *texture-login-data* (new 'global 'texture-login-data))
(defmethod login art-joint-geo ((obj art-joint-geo))
(let ((s5-0 *texture-login-data*))
(set! (-> s5-0 default-texture-index)
(res-lump-value (-> obj extra) 'texture-bucket int :default (the-as uint128 1) :time -1000000000.0)
)
)
obj
)
(defun texture-usage-init ((arg0 merc-ctrl))
"Initialize texture login data."
(let ((gp-0 *texture-login-data*))
(set! (-> arg0 header texture-usage-group) (new 'loading-level 'texture-usage-group))
(set! (-> gp-0 texture-usage-group) (-> arg0 header texture-usage-group))
(set! (-> gp-0 merc-ctrl-header) (-> arg0 header))
(set! (-> gp-0 name) (-> arg0 name))
(dotimes (v1-4 7)
(dotimes (a0-2 3)
(set! (-> (the-as
texture-mask
(+ (the-as uint (the-as texture-masks (+ (the-as uint (-> gp-0 texture-usage-group)) (* 48 v1-4))))
(* a0-2 16)
)
)
mask
quad
)
(the-as uint128 0)
)
)
)
)
#f
)
(defun texture-usage-update ((arg0 texture))
(local-vars (a3-3 uint128))
(let* ((v1-0 *texture-login-data*)
(a1-0 (-> v1-0 current-texture-index))
(v1-2 (-> v1-0 texture-usage-group data a1-0))
)
(dotimes (a1-3 3)
(let* ((a2-3 (-> v1-2 data a1-3))
(t1-0 (-> arg0 masks data a1-3))
(a3-2 (-> a2-3 mask quad))
(t0-0 (-> t1-0 mask quad))
(f0-0 (-> a2-3 dist))
(f1-0 (-> t1-0 dist))
)
(.por a3-3 a3-2 t0-0)
(let ((f0-1 (fmax f0-0 f1-0)))
(set! (-> a2-3 mask quad) a3-3)
(set! (-> a2-3 mask w) (the-as int f0-1))
)
)
)
)
#f
)
(defmethod asize-of merc-fragment ((obj merc-fragment))
(the-as int (* (-> obj header mm-quadword-size) 16))
)
(defmethod login-adgifs merc-fragment ((obj merc-fragment))
(let* ((s5-0 (merc-fragment-fp-data obj))
(v1-1 (-> *texture-login-data* merc-ctrl-header))
(s4-0 (if (nonzero? (-> v1-1 eye-ctrl))
(-> v1-1 eye-ctrl)
(the-as merc-eye-ctrl #f)
)
)
(s3-0 (the-as adgif-shader (&+ s5-0 16)))
)
(dotimes (s2-0 (the-as int (-> s5-0 shader-cnt)))
(cond
((and s4-0 (= (logand (the-as texture-id -256) (-> s3-0 texture-id)) #x70c00700))
(let ((v1-6 (/ (-> s4-0 eye-slot) 20))
(s1-0 (mod (-> s4-0 eye-slot) 20))
)
(cond
((< v1-6 3)
;; (adgif-shader-login s3-0)
;; (let ((v1-8 (get-eye-block s1-0 0)))
;; (set! (-> s3-0 tex0 tbp0) v1-8)
;; )
(set! (-> s3-0 tex0 tw) 5)
(set! (-> s3-0 tex0 th) 5)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 1)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f)
)
)
(else
;; (adgif-shader-login s3-0)
(let ((v1-34 (+ (-> *eyes-texture-base* vram-block) (* s1-0 32))))
(set! (-> s3-0 tex0 tbp0) v1-34)
)
(set! (-> s3-0 tex0 tw) 6)
(set! (-> s3-0 tex0 th) 6)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 2)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x3f :maxv #x3f)
)
)
)
)
)
((and s4-0 (= (logand (the-as texture-id -256) (-> s3-0 texture-id)) #x70c00800))
(let ((v1-61 (/ (-> s4-0 eye-slot) 20))
(s1-1 (mod (-> s4-0 eye-slot) 20))
)
(cond
((< v1-61 3)
;; (adgif-shader-login s3-0)
;; (let ((v1-63 (get-eye-block s1-1 1)))
;; (set! (-> s3-0 tex0 tbp0) v1-63)
;; )
(set! (-> s3-0 tex0 tw) 5)
(set! (-> s3-0 tex0 th) 5)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 1)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f)
)
)
(else
;; (adgif-shader-login s3-0)
(let ((v1-89 (+ (-> *eyes-texture-base* vram-block) (* (+ s1-1 1) 32))))
(set! (-> s3-0 tex0 tbp0) v1-89)
)
(set! (-> s3-0 tex0 tw) 6)
(set! (-> s3-0 tex0 th) 6)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 2)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x3f :maxv #x3f)
)
)
)
)
)
(else
;; (let ((a0-69 (adgif-shader-login s3-0)))
;; (if a0-69
;; (texture-usage-update a0-69)
;; )
;; )
)
)
(&+! s3-0 80)
)
)
obj
)
(defmethod asize-of merc-fragment-control ((obj merc-fragment-control))
(the-as int (+ (* (-> obj mat-xfer-count) 2) 4))
)
(defmethod login-adgifs merc-effect ((obj merc-effect))
(let* ((data *texture-login-data*)
(a0-1 (-> data default-texture-index))
)
(when (= (-> obj merc-effect-version) 1)
(if (!= (-> obj texture-index) 255)
(set! a0-1 (the-as int (-> obj texture-index)))
)
)
(set! (-> data current-texture-index) a0-1)
(set! (-> obj texture-index) (the-as uint a0-1))
)
(let ((tex (-> obj extra-info)))
(when (nonzero? tex)
(when (nonzero? (-> tex shader-offset))
;; (let ((a0-6 (adgif-shader-login (the-as adgif-shader (+ (the-as uint tex) (* (-> tex shader-offset) 16))))))
;; (if a0-6
;; (texture-usage-update a0-6)
;; )
;; )
)
)
)
(let ((ctrl (-> obj frag-ctrl))
(geo (-> obj frag-geo))
)
(dotimes (frag-idx (the-as int (-> obj frag-count)))
(let ((ctrl-size (asize-of ctrl)))
(let ((geo-size (asize-of geo)))
(login-adgifs geo)
(set! geo (the-as merc-fragment (&+ (the-as pointer geo) geo-size)))
)
(set! ctrl (the-as merc-fragment-control (&+ (the-as pointer ctrl) ctrl-size)))
)
)
)
(none)
)
;; definition for method 8 of type merc-ctrl
(defmethod mem-usage merc-ctrl ((obj merc-ctrl) (arg0 memory-usage-block) (arg1 int))
(if (-> obj extra)
(mem-usage (-> obj extra) arg0 arg1)
)
(let ((s4-0 (+ 32 128 (* (-> obj header effect-count) 32))))
(dotimes (s3-0 (the-as int (-> obj header effect-count)))
(let ((s2-0 (the-as object (-> obj effect s3-0 frag-ctrl))))
(dotimes (s1-0 (the-as int (-> obj effect s3-0 frag-count)))
(set! s4-0 (+ s4-0
(* (shr (+ (-> (the-as merc-fragment-control s2-0) unsigned-four-count) 3) 2) 16)
(* (shr (+ (-> (the-as merc-fragment-control s2-0) lump-four-count) 3) 2) 16)
(* (-> (the-as merc-fragment-control s2-0) fp-qwc) 16)
(asize-of (the-as merc-fragment-control s2-0))
)
)
(set! s2-0 (&+ (the-as pointer s2-0) (asize-of (the-as merc-fragment-control s2-0))))
)
)
)
(set! (-> arg0 length) (max 79 (-> arg0 length)))
(set! (-> arg0 data 78 name) "merc-ctrl")
(+! (-> arg0 data 78 count) 1)
(+! (-> arg0 data 78 used) s4-0)
(+! (-> arg0 data 78 total) (logand -16 (+ s4-0 15)))
)
(let ((v1-35 0))
(dotimes (a0-15 (the-as int (-> obj header effect-count)))
(when (nonzero? (-> obj effect a0-15 blend-frag-count))
(let ((a1-9 (the-as object (-> obj effect a0-15 blend-ctrl))))
(dotimes (a2-1 (the-as int (-> obj effect a0-15 blend-frag-count)))
(let ((v1-36
(+ v1-35
(* (+ (-> (the-as merc-blend-ctrl a1-9) nonzero-index-count) 1)
(the-as uint (logand (+ (* (the-as uint 6) (-> (the-as merc-blend-ctrl a1-9) blend-vtx-count)) 15) #xfff0))
)
)
)
)
(set! v1-35 (the-as int (+ (-> obj header blend-target-count) 2 v1-36)))
)
(set! a1-9 (&+ (the-as pointer a1-9) (+ (-> obj header blend-target-count) 2)))
)
)
)
)
(when (nonzero? v1-35)
(set! (-> arg0 length) (max 81 (-> arg0 length)))
(set! (-> arg0 data 80 name) "blend-shape")
(+! (-> arg0 data 80 count) 1)
(+! (-> arg0 data 80 used) v1-35)
(+! (-> arg0 data 80 total) (logand -16 (+ v1-35 15)))
)
)
(when (and (-> obj header eye-ctrl) (nonzero? (-> obj header eye-ctrl)))
(let ((a0-29 (-> obj header eye-ctrl)))
(set! (-> arg0 length) (max 112 (-> arg0 length)))
(set! (-> arg0 data 111 name) "eye-anim")
(+! (-> arg0 data 111 count) 1)
(let ((v1-49 (asize-of a0-29)))
(+! (-> arg0 data 111 used) v1-49)
(+! (-> arg0 data 111 total) (logand -16 (+ v1-49 15)))
)
)
)
obj
)
;; definition for method 9 of type merc-ctrl
(defmethod login merc-ctrl ((obj merc-ctrl))
(set! (-> *kernel-context* login-object) obj)
(texture-usage-init obj)
(dotimes (s5-0 (the-as int (-> obj header effect-count)))
(login-adgifs (-> obj effect s5-0))
)
(when (and (-> obj header eye-ctrl) (nonzero? (-> obj header eye-ctrl)))
(let ((s5-1 (-> obj header eye-ctrl)))
(dotimes (s4-0 (-> s5-1 shader-count))
;; (let ((a0-5 (adgif-shader-login (-> s5-1 shader s4-0))))
;; (if a0-5
;; (texture-usage-update a0-5)
;; )
;; )
)
)
)
(set! (-> *kernel-context* login-object) #f)
obj
)
(defun-debug merc-stats-display ((arg0 merc-ctrl))
"Print merc debug stats."
(format #t "~30s:" (-> arg0 name))
(let ((s5-0 (-> arg0 header st-int-scale))
(s4-0 (ash 1 (- 12 (the-as int (-> arg0 header st-int-scale)))))
)
(format #t " ST ~3D, " s4-0)
(cond
((>= s5-0 (the-as uint 5))
(format #t "RANGE ~D+," (/ 128 s4-0))
)
((= s5-0 4)
(format #t "RANGE 0.5+,")
)
)
)
(dotimes (s5-1 (the-as int (-> arg0 header effect-count)))
(let ((s3-0 (-> arg0 effect s5-1)))
(if (nonzero? s5-1)
(format #t "~48s " " ")
)
(let ((a2-4 (-> s3-0 frag-count))
(s4-1 (-> s3-0 tri-count))
(f30-0 (the float (-> s3-0 frag-count)))
(f28-0 (the float (-> s3-0 dvert-count)))
(f26-0 (the float (-> s3-0 tri-count)))
)
(if (>= (/ (+ 50.0 f28-0) f30-0) 50.0)
(format #t "~3D frags, ~2,,1f dverts/frag " a2-4 (/ f28-0 f30-0))
(format #t "~3D frags, ~2,,1f ******/**** " a2-4 (/ f28-0 f30-0))
)
(format
#t
"(~4D tris, striplen ~2,,2f, ~2,,1f tris/frag)~%"
s4-1
(/ (* 2.0 f26-0) (- f28-0 f26-0))
(/ f26-0 f30-0)
)
)
)
)
(none)
)
(defun-debug merc-stats ()
(dotimes (gp-0 7)
(let ((s5-0 (-> *level* level gp-0 art-group)))
(when (nonzero? s5-0)
(dotimes (s4-0 (-> s5-0 art-group-array length))
(let ((s3-0 (-> s5-0 art-group-array s4-0)))
(dotimes (s2-0 (-> s3-0 length))
(let* ((s1-0 (-> s3-0 data s2-0))
(a0-3 (if (type? s1-0 merc-ctrl)
s1-0
)
)
)
(if a0-3
(merc-stats-display (the-as merc-ctrl a0-3))
)
)
)
)
)
)
)
)
0
(none)
)
(defun-debug merc-edge-stats ()
(dotimes (gp-0 7)
(let ((s5-0 (-> *level* level gp-0 art-group)))
(when (nonzero? s5-0)
(dotimes (s4-0 (-> s5-0 art-group-array length))
(let ((s3-0 (-> s5-0 art-group-array s4-0)))
(dotimes (s2-0 (-> s3-0 length))
(let* ((s1-0 (-> s3-0 data s2-0))
(v1-9 (if (type? s1-0 merc-ctrl)
s1-0
)
)
)
(if v1-9
(format #t "~30s: ~f~%" (-> v1-9 name) (-> (the-as merc-ctrl v1-9) header longest-edge))
)
)
)
)
)
)
)
)
0
(none)
)
;; definition for function merc-vu1-add-vu-function
;; WARN: Return type mismatch dma-packet vs dma-gif-packet.
(defun merc-vu1-add-vu-function ((dma dma-packet) (func vu-function) (flush-mode int))
"Add VU1 function to DMA chain."
(let ((func-data (&-> func data 4))
(qwc (-> func qlength))
(dst (-> func origin))
)
(while (> qwc 0)
(let ((qwc-this-time (min 127 qwc)))
(set! (-> dma dma)
(new 'static 'dma-tag :id (dma-tag-id ref) :qwc qwc-this-time :addr (the-as int func-data))
)
(set! (-> dma vif0) (new 'static 'vif-tag :cmd (if (zero? flush-mode) 16 19)))
(set! (-> dma vif1) (new 'static 'vif-tag :cmd (vif-cmd mpg) :num (* qwc-this-time 2) :imm dst))
(&+! dma 16)
(&+! func-data (* qwc-this-time 16))
(set! qwc (- qwc qwc-this-time))
(+! dst (* qwc-this-time 2))
)
)
)
(the-as dma-gif-packet dma)
)
(defun merc-vu1-initialize-chain ((arg0 dma-gif-packet) (arg1 int))
"Init a merc DMA chain."
(let ((gp-0 (the-as object (merc-vu1-add-vu-function (the-as dma-packet arg0) merc-vu1-block 1))))
(set! (-> (the-as dma-gif-packet gp-0) dma-vif dma) (new 'static 'dma-tag :qwc #xa :id (dma-tag-id cnt)))
(set! (-> (the-as dma-gif-packet gp-0) dma-vif vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-gif-packet gp-0) dma-vif vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> (the-as (pointer vif-tag) gp-0) 4) (new 'static 'vif-tag :imm #x1ba :cmd (vif-cmd base)))
(set! (-> (the-as (pointer vif-tag) gp-0) 5) (new 'static 'vif-tag :imm #xfe46 :cmd (vif-cmd offset)))
(set! (-> (the-as (pointer vif-tag) gp-0) 6) (new 'static 'vif-tag))
(set! (-> (the-as (pointer vif-tag) gp-0) 7) (new 'static 'vif-tag :num #x8 :cmd (vif-cmd unpack-v4-32)))
(let ((s5-0 (the-as merc-vu1-low-mem (&+ (the-as dma-gif-packet gp-0) 32))))
(case *subdivide-foreground-draw-mode*
(((subdivide-setting textured))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x303e4000 32)) 32))
)
(((subdivide-setting outline))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x303d4000 32)) 32))
)
(((subdivide-setting gouraud))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x30364000 32)) 32))
)
(((subdivide-setting hack))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x303d4000 32)) 32))
)
)
(set! (-> s5-0 ad-gif tag) (new 'static 'gif-tag64 :nloop #x5 :nreg #x1))
(set! (-> s5-0 ad-gif regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
(set! (-> s5-0 hvdf-offset quad) (-> *math-camera* hvdf-off quad))
(quad-copy! (-> s5-0 perspective) (the-as pointer (-> *math-camera* perspective)) 4)
(set-vector! (-> s5-0 fog) (-> *math-camera* pfog0) (-> *math-camera* fog-min) (-> *math-camera* fog-max) 0.0)
)
(let ((v1-50 (-> (the-as (inline-array dma-packet) gp-0) 10)))
(set! (-> v1-50 dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> v1-50 vif0) (new 'static 'vif-tag))
(set! (-> v1-50 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #x0))
(&+ v1-50 16)
)
)
)
(defun merc-vu1-init-buffer ((dma-bucket bucket-id) (arg1 int) (arg2 symbol))
"Set up a merc DMA buffer."
(let ((bucket (-> *display* frames (-> *display* on-screen) bucket-group dma-bucket)))
(when (!= bucket (-> bucket last))
(let* ((dma-buf (-> *display* frames (-> *display* on-screen) global-buf))
(s3-1 (-> dma-buf base))
)
(set! (-> dma-buf base)
(the-as
pointer
(merc-vu1-initialize-chain (the-as dma-gif-packet (the-as dma-packet (-> dma-buf base))) arg1)
)
)
(let* ((v1-12 dma-buf)
(a0-4 (the-as dma-packet (-> v1-12 base)))
)
(set! (-> a0-4 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> a0-4 vif0) (new 'static 'vif-tag))
(set! (-> a0-4 vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-12 base) (the-as pointer (the-as dma-packet (&+ a0-4 16))))
)
(let* ((v1-13 dma-buf)
(a0-6 (the-as object (-> v1-13 base)))
)
(set! (-> (the-as gs-gif-tag a0-6) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-6) regs) (new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-13 base) (&+ (the-as pointer a0-6) 16))
)
(let* ((v1-14 dma-buf)
(a0-8 (-> v1-14 base))
)
(set! (-> (the-as (pointer gs-test) a0-8) 0) (new 'static 'gs-test
:ate #x1
:atst (gs-atest greater-equal)
:aref #x26
:zte #x1
:ztst (gs-ztest greater-equal)
)
)
(set! (-> (the-as (pointer gs-reg64) a0-8) 1) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-test) a0-8) 2) (if arg2
(the-as gs-test #x1000130)
(the-as gs-test (the-as uint #x101000130))
)
)
(set! (-> (the-as (pointer gs-test) a0-8) 3) (new 'static 'gs-test :atst (gs-atest not-equal) :aref #x4))
(set! (-> v1-14 base) (&+ a0-8 32))
)
(let ((v1-15 (the-as object (-> dma-buf base))))
(set! (-> (the-as dma-packet v1-15) dma) (new 'static 'dma-tag :id (dma-tag-id next) :addr (-> bucket next)))
(set! (-> (the-as dma-packet v1-15) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-15) vif1) (new 'static 'vif-tag))
(set! (-> dma-buf base) (the-as pointer (the-as dma-packet (&+ (the-as dma-packet v1-15) 16))))
)
(set! (-> bucket next) (the-as uint s3-1))
)
)
)
0
)
(defun merc-vu1-init-buffers ()
"Init merc DMA buffers."
(when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask merc))
(merc-vu1-init-buffer (bucket-id bucket-14) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-25) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-36) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-47) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-58) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-69) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-188) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-197) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-201) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-205) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-209) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-213) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-217) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-221) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-79) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-88) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-97) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-106) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-115) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-124) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-192) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-131) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-141) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-151) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-161) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-171) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-181) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-225) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-229) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-233) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-237) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-241) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-245) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-249) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-253) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-262) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-271) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-280) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-289) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-298) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-307) 1 #f)
)
0
(none)
)
+2 -2
View File
@@ -382,8 +382,8 @@
(rn10)
(rn11)
(rn12)
(rn13)
(rn14)
(merc)
(emerc)
(rn15)
(rn16)
(rn17)
+4 -4
View File
@@ -153,8 +153,8 @@
rn10
rn11
rn12
rn13
rn14
merc
emerc
rn15
rn16
rn17
@@ -187,8 +187,8 @@
rn10
rn11
rn12
rn13
rn14
merc
emerc
rn15
rn16
rn17
+1 -1
View File
@@ -114,7 +114,7 @@
;; definition for function emerc-vu1-init-buffers
;; WARN: Return type mismatch int vs none.
(defun emerc-vu1-init-buffers ()
(when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask rn14))
(when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask emerc))
(emerc-vu1-init-buffer (bucket-id bucket-15) (new 'static 'gs-test :zte #x1 :ztst (gs-ztest greater-equal)) 0)
(emerc-vu1-init-buffer (bucket-id bucket-26) (new 'static 'gs-test :zte #x1 :ztst (gs-ztest greater-equal)) 0)
(emerc-vu1-init-buffer (bucket-id bucket-37) (new 'static 'gs-test :zte #x1 :ztst (gs-ztest greater-equal)) 0)
+3 -1
View File
@@ -91,7 +91,7 @@
:size-assert #x18
:flag-assert #xa00000018
(:methods
(login-adgifs (_type_) none 9)
(login-adgifs (_type_) merc-fragment 9)
)
)
@@ -228,6 +228,7 @@
)
;; definition for method 3 of type merc-fragment-control
;; INFO: this function exists in multiple non-identical object files
(defmethod inspect merc-fragment-control ((obj merc-fragment-control))
(when (not obj)
(set! obj obj)
@@ -696,6 +697,7 @@
)
;; definition for method 3 of type merc-ctrl
;; INFO: this function exists in multiple non-identical object files
(defmethod inspect merc-ctrl ((obj merc-ctrl))
(when (not obj)
(set! obj obj)
+9
View File
@@ -0,0 +1,9 @@
;;-*-Lisp-*-
(in-package goal)
;; definition for symbol merc-vu1-block, type vu-function
(define merc-vu1-block (new 'static 'vu-function :length #x7e5 :qlength #x3f3))
+713
View File
@@ -0,0 +1,713 @@
;;-*-Lisp-*-
(in-package goal)
;; definition of type texture-login-data
(deftype texture-login-data (structure)
((default-texture-index int32 :offset-assert 0)
(current-texture-index int32 :offset-assert 4)
(texture-usage-group texture-usage-group :offset-assert 8)
(merc-ctrl-header merc-ctrl-header :offset-assert 12)
(name basic :offset-assert 16)
)
:method-count-assert 9
:size-assert #x14
:flag-assert #x900000014
)
;; definition for method 3 of type texture-login-data
(defmethod inspect texture-login-data ((obj texture-login-data))
(when (not obj)
(set! obj obj)
(goto cfg-4)
)
(format #t "[~8x] ~A~%" obj 'texture-login-data)
(format #t "~1Tdefault-texture-index: ~D~%" (-> obj default-texture-index))
(format #t "~1Tcurrent-texture-index: ~D~%" (-> obj current-texture-index))
(format #t "~1Ttexture-usage-group: #<texture-usage-group @ #x~X>~%" (-> obj texture-usage-group))
(format #t "~1Tmerc-ctrl-header: #<merc-ctrl-header @ #x~X>~%" (-> obj merc-ctrl-header))
(format #t "~1Tname: ~A~%" (-> obj name))
(label cfg-4)
obj
)
;; definition for symbol *texture-login-data*, type texture-login-data
(define *texture-login-data* (new 'global 'texture-login-data))
;; definition for method 9 of type art-joint-geo
(defmethod login art-joint-geo ((obj art-joint-geo))
(let ((s5-0 *texture-login-data*))
(set! (-> s5-0 default-texture-index)
(res-lump-value (-> obj extra) 'texture-bucket int :default (the-as uint128 1) :time -1000000000.0)
)
)
obj
)
;; definition for function texture-usage-init
;; INFO: Used lq/sq
(defun texture-usage-init ((arg0 merc-ctrl))
(let ((gp-0 *texture-login-data*))
(set! (-> arg0 header texture-usage-group) (new 'loading-level 'texture-usage-group))
(set! (-> gp-0 texture-usage-group) (-> arg0 header texture-usage-group))
(set! (-> gp-0 merc-ctrl-header) (-> arg0 header))
(set! (-> gp-0 name) (-> arg0 name))
(dotimes (v1-4 7)
(dotimes (a0-2 3)
(set! (-> (the-as
texture-mask
(+ (the-as uint (the-as texture-masks (+ (the-as uint (-> gp-0 texture-usage-group)) (* 48 v1-4))))
(* a0-2 16)
)
)
mask
quad
)
(the-as uint128 0)
)
)
)
)
#f
)
;; definition for function texture-usage-update
;; INFO: Used lq/sq
(defun texture-usage-update ((arg0 texture))
(local-vars (a3-3 uint128))
(let* ((v1-0 *texture-login-data*)
(a1-0 (-> v1-0 current-texture-index))
(v1-2 (-> v1-0 texture-usage-group data a1-0))
)
(dotimes (a1-3 3)
(let* ((a2-3 (-> v1-2 data a1-3))
(t1-0 (-> arg0 masks data a1-3))
(a3-2 (-> a2-3 mask quad))
(t0-0 (-> t1-0 mask quad))
(f0-0 (-> a2-3 dist))
(f1-0 (-> t1-0 dist))
)
(.por a3-3 a3-2 t0-0)
(let ((f0-1 (fmax f0-0 f1-0)))
(set! (-> a2-3 mask quad) a3-3)
(set! (-> a2-3 mask w) (the-as int f0-1))
)
)
)
)
#f
)
;; definition for method 5 of type merc-fragment
;; WARN: Return type mismatch uint vs int.
(defmethod asize-of merc-fragment ((obj merc-fragment))
(the-as int (* (-> obj header mm-quadword-size) 16))
)
;; definition for method 9 of type merc-fragment
(defmethod login-adgifs merc-fragment ((obj merc-fragment))
(let* ((s5-0 (merc-fragment-fp-data obj))
(v1-1 (-> *texture-login-data* merc-ctrl-header))
(s4-0 (if (nonzero? (-> v1-1 eye-ctrl))
(-> v1-1 eye-ctrl)
(the-as merc-eye-ctrl #f)
)
)
(s3-0 (the-as adgif-shader (&+ s5-0 16)))
)
(dotimes (s2-0 (the-as int (-> s5-0 shader-cnt)))
(cond
((and s4-0 (= (logand (the-as texture-id -256) (-> s3-0 texture-id)) #x70c00700))
(let ((v1-6 (/ (-> s4-0 eye-slot) 20))
(s1-0 (mod (-> s4-0 eye-slot) 20))
)
(cond
((< v1-6 3)
(adgif-shader-login s3-0)
(let ((v1-8 (get-eye-block s1-0 0)))
(set! (-> s3-0 tex0 tbp0) v1-8)
)
(set! (-> s3-0 tex0 tw) 5)
(set! (-> s3-0 tex0 th) 5)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 1)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f)
)
)
(else
(adgif-shader-login s3-0)
(let ((v1-34 (+ (-> *eyes-texture-base* vram-block) (* s1-0 32))))
(set! (-> s3-0 tex0 tbp0) v1-34)
)
(set! (-> s3-0 tex0 tw) 6)
(set! (-> s3-0 tex0 th) 6)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 2)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x3f :maxv #x3f)
)
)
)
)
)
((and s4-0 (= (logand (the-as texture-id -256) (-> s3-0 texture-id)) #x70c00800))
(let ((v1-61 (/ (-> s4-0 eye-slot) 20))
(s1-1 (mod (-> s4-0 eye-slot) 20))
)
(cond
((< v1-61 3)
(adgif-shader-login s3-0)
(let ((v1-63 (get-eye-block s1-1 1)))
(set! (-> s3-0 tex0 tbp0) v1-63)
)
(set! (-> s3-0 tex0 tw) 5)
(set! (-> s3-0 tex0 th) 5)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 1)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x1f :maxv #x1f)
)
)
(else
(adgif-shader-login s3-0)
(let ((v1-89 (+ (-> *eyes-texture-base* vram-block) (* (+ s1-1 1) 32))))
(set! (-> s3-0 tex0 tbp0) v1-89)
)
(set! (-> s3-0 tex0 tw) 6)
(set! (-> s3-0 tex0 th) 6)
(set! (-> s3-0 tex0 tcc) 1)
(set! (-> s3-0 tex0 tbw) 2)
(set! (-> s3-0 tex0 psm) 0)
(set! (-> s3-0 tex1 mxl) 0)
(set! (-> s3-0 clamp)
(new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp) :maxu #x3f :maxv #x3f)
)
)
)
)
)
(else
(let ((a0-69 (adgif-shader-login s3-0)))
(if a0-69
(texture-usage-update a0-69)
)
)
)
)
(&+! s3-0 80)
)
)
obj
)
;; definition for method 5 of type merc-fragment-control
;; WARN: Return type mismatch uint vs int.
(defmethod asize-of merc-fragment-control ((obj merc-fragment-control))
(the-as int (+ (* (-> obj mat-xfer-count) 2) 4))
)
;; definition for method 3 of type merc-fragment-control
;; INFO: this function exists in multiple non-identical object files
(defmethod inspect merc-fragment-control ((obj merc-fragment-control))
(format #t "[~8x] ~A~%" obj 'merc-fragment-control)
(format #t "~Tunsigned-four-count: ~D~%" (-> obj unsigned-four-count))
(format #t "~Tlump-four-count: ~D~%" (-> obj lump-four-count))
(format #t "~Tfp-qwc: ~D~%" (-> obj fp-qwc))
(format #t "~Tmat-xfer-count: ~D~%" (-> obj mat-xfer-count))
(dotimes (s5-0 (the-as int (-> obj mat-xfer-count)))
(format #t "~Tmat-dest-data[~d]:~%" s5-0)
(format #t "~T~Tmatrix-number: ~D~%" (-> obj mat-dest-data s5-0 matrix-number))
(format #t "~T~Tmatrix-dest: ~D~%" (-> obj mat-dest-data s5-0 matrix-dest))
)
obj
)
;; definition for method 9 of type merc-effect
;; WARN: Return type mismatch merc-effect vs none.
(defmethod login-adgifs merc-effect ((obj merc-effect))
(let* ((data *texture-login-data*)
(a0-1 (-> data default-texture-index))
)
(when (= (-> obj merc-effect-version) 1)
(if (!= (-> obj texture-index) 255)
(set! a0-1 (the-as int (-> obj texture-index)))
)
)
(set! (-> data current-texture-index) a0-1)
(set! (-> obj texture-index) (the-as uint a0-1))
)
(let ((tex (-> obj extra-info)))
(when (nonzero? tex)
(when (nonzero? (-> tex shader-offset))
(let ((a0-6 (adgif-shader-login (the-as adgif-shader (+ (the-as uint tex) (* (-> tex shader-offset) 16))))))
(if a0-6
(texture-usage-update a0-6)
)
)
)
)
)
(let ((ctrl (-> obj frag-ctrl))
(geo (-> obj frag-geo))
)
(dotimes (frag-idx (the-as int (-> obj frag-count)))
(let ((ctrl-size (asize-of ctrl)))
(let ((geo-size (asize-of geo)))
(login-adgifs geo)
(set! geo (the-as merc-fragment (&+ (the-as pointer geo) geo-size)))
)
(set! ctrl (the-as merc-fragment-control (&+ (the-as pointer ctrl) ctrl-size)))
)
)
)
(none)
)
;; definition for method 3 of type merc-ctrl
;; INFO: this function exists in multiple non-identical object files
(defmethod inspect merc-ctrl ((obj merc-ctrl))
(format #t "[~8x] ~A~%" obj (-> obj type))
(format #t "~Tname: ~A~%" (-> obj name))
(format #t "~Tlength: ~D~%" (-> obj length))
(format #t "~Tnum-joints: ~D~%" (-> obj num-joints))
(format #t "~Textra: ~A~%" (-> obj extra))
(format #t "~Tseg-table: ~A~%" (-> obj seg-table))
(inspect (-> obj header))
(dotimes (s5-0 (the-as int (-> obj header effect-count)))
(inspect (-> obj effect s5-0))
)
obj
)
;; definition for method 8 of type merc-ctrl
(defmethod mem-usage merc-ctrl ((obj merc-ctrl) (arg0 memory-usage-block) (arg1 int))
(if (-> obj extra)
(mem-usage (-> obj extra) arg0 arg1)
)
(let ((s4-0 (+ 32 128 (* (-> obj header effect-count) 32))))
(dotimes (s3-0 (the-as int (-> obj header effect-count)))
(let ((s2-0 (the-as object (-> obj effect s3-0 frag-ctrl))))
(dotimes (s1-0 (the-as int (-> obj effect s3-0 frag-count)))
(set! s4-0 (+ s4-0
(* (shr (+ (-> (the-as merc-fragment-control s2-0) unsigned-four-count) 3) 2) 16)
(* (shr (+ (-> (the-as merc-fragment-control s2-0) lump-four-count) 3) 2) 16)
(* (-> (the-as merc-fragment-control s2-0) fp-qwc) 16)
(asize-of (the-as merc-fragment-control s2-0))
)
)
(set! s2-0 (&+ (the-as pointer s2-0) (asize-of (the-as merc-fragment-control s2-0))))
)
)
)
(set! (-> arg0 length) (max 79 (-> arg0 length)))
(set! (-> arg0 data 78 name) "merc-ctrl")
(+! (-> arg0 data 78 count) 1)
(+! (-> arg0 data 78 used) s4-0)
(+! (-> arg0 data 78 total) (logand -16 (+ s4-0 15)))
)
(let ((v1-35 0))
(dotimes (a0-15 (the-as int (-> obj header effect-count)))
(when (nonzero? (-> obj effect a0-15 blend-frag-count))
(let ((a1-9 (the-as object (-> obj effect a0-15 blend-ctrl))))
(dotimes (a2-1 (the-as int (-> obj effect a0-15 blend-frag-count)))
(let ((v1-36
(+ v1-35
(* (+ (-> (the-as merc-blend-ctrl a1-9) nonzero-index-count) 1)
(the-as uint (logand (+ (* (the-as uint 6) (-> (the-as merc-blend-ctrl a1-9) blend-vtx-count)) 15) #xfff0))
)
)
)
)
(set! v1-35 (the-as int (+ (-> obj header blend-target-count) 2 v1-36)))
)
(set! a1-9 (&+ (the-as pointer a1-9) (+ (-> obj header blend-target-count) 2)))
)
)
)
)
(when (nonzero? v1-35)
(set! (-> arg0 length) (max 81 (-> arg0 length)))
(set! (-> arg0 data 80 name) "blend-shape")
(+! (-> arg0 data 80 count) 1)
(+! (-> arg0 data 80 used) v1-35)
(+! (-> arg0 data 80 total) (logand -16 (+ v1-35 15)))
)
)
(when (and (-> obj header eye-ctrl) (nonzero? (-> obj header eye-ctrl)))
(let ((a0-29 (-> obj header eye-ctrl)))
(set! (-> arg0 length) (max 112 (-> arg0 length)))
(set! (-> arg0 data 111 name) "eye-anim")
(+! (-> arg0 data 111 count) 1)
(let ((v1-49 (asize-of a0-29)))
(+! (-> arg0 data 111 used) v1-49)
(+! (-> arg0 data 111 total) (logand -16 (+ v1-49 15)))
)
)
)
obj
)
;; definition for method 9 of type merc-ctrl
(defmethod login merc-ctrl ((obj merc-ctrl))
(set! (-> *kernel-context* login-object) obj)
(texture-usage-init obj)
(dotimes (s5-0 (the-as int (-> obj header effect-count)))
(login-adgifs (-> obj effect s5-0))
)
(when (and (-> obj header eye-ctrl) (nonzero? (-> obj header eye-ctrl)))
(let ((s5-1 (-> obj header eye-ctrl)))
(dotimes (s4-0 (-> s5-1 shader-count))
(let ((a0-5 (adgif-shader-login (-> s5-1 shader s4-0))))
(if a0-5
(texture-usage-update a0-5)
)
)
)
)
)
(set! (-> *kernel-context* login-object) #f)
obj
)
;; definition (debug) for function merc-stats-display
;; WARN: Return type mismatch symbol vs none.
(defun-debug merc-stats-display ((arg0 merc-ctrl))
(format #t "~30s:" (-> arg0 name))
(let ((s5-0 (-> arg0 header st-int-scale))
(s4-0 (ash 1 (- 12 (the-as int (-> arg0 header st-int-scale)))))
)
(format #t " ST ~3D, " s4-0)
(cond
((>= s5-0 (the-as uint 5))
(format #t "RANGE ~D+," (/ 128 s4-0))
)
((= s5-0 4)
(format #t "RANGE 0.5+,")
)
)
)
(dotimes (s5-1 (the-as int (-> arg0 header effect-count)))
(let ((s3-0 (-> arg0 effect s5-1)))
(if (nonzero? s5-1)
(format #t "~48s " " ")
)
(let ((a2-4 (-> s3-0 frag-count))
(s4-1 (-> s3-0 tri-count))
(f30-0 (the float (-> s3-0 frag-count)))
(f28-0 (the float (-> s3-0 dvert-count)))
(f26-0 (the float (-> s3-0 tri-count)))
)
(if (>= (/ (+ 50.0 f28-0) f30-0) 50.0)
(format #t "~3D frags, ~2,,1f dverts/frag " a2-4 (/ f28-0 f30-0))
(format #t "~3D frags, ~2,,1f ******/**** " a2-4 (/ f28-0 f30-0))
)
(format
#t
"(~4D tris, striplen ~2,,2f, ~2,,1f tris/frag)~%"
s4-1
(/ (* 2.0 f26-0) (- f28-0 f26-0))
(/ f26-0 f30-0)
)
)
)
)
(none)
)
;; definition (debug) for function merc-stats
;; WARN: Return type mismatch int vs none.
(defun-debug merc-stats ()
(dotimes (gp-0 7)
(let ((s5-0 (-> *level* level gp-0 art-group)))
(when (nonzero? s5-0)
(dotimes (s4-0 (-> s5-0 art-group-array length))
(let ((s3-0 (-> s5-0 art-group-array s4-0)))
(dotimes (s2-0 (-> s3-0 length))
(let* ((s1-0 (-> s3-0 data s2-0))
(a0-3 (if (type? s1-0 merc-ctrl)
s1-0
)
)
)
(if a0-3
(merc-stats-display (the-as merc-ctrl a0-3))
)
)
)
)
)
)
)
)
0
(none)
)
;; definition (debug) for function merc-edge-stats
;; WARN: Return type mismatch int vs none.
(defun-debug merc-edge-stats ()
(dotimes (gp-0 7)
(let ((s5-0 (-> *level* level gp-0 art-group)))
(when (nonzero? s5-0)
(dotimes (s4-0 (-> s5-0 art-group-array length))
(let ((s3-0 (-> s5-0 art-group-array s4-0)))
(dotimes (s2-0 (-> s3-0 length))
(let* ((s1-0 (-> s3-0 data s2-0))
(v1-9 (if (type? s1-0 merc-ctrl)
s1-0
)
)
)
(if v1-9
(format #t "~30s: ~f~%" (-> v1-9 name) (-> (the-as merc-ctrl v1-9) header longest-edge))
)
)
)
)
)
)
)
)
0
(none)
)
;; definition for function merc-vu1-add-vu-function
;; WARN: Return type mismatch dma-packet vs dma-gif-packet.
(defun merc-vu1-add-vu-function ((dma dma-packet) (func vu-function) (flush-mode int))
(let ((func-data (&-> func data 4))
(qwc (-> func qlength))
(dst (-> func origin))
)
(while (> qwc 0)
(let ((qwc-this-time (min 127 qwc)))
(set! (-> dma dma)
(new 'static 'dma-tag :id (dma-tag-id ref) :qwc qwc-this-time :addr (the-as int func-data))
)
(set! (-> dma vif0) (new 'static 'vif-tag :cmd (if (zero? flush-mode) 16 19)))
(set! (-> dma vif1) (new 'static 'vif-tag :cmd (vif-cmd mpg) :num (* qwc-this-time 2) :imm dst))
(&+! dma 16)
(&+! func-data (* qwc-this-time 16))
(set! qwc (- qwc qwc-this-time))
(+! dst (* qwc-this-time 2))
)
)
)
(the-as dma-gif-packet dma)
)
;; definition for function merc-vu1-initialize-chain
;; INFO: Used lq/sq
(defun merc-vu1-initialize-chain ((arg0 dma-gif-packet) (arg1 int))
(let ((gp-0 (the-as object (merc-vu1-add-vu-function (the-as dma-packet arg0) merc-vu1-block 1))))
(set! (-> (the-as dma-gif-packet gp-0) dma-vif dma) (new 'static 'dma-tag :qwc #xa :id (dma-tag-id cnt)))
(set! (-> (the-as dma-gif-packet gp-0) dma-vif vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-gif-packet gp-0) dma-vif vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> (the-as (pointer vif-tag) gp-0) 4) (new 'static 'vif-tag :imm #x1ba :cmd (vif-cmd base)))
(set! (-> (the-as (pointer vif-tag) gp-0) 5) (new 'static 'vif-tag :imm #xfe46 :cmd (vif-cmd offset)))
(set! (-> (the-as (pointer vif-tag) gp-0) 6) (new 'static 'vif-tag))
(set! (-> (the-as (pointer vif-tag) gp-0) 7) (new 'static 'vif-tag :num #x8 :cmd (vif-cmd unpack-v4-32)))
(let ((s5-0 (the-as merc-vu1-low-mem (&+ (the-as dma-gif-packet gp-0) 32))))
(case *subdivide-foreground-draw-mode*
(((subdivide-setting textured))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x303e4000 32)) 32))
)
(((subdivide-setting outline))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x303d4000 32)) 32))
)
(((subdivide-setting gouraud))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x30364000 32)) 32))
)
(((subdivide-setting hack))
(set! (-> s5-0 tri-strip-gif tag)
(new 'static 'gif-tag64
:pre #x1
:nreg #x3
:prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe arg1)
)
)
(set! (-> s5-0 tri-strip-gif regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
)
(set! (-> s5-0 tri-strip-gif word 3) (shr (make-u128 0 (shl #x303d4000 32)) 32))
)
)
(set! (-> s5-0 ad-gif tag) (new 'static 'gif-tag64 :nloop #x5 :nreg #x1))
(set! (-> s5-0 ad-gif regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
(set! (-> s5-0 hvdf-offset quad) (-> *math-camera* hvdf-off quad))
(quad-copy! (-> s5-0 perspective) (the-as pointer (-> *math-camera* perspective)) 4)
(set-vector! (-> s5-0 fog) (-> *math-camera* pfog0) (-> *math-camera* fog-min) (-> *math-camera* fog-max) 0.0)
)
(let ((v1-50 (-> (the-as (inline-array dma-packet) gp-0) 10)))
(set! (-> v1-50 dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> v1-50 vif0) (new 'static 'vif-tag))
(set! (-> v1-50 vif1) (new 'static 'vif-tag :cmd (vif-cmd mscal) :msk #x1 :imm #x0))
(&+ v1-50 16)
)
)
)
;; definition for function merc-vu1-init-buffer
(defun merc-vu1-init-buffer ((dma-bucket bucket-id) (arg1 int) (arg2 symbol))
(let ((bucket (-> *display* frames (-> *display* on-screen) bucket-group dma-bucket)))
(when (!= bucket (-> bucket last))
(let* ((dma-buf (-> *display* frames (-> *display* on-screen) global-buf))
(s3-1 (-> dma-buf base))
)
(set! (-> dma-buf base)
(the-as
pointer
(merc-vu1-initialize-chain (the-as dma-gif-packet (the-as dma-packet (-> dma-buf base))) arg1)
)
)
(let* ((v1-12 dma-buf)
(a0-4 (the-as dma-packet (-> v1-12 base)))
)
(set! (-> a0-4 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> a0-4 vif0) (new 'static 'vif-tag))
(set! (-> a0-4 vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-12 base) (the-as pointer (the-as dma-packet (&+ a0-4 16))))
)
(let* ((v1-13 dma-buf)
(a0-6 (the-as object (-> v1-13 base)))
)
(set! (-> (the-as gs-gif-tag a0-6) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-6) regs) (new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-13 base) (&+ (the-as pointer a0-6) 16))
)
(let* ((v1-14 dma-buf)
(a0-8 (-> v1-14 base))
)
(set! (-> (the-as (pointer gs-test) a0-8) 0) (new 'static 'gs-test
:ate #x1
:atst (gs-atest greater-equal)
:aref #x26
:zte #x1
:ztst (gs-ztest greater-equal)
)
)
(set! (-> (the-as (pointer gs-reg64) a0-8) 1) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-test) a0-8) 2) (if arg2
(the-as gs-test #x1000130)
(the-as gs-test (the-as uint #x101000130))
)
)
(set! (-> (the-as (pointer gs-test) a0-8) 3) (new 'static 'gs-test :atst (gs-atest not-equal) :aref #x4))
(set! (-> v1-14 base) (&+ a0-8 32))
)
(let ((v1-15 (the-as object (-> dma-buf base))))
(set! (-> (the-as dma-packet v1-15) dma) (new 'static 'dma-tag :id (dma-tag-id next) :addr (-> bucket next)))
(set! (-> (the-as dma-packet v1-15) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-15) vif1) (new 'static 'vif-tag))
(set! (-> dma-buf base) (the-as pointer (the-as dma-packet (&+ (the-as dma-packet v1-15) 16))))
)
(set! (-> bucket next) (the-as uint s3-1))
)
)
)
0
)
;; definition for function merc-vu1-init-buffers
;; WARN: Return type mismatch int vs none.
(defun merc-vu1-init-buffers ()
(when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask merc))
(merc-vu1-init-buffer (bucket-id bucket-14) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-25) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-36) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-47) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-58) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-69) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-188) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-197) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-201) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-205) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-209) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-213) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-217) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-221) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-79) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-88) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-97) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-106) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-115) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-124) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-192) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-131) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-141) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-151) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-161) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-171) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-181) 1 #t)
(merc-vu1-init-buffer (bucket-id bucket-225) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-229) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-233) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-237) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-241) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-245) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-249) 0 #t)
(merc-vu1-init-buffer (bucket-id bucket-253) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-262) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-271) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-280) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-289) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-298) 1 #f)
(merc-vu1-init-buffer (bucket-id bucket-307) 1 #f)
)
0
(none)
)
+7
View File
@@ -30,6 +30,13 @@ std::string get_expected(const std::string& name) {
}
} // namespace
TEST(VuDisasm, Merc_Jak2) {
auto data = get_test_data("jak2/merc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(disasm.to_string(prog), get_expected("jak2/merc-vu1"));
}
TEST(VuDisasm, Emerc) {
auto data = get_test_data("jak2/emerc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff