mirror of
https://github.com/open-goal/jak-project
synced 2026-07-07 22:22:21 -04:00
[jak 2] Add generic and warp (#2495)
This commit is contained in:
@@ -1076,6 +1076,7 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output,
|
||||
case InstructionKind::PMULTH:
|
||||
case InstructionKind::PMADDH:
|
||||
case InstructionKind::PADDH:
|
||||
case InstructionKind::PSUBH:
|
||||
case InstructionKind::PMINH:
|
||||
case InstructionKind::MOVZ:
|
||||
case InstructionKind::MULT3:
|
||||
|
||||
@@ -3919,6 +3919,14 @@
|
||||
:flag-assert #x900000008
|
||||
)
|
||||
|
||||
;; hack - added for warp.
|
||||
(deftype gs-uv2 (uint64)
|
||||
((u int16 :offset 0 :size 16) ;; Q4 fixed point
|
||||
(v int16 :offset 16 :size 16) ;; Q4 fixed point
|
||||
)
|
||||
:flag-assert #x900000008
|
||||
)
|
||||
|
||||
;; the GS's ST register sets the S and T values of the vertex texture coordinates.
|
||||
;; The value Q is specified by the RGBAQ register.
|
||||
(deftype gs-st (uint64)
|
||||
@@ -4999,7 +5007,8 @@
|
||||
|
||||
(declare-type adgif-shader structure)
|
||||
(deftype shader-ptr (uint32)
|
||||
((shader uint32 :offset 8 :size 24))
|
||||
((first-8 uint8 :offset 0 :size 8) ;; added
|
||||
(shader uint32 :offset 8 :size 24))
|
||||
:method-count-assert 9
|
||||
:size-assert #x4
|
||||
:flag-assert #x900000004
|
||||
@@ -11803,12 +11812,12 @@
|
||||
:type uint8
|
||||
:bitfield #t
|
||||
(texscroll 0)
|
||||
(no-fade-out 1)
|
||||
(no-fade-out 1) ;; translucent.
|
||||
(ripple 2)
|
||||
(emerc 3) ;; envmap??
|
||||
(ignore-tod-for-envmap-tint 4) ;; color thing
|
||||
(force-mercneric 5) ;; some mercneric-only effect
|
||||
(cross-fade 6)
|
||||
(cross-fade 6) ;; WARP?
|
||||
(ignore-alpha 7)
|
||||
)
|
||||
|
||||
@@ -11922,7 +11931,7 @@
|
||||
(use-isometric uint8 :offset 41)
|
||||
(use-attached-shader uint8 :offset 42)
|
||||
(display-triangles uint8 :offset 43)
|
||||
(death-vertex-skip uint16 :offset 44)
|
||||
(death-vertex-skip uint16 :offset 44) ;; 172
|
||||
(death-start-vertex uint16 :offset 46)
|
||||
(death-effect uint32 :offset 48)
|
||||
(use-translucent uint8 :offset 52)
|
||||
@@ -24445,8 +24454,8 @@
|
||||
(define-extern foreground-wrapup (function none))
|
||||
(define-extern *default-shadow-settings* shadow-settings)
|
||||
(define-extern foreground-shadow (function draw-control (inline-array pris-mtx) pointer pointer))
|
||||
(define-extern foreground-generic-merc-death (function object object none))
|
||||
(define-extern foreground-generic-merc-add-fragments (function object object object none))
|
||||
(define-extern foreground-generic-merc-death (function draw-control generic-merc-ctrl none))
|
||||
(define-extern foreground-generic-merc-add-fragments (function merc-effect pointer mercneric-chain pointer))
|
||||
(define-extern foreground-generic-merc (function draw-control pointer int pointer))
|
||||
(define-extern foreground-merc (function draw-control (inline-array pris-mtx) pointer int int object pointer))
|
||||
(define-extern foreground-emerc (function draw-control (inline-array pris-mtx) pointer object int int pointer))
|
||||
@@ -24460,7 +24469,7 @@
|
||||
;; generic-vu0 ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; (define-extern generic-vu0-block object) ;; vu-function
|
||||
(define-extern generic-vu0-block vu-function)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; generic-vu1 ;;
|
||||
@@ -24480,14 +24489,14 @@
|
||||
;; generic-effect ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; (define-extern *target-lock* object) ;; symbol
|
||||
(define-extern *target-lock* object) ;; symbol
|
||||
(define-extern *generic-consts* generic-consts)
|
||||
;; (define-extern generic-work-init function) ;; (function generic-dma-foreground-sink none)
|
||||
;; (define-extern generic-upload-vu0 function) ;; (function none)
|
||||
(define-extern generic-work-init (function generic-bucket-state none))
|
||||
(define-extern generic-upload-vu0 (function none))
|
||||
(define-extern upload-vu0-program (function vu-function pointer none))
|
||||
;; (define-extern generic-initialize-without-sync function)
|
||||
;; (define-extern generic-initialize function) ;; (function generic-dma-foreground-sink matrix vu-lights none)
|
||||
;; (define-extern generic-wrapup function) ;; (function generic-dma-foreground-sink none)
|
||||
(define-extern generic-initialize-without-sync (function matrix vu-lights none))
|
||||
(define-extern generic-initialize (function generic-bucket-state matrix vu-lights none))
|
||||
(define-extern generic-wrapup (function generic-bucket-state none))
|
||||
;; (define-extern generic-dma-from-spr function) ;; function
|
||||
;; (define-extern generic-light-proc function) ;; function
|
||||
;; (define-extern generic-envmap-proc function) ;; function
|
||||
@@ -24505,9 +24514,9 @@
|
||||
;; (define-extern generic-copy-vtx-dclr-dtex function) ;; function
|
||||
;; (define-extern generic-none function) ;; function
|
||||
;; (define-extern generic-none-dma-wait function) ;; function
|
||||
;; (define-extern *warp-data* object)
|
||||
;; (define-extern generic-warp-source-proc function)
|
||||
;; (define-extern generic-warp-source function)
|
||||
(define-extern *warp-data* object)
|
||||
(define-extern generic-warp-source-proc (function none))
|
||||
(define-extern generic-warp-source (function gsf-buffer none))
|
||||
;; (define-extern generic-warp-dest-proc function)
|
||||
;; (define-extern generic-warp-dest function)
|
||||
;; (define-extern generic-warp-envmap-dest function)
|
||||
@@ -24518,31 +24527,30 @@
|
||||
;; generic-merc ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
#|
|
||||
(deftype invinitdata (structure)
|
||||
((count uint8 :offset-assert 0)
|
||||
(init-data uint8 :offset-assert 1)
|
||||
(init-addr uint16 :offset-assert 2)
|
||||
)
|
||||
:pack-me
|
||||
:method-count-assert 9
|
||||
:size-assert #x4
|
||||
:flag-assert #x900000004
|
||||
)
|
||||
|#
|
||||
|
||||
;; (define-extern mercneric-vu0-block object) ;; vu-function
|
||||
;; (define-extern *inv-init-table* object) ;; (inline-array invinitdata)
|
||||
;; (define-extern generic-merc-init-asm function) ;; (function none)
|
||||
(define-extern mercneric-vu0-block vu-function)
|
||||
(define-extern *inv-init-table* (inline-array invinitdata))
|
||||
(define-extern generic-merc-init-asm (function none))
|
||||
;; (define-extern mercneric-matrix-asm function) ;; function
|
||||
;; (define-extern mercneric-shader-asm function) ;; function
|
||||
;; (define-extern mercneric-bittable-asm function) ;; function
|
||||
;; (define-extern mercneric-convert function) ;; function
|
||||
;; (define-extern high-speed-reject function) ;; (function none)
|
||||
;; (define-extern generic-translucent function)
|
||||
(define-extern generic-translucent (function gsf-buffer none))
|
||||
;; (define-extern generic-merc-query function)
|
||||
;; (define-extern generic-merc-death function)
|
||||
;; (define-extern generic-merc-execute-asm function) ;; (function none)
|
||||
;; (define-extern generic-merc-do-chain function)
|
||||
(define-extern generic-merc-do-chain (function mercneric-chain dma-buffer pointer))
|
||||
(define-extern generic-merc-execute-all (function dma-buffer none))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@@ -526,7 +526,8 @@
|
||||
"(anon-function 39 kidesc-states)": [4, 5],
|
||||
"(anon-function 56 hal2-course)": [4, 5],
|
||||
"(anon-function 58 hal2-course)": [74],
|
||||
"(method 142 gun-buoy)": [0, 2]
|
||||
"(method 142 gun-buoy)": [0, 2],
|
||||
"generic-merc-execute-all": [7, 15]
|
||||
},
|
||||
|
||||
// Sometimes the game might use format strings that are fetched dynamically,
|
||||
@@ -721,7 +722,26 @@
|
||||
"(method 53 squid)",
|
||||
"init-vortex-regs",
|
||||
"render-vortex-quad",
|
||||
"draw-large-polygon-vortex"
|
||||
"draw-large-polygon-vortex",
|
||||
"foreground-generic-merc",
|
||||
"generic-merc-init-asm",
|
||||
"mercneric-convert",
|
||||
"high-speed-reject",
|
||||
"generic-translucent",
|
||||
"generic-merc-query",
|
||||
"generic-merc-death",
|
||||
"generic-merc-execute-asm",
|
||||
"generic-merc-do-chain",
|
||||
"generic-light-proc",
|
||||
"generic-envmap-proc",
|
||||
"generic-prepare-dma-double",
|
||||
"generic-prepare-dma-single",
|
||||
"generic-warp-source-proc",
|
||||
"generic-warp-dest-proc",
|
||||
"generic-warp-dest",
|
||||
"generic-warp-envmap-dest",
|
||||
"generic-no-light-proc"
|
||||
|
||||
],
|
||||
|
||||
"mips2c_jump_table_functions": {},
|
||||
|
||||
@@ -1903,5 +1903,6 @@
|
||||
["L348", "vector"],
|
||||
["L337", "vector"]
|
||||
],
|
||||
"bigmap": [["L127", "(pointer int64)", 16]]
|
||||
"bigmap": [["L127", "(pointer int64)", 16]],
|
||||
"generic-merc": [["L172", "(inline-array invinitdata)", 8]]
|
||||
}
|
||||
|
||||
@@ -670,10 +670,64 @@
|
||||
[[324, 327], "v1", "dma-packet"]
|
||||
],
|
||||
"fx-copy-buf": [
|
||||
[[17, 22], "t3", "dma-packet"],
|
||||
[[2, 8], "a2", "dma-packet"],
|
||||
[[122, 127], "t0", "dma-packet"],
|
||||
[[24, 66], "t3", "dma-packet"]
|
||||
[[17, 23], "t3", "gs-gif-tag"],
|
||||
[27, "t3", "(pointer gs-reg)"],
|
||||
[30, "t3", "(pointer gs-reg)"],
|
||||
[32, "t3", "(pointer gs-frame)"],
|
||||
[34, "t3", "(pointer gs-reg)"],
|
||||
[36, "t3", "(pointer gs-zbuf)"],
|
||||
[38, "t3", "(pointer gs-reg)"],
|
||||
[40, "t3", "(pointer gs-test)"],
|
||||
[42, "t3", "(pointer gs-reg)"],
|
||||
[43, "t3", "(pointer gs-alpha)"],
|
||||
[44, "t3", "(pointer gs-reg)"],
|
||||
[46, "t3", "(pointer gs-prim)"],
|
||||
[48, "t3", "(pointer gs-reg)"],
|
||||
[50, "t3", "(pointer gs-rgbaq)"],
|
||||
[52, "t3", "(pointer gs-reg)"],
|
||||
[54, "t3", "(pointer gs-tex0)"],
|
||||
[56, "t3", "(pointer gs-reg)"],
|
||||
[57, "t3", "(pointer gs-tex1)"],
|
||||
[59, "t3", "(pointer gs-reg)"],
|
||||
[60, "t3", "(pointer gs-miptbp)"],
|
||||
[62, "t3", "(pointer gs-reg)"],
|
||||
[64, "t3", "(pointer gs-clamp)"],
|
||||
[[69, 78], "t4", "gs-gif-tag"], // uv, xyz2
|
||||
[87, "t6", "(pointer gs-uv2)"],
|
||||
[96, "t6", "(pointer gs-xyz)"],
|
||||
[103, "t6", "(pointer gs-uv2)"],
|
||||
[113, "t6", "(pointer gs-xyz)"],
|
||||
[[122, 128], "t0", "gs-gif-tag"],
|
||||
[132, "a3", "(pointer gs-reg)"], // 63, texflush
|
||||
[135, "a3", "(pointer gs-reg)"], // 76, frame
|
||||
[137, "a3", "(pointer gs-frame)"],
|
||||
[139, "a3", "(pointer gs-reg)"], // 78, zbuf
|
||||
[141, "a3", "(pointer gs-zbuf)"],
|
||||
[143, "a3", "(pointer gs-reg)"], // 71, test
|
||||
[145, "a3", "(pointer gs-test)"],
|
||||
[147, "a3", "(pointer gs-reg)"], // 66, alpha
|
||||
[148, "a3", "(pointer gs-alpha)"],
|
||||
[150, "a3", "(pointer gs-reg)"], // 1, rgbaq
|
||||
[152, "a3", "(pointer gs-rgbaq)"],
|
||||
[154, "a3", "(pointer gs-reg)"], // 6, tex0
|
||||
[156, "a3", "(pointer gs-tex0)"],
|
||||
[158, "a3", "(pointer gs-reg)"], // 20, tex1
|
||||
[160, "a3", "(pointer gs-tex1)"],
|
||||
[162, "a3", "(pointer gs-reg)"], // 52, miptbp
|
||||
[163, "a3", "(pointer gs-miptbp)"],
|
||||
[165, "a3", "(pointer gs-reg)"], // 8, clamp
|
||||
[174, "a3", "(pointer gs-clamp)"],
|
||||
[[192, 199], "v1", "(pointer uint64)"]
|
||||
],
|
||||
"foreground-generic-merc-add-fragments": [
|
||||
[[5, 54], "a3", "merc-fragment-control"],
|
||||
[[5, 57], "v1", "merc-fragment"],
|
||||
[28, "t4", "foreground-work"],
|
||||
[[16, 19], "a1", "dma-packet"],
|
||||
[21, "t3", "(pointer int32)"],
|
||||
[[38, 41], "a1", "dma-packet"],
|
||||
[[49, 52], "a1", "dma-packet"]
|
||||
],
|
||||
"(method 12 setting-control)": [[17, "s4", "connection"]],
|
||||
"(method 14 setting-control)": [[6, "v1", "connection"]],
|
||||
@@ -9804,6 +9858,8 @@
|
||||
[[47, 57], "v1", "(pointer uint32)"]
|
||||
],
|
||||
"generic-vu1-init-buf": [[[24, 32], "v1", "dma-packet"]],
|
||||
"generic-vu1-init-buf-special": [[[27, 37], "v1", "dma-packet"]],
|
||||
|
||||
"(method 11 drill-wall)": [
|
||||
[159, "v0", "(pointer actor-group)"],
|
||||
["_stack_", 16, "res-tag"]
|
||||
@@ -11207,5 +11263,39 @@
|
||||
[[12, 20], "a0", "vector4w"],
|
||||
[[20, 27], "a0", "vector4w"],
|
||||
[[29, 35], "v1", "vector4w"]
|
||||
],
|
||||
"generic-merc-execute-all": [
|
||||
[76, "v1", "generic-work"],
|
||||
[78, "v1", "generic-work"],
|
||||
[80, "v1", "generic-work"],
|
||||
[95, "a0", "generic-work"],
|
||||
|
||||
[143, "v1", "generic-work"],
|
||||
[145, "v1", "generic-work"],
|
||||
[147, "v1", "generic-work"]
|
||||
],
|
||||
|
||||
"generic-work-init": [
|
||||
[4, "a0", "generic-work"],
|
||||
[[9, 19], "a0", "generic-work"],
|
||||
[23, "a1", "generic-work"]
|
||||
],
|
||||
|
||||
"generic-initialize-without-sync": [
|
||||
[8, "a0", "generic-work"],
|
||||
[21, "a0", "generic-work"]
|
||||
],
|
||||
"generic-initialize": [
|
||||
[8, "a0", "generic-work"],
|
||||
[21, "a0", "generic-work"]
|
||||
],
|
||||
"generic-wrapup": [
|
||||
[1, "v1", "generic-work"],
|
||||
[4, "v1", "generic-work"]
|
||||
],
|
||||
"generic-warp-source": [
|
||||
[2, "at", "generic-work"]
|
||||
]
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -181,8 +181,8 @@ struct MercExtraInfo {
|
||||
};
|
||||
|
||||
constexpr int kTextureScrollEffectBit = 1;
|
||||
constexpr int kTransEffectBitJak1 = 2; // so far only confirmed for jak 1
|
||||
constexpr int kRippleEffectBit = 4; // true in jak 1 and jak 2
|
||||
constexpr int kTransEffectBit = 2; // true in 1 and 2
|
||||
constexpr int kRippleEffectBit = 4; // true in jak 1 and jak 2
|
||||
|
||||
struct MercEffect {
|
||||
//((frag-geo merc-fragment :offset-assert 0) ;; ?
|
||||
|
||||
@@ -885,7 +885,7 @@ ConvertedMercEffect convert_merc_effect(const MercEffect& input_effect,
|
||||
can_be_modified = true;
|
||||
}
|
||||
|
||||
if (version == GameVersion::Jak1 && (input_effect.effect_bits & kTransEffectBitJak1)) {
|
||||
if (input_effect.effect_bits & kTransEffectBit) {
|
||||
use_alpha_blend = true;
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -91,6 +91,8 @@ set(RUNTIME_SOURCE
|
||||
mips2c/jak2_functions/debug.cpp
|
||||
mips2c/jak2_functions/font.cpp
|
||||
mips2c/jak2_functions/foreground.cpp
|
||||
mips2c/jak2_functions/generic_merc.cpp
|
||||
mips2c/jak2_functions/generic_effect.cpp
|
||||
mips2c/jak2_functions/joint.cpp
|
||||
mips2c/jak2_functions/lights.cpp
|
||||
mips2c/jak2_functions/nav_control.cpp
|
||||
@@ -151,6 +153,7 @@ set(RUNTIME_SOURCE
|
||||
graphics/opengl_renderer/BucketRenderer.cpp
|
||||
graphics/opengl_renderer/CollideMeshRenderer.cpp
|
||||
graphics/opengl_renderer/debug_gui.cpp
|
||||
graphics/opengl_renderer/DepthCue.cpp
|
||||
graphics/opengl_renderer/DirectRenderer.cpp
|
||||
graphics/opengl_renderer/DirectRenderer2.cpp
|
||||
graphics/opengl_renderer/EyeRenderer.cpp
|
||||
@@ -168,7 +171,7 @@ set(RUNTIME_SOURCE
|
||||
graphics/opengl_renderer/SkyRenderer.cpp
|
||||
graphics/opengl_renderer/TextureUploadHandler.cpp
|
||||
graphics/opengl_renderer/VisDataHandler.cpp
|
||||
graphics/opengl_renderer/DepthCue.cpp
|
||||
graphics/opengl_renderer/Warp.cpp
|
||||
graphics/texture/jak1_tpage_dir.cpp
|
||||
graphics/texture/jak2_tpage_dir.cpp
|
||||
graphics/texture/TextureConverter.cpp
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "game/graphics/opengl_renderer/SkyRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/TextureUploadHandler.h"
|
||||
#include "game/graphics/opengl_renderer/VisDataHandler.h"
|
||||
#include "game/graphics/opengl_renderer/Warp.h"
|
||||
#include "game/graphics/opengl_renderer/background/Shrub.h"
|
||||
#include "game/graphics/opengl_renderer/background/TFragment.h"
|
||||
#include "game/graphics/opengl_renderer/background/Tie3.h"
|
||||
@@ -154,6 +155,9 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
|
||||
init_bucket_renderer<Merc2>(
|
||||
fmt::format("merc-l{}-pris", i), BucketCategory::MERC,
|
||||
GET_BUCKET_ID_FOR_LIST(BucketId::MERC_L0_PRIS, BucketId::MERC_L1_PRIS, i));
|
||||
init_bucket_renderer<Generic2>(
|
||||
fmt::format("gmerc-l{}-pris", i), BucketCategory::GENERIC,
|
||||
GET_BUCKET_ID_FOR_LIST(BucketId::GMERC_L0_PRIS, BucketId::GMERC_L1_PRIS, i));
|
||||
|
||||
init_bucket_renderer<TextureUploadHandler>(
|
||||
fmt::format("tex-l{}-pris2", i), BucketCategory::TEX,
|
||||
@@ -207,6 +211,7 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
|
||||
init_bucket_renderer<LightningRenderer>("effects", BucketCategory::OTHER, BucketId::EFFECTS);
|
||||
init_bucket_renderer<TextureUploadHandler>("tex-all-warp", BucketCategory::TEX,
|
||||
BucketId::TEX_ALL_WARP);
|
||||
init_bucket_renderer<Warp>("warp", BucketCategory::GENERIC, BucketId::GMERC_WARP);
|
||||
init_bucket_renderer<DirectRenderer>("debug-no-zbuf1", BucketCategory::OTHER,
|
||||
BucketId::DEBUG_NO_ZBUF1, 0x8000);
|
||||
init_bucket_renderer<TextureUploadHandler>("tex-all-map", BucketCategory::TEX,
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#include "Warp.h"
|
||||
|
||||
Warp::Warp(const std::string& name, int id) : BucketRenderer(name, id), m_generic(name, id) {}
|
||||
|
||||
Warp::~Warp() {}
|
||||
|
||||
void Warp::draw_debug_window() {
|
||||
m_generic.draw_debug_window();
|
||||
}
|
||||
|
||||
void Warp::render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) {
|
||||
m_fb_copier.copy_now(render_state->render_fb_w, render_state->render_fb_h,
|
||||
render_state->render_fb_x, render_state->render_fb_y,
|
||||
render_state->render_fb);
|
||||
render_state->texture_pool->move_existing_to_vram(m_warp_src_tex, m_tbp);
|
||||
m_generic.render_in_mode(dma, render_state, prof, Generic2::Mode::NORMAL);
|
||||
}
|
||||
|
||||
void Warp::init_shaders(ShaderLibrary& shaders) {
|
||||
m_generic.init_shaders(shaders);
|
||||
}
|
||||
|
||||
void Warp::init_textures(TexturePool& tex_pool, GameVersion version) {
|
||||
TextureInput in;
|
||||
// point to fb copier's texture.
|
||||
in.gpu_texture = m_fb_copier.texture();
|
||||
in.w = 32;
|
||||
in.h = 32;
|
||||
in.debug_page_name = "PC-WARP";
|
||||
in.debug_name = "PC-WARP";
|
||||
in.id = tex_pool.allocate_pc_port_texture(version);
|
||||
m_warp_src_tex = tex_pool.give_texture_and_load_to_vram(in, m_tbp);
|
||||
|
||||
m_generic.init_textures(tex_pool, version);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include "game/graphics/opengl_renderer/BucketRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/Warp.h"
|
||||
#include "game/graphics/opengl_renderer/foreground/Generic2.h"
|
||||
#include "game/graphics/opengl_renderer/opengl_utils.h"
|
||||
|
||||
class Warp : public BucketRenderer {
|
||||
public:
|
||||
Warp(const std::string& name, int id);
|
||||
~Warp();
|
||||
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
|
||||
void draw_debug_window() override;
|
||||
void init_shaders(ShaderLibrary& shaders) override;
|
||||
void init_textures(TexturePool& tex_pool, GameVersion version) override;
|
||||
|
||||
private:
|
||||
Generic2 m_generic;
|
||||
FramebufferCopier m_fb_copier;
|
||||
GpuTexture* m_warp_src_tex = nullptr;
|
||||
u32 m_tbp = 1216; // hack, jak 2
|
||||
};
|
||||
@@ -80,7 +80,11 @@ void Generic2::render_in_mode(DmaFollower& dma,
|
||||
auto p = prof.make_scoped_child("dma");
|
||||
switch (mode) {
|
||||
case Mode::NORMAL:
|
||||
process_dma(dma, render_state->next_bucket);
|
||||
if (render_state->version == GameVersion::Jak1) {
|
||||
process_dma_jak1(dma, render_state->next_bucket);
|
||||
} else {
|
||||
process_dma_jak2(dma, render_state->next_bucket);
|
||||
}
|
||||
break;
|
||||
case Mode::LIGHTNING:
|
||||
process_dma_lightning(dma, render_state->next_bucket);
|
||||
|
||||
@@ -13,10 +13,7 @@ class Generic2 : public BucketRenderer {
|
||||
~Generic2();
|
||||
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
|
||||
|
||||
enum class Mode {
|
||||
NORMAL,
|
||||
LIGHTNING,
|
||||
};
|
||||
enum class Mode { NORMAL, LIGHTNING };
|
||||
|
||||
void render_in_mode(DmaFollower& dma,
|
||||
SharedRenderState* render_state,
|
||||
@@ -45,8 +42,9 @@ class Generic2 : public BucketRenderer {
|
||||
void draws_to_buckets();
|
||||
void reset_buffers();
|
||||
void process_matrices();
|
||||
void process_dma(DmaFollower& dma, u32 next_bucket);
|
||||
void process_dma_jak1(DmaFollower& dma, u32 next_bucket);
|
||||
void process_dma_lightning(DmaFollower& dma, u32 next_bucket);
|
||||
void process_dma_jak2(DmaFollower& dma, u32 next_bucket);
|
||||
void setup_draws(bool enable_at);
|
||||
void do_draws(SharedRenderState* render_state, ScopedProfilerNode& prof);
|
||||
void do_draws_for_alpha(SharedRenderState* render_state,
|
||||
@@ -211,5 +209,6 @@ class Generic2 : public BucketRenderer {
|
||||
GLuint alpha_reject, color_mult, fog_color, scale, mat_23, mat_32, mat_33, fog_consts,
|
||||
hvdf_offset;
|
||||
GLuint gfx_hack_no_tex;
|
||||
GLuint warp_sample_mode;
|
||||
} m_ogl;
|
||||
};
|
||||
|
||||
@@ -312,7 +312,7 @@ u32 Generic2::handle_fragments_after_unpack_v4_32(const u8* data,
|
||||
return off;
|
||||
}
|
||||
|
||||
void Generic2::process_dma(DmaFollower& dma, u32 next_bucket) {
|
||||
void Generic2::process_dma_jak1(DmaFollower& dma, u32 next_bucket) {
|
||||
reset_buffers();
|
||||
|
||||
// handle the stuff at the beginning.
|
||||
@@ -391,6 +391,137 @@ bool is_nop_zero(const DmaTransfer& xf) {
|
||||
xf.vifcode1().kind == VifCode::Kind::NOP;
|
||||
}
|
||||
|
||||
bool is_jak2_end(const DmaTransfer& xf) {
|
||||
return xf.size_bytes == 160 && xf.vifcode0().kind == VifCode::Kind::FLUSHA &&
|
||||
xf.vifcode1().kind == VifCode::Kind::DIRECT;
|
||||
}
|
||||
|
||||
void Generic2::process_dma_jak2(DmaFollower& dma, u32 next_bucket) {
|
||||
reset_buffers();
|
||||
auto first_data = dma.read_and_advance();
|
||||
|
||||
// handle the stuff at the beginning.
|
||||
// if the engine didn't run the generic renderer setup function, this bucket will end here.
|
||||
if (is_nop_zero(first_data) && next_bucket == dma.current_tag_offset()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// next, the generic setup. This reads the data generated by generic-init-buf.
|
||||
auto v0k = first_data.vifcode0().kind;
|
||||
ASSERT((v0k == VifCode::Kind::MARK || v0k == VifCode::Kind::NOP) &&
|
||||
first_data.vifcode1().kind == VifCode::Kind::NOP);
|
||||
|
||||
// setup packet 1 is GS settings
|
||||
auto direct_setup = dma.read_and_advance();
|
||||
ASSERT(direct_setup.size_bytes == 32 && direct_setup.vifcode0().kind == VifCode::Kind::NOP &&
|
||||
direct_setup.vifcode1().kind == VifCode::Kind::DIRECT);
|
||||
u64 zbuf_val;
|
||||
memcpy(&zbuf_val, direct_setup.data + 16, 8);
|
||||
m_drawing_config.zmsk = GsZbuf(zbuf_val).zmsk();
|
||||
|
||||
auto constants = dma.read_and_advance();
|
||||
ASSERT(constants.size_bytes == 128);
|
||||
ASSERT(constants.vifcode0().kind == VifCode::Kind::STCYCL);
|
||||
ASSERT(constants.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
|
||||
memcpy(&m_drawing_config.pfog0, constants.data + 0, 4);
|
||||
memcpy(&m_drawing_config.fog_min, constants.data + 4, 4);
|
||||
memcpy(&m_drawing_config.fog_max, constants.data + 8, 4);
|
||||
memcpy(m_drawing_config.hvdf_offset.data(), constants.data + 32, 16);
|
||||
|
||||
auto vu_setup = dma.read_and_advance();
|
||||
ASSERT(vu_setup.size_bytes == 32);
|
||||
// this sets offset/base to 0, sets row to 0 and runs program 0 to set up VU regs
|
||||
// todo: any setup required from running this program.
|
||||
|
||||
// if there was nothing rendered by generic on this frame in this bucket, the bucket will end
|
||||
// here.
|
||||
if (is_nop_zero(first_data) && next_bucket == dma.current_tag_offset()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 0: NOP NOP
|
||||
|
||||
// loop over "fragments"
|
||||
// each "fragment" consists of a series of uploads, followed by a MSCAL VIFCODE that runs
|
||||
// VU program that does vertex transformation and sends to the GS.
|
||||
Fragment* continued_fragment = nullptr;
|
||||
|
||||
auto vif_transfer = dma.read_and_advance();
|
||||
while (is_nop_zero(vif_transfer)) {
|
||||
vif_transfer = dma.read_and_advance();
|
||||
}
|
||||
|
||||
while (!is_jak2_end(vif_transfer)) {
|
||||
if (continued_fragment) {
|
||||
ASSERT(vif_transfer.vifcode0().kind == VifCode::Kind::NOP);
|
||||
auto up = vif_transfer.vifcode1();
|
||||
ASSERT(up.kind == VifCode::Kind::UNPACK_V3_32);
|
||||
ASSERT(vif_transfer.size_bytes * 4 / 48 == up.num);
|
||||
ASSERT(up.num == continued_fragment->vtx_count);
|
||||
unpack_vtx_positions(&m_verts[continued_fragment->vtx_idx], vif_transfer.data,
|
||||
continued_fragment->vtx_count);
|
||||
continued_fragment = nullptr;
|
||||
auto call = dma.read_and_advance();
|
||||
ASSERT(call.size_bytes == 0);
|
||||
ASSERT(call.vifcode1().kind == VifCode::Kind::MSCAL);
|
||||
|
||||
if (check_for_end_of_generic_data(dma, next_bucket)) {
|
||||
return;
|
||||
}
|
||||
|
||||
} else {
|
||||
auto v1 = vif_transfer.vifcode1();
|
||||
if (vif_transfer.vifcode0().kind != VifCode::Kind::STCYCL ||
|
||||
vif_transfer.vifcode1().kind != VifCode::Kind::UNPACK_V4_32) {
|
||||
fmt::print("failing tag: {} {} {}\n", vif_transfer.vifcode0().print(),
|
||||
vif_transfer.vifcode1().print(), vif_transfer.size_bytes);
|
||||
}
|
||||
ASSERT(vif_transfer.vifcode0().kind == VifCode::Kind::STCYCL);
|
||||
ASSERT(v1.kind == VifCode::Kind::UNPACK_V4_32);
|
||||
u32 unpack_bytes = v1.num * 16;
|
||||
auto& frag = next_frag();
|
||||
u32 off = handle_fragments_after_unpack_v4_32(vif_transfer.data, 0, unpack_bytes,
|
||||
vif_transfer.size_bytes, &frag, false);
|
||||
|
||||
if (check_for_end_of_generic_data(dma, next_bucket)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (off < vif_transfer.size_bytes) {
|
||||
u32 stcycl_reset;
|
||||
memcpy(&stcycl_reset, vif_transfer.data + off, 4);
|
||||
ASSERT(VifCode(stcycl_reset).kind == VifCode::Kind::STCYCL);
|
||||
off += 4;
|
||||
// while (off < vif_transfer.size_bytes) {
|
||||
u32 next;
|
||||
memcpy(&next, vif_transfer.data + off, 4);
|
||||
VifCode next_unpack(next);
|
||||
|
||||
ASSERT(next_unpack.kind == VifCode::Kind::UNPACK_V4_32);
|
||||
|
||||
auto& continue_frag = next_frag();
|
||||
off = handle_fragments_after_unpack_v4_32(vif_transfer.data, off, next_unpack.num * 16,
|
||||
vif_transfer.size_bytes, &continue_frag, true);
|
||||
continued_fragment = &continue_frag;
|
||||
ASSERT(off == vif_transfer.size_bytes);
|
||||
// }
|
||||
}
|
||||
}
|
||||
vif_transfer = dma.read_and_advance();
|
||||
while (is_nop_zero(vif_transfer)) {
|
||||
vif_transfer = dma.read_and_advance();
|
||||
}
|
||||
}
|
||||
|
||||
// ending:
|
||||
// 0: NOP NOP
|
||||
// 160: FLUSHA DIRECT
|
||||
// 0: NOP NOP
|
||||
auto end = dma.read_and_advance();
|
||||
(void)end;
|
||||
ASSERT(next_bucket == dma.current_tag_offset());
|
||||
}
|
||||
|
||||
void unpack_vertex(Generic2::Vertex* out, const u8* in, int count) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
// st:
|
||||
|
||||
@@ -80,6 +80,7 @@ void Generic2::init_shaders(ShaderLibrary& shaders) {
|
||||
m_ogl.fog_consts = glGetUniformLocation(id, "fog_constants");
|
||||
m_ogl.hvdf_offset = glGetUniformLocation(id, "hvdf_offset");
|
||||
m_ogl.gfx_hack_no_tex = glGetUniformLocation(id, "gfx_hack_no_tex");
|
||||
m_ogl.warp_sample_mode = glGetUniformLocation(id, "warp_sample_mode");
|
||||
}
|
||||
|
||||
void Generic2::opengl_bind_and_setup_proj(SharedRenderState* render_state) {
|
||||
@@ -256,6 +257,12 @@ void Generic2::setup_opengl_tex(u16 unit,
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
}
|
||||
|
||||
if (render_state->version == GameVersion::Jak2 && tbp_to_lookup == 1216) {
|
||||
glUniform1ui(m_ogl.warp_sample_mode, 1);
|
||||
} else {
|
||||
glUniform1ui(m_ogl.warp_sample_mode, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void Generic2::do_draws_for_alpha(SharedRenderState* render_state,
|
||||
|
||||
@@ -149,3 +149,65 @@ void FullScreenDraw::draw(const math::Vector4f& color,
|
||||
prof.add_draw_call();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
}
|
||||
|
||||
FramebufferCopier::FramebufferCopier() {
|
||||
glGenFramebuffers(1, &m_fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
||||
|
||||
glGenTextures(1, &m_fbo_texture);
|
||||
glBindTexture(GL_TEXTURE_2D, m_fbo_texture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_fbo_width, m_fbo_height, 0, GL_RGB, GL_UNSIGNED_BYTE,
|
||||
NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_fbo_texture, 0);
|
||||
|
||||
ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
FramebufferCopier::~FramebufferCopier() {
|
||||
glDeleteTextures(1, &m_fbo_texture);
|
||||
glDeleteFramebuffers(1, &m_fbo);
|
||||
}
|
||||
|
||||
void FramebufferCopier::copy_now(int render_fb_w,
|
||||
int render_fb_h,
|
||||
int render_fb_x,
|
||||
int render_fb_y,
|
||||
GLuint render_fb) {
|
||||
if (m_fbo_width != render_fb_w || m_fbo_height != render_fb_h) {
|
||||
m_fbo_width = render_fb_w;
|
||||
m_fbo_height = render_fb_h;
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, m_fbo_texture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_fbo_width, m_fbo_height, 0, GL_RGB, GL_UNSIGNED_BYTE,
|
||||
NULL);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, render_fb);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
|
||||
|
||||
glBlitFramebuffer(render_fb_x, // srcX0
|
||||
render_fb_y, // srcY0
|
||||
render_fb_x + render_fb_w, // srcX1
|
||||
render_fb_y + render_fb_h, // srcY1
|
||||
0, // dstX0
|
||||
0, // dstY0
|
||||
m_fbo_width, // dstX1
|
||||
m_fbo_height, // dstY1
|
||||
GL_COLOR_BUFFER_BIT, // mask
|
||||
GL_NEAREST // filter
|
||||
);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, render_fb);
|
||||
}
|
||||
@@ -56,4 +56,22 @@ class FullScreenDraw {
|
||||
private:
|
||||
GLuint m_vao;
|
||||
GLuint m_vertex_buffer;
|
||||
};
|
||||
|
||||
class FramebufferCopier {
|
||||
public:
|
||||
FramebufferCopier();
|
||||
~FramebufferCopier();
|
||||
FramebufferCopier(const FramebufferCopier&) = delete;
|
||||
FramebufferCopier& operator=(const FramebufferCopier&) = delete;
|
||||
void copy_now(int render_fb_w,
|
||||
int render_fb_h,
|
||||
int render_fb_x,
|
||||
int render_fb_y,
|
||||
GLuint render_fb);
|
||||
u64 texture() const { return m_fbo_texture; }
|
||||
|
||||
private:
|
||||
GLuint m_fbo = 0, m_fbo_texture = 0;
|
||||
int m_fbo_width = 640, m_fbo_height = 480;
|
||||
};
|
||||
@@ -11,6 +11,7 @@ uniform vec4 scale;
|
||||
uniform float mat_23;
|
||||
uniform float mat_33;
|
||||
uniform vec4 hvdf_offset;
|
||||
uniform uint warp_sample_mode;
|
||||
|
||||
out vec2 tex_coord;
|
||||
|
||||
@@ -19,6 +20,9 @@ out float fog;
|
||||
|
||||
out flat uvec2 tex_info;
|
||||
|
||||
const float warp_off = 1.f - (416.f/512.f);
|
||||
const float warp_mult = 512.f/416.f;
|
||||
|
||||
void main() {
|
||||
// lq.xy vf22, 0(vi10) texture load?
|
||||
// lq_buffer(Mask::xy, vu.vf22, vu.vi10);
|
||||
@@ -50,7 +54,11 @@ void main() {
|
||||
|
||||
// itof12.xyz vf18, vf22 texture int to float
|
||||
// vu.vf18.itof12(Mask::xyz, vu.vf22);
|
||||
tex_coord = tex_coord_in / 4096.f; // TODO, more and wrong.
|
||||
tex_coord = tex_coord_in / 4096.f;
|
||||
|
||||
if (warp_sample_mode == 1) {
|
||||
tex_coord = vec2(tex_coord.x, (1.0f - tex_coord.y - warp_off) * warp_mult);
|
||||
}
|
||||
|
||||
// mul.xyz vf12, vf12, Q persepective divide
|
||||
// gen.vtx_p0.mul(Mask::xyz, gen.vtx_p0, vu.Q);
|
||||
|
||||
@@ -679,4 +679,667 @@ void link() {
|
||||
} // namespace Mips2C
|
||||
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jak2/kscheme.h"
|
||||
using ::jak2::intern_from_c;
|
||||
namespace Mips2C::jak2 {
|
||||
namespace foreground_generic_merc {
|
||||
struct Cache {
|
||||
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
||||
void* foreground; // *foreground*
|
||||
void* merc_global_stats; // *merc-global-stats*
|
||||
void* foreground_generic_merc_add_fragments; // foreground-generic-merc-add-fragments
|
||||
void* foreground_generic_merc_death; // foreground-generic-merc-death
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -112); // daddiu sp, sp, -112
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s1, 16, sp); // sq s1, 16(sp)
|
||||
c->sq(s2, 32, sp); // sq s2, 32(sp)
|
||||
c->sq(s3, 48, sp); // sq s3, 48(sp)
|
||||
c->sq(s4, 64, sp); // sq s4, 64(sp)
|
||||
c->sq(s5, 80, sp); // sq s5, 80(sp)
|
||||
c->sq(gp, 96, sp); // sq gp, 96(sp)
|
||||
c->mov64(gp, a0); // or gp, a0, r0
|
||||
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
|
||||
c->daddu(v1, r0, v1); // daddu v1, r0, v1
|
||||
c->sw(a2, 16, v1); // sw a2, 16(v1)
|
||||
c->sw(a1, 20, v1); // sw a1, 20(v1)
|
||||
c->lb(v1, 78, gp); // lb v1, 78(gp)
|
||||
c->dsll(v1, v1, 3); // dsll v1, v1, 3
|
||||
c->daddu(v1, gp, v1); // daddu v1, gp, v1
|
||||
c->lwu(s5, 28, v1); // lwu s5, 28(v1)
|
||||
c->daddiu(s3, a1, 16); // daddiu s3, a1, 16
|
||||
c->addiu(s4, r0, 0); // addiu s4, r0, 0
|
||||
//beq r0, r0, L153 // beq r0, r0, L153
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_77; // branch always
|
||||
|
||||
|
||||
block_1:
|
||||
c->load_symbol2(v1, cache.foreground); // lw v1, *foreground*(s7)
|
||||
c->daddiu(v1, v1, 2384); // daddiu v1, v1, 2384
|
||||
c->dsll(a0, s4, 3); // dsll a0, s4, 3
|
||||
c->daddu(a0, v1, a0); // daddu a0, v1, a0
|
||||
c->lbu(a0, 130, a0); // lbu a0, 130(a0)
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->daddiu(a1, s7, 4); // daddiu a1, s7, 4
|
||||
c->movz(a1, s7, a0); // movz a1, s7, a0
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a1))) {// beql s7, a1, L120
|
||||
c->mov64(v1, a1); // or v1, a1, r0
|
||||
goto block_4;
|
||||
}
|
||||
|
||||
c->dsll(a0, s4, 3); // dsll a0, s4, 3
|
||||
c->daddu(v1, v1, a0); // daddu v1, v1, a0
|
||||
c->lbu(v1, 128, v1); // lbu v1, 128(v1)
|
||||
c->daddiu(a0, v1, -2); // daddiu a0, v1, -2
|
||||
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
||||
c->movn(v1, s7, a0); // movn v1, s7, a0
|
||||
|
||||
block_4:
|
||||
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L152
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
if (bc) {goto block_76;} // branch non-likely
|
||||
|
||||
c->mov64(s1, s3); // or s1, s3, r0
|
||||
c->dsll(v1, s4, 5); // dsll v1, s4, 5
|
||||
c->daddiu(v1, v1, 156); // daddiu v1, v1, 156
|
||||
c->daddu(s2, v1, s5); // daddu s2, v1, s5
|
||||
c->load_symbol2(v1, cache.merc_global_stats); // lw v1, *merc-global-stats*(s7)
|
||||
c->daddiu(v1, v1, 32); // daddiu v1, v1, 32
|
||||
c->lhu(a0, 2, v1); // lhu a0, 2(v1)
|
||||
c->lhu(a1, 18, s2); // lhu a1, 18(s2)
|
||||
c->daddu(a0, a0, a1); // daddu a0, a0, a1
|
||||
c->sh(a0, 2, v1); // sh a0, 2(v1)
|
||||
c->lwu(a0, 4, v1); // lwu a0, 4(v1)
|
||||
c->lhu(a1, 22, s2); // lhu a1, 22(s2)
|
||||
c->daddu(a0, a0, a1); // daddu a0, a0, a1
|
||||
c->sw(a0, 4, v1); // sw a0, 4(v1)
|
||||
c->lwu(a0, 8, v1); // lwu a0, 8(v1)
|
||||
c->lhu(a1, 24, s2); // lhu a1, 24(s2)
|
||||
c->daddu(a0, a0, a1); // daddu a0, a0, a1
|
||||
c->sw(a0, 8, v1); // sw a0, 8(v1)
|
||||
c->load_symbol2(v1, cache.foreground); // lw v1, *foreground*(s7)
|
||||
c->daddiu(v1, v1, 2384); // daddiu v1, v1, 2384
|
||||
c->daddiu(a1, s1, 16); // daddiu a1, s1, 16
|
||||
c->daddu(a2, r0, v1); // daddu a2, r0, v1
|
||||
c->addiu(a0, r0, 7); // addiu a0, r0, 7
|
||||
// nop // sll r0, r0, 0
|
||||
c->daddiu(a3, a0, -4); // daddiu a3, a0, -4
|
||||
c->mov64(a1, a1); // or a1, a1, r0
|
||||
bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L122
|
||||
c->mov64(a2, a2); // or a2, a2, r0
|
||||
if (bc) {goto block_7;} // branch non-likely
|
||||
|
||||
|
||||
block_6:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(t2, 0, a2); // lq t2, 0(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(a3, 16, a2); // lq a3, 16(a2)
|
||||
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
||||
c->lq(t0, 32, a2); // lq t0, 32(a2)
|
||||
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
|
||||
c->lq(t1, 48, a2); // lq t1, 48(a2)
|
||||
c->daddiu(a2, a2, 64); // daddiu a2, a2, 64
|
||||
c->sq(t2, -64, a1); // sq t2, -64(a1)
|
||||
c->daddiu(t2, a0, -4); // daddiu t2, a0, -4
|
||||
c->sq(a3, -48, a1); // sq a3, -48(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sq(t0, -32, a1); // sq t0, -32(a1)
|
||||
bc = ((s64)c->sgpr64(t2)) >= 0; // bgez t2, L121
|
||||
c->sq(t1, -16, a1); // sq t1, -16(a1)
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
|
||||
block_7:
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_12;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_12;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_12;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L123
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_12;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
|
||||
block_12:
|
||||
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
|
||||
c->daddiu(a1, s1, 128); // daddiu a1, s1, 128
|
||||
c->daddiu(a2, s5, 28); // daddiu a2, s5, 28
|
||||
c->addiu(a0, r0, 8); // addiu a0, r0, 8
|
||||
c->daddiu(a3, a0, -4); // daddiu a3, a0, -4
|
||||
c->mov64(a1, a1); // or a1, a1, r0
|
||||
bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L125
|
||||
c->mov64(a2, a2); // or a2, a2, r0
|
||||
if (bc) {goto block_14;} // branch non-likely
|
||||
|
||||
|
||||
block_13:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(t2, 0, a2); // lq t2, 0(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(a3, 16, a2); // lq a3, 16(a2)
|
||||
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
||||
c->lq(t0, 32, a2); // lq t0, 32(a2)
|
||||
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
|
||||
c->lq(t1, 48, a2); // lq t1, 48(a2)
|
||||
c->daddiu(a2, a2, 64); // daddiu a2, a2, 64
|
||||
c->sq(t2, -64, a1); // sq t2, -64(a1)
|
||||
c->daddiu(t2, a0, -4); // daddiu t2, a0, -4
|
||||
c->sq(a3, -48, a1); // sq a3, -48(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sq(t0, -32, a1); // sq t0, -32(a1)
|
||||
bc = ((s64)c->sgpr64(t2)) >= 0; // bgez t2, L124
|
||||
c->sq(t1, -16, a1); // sq t1, -16(a1)
|
||||
if (bc) {goto block_13;} // branch non-likely
|
||||
|
||||
|
||||
block_14:
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_19;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_19;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_19;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L126
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_19;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
|
||||
block_19:
|
||||
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
|
||||
c->lbu(a0, 17, s2); // lbu a0, 17(s2)
|
||||
c->andi(a1, a0, 32); // andi a1, a0, 32
|
||||
bc = c->sgpr64(a1) == 0; // beq a1, r0, L127
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_21;} // branch non-likely
|
||||
|
||||
c->addiu(a0, r0, 1); // addiu a0, r0, 1
|
||||
c->sb(a0, 182, s1); // sb a0, 182(s1)
|
||||
//beq r0, r0, L129 // beq r0, r0, L129
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_24; // branch always
|
||||
|
||||
|
||||
block_21:
|
||||
c->andi(a0, a0, 64); // andi a0, a0, 64
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L128
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_23;} // branch non-likely
|
||||
|
||||
c->addiu(a0, r0, 2); // addiu a0, r0, 2
|
||||
c->sb(a0, 182, s1); // sb a0, 182(s1)
|
||||
//beq r0, r0, L129 // beq r0, r0, L129
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_24; // branch always
|
||||
|
||||
|
||||
block_23:
|
||||
c->sb(r0, 182, s1); // sb r0, 182(s1)
|
||||
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
|
||||
|
||||
block_24:
|
||||
c->lbu(a0, 26, s2); // lbu a0, 26(s2)
|
||||
c->lbu(a1, 182, s1); // lbu a1, 182(s1)
|
||||
bc = c->sgpr64(a1) == 0; // beq a1, r0, L130
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_26;} // branch non-likely
|
||||
|
||||
c->addiu(a0, r0, 2432); // addiu a0, r0, 2432
|
||||
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
|
||||
c->daddu(a0, a0, a1); // daddu a0, a0, a1
|
||||
//beq r0, r0, L131 // beq r0, r0, L131
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_27; // branch always
|
||||
|
||||
|
||||
block_26:
|
||||
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
|
||||
c->lwu(a1, 52, a1); // lwu a1, 52(a1)
|
||||
c->daddiu(a1, a1, 24); // daddiu a1, a1, 24
|
||||
c->addiu(a2, r0, 48); // addiu a2, r0, 48
|
||||
c->multu3(a0, a2, a0); // multu3 a0, a2, a0
|
||||
c->daddu(a0, a1, a0); // daddu a0, a1, a0
|
||||
|
||||
block_27:
|
||||
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
|
||||
c->sw(a0, 48, a1); // sw a0, 48(a1)
|
||||
c->lwu(a1, 4, a0); // lwu a1, 4(a0)
|
||||
bc = c->sgpr64(a1) == 0; // beq a1, r0, L132
|
||||
c->mov64(a2, s7); // or a2, s7, r0
|
||||
if (bc) {goto block_29;} // branch non-likely
|
||||
|
||||
c->sw(s1, 0, a1); // sw s1, 0(a1)
|
||||
c->mov64(a1, s1); // or a1, s1, r0
|
||||
|
||||
block_29:
|
||||
c->lwu(a1, 0, a0); // lwu a1, 0(a0)
|
||||
bc = c->sgpr64(a1) != 0; // bne a1, r0, L133
|
||||
c->mov64(a1, s7); // or a1, s7, r0
|
||||
if (bc) {goto block_31;} // branch non-likely
|
||||
|
||||
c->sw(s1, 0, a0); // sw s1, 0(a0)
|
||||
c->mov64(a1, s1); // or a1, s1, r0
|
||||
|
||||
block_31:
|
||||
c->daddiu(a1, s1, 12); // daddiu a1, s1, 12
|
||||
c->sw(a1, 4, a0); // sw a1, 4(a0)
|
||||
c->dsll(a0, s4, 3); // dsll a0, s4, 3
|
||||
c->daddiu(a0, a0, 124); // daddiu a0, a0, 124
|
||||
c->daddu(a0, a0, v1); // daddu a0, a0, v1
|
||||
c->lwu(a1, 0, a0); // lwu a1, 0(a0)
|
||||
c->sw(a1, 160, s1); // sw a1, 160(s1)
|
||||
c->lbu(a1, 5, a0); // lbu a1, 5(a0)
|
||||
c->sb(a1, 183, s1); // sb a1, 183(s1)
|
||||
c->lbu(a0, 7, a0); // lbu a0, 7(a0)
|
||||
c->sb(a0, 186, s1); // sb a0, 186(s1)
|
||||
c->lw(v1, 112, v1); // lw v1, 112(v1)
|
||||
c->sb(v1, 168, s1); // sb v1, 168(s1)
|
||||
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
|
||||
c->lwu(v1, 16, v1); // lwu v1, 16(v1)
|
||||
c->sb(v1, 169, s1); // sb v1, 169(s1)
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L134
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
if (bc) {goto block_33;} // branch non-likely
|
||||
|
||||
c->sb(r0, 168, s1); // sb r0, 168(s1)
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
|
||||
block_33:
|
||||
c->sb(r0, 170, s1); // sb r0, 170(s1)
|
||||
c->addiu(v1, r0, 1); // addiu v1, r0, 1
|
||||
c->sb(v1, 171, s1); // sb v1, 171(s1)
|
||||
c->sh(r0, 172, s1); // sh r0, 172(s1)
|
||||
c->addiu(v1, r0, 255); // addiu v1, r0, 255
|
||||
c->sb(v1, 184, s1); // sb v1, 184(s1)
|
||||
c->addiu(v1, r0, 0); // addiu v1, r0, 0
|
||||
c->lbu(a0, 17, s2); // lbu a0, 17(s2)
|
||||
c->andi(a0, a0, 2); // andi a0, a0, 2
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L135
|
||||
c->mov64(a0, s7); // or a0, s7, r0
|
||||
if (bc) {goto block_35;} // branch non-likely
|
||||
|
||||
c->addiu(v1, r0, 1); // addiu v1, r0, 1
|
||||
c->mov64(a0, v1); // or a0, v1, r0
|
||||
|
||||
block_35:
|
||||
c->lhu(a0, 4, gp); // lhu a0, 4(gp)
|
||||
c->andi(a0, a0, 1024); // andi a0, a0, 1024
|
||||
if (((s64)c->sgpr64(a0)) != ((s64)0)) { // bnel a0, r0, L136
|
||||
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
||||
goto block_40;
|
||||
}
|
||||
|
||||
c->lhu(a0, 4, gp); // lhu a0, 4(gp)
|
||||
c->andi(a0, a0, 2048); // andi a0, a0, 2048
|
||||
if (((s64)c->sgpr64(a0)) == ((s64)0)) { // beql a0, r0, L136
|
||||
c->mov64(a0, s7); // or a0, s7, r0
|
||||
goto block_40;
|
||||
}
|
||||
|
||||
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
||||
c->lbu(a1, 17, s2); // lbu a1, 17(s2)
|
||||
c->andi(a1, a1, 64); // andi a1, a1, 64
|
||||
c->movz(a0, s7, a1); // movz a0, s7, a1
|
||||
|
||||
block_40:
|
||||
bc = c->sgpr64(s7) == c->sgpr64(a0); // beq s7, a0, L137
|
||||
c->mov64(a0, s7); // or a0, s7, r0
|
||||
if (bc) {goto block_42;} // branch non-likely
|
||||
|
||||
c->lbu(v1, 206, gp); // lbu v1, 206(gp)
|
||||
c->sb(v1, 184, s1); // sb v1, 184(s1)
|
||||
c->addiu(v1, r0, 1); // addiu v1, r0, 1
|
||||
c->mov64(a0, v1); // or a0, v1, r0
|
||||
|
||||
block_42:
|
||||
c->sb(v1, 180, s1); // sb v1, 180(s1)
|
||||
c->lbu(v1, 17, s2); // lbu v1, 17(s2)
|
||||
c->andi(v1, v1, 64); // andi v1, v1, 64
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L138
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_44;} // branch non-likely
|
||||
|
||||
c->addiu(v1, r0, 4); // addiu v1, r0, 4
|
||||
c->sb(v1, 185, s1); // sb v1, 185(s1)
|
||||
//beq r0, r0, L140 // beq r0, r0, L140
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_47; // branch always
|
||||
|
||||
|
||||
block_44:
|
||||
c->lhu(v1, 4, gp); // lhu v1, 4(gp)
|
||||
c->andi(v1, v1, 8192); // andi v1, v1, 8192
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L139
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_46;} // branch non-likely
|
||||
|
||||
c->addiu(v1, r0, 4); // addiu v1, r0, 4
|
||||
c->sb(v1, 185, s1); // sb v1, 185(s1)
|
||||
//beq r0, r0, L140 // beq r0, r0, L140
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_47; // branch always
|
||||
|
||||
|
||||
block_46:
|
||||
c->sb(r0, 185, s1); // sb r0, 185(s1)
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
|
||||
block_47:
|
||||
c->lbu(v1, 92, gp); // lbu v1, 92(gp)
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L141
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
if (bc) {goto block_49;} // branch non-likely
|
||||
|
||||
c->load_symbol2(t9, cache.foreground_generic_merc_death);// lw t9, foreground-generic-merc-death(s7)
|
||||
c->mov64(a0, gp); // or a0, gp, r0
|
||||
c->mov64(a1, s1); // or a1, s1, r0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(v1, v0); // or v1, v0, r0
|
||||
|
||||
block_49:
|
||||
c->sw(r0, 164, s1); // sw r0, 164(s1)
|
||||
c->lbu(v1, 17, s2); // lbu v1, 17(s2)
|
||||
c->andi(v1, v1, 4); // andi v1, v1, 4
|
||||
if (((s64)c->sgpr64(v1)) == ((s64)0)) { // beql v1, r0, L142
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
goto block_54;
|
||||
}
|
||||
|
||||
c->lwu(v1, 80, gp); // lwu v1, 80(gp)
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L142
|
||||
c->mov64(v1, v1); // or v1, v1, r0
|
||||
goto block_54;
|
||||
}
|
||||
|
||||
c->lwu(v1, 80, gp); // lwu v1, 80(gp)
|
||||
c->lwu(v1, 28, v1); // lwu v1, 28(v1)
|
||||
|
||||
block_54:
|
||||
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L143
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
if (bc) {goto block_56;} // branch non-likely
|
||||
|
||||
c->lwu(v1, 80, gp); // lwu v1, 80(gp)
|
||||
c->lwu(v1, 32, v1); // lwu v1, 32(v1)
|
||||
c->sw(v1, 164, s1); // sw v1, 164(s1)
|
||||
|
||||
block_56:
|
||||
c->daddiu(a0, s1, 256); // daddiu a0, s1, 256
|
||||
c->mov64(a1, s2); // or a1, s2, r0
|
||||
c->addiu(v1, r0, 2); // addiu v1, r0, 2
|
||||
c->daddiu(a2, v1, -4); // daddiu a2, v1, -4
|
||||
c->mov64(a0, a0); // or a0, a0, r0
|
||||
bc = ((s64)c->sgpr64(a2)) < 0; // bltz a2, L145
|
||||
c->mov64(a1, a1); // or a1, a1, r0
|
||||
if (bc) {goto block_58;} // branch non-likely
|
||||
|
||||
|
||||
block_57:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(t1, 0, a1); // lq t1, 0(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(a2, 16, a1); // lq a2, 16(a1)
|
||||
c->daddiu(v1, v1, -4); // daddiu v1, v1, -4
|
||||
c->lq(a3, 32, a1); // lq a3, 32(a1)
|
||||
c->daddiu(a0, a0, 64); // daddiu a0, a0, 64
|
||||
c->lq(t0, 48, a1); // lq t0, 48(a1)
|
||||
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
|
||||
c->sq(t1, -64, a0); // sq t1, -64(a0)
|
||||
c->daddiu(t1, v1, -4); // daddiu t1, v1, -4
|
||||
c->sq(a2, -48, a0); // sq a2, -48(a0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sq(a3, -32, a0); // sq a3, -32(a0)
|
||||
bc = ((s64)c->sgpr64(t1)) >= 0; // bgez t1, L144
|
||||
c->sq(t0, -16, a0); // sq t0, -16(a0)
|
||||
if (bc) {goto block_57;} // branch non-likely
|
||||
|
||||
|
||||
block_58:
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
|
||||
c->lq(a2, 0, a1); // lq a2, 0(a1)
|
||||
if (bc) {goto block_63;} // branch non-likely
|
||||
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
|
||||
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
|
||||
c->sq(a2, -16, a0); // sq a2, -16(a0)
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
|
||||
c->lq(a2, 0, a1); // lq a2, 0(a1)
|
||||
if (bc) {goto block_63;} // branch non-likely
|
||||
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
|
||||
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
|
||||
c->sq(a2, -16, a0); // sq a2, -16(a0)
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
|
||||
c->lq(a2, 0, a1); // lq a2, 0(a1)
|
||||
if (bc) {goto block_63;} // branch non-likely
|
||||
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
|
||||
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
|
||||
c->sq(a2, -16, a0); // sq a2, -16(a0)
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L146
|
||||
c->lq(a2, 0, a1); // lq a2, 0(a1)
|
||||
if (bc) {goto block_63;} // branch non-likely
|
||||
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, 16); // daddiu a0, a0, 16
|
||||
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
|
||||
c->sq(a2, -16, a0); // sq a2, -16(a0)
|
||||
|
||||
block_63:
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
c->addiu(v1, r0, 18); // addiu v1, r0, 18
|
||||
c->lwu(a0, 28, s2); // lwu a0, 28(s2)
|
||||
if (((s64)c->sgpr64(a0)) == ((s64)0)) { // beql a0, r0, L147
|
||||
c->mov64(a0, s7); // or a0, s7, r0
|
||||
goto block_66;
|
||||
}
|
||||
|
||||
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
||||
c->lwu(a1, 28, s2); // lwu a1, 28(s2)
|
||||
c->lbu(a1, 1, a1); // lbu a1, 1(a1)
|
||||
c->movz(a0, s7, a1); // movz a0, s7, a1
|
||||
|
||||
block_66:
|
||||
bc = c->sgpr64(s7) == c->sgpr64(a0); // beq s7, a0, L151
|
||||
c->mov64(a0, s7); // or a0, s7, r0
|
||||
if (bc) {goto block_75;} // branch non-likely
|
||||
|
||||
c->addiu(a0, r0, 1); // addiu a0, r0, 1
|
||||
c->sb(a0, 170, s1); // sb a0, 170(s1)
|
||||
c->daddiu(a1, s1, 288); // daddiu a1, s1, 288
|
||||
c->lwu(a0, 28, s2); // lwu a0, 28(s2)
|
||||
c->lwu(a2, 28, s2); // lwu a2, 28(s2)
|
||||
c->lbu(a2, 1, a2); // lbu a2, 1(a2)
|
||||
c->dsll(a2, a2, 4); // dsll a2, a2, 4
|
||||
c->daddu(a2, a0, a2); // daddu a2, a0, a2
|
||||
c->addiu(a0, r0, 5); // addiu a0, r0, 5
|
||||
c->daddiu(a3, a0, -4); // daddiu a3, a0, -4
|
||||
c->mov64(a1, a1); // or a1, a1, r0
|
||||
bc = ((s64)c->sgpr64(a3)) < 0; // bltz a3, L149
|
||||
c->mov64(a2, a2); // or a2, a2, r0
|
||||
if (bc) {goto block_69;} // branch non-likely
|
||||
|
||||
|
||||
block_68:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(t2, 0, a2); // lq t2, 0(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(a3, 16, a2); // lq a3, 16(a2)
|
||||
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
||||
c->lq(t0, 32, a2); // lq t0, 32(a2)
|
||||
c->daddiu(a1, a1, 64); // daddiu a1, a1, 64
|
||||
c->lq(t1, 48, a2); // lq t1, 48(a2)
|
||||
c->daddiu(a2, a2, 64); // daddiu a2, a2, 64
|
||||
c->sq(t2, -64, a1); // sq t2, -64(a1)
|
||||
c->daddiu(t2, a0, -4); // daddiu t2, a0, -4
|
||||
c->sq(a3, -48, a1); // sq a3, -48(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sq(t0, -32, a1); // sq t0, -32(a1)
|
||||
bc = ((s64)c->sgpr64(t2)) >= 0; // bgez t2, L148
|
||||
c->sq(t1, -16, a1); // sq t1, -16(a1)
|
||||
if (bc) {goto block_68;} // branch non-likely
|
||||
|
||||
|
||||
block_69:
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_74;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_74;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_74;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L150
|
||||
c->lq(a3, 0, a2); // lq a3, 0(a2)
|
||||
if (bc) {goto block_74;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, 16); // daddiu a2, a2, 16
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->sq(a3, -16, a1); // sq a3, -16(a1)
|
||||
|
||||
block_74:
|
||||
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
|
||||
c->daddiu(v1, v1, 5); // daddiu v1, v1, 5
|
||||
c->mov64(a0, v1); // or a0, v1, r0
|
||||
|
||||
block_75:
|
||||
c->lui(a0, 4096); // lui a0, 4096
|
||||
c->daddiu(a1, v1, -1); // daddiu a1, v1, -1
|
||||
c->dsll32(a1, a1, 16); // dsll32 a1, a1, 16
|
||||
c->dsrl32(a1, a1, 16); // dsrl32 a1, a1, 16
|
||||
c->or_(a0, a0, a1); // or a0, a0, a1
|
||||
c->sd(a0, 0, s1); // sd a0, 0(s1)
|
||||
c->sw(v1, 8, s1); // sw v1, 8(s1)
|
||||
c->sw(r0, 12, s1); // sw r0, 12(s1)
|
||||
c->dsll(v1, v1, 4); // dsll v1, v1, 4
|
||||
c->daddu(a1, s3, v1); // daddu a1, s3, v1
|
||||
c->mov64(v1, a1); // or v1, a1, r0
|
||||
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
|
||||
c->lwu(a2, 48, v1); // lwu a2, 48(v1)
|
||||
c->load_symbol2(t9, cache.foreground_generic_merc_add_fragments);// lw t9, foreground-generic-merc-add-fragments(s7)
|
||||
c->mov64(a0, s2); // or a0, s2, r0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(s3, v0); // or s3, v0, r0
|
||||
c->mov64(v1, s3); // or v1, s3, r0
|
||||
|
||||
block_76:
|
||||
c->daddiu(s4, s4, 1); // daddiu s4, s4, 1
|
||||
|
||||
block_77:
|
||||
c->lwu(v1, 52, s5); // lwu v1, 52(s5)
|
||||
c->slt(v1, s4, v1); // slt v1, s4, v1
|
||||
bc = c->sgpr64(v1) != 0; // bne v1, r0, L119
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v0, s3); // or v0, s3, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 96, sp); // lq gp, 96(sp)
|
||||
c->lq(s5, 80, sp); // lq s5, 80(sp)
|
||||
c->lq(s4, 64, sp); // lq s4, 64(sp)
|
||||
c->lq(s3, 48, sp); // lq s3, 48(sp)
|
||||
c->lq(s2, 32, sp); // lq s2, 32(sp)
|
||||
c->lq(s1, 16, sp); // lq s1, 16(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 112); // daddiu sp, sp, 112
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c();
|
||||
cache.foreground = intern_from_c("*foreground*").c();
|
||||
cache.merc_global_stats = intern_from_c("*merc-global-stats*").c();
|
||||
cache.foreground_generic_merc_add_fragments = intern_from_c("foreground-generic-merc-add-fragments").c();
|
||||
cache.foreground_generic_merc_death = intern_from_c("foreground-generic-merc-death").c();
|
||||
gLinkedFunctionTable.reg("foreground-generic-merc", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace foreground_generic_merc
|
||||
} // namespace Mips2C
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -348,6 +348,7 @@ struct ExecutionContext {
|
||||
u64 args[8] = {gprs[a0].du64[0], gprs[a1].du64[0], gprs[a2].du64[0], gprs[a3].du64[0],
|
||||
gprs[t0].du64[0], gprs[t1].du64[0], gprs[t2].du64[0], gprs[t3].du64[0]};
|
||||
#ifdef __linux__
|
||||
ASSERT(addr);
|
||||
gprs[v0].du64[0] = _call_goal8_asm_linux(g_ee_main_mem + addr, args, 0, gprs[s6].du64[0],
|
||||
gprs[s7].du64[0], g_ee_main_mem);
|
||||
#elif _WIN32
|
||||
@@ -703,6 +704,14 @@ struct ExecutionContext {
|
||||
}
|
||||
}
|
||||
|
||||
void psubh(int dest, int rs, int rt) {
|
||||
auto s = gpr_src(rs);
|
||||
auto t = gpr_src(rt);
|
||||
for (int i = 0; i < 8; i++) {
|
||||
gprs[dest].du16[i] = s.du16[i] - t.du16[i];
|
||||
}
|
||||
}
|
||||
|
||||
void pminh(int dest, int rs, int rt) {
|
||||
auto s = gpr_src(rs);
|
||||
auto t = gpr_src(rt);
|
||||
|
||||
@@ -220,6 +220,24 @@ namespace method_53_squid { extern void link(); }
|
||||
namespace init_vortex_regs { extern void link(); }
|
||||
namespace draw_large_polygon_vortex { extern void link(); }
|
||||
namespace render_vortex_quad { extern void link(); }
|
||||
namespace foreground_generic_merc { extern void link(); }
|
||||
namespace generic_merc_init_asm { extern void link(); }
|
||||
namespace mercneric_convert { extern void link(); }
|
||||
namespace high_speed_reject { extern void link(); }
|
||||
namespace generic_translucent { extern void link(); }
|
||||
namespace generic_merc_query { extern void link(); }
|
||||
namespace generic_merc_death { extern void link(); }
|
||||
namespace generic_merc_execute_asm { extern void link(); }
|
||||
namespace generic_merc_do_chain { extern void link(); }
|
||||
namespace generic_light_proc { extern void link(); }
|
||||
namespace generic_envmap_proc { extern void link(); }
|
||||
namespace generic_prepare_dma_double { extern void link(); }
|
||||
namespace generic_prepare_dma_single { extern void link(); }
|
||||
namespace generic_warp_source_proc { extern void link(); }
|
||||
namespace generic_warp_dest_proc { extern void link(); }
|
||||
namespace generic_warp_dest { extern void link(); }
|
||||
namespace generic_warp_envmap_dest { extern void link(); }
|
||||
namespace generic_no_light_proc { extern void link(); }
|
||||
|
||||
}
|
||||
// clang-format on
|
||||
@@ -350,7 +368,9 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
jak2::method_10_collide_cache_prim::link, jak2::method_17_collide_cache::link,
|
||||
jak2::method_9_collide_puss_work::link, jak2::method_10_collide_puss_work::link}},
|
||||
{"bones", {jak2::bones_mtx_calc::link}},
|
||||
{"foreground", {jak2::foreground_check_longest_edge_asm::link, jak2::foreground_merc::link}},
|
||||
{"foreground",
|
||||
{jak2::foreground_check_longest_edge_asm::link, jak2::foreground_merc::link,
|
||||
jak2::foreground_generic_merc::link}},
|
||||
{"lights",
|
||||
{jak2::add_light_sphere_to_light_group::link, jak2::light_hash_add_items::link,
|
||||
jak2::light_hash_count_items::link, jak2::light_hash_get_bucket_index::link}},
|
||||
@@ -369,7 +389,18 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
{"squid-setup", {jak2::method_53_squid::link}},
|
||||
{"vortex",
|
||||
{jak2::init_vortex_regs::link, jak2::draw_large_polygon_vortex::link,
|
||||
jak2::render_vortex_quad::link}}}};
|
||||
jak2::render_vortex_quad::link}},
|
||||
{"generic-merc",
|
||||
{jak2::generic_merc_init_asm::link, jak2::mercneric_convert::link,
|
||||
jak2::high_speed_reject::link, jak2::generic_translucent::link,
|
||||
jak2::generic_merc_query::link, jak2::generic_merc_death::link,
|
||||
jak2::generic_merc_execute_asm::link, jak2::generic_merc_do_chain::link}},
|
||||
{"generic-effect",
|
||||
{jak2::generic_light_proc::link, jak2::generic_envmap_proc::link,
|
||||
jak2::generic_prepare_dma_double::link, jak2::generic_prepare_dma_single::link,
|
||||
jak2::generic_warp_source_proc::link, jak2::generic_warp_dest_proc::link,
|
||||
jak2::generic_warp_dest::link, jak2::generic_warp_envmap_dest::link,
|
||||
jak2::generic_no_light_proc::link}}}};
|
||||
|
||||
void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) {
|
||||
const auto& it = m_executes.insert({name, {exec, Ptr<u8>()}});
|
||||
|
||||
@@ -1363,7 +1363,8 @@
|
||||
;; check if this effect uses "ripple"
|
||||
(when (logtest? (-> geom effect effect-idx effect-bits) 4)
|
||||
(when (-> arg0 ripple)
|
||||
(if *ripple-force-generic*
|
||||
;; fall back to generic if there's a ripple query to respond to.
|
||||
(if (or *ripple-force-generic* (-> arg0 ripple query))
|
||||
(set! pc-force-mercneric #t)
|
||||
(set! pc-merc-vtx-update #t)
|
||||
)
|
||||
|
||||
@@ -1387,7 +1387,7 @@
|
||||
(bones-init gp-0)
|
||||
(bones-mtx-calc-execute)
|
||||
;; generic-merc/shadow have VU0/CPU parts that need bones, run them here.
|
||||
;;(generic-merc-execute-all gp-0)
|
||||
(generic-merc-execute-all gp-0)
|
||||
;;(shadow-execute-all gp-0)
|
||||
)
|
||||
(lightning-draw-all)
|
||||
|
||||
@@ -571,13 +571,87 @@
|
||||
(defun foreground-shadow ((arg0 draw-control) (arg1 (inline-array pris-mtx)) (arg2 pointer))
|
||||
arg2
|
||||
)
|
||||
;; todo foreground-generic-merc-death
|
||||
;; todo foreground-generic-merc-add-fragments
|
||||
;; todo foreground-generic-merc
|
||||
(defun foreground-generic-merc ((arg0 draw-control) (arg1 pointer) (arg2 int))
|
||||
|
||||
(defun foreground-generic-merc-death ((arg0 draw-control) (arg1 generic-merc-ctrl))
|
||||
"Modify a generic-merc-ctrl to set up merc-death effect."
|
||||
|
||||
;; possibly disable drawing if requested
|
||||
(when (and (>= (the-as int (- (-> arg0 death-timer-org) (-> arg0 death-timer)))
|
||||
(the-as int (-> arg0 death-draw-overlap))
|
||||
)
|
||||
(!= (-> arg0 death-draw-overlap) 255)
|
||||
)
|
||||
(set! (-> arg1 header display-triangles) (the-as uint 0))
|
||||
0
|
||||
)
|
||||
|
||||
;; update the vertices that we're querying.
|
||||
(when (not (paused?))
|
||||
(let ((v1-6 (+ (-> arg0 death-vertex-skip) (rand-vu-int-count (the-as int (-> arg0 death-vertex-skip))))))
|
||||
(set! (-> arg1 header death-vertex-skip) v1-6)
|
||||
(set! (-> arg1 header death-effect) (-> arg0 death-effect))
|
||||
(set! (-> arg1 header death-start-vertex)
|
||||
(/ (* v1-6 (- (-> arg0 death-timer-org) (-> arg0 death-timer))) (-> arg0 death-timer-org))
|
||||
)
|
||||
)
|
||||
)
|
||||
(none)
|
||||
)
|
||||
|
||||
(defun foreground-generic-merc-add-fragments ((arg0 merc-effect) (arg1 pointer) (arg2 mercneric-chain))
|
||||
"Add fragments from a merc-effect to the generic chain."
|
||||
(let ((v1-0 (-> arg0 frag-geo))
|
||||
(a3-0 (the-as structure (-> arg0 frag-ctrl)))
|
||||
(a0-1 (-> arg0 frag-count))
|
||||
)
|
||||
|
||||
;; loop over fragments, adding matrix refs.
|
||||
(dotimes (t0-0 (the-as int a0-1))
|
||||
(let ((t1-2 (+ (* (-> (the-as merc-fragment-control a3-0) mat-xfer-count) 2) 4))
|
||||
(t2-0 (-> v1-0 header mm-quadword-size))
|
||||
)
|
||||
(set! (-> (the-as dma-packet arg1) dma)
|
||||
(new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int v1-0) :qwc t2-0)
|
||||
)
|
||||
(set! (-> (the-as dma-packet arg1) vif0) (new 'static 'vif-tag))
|
||||
(set! (-> (the-as dma-packet arg1) vif1) (new 'static 'vif-tag))
|
||||
(when (nonzero? t0-0)
|
||||
(set! (-> (the-as (pointer int32) (-> arg2 next)) 0) (the-as int arg1))
|
||||
(set! (-> arg2 next) (the-as uint (&+ arg1 12)))
|
||||
)
|
||||
(let ((a1-1 (the-as object (&+ arg1 16))))
|
||||
(dotimes (t3-6 (the-as int (-> (the-as merc-fragment-control a3-0) mat-xfer-count)))
|
||||
(let ((t5-4
|
||||
(-> (scratchpad-object foreground-work)
|
||||
regs
|
||||
mtxs
|
||||
(-> (the-as merc-fragment-control a3-0) mat-dest-data t3-6 matrix-number)
|
||||
)
|
||||
)
|
||||
)
|
||||
(set! (-> (the-as dma-packet a1-1) dma)
|
||||
(new 'static 'dma-tag :qwc #x7 :id (dma-tag-id ref) :addr (the-as int t5-4))
|
||||
)
|
||||
)
|
||||
(set! (-> (the-as dma-packet a1-1) vif0) (new 'static 'vif-tag))
|
||||
(set! (-> (the-as dma-packet a1-1) vif1) (new 'static 'vif-tag))
|
||||
(set! a1-1 (&+ (the-as pointer a1-1) 16))
|
||||
)
|
||||
(set! (-> (the-as dma-packet a1-1) dma) (new 'static 'dma-tag :id (dma-tag-id end)))
|
||||
(set! (-> (the-as dma-packet a1-1) vif0) (new 'static 'vif-tag))
|
||||
(set! (-> (the-as dma-packet a1-1) vif1) (new 'static 'vif-tag))
|
||||
(set! arg1 (&+ (the-as pointer a1-1) 16))
|
||||
)
|
||||
(set! a3-0 (&+ a3-0 t1-2))
|
||||
(set! v1-0 (the-as merc-fragment (+ (the-as uint v1-0) (* t2-0 16))))
|
||||
)
|
||||
)
|
||||
)
|
||||
arg1
|
||||
)
|
||||
|
||||
(def-mips2c foreground-generic-merc (function draw-control pointer int pointer))
|
||||
|
||||
(def-mips2c foreground-merc (function draw-control (inline-array pris-mtx) pointer int int object pointer))
|
||||
|
||||
(define-extern foreground-emerc (function draw-control (inline-array pris-mtx) pointer object int int pointer))
|
||||
@@ -605,6 +679,7 @@
|
||||
;;(.sll v1-6 v1-5 7)
|
||||
(set! v1-6 (shl v1-5 7))
|
||||
)
|
||||
|
||||
(let ((a0-1 (scratchpad-object foreground-work)))
|
||||
;;(.addu t0-0 arg2 v1-6)
|
||||
(set! t0-0 (&+ arg2 v1-6))
|
||||
@@ -681,7 +756,6 @@
|
||||
(dotimes (i 128) (set! (-> transferred-matrices i) 0))
|
||||
|
||||
(let ((merc-ctrl (-> dc lod-set lod (-> dc cur-lod) geo)))
|
||||
|
||||
;; loop to: grab matrices and populate flags
|
||||
(dotimes (effect-idx (-> merc-ctrl header effect-count))
|
||||
|
||||
@@ -794,9 +868,11 @@
|
||||
;; look for uses.
|
||||
(dotimes (i (-> mctrl header effect-count))
|
||||
;;(format 0 "effect ~d, texture ~d~%" i (-> mctrl effect i texture-index))
|
||||
(set! (-> use-flags (-> mctrl effect i texture-index)) 1)
|
||||
(when (logtest? (-> (-> dc lod-set lod (-> dc cur-lod) geo) effect i effect-bits) (effect-bits ripple texscroll))
|
||||
(set! has-ripple-or-texscroll #t)
|
||||
(when (= 0 (-> *foreground* merc-bucket-info effect i merc-path))
|
||||
(set! (-> use-flags (-> mctrl effect i texture-index)) 1)
|
||||
(when (logtest? (-> (-> dc lod-set lod (-> dc cur-lod) geo) effect i effect-bits) (effect-bits ripple texscroll))
|
||||
(set! has-ripple-or-texscroll #t)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1190,19 +1266,40 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; massive hack use merc for everything..
|
||||
;; reassign for PC. For the most part, we reassign everything to merc. The exceptions are:
|
||||
;; - "warp" effect is on: this special effect isn't supported by PC merc
|
||||
;; - "death" effect is on: this requires the renderer to return transformed vertices.
|
||||
;; - "force-mercneric" is on: this is used rarely, and on stuff that doesn't seem to have
|
||||
;; - ripple query?
|
||||
(when (or (nonzero? (-> (scratchpad-object foreground-work) regs mercneric-used))
|
||||
(nonzero? (-> (scratchpad-object foreground-work) regs emerc-used))
|
||||
)
|
||||
(set! (-> (scratchpad-object foreground-work) regs mercneric-used) 0)
|
||||
(set! (-> (scratchpad-object foreground-work) regs emerc-used) 0)
|
||||
(set! (-> (scratchpad-object foreground-work) regs merc-used) 1)
|
||||
(dotimes (effect-idx (the-as int (-> geo header effect-count)))
|
||||
(set! (-> bucket-info effect effect-idx merc-path) 0)
|
||||
(when (logtest? (-> geo effect effect-idx effect-usage) 1)
|
||||
(set! (-> bucket-info effect effect-idx ignore-alpha) 1)
|
||||
)
|
||||
|
||||
;; technically we should use generic for ripple query, but the only user is dark eco,
|
||||
;; which doesn't actually do anything with the result of the query.
|
||||
(when #t ;;(not (and (-> dc ripple) (-> dc ripple query)))
|
||||
(set! (-> (scratchpad-object foreground-work) regs mercneric-used) 0)
|
||||
(set! (-> (scratchpad-object foreground-work) regs emerc-used) 0)
|
||||
(set! (-> (scratchpad-object foreground-work) regs merc-used) 1)
|
||||
(dotimes (effect-idx (the-as int (-> geo header effect-count)))
|
||||
(cond
|
||||
((or (logtest? (-> geo effect effect-idx effect-bits) (effect-bits cross-fade))
|
||||
(logtest? (-> geo effect effect-idx effect-bits) (effect-bits force-mercneric))
|
||||
(nonzero? (-> dc death-timer))
|
||||
)
|
||||
;; (format *stdcon* "[fg] ~S to generic~%" (-> dc process name))
|
||||
(set! (-> bucket-info effect effect-idx merc-path) 2)
|
||||
(set! (-> (scratchpad-object foreground-work) regs mercneric-used) 1)
|
||||
)
|
||||
(else
|
||||
(set! (-> bucket-info effect effect-idx merc-path) 0)
|
||||
)
|
||||
)
|
||||
|
||||
(when (logtest? (-> geo effect effect-idx effect-usage) 1)
|
||||
(set! (-> bucket-info effect effect-idx ignore-alpha) 1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -7,9 +7,246 @@
|
||||
|
||||
;; DECOMP BEGINS
|
||||
|
||||
;; definition for symbol *target-lock*, type object
|
||||
(define *target-lock* (the-as object 0))
|
||||
|
||||
;; definition for symbol *generic-consts*, type generic-consts
|
||||
(define *generic-consts*
|
||||
(new 'static 'generic-consts
|
||||
:dma-header (new 'static 'dma-packet
|
||||
:dma (new 'static 'dma-tag :id (dma-tag-id cnt))
|
||||
:vif0 (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl))
|
||||
:vif1 (new 'static 'vif-tag :cmd (vif-cmd unpack-v4-32))
|
||||
)
|
||||
:vif-header (new 'static 'array uint32 4 #x1000404 #x1000404 #x1000404 #x6c000000)
|
||||
:dma-ref-vtxs (new 'static 'dma-packet :dma (new 'static 'dma-tag :id (dma-tag-id ref)))
|
||||
:dma-cnt-call (new 'static 'dma-packet :dma (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
||||
:matrix (new 'static 'matrix :vector (new 'static 'inline-array vector 4
|
||||
(new 'static 'vector :x 1.0)
|
||||
(new 'static 'vector :y 1.0)
|
||||
(new 'static 'vector :z 1.0)
|
||||
(new 'static 'vector :w 1.0)
|
||||
)
|
||||
)
|
||||
:base-strgif (new 'static 'generic-gif-tag
|
||||
:fan-prim (new 'static 'gif-tag-prim
|
||||
:pre #x1
|
||||
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :tme #x1 :fge #x1 :abe #x1)
|
||||
:nreg #x3
|
||||
)
|
||||
:str-prim (new 'static 'gif-tag-prim
|
||||
:pre #x1
|
||||
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1 :fge #x1 :abe #x1)
|
||||
:nreg #x3
|
||||
)
|
||||
:regs (new 'static 'gif-tag-regs-32 :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
|
||||
)
|
||||
:alpha-opaque (new 'static 'gs-adcmd :cmds (gs-reg64 alpha-1))
|
||||
:alpha-translucent (new 'static 'gs-adcmd :cmds (gs-reg64 alpha-1) :x #x44)
|
||||
:ztest-normal (new 'static 'gs-adcmd :cmds (gs-reg64 test-1) :x #x5026b)
|
||||
:ztest-opaque (new 'static 'gs-adcmd :cmds (gs-reg64 test-1) :x #x5000a)
|
||||
:adcmd-offsets (new 'static 'array uint8 16 #x0 #x20 #x20 #x20 #x0 #x30 #x30 #x30 #x0 #x30 #x30 #x30 #x0 #x30 #x30 #x30)
|
||||
:stcycle-tag #x1000103
|
||||
:unpack-vtx-tag #x68000000
|
||||
:unpack-clr-tag #x6e004000
|
||||
:unpack-tex-tag #x65000000
|
||||
:mscal-tag #x14000006
|
||||
:reset-cycle-tag #x1000404
|
||||
:dma-tag-cnt #x10000000
|
||||
:envmap (new 'static 'generic-envmap-consts
|
||||
:consts (new 'static 'vector :x 1.0 :z 0.5 :w 0.5)
|
||||
:strgif (new 'static 'generic-gif-tag
|
||||
:fan-prim (new 'static 'gif-tag-prim
|
||||
:pre #x1
|
||||
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :tme #x1 :abe #x1)
|
||||
:nreg #x3
|
||||
)
|
||||
:str-prim (new 'static 'gif-tag-prim
|
||||
:pre #x1
|
||||
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1 :abe #x1)
|
||||
:nreg #x3
|
||||
)
|
||||
:regs (new 'static 'gif-tag-regs-32 :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyzf2))
|
||||
)
|
||||
:colors (new 'static 'vector4w :x -2139062144 :y -2139062144 :z -2139062144 :w -2139062144)
|
||||
)
|
||||
:light-consts (new 'static 'vector :x 255.0 :y 8388608.0)
|
||||
)
|
||||
)
|
||||
|
||||
(define-extern *default-envmap-shader* adgif-shader)
|
||||
|
||||
|
||||
(defun generic-work-init ((arg0 generic-bucket-state))
|
||||
(quad-copy!
|
||||
(the-as pointer (-> (scratchpad-object generic-work) fx-buf work))
|
||||
(the-as pointer *generic-consts*)
|
||||
27
|
||||
)
|
||||
(set! (-> (scratchpad-object generic-work) saves gifbuf-adr) (-> arg0 gifbuf-adr))
|
||||
(set! (-> (scratchpad-object generic-work) saves inbuf-adr) (-> arg0 inbuf-adr))
|
||||
(set! (-> (scratchpad-object generic-work) saves cur-outbuf)
|
||||
(the-as uint (-> (scratchpad-object generic-work) fx-buf))
|
||||
)
|
||||
(let* ((v1-6 *default-envmap-shader*)
|
||||
(a0-9 (-> (scratchpad-object generic-work) fx-buf work consts envmap shader))
|
||||
(a1-2 (-> v1-6 quad 0 quad))
|
||||
(a2-1 (-> v1-6 quad 1 quad))
|
||||
(a3-0 (-> v1-6 quad 2 quad))
|
||||
(t0-0 (-> v1-6 quad 3 quad))
|
||||
(v0-1 (-> v1-6 quad 4 quad))
|
||||
)
|
||||
(set! (-> a0-9 quad 0 quad) a1-2)
|
||||
(set! (-> a0-9 quad 1 quad) a2-1)
|
||||
(set! (-> a0-9 quad 2 quad) a3-0)
|
||||
(set! (-> a0-9 quad 3 quad) t0-0)
|
||||
(set! (-> a0-9 quad 4 quad) v0-1)
|
||||
)
|
||||
(none)
|
||||
)
|
||||
|
||||
(defun generic-upload-vu0 ()
|
||||
(none)
|
||||
)
|
||||
|
||||
(defun generic-initialize-without-sync ((arg0 matrix) (arg1 vu-lights))
|
||||
;(upload-vu0-program generic-vu0-block (the-as pointer #x70000054))
|
||||
(let ((a2-0 (-> (scratchpad-object generic-work) fx-buf work consts matrix))
|
||||
(v1-1 (-> arg0 quad 0))
|
||||
(a0-3 (-> arg0 quad 1))
|
||||
(a1-2 (-> arg0 quad 2))
|
||||
(a3-0 (-> arg0 trans quad))
|
||||
)
|
||||
(set! (-> a2-0 quad 0) v1-1)
|
||||
(set! (-> a2-0 quad 1) a0-3)
|
||||
(set! (-> a2-0 quad 2) a1-2)
|
||||
(set! (-> a2-0 trans quad) a3-0)
|
||||
)
|
||||
(if arg1
|
||||
(quad-copy! (the-as pointer (-> (scratchpad-object generic-work) fx-buf work lights)) (the-as pointer arg1) 7)
|
||||
)
|
||||
0
|
||||
(none)
|
||||
)
|
||||
|
||||
(defun generic-initialize ((arg0 generic-bucket-state) (arg1 matrix) (arg2 vu-lights))
|
||||
(generic-work-init arg0)
|
||||
(generic-upload-vu0)
|
||||
(let ((a2-1 (-> (scratchpad-object generic-work) fx-buf work consts matrix))
|
||||
(v1-1 (-> arg1 quad 0))
|
||||
(a0-2 (-> arg1 quad 1))
|
||||
(a1-1 (-> arg1 quad 2))
|
||||
(a3-0 (-> arg1 trans quad))
|
||||
)
|
||||
(set! (-> a2-1 quad 0) v1-1)
|
||||
(set! (-> a2-1 quad 1) a0-2)
|
||||
(set! (-> a2-1 quad 2) a1-1)
|
||||
(set! (-> a2-1 trans quad) a3-0)
|
||||
)
|
||||
(if arg2
|
||||
(quad-copy! (the-as pointer (-> (scratchpad-object generic-work) fx-buf work lights)) (the-as pointer arg2) 7)
|
||||
)
|
||||
0
|
||||
(none)
|
||||
)
|
||||
|
||||
(defun generic-wrapup ((arg0 generic-bucket-state))
|
||||
(set! (-> arg0 gifbuf-adr) (-> (scratchpad-object generic-work) saves gifbuf-adr))
|
||||
(set! (-> arg0 inbuf-adr) (-> (scratchpad-object generic-work) saves inbuf-adr))
|
||||
(none)
|
||||
)
|
||||
|
||||
(defun upload-vu0-program ((func vu-function) (wait-ptr pointer))
|
||||
"Upload and block until done.
|
||||
Generating the DMA is highly optimized."
|
||||
(none)
|
||||
)
|
||||
|
||||
|
||||
;; definition for function generic-dma-from-spr
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for function generic-light-proc
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-light-proc function)
|
||||
|
||||
;; definition for function generic-envmap-proc
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-envmap-proc function)
|
||||
|
||||
;; definition for function generic-prepare-dma-double
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-prepare-dma-double function)
|
||||
|
||||
;; definition for function generic-prepare-dma-single
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-prepare-dma-single function)
|
||||
|
||||
;; definition for function generic-envmap-dproc
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function generic-interp-dproc
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for function generic-no-light-proc
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function generic-no-light-dproc-only
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function generic-no-light-dproc
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function generic-no-light+envmap
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for function generic-no-light
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for function generic-envmap-only-proc
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for function generic-light
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for function generic-copy-vtx-dclr-dtex
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function generic-none
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function generic-none-dma-wait
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition for symbol *warp-data*, type object
|
||||
(define *warp-data* (the-as object (malloc 'global 1024)))
|
||||
|
||||
;; definition for function generic-warp-source-proc
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-warp-source-proc (function none))
|
||||
|
||||
;; definition for function generic-warp-source
|
||||
;; ERROR: Unsupported inline assembly instruction kind - [lui at, 28672]
|
||||
(defun generic-warp-source ((arg0 gsf-buffer))
|
||||
(set! (-> (scratchpad-object generic-work) saves gsf-buf) arg0)
|
||||
(generic-warp-source-proc)
|
||||
(none)
|
||||
)
|
||||
|
||||
;; definition for function generic-warp-dest-proc
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-warp-dest-proc function)
|
||||
|
||||
;; definition for function generic-warp-dest
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-warp-dest function)
|
||||
|
||||
;; definition for function generic-warp-envmap-dest
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-warp-envmap-dest function)
|
||||
|
||||
;; definition for function generic-debug-light-proc
|
||||
;; ERROR: function was not converted to expressions. Cannot decompile.
|
||||
|
||||
;; definition (debug) for function generic-post-debug
|
||||
;; ERROR: function has no type analysis. Cannot decompile.
|
||||
|
||||
@@ -7,3 +7,129 @@
|
||||
|
||||
;; DECOMP BEGINS
|
||||
|
||||
(define mercneric-vu0-block (new 'static 'vu-function #|:length #xbe :origin #x118 :qlength 95|#))
|
||||
|
||||
(deftype invinitdata (structure)
|
||||
((count uint8 :offset-assert 0)
|
||||
(init-data uint8 :offset-assert 1)
|
||||
(init-addr uint16 :offset-assert 2)
|
||||
)
|
||||
:pack-me
|
||||
:method-count-assert 9
|
||||
:size-assert #x4
|
||||
:flag-assert #x900000004
|
||||
)
|
||||
|
||||
(define *inv-init-table* (new 'static 'inline-array invinitdata 8
|
||||
(new 'static 'invinitdata :count #x48 :init-addr #x1)
|
||||
(new 'static 'invinitdata :count #x43 :init-data #xc :init-addr #x11)
|
||||
(new 'static 'invinitdata :count #x3d :init-data #x18 :init-addr #x21)
|
||||
(new 'static 'invinitdata :count #x38 :init-data #x22 :init-addr #xe0)
|
||||
(new 'static 'invinitdata :count #x38 :init-data #x24 :init-addr #xe1)
|
||||
(new 'static 'invinitdata :count #x33 :init-data #x30 :init-addr #xf1)
|
||||
(new 'static 'invinitdata :count #x2e :init-data #x3a :init-addr #x190)
|
||||
(new 'static 'invinitdata :count #x2d :init-data #x3c :init-addr #x191)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; definition for function generic-merc-init-asm
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-merc-init-asm (function none))
|
||||
|
||||
;; 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 has no type analysis. Cannot decompile.
|
||||
|
||||
;; definition for function mercneric-convert
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c mercneric-convert function)
|
||||
|
||||
;; definition for function high-speed-reject
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c high-speed-reject function)
|
||||
|
||||
;; definition for function generic-translucent
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-translucent (function gsf-buffer none))
|
||||
|
||||
;; definition for function generic-merc-query
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-merc-query function)
|
||||
|
||||
;; definition for function generic-merc-death
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-merc-death function)
|
||||
|
||||
;; definition for function generic-merc-execute-asm
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-merc-execute-asm function)
|
||||
|
||||
;; definition for function generic-merc-do-chain
|
||||
;; INFO: function output is handled by mips2c
|
||||
(def-mips2c generic-merc-do-chain (function mercneric-chain dma-buffer pointer))
|
||||
|
||||
|
||||
(defun generic-merc-execute-all ((arg0 dma-buffer))
|
||||
"Run EE processing on all generic merc chains."
|
||||
(let ((s4-0 (-> *foreground* foreground-grid))
|
||||
(gp-0 (-> *display* frames (-> *display* on-screen) global-buf base))
|
||||
)
|
||||
|
||||
(with-profiler 'generic-merc *profile-generic-merc-color*
|
||||
;; reset profiling
|
||||
(reset! (-> *perf-stats* data (perf-stat-bucket mercneric)))
|
||||
(set! (-> (scratchpad-object generic-work) saves to-vu0-waits) (the-as uint 0))
|
||||
(set! (-> (scratchpad-object generic-work) saves to-spr-waits) (the-as uint 0))
|
||||
(set! (-> (scratchpad-object generic-work) saves from-spr-waits) (the-as uint 0))
|
||||
(flush-cache 0)
|
||||
|
||||
;; init generic
|
||||
(generic-initialize-without-sync (-> *math-camera* perspective) *default-lights*)
|
||||
(generic-merc-init-asm)
|
||||
(set! (-> (scratchpad-object generic-work) in-buf merc shadow write-limit) (the-as int (&+ (-> arg0 end) -262144)))
|
||||
|
||||
;; loop over grid of chains (levels x textures) and do the chain.
|
||||
(dotimes (s3-1 7)
|
||||
(dotimes (s2-1 7)
|
||||
(generic-merc-do-chain (-> s4-0 level-buckets s3-1 data s2-1 mercneric) arg0)
|
||||
)
|
||||
)
|
||||
|
||||
;; do separate warp chain
|
||||
(generic-merc-do-chain (-> s4-0 warp-chain) arg0)
|
||||
|
||||
;; finish profiling
|
||||
(read! (-> *perf-stats* data (perf-stat-bucket mercneric)))
|
||||
(update-wait-stats
|
||||
(-> *perf-stats* data 38)
|
||||
(-> (scratchpad-object generic-work) saves to-vu0-waits)
|
||||
(-> (scratchpad-object generic-work) saves to-spr-waits)
|
||||
(-> (scratchpad-object generic-work) saves from-spr-waits)
|
||||
)
|
||||
)
|
||||
|
||||
;; update dma memory usage stats.
|
||||
(let ((v1-66 *dma-mem-usage*))
|
||||
(when (nonzero? v1-66)
|
||||
(set! (-> v1-66 length) (max 90 (-> v1-66 length)))
|
||||
(set! (-> v1-66 data 89 name) "pris-generic")
|
||||
(+! (-> v1-66 data 89 count) 1)
|
||||
(+! (-> v1-66 data 89 used)
|
||||
(&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint gp-0))
|
||||
)
|
||||
(set! (-> v1-66 data 89 total) (-> v1-66 data 89 used))
|
||||
)
|
||||
)
|
||||
)
|
||||
(none)
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -114,27 +114,28 @@
|
||||
(none)
|
||||
)
|
||||
|
||||
; (defun generic-vu1-init-buf-special ((arg0 bucket-id) (arg1 gs-zbuf))
|
||||
; (let ((s5-0 (-> *display* frames (-> *display* on-screen) bucket-group arg0)))
|
||||
; (when (!= s5-0 (-> s5-0 last))
|
||||
; (let* ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf))
|
||||
; (s3-1 (-> s4-0 base))
|
||||
; )
|
||||
; (fx-copy-buf s4-0)
|
||||
; (generic-init-buf s4-0 arg1)
|
||||
; (let ((v1-12 (-> s4-0 base)))
|
||||
; (set! (-> (the-as (pointer uint64) v1-12)) (logior #x20000000 (shr (shl (-> s5-0 next) 33) 1)))
|
||||
; (s.w! (+ v1-12 8) 0)
|
||||
; (s.w! (+ v1-12 12) 0)
|
||||
; (set! (-> s4-0 base) (&+ v1-12 16))
|
||||
; )
|
||||
; (set! (-> s5-0 next) (the-as uint s3-1))
|
||||
; )
|
||||
; )
|
||||
; )
|
||||
; 0
|
||||
; (none)
|
||||
; )
|
||||
(defun generic-vu1-init-buf-special ((arg0 bucket-id) (arg1 gs-zbuf))
|
||||
(let ((s5-0 (-> *display* frames (-> *display* on-screen) bucket-group arg0)))
|
||||
(when (!= s5-0 (-> s5-0 last))
|
||||
(let* ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf))
|
||||
(s3-1 (-> s4-0 base))
|
||||
)
|
||||
;; this is like the normal one, but runs fx-copy-buf first, copying the framebuffer.
|
||||
;(fx-copy-buf s4-0)
|
||||
(generic-init-buf s4-0 arg1)
|
||||
(let ((v1-12 (the-as dma-packet (-> s4-0 base))))
|
||||
(set! (-> v1-12 dma) (new 'static 'dma-tag :id (dma-tag-id next) :addr (-> s5-0 next)))
|
||||
(set! (-> v1-12 vif0) (new 'static 'vif-tag))
|
||||
(set! (-> v1-12 vif1) (new 'static 'vif-tag))
|
||||
(set! (-> s4-0 base) (the-as pointer (&+ v1-12 16)))
|
||||
)
|
||||
(set! (-> s5-0 next) (the-as uint s3-1))
|
||||
)
|
||||
)
|
||||
)
|
||||
0
|
||||
(none)
|
||||
)
|
||||
|
||||
;; definition for function generic-vu1-init-buffers
|
||||
(defun generic-vu1-init-buffers ()
|
||||
@@ -186,8 +187,7 @@
|
||||
)
|
||||
(generic-vu1-init-buf (bucket-id effects) gp-0)
|
||||
)
|
||||
;; no warp yet
|
||||
;(generic-vu1-init-buf-special (bucket-id gmerc-warp) s5-0)
|
||||
(generic-vu1-init-buf-special (bucket-id gmerc-warp) s5-0)
|
||||
)
|
||||
)
|
||||
(none)
|
||||
|
||||
@@ -218,7 +218,8 @@
|
||||
;; a pointer to an adgif-shader, stored in bits 8-32. This allows them to fit into
|
||||
;; an adgif shader easily.
|
||||
(deftype shader-ptr (uint32)
|
||||
((shader uint32 :offset 8 :size 24)
|
||||
((first-8 uint8 :offset 0 :size 8) ;; added
|
||||
(shader uint32 :offset 8 :size 24)
|
||||
)
|
||||
:method-count-assert 9
|
||||
:size-assert #x4
|
||||
|
||||
@@ -7,3 +7,19 @@
|
||||
|
||||
;; DECOMP BEGINS
|
||||
|
||||
(define *warp-shader* (new 'static 'adgif-shader
|
||||
:reg-0 #x6
|
||||
:reg-1 #x14
|
||||
:reg-3 #x8
|
||||
:reg-4-u32 (gs-reg32 alpha-1)
|
||||
:tex0 (new 'static 'gs-tex0 :tbp0 #x4c0 :tbw #x8 :tw #x9 :th #x9 :tcc #x1)
|
||||
:tex1 (new 'static 'gs-tex1 :mmag #x1)
|
||||
:clamp (new 'static 'gs-clamp
|
||||
:wms (gs-tex-wrap-mode region-clamp)
|
||||
:wmt (gs-tex-wrap-mode region-clamp)
|
||||
:maxu #x1ff
|
||||
:maxv #x19f
|
||||
)
|
||||
:next (new 'static 'shader-ptr :first-8 #x34)
|
||||
)
|
||||
)
|
||||
@@ -188,8 +188,7 @@
|
||||
(not (-> *setting-control* user-current pilot-exit))
|
||||
)
|
||||
(('bubbler)
|
||||
;; TODO warp effect
|
||||
(and ;; (handle->process (-> self warp-handle))
|
||||
(and (handle->process (-> self warp-handle))
|
||||
(or (and (-> self next-state) (= (-> self next-state name) 'idle)) (not (under-warp-check self)))
|
||||
)
|
||||
)
|
||||
@@ -230,19 +229,18 @@
|
||||
((-> arg3 param 1)
|
||||
(set-under-fog-interp! 1.0)
|
||||
(when (not (handle->process (-> self warp-handle)))
|
||||
;; TODO warp effect
|
||||
;; (let ((s2-0 (camera-matrix))
|
||||
;; (s3-0 (new 'stack-no-clear 'vector))
|
||||
;; (gp-0 (new 'stack-no-clear 'vector))
|
||||
;; (s5-0 (new 'stack-no-clear 'quaternion))
|
||||
;; )
|
||||
;; (set! (-> gp-0 quad) (-> (camera-pos) quad))
|
||||
;; (vector-normalize-copy! s3-0 (-> s2-0 vector 2) 1.0)
|
||||
;; (matrix->quaternion s5-0 s2-0)
|
||||
;; (set! (-> self warp-handle)
|
||||
;; (ppointer->handle (process-spawn under-warp gp-0 s5-0 (-> self level) :to *display-pool*))
|
||||
;; )
|
||||
;; )
|
||||
(let ((s2-0 (camera-matrix))
|
||||
(s3-0 (new 'stack-no-clear 'vector))
|
||||
(gp-0 (new 'stack-no-clear 'vector))
|
||||
(s5-0 (new 'stack-no-clear 'quaternion))
|
||||
)
|
||||
(set! (-> gp-0 quad) (-> (camera-pos) quad))
|
||||
(vector-normalize-copy! s3-0 (-> s2-0 vector 2) 1.0)
|
||||
(matrix->quaternion s5-0 s2-0)
|
||||
(set! (-> self warp-handle)
|
||||
(ppointer->handle (process-spawn under-warp gp-0 s5-0 (-> self level) :to *display-pool*))
|
||||
)
|
||||
)
|
||||
(set! v0-0 (sound-play "mech-under-amb"))
|
||||
(set! (-> self ambient-sound-id) (the-as sound-id v0-0))
|
||||
v0-0
|
||||
|
||||
+2
-1
@@ -330,7 +330,8 @@
|
||||
|
||||
;; definition of type shader-ptr
|
||||
(deftype shader-ptr (uint32)
|
||||
((shader uint32 :offset 8 :size 24)
|
||||
((first-8 uint8 :offset 0 :size 8)
|
||||
(shader uint32 :offset 8 :size 24)
|
||||
)
|
||||
:method-count-assert 9
|
||||
:size-assert #x4
|
||||
|
||||
Reference in New Issue
Block a user