[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).
This commit is contained in:
water111
2023-02-09 19:11:13 -05:00
committed by GitHub
parent 722ffa3f19
commit e26efcc4f3
27 changed files with 706 additions and 123 deletions
+37 -21
View File
@@ -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))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+15 -1
View File
@@ -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"]
]
}
+11
View File
@@ -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"]
}
}
}
+1
View File
@@ -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
@@ -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);
}
@@ -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;
};
@@ -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<TextureUploadHandler>("tex-all-sprite", BucketCategory::TEX,
BucketId::TEX_ALL_SPRITE);
init_bucket_renderer<Sprite3>("particles", BucketCategory::SPRITE, BucketId::PARTICLES);
init_bucket_renderer<LightningRenderer>("lightning", BucketCategory::OTHER, BucketId::LIGHTNING);
init_bucket_renderer<TextureUploadHandler>("tex-all-warp", BucketCategory::TEX,
BucketId::TEX_ALL_WARP);
init_bucket_renderer<DirectRenderer>("debug-no-zbuf1", BucketCategory::OTHER,
@@ -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;
}
+1
View File
@@ -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,
@@ -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);
}
}
}
@@ -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,
@@ -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<u64> 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()) {
@@ -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());
}
@@ -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) {
@@ -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;
+1 -1
View File
@@ -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<TextureVRAMReference, 1024 * 1024 * 4 / 256> all_textures() const {
const std::array<TextureVRAMReference, 1024 * 1024 * 4 / 256>& all_textures() const {
return m_textures;
}
void move_existing_to_vram(GpuTexture* tex, u32 slot_addr);
+56 -8
View File
@@ -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
)
)
)
)
)
+2 -2
View File
@@ -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)
+25 -10
View File
@@ -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)
@@ -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)
)
+28 -9
View File
@@ -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"
+15 -4
View File
@@ -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))
+56 -8
View File
@@ -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
)
)
)
)
)
+8 -8
View File
@@ -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: #<qword @ #x~X>~%" (-> obj data))
(format #t "~1Tdata[4] @ #x~X~%" (&-> obj fan-prim))
(format #t "~1Tqword: #<qword @ #x~X>~%" (&-> 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))
+9 -2
View File
@@ -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
+15 -4
View File
@@ -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))
+26 -33
View File
@@ -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)
)
)