mirror of
https://github.com/open-goal/jak-project
synced 2026-06-05 03:08:40 -04:00
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:
@@ -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)
|
||||
|
||||
@@ -165,5 +165,6 @@
|
||||
["L480", "vector"],
|
||||
["L479", "vector"],
|
||||
["L474", "vector"]
|
||||
]
|
||||
],
|
||||
"merc-vu1": [["L1", "vu-function"]]
|
||||
}
|
||||
|
||||
@@ -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": []
|
||||
}
|
||||
|
||||
@@ -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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -382,8 +382,8 @@
|
||||
(rn10)
|
||||
(rn11)
|
||||
(rn12)
|
||||
(rn13)
|
||||
(rn14)
|
||||
(merc)
|
||||
(emerc)
|
||||
(rn15)
|
||||
(rn16)
|
||||
(rn17)
|
||||
|
||||
+4
-4
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
)
|
||||
@@ -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
Reference in New Issue
Block a user