From eebbe00ce47580721c82080df5cae65cedda3376 Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Sat, 19 Feb 2022 19:12:44 +0100 Subject: [PATCH] decomp: `generic-merc` | `generic-vu0` | `generic-vu1` | `shadow-vu1` (#1184) --- decompiler/config/all-types.gc | 88 +++--- .../config/jak1_ntsc_black_label/hacks.jsonc | 3 +- .../jak1_ntsc_black_label/label_types.jsonc | 24 ++ .../jak1_ntsc_black_label/type_casts.jsonc | 40 +++ goal_src/engine/gfx/generic/generic-merc.gc | 57 ++++ goal_src/engine/gfx/generic/generic-vu0.gc | 1 + goal_src/engine/gfx/generic/generic-vu1.gc | 166 ++++++++++++ goal_src/engine/gfx/shadow/shadow-cpu-h.gc | 2 +- goal_src/engine/gfx/shadow/shadow-vu1.gc | 236 ++++++++++++++++ .../engine/gfx/generic/generic-merc_REF.gc | 75 ++++++ .../engine/gfx/generic/generic-vu0_REF.gc | 9 + .../engine/gfx/generic/generic-vu1_REF.gc | 178 ++++++++++++ .../engine/gfx/shadow/shadow-vu1_REF.gc | 253 ++++++++++++++++++ 13 files changed, 1086 insertions(+), 46 deletions(-) create mode 100644 test/decompiler/reference/engine/gfx/generic/generic-merc_REF.gc create mode 100644 test/decompiler/reference/engine/gfx/generic/generic-vu0_REF.gc create mode 100644 test/decompiler/reference/engine/gfx/generic/generic-vu1_REF.gc create mode 100644 test/decompiler/reference/engine/gfx/shadow/shadow-vu1_REF.gc diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index f76354b41c..80ce5656b0 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -4502,7 +4502,7 @@ ) (deftype gs-gif-tag (structure) - ((qword uint128 :offset-assert 0) ;; is "qword" and inline? in game + ((qword uint128 :offset-assert 0 :score -1) ;; is "qword" and inline? in game (tag gif-tag64 :offset 0) (regs gif-tag-regs :offset 8) @@ -9053,7 +9053,7 @@ (deftype shadow-data (structure) ((texoffset vector :inline :offset-assert 0) (texscale vector :inline :offset-assert 16) - (clrs uint128 2 :offset-assert 32) + (clrs vector 2 :inline :offset-assert 32) (dma-unpack-template dma-packet :inline :offset-assert 64) (dma-cnt uint64 :offset-assert 80) (vif-nop uint32 :offset-assert 88) @@ -16656,7 +16656,7 @@ ;; - Unknowns -;;(define-extern generic-vu0-block object) ;; unknown type +(define-extern generic-vu0-block vu-function) ;; unknown type ;; ---------------------- @@ -16687,7 +16687,7 @@ (define-extern generic-add-constants (function dma-buffer int none)) (define-extern generic-setup-constants (function generic-constants int none)) -(define-extern generic-reset-buffers function) +(define-extern generic-reset-buffers (function dma-buffer int int none)) ;; - Unknowns @@ -16734,8 +16734,8 @@ ;; - Unknowns -;;(define-extern *generic-consts* object) ;; unknown type -;;(define-extern *target-lock* object) ;; unknown type +(define-extern *generic-consts* generic-consts) ;; unknown type +(define-extern *target-lock* symbol) ;; unknown type ;; ---------------------- @@ -16765,13 +16765,13 @@ (define-extern mercneric-convert function) (define-extern high-speed-reject function) (define-extern generic-merc-execute-asm function) -(define-extern generic-merc-add-to-cue (function uint none)) +(define-extern generic-merc-add-to-cue (function basic none)) (define-extern generic-merc-execute-all (function none)) ;; - Unknowns -;;(define-extern mercneric-vu0-block object) ;; unknown type -;;(define-extern *inv-init-table* object) ;; unknown type +(define-extern mercneric-vu0-block vu-function) ;; unknown type +(define-extern *inv-init-table* (inline-array invinitdata)) ;; unknown type ;; ---------------------- @@ -16794,7 +16794,7 @@ ;; - Unknowns -;;(define-extern *generic-tie* object) ;; unknown type +(define-extern *generic-tie* symbol) ;; unknown type ;; ---------------------- @@ -16846,10 +16846,10 @@ ;; - Functions (define-extern shadow-vu0-upload function) -(define-extern shadow-vu1-init-buffer function) (define-extern shadow-dma-init function) (define-extern shadow-execute function) (define-extern shadow-dma-end function) +(define-extern shadow-vu1-init-buffer (function dma-buffer none)) (define-extern shadow-xform-verts function) (define-extern shadow-calc-dual-verts function) (define-extern shadow-scissor-edges function) @@ -16872,7 +16872,7 @@ ;; - Unknowns -;;(define-extern shadow-vu0-block object) ;; unknown type +(define-extern shadow-vu0-block vu-function) ;; unknown type ;; ---------------------- @@ -16883,46 +16883,46 @@ ;; - Types -; (deftype shadow-vu1-constants (structure) -; ((hmgescale vector :inline :offset-assert 0) -; (invhscale vector :inline :offset-assert 16) -; (texoffset vector :inline :offset-assert 32) -; (texscale vector :inline :offset-assert 48) -; (hvdfoff vector :inline :offset-assert 64) -; (fog vector :inline :offset-assert 80) -; (clrs UNKNOWN 2 :offset-assert 96) -; (adgif gs-gif-tag :inline :offset-assert 128) -; (texflush ad-cmd :inline :offset-assert 144) -; (flush ad-cmd :inline :offset-assert 160) -; (trigif gs-gif-tag :inline :offset-assert 176) -; (quadgif gs-gif-tag :inline :offset-assert 192) -; ) -; :method-count-assert 9 -; :size-assert #xd0 -; :flag-assert #x9000000d0 -; ) + (deftype shadow-vu1-constants (structure) + ((hmgescale vector :inline :offset-assert 0) + (invhscale vector :inline :offset-assert 16) + (texoffset vector :inline :offset-assert 32) + (texscale vector :inline :offset-assert 48) + (hvdfoff vector :inline :offset-assert 64) + (fog vector :inline :offset-assert 80) + (clrs vector 2 :inline :offset-assert 96) + (adgif gs-gif-tag :inline :offset-assert 128) + (texflush ad-cmd :inline :offset-assert 144) + (flush ad-cmd :inline :offset-assert 160) + (trigif gs-gif-tag :inline :offset-assert 176) + (quadgif gs-gif-tag :inline :offset-assert 192) + ) + :method-count-assert 9 + :size-assert #xd0 + :flag-assert #x9000000d0 + ) -; (deftype shadow-vu1-gifbuf-template (structure) -; ((adgif gs-gif-tag :inline :offset-assert 0) -; (ad ad-cmd :inline :offset-assert 16) -; (flush ad-cmd :inline :offset-assert 32) -; (trigif gs-gif-tag :inline :offset-assert 48) -; (quadgif gs-gif-tag :inline :offset-assert 64) -; ) -; :method-count-assert 9 -; :size-assert #x50 -; :flag-assert #x900000050 -; ) + (deftype shadow-vu1-gifbuf-template (structure) + ((adgif gs-gif-tag :inline :offset-assert 0) + (ad ad-cmd :inline :offset-assert 16) + (flush ad-cmd :inline :offset-assert 32) + (trigif gs-gif-tag :inline :offset-assert 48) + (quadgif gs-gif-tag :inline :offset-assert 64) + ) + :method-count-assert 9 + :size-assert #x50 + :flag-assert #x900000050 + ) ;; - Functions -(define-extern shadow-vu1-add-constants function) -(define-extern shadow-vu1-add-matrix function) +(define-extern shadow-vu1-add-constants (function dma-buffer none)) +(define-extern shadow-vu1-add-matrix (function dma-buffer math-camera none)) ;; - Unknowns (define-extern shadow-vu1-block vu-function) -;;(define-extern *shadow-vu1-tri-template* object) ;; unknown type +(define-extern *shadow-vu1-tri-template* shadow-vu1-gifbuf-template) ;; unknown type ;; ---------------------- diff --git a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc index 356417ea9c..a767fad398 100644 --- a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc @@ -487,7 +487,8 @@ "(method 60 ice-cube)": [8], "(anon-function 2 snow-ball)": [22], "draw-bones-merc": [1, 3, 5, 7, 8, 10, 11, 12, 13], - "(anon-function 48 lavatube-energy)": [13] + "(anon-function 48 lavatube-energy)": [13], + "generic-tie-execute": [4, 9] }, // Sometimes the game might use format strings that are fetched dynamically, diff --git a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc index 1e1cd6b019..e6bd3bd900 100644 --- a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc @@ -2087,6 +2087,30 @@ ["L150", "vu-function"] ], + "generic-merc": [ + ["L161", "(inline-array invinitdata)", 8], + ["L162", "vu-function"] + ], + + "generic-vu0": [ + ["L1", "vu-function"] + ], + + "generic-vu1": [ + ["L8", "vector4w"], + ["L9", "vector4w"], + ["L10", "vu-function"] + ], + + "generic-effect": [ + ["L95", "generic-consts"] + ], + + "shadow-vu1": [ + ["L5", "vu-function"], + ["L6", "shadow-vu1-gifbuf-template"] + ], + // please do not add things after this entry! git is dumb. "object-file-that-doesnt-actually-exist-and-i-just-put-this-here-to-prevent-merge-conflicts-with-this-file": [] } diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 1af8b643fb..b45d8e99fc 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -7300,5 +7300,45 @@ [41, "a0", "dma-packet"] ], + "generic-reset-buffers": [ + [6, "t1", "dma-packet"], + [8, "t1", "dma-packet"], + [10, "t1", "dma-packet"], + [12, "t1", "dma-packet"], + [14, "t1", "dma-packet"], + [15, "t0", "dma-packet"] + ], + + "shadow-vu1-add-constants": [ + [2, "a1", "dma-packet"], + [7, "a1", "dma-packet"], + [9, "a1", "dma-packet"], + [14, "a1", "dma-packet"], + [[21, 58], "v1", "shadow-vu1-constants"], + [61, "a1", "dma-packet"], + [63, "a1", "dma-packet"], + [65, "a1", "dma-packet"], + [67, "a1", "dma-packet"], + [71, "a1", "dma-packet"], + [[73, 85], "a1", "shadow-vu1-gifbuf-template"] + ], + + "shadow-vu1-add-matrix": [ + [6, "a3", "dma-packet"], + [11, "a3", "dma-packet"], + [13, "a3", "dma-packet"], + [18, "a3", "dma-packet"], + [19, "a3", "dma-packet"], + [21, "v1", "dma-packet"], + [[26, 31], "v1", "matrix"] + ], + + "shadow-vu1-init-buffer": [ + [14, "a0", "dma-packet"], + [16, "a0", "dma-packet"], + [22, "a0", "dma-packet"], + [24, "a0", "dma-packet"] + ], + "placeholder-do-not-add-below": [] } diff --git a/goal_src/engine/gfx/generic/generic-merc.gc b/goal_src/engine/gfx/generic/generic-merc.gc index 476414bacb..ef17984d20 100644 --- a/goal_src/engine/gfx/generic/generic-merc.gc +++ b/goal_src/engine/gfx/generic/generic-merc.gc @@ -5,3 +5,60 @@ ;; name in dgo: generic-merc ;; dgos: GAME, ENGINE +(define mercneric-vu0-block (new 'static 'vu-function :length #x0 :origin #x0 :qlength #x0)) + +(deftype invinitdata (structure) + ((count uint8 :offset-assert 0) + (init-data uint8 :offset-assert 1) + (init-addr uint16 :offset-assert 2) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +(defmethod inspect invinitdata ((obj invinitdata)) + (format #t "[~8x] ~A~%" obj 'invinitdata) + (format #t "~Tcount: ~D~%" (-> obj count)) + (format #t "~Tinit-data: ~D~%" (-> obj init-data)) + (format #t "~Tinit-addr: ~D~%" (-> obj init-addr)) + obj + ) + +(define *inv-init-table* (new 'static 'inline-array invinitdata 8 + (new 'static 'invinitdata :count #x48 :init-addr #x1) + (new 'static 'invinitdata :count #x38 :init-data #x24 :init-addr #xe1) + (new 'static 'invinitdata :count #xbe) + (new 'static 'invinitdata :count #x81 :init-data #x80 :init-addr #x3b80) + (new 'static 'invinitdata :count #x88 :init-data #x50 :init-addr #x100a) + (new 'static 'invinitdata :count #x7d :init-data #xb :init-addr #x81e8) + (new 'static 'invinitdata :count #x7d :init-data #x1b :init-addr #x81e8) + (new 'static 'invinitdata :count #x2 :init-data #x68 :init-addr #x5200) + ) + ) + +;; (def-mips2c generic-merc-init-asm function) ;; TODO mips2c + +;; (def-mips2c mercneric-matrix-asm function) ;; TODO mips2c + +;; (def-mips2c mercneric-shader-asm function) ;; TODO mips2c + +;; (def-mips2c mercneric-bittable-asm function) ;; TODO mips2c + +;; (def-mips2c mercneric-convert function) ;; TODO mips2c + +;; (def-mips2c high-speed-reject function) ;; TODO mips2c + +;; (def-mips2c generic-merc-execute-asm function) ;; TODO mips2c + +(defun generic-merc-add-to-cue ((arg0 basic)) + (set! (-> *merc-globals* sink) arg0) + (+! (-> *merc-global-array* count) 1) + (set! *merc-globals* (-> *merc-global-array* globals (-> *merc-global-array* count))) + (none) + ) + +;; (def-mips2c generic-merc-execute-all function) ;; TODO mips2c + + + diff --git a/goal_src/engine/gfx/generic/generic-vu0.gc b/goal_src/engine/gfx/generic/generic-vu0.gc index 8ddb165727..655117d453 100644 --- a/goal_src/engine/gfx/generic/generic-vu0.gc +++ b/goal_src/engine/gfx/generic/generic-vu0.gc @@ -5,3 +5,4 @@ ;; name in dgo: generic-vu0 ;; dgos: GAME, ENGINE +(define generic-vu0-block (new 'static 'vu-function :length #x0 :qlength #x0)) \ No newline at end of file diff --git a/goal_src/engine/gfx/generic/generic-vu1.gc b/goal_src/engine/gfx/generic/generic-vu1.gc index 10568e4497..21a68b51c8 100644 --- a/goal_src/engine/gfx/generic/generic-vu1.gc +++ b/goal_src/engine/gfx/generic/generic-vu1.gc @@ -5,3 +5,169 @@ ;; name in dgo: generic-vu1 ;; dgos: GAME, ENGINE +(define generic-vu1-block (new 'static 'vu-function :length #x0 :qlength #x0)) + +(defun generic-setup-constants ((arg0 generic-constants) (arg1 int)) + (let ((a2-0 *math-camera*)) + (set-vector! (-> arg0 fog) (-> a2-0 pfog0) (-> a2-0 fog-min) (-> a2-0 fog-max) 3071.0) + ) + (set! (-> arg0 adgif tag) (new 'static 'gif-tag64 :nloop #x7 :nreg #x1)) + (set! (-> arg0 adgif regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d))) + (set! (-> arg0 giftag 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! (-> arg0 giftag regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2)) + ) + (set! (-> arg0 hvdf-offset quad) (-> *math-camera* hvdf-off quad)) + (set! (-> arg0 hmge-scale quad) (-> *math-camera* hmge-scale quad)) + (set! (-> arg0 invh-scale quad) (-> *math-camera* inv-hmge-scale quad)) + (set! (-> arg0 guard quad) (-> *math-camera* guard quad)) + (set! (-> arg0 adnop dword 0) (the-as uint #x5026b)) + (set! (-> arg0 adnop dword 1) (the-as uint 71)) + (set! (-> arg0 flush dword 0) (the-as uint #x3f80000080808080)) + (set! (-> arg0 flush dword 1) (the-as uint 1)) + (none) + ) + +(defun generic-add-constants ((arg0 dma-buffer) (arg1 int)) + (let* ((a2-0 10) + (v1-0 arg0) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a2-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x381 :cmd (vif-cmd unpack-v4-32) :num a2-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (generic-setup-constants (the-as generic-constants (-> arg0 base)) arg1) + (&+! (-> arg0 base) 160) + (none) + ) + +(defun generic-init-buf ((arg0 dma-buffer) (arg1 int) (arg2 gs-zbuf)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask generic)) + (dma-buffer-add-vu-function arg0 generic-vu1-block 1) + (let* ((v1-3 arg0) + (a0-2 (the-as dma-packet (-> v1-3 base))) + ) + (set! (-> a0-2 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt))) + (set! (-> a0-2 vif0) (new 'static 'vif-tag)) + (set! (-> a0-2 vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1)) + (set! (-> v1-3 base) (the-as pointer (&+ a0-2 16))) + ) + (let* ((v1-4 arg0) + (a0-4 (the-as gs-gif-tag (-> v1-4 base))) + ) + (set! (-> a0-4 tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2)) + (set! (-> a0-4 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-4 base) (the-as pointer (&+ a0-4 16))) + ) + (let* ((v1-5 arg0) + (a0-6 (-> v1-5 base)) + ) + (set! (-> (the-as (pointer gs-test) a0-6) 0) + (new 'static 'gs-test + :ate #x1 + :atst (gs-atest greater-equal) + :aref #x26 + :afail #x1 + :zte #x1 + :ztst (gs-ztest greater-equal) + ) + ) + (set! (-> (the-as (pointer uint64) a0-6) 1) (the-as uint (gs-reg test-1))) + (set! (-> (the-as (pointer gs-zbuf) a0-6) 2) arg2) + (set! (-> (the-as (pointer uint64) a0-6) 3) (the-as uint (gs-reg zbuf-1))) + (set! (-> v1-5 base) (&+ a0-6 32)) + ) + (generic-add-constants arg0 arg1) + (let* ((v1-6 arg0) + (a0-9 (the-as dma-packet (-> v1-6 base))) + ) + (set! (-> a0-9 dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) + (set! (-> a0-9 vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1)) + (set! (-> a0-9 vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod))) + (set! (-> v1-6 base) (the-as pointer (&+ a0-9 16))) + ) + (let ((v1-7 (the-as (pointer int32) (-> arg0 base)))) + (set! (-> (the-as (pointer vif-tag) v1-7) 0) (new 'static 'vif-tag :cmd (vif-cmd base))) + (set! (-> (the-as (pointer vif-tag) v1-7) 1) (new 'static 'vif-tag :cmd (vif-cmd offset))) + (set! (-> (the-as (pointer vif-tag) v1-7) 2) (new 'static 'vif-tag)) + (set! (-> (the-as (pointer vif-tag) v1-7) 3) (new 'static 'vif-tag :cmd (vif-cmd strow) :msk #x1)) + (set! (-> v1-7 4) 0) + (set! (-> v1-7 5) 0) + (set! (-> v1-7 6) 0) + (set! (-> v1-7 7) 0) + (set! (-> arg0 base) (&+ (the-as pointer v1-7) 32)) + ) + ) + 0 + (none) + ) + +;; unused +;; (defun generic-reset-buffers ((arg0 dma-buffer) (arg1 int) (arg2 int)) +;; (when (logtest? *vu1-enable-user* (vu1-renderer-mask generic)) +;; (let ((a3-0 (new 'static 'vector :x (the-as float #x345) :y (the-as float #x363))) +;; (v1-3 (new 'static 'vector :y (the-as float #x117) :z (the-as float #x22e))) +;; ) +;; (let* ((t0-0 arg0) +;; (t1-0 (the-as object (-> t0-0 base))) +;; ) +;; (set! (-> (the-as dma-packet t1-0) dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) +;; (set! (-> (the-as dma-packet t1-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) +;; (set! (-> (the-as dma-packet t1-0) vif1) +;; (new 'static 'vif-tag :imm #x38a :num #x1 :cmd (vif-cmd unpack-v4-32)) +;; ) +;; (set! (-> t0-0 base) (the-as pointer (the-as dma-packet (&+ (the-as pointer t1-0) 16)))) +;; ) +;; (let ((t0-1 (-> arg0 base))) +;; (set! (-> (the-as (pointer int32) t0-1)) 0) +;; (s.w! (+ t0-1 4) 0) +;; (let ((a1-3 (-> a3-0 data arg1))) +;; (s.w! (+ t0-1 8) a1-3) +;; ) +;; (let ((v1-5 (-> v1-3 data arg2))) +;; (s.w! (+ t0-1 12) v1-5) +;; ) +;; (s.w! (+ t0-1 16) 0) +;; (s.w! (+ t0-1 20) 0) +;; (s.w! (+ t0-1 24) 0) +;; (let ((v1-6 #x1500000c)) +;; (s.w! (+ t0-1 28) v1-6) +;; ) +;; (set! (-> arg0 base) (&+ t0-1 32)) +;; ) +;; ) +;; ) +;; 0 +;; (none) +;; ) + + + + diff --git a/goal_src/engine/gfx/shadow/shadow-cpu-h.gc b/goal_src/engine/gfx/shadow/shadow-cpu-h.gc index d4475e7061..34dc252c5b 100644 --- a/goal_src/engine/gfx/shadow/shadow-cpu-h.gc +++ b/goal_src/engine/gfx/shadow/shadow-cpu-h.gc @@ -72,7 +72,7 @@ (deftype shadow-data (structure) ((texoffset vector :inline :offset-assert 0) (texscale vector :inline :offset-assert 16) - (clrs uint128 2 :offset-assert 32) + (clrs vector 2 :inline :offset-assert 32) (dma-unpack-template dma-packet :inline :offset-assert 64) (dma-cnt uint64 :offset-assert 80) (vif-nop uint32 :offset-assert 88) diff --git a/goal_src/engine/gfx/shadow/shadow-vu1.gc b/goal_src/engine/gfx/shadow/shadow-vu1.gc index ca6e87c282..00651bfd61 100644 --- a/goal_src/engine/gfx/shadow/shadow-vu1.gc +++ b/goal_src/engine/gfx/shadow/shadow-vu1.gc @@ -5,3 +5,239 @@ ;; name in dgo: shadow-vu1 ;; dgos: GAME, ENGINE +(deftype shadow-vu1-constants (structure) + ((hmgescale vector :inline :offset-assert 0) + (invhscale vector :inline :offset-assert 16) + (texoffset vector :inline :offset-assert 32) + (texscale vector :inline :offset-assert 48) + (hvdfoff vector :inline :offset-assert 64) + (fog vector :inline :offset-assert 80) + (clrs vector 2 :inline :offset-assert 96) + (adgif gs-gif-tag :inline :offset-assert 128) + (texflush ad-cmd :inline :offset-assert 144) + (flush ad-cmd :inline :offset-assert 160) + (trigif gs-gif-tag :inline :offset-assert 176) + (quadgif gs-gif-tag :inline :offset-assert 192) + ) + :method-count-assert 9 + :size-assert #xd0 + :flag-assert #x9000000d0 + ) + +(defmethod inspect shadow-vu1-constants ((obj shadow-vu1-constants)) + (format #t "[~8x] ~A~%" obj 'shadow-vu1-constants) + (format #t "~Thmgescale: #~%" (-> obj hmgescale)) + (format #t "~Tinvhscale: #~%" (-> obj invhscale)) + (format #t "~Ttexoffset: #~%" (-> obj texoffset)) + (format #t "~Ttexscale: #~%" (-> obj texscale)) + (format #t "~Thvdfoff: #~%" (-> obj hvdfoff)) + (format #t "~Tfog: #~%" (-> obj fog)) + (format #t "~Tclrs[2] @ #x~X~%" (-> obj clrs)) + (format #t "~Tadgif: #~%" (-> obj adgif)) + (format #t "~Ttexflush: #~%" (-> obj texflush)) + (format #t "~Tflush: #~%" (-> obj flush)) + (format #t "~Ttrigif: #~%" (-> obj trigif)) + (format #t "~Tquadgif: #~%" (-> obj quadgif)) + obj + ) + +(deftype shadow-vu1-gifbuf-template (structure) + ((adgif gs-gif-tag :inline :offset-assert 0) + (ad ad-cmd :inline :offset-assert 16) + (flush ad-cmd :inline :offset-assert 32) + (trigif gs-gif-tag :inline :offset-assert 48) + (quadgif gs-gif-tag :inline :offset-assert 64) + ) + :method-count-assert 9 + :size-assert #x50 + :flag-assert #x900000050 + ) + +(defmethod inspect shadow-vu1-gifbuf-template ((obj shadow-vu1-gifbuf-template)) + (format #t "[~8x] ~A~%" obj 'shadow-vu1-gifbuf-template) + (format #t "~Tadgif: #~%" (-> obj adgif)) + (format #t "~Tad: #~%" (-> obj ad)) + (format #t "~Tflush: #~%" (-> obj flush)) + (format #t "~Ttrigif: #~%" (-> obj trigif)) + (format #t "~Tquadgif: #~%" (-> obj quadgif)) + obj + ) + +(define + *shadow-vu1-tri-template* + (new 'static 'shadow-vu1-gifbuf-template + :adgif + (new 'static 'gs-gif-tag + :tag + (new 'static 'gif-tag64 :nloop #x1 :nreg #x1) + :regs + (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)) + ) + :ad + (new 'static 'ad-cmd :word (new 'static 'array uint32 4 #x0 #x0 #x3f #x0)) + :flush + (new 'static 'ad-cmd :word (new 'static 'array uint32 4 #x0 #x3f800000 #x1 #x0)) + :trigif + (new 'static 'gs-gif-tag + :tag + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1) + :nreg #x7 + ) + :regs + (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id st) + :regs2 (gif-reg-id xyzf2) + :regs3 (gif-reg-id st) + :regs4 (gif-reg-id xyzf2) + :regs5 (gif-reg-id st) + :regs6 (gif-reg-id xyzf2) + ) + ) + :quadgif + (new 'static 'gs-gif-tag + :tag + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1) + :nreg #x9 + ) + :regs + (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id st) + :regs2 (gif-reg-id xyzf2) + :regs3 (gif-reg-id st) + :regs4 (gif-reg-id xyzf2) + :regs5 (gif-reg-id st) + :regs6 (gif-reg-id xyzf2) + :regs7 (gif-reg-id st) + :regs8 (gif-reg-id xyzf2) + ) + ) + ) + ) + +(define shadow-vu1-block (new 'static 'vu-function :length #x0 :qlength #x0)) + +(defun shadow-vu1-add-constants ((arg0 dma-buffer)) + (let* ((a2-0 13) + (v1-0 arg0) + (a1-0 (the-as object (-> v1-0 base))) + ) + (set! (-> (the-as dma-packet a1-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a2-0)) + (set! (-> (the-as dma-packet a1-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet a1-0) vif1) + (new 'static 'vif-tag :imm #x370 :cmd (vif-cmd unpack-v4-32) :num a2-0) + ) + (set! (-> v1-0 base) (&+ (the-as pointer a1-0) 16)) + ) + (let ((v1-1 (the-as object (-> arg0 base))) + (a3-4 *math-camera*) + (a2-4 *shadow-data*) + (a1-2 *shadow-vu1-tri-template*) + ) + (set! (-> (the-as shadow-vu1-constants v1-1) hmgescale quad) (-> a3-4 hmge-scale quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) invhscale quad) (-> a3-4 inv-hmge-scale quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) texoffset quad) (-> a2-4 texoffset quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) texscale quad) (-> a2-4 texscale quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) hvdfoff quad) (-> a3-4 hvdf-off quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) fog x) (-> a3-4 pfog0)) + (set! (-> (the-as shadow-vu1-constants v1-1) clrs 0 quad) (-> a2-4 clrs 0 quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) clrs 1 quad) (-> a2-4 clrs 1 quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) adgif qword) (-> a1-2 adgif qword)) + (set! (-> (the-as shadow-vu1-constants v1-1) texflush quad) (-> a1-2 ad quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) flush quad) (-> a1-2 flush quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) trigif qword) (-> a1-2 trigif qword)) + (set! (-> (the-as shadow-vu1-constants v1-1) quadgif qword) (-> a1-2 quadgif qword)) + ) + (&+! (-> arg0 base) 208) + (let* ((v1-4 arg0) + (a1-4 (the-as object (-> v1-4 base))) + ) + (set! (-> (the-as dma-packet a1-4) dma) (new 'static 'dma-tag :qwc #x4 :id (dma-tag-id cnt))) + (set! (-> (the-as dma-packet a1-4) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet a1-4) vif1) + (new 'static 'vif-tag :imm #x3ac :num #x4 :cmd (vif-cmd unpack-v4-32)) + ) + (set! (-> v1-4 base) (&+ (the-as pointer a1-4) 16)) + ) + (let* ((v1-5 arg0) + (a1-6 (the-as object (-> v1-5 base))) + ) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) adgif tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x2)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) adgif regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d) :regs1 (gif-reg-id rgbaq)) + ) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) ad data) (the-as uint 0)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) ad cmds) (the-as uint 63)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) flush data) (the-as uint 0)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) flush cmds) (the-as uint 0)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) trigif tag) + (new 'static 'gif-tag64 + :nloop #x3 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1) + :nreg #x2 + ) + ) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) trigif regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id xyzf2)) + ) + (set! (-> v1-5 base) (&+ (the-as pointer a1-6) 64)) + ) + (none) + ) + +(defun shadow-vu1-add-matrix ((arg0 dma-buffer) (arg1 math-camera)) + (let ((v1-0 4)) + (let* ((a2-4 arg0) + (a3-0 (the-as object (-> a2-4 base))) + ) + (set! (-> (the-as dma-packet a3-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc v1-0)) + (set! (-> (the-as dma-packet a3-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet a3-0) vif1) (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32) :num v1-0)) + (set! (-> a2-4 base) (the-as pointer (&+ (the-as dma-packet a3-0) 16))) + ) + ) + (let ((v1-5 (the-as object (-> arg0 base)))) + (let ((a2-5 (-> arg1 perspective vector 0 quad)) + (a3-1 (-> arg1 perspective vector 1 quad)) + (t0-4 (-> arg1 perspective vector 2 quad)) + (a1-1 (-> arg1 perspective vector 3 quad)) + ) + (set! (-> (the-as matrix v1-5) vector 0 quad) a2-5) + (set! (-> (the-as matrix v1-5) vector 1 quad) a3-1) + (set! (-> (the-as matrix v1-5) vector 2 quad) t0-4) + (set! (-> (the-as matrix v1-5) vector 3 quad) a1-1) + ) + (set! (-> arg0 base) (the-as pointer (&+ (the-as matrix v1-5) 64))) + ) + (none) + ) + +(defun shadow-vu1-init-buffer ((arg0 dma-buffer)) + (dma-buffer-add-vu-function arg0 shadow-vu1-block 1) + (shadow-vu1-add-constants arg0) + (shadow-vu1-add-matrix arg0 *math-camera*) + (let* ((v1-0 arg0) + (a0-4 (the-as object (-> v1-0 base))) + ) + (set! (-> (the-as dma-packet a0-4) dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> (the-as dma-packet a0-4) vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #xa)) + (set! (-> (the-as dma-packet a0-4) vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-0 base) (&+ (the-as pointer a0-4) 16)) + ) + (none) + ) + + + + diff --git a/test/decompiler/reference/engine/gfx/generic/generic-merc_REF.gc b/test/decompiler/reference/engine/gfx/generic/generic-merc_REF.gc new file mode 100644 index 0000000000..3353b6975f --- /dev/null +++ b/test/decompiler/reference/engine/gfx/generic/generic-merc_REF.gc @@ -0,0 +1,75 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol mercneric-vu0-block, type vu-function +(define mercneric-vu0-block (new 'static 'vu-function :length #xbe :origin #x118 :qlength 95)) + +;; definition of type invinitdata +(deftype invinitdata (structure) + ((count uint8 :offset-assert 0) + (init-data uint8 :offset-assert 1) + (init-addr uint16 :offset-assert 2) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for method 3 of type invinitdata +(defmethod inspect invinitdata ((obj invinitdata)) + (format #t "[~8x] ~A~%" obj 'invinitdata) + (format #t "~Tcount: ~D~%" (-> obj count)) + (format #t "~Tinit-data: ~D~%" (-> obj init-data)) + (format #t "~Tinit-addr: ~D~%" (-> obj init-addr)) + obj + ) + +;; definition for symbol *inv-init-table*, type (inline-array invinitdata) +(define *inv-init-table* (new 'static 'inline-array invinitdata 8 + (new 'static 'invinitdata :count #x48 :init-addr #x1) + (new 'static 'invinitdata :count #x38 :init-data #x24 :init-addr #xe1) + (new 'static 'invinitdata :count #xbe) + (new 'static 'invinitdata :count #x81 :init-data #x80 :init-addr #x3b80) + (new 'static 'invinitdata :count #x88 :init-data #x50 :init-addr #x100a) + (new 'static 'invinitdata :count #x7d :init-data #xb :init-addr #x81e8) + (new 'static 'invinitdata :count #x7d :init-data #x1b :init-addr #x81e8) + (new 'static 'invinitdata :count #x2 :init-data #x68 :init-addr #x5200) + ) + ) + +;; definition for function generic-merc-init-asm +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function mercneric-matrix-asm +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function mercneric-shader-asm +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function mercneric-bittable-asm +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function mercneric-convert +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function high-speed-reject +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function generic-merc-execute-asm +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function generic-merc-add-to-cue +;; INFO: Return type mismatch merc-globals vs none. +(defun generic-merc-add-to-cue ((arg0 basic)) + (set! (-> *merc-globals* sink) arg0) + (+! (-> *merc-global-array* count) 1) + (set! *merc-globals* (-> *merc-global-array* globals (-> *merc-global-array* count))) + (none) + ) + +;; definition for function generic-merc-execute-all +;; ERROR: function was not converted to expressions. Cannot decompile. + + + + diff --git a/test/decompiler/reference/engine/gfx/generic/generic-vu0_REF.gc b/test/decompiler/reference/engine/gfx/generic/generic-vu0_REF.gc new file mode 100644 index 0000000000..38b1d2bd08 --- /dev/null +++ b/test/decompiler/reference/engine/gfx/generic/generic-vu0_REF.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol generic-vu0-block, type vu-function +(define generic-vu0-block (new 'static 'vu-function :length #x127 :qlength #x94)) + + + + diff --git a/test/decompiler/reference/engine/gfx/generic/generic-vu1_REF.gc b/test/decompiler/reference/engine/gfx/generic/generic-vu1_REF.gc new file mode 100644 index 0000000000..9c7c7450f2 --- /dev/null +++ b/test/decompiler/reference/engine/gfx/generic/generic-vu1_REF.gc @@ -0,0 +1,178 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol generic-vu1-block, type vu-function +(define generic-vu1-block (new 'static 'vu-function :length #x446 :qlength #x223)) + +;; definition for function generic-setup-constants +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defun generic-setup-constants ((arg0 generic-constants) (arg1 int)) + (let ((a2-0 *math-camera*)) + (set-vector! (-> arg0 fog) (-> a2-0 pfog0) (-> a2-0 fog-min) (-> a2-0 fog-max) 3071.0) + ) + (set! (-> arg0 adgif tag) (new 'static 'gif-tag64 :nloop #x7 :nreg #x1)) + (set! (-> arg0 adgif regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d))) + (set! (-> arg0 giftag 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! (-> arg0 giftag regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2)) + ) + (set! (-> arg0 hvdf-offset quad) (-> *math-camera* hvdf-off quad)) + (set! (-> arg0 hmge-scale quad) (-> *math-camera* hmge-scale quad)) + (set! (-> arg0 invh-scale quad) (-> *math-camera* inv-hmge-scale quad)) + (set! (-> arg0 guard quad) (-> *math-camera* guard quad)) + (set! (-> arg0 adnop dword 0) (the-as uint #x5026b)) + (set! (-> arg0 adnop dword 1) (the-as uint 71)) + (set! (-> arg0 flush dword 0) (the-as uint #x3f80000080808080)) + (set! (-> arg0 flush dword 1) (the-as uint 1)) + (none) + ) + +;; definition for function generic-add-constants +;; INFO: Return type mismatch pointer vs none. +(defun generic-add-constants ((arg0 dma-buffer) (arg1 int)) + (let* ((a2-0 10) + (v1-0 arg0) + (a0-1 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-1 dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a2-0)) + (set! (-> a0-1 vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> a0-1 vif1) (new 'static 'vif-tag :imm #x381 :cmd (vif-cmd unpack-v4-32) :num a2-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (generic-setup-constants (the-as generic-constants (-> arg0 base)) arg1) + (&+! (-> arg0 base) 160) + (none) + ) + +;; definition for function generic-init-buf +;; INFO: Return type mismatch int vs none. +(defun generic-init-buf ((arg0 dma-buffer) (arg1 int) (arg2 gs-zbuf)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask generic)) + (dma-buffer-add-vu-function arg0 generic-vu1-block 1) + (let* ((v1-3 arg0) + (a0-2 (the-as dma-packet (-> v1-3 base))) + ) + (set! (-> a0-2 dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt))) + (set! (-> a0-2 vif0) (new 'static 'vif-tag)) + (set! (-> a0-2 vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1)) + (set! (-> v1-3 base) (the-as pointer (&+ a0-2 16))) + ) + (let* ((v1-4 arg0) + (a0-4 (the-as gs-gif-tag (-> v1-4 base))) + ) + (set! (-> a0-4 tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2)) + (set! (-> a0-4 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-4 base) (the-as pointer (&+ a0-4 16))) + ) + (let* ((v1-5 arg0) + (a0-6 (-> v1-5 base)) + ) + (set! (-> (the-as (pointer gs-test) a0-6) 0) + (new 'static 'gs-test + :ate #x1 + :atst (gs-atest greater-equal) + :aref #x26 + :afail #x1 + :zte #x1 + :ztst (gs-ztest greater-equal) + ) + ) + (set! (-> (the-as (pointer uint64) a0-6) 1) (the-as uint (gs-reg test-1))) + (set! (-> (the-as (pointer gs-zbuf) a0-6) 2) arg2) + (set! (-> (the-as (pointer uint64) a0-6) 3) (the-as uint (gs-reg zbuf-1))) + (set! (-> v1-5 base) (&+ a0-6 32)) + ) + (generic-add-constants arg0 arg1) + (let* ((v1-6 arg0) + (a0-9 (the-as dma-packet (-> v1-6 base))) + ) + (set! (-> a0-9 dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) + (set! (-> a0-9 vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1)) + (set! (-> a0-9 vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod))) + (set! (-> v1-6 base) (the-as pointer (&+ a0-9 16))) + ) + (let ((v1-7 (the-as (pointer int32) (-> arg0 base)))) + (set! (-> (the-as (pointer vif-tag) v1-7) 0) (new 'static 'vif-tag :cmd (vif-cmd base))) + (set! (-> (the-as (pointer vif-tag) v1-7) 1) (new 'static 'vif-tag :cmd (vif-cmd offset))) + (set! (-> (the-as (pointer vif-tag) v1-7) 2) (new 'static 'vif-tag)) + (set! (-> (the-as (pointer vif-tag) v1-7) 3) (new 'static 'vif-tag :cmd (vif-cmd strow) :msk #x1)) + (set! (-> v1-7 4) 0) + (set! (-> v1-7 5) 0) + (set! (-> v1-7 6) 0) + (set! (-> v1-7 7) 0) + (set! (-> arg0 base) (&+ (the-as pointer v1-7) 32)) + ) + ) + 0 + (none) + ) + +;; definition for function generic-reset-buffers +;; INFO: Return type mismatch int vs none. +(defun generic-reset-buffers ((arg0 dma-buffer) (arg1 int) (arg2 int)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask generic)) + (let ((a3-0 (new 'static 'vector :x (the-as float #x345) :y (the-as float #x363))) + (v1-3 (new 'static 'vector :y (the-as float #x117) :z (the-as float #x22e))) + ) + (let* ((t0-0 arg0) + (t1-0 (the-as object (-> t0-0 base))) + ) + (set! (-> (the-as dma-packet t1-0) dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) + (set! (-> (the-as dma-packet t1-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet t1-0) vif1) + (new 'static 'vif-tag :imm #x38a :num #x1 :cmd (vif-cmd unpack-v4-32)) + ) + (set! (-> t0-0 base) (the-as pointer (the-as dma-packet (&+ (the-as pointer t1-0) 16)))) + ) + (let ((t0-1 (-> arg0 base))) + (set! (-> (the-as (pointer int32) t0-1)) 0) + (s.w! (+ t0-1 4) 0) + (let ((a1-3 (-> a3-0 data arg1))) + (s.w! (+ t0-1 8) a1-3) + ) + (let ((v1-5 (-> v1-3 data arg2))) + (s.w! (+ t0-1 12) v1-5) + ) + (s.w! (+ t0-1 16) 0) + (s.w! (+ t0-1 20) 0) + (s.w! (+ t0-1 24) 0) + (let ((v1-6 #x1500000c)) + (s.w! (+ t0-1 28) v1-6) + ) + (set! (-> arg0 base) (&+ t0-1 32)) + ) + ) + ) + 0 + (none) + ) + + + + diff --git a/test/decompiler/reference/engine/gfx/shadow/shadow-vu1_REF.gc b/test/decompiler/reference/engine/gfx/shadow/shadow-vu1_REF.gc new file mode 100644 index 0000000000..a3b6c42874 --- /dev/null +++ b/test/decompiler/reference/engine/gfx/shadow/shadow-vu1_REF.gc @@ -0,0 +1,253 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type shadow-vu1-constants +(deftype shadow-vu1-constants (structure) + ((hmgescale vector :inline :offset-assert 0) + (invhscale vector :inline :offset-assert 16) + (texoffset vector :inline :offset-assert 32) + (texscale vector :inline :offset-assert 48) + (hvdfoff vector :inline :offset-assert 64) + (fog vector :inline :offset-assert 80) + (clrs vector 2 :inline :offset-assert 96) + (adgif gs-gif-tag :inline :offset-assert 128) + (texflush ad-cmd :inline :offset-assert 144) + (flush ad-cmd :inline :offset-assert 160) + (trigif gs-gif-tag :inline :offset-assert 176) + (quadgif gs-gif-tag :inline :offset-assert 192) + ) + :method-count-assert 9 + :size-assert #xd0 + :flag-assert #x9000000d0 + ) + +;; definition for method 3 of type shadow-vu1-constants +(defmethod inspect shadow-vu1-constants ((obj shadow-vu1-constants)) + (format #t "[~8x] ~A~%" obj 'shadow-vu1-constants) + (format #t "~Thmgescale: #~%" (-> obj hmgescale)) + (format #t "~Tinvhscale: #~%" (-> obj invhscale)) + (format #t "~Ttexoffset: #~%" (-> obj texoffset)) + (format #t "~Ttexscale: #~%" (-> obj texscale)) + (format #t "~Thvdfoff: #~%" (-> obj hvdfoff)) + (format #t "~Tfog: #~%" (-> obj fog)) + (format #t "~Tclrs[2] @ #x~X~%" (-> obj clrs)) + (format #t "~Tadgif: #~%" (-> obj adgif)) + (format #t "~Ttexflush: #~%" (-> obj texflush)) + (format #t "~Tflush: #~%" (-> obj flush)) + (format #t "~Ttrigif: #~%" (-> obj trigif)) + (format #t "~Tquadgif: #~%" (-> obj quadgif)) + obj + ) + +;; definition of type shadow-vu1-gifbuf-template +(deftype shadow-vu1-gifbuf-template (structure) + ((adgif gs-gif-tag :inline :offset-assert 0) + (ad ad-cmd :inline :offset-assert 16) + (flush ad-cmd :inline :offset-assert 32) + (trigif gs-gif-tag :inline :offset-assert 48) + (quadgif gs-gif-tag :inline :offset-assert 64) + ) + :method-count-assert 9 + :size-assert #x50 + :flag-assert #x900000050 + ) + +;; definition for method 3 of type shadow-vu1-gifbuf-template +(defmethod inspect shadow-vu1-gifbuf-template ((obj shadow-vu1-gifbuf-template)) + (format #t "[~8x] ~A~%" obj 'shadow-vu1-gifbuf-template) + (format #t "~Tadgif: #~%" (-> obj adgif)) + (format #t "~Tad: #~%" (-> obj ad)) + (format #t "~Tflush: #~%" (-> obj flush)) + (format #t "~Ttrigif: #~%" (-> obj trigif)) + (format #t "~Tquadgif: #~%" (-> obj quadgif)) + obj + ) + +;; definition for symbol *shadow-vu1-tri-template*, type shadow-vu1-gifbuf-template +(define + *shadow-vu1-tri-template* + (new 'static 'shadow-vu1-gifbuf-template + :adgif + (new 'static 'gs-gif-tag + :tag + (new 'static 'gif-tag64 :nloop #x1 :nreg #x1) + :regs + (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)) + ) + :ad + (new 'static 'ad-cmd :word (new 'static 'array uint32 4 #x0 #x0 #x3f #x0)) + :flush + (new 'static 'ad-cmd :word (new 'static 'array uint32 4 #x0 #x3f800000 #x1 #x0)) + :trigif + (new 'static 'gs-gif-tag + :tag + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1) + :nreg #x7 + ) + :regs + (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id st) + :regs2 (gif-reg-id xyzf2) + :regs3 (gif-reg-id st) + :regs4 (gif-reg-id xyzf2) + :regs5 (gif-reg-id st) + :regs6 (gif-reg-id xyzf2) + ) + ) + :quadgif + (new 'static 'gs-gif-tag + :tag + (new 'static 'gif-tag64 + :nloop #x1 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1) + :nreg #x9 + ) + :regs + (new 'static 'gif-tag-regs + :regs0 (gif-reg-id rgbaq) + :regs1 (gif-reg-id st) + :regs2 (gif-reg-id xyzf2) + :regs3 (gif-reg-id st) + :regs4 (gif-reg-id xyzf2) + :regs5 (gif-reg-id st) + :regs6 (gif-reg-id xyzf2) + :regs7 (gif-reg-id st) + :regs8 (gif-reg-id xyzf2) + ) + ) + ) + ) + +;; definition for symbol shadow-vu1-block, type vu-function +(define shadow-vu1-block (new 'static 'vu-function :length #x2e4 :qlength #x172)) + +;; definition for function shadow-vu1-add-constants +;; INFO: Return type mismatch dma-buffer vs none. +;; Used lq/sq +(defun shadow-vu1-add-constants ((arg0 dma-buffer)) + (let* ((a2-0 13) + (v1-0 arg0) + (a1-0 (the-as object (-> v1-0 base))) + ) + (set! (-> (the-as dma-packet a1-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a2-0)) + (set! (-> (the-as dma-packet a1-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet a1-0) vif1) + (new 'static 'vif-tag :imm #x370 :cmd (vif-cmd unpack-v4-32) :num a2-0) + ) + (set! (-> v1-0 base) (&+ (the-as pointer a1-0) 16)) + ) + (let ((v1-1 (the-as object (-> arg0 base))) + (a3-4 *math-camera*) + (a2-4 *shadow-data*) + (a1-2 *shadow-vu1-tri-template*) + ) + (set! (-> (the-as shadow-vu1-constants v1-1) hmgescale quad) (-> a3-4 hmge-scale quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) invhscale quad) (-> a3-4 inv-hmge-scale quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) texoffset quad) (-> a2-4 texoffset quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) texscale quad) (-> a2-4 texscale quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) hvdfoff quad) (-> a3-4 hvdf-off quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) fog x) (-> a3-4 pfog0)) + (set! (-> (the-as shadow-vu1-constants v1-1) clrs 0 quad) (-> a2-4 clrs 0 quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) clrs 1 quad) (-> a2-4 clrs 1 quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) adgif qword) (-> a1-2 adgif qword)) + (set! (-> (the-as shadow-vu1-constants v1-1) texflush quad) (-> a1-2 ad quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) flush quad) (-> a1-2 flush quad)) + (set! (-> (the-as shadow-vu1-constants v1-1) trigif qword) (-> a1-2 trigif qword)) + (set! (-> (the-as shadow-vu1-constants v1-1) quadgif qword) (-> a1-2 quadgif qword)) + ) + (&+! (-> arg0 base) 208) + (let* ((v1-4 arg0) + (a1-4 (the-as object (-> v1-4 base))) + ) + (set! (-> (the-as dma-packet a1-4) dma) (new 'static 'dma-tag :qwc #x4 :id (dma-tag-id cnt))) + (set! (-> (the-as dma-packet a1-4) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet a1-4) vif1) + (new 'static 'vif-tag :imm #x3ac :num #x4 :cmd (vif-cmd unpack-v4-32)) + ) + (set! (-> v1-4 base) (&+ (the-as pointer a1-4) 16)) + ) + (let* ((v1-5 arg0) + (a1-6 (the-as object (-> v1-5 base))) + ) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) adgif tag) (new 'static 'gif-tag64 :nloop #x1 :nreg #x2)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) adgif regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d) :regs1 (gif-reg-id rgbaq)) + ) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) ad data) (the-as uint 0)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) ad cmds) (the-as uint 63)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) flush data) (the-as uint 0)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) flush cmds) (the-as uint 0)) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) trigif tag) + (new 'static 'gif-tag64 + :nloop #x3 + :eop #x1 + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :tme #x1) + :nreg #x2 + ) + ) + (set! (-> (the-as shadow-vu1-gifbuf-template a1-6) trigif regs) + (new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id xyzf2)) + ) + (set! (-> v1-5 base) (&+ (the-as pointer a1-6) 64)) + ) + (none) + ) + +;; definition for function shadow-vu1-add-matrix +;; INFO: Return type mismatch dma-buffer vs none. +;; Used lq/sq +(defun shadow-vu1-add-matrix ((arg0 dma-buffer) (arg1 math-camera)) + (let ((v1-0 4)) + (let* ((a2-4 arg0) + (a3-0 (the-as object (-> a2-4 base))) + ) + (set! (-> (the-as dma-packet a3-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc v1-0)) + (set! (-> (the-as dma-packet a3-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))) + (set! (-> (the-as dma-packet a3-0) vif1) (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32) :num v1-0)) + (set! (-> a2-4 base) (the-as pointer (&+ (the-as dma-packet a3-0) 16))) + ) + ) + (let ((v1-5 (the-as object (-> arg0 base)))) + (let ((a2-5 (-> arg1 perspective vector 0 quad)) + (a3-1 (-> arg1 perspective vector 1 quad)) + (t0-4 (-> arg1 perspective vector 2 quad)) + (a1-1 (-> arg1 perspective vector 3 quad)) + ) + (set! (-> (the-as matrix v1-5) vector 0 quad) a2-5) + (set! (-> (the-as matrix v1-5) vector 1 quad) a3-1) + (set! (-> (the-as matrix v1-5) vector 2 quad) t0-4) + (set! (-> (the-as matrix v1-5) vector 3 quad) a1-1) + ) + (set! (-> arg0 base) (the-as pointer (&+ (the-as matrix v1-5) 64))) + ) + (none) + ) + +;; definition for function shadow-vu1-init-buffer +;; INFO: Return type mismatch dma-buffer vs none. +(defun shadow-vu1-init-buffer ((arg0 dma-buffer)) + (dma-buffer-add-vu-function arg0 shadow-vu1-block 1) + (shadow-vu1-add-constants arg0) + (shadow-vu1-add-matrix arg0 *math-camera*) + (let* ((v1-0 arg0) + (a0-4 (the-as object (-> v1-0 base))) + ) + (set! (-> (the-as dma-packet a0-4) dma) (new 'static 'dma-tag :id (dma-tag-id cnt))) + (set! (-> (the-as dma-packet a0-4) vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1 :imm #xa)) + (set! (-> (the-as dma-packet a0-4) vif1) (new 'static 'vif-tag :cmd (vif-cmd flushe) :msk #x1)) + (set! (-> v1-0 base) (&+ (the-as pointer a0-4) 16)) + ) + (none) + ) + + + +