From e26efcc4f31ee2f21f4c9e71ab027f5f940a2c3f Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:11:13 -0500 Subject: [PATCH] [jak 2] add lightning renderer (#2203) Implements the jak 2 lightning renderer as an alternate path through Generic2. Also set up some generic stuff in the goal code. There is a problem with the texture pool, which doesn't support the case where two textures have the same tbp, but different cluts. So lightning is often the wrong color (usually red). --- decompiler/config/jak2/all-types.gc | 58 ++++-- decompiler/config/jak2/type_casts.jsonc | 16 +- decompiler/config/jak2/var_names.jsonc | 11 + game/CMakeLists.txt | 1 + .../opengl_renderer/LightningRenderer.cpp | 20 ++ .../opengl_renderer/LightningRenderer.h | 16 ++ .../opengl_renderer/OpenGLRenderer.cpp | 2 + game/graphics/opengl_renderer/Sprite3.cpp | 1 - game/graphics/opengl_renderer/buckets.h | 1 + .../opengl_renderer/foreground/Generic2.cpp | 20 +- .../opengl_renderer/foreground/Generic2.h | 12 ++ .../foreground/Generic2_Build.cpp | 16 +- .../foreground/Generic2_DMA.cpp | 130 ++++++++++++ .../foreground/Generic2_OpenGL.cpp | 2 +- .../opengl_renderer/shaders/generic.vert | 4 +- game/graphics/texture/TexturePool.h | 2 +- goal_src/jak2/engine/debug/default-menu.gc | 64 +++++- goal_src/jak2/engine/draw/drawable.gc | 4 +- goal_src/jak2/engine/gfx/generic/generic-h.gc | 35 +++- .../jak2/engine/gfx/generic/generic-vu1.gc | 189 ++++++++++++++++++ goal_src/jak2/engine/gfx/hw/gs.gc | 37 +++- goal_src/jak2/engine/gfx/lightning.gc | 19 +- .../jak2/engine/debug/default-menu_REF.gc | 64 +++++- .../jak2/engine/gfx/generic/generic-h_REF.gc | 16 +- .../reference/jak2/engine/gfx/hw/gs_REF.gc | 11 +- .../jak2/engine/gfx/lightning_REF.gc | 19 +- .../jak2/engine/gfx/shrub/shrubbery_REF.gc | 59 +++--- 27 files changed, 706 insertions(+), 123 deletions(-) create mode 100644 game/graphics/opengl_renderer/LightningRenderer.cpp create mode 100644 game/graphics/opengl_renderer/LightningRenderer.h diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 4ac375fdd2..534572742d 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -4172,13 +4172,26 @@ :flag-assert #x9000000a4 ) +(defenum gif-flag + :type uint8 + (packed 0) + (reg-list 1) + (image 2) + (disable 3) + ) + (deftype gif-tag-prim (uint32) - () + ((id uint16 :offset 0 :size 14) + (pre uint8 :offset 14 :size 1) + (prim gs-prim :offset 15 :size 11) + (flg gif-flag :offset 26 :size 2) + (nreg uint8 :offset 28 :size 4)) :flag-assert #x900000004 ) (deftype gif-tag-count (uint32) - () + ((nloop uint16 :offset 0 :size 15) + (eop uint8 :offset 15 :size 1)) :flag-assert #x900000004 ) @@ -4201,14 +4214,6 @@ (nop 15) ) -(defenum gif-flag - :type uint8 - (packed 0) - (reg-list 1) - (image 2) - (disable 3) - ) - (deftype gif-tag64 (uint64) ((nloop uint16 :offset 0 :size 15) (eop uint8 :offset 15 :size 1) @@ -4267,6 +4272,17 @@ ) ) +(deftype gif-tag-regs-32 (uint32) + ((regs0 gif-reg-id :offset 0 :size 4) + (regs1 gif-reg-id :offset 4 :size 4) + (regs2 gif-reg-id :offset 8 :size 4) + (regs3 gif-reg-id :offset 12 :size 4) + (regs4 gif-reg-id :offset 16 :size 4) + (regs5 gif-reg-id :offset 20 :size 4) + (regs6 gif-reg-id :offset 24 :size 4) + (regs7 gif-reg-id :offset 28 :size 4)) + ) + (deftype gs-gif-tag (structure) ((qword uint128 :offset-assert 0 :score -1) ;; is "qword" and inline? in game @@ -10085,11 +10101,11 @@ ) (deftype generic-gif-tag (structure) - ((data uint32 4 :offset-assert 0) ;; guessed by decompiler - (qword qword :inline :offset 0) - (fan-prim uint32 :offset 0) - (str-prim uint32 :offset 4) - (regs uint32 :offset 8) + ((data uint32 4 :offset-assert 0 :score -1) ;; guessed by decompiler + (qword qword :inline :offset 0 :score -1) + (fan-prim gif-tag-prim :offset 0) + (str-prim gif-tag-prim :offset 4) + (regs gif-tag-regs-32 :offset 8) (num-strips uint32 :offset 12) ) :method-count-assert 9 @@ -24429,14 +24445,14 @@ ;; generic-vu1 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; (define-extern generic-vu1-block object) ;; vu-function -;; (define-extern generic-setup-constants function) ;; (function generic-constants int none) -;; (define-extern generic-add-constants function) ;; (function dma-buffer int none) +(define-extern generic-vu1-block vu-function) +(define-extern generic-setup-constants (function generic-constants none)) +(define-extern generic-add-constants (function dma-buffer none)) ;; (define-extern generic-setup-shrub-constants function) (define-extern generic-add-shrub-constants (function dma-buffer int int int none)) -(define-extern generic-init-buf (function dma-buffer int gs-zbuf none)) -;; (define-extern generic-vu1-init-buf function) -;; (define-extern generic-vu1-init-buf-special function) +(define-extern generic-init-buf (function dma-buffer gs-zbuf none)) +(define-extern generic-vu1-init-buf (function bucket-id gs-zbuf none)) +(define-extern generic-vu1-init-buf-special (function bucket-id gs-zbuf none)) (define-extern generic-vu1-init-buffers (function none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index 6ff8ed774e..0ec67d9dd5 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -9827,5 +9827,19 @@ [72, "v1", "art-joint-anim"] ], "(event idle turbo-ring)": [[4, "s5", "vehicle"]], - "(anon-function 2 errol-chal)": [[17, "v1", "process-drawable"]] + "(anon-function 2 errol-chal)": [[17, "v1", "process-drawable"]], + "generic-add-constants": [ + [[3, 17], "a0", "dma-packet"] + ], + "generic-init-buf": [ + [[8, 15], "a0", "dma-packet"], + [[17, 24], "a0", "gs-gif-tag"], + [27, "a0", "(pointer gs-zbuf)"], + [29, "a0", "(pointer gs-reg64)"], + [[36, 44], "a0", "dma-packet"], + [[47, 57], "v1", "(pointer uint32)"] + ], + "generic-vu1-init-buf": [ + [[24, 32], "v1", "dma-packet"] + ] } diff --git a/decompiler/config/jak2/var_names.jsonc b/decompiler/config/jak2/var_names.jsonc index 52501b8fcd..16b663f60c 100644 --- a/decompiler/config/jak2/var_names.jsonc +++ b/decompiler/config/jak2/var_names.jsonc @@ -4106,5 +4106,16 @@ "s3-2": "crimson-guard" }, "args": ["obj", "los", "arg2", "target-status"] + }, + "generic-add-constants": { + "vars": { + "a1-4":["a1-4", "vif-tag"] + } + }, + "generic-vu1-init-buffers": { + "vars": { + "s5-0":["s5-0", "gs-zbuf"], + "gp-0":["gp-0", "gs-zbuf"] + } } } diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index ce19fea3fb..cfb5213993 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -148,6 +148,7 @@ set(RUNTIME_SOURCE graphics/opengl_renderer/DirectRenderer.cpp graphics/opengl_renderer/DirectRenderer2.cpp graphics/opengl_renderer/EyeRenderer.cpp + graphics/opengl_renderer/LightningRenderer.cpp graphics/opengl_renderer/dma_helpers.cpp graphics/opengl_renderer/opengl_utils.cpp graphics/opengl_renderer/OpenGLRenderer.cpp diff --git a/game/graphics/opengl_renderer/LightningRenderer.cpp b/game/graphics/opengl_renderer/LightningRenderer.cpp new file mode 100644 index 0000000000..d821a18b42 --- /dev/null +++ b/game/graphics/opengl_renderer/LightningRenderer.cpp @@ -0,0 +1,20 @@ +#include "LightningRenderer.h" + +LightningRenderer::LightningRenderer(const std::string& name, int id) + : BucketRenderer(name, id), m_generic(name, id) {} + +LightningRenderer::~LightningRenderer() {} + +void LightningRenderer::draw_debug_window() { + m_generic.draw_debug_window(); +} + +void LightningRenderer::render(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof) { + m_generic.render_in_mode(dma, render_state, prof, Generic2::Mode::LIGHTNING); +} + +void LightningRenderer::init_shaders(ShaderLibrary& shaders) { + m_generic.init_shaders(shaders); +} \ No newline at end of file diff --git a/game/graphics/opengl_renderer/LightningRenderer.h b/game/graphics/opengl_renderer/LightningRenderer.h new file mode 100644 index 0000000000..df3c5e4625 --- /dev/null +++ b/game/graphics/opengl_renderer/LightningRenderer.h @@ -0,0 +1,16 @@ +#pragma once + +#include "game/graphics/opengl_renderer/BucketRenderer.h" +#include "game/graphics/opengl_renderer/foreground/Generic2.h" + +class LightningRenderer : public BucketRenderer { + public: + LightningRenderer(const std::string& name, int id); + ~LightningRenderer(); + void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override; + void draw_debug_window() override; + void init_shaders(ShaderLibrary& shaders) override; + + private: + Generic2 m_generic; +}; diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 47a2c76670..8448a723ad 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -6,6 +6,7 @@ #include "game/graphics/opengl_renderer/DepthCue.h" #include "game/graphics/opengl_renderer/DirectRenderer.h" #include "game/graphics/opengl_renderer/EyeRenderer.h" +#include "game/graphics/opengl_renderer/LightningRenderer.h" #include "game/graphics/opengl_renderer/ShadowRenderer.h" #include "game/graphics/opengl_renderer/SkyRenderer.h" #include "game/graphics/opengl_renderer/Sprite3.h" @@ -294,6 +295,7 @@ void OpenGLRenderer::init_bucket_renderers_jak2() { init_bucket_renderer("tex-all-sprite", BucketCategory::TEX, BucketId::TEX_ALL_SPRITE); init_bucket_renderer("particles", BucketCategory::SPRITE, BucketId::PARTICLES); + init_bucket_renderer("lightning", BucketCategory::OTHER, BucketId::LIGHTNING); init_bucket_renderer("tex-all-warp", BucketCategory::TEX, BucketId::TEX_ALL_WARP); init_bucket_renderer("debug-no-zbuf1", BucketCategory::OTHER, diff --git a/game/graphics/opengl_renderer/Sprite3.cpp b/game/graphics/opengl_renderer/Sprite3.cpp index 301a23d09c..7f13ba5076 100644 --- a/game/graphics/opengl_renderer/Sprite3.cpp +++ b/game/graphics/opengl_renderer/Sprite3.cpp @@ -994,7 +994,6 @@ void Sprite3::render_jak2(DmaFollower& dma, ASSERT(data0.size_bytes == 0); if (dma.current_tag_offset() == render_state->next_bucket) { - fmt::print("early exit!"); return; } diff --git a/game/graphics/opengl_renderer/buckets.h b/game/graphics/opengl_renderer/buckets.h index aee24dfa06..df9436c951 100644 --- a/game/graphics/opengl_renderer/buckets.h +++ b/game/graphics/opengl_renderer/buckets.h @@ -187,6 +187,7 @@ enum class BucketId { OCEAN_NEAR = 310, TEX_ALL_SPRITE = 312, PARTICLES = 313, + LIGHTNING = 315, TEX_ALL_WARP = 316, DEBUG_NO_ZBUF1 = 318, TEX_ALL_MAP = 319, diff --git a/game/graphics/opengl_renderer/foreground/Generic2.cpp b/game/graphics/opengl_renderer/foreground/Generic2.cpp index 22a4580ea1..4c255d7aa5 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2.cpp @@ -53,6 +53,13 @@ void Generic2::draw_debug_window() { * and then return. */ void Generic2::render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) { + render_in_mode(dma, render_state, prof, Mode::NORMAL); +} + +void Generic2::render_in_mode(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof, + Mode mode) { // completely clear out state. These will get populated by the rendering functions, then displayed // by draw_debug_window() if the user opens that window m_debug.clear(); @@ -71,7 +78,16 @@ void Generic2::render(DmaFollower& dma, SharedRenderState* render_state, ScopedP { // our first pass is to go over the DMA chain from the game and extract the data into buffers auto p = prof.make_scoped_child("dma"); - process_dma(dma, render_state->next_bucket); + switch (mode) { + case Mode::NORMAL: + process_dma(dma, render_state->next_bucket); + break; + case Mode::LIGHTNING: + process_dma_lightning(dma, render_state->next_bucket); + break; + default: + ASSERT_NOT_REACHED(); + } } { @@ -86,4 +102,4 @@ void Generic2::render(DmaFollower& dma, SharedRenderState* render_state, ScopedP auto p = prof.make_scoped_child("drawing"); do_draws(render_state, p); } -} +} \ No newline at end of file diff --git a/game/graphics/opengl_renderer/foreground/Generic2.h b/game/graphics/opengl_renderer/foreground/Generic2.h index 51da7ad83e..a5e9114cc8 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2.h +++ b/game/graphics/opengl_renderer/foreground/Generic2.h @@ -12,6 +12,17 @@ class Generic2 : public BucketRenderer { u32 num_buckets = 800); ~Generic2(); void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override; + + enum class Mode { + NORMAL, + LIGHTNING, + }; + + void render_in_mode(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof, + Mode mode); + void draw_debug_window() override; void init_shaders(ShaderLibrary& shaders) override; @@ -35,6 +46,7 @@ class Generic2 : public BucketRenderer { void reset_buffers(); void process_matrices(); void process_dma(DmaFollower& dma, u32 next_bucket); + void process_dma_lightning(DmaFollower& dma, u32 next_bucket); void setup_draws(); void do_draws(SharedRenderState* render_state, ScopedProfilerNode& prof); void do_draws_for_alpha(SharedRenderState* render_state, diff --git a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp index 6814b6d19d..d7cadb2141 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp @@ -109,7 +109,7 @@ void Generic2::determine_draw_modes() { u64 bonus_adgif_data[4]; memcpy(bonus_adgif_data, frag.header + (5 * 16), 4 * sizeof(u64)); - u64 final_test; + std::optional final_test; if ((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::ALPHA_1)) { ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::ALPHA_1)); final_alpha = bonus_adgif_data[0]; @@ -117,15 +117,17 @@ void Generic2::determine_draw_modes() { final_test = bonus_adgif_data[2]; } else { // ADGIF 5 - ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::TEST_1)); - final_test = bonus_adgif_data[0]; + if ((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::TEST_1)) { + final_test = bonus_adgif_data[0]; + } // ADGIF 6 if ((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::ALPHA_1)) { final_alpha = bonus_adgif_data[2]; } else { - ASSERT((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::TEST_1)); - final_test = bonus_adgif_data[2]; + if ((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::TEST_1)) { + final_test = bonus_adgif_data[2]; + } } } @@ -165,8 +167,8 @@ void Generic2::determine_draw_modes() { } } - { - GsTest reg(final_test); + if (final_test) { + GsTest reg(*final_test); current_mode.set_at(reg.alpha_test_enable()); if (reg.alpha_test_enable()) { switch (reg.alpha_test()) { diff --git a/game/graphics/opengl_renderer/foreground/Generic2_DMA.cpp b/game/graphics/opengl_renderer/foreground/Generic2_DMA.cpp index f534702772..1c5a3274e7 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_DMA.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_DMA.cpp @@ -385,3 +385,133 @@ void Generic2::process_dma(DmaFollower& dma, u32 next_bucket) { } } } + +bool is_nop_zero(const DmaTransfer& xf) { + return xf.size_bytes == 0 && xf.vifcode0().kind == VifCode::Kind::NOP && + xf.vifcode1().kind == VifCode::Kind::NOP; +} + +void unpack_vertex(Generic2::Vertex* out, const u8* in, int count) { + for (int i = 0; i < count; i++) { + // st: + s32 s, t; + memcpy(&s, in, 4); + memcpy(&t, in + 4, 4); + s32 s_masked = s & 0xfffffffe; + out->st[0] = s_masked; + out->st[1] = t; + out->adc = s_masked == s; + + // rgba + u32 data[4]; + memcpy(data, in + 16, 16); + for (int j = 0; j < 4; j++) { + out->rgba[j] = data[j]; + } + + // pos + float p[4]; + memcpy(p, in + 32, 16); + for (int j = 0; j < 3; j++) { + out->xyz[j] = p[j]; + } + + out++; + in += (16 * 3); + } +} + +void Generic2::process_dma_lightning(DmaFollower& dma, u32 next_bucket) { + reset_buffers(); + auto first_data = dma.read_and_advance(); + // if unused, sends 0 nop nop + if (is_nop_zero(first_data) && next_bucket == dma.current_tag_offset()) { + return; + } + + // intro: + // 0: MARK NOP (profiling) + auto v0k = first_data.vifcode0().kind; + ASSERT((v0k == VifCode::Kind::MARK || v0k == VifCode::Kind::NOP) && + first_data.vifcode1().kind == VifCode::Kind::NOP); + // 32: NOP DIRECT (set GS registers) + // for lightning, this is always masking z writes + 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); + m_drawing_config.zmsk = true; + + // 128: STCYCL cl: 4 wl: 4 UNPACK-V4-32: 8 addr: 897 us: false tops: false + // upload VU1 constants + + /* + (deftype generic-constants (structure) + ((fog vector :inline :offset-assert 0) + (adgif gs-gif-tag :inline :offset-assert 16) ;; was qword + (hvdf-offset vector :inline :offset-assert 32) + (hmge-scale vector :inline :offset-assert 48) + (invh-scale vector :inline :offset-assert 64) + (guard vector :inline :offset-assert 80) + (flush qword :inline :offset-assert 96) + (stores qword :inline :offset-assert 112) + ) + ) + */ + 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); + + // 32: MSCALF 0x0 STMOD 0b0 + auto mscalf = dma.read_and_advance(); + ASSERT(mscalf.vifcode0().kind == VifCode::Kind::MSCALF && + mscalf.vifcode1().kind == VifCode::Kind::STMOD); + // 0: NOP NOP + auto another_nop = dma.read_and_advance(); + ASSERT(is_nop_zero(another_nop)); + + auto maybe_first_upload = dma.read_and_advance(); + while (maybe_first_upload.vifcode1().kind == VifCode::Kind::UNPACK_V4_32) { + auto second_upload = dma.read_and_advance(); + auto mscal = dma.read_and_advance(); + (void)mscal; + + auto* frag = &next_frag(); + ASSERT(maybe_first_upload.size_bytes == Generic2::FRAG_HEADER_SIZE + 5 * 16); // header + adgif + memcpy(frag->header, maybe_first_upload.data, Generic2::FRAG_HEADER_SIZE); + frag->adgif_idx = m_next_free_adgif; + frag->adgif_count = 1; + frag->mscal_addr = 6; + frag->uses_hud = false; + auto* adgif = &next_adgif(); + memcpy(&adgif->data, maybe_first_upload.data + Generic2::FRAG_HEADER_SIZE, sizeof(AdGifData)); + // (new 'static 'gif-tag-regs-32 :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 + // (gif-reg-id xyzf2)) + int num_vtx = second_upload.size_bytes / (16 * 3); + frag->vtx_count = num_vtx; + frag->vtx_idx = m_next_free_vert; + alloc_vtx(num_vtx); + unpack_vertex(&m_verts[frag->vtx_idx], second_upload.data, num_vtx); + + // run + // 192: NOP UNPACK-V4-32: 12 addr: 837 us: false tops: false + // 1536: NOP UNPACK-V4-32: 96 addr: 9 us: false tops: false + // 0: NOP MSCAL 0x6 + + maybe_first_upload = dma.read_and_advance(); + } + + // ending: + // 0: NOP NOP + // 160: FLUSHA DIRECT + // 0: NOP NOP + auto flusha = dma.read_and_advance(); + (void)flusha; + auto end = dma.read_and_advance(); + (void)end; + ASSERT(next_bucket == dma.current_tag_offset()); +} \ No newline at end of file diff --git a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp index 1ea2638e02..9eee90fad2 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp @@ -135,7 +135,7 @@ void Generic2::setup_opengl_for_draw_mode(const DrawMode& draw_mode, // (Cs - 0) * As + Cd // Cs * As + (1) * Cd // s, d - ASSERT(fix == 0); + // fix is ignored. it's usually 0, except for lightning, which sets it to 0x80. glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD); } else if (draw_mode.get_alpha_blend() == DrawMode::AlphaBlend::ZERO_SRC_SRC_DST) { diff --git a/game/graphics/opengl_renderer/shaders/generic.vert b/game/graphics/opengl_renderer/shaders/generic.vert index e364b1f3af..684ebf0345 100644 --- a/game/graphics/opengl_renderer/shaders/generic.vert +++ b/game/graphics/opengl_renderer/shaders/generic.vert @@ -19,6 +19,8 @@ out float fog; out flat uvec2 tex_info; +const float SCISSOR_ADJUST = HEIGHT_SCALE * 512.0/448.0; + void main() { // lq.xy vf22, 0(vi10) texture load? // lq_buffer(Mask::xy, vu.vf22, vu.vi10); @@ -79,7 +81,7 @@ void main() { gl_Position = transformed; // scissoring area adjust - gl_Position.y *= 512.0/448.0; + gl_Position.y *= SCISSOR_ADJUST; fragment_color = vec4(rgba_in.rgb, rgba_in.a * 2); tex_info = byte_info.xy; diff --git a/game/graphics/texture/TexturePool.h b/game/graphics/texture/TexturePool.h index 74577974b2..3a4beaf317 100644 --- a/game/graphics/texture/TexturePool.h +++ b/game/graphics/texture/TexturePool.h @@ -347,7 +347,7 @@ class TexturePool { void draw_debug_window(); void relocate(u32 destination, u32 source, u32 format); void draw_debug_for_tex(const std::string& name, GpuTexture* tex, u32 slot); - const std::array all_textures() const { + const std::array& all_textures() const { return m_textures; } void move_existing_to_vram(GpuTexture* tex, u32 slot_addr); diff --git a/goal_src/jak2/engine/debug/default-menu.gc b/goal_src/jak2/engine/debug/default-menu.gc index e1f6cc7908..24c2cc0ba1 100644 --- a/goal_src/jak2/engine/debug/default-menu.gc +++ b/goal_src/jak2/engine/debug/default-menu.gc @@ -394,20 +394,68 @@ ) (cond ((zero? a1-1) - (set! (-> v1-3 base-strgif qword vector4w y) #x303e4000) - (set! (-> v1-3 base-strgif qword vector4w x) #x303ec000) + (set! (-> v1-3 base-strgif 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 + ) + ) + (set! (-> v1-3 base-strgif 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 + ) + ) ) ((= a1-1 1) - (set! (-> v1-3 base-strgif qword vector4w y) #x303d4000) - (set! (-> v1-3 base-strgif qword vector4w x) #x303d4000) + (set! (-> v1-3 base-strgif str-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> v1-3 base-strgif fan-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) ) ((= a1-1 2) - (set! (-> v1-3 base-strgif qword vector4w y) #x30364000) - (set! (-> v1-3 base-strgif qword vector4w x) #x3036c000) + (set! (-> v1-3 base-strgif str-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> v1-3 base-strgif fan-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) ) ((= a1-1 3) - (set! (-> v1-3 base-strgif qword vector4w y) #x30354000) - (set! (-> v1-3 base-strgif qword vector4w x) #x3036c000) + (set! (-> v1-3 base-strgif str-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> v1-3 base-strgif fan-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) ) ) ) diff --git a/goal_src/jak2/engine/draw/drawable.gc b/goal_src/jak2/engine/draw/drawable.gc index 55dfd401da..10e9a289e5 100644 --- a/goal_src/jak2/engine/draw/drawable.gc +++ b/goal_src/jak2/engine/draw/drawable.gc @@ -1375,7 +1375,7 @@ ;;(generic-merc-execute-all gp-0) ;;(shadow-execute-all gp-0) ) - ;;(lightning-draw-all) + (lightning-draw-all) (none) ) @@ -2057,7 +2057,7 @@ (tie-vu1-init-buffers) (merc-vu1-init-buffers) ; (emerc-vu1-init-buffers) - ; (generic-vu1-init-buffers) + (generic-vu1-init-buffers) ;; sprite texture remaps (when (-> *texture-pool* update-sprites-flag) diff --git a/goal_src/jak2/engine/gfx/generic/generic-h.gc b/goal_src/jak2/engine/gfx/generic/generic-h.gc index a0ff630474..6840d626ed 100644 --- a/goal_src/jak2/engine/gfx/generic/generic-h.gc +++ b/goal_src/jak2/engine/gfx/generic/generic-h.gc @@ -30,6 +30,7 @@ :flag-assert #x900000020 ) + (deftype gsf-vertex-array (structure) ((vtx gsf-vertex :dynamic :offset-assert 0) ) @@ -38,6 +39,7 @@ :flag-assert #x900000000 ) + (deftype gsf-fx-vertex (structure) ((clr vector4ub :inline :offset-assert 0) (tex vector2uh :inline :offset-assert 4) @@ -47,6 +49,7 @@ :flag-assert #x900000008 ) + (deftype gsf-fx-vertex-array (structure) ((data gsf-fx-vertex :dynamic :offset-assert 0) ) @@ -55,6 +58,7 @@ :flag-assert #x900000000 ) + (deftype gsf-header (structure) ((num-strips uint8 :offset-assert 0) (num-new-vtxs uint8 :offset-assert 1) @@ -67,6 +71,7 @@ :flag-assert #x900000010 ) + (deftype gsf-ik (structure) ((index uint8 :offset-assert 0) (no-kick uint8 :offset-assert 1) @@ -76,6 +81,7 @@ :flag-assert #x900000002 ) + (deftype gsf-info (structure) ((ptr-iks uint32 :offset-assert 0) (ptr-verts uint32 :offset-assert 4) @@ -87,6 +93,7 @@ :flag-assert #x900000010 ) + (deftype gsf-buffer (structure) ((data uint8 8192 :offset-assert 0) (info gsf-info :inline :offset 0) @@ -98,6 +105,7 @@ :flag-assert #x900002000 ) + (deftype generic-frag (structure) ((start-pos uint16 :offset-assert 0) (end-pos uint16 :offset-assert 2) @@ -107,6 +115,7 @@ :flag-assert #x900000004 ) + (deftype generic-strip (structure) ((pos uint16 :offset-assert 0) (len uint16 :offset-assert 2) @@ -116,6 +125,7 @@ :flag-assert #x900000004 ) + (deftype generic-envmap-saves (structure) ((index-mask vector4w :inline :offset-assert 0) (verts uint128 12 :offset-assert 16) @@ -126,6 +136,7 @@ :flag-assert #x900000110 ) + (deftype generic-interp-job (structure) ((job-type uint16 :offset-assert 0) (num uint16 :offset-assert 2) @@ -141,6 +152,7 @@ :flag-assert #x900000010 ) + (deftype generic-saves (structure) ((ptr-dma uint32 :offset-assert 0) (ptr-vtxs uint32 :offset-assert 4) @@ -174,19 +186,21 @@ :flag-assert #x900000170 ) + (deftype generic-gif-tag (structure) - ((data uint32 4 :offset-assert 0) - (qword qword :inline :offset 0) - (fan-prim uint32 :offset 0) - (str-prim uint32 :offset 4) - (regs uint32 :offset 8) - (num-strips uint32 :offset 12) + ((data uint32 4 :offset-assert 0) + (qword qword :inline :offset 0) + (fan-prim gif-tag-prim :offset 0) + (str-prim gif-tag-prim :offset 4) + (regs gif-tag-regs-32 :offset 8) + (num-strips uint32 :offset 12) ) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) + (deftype generic-envmap-consts (structure) ((consts vector :inline :offset-assert 0) (strgif generic-gif-tag :inline :offset-assert 16) @@ -198,6 +212,7 @@ :flag-assert #x900000080 ) + (deftype generic-consts (structure) ((dma-header dma-packet :inline :offset-assert 0) (vif-header uint32 4 :offset-assert 16) @@ -228,6 +243,7 @@ :flag-assert #x9000001b0 ) + (deftype generic-storage (structure) ((data uint128 16 :offset-assert 0) ) @@ -236,10 +252,9 @@ :flag-assert #x900000100 ) + (kmemopen global "gsf-buffer") + (define *gsf-buffer* (the-as gsf-buffer (kmalloc global 9216 (kmalloc-flags align-64) "malloc"))) + (kmemclose) - - - - diff --git a/goal_src/jak2/engine/gfx/generic/generic-vu1.gc b/goal_src/jak2/engine/gfx/generic/generic-vu1.gc index 5d0571e226..3c6fdf383f 100644 --- a/goal_src/jak2/engine/gfx/generic/generic-vu1.gc +++ b/goal_src/jak2/engine/gfx/generic/generic-vu1.gc @@ -7,3 +7,192 @@ ;; DECOMP BEGINS +(define generic-vu1-block (new 'static 'vu-function #|:length #x6de :qlength #x36f|#)) + +(defun generic-setup-constants ((arg0 generic-constants)) + (let ((v1-0 *math-camera*)) + (set-vector! (-> arg0 fog) (-> v1-0 pfog0) (-> v1-0 fog-min) (-> v1-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 hvdf-offset quad) (-> v1-0 hvdf-off quad)) + (set! (-> arg0 hmge-scale quad) (-> v1-0 hmge-scale quad)) + (set! (-> arg0 invh-scale quad) (-> v1-0 inv-hmge-scale quad)) + (set! (-> arg0 guard quad) (-> v1-0 guard quad)) + ) + (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)) + (let* ((a1-0 8) + (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 a1-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 a1-0)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-1 16))) + ) + (generic-setup-constants (the-as generic-constants (-> arg0 base))) + (&+! (-> arg0 base) 128) + (none) + ) + +;; definition for function generic-setup-shrub-constants +;; ERROR: function has no type analysis. Cannot decompile. + +;; definition for function generic-add-shrub-constants +;; ERROR: failed type prop at 20: Called a function, but we do not know its type + +(defun generic-init-buf ((arg0 dma-buffer) (arg1 gs-zbuf)) + (dma-buffer-add-vu-function arg0 generic-vu1-block 1) + (let* ((v1-0 arg0) + (a0-2 (the-as dma-packet (-> v1-0 base))) + ) + (set! (-> a0-2 dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt))) + (set! (-> a0-2 vif0) (new 'static 'vif-tag)) + (set! (-> a0-2 vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1)) + (set! (-> v1-0 base) (the-as pointer (&+ a0-2 16))) + ) + (let* ((v1-1 arg0) + (a0-4 (the-as gs-gif-tag (-> v1-1 base))) + ) + (set! (-> a0-4 tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1)) + (set! (-> a0-4 regs) GIF_REGS_ALL_AD) + (set! (-> v1-1 base) (the-as pointer (&+ a0-4 16))) + ) + (let* ((v1-2 arg0) + (a0-6 (-> v1-2 base)) + ) + (set! (-> (the-as (pointer gs-zbuf) a0-6) 0) arg1) + (set! (-> (the-as (pointer gs-reg64) a0-6) 1) (gs-reg64 zbuf-1)) + (set! (-> v1-2 base) (&+ a0-6 16)) + ) + (generic-add-constants arg0) + (let* ((v1-3 arg0) + (a0-9 (the-as dma-packet (-> v1-3 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-3 base) (the-as pointer (&+ a0-9 16))) + ) + (let ((v1-4 (-> arg0 base))) + (set! (-> (the-as (pointer uint32) v1-4) 0) (the-as uint #x3000000)) + (set! (-> (the-as (pointer uint32) v1-4) 1) (the-as uint #x2000000)) + (set! (-> (the-as (pointer uint32) v1-4) 2) (the-as uint 0)) + (set! (-> (the-as (pointer uint32) v1-4) 3) (the-as uint #x30000000)) + (set! (-> (the-as (pointer uint32) v1-4) 4) (the-as uint 0)) + (set! (-> (the-as (pointer uint32) v1-4) 5) (the-as uint 0)) + (set! (-> (the-as (pointer uint32) v1-4) 6) (the-as uint 0)) + (set! (-> (the-as (pointer uint32) v1-4) 7) (the-as uint 0)) + (set! (-> arg0 base) (&+ v1-4 32)) + ) + 0 + (none) + ) + +(defun generic-vu1-init-buf ((arg0 bucket-id) (arg1 gs-zbuf)) + (let ((gp-0 (-> *display* frames (-> *display* on-screen) bucket-group arg0))) + (when (!= gp-0 (-> gp-0 last)) + (let* ((s5-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (s4-1 (-> s5-0 base)) + ) + (generic-init-buf s5-0 arg1) + (let ((v1-12 (the-as object (-> s5-0 base)))) + (set! (-> (the-as dma-packet v1-12) dma) (new 'static 'dma-tag :id (dma-tag-id next) :addr (-> gp-0 next))) + (set! (-> (the-as dma-packet v1-12) vif0) (new 'static 'vif-tag)) + (set! (-> (the-as dma-packet v1-12) vif1) (new 'static 'vif-tag)) + (set! (-> s5-0 base) (the-as pointer (&+ (the-as dma-packet v1-12) 16))) + ) + (set! (-> gp-0 next) (the-as uint s4-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)) +; ) +; (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) +; ) + +;; definition for function generic-vu1-init-buffers +(defun generic-vu1-init-buffers () + (when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask generic)) + (let ((s5-0 (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24)))) + (let ((gp-0 (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24) :zmsk #x1))) + (when #t + (generic-vu1-init-buf (bucket-id gmerc-l0-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l1-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l2-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l3-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l4-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l5-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-lcom-tfrag) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l0-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l1-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l2-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l3-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l4-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l5-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-lcom-pris) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l0-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l1-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l2-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l3-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l4-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l5-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-lcom-shrub) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l0-alpha) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l1-alpha) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l2-alpha) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l3-alpha) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l4-alpha) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l5-alpha) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l0-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l1-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l2-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l3-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l4-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l5-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-lcom-pris2) s5-0) + (generic-vu1-init-buf (bucket-id gmerc-l0-water) gp-0) + (generic-vu1-init-buf (bucket-id gmerc-l1-water) gp-0) + (generic-vu1-init-buf (bucket-id gmerc-l2-water) gp-0) + (generic-vu1-init-buf (bucket-id gmerc-l3-water) gp-0) + (generic-vu1-init-buf (bucket-id gmerc-l4-water) gp-0) + (generic-vu1-init-buf (bucket-id gmerc-l5-water) gp-0) + (generic-vu1-init-buf (bucket-id gmerc-lcom-water) gp-0) + ) + (generic-vu1-init-buf (bucket-id bucket-315) gp-0) + ) + ;; no warp yet + ;(generic-vu1-init-buf-special (bucket-id gmerc-warp) s5-0) + ) + ) + (none) + ) + + + + diff --git a/goal_src/jak2/engine/gfx/hw/gs.gc b/goal_src/jak2/engine/gfx/hw/gs.gc index 026ec7ca30..7783f38d09 100644 --- a/goal_src/jak2/engine/gfx/hw/gs.gc +++ b/goal_src/jak2/engine/gfx/hw/gs.gc @@ -801,15 +801,30 @@ :flag-assert #x9000000a4 ) +(defenum gif-flag + :type uint8 + (packed 0) + (reg-list 1) + (image 2) + (disable 3) + ) + (deftype gif-tag-prim (uint32) - () + ((id uint16 :offset 0 :size 14) + (pre uint8 :offset 14 :size 1) + (prim gs-prim :offset 15 :size 11) + (flg gif-flag :offset 26 :size 2) + (nreg uint8 :offset 28 :size 4) + ) :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 ) (deftype gif-tag-count (uint32) - () + ((nloop uint16 :offset 0 :size 15) + (eop uint8 :offset 15 :size 1) + ) :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 @@ -834,13 +849,6 @@ (nop 15) ) -(defenum gif-flag - :type uint8 - (packed 0) - (reg-list 1) - (image 2) - (disable 3) - ) (deftype gif-tag64 (uint64) ((nloop uint16 :offset 0 :size 15) @@ -906,6 +914,17 @@ ) ) +(deftype gif-tag-regs-32 (uint32) + ((regs0 gif-reg-id :offset 0 :size 4) + (regs1 gif-reg-id :offset 4 :size 4) + (regs2 gif-reg-id :offset 8 :size 4) + (regs3 gif-reg-id :offset 12 :size 4) + (regs4 gif-reg-id :offset 16 :size 4) + (regs5 gif-reg-id :offset 20 :size 4) + (regs6 gif-reg-id :offset 24 :size 4) + (regs7 gif-reg-id :offset 28 :size 4)) + ) + ;; we unfortunately kind of need this (defmacro gif-tag->static-array (tag regs) "Allocates a new static array of two uint64's making up the gif-tag and the tag registers" diff --git a/goal_src/jak2/engine/gfx/lightning.gc b/goal_src/jak2/engine/gfx/lightning.gc index 3fec78ae8e..66fcc14d80 100644 --- a/goal_src/jak2/engine/gfx/lightning.gc +++ b/goal_src/jak2/engine/gfx/lightning.gc @@ -18,7 +18,19 @@ (define *lightning-gcf* (new 'static 'gcf-control - :giftag (new 'static 'generic-gif-tag :data (new 'static 'array uint32 4 #x302ec000 #x302e4000 #x412 #x0)) + :giftag (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)) + ) :adnops (new 'static 'inline-array gs-adcmd 2 (new 'static 'gs-adcmd :word (new 'static 'array uint32 4 #x0 #x0 #x7f #x0)) (new 'static 'gs-adcmd :word (new 'static 'array uint32 4 #x0 #x0 #x7f #x0)) @@ -687,7 +699,7 @@ (set! (-> v1-86 trans quad) a3-32) ) (quad-copy! (the-as pointer (-> sv-176 giftag)) (the-as pointer (-> s1-0 giftag)) 3) - (set! (-> sv-176 giftag qword vector4w w) 1) + (set! (-> sv-176 giftag num-strips) (the-as uint 1)) (set! (-> sv-176 num-dps) (the-as uint (* sv-144 2))) (set! (-> sv-176 kick-offset) (the-as uint 0)) (adgif-shader<-texture-simple! (the-as adgif-shader (-> sv-176 shader)) sv-32) @@ -802,8 +814,7 @@ (define *lightning* #t) -;; WARN: Failed store: (s.w! (+ v1-31 8) 0) at op 89 -;; WARN: Failed store: (s.w! (+ v1-31 12) 0) at op 90 +;; ERROR: Failed store: (s.w! (+ v1-31 8) 0) at op 89 (defun lightning-draw-all () (when (and *lightning* (not (-> *blit-displays-work* menu-mode))) (when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask generic)) diff --git a/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc b/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc index b060e54bff..b0a63af055 100644 --- a/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc @@ -372,20 +372,68 @@ ) (cond ((zero? a1-1) - (set! (-> v1-3 base-strgif qword vector4w y) #x303e4000) - (set! (-> v1-3 base-strgif qword vector4w x) #x303ec000) + (set! (-> v1-3 base-strgif 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 + ) + ) + (set! (-> v1-3 base-strgif 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 + ) + ) ) ((= a1-1 1) - (set! (-> v1-3 base-strgif qword vector4w y) #x303d4000) - (set! (-> v1-3 base-strgif qword vector4w x) #x303d4000) + (set! (-> v1-3 base-strgif str-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> v1-3 base-strgif fan-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :tme #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) ) ((= a1-1 2) - (set! (-> v1-3 base-strgif qword vector4w y) #x30364000) - (set! (-> v1-3 base-strgif qword vector4w x) #x3036c000) + (set! (-> v1-3 base-strgif str-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> v1-3 base-strgif fan-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) ) ((= a1-1 3) - (set! (-> v1-3 base-strgif qword vector4w y) #x30354000) - (set! (-> v1-3 base-strgif qword vector4w x) #x3036c000) + (set! (-> v1-3 base-strgif str-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type line-strip) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) + (set! (-> v1-3 base-strgif fan-prim) + (new 'static 'gif-tag-prim + :pre #x1 + :prim (new 'static 'gs-prim :prim (gs-prim-type tri-fan) :iip #x1 :fge #x1 :abe #x1) + :nreg #x3 + ) + ) ) ) ) diff --git a/test/decompiler/reference/jak2/engine/gfx/generic/generic-h_REF.gc b/test/decompiler/reference/jak2/engine/gfx/generic/generic-h_REF.gc index 9c1e20f352..d1211e8bd5 100644 --- a/test/decompiler/reference/jak2/engine/gfx/generic/generic-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/generic/generic-h_REF.gc @@ -392,12 +392,12 @@ ;; definition of type generic-gif-tag (deftype generic-gif-tag (structure) - ((data uint32 4 :offset-assert 0) - (qword qword :inline :offset 0) - (fan-prim uint32 :offset 0) - (str-prim uint32 :offset 4) - (regs uint32 :offset 8) - (num-strips uint32 :offset 12) + ((data uint32 4 :offset-assert 0) + (qword qword :inline :offset 0) + (fan-prim gif-tag-prim :offset 0) + (str-prim gif-tag-prim :offset 4) + (regs gif-tag-regs-32 :offset 8) + (num-strips uint32 :offset 12) ) :method-count-assert 9 :size-assert #x10 @@ -411,8 +411,8 @@ (goto cfg-4) ) (format #t "[~8x] ~A~%" obj 'generic-gif-tag) - (format #t "~1Tdata[4] @ #x~X~%" (-> obj data)) - (format #t "~1Tqword: #~%" (-> obj data)) + (format #t "~1Tdata[4] @ #x~X~%" (&-> obj fan-prim)) + (format #t "~1Tqword: #~%" (&-> obj fan-prim)) (format #t "~1Tfan-prim: ~D~%" (-> obj fan-prim)) (format #t "~1Tstr-prim: ~D~%" (-> obj str-prim)) (format #t "~1Tregs: ~D~%" (-> obj regs)) diff --git a/test/decompiler/reference/jak2/engine/gfx/hw/gs_REF.gc b/test/decompiler/reference/jak2/engine/gfx/hw/gs_REF.gc index 0dd12bc17a..46a7a53531 100644 --- a/test/decompiler/reference/jak2/engine/gfx/hw/gs_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/hw/gs_REF.gc @@ -740,7 +740,12 @@ bits 5 and 6 (0x20 and 0x40) should be zero" ;; definition of type gif-tag-prim (deftype gif-tag-prim (uint32) - () + ((id uint16 :offset 0 :size 14) + (pre uint8 :offset 14 :size 1) + (prim gs-prim :offset 15 :size 11) + (flg gif-flag :offset 26 :size 2) + (nreg uint8 :offset 28 :size 4) + ) :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 @@ -748,7 +753,9 @@ bits 5 and 6 (0x20 and 0x40) should be zero" ;; definition of type gif-tag-count (deftype gif-tag-count (uint32) - () + ((nloop uint16 :offset 0 :size 15) + (eop uint8 :offset 15 :size 1) + ) :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 diff --git a/test/decompiler/reference/jak2/engine/gfx/lightning_REF.gc b/test/decompiler/reference/jak2/engine/gfx/lightning_REF.gc index 0359ff5106..8bafaa3195 100644 --- a/test/decompiler/reference/jak2/engine/gfx/lightning_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/lightning_REF.gc @@ -13,7 +13,19 @@ ;; definition for symbol *lightning-gcf*, type gcf-control (define *lightning-gcf* (new 'static 'gcf-control - :giftag (new 'static 'generic-gif-tag :data (new 'static 'array uint32 4 #x302ec000 #x302e4000 #x412 #x0)) + :giftag (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)) + ) :adnops (new 'static 'inline-array gs-adcmd 2 (new 'static 'gs-adcmd :word (new 'static 'array uint32 4 #x0 #x0 #x7f #x0)) (new 'static 'gs-adcmd :word (new 'static 'array uint32 4 #x0 #x0 #x7f #x0)) @@ -728,7 +740,7 @@ (set! (-> v1-86 trans quad) a3-32) ) (quad-copy! (the-as pointer (-> sv-176 giftag)) (the-as pointer (-> s1-0 giftag)) 3) - (set! (-> sv-176 giftag qword vector4w w) 1) + (set! (-> sv-176 giftag num-strips) (the-as uint 1)) (set! (-> sv-176 num-dps) (the-as uint (* sv-144 2))) (set! (-> sv-176 kick-offset) (the-as uint 0)) (adgif-shader<-texture-simple! (the-as adgif-shader (-> sv-176 shader)) sv-32) @@ -848,8 +860,7 @@ ;; definition for function lightning-draw-all ;; WARN: Return type mismatch int vs none. -;; WARN: Failed store: (s.w! (+ v1-31 8) 0) at op 89 -;; WARN: Failed store: (s.w! (+ v1-31 12) 0) at op 90 +;; ERROR: Failed store: (s.w! (+ v1-31 8) 0) at op 89 (defun lightning-draw-all () (when (and *lightning* (not (-> *blit-displays-work* menu-mode))) (when (logtest? (-> *display* vu1-enable-user) (vu1-renderer-mask generic)) diff --git a/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc b/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc index 3d1c1f666e..051047ff4e 100644 --- a/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/shrub/shrubbery_REF.gc @@ -427,10 +427,9 @@ ;; definition for function draw-prototype-inline-array-shrub ;; INFO: Used lq/sq -;; ERROR: Function may read a register that is not set: a2 +;; ERROR: Failed load: (set! a2-26 (l.d (+ a0-26 96))) at op 223 (defun draw-prototype-inline-array-shrub ((proto-array-len int) (proto-array (inline-array prototype-bucket-shrub))) (local-vars - (dma-ptr object) (sv-16 drawable) (sv-32 uint) (sv-48 int) @@ -456,22 +455,18 @@ ) (&+! (-> a0-6 base) 16) ) - (set! dma-ptr - (when (nonzero? (-> v1-0 count 2)) - (let ((a2-7 (-> a0-6 base))) - (set! (-> (the-as (pointer uint128) a2-7)) (-> *instance-shrub-work* count-tmpl (-> v1-0 mod-count 2) quad)) - (set! (-> (the-as (pointer uint64) a2-7)) - (logior (logand (-> (the-as (pointer uint64) a2-7)) (the-as uint #x80000000ffffffff)) - (shr (shl (-> v1-0 next 2) 33) 1) - ) - ) - (set! (-> v1-0 next 2) (the-as uint a2-7)) + (when (nonzero? (-> v1-0 count 2)) + (let ((a2-7 (-> a0-6 base))) + (set! (-> (the-as (pointer uint128) a2-7)) (-> *instance-shrub-work* count-tmpl (-> v1-0 mod-count 2) quad)) + (set! (-> (the-as (pointer uint64) a2-7)) + (logior (logand (-> (the-as (pointer uint64) a2-7)) (the-as uint #x80000000ffffffff)) + (shr (shl (-> v1-0 next 2) 33) 1) + ) ) - (set! dma-ptr (&+ (-> a0-6 base) 16)) - (set! (-> a0-6 base) (the-as pointer dma-ptr)) - dma-ptr - ) - ) + (set! (-> v1-0 next 2) (the-as uint a2-7)) + ) + (&+! (-> a0-6 base) 16) + ) (&+! v1-0 112) ) ) @@ -481,7 +476,7 @@ (let* ((s2-0 (-> *display* frames (-> *display* on-screen) global-buf)) (s3-0 (-> s2-0 base)) ) - (generic-init-buf s2-0 #x1000130 (the-as gs-zbuf dma-ptr)) + (generic-init-buf s2-0 (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24))) (generic-add-shrub-constants s2-0 #x5026b 60 61) (let ((a0-14 (the-as @@ -493,11 +488,11 @@ (a1-7 (the-as object (+ (-> *instance-shrub-work* near-last) 176))) ) (set! (-> a0-14 init-tmpl dma addr) (-> *instance-shrub-work* near-next)) - (let ((a2-13 (-> a0-14 init-tmpl quad)) + (let ((a2-14 (-> a0-14 init-tmpl quad)) (a3-18 (-> a0-14 init-data 0 quad)) (a0-15 (-> a0-14 init-data 1 quad)) ) - (set! (-> (the-as vector4w-3 v1-23) vector 0 quad) a2-13) + (set! (-> (the-as vector4w-3 v1-23) vector 0 quad) a2-14) (set! (-> (the-as vector4w-3 v1-23) vector 1 quad) a3-18) (set! (-> (the-as vector4w-3 v1-23) vector 2 quad) a0-15) ) @@ -517,7 +512,6 @@ (a0-18 (-> *display* frames (-> *display* on-screen) bucket-group)) (v1-32 *draw-index*) ) - (set! dma-ptr s3-0) (t9-2 a0-18 (cond @@ -540,7 +534,7 @@ (bucket-id shrub-n-l5-shrub) ) ) - (the-as pointer dma-ptr) + s3-0 (the-as (pointer dma-tag) a3-19) ) ) @@ -551,10 +545,9 @@ (set! (-> v1-33 length) (max 28 (-> v1-33 length))) (set! (-> v1-33 data 27 name) "shrubbery") (+! (-> v1-33 data 27 count) 1) - (let ((a1-19 (-> v1-33 data 27 used))) - (set! dma-ptr (&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint s4-0))) - (set! (-> v1-33 data 27 used) (+ a1-19 (the-as int dma-ptr))) - ) + (+! (-> v1-33 data 27 used) + (&- (-> *display* frames (-> *display* on-screen) global-buf base) (the-as uint s4-0)) + ) (set! (-> v1-33 data 27 total) (-> v1-33 data 27 used)) ) ) @@ -565,7 +558,7 @@ (let* ((s2-1 (-> *display* frames (-> *display* on-screen) global-buf)) (s3-1 (-> s2-1 base)) ) - (generic-init-buf s2-1 #x1000130 (the-as gs-zbuf dma-ptr)) + (generic-init-buf s2-1 (new 'static 'gs-zbuf :zbp #x130 :psm (gs-psm ct24))) (generic-add-shrub-constants s2-1 #x51001 124 125) (let ((a0-26 (+ (+ (-> *instance-shrub-work* current-shrub-near-trans-packet) 5152) (the-as uint *instance-shrub-work*)) @@ -573,18 +566,18 @@ (v1-50 (-> s2-1 base)) (a1-26 (+ (-> *instance-shrub-work* near-trans-last) 176)) ) - (let ((a2-25 (logior (logand (l.d (+ a0-26 96)) (the-as uint #x80000000ffffffff)) + (let ((a2-28 (logior (logand (l.d (+ a0-26 96)) (the-as uint #x80000000ffffffff)) (shr (shl (-> *instance-shrub-work* near-trans-next) 33) 1) ) ) ) - (s.d! (+ a0-26 96) a2-25) + (s.d! (+ a0-26 96) a2-28) ) - (let ((a2-26 (l.q (+ a0-26 96))) + (let ((a2-29 (l.q (+ a0-26 96))) (a3-27 (l.q (+ a0-26 112))) (a0-27 (l.q (+ a0-26 128))) ) - (set! (-> (the-as (pointer uint128) v1-50)) a2-26) + (set! (-> (the-as (pointer uint128) v1-50)) a2-29) (s.q! (+ v1-50 16) a3-27) (s.q! (+ v1-50 32) a0-27) ) @@ -874,7 +867,7 @@ (when (logtest? (vu1-renderer-mask billboard) (-> *display* vu1-enable-user)) (let* ((s4-4 (-> *display* frames (-> *display* on-screen) global-buf base)) (v1-168 (-> *display* frames (-> *display* on-screen) global-buf)) - (a2-67 (-> v1-168 base)) + (a2-70 (-> v1-168 base)) ) (let* ((a0-68 v1-168) (a1-84 (-> a0-68 base)) @@ -973,7 +966,7 @@ (bucket-id billboard-l5-shrub) ) ) - a2-67 + a2-70 (the-as (pointer dma-tag) a3-54) ) )