add ocean-vu0 mips2c and decomp ocean-texture (#1230)

* add ocean-vu0 mips2c and decomp ocean-texture

* vu1 texture setup

* temp

* unoptimized version working

* optimized version by default

* update ref test
This commit is contained in:
water111
2022-03-11 22:27:11 -05:00
committed by GitHub
parent b21f0d3397
commit bb85eaf167
35 changed files with 3438 additions and 85 deletions
+6 -6
View File
@@ -7193,7 +7193,7 @@
)
(deftype ocean-texture-constants (structure)
((giftag qword :inline :offset-assert 0)
((giftag gs-gif-tag :inline :offset-assert 0)
(buffers vector4w :inline :offset-assert 16)
(dests vector4w :inline :offset-assert 32)
(start vector :inline :offset-assert 48)
@@ -7370,7 +7370,7 @@
(define-extern *ocean-mid-off* symbol)
(define-extern *ocean-near-off* symbol)
(define-extern *ocean-heights* ocean-wave-info) ;; guess
(define-extern *ocean-verts* (pointer vector)) ;; ret from ocean-generate-verts
(define-extern *ocean-verts* (inline-array vector)) ;; ret from ocean-generate-verts
;; ----------------------
@@ -21702,8 +21702,8 @@
;; - Functions
(define-extern ocean-interp-wave (function ocean-wave-info uint none)) ;; unconfirmed
(define-extern ocean-generate-verts (function (pointer vector) ocean-wave-info none)) ;; unconfirmed - pointer is *ocean-verts*
(define-extern draw-ocean-texture (function dma-buffer (pointer vector) symbol none)) ;; unconfirmed - pointer is *ocean-verts*
(define-extern ocean-generate-verts (function (inline-array vector) ocean-wave-info none)) ;; unconfirmed - pointer is *ocean-verts*
(define-extern draw-ocean-texture (function dma-buffer (inline-array vector) symbol none)) ;; unconfirmed - pointer is *ocean-verts*
(define-extern ocean-init-buffer (function dma-buffer pointer))
(define-extern draw-ocean-far (function dma-buffer profile-frame))
(define-extern draw-ocean-mid (function dma-buffer none)) ; not confirmed
@@ -21747,10 +21747,10 @@
(define-extern ocean-texture-add-constants (function dma-buffer pointer))
(define-extern ocean-texture-add-envmap (function dma-buffer pointer))
(define-extern ocean-texture-add-verts (function dma-buffer (pointer vector) pointer)) ;; pointer is *ocean-verts*
(define-extern ocean-texture-add-verts (function dma-buffer (inline-array vector) pointer)) ;; pointer is *ocean-verts*
(define-extern ocean-texture-add-call-start (function dma-buffer none)) ;; unconfirmed
(define-extern ocean-texture-add-call-rest (function dma-buffer none)) ;; unconfirmed
(define-extern ocean-texture-add-verts-last (function dma-buffer (pointer vector) (pointer vector) pointer)) ;; pointer is *ocean-verts* and unconfirmed
(define-extern ocean-texture-add-verts-last (function dma-buffer (inline-array vector) (inline-array vector) pointer)) ;; pointer is *ocean-verts* and unconfirmed
(define-extern ocean-texture-add-call-done (function dma-buffer none)) ;; unconfirmed
(define-extern ocean-texture-setup-constants (function ocean-texture-constants none))
@@ -594,7 +594,9 @@
// ocean
"init-ocean-far-regs",
"draw-large-polygon-ocean",
"render-ocean-quad"
"render-ocean-quad",
"ocean-generate-verts",
"ocean-interp-wave"
],
"mips2c_jump_table_functions": {
@@ -7421,5 +7421,109 @@
[[114, 117], "v1", "dma-packet"]
],
"ocean-texture-add-constants": [
[[8, 16], "a0", "dma-packet"]
],
"ocean-texture-add-envmap": [
[[1, 8], "v1", "(pointer uint128)"]
],
"ocean-texture-add-verts": [
[[6, 11], "a0", "dma-packet"]
],
"ocean-texture-add-verts-last": [
[[6, 11], "a3", "dma-packet"],
[[19, 24], "a0", "dma-packet"]
],
"ocean-texture-add-call-start": [
[[3, 8], "a0", "dma-packet"]
],
"ocean-texture-add-call-rest": [
[[3, 8], "a0", "dma-packet"]
],
"ocean-texture-add-call-done": [
[[3, 8], "a0", "dma-packet"]
],
"draw-ocean-texture": [
[[24, 29], "a0", "dma-packet"],
[[92, 96], "a0", "dma-packet"],
[[102, 105], "a0", "gs-gif-tag"],
[110, "s0", "(pointer gs-test)"],
[112, "s0", "(pointer gs-reg64)"],
[114, "s0", "(pointer gs-alpha)"],
[116, "s0", "(pointer gs-reg64)"],
[133, "s0", "(pointer gs-tex0)"],
[135, "s0", "(pointer gs-reg64)"],
[137, "s0", "(pointer gs-tex1)"],
[139, "s0", "(pointer gs-reg64)"],
[140, "s0", "(pointer gs-clamp)"],
[142, "s0", "(pointer gs-reg64)"],
[143, "s0", "(pointer uint64)"],
[145, "s0", "(pointer gs-reg64)"],
[[151, 155], "v1", "(pointer uint128)"],
[[156, 164], "a0", "vector4w"],
[[165, 169], "a0", "vector4w"],
[[170, 175], "a0", "vector4w"],
[[176, 182], "a0", "vector4w"],
[[183, 191], "v1", "vector4w"],
[[204, 208], "a0", "dma-packet"],
[[214, 217], "a0", "gs-gif-tag"],
[237, "s2", "(pointer gs-tex0)"],
[239, "s2", "(pointer gs-reg64)"],
[240, "s2", "(pointer uint64)"],
[242, "s2", "(pointer gs-reg64)"],
[251, "v1", "(pointer uint128)"],
[[253, 260], "a0", "vector4w"],
[[261, 265], "a0", "vector4w"],
[[266, 271], "a0", "vector4w"],
[[272, 278], "a0", "vector4w"],
[[279, 286], "v1", "vector4w"],
[[292, 296], "a0", "dma-packet"],
[[302, 305], "a0", "gs-gif-tag"],
[325, "s3", "(pointer gs-tex0)"],
[327, "s3", "(pointer gs-reg64)"],
[328, "s3", "(pointer uint64)"],
[330, "s3", "(pointer gs-reg64)"],
[339, "v1", "(pointer uint128)"],
[[341, 348], "a0", "vector4w"],
[[349, 367], "a0", "vector4w"],
[[368, 375], "v1", "vector4w"],
[[381, 385], "a0", "dma-packet"],
[[391, 394], "a0", "gs-gif-tag"],
[415, "s3", "(pointer gs-tex0)"],
[417, "s3", "(pointer gs-reg64)"],
[418, "s3", "(pointer uint64)"],
[420, "s3", "(pointer gs-reg64)"],
[429, "v1", "(pointer uint128)"],
[[431, 457], "a0", "vector4w"],
[[458, 466], "v1", "vector4w"],
[[471, 475], "a0", "dma-packet"],
[[481, 484], "a0", "gs-gif-tag"],
[505, "s3", "(pointer gs-tex0)"],
[507, "s3", "(pointer gs-reg64)"],
[508, "s3", "(pointer uint64)"],
[510, "s3", "(pointer gs-reg64)"],
[519, "v1", "(pointer uint128)"],
[[521, 547], "a0", "vector4w"],
[[548, 555], "v1", "vector4w"],
[[561, 565], "a0", "dma-packet"],
[[571, 574], "a0", "gs-gif-tag"],
[595, "s3", "(pointer gs-tex0)"],
[597, "s3", "(pointer gs-reg64)"],
[598, "s3", "(pointer uint64)"],
[600, "s3", "(pointer gs-reg64)"],
[609, "v1", "(pointer uint128)"],
[[611, 638], "a0", "vector4w"],
[[639, 646], "v1", "vector4w"],
[[652, 656], "a0", "dma-packet"],
[57, "v1", "(inline-array vector)"]
],
"placeholder-do-not-add-below": []
}
+2 -2
View File
@@ -167,7 +167,7 @@ std::string write_game_text(
// - first add the strings that are the same across all languages
for (auto const& [key, val] : cfg.new_strings_same_across_langs) {
result += fmt::format("(#x{}\n ", key);
for (int i = 0; i < languages.size(); i++) {
for (u32 i = 0; i < languages.size(); i++) {
result += fmt::format("\"{}\"\n ", val);
}
result += ")\n\n";
@@ -179,7 +179,7 @@ std::string write_game_text(
for (auto const& str : val) {
result += fmt::format("\"{}\"\n ", str);
}
for (int i = 0; i < languages.size() - val.size(); i++) {
for (u32 i = 0; i < languages.size() - val.size(); i++) {
result += fmt::format("\"{}\"\n ", "TODO");
}
result += ")\n\n";
@@ -133,6 +133,11 @@ void extract_common(ObjectFileDB& db, TextureDB& tex_db, const std::string& dgo_
return;
}
if (tex_db.textures.size() == 0) {
lg::warn("Skipping common extract because there were no textures in the input");
return;
}
confirm_textures_identical(tex_db);
tfrag3::Level tfrag_level;
+5 -1
View File
@@ -50,6 +50,7 @@ set(RUNTIME_SOURCE
mips2c/functions/joint.cpp
mips2c/functions/merc_blend_shape.cpp
mips2c/functions/ocean.cpp
mips2c/functions/ocean_vu0.cpp
mips2c/functions/ripple.cpp
mips2c/functions/sky_tng.cpp
mips2c/functions/sparticle.cpp
@@ -83,6 +84,10 @@ set(RUNTIME_SOURCE
graphics/opengl_renderer/foreground/Generic2_DMA.cpp
graphics/opengl_renderer/foreground/Generic2_Build.cpp
graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp
graphics/opengl_renderer/ocean/OceanMidAndFar.cpp
graphics/opengl_renderer/ocean/OceanTexture.cpp
graphics/opengl_renderer/ocean/OceanTexture_PC.cpp
graphics/opengl_renderer/ocean/OceanTexture_PS2.cpp
graphics/opengl_renderer/BucketRenderer.cpp
graphics/opengl_renderer/debug_gui.cpp
graphics/opengl_renderer/DirectRenderer.cpp
@@ -94,7 +99,6 @@ set(RUNTIME_SOURCE
graphics/opengl_renderer/Loader.cpp
graphics/opengl_renderer/MercProgram.cpp
graphics/opengl_renderer/MercRenderer.cpp
graphics/opengl_renderer/OceanMidAndFar.cpp
graphics/opengl_renderer/opengl_utils.cpp
graphics/opengl_renderer/OpenGLRenderer.cpp
graphics/opengl_renderer/Profiler.cpp
+8
View File
@@ -471,6 +471,14 @@ struct alignas(16) Accumulator {
}
}
void msub(Mask mask, Vf& dest, const Vf& a, float b) {
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
dest[i] = data[i] - a[i] * b;
}
}
}
u16 madd_flag(Mask mask, Vf& dest, const Vf& a, float b) {
u16 result = 0;
for (int i = 0; i < 4; i++) {
@@ -568,6 +568,9 @@ void DirectRenderer::render_gif(const u8* data,
case GifTag::RegisterDescriptor::TEX0_1:
handle_tex0_1_packed(data + offset);
break;
case GifTag::RegisterDescriptor::XYZ2:
handle_xyz2_packed(data + offset, render_state, prof);
break;
default:
fmt::print("Register {} is not supported in packed mode yet\n",
reg_descriptor_name(reg_desc[reg]));
@@ -770,7 +773,25 @@ void DirectRenderer::handle_xyzf2_packed(const u8* data,
u8 f = (upper >> 36);
bool adc = upper & (1ull << 47);
handle_xyzf2_common(x, y, z, f, render_state, prof, !adc);
handle_xyzf2_common(x << 16, y << 16, z << 8, f, render_state, prof, !adc);
}
void DirectRenderer::handle_xyz2_packed(const u8* data,
SharedRenderState* render_state,
ScopedProfilerNode& prof) {
u32 x, y, z;
memcpy(&x, data, 4);
memcpy(&y, data + 4, 4);
memcpy(&z, data + 8, 4);
u64 upper;
memcpy(&upper, data + 8, 8);
bool adc = upper & (1ull << 47);
float un_mess_up = 448.f / 512.f;
// TODO total hack
s32 yy = (((s32)y - 1024) << 17) * un_mess_up;
handle_xyzf2_common(((x << 2) + 32768 - 2048 * 2) << 16, ((32768) << 16) - yy, z, 0, render_state,
prof, !adc);
}
void DirectRenderer::handle_zbuf1(u64 val,
@@ -906,9 +927,6 @@ void DirectRenderer::handle_xyzf2_common(u32 x,
SharedRenderState* render_state,
ScopedProfilerNode& prof,
bool advance) {
ASSERT(z < (1 << 24));
(void)f; // TODO: do something with this.
if (m_my_id == BucketId::MERC_TFRAG_TEX_LEVEL0) {
// fmt::print("0x{:x}, 0x{:x}, 0x{:x}\n", x, y, z);
}
@@ -921,8 +939,7 @@ void DirectRenderer::handle_xyzf2_common(u32 x,
m_prim_building.building_stq.at(m_prim_building.building_idx) = math::Vector<float, 3>(
m_prim_building.st_reg.x(), m_prim_building.st_reg.y(), m_prim_building.Q);
m_prim_building.building_rgba.at(m_prim_building.building_idx) = m_prim_building.rgba_reg;
m_prim_building.building_vert.at(m_prim_building.building_idx) =
math::Vector<u32, 4>{x << 16, y << 16, z << 8, f};
m_prim_building.building_vert.at(m_prim_building.building_idx) = math::Vector<u32, 4>{x, y, z, f};
m_prim_building.building_idx++;
@@ -1050,7 +1067,7 @@ void DirectRenderer::handle_xyzf2(u64 val,
u32 z = (val >> 32) & 0xffffff;
u32 f = (val >> 56) & 0xff;
handle_xyzf2_common(x, y, z, f, render_state, prof, true);
handle_xyzf2_common(x << 16, y << 16, z << 8, f, render_state, prof, true);
}
void DirectRenderer::TestState::from_register(GsTest reg) {
@@ -82,6 +82,9 @@ class DirectRenderer : public BucketRenderer {
void handle_xyzf2_packed(const u8* data,
SharedRenderState* render_state,
ScopedProfilerNode& prof);
void handle_xyz2_packed(const u8* data,
SharedRenderState* render_state,
ScopedProfilerNode& prof);
void handle_tex0_1_packed(const u8* data);
void handle_tex0_1(u64 val);
void handle_tex1_1(u64 val);
@@ -1,14 +0,0 @@
#pragma once
#include "game/graphics/opengl_renderer/BucketRenderer.h"
#include "game/graphics/opengl_renderer/DirectRenderer.h"
class OceanMidAndFar : public BucketRenderer {
public:
OceanMidAndFar(const std::string& name, BucketId my_id);
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
void draw_debug_window() override;
private:
DirectRenderer m_direct;
};
@@ -14,7 +14,7 @@
#include "game/graphics/opengl_renderer/MercRenderer.h"
#include "game/graphics/opengl_renderer/EyeRenderer.h"
#include "game/graphics/opengl_renderer/GenericRenderer.h"
#include "game/graphics/opengl_renderer/OceanMidAndFar.h"
#include "game/graphics/opengl_renderer/ocean/OceanMidAndFar.h"
// for the vif callback
#include "game/kernel/kmachine.h"
@@ -85,7 +85,7 @@ void OpenGLRenderer::init_bucket_renderers() {
// 1
// 2
init_bucket_renderer<SkyRenderer>("sky", BucketCategory::OTHER, BucketId::SKY_DRAW); // 3
init_bucket_renderer<OceanMidAndFar>("ocean-mid-far", BucketCategory::OTHER,
init_bucket_renderer<OceanMidAndFar>("ocean-mid-far", BucketCategory::OCEAN,
BucketId::OCEAN_MID_AND_FAR); // 4
//-----------------------
+1 -1
View File
@@ -215,7 +215,7 @@ void SmallProfiler::draw(const std::string& status, const SmallProfilerStats& st
for (int i = 0; i < (int)BucketCategory::MAX_CATEGORIES; i++) {
m_plots[i].push(stats.time_per_category[i] * 1000.f);
ImGui::Text("%6s", BUCKET_CATEGORY_NAMES[i]);
m_plots[i].draw(5.f);
m_plots[i].draw(3.f);
}
}
ImGui::End();
+1
View File
@@ -78,4 +78,5 @@ ShaderLibrary::ShaderLibrary() {
at(ShaderId::DIRECT2) = {"direct2"};
at(ShaderId::EYE) = {"eye"};
at(ShaderId::GENERIC) = {"generic"};
at(ShaderId::OCEAN_TEXTURE) = {"ocean_texture"};
}
+1
View File
@@ -35,6 +35,7 @@ enum class ShaderId {
DIRECT2 = 10,
EYE = 11,
GENERIC = 12,
OCEAN_TEXTURE = 13,
MAX_SHADERS
};
+2 -1
View File
@@ -82,10 +82,11 @@ enum class BucketCategory {
MERC,
GENERIC_MERC,
SPRITE,
OCEAN,
DEBUG_DRAW,
OTHER,
MAX_CATEGORIES
};
constexpr const char* BUCKET_CATEGORY_NAMES[(int)BucketCategory::MAX_CATEGORIES] = {
"tfrag", "tie", "tex", "merc", "mercneric", "sprite", "debug", "other"};
"tfrag", "tie", "tex", "merc", "mercneric", "sprite", "ocean", "debug", "other"};
+1 -1
View File
@@ -17,7 +17,7 @@ void FrameTimeRecorder::start_frame() {
m_fps_timer.start();
}
void FrameTimeRecorder::draw_window(const DmaStats& dma_stats) {
void FrameTimeRecorder::draw_window(const DmaStats& /*dma_stats*/) {
auto* p_open = &m_open;
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration |
ImGuiWindowFlags_AlwaysAutoResize |
@@ -1,12 +1,18 @@
#include "OceanMidAndFar.h"
#include "third-party/imgui/imgui.h"
OceanMidAndFar::OceanMidAndFar(const std::string& name, BucketId my_id)
: BucketRenderer(name, my_id), m_direct(name, my_id, 4096) {}
void OceanMidAndFar::draw_debug_window() {
m_texture_renderer.draw_debug_window();
m_direct.draw_debug_window();
}
void OceanMidAndFar::init_textures(TexturePool& pool) {
m_texture_renderer.init_textures(pool);
}
void OceanMidAndFar::render(DmaFollower& dma,
SharedRenderState* render_state,
ScopedProfilerNode& prof) {
@@ -35,6 +41,27 @@ void OceanMidAndFar::render(DmaFollower& dma,
}
m_direct.reset_state();
{
auto p = prof.make_scoped_child("texture");
m_texture_renderer.handle_ocean_texture(dma, render_state, p);
}
handle_ocean_far(dma, render_state, prof);
auto final_next = dma.read_and_advance();
ASSERT(final_next.vifcode0().kind == VifCode::Kind::NOP &&
final_next.vifcode1().kind == VifCode::Kind::NOP && final_next.size_bytes == 0);
for (int i = 0; i < 4; i++) {
dma.read_and_advance();
}
ASSERT(dma.current_tag_offset() == render_state->next_bucket);
m_direct.flush_pending(render_state, prof);
}
void OceanMidAndFar::handle_ocean_far(DmaFollower& dma,
SharedRenderState* render_state,
ScopedProfilerNode& prof) {
auto init_data = dma.read_and_advance();
ASSERT(init_data.size_bytes == 160);
u8 init_data_buffer[160];
@@ -42,6 +69,7 @@ void OceanMidAndFar::render(DmaFollower& dma,
// this is a bit of a hack, but it patches the ta0 to 0 in
// (set! (-> (the-as (pointer gs-texa) s4-0) 8) (new 'static 'gs-texa :ta0 #x80 :ta1 #x80))
// TODO figure out if we actually have do something here.
u8 val = 0;
memcpy(init_data_buffer + 80, &val, 1);
m_direct.render_gif(init_data_buffer, 160, render_state, prof);
@@ -53,14 +81,4 @@ void OceanMidAndFar::render(DmaFollower& dma,
ASSERT(data.size_bytes / 16 == data.vifcode1().immediate);
m_direct.render_gif(data.data, data.size_bytes, render_state, prof);
}
auto final_next = dma.read_and_advance();
ASSERT(final_next.vifcode0().kind == VifCode::Kind::NOP &&
final_next.vifcode1().kind == VifCode::Kind::NOP && final_next.size_bytes == 0);
for (int i = 0; i < 4; i++) {
dma.read_and_advance();
}
ASSERT(dma.current_tag_offset() == render_state->next_bucket);
m_direct.flush_pending(render_state, prof);
}
@@ -0,0 +1,26 @@
#pragma once
#include "game/graphics/opengl_renderer/BucketRenderer.h"
#include "game/graphics/opengl_renderer/DirectRenderer.h"
#include "game/graphics/opengl_renderer/opengl_utils.h"
#include "game/graphics/opengl_renderer/ocean/OceanTexture.h"
/*!
* OceanMidAndFar is the handler for the first ocean bucket.
*
*/
class OceanMidAndFar : public BucketRenderer {
public:
OceanMidAndFar(const std::string& name, BucketId my_id);
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
void draw_debug_window() override;
void init_textures(TexturePool& pool) override;
private:
void handle_ocean_far(DmaFollower& dma,
SharedRenderState* render_state,
ScopedProfilerNode& prof);
DirectRenderer m_direct;
OceanTexture m_texture_renderer;
};
@@ -0,0 +1,238 @@
#include "OceanTexture.h"
#include "game/graphics/opengl_renderer/AdgifHandler.h"
#include "third-party/imgui/imgui.h"
constexpr int OCEAN_TEX_TBP = 8160; // todo
OceanTexture::OceanTexture()
: m_tex0(TEX0_SIZE, TEX0_SIZE, GL_UNSIGNED_INT_8_8_8_8_REV),
m_hack_renderer("burp", BucketId::BUCKET0, 0x8000) {
m_dbuf_x = m_dbuf_a;
m_dbuf_y = m_dbuf_b;
m_tbuf_x = m_tbuf_a;
m_tbuf_y = m_tbuf_b;
init_pc();
}
OceanTexture::~OceanTexture() {
destroy_pc();
}
void OceanTexture::init_textures(TexturePool& pool) {
TextureInput in;
in.gpu_texture = m_tex0.texture();
constexpr int boost = 2;
in.w = 128 * boost;
in.h = 128 * boost;
in.page_name = "PC-OCEAN";
in.name = "pc-ocean";
m_tex0_gpu = pool.give_texture_and_load_to_vram(in, OCEAN_TEX_TBP);
}
void OceanTexture::draw_debug_window() {
if (m_tex0_gpu) {
ImGui::Image((void*)m_tex0_gpu->gpu_textures.at(0).gl, ImVec2(m_tex0_gpu->w, m_tex0_gpu->h));
}
ImGui::Checkbox("Optimized Version", &m_use_ocean_specific);
}
void OceanTexture::flush(SharedRenderState* render_state, ScopedProfilerNode& prof) {
if (m_use_ocean_specific) {
flush_pc(render_state, prof);
} else {
m_hack_renderer.flush_pending(render_state, prof);
}
}
void OceanTexture::setup_renderer() {
if (m_use_ocean_specific) {
setup_pc();
} else {
m_hack_renderer.reset_state();
}
}
void OceanTexture::handle_tex_call_start(SharedRenderState* render_state,
ScopedProfilerNode& prof) {
if (m_use_ocean_specific) {
run_L1_PC();
} else {
run_L1(render_state, prof);
}
}
void OceanTexture::handle_tex_call_rest(SharedRenderState* render_state, ScopedProfilerNode& prof) {
if (m_use_ocean_specific) {
run_L2_PC();
} else {
run_L2(render_state, prof);
}
}
void OceanTexture::handle_ocean_texture(DmaFollower& dma,
SharedRenderState* render_state,
ScopedProfilerNode& prof) {
FramebufferTexturePairContext ctxt(m_tex0);
// render to the first texture
{
// (set-display-gs-state arg0 ocean-tex-page-0 128 128 0 0)
auto data = dma.read_and_advance();
(void)data;
}
// set up VIF
{
// (new 'static 'vif-tag :cmd (vif-cmd base))
// (new 'static 'vif-tag :imm #xc0 :cmd (vif-cmd offset))
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == 0);
ASSERT(data.vifcode0().kind == VifCode::Kind::BASE);
ASSERT(data.vifcode1().kind == VifCode::Kind::OFFSET);
ASSERT(data.vifcode0().immediate == 0);
ASSERT(data.vifcode1().immediate == 0xc0);
}
// load texture constants
{
// (ocean-texture-add-constants arg0)
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == sizeof(OceanTextureConstants));
ASSERT(data.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(data.vifcode0().immediate == 0x404);
ASSERT(data.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
ASSERT(data.vifcode1().num == data.size_bytes / 16);
ASSERT(data.vifcode1().immediate == TexVu1Data::CONSTANTS);
memcpy(&m_texture_constants, data.data, sizeof(OceanTextureConstants));
}
// set up GS for envmap texture drawing
{
// (ocean-texture-add-envmap arg0)
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == sizeof(AdGifData) + 16); // 16 for the giftag.
ASSERT(data.vifcode0().kind == VifCode::Kind::NOP);
ASSERT(data.vifcode1().kind == VifCode::Kind::DIRECT);
memcpy(&m_envmap_adgif, data.data + 16, sizeof(AdGifData));
// fmt::print("adgif is:\n{}\n\n", AdgifHelper(m_envmap_adgif).print());
/*
* adgif is:
[0] TEX0_1
tbp0: 10010 tbw: 2 psm: 19 tw: 6 th: 6 tcc: 1 tfx: 0 cbp: 10046 cpsm: 0 csm: 0
[1] TEX1_1
lcm: false mxl: 0 mmag: true mmin: 4 mtba: false l: 0 k: 0
[2] MIPTBP1_1
[3] CLAMP_1
0x5
[4] ALPHA_1
(Cs - Cd) * As / 128.0 + Cd
*/
// HACK
setup_renderer();
if (!m_use_ocean_specific) {
m_hack_renderer.render_gif(data.data, UINT32_MAX, render_state, prof);
}
}
// vertices are uploaded double buffered
m_texture_vertices_loading = m_texture_vertices_a;
m_texture_vertices_drawing = m_texture_vertices_b;
// add first group of vertices
{
// (ocean-texture-add-verts arg0 sv-16)
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == sizeof(m_texture_vertices_a));
ASSERT(data.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(data.vifcode0().immediate == 0x404);
ASSERT(data.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
ASSERT(data.vifcode1().num == data.size_bytes / 16);
VifCodeUnpack up(data.vifcode1());
ASSERT(up.addr_qw == 0);
ASSERT(up.use_tops_flag == true);
memcpy(m_texture_vertices_loading, data.data, sizeof(m_texture_vertices_a));
}
// first call
{
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == 0);
ASSERT(data.vifcode0().kind == VifCode::Kind::MSCALF);
ASSERT(data.vifcode0().immediate == TexVu1Prog::START);
ASSERT(data.vifcode1().kind == VifCode::Kind::STMOD); // not sure why...
handle_tex_call_start(render_state, prof);
}
// loop over vertex groups
for (int i = 0; i < NUM_FRAG_LOOPS; i++) {
auto verts = dma.read_and_advance();
ASSERT(verts.size_bytes == sizeof(m_texture_vertices_a));
ASSERT(verts.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(verts.vifcode0().immediate == 0x404);
ASSERT(verts.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
ASSERT(verts.vifcode1().num == verts.size_bytes / 16);
VifCodeUnpack up(verts.vifcode1());
ASSERT(up.addr_qw == 0);
ASSERT(up.use_tops_flag == true);
memcpy(m_texture_vertices_loading, verts.data, sizeof(m_texture_vertices_a));
auto call = dma.read_and_advance();
ASSERT(call.size_bytes == 0);
ASSERT(call.vifcode0().kind == VifCode::Kind::MSCALF);
ASSERT(call.vifcode0().immediate == TexVu1Prog::REST);
ASSERT(call.vifcode1().kind == VifCode::Kind::STMOD); // not sure why...
handle_tex_call_rest(render_state, prof);
}
// last upload does something weird...
{
// (ocean-texture-add-verts-last arg0 (the-as (inline-array vector) sv-48) sv-64)
auto data0 = dma.read_and_advance();
ASSERT(data0.size_bytes == 128 * 16);
ASSERT(data0.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(data0.vifcode0().immediate == 0x404);
ASSERT(data0.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
ASSERT(data0.vifcode1().num == data0.size_bytes / 16);
VifCodeUnpack up0(data0.vifcode1());
ASSERT(up0.addr_qw == 0);
ASSERT(up0.use_tops_flag == true);
memcpy(m_texture_vertices_loading, data0.data, 128 * 16);
auto data1 = dma.read_and_advance();
ASSERT(data1.size_bytes == 64 * 16);
ASSERT(data1.vifcode0().kind == VifCode::Kind::STCYCL);
ASSERT(data1.vifcode0().immediate == 0x404);
ASSERT(data1.vifcode1().kind == VifCode::Kind::UNPACK_V4_32);
ASSERT(data1.vifcode1().num == data1.size_bytes / 16);
VifCodeUnpack up1(data1.vifcode1());
ASSERT(up1.addr_qw == 128);
ASSERT(up1.use_tops_flag == true);
memcpy(m_texture_vertices_loading + 128, data1.data, 64 * 16);
}
// last rest call
{
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == 0);
ASSERT(data.vifcode0().kind == VifCode::Kind::MSCALF);
ASSERT(data.vifcode0().immediate == TexVu1Prog::REST);
ASSERT(data.vifcode1().kind == VifCode::Kind::STMOD); // not sure why...
handle_tex_call_rest(render_state, prof);
}
// last call
{
auto data = dma.read_and_advance();
ASSERT(data.size_bytes == 0);
ASSERT(data.vifcode0().kind == VifCode::Kind::MSCALF);
ASSERT(data.vifcode0().immediate == TexVu1Prog::DONE);
ASSERT(data.vifcode1().kind == VifCode::Kind::STMOD); // not sure why...
// this program does nothing.
}
flush(render_state, prof);
render_state->texture_pool->move_existing_to_vram(m_tex0_gpu, 8160);
}
@@ -0,0 +1,152 @@
#pragma once
#include "game/graphics/opengl_renderer/BucketRenderer.h"
#include "game/graphics/opengl_renderer/DirectRenderer.h"
#include "game/graphics/opengl_renderer/opengl_utils.h"
#include "game/common/vu.h"
class OceanTexture {
public:
OceanTexture();
void handle_ocean_texture(DmaFollower& dma,
SharedRenderState* render_state,
ScopedProfilerNode& prof);
void init_textures(TexturePool& pool);
void draw_debug_window();
~OceanTexture();
private:
void handle_tex_call_start(SharedRenderState* render_state, ScopedProfilerNode& prof);
void handle_tex_call_rest(SharedRenderState* render_state, ScopedProfilerNode& prof);
void run_L1(SharedRenderState* render_state, ScopedProfilerNode& prof);
void run_L2(SharedRenderState* render_state, ScopedProfilerNode& prof);
void run_L3();
void run_L5(SharedRenderState* render_state, ScopedProfilerNode& prof);
void xgkick(Vf* src, SharedRenderState* render_state, ScopedProfilerNode& prof);
void run_L1_PC();
void run_L2_PC();
void run_L3_PC();
void run_L5_PC();
void xgkick_PC(Vf* src);
void setup_renderer();
void flush(SharedRenderState* render_state, ScopedProfilerNode& prof);
void setup_pc();
void flush_pc(SharedRenderState* render_state, ScopedProfilerNode& prof);
void init_pc();
void destroy_pc();
bool m_use_ocean_specific = true;
static constexpr int TEX0_SIZE = 256; // TODO actually 128
FramebufferTexturePair m_tex0;
GpuTexture* m_tex0_gpu = nullptr;
// (deftype ocean-texture-constants (structure)
struct OceanTextureConstants {
// ((giftag qword :inline :offset-assert 0) 985
u8 giftag[16];
// (buffers vector4w :inline :offset-assert 16) 986
math::Vector<u32, 4> buffers;
// (dests vector4w :inline :offset-assert 32) 987
math::Vector<u32, 4> dests;
// (start vector :inline :offset-assert 48) 988
math::Vector4f start;
// (offsets vector :inline :offset-assert 64) 989
math::Vector4f offsets;
// (constants vector :inline :offset-assert 80) 990
math::Vector4f constants;
// (cam-nrm vector :inline :offset-assert 96) 991
math::Vector4f cam_nrm;
// )
} m_texture_constants;
static_assert(sizeof(OceanTextureConstants) == 112);
AdGifData m_envmap_adgif;
Vf m_texture_vertices_a[192];
Vf m_texture_vertices_b[192];
static constexpr int DBUF_SIZE = 99;
Vf m_dbuf_a[DBUF_SIZE];
Vf m_dbuf_b[DBUF_SIZE];
Vf* m_dbuf_x;
Vf* m_dbuf_y;
static constexpr int TBUF_SIZE = 199;
Vf m_tbuf_a[TBUF_SIZE];
Vf m_tbuf_b[TBUF_SIZE];
Vf* m_tbuf_x;
Vf* m_tbuf_y;
Vf* m_texture_vertices_loading = nullptr;
Vf* m_texture_vertices_drawing = nullptr;
Vf* swap_vu_upload_buffers() {
std::swap(m_texture_vertices_drawing, m_texture_vertices_loading);
return m_texture_vertices_drawing;
}
void swap_dbuf() { std::swap(m_dbuf_x, m_dbuf_y); }
void swap_tbuf() { std::swap(m_tbuf_x, m_tbuf_y); }
Vf* get_dbuf() { return m_dbuf_x; }
Vf* get_dbuf_other() { return m_dbuf_y; }
Vf* get_tbuf() { return m_tbuf_x; }
struct {
Vf startx; // vf14
// Vf base_pos; vf15
// Vf nrm0; vf24
Vf* dbuf_read_a; // vi03
Vf* dbuf_read_b; // vi04
Vf* in_ptr; // vi05
Vf* dbuf_write; // vi06
Vf* dbuf_write_base; // vi07
Vf* tptr; // vi08
Vf* tbase; // vi09
} vu;
static constexpr u32 NUM_STRIPS = 32;
static constexpr u32 NUM_VERTS_PER_STRIP = 66;
static constexpr u32 NUM_VERTS = NUM_STRIPS * NUM_VERTS_PER_STRIP;
// note: if we used u16's for s/t, we could make this 8 bytes, but I'm afraid that some GPUs
// will be unhappy with that format.
struct Vertex {
float s, t;
math::Vector<u8, 4> rgba;
u32 pad;
};
static_assert(sizeof(Vertex) == 16);
struct {
std::vector<math::Vector2f> vertex_positions;
std::vector<Vertex> vertex_dynamic;
std::vector<u32> index_buffer;
u32 vtx_idx = 0;
GLuint vao, static_vertex_buffer, dynamic_vertex_buffer, gl_index_buffer;
} m_pc;
enum TexVu1Data {
BUF0 = 384,
BUF1 = 583,
DEST0 = 782,
DEST1 = 881,
CONSTANTS = 985,
};
enum TexVu1Prog { START = 0, REST = 2, DONE = 4 };
static constexpr int NUM_FRAG_LOOPS = 9;
DirectRenderer m_hack_renderer;
};
@@ -0,0 +1,501 @@
#include "OceanTexture.h"
void OceanTexture::run_L1_PC() {
// L1:
// lq.xyzw vf14_startx, 988(vi00) | maxw.xyzw vf01_ones, vf00, vf00
vu.startx = Vf(m_texture_constants.start);
// lq.xyzw vf02_offset, 989(vi00)
// lq.xyzw vf03_tbuf, 986(vi00)
// lq.xyzw vf04_dbuf, 987(vi00)
// lq.xyzw vf05_giftag, 985(vi00)
// lq.xyzw vf06_cam_nrm, 991(vi00)
// lq.xyzw vf07_constants, 990(vi00)
// iaddiu vi11_0x80, vi00, 0x80
// mtir vi08_tptr, vf03_tbuf.x
vu.tptr = get_tbuf();
// mtir vi09_tbase, vf03_tbuf.x
vu.tbase = get_tbuf();
// mr32.xyzw vf03_tbuf, vf03_tbuf
swap_tbuf();
// xtop vi05_in_ptr
vu.in_ptr = swap_vu_upload_buffers();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3_PC();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3_PC();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5_PC();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3_PC();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5_PC();
// nop :e
// nop
}
void OceanTexture::run_L2_PC() {
// L2:
// xtop vi05_in_ptr
vu.in_ptr = swap_vu_upload_buffers();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3_PC();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5_PC();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3_PC();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5_PC();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3_PC();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5_PC();
// nop :e
// nop
}
namespace {
void lq_buffer(Mask mask, Vf& dest, Vf* src) {
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
dest.data[i] = src->data[i];
}
}
}
void sq_buffer(Mask mask, const Vf& src, Vf* dest) {
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
dest->data[i] = src.data[i];
}
}
}
void sq_buffer_giftag(const u8* src, Vf* dest) {
memcpy(dest, src, 16);
}
} // namespace
void OceanTexture::run_L3_PC() {
Vf base_pos; // vf15
u16 loop_idx;
Vf vtx0; // vf16
Vf vtx1; // vf17
Vf vtx2; // vf18
Vf vtx3; // vf19
Vf res0; // vf20
Vf res1; // vf21
Vf res2; // vf22
Vf res3; // vf23
Vf nrm0; // vf24
Vf nrm1; // vf25
Vf nrm2; // vf26
Vf reflect; // vf27
Vf cout0; // vf28
Vf cout1; // vf29
Vf cout2; // vf30
Vf cout3; // vf31
Accumulator acc;
const Vf ones(1, 1, 1, 1);
const Vf vf00(0, 0, 0, 1);
const u16 vi11 = 0x80;
bool bc;
// clang-format off
// L3:
// ior vi07, vi06, vi00 | nop 56
vu.dbuf_write_base = vu.dbuf_write;
// move.xyzw vf15, vf14 | nop 57
base_pos.move(Mask::xyzw, vu.startx);
// iaddi vi01, vi00, 0x8 | nop 58
loop_idx = 8;
// lq.xyzw vf24, 1(vi05) | mulw.xyzw vf20, vf15, vf00 59 (?? what are they doing here)
res0.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm0, vu.in_ptr + 1);
// lq.xyzw vf25, 3(vi05) | mulw.xyzw vf21, vf15, vf00 60
res1.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm1, vu.in_ptr + 3);
// lq.xyzw vf26, 5(vi05) | mulw.xyzw vf22, vf15, vf00 61
res2.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm2, vu.in_ptr + 5);
// nop | mulw.xyzw vf23, vf15, vf00 62
res3.mul(Mask::xyzw, base_pos, 1.f);
// nop | mulax.xyzw ACC, vf24, vf06 63
acc.mula(Mask::xyzw, nrm0, m_texture_constants.cam_nrm.x());
// nop | madday.xyzw ACC, vf25, vf06 64
acc.madda(Mask::xyzw, nrm1, m_texture_constants.cam_nrm.y());
// nop | maddz.xyzw vf27, vf26, vf06 65
acc.madd(Mask::xyzw, reflect, nrm2, m_texture_constants.cam_nrm.z());
// nop | addx.x vf21, vf21, vf02 66
res1.add(Mask::x, res1, m_texture_constants.offsets.x());
// nop | addy.x vf22, vf22, vf02 67
res2.add(Mask::x, res2, m_texture_constants.offsets.y());
L4:
// nop | addz.x vf23, vf23, vf02 68
res3.add(Mask::x, res3, m_texture_constants.offsets.z());
// nop | addw.x vf15, vf15, vf02 69
base_pos.add(Mask::x, base_pos, m_texture_constants.offsets.w());
// sq.xyzw vf20, 2(vi06) | mulx.x vf28, vf01, vf24 70
cout0.mul(Mask::x, ones, nrm0.x()); sq_buffer(Mask::xyzw, res0, vu.dbuf_write + 2);
// sq.xyzw vf21, 5(vi06) | muly.x vf29, vf01, vf24 71
cout1.mul(Mask::x, ones, nrm0.y()); sq_buffer(Mask::xyzw, res1, vu.dbuf_write + 5);
// sq.xyzw vf22, 8(vi06) | mulz.x vf30, vf01, vf24 72
cout2.mul(Mask::x, ones, nrm0.z()); sq_buffer(Mask::xyzw, res2, vu.dbuf_write + 8);
// sq.xyzw vf23, 11(vi06) | mulw.x vf31, vf01, vf24 73
cout3.mul(Mask::x, ones, nrm0.w()); sq_buffer(Mask::xyzw, res3, vu.dbuf_write + 11);
// lq.xyzw vf16, 0(vi05) | mulx.y vf28, vf01, vf25 74
cout0.mul(Mask::y, ones, nrm1.x()); lq_buffer(Mask::xyzw, vtx0, vu.in_ptr);
// lq.xyzw vf17, 2(vi05) | muly.y vf29, vf01, vf25 75
cout1.mul(Mask::y, ones, nrm1.y()); lq_buffer(Mask::xyzw, vtx1, vu.in_ptr + 2);
// lq.xyzw vf18, 4(vi05) | mulz.y vf30, vf01, vf25 76
cout2.mul(Mask::y, ones, nrm1.z()); lq_buffer(Mask::xyzw, vtx2, vu.in_ptr + 4);
// lq.xyzw vf19, 6(vi05) | mulw.y vf31, vf01, vf25 77
cout3.mul(Mask::y, ones, nrm1.w()); lq_buffer(Mask::xyzw, vtx3, vu.in_ptr + 6);
// iaddi vi05, vi05, 0x8 | mulx.xy vf28, vf28, vf27 78
cout0.mul(Mask::xy, cout0, reflect.x()); vu.in_ptr = vu.in_ptr + 8;
// nop | muly.xy vf29, vf29, vf27 79
cout1.mul(Mask::xy, cout1, reflect.y());
// nop | mulz.xy vf30, vf30, vf27 80
cout2.mul(Mask::xy, cout2, reflect.z());
// nop | mulw.xy vf31, vf31, vf27 81
cout3.mul(Mask::xy, cout3, reflect.w());
// nop | mulw.xy vf28, vf28, vf16 82
cout0.mul(Mask::xy, cout0, vtx0.w());
// nop | mulw.xy vf29, vf29, vf17 83
cout1.mul(Mask::xy, cout1, vtx1.w());
// nop | mulw.xy vf30, vf30, vf18 84
cout2.mul(Mask::xy, cout2, vtx2.w());
// nop | mulw.xy vf31, vf31, vf19 85
cout3.mul(Mask::xy, cout3, vtx3.w());
// nop | ftoi0.xyzw vf16, vf16 86
vtx0.ftoi0(Mask::xyzw, vtx0);
// nop | ftoi0.xyzw vf17, vf17 87
vtx1.ftoi0(Mask::xyzw, vtx1);
// nop | ftoi0.xyzw vf18, vf18 88
vtx2.ftoi0(Mask::xyzw, vtx2);
// iaddi vi01, vi01, -0x1 | ftoi0.xyzw vf19, vf19 89
vtx3.ftoi0(Mask::xyzw, vtx3); loop_idx = loop_idx + -1;
// mfir.w vf16, vi11 | add.xyzw vf28, vf28, vf06 90
cout0.add(Mask::xyzw, cout0, m_texture_constants.cam_nrm); vtx0.mfir(Mask::w, vi11);
// mfir.w vf17, vi11 | add.xyzw vf29, vf29, vf06 91
cout1.add(Mask::xyzw, cout1, m_texture_constants.cam_nrm); vtx1.mfir(Mask::w, vi11);
// mfir.w vf18, vi11 | add.xyzw vf30, vf30, vf06 92
cout2.add(Mask::xyzw, cout2, m_texture_constants.cam_nrm); vtx2.mfir(Mask::w, vi11);
// mfir.w vf19, vi11 | add.xyzw vf31, vf31, vf06 93
cout3.add(Mask::xyzw, cout3, m_texture_constants.cam_nrm); vtx3.mfir(Mask::w, vi11);
// nop | mulx.xyzw vf28, vf28, vf07 94
cout0.mul(Mask::xyzw, cout0, m_texture_constants.constants.x());
// nop | mulx.xyzw vf29, vf29, vf07 95
cout1.mul(Mask::xyzw, cout1, m_texture_constants.constants.x());
// nop | mulx.xyzw vf30, vf30, vf07 96
cout2.mul(Mask::xyzw, cout2, m_texture_constants.constants.x());
// nop | mulx.xyzw vf31, vf31, vf07 97
cout3.mul(Mask::xyzw, cout3, m_texture_constants.constants.x());
// nop | addy.xyzw vf28, vf28, vf07 98
cout0.add(Mask::xyzw, cout0, m_texture_constants.constants.y());
// nop | addy.xyzw vf29, vf29, vf07 99
cout1.add(Mask::xyzw, cout1, m_texture_constants.constants.y());
// nop | addy.xyzw vf30, vf30, vf07 100
cout2.add(Mask::xyzw, cout2, m_texture_constants.constants.y());
// nop | addy.xyzw vf31, vf31, vf07 101
cout3.add(Mask::xyzw, cout3, m_texture_constants.constants.y());
// sq.xyzw vf16, 1(vi06) | sub.zw vf28, vf01, vf00 102
cout0.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx0, vu.dbuf_write + 1);
// sq.xyzw vf17, 4(vi06) | sub.zw vf29, vf01, vf00 103
cout1.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx1, vu.dbuf_write + 4);
// sq.xyzw vf18, 7(vi06) | sub.zw vf30, vf01, vf00 104
cout2.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx2, vu.dbuf_write + 7);
// sq.xyzw vf19, 10(vi06) | sub.zw vf31, vf01, vf00 105
cout3.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx3, vu.dbuf_write + 10);
// lq.xyzw vf24, 1(vi05) | mulw.xyzw vf20, vf15, vf00 106
res0.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm0, vu.in_ptr + 1);
// lq.xyzw vf25, 3(vi05) | mulw.xyzw vf21, vf15, vf00 107
res1.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm1, vu.in_ptr + 3);
// lq.xyzw vf26, 5(vi05) | mulw.xyzw vf22, vf15, vf00 108
res2.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm2, vu.in_ptr + 5);
// sq.xyzw vf28, 0(vi06) | mulw.xyzw vf23, vf15, vf00 109
res3.mul(Mask::xyzw, base_pos, 1.f); sq_buffer(Mask::xyzw, cout0, vu.dbuf_write);
// sq.xyzw vf29, 3(vi06) | mulax.xyzw ACC, vf24, vf06 110
acc.mula(Mask::xyzw, nrm0, m_texture_constants.cam_nrm.x()); sq_buffer(Mask::xyzw, cout1, vu.dbuf_write + 3);
// sq.xyzw vf30, 6(vi06) | madday.xyzw ACC, vf25, vf06 111
acc.madda(Mask::xyzw, nrm1, m_texture_constants.cam_nrm.y()); sq_buffer(Mask::xyzw, cout2, vu.dbuf_write + 6);
// sq.xyzw vf31, 9(vi06) | maddz.xyzw vf27, vf26, vf06 112
acc.madd(Mask::xyzw, reflect, nrm2, m_texture_constants.cam_nrm.z()); sq_buffer(Mask::xyzw, cout3, vu.dbuf_write + 9);
// BRANCH!
// ibgtz vi01, L4 | addx.x vf21, vf21, vf02 113
res1.add(Mask::x, res1, m_texture_constants.offsets.x()); bc = ((s16)loop_idx) > 0;
// iaddi vi06, vi06, 0xc | addy.x vf22, vf22, vf02 114
res2.add(Mask::x, res2, m_texture_constants.offsets.y()); vu.dbuf_write = vu.dbuf_write + 12;
if (bc) { goto L4; }
// lq.xyzw vf28, 0(vi07) | addx.y vf14, vf14, vf02 115
vu.startx.add(Mask::y, vu.startx, m_texture_constants.offsets.x()); lq_buffer(Mask::xyzw, cout0, vu.dbuf_write_base);
// lq.xyzw vf16, 1(vi07) | nop 116
lq_buffer(Mask::xyzw, vtx0, vu.dbuf_write_base + 1);
// sq.xyzw vf20, 2(vi06) | nop 117
sq_buffer(Mask::xyzw, res0, vu.dbuf_write + 2);
// sq.xyzw vf28, 0(vi06) | nop 118
sq_buffer(Mask::xyzw, cout0, vu.dbuf_write);
// jr vi12 | nop 119
// sq.xyzw vf16, 1(vi06) | nop 120
sq_buffer(Mask::xyzw, vtx0, vu.dbuf_write + 1);
// clang-format on
}
void OceanTexture::run_L5_PC() {
// clang-format off
u16 loop_idx;
Vf res0;
Vf res1;
Vf cout0;
Vf cout1;
Vf vtx0;
Vf vtx1;
bool bc;
// L5:
// iaddiu vi01, vi00, 0x21 | nop 121
loop_idx = 0x21; /* 33 */
// sq.xyzw vf05, 0(vi08) | nop 122
sq_buffer_giftag(m_texture_constants.giftag, vu.tptr);
// iaddi vi08, vi08, 0x1 | nop 123
vu.tptr = vu.tptr + 1;
L6:
// iaddi vi01, vi01, -0x1 | nop 124
loop_idx = loop_idx + -1;
// lq.xyzw vf20, 2(vi03) | nop 125
lq_buffer(Mask::xyzw, res0, vu.dbuf_read_a + 2);
// lq.xyzw vf21, 2(vi04) | nop 126
lq_buffer(Mask::xyzw, res1, vu.dbuf_read_b + 2);
// lq.xyzw vf28, 0(vi03) | nop 127
lq_buffer(Mask::xyzw, cout0, vu.dbuf_read_a);
// lq.xyzw vf16, 1(vi03) | nop 128
lq_buffer(Mask::xyzw, vtx0, vu.dbuf_read_a + 1);
// lq.xyzw vf29, 0(vi04) | ftoi4.xyzw vf20, vf20 129
res0.ftoi4(Mask::xyzw, res0); lq_buffer(Mask::xyzw, cout1, vu.dbuf_read_b);
// lq.xyzw vf17, 1(vi04) | ftoi4.xyzw vf21, vf21 130
res1.ftoi4(Mask::xyzw, res1); lq_buffer(Mask::xyzw, vtx1, vu.dbuf_read_b + 1);
// sq.xyzw vf28, 0(vi08) | nop 131
sq_buffer(Mask::xyzw, cout0, vu.tptr);
// sq.xyzw vf16, 1(vi08) | nop 132
sq_buffer(Mask::xyzw, vtx0, vu.tptr + 1);
// sq.xyzw vf20, 2(vi08) | nop 133
sq_buffer(Mask::xyzw, res0, vu.tptr + 2);
// sq.xyzw vf29, 3(vi08) | nop 134
sq_buffer(Mask::xyzw, cout1, vu.tptr + 3);
// sq.xyzw vf17, 4(vi08) | nop 135
sq_buffer(Mask::xyzw, vtx1, vu.tptr + 4);
// sq.xyzw vf21, 5(vi08) | nop 136
sq_buffer(Mask::xyzw, res1, vu.tptr + 5);
// iaddi vi03, vi03, 0x3 | nop 137
vu.dbuf_read_a = vu.dbuf_read_a + 3;
// iaddi vi04, vi04, 0x3 | nop 138
vu.dbuf_read_b = vu.dbuf_read_b + 3;
// BRANCH!
// ibgtz vi01, L6 | nop 139
bc = ((s16)loop_idx) > 0;
// iaddi vi08, vi08, 0x6 | nop 140
vu.tptr = vu.tptr + 6;
if (bc) { goto L6; }
// xgkick vi09 | nop 141
xgkick_PC(vu.tbase);
// mtir vi08, vf03.x | nop 142
// vu.tptr = vu.vf03.x_as_u16();
vu.tptr = get_tbuf();
// mtir vi09, vf03.x | nop 143
// vu.vi09 = vu.vf03.x_as_u16();
vu.tbase = get_tbuf();
// jr vi12 | nop 144
// ASSERT(false);
// mr32.xyzw vf03, vf03 | nop 145
// vu.vf03.mr32(Mask::xyzw, vu.vf03);
swap_tbuf();
// clang-format on
}
void OceanTexture::xgkick_PC(Vf* src) {
// we're going to rely on the data being the exact layout we expect here.
u32 offset = 16;
const u8* data = (const u8*)src;
for (u32 i = 0; i < NUM_VERTS_PER_STRIP; i++) {
auto& v = m_pc.vertex_dynamic[m_pc.vtx_idx];
// st
memcpy(&v.s, data + offset, sizeof(float) * 2);
// rgbaq
v.rgba.x() = data[offset + 16];
v.rgba.y() = data[offset + 20];
v.rgba.z() = data[offset + 24];
v.rgba.w() = data[offset + 28]; // we don't actually need it, it's always 0x80
// xyz2
offset += 48;
m_pc.vtx_idx++;
}
}
void OceanTexture::setup_pc() {
m_pc.vtx_idx = 0;
}
void OceanTexture::flush_pc(SharedRenderState* render_state, ScopedProfilerNode& prof) {
ASSERT(m_pc.vtx_idx == 2112);
glBindVertexArray(m_pc.vao);
glBindBuffer(GL_ARRAY_BUFFER, m_pc.dynamic_vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * NUM_VERTS, m_pc.vertex_dynamic.data(),
GL_DYNAMIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_pc.gl_index_buffer);
render_state->shaders[ShaderId::OCEAN_TEXTURE].activate();
GsTex0 tex0(m_envmap_adgif.tex0_data);
auto lookup = render_state->texture_pool->lookup(tex0.tbp0());
if (!lookup) {
lookup = render_state->texture_pool->get_placeholder_texture();
}
// no decal
// yes tcc
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, *lookup);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_TEXTURE].id(), "tex_T0"),
0);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
// glDrawArrays(GL_TRIANGLE_STRIP, 0, NUM_VERTS);
glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(UINT32_MAX);
glDrawElements(GL_TRIANGLE_STRIP, m_pc.index_buffer.size(), GL_UNSIGNED_INT, (void*)0);
prof.add_draw_call();
prof.add_tri(NUM_STRIPS * NUM_STRIPS * 2);
glBindVertexArray(0);
}
void OceanTexture::init_pc() {
int i = 0;
m_pc.vertex_positions.resize(NUM_VERTS);
m_pc.vertex_dynamic.resize(NUM_VERTS);
m_pc.index_buffer.clear();
for (u32 strip = 0; strip < NUM_STRIPS; strip++) {
u32 lo = 64 * strip;
u32 hi = 64 * (strip + 1);
for (u32 vert_pair = 0; vert_pair < NUM_VERTS_PER_STRIP / 2; vert_pair++) {
m_pc.index_buffer.push_back(i);
auto& v0 = m_pc.vertex_positions[i++];
v0 = math::Vector2f(vert_pair * 64, lo);
m_pc.index_buffer.push_back(i);
auto& v1 = m_pc.vertex_positions[i++];
v1 = math::Vector2f(vert_pair * 64, hi);
}
m_pc.index_buffer.push_back(UINT32_MAX);
}
glGenVertexArrays(1, &m_pc.vao);
glBindVertexArray(m_pc.vao);
glGenBuffers(1, &m_pc.gl_index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_pc.gl_index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(u32) * m_pc.index_buffer.size(),
m_pc.index_buffer.data(), GL_STATIC_DRAW);
glGenBuffers(1, &m_pc.static_vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, m_pc.static_vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(math::Vector4f) * NUM_VERTS, m_pc.vertex_positions.data(),
GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, // location 0 in the shader
2, // 3 floats per vert
GL_FLOAT, // floats
GL_TRUE, // normalized, ignored,
0, // tightly packed
0
);
glGenBuffers(1, &m_pc.dynamic_vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, m_pc.dynamic_vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * NUM_VERTS, nullptr, GL_DYNAMIC_DRAW);
glVertexAttribPointer(1, // location 0 in the shader
4, // 4 color components
GL_UNSIGNED_BYTE, // floats
GL_TRUE, // normalized, ignored,
sizeof(Vertex), //
(void*)offsetof(Vertex, rgba) // offset in array (why is this a pointer...)
);
glVertexAttribPointer(2, // location 0 in the shader
2, // 2 floats per vert
GL_FLOAT, // floats
GL_FALSE, // normalized, ignored,
sizeof(Vertex), //
(void*)offsetof(Vertex, s) // offset in array (why is this a pointer...)
);
}
void OceanTexture::destroy_pc() {}
@@ -0,0 +1,378 @@
#include "OceanTexture.h"
void OceanTexture::run_L1(SharedRenderState* render_state, ScopedProfilerNode& prof) {
// L1:
// lq.xyzw vf14_startx, 988(vi00) | maxw.xyzw vf01_ones, vf00, vf00
vu.startx = Vf(m_texture_constants.start);
// lq.xyzw vf02_offset, 989(vi00)
// lq.xyzw vf03_tbuf, 986(vi00)
// lq.xyzw vf04_dbuf, 987(vi00)
// lq.xyzw vf05_giftag, 985(vi00)
// lq.xyzw vf06_cam_nrm, 991(vi00)
// lq.xyzw vf07_constants, 990(vi00)
// iaddiu vi11_0x80, vi00, 0x80
// mtir vi08_tptr, vf03_tbuf.x
vu.tptr = get_tbuf();
// mtir vi09_tbase, vf03_tbuf.x
vu.tbase = get_tbuf();
// mr32.xyzw vf03_tbuf, vf03_tbuf
swap_tbuf();
// xtop vi05_in_ptr
vu.in_ptr = swap_vu_upload_buffers();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5(render_state, prof);
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5(render_state, prof);
// nop :e
// nop
}
void OceanTexture::run_L2(SharedRenderState* render_state, ScopedProfilerNode& prof) {
// L2:
// xtop vi05_in_ptr
vu.in_ptr = swap_vu_upload_buffers();
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5(render_state, prof);
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5(render_state, prof);
// mtir vi06_dbuf_write, vf04_dbuf.x
vu.dbuf_write = get_dbuf();
// bal vi12_ra, L3
// mr32.xyzw vf04_dbuf, vf04_dbuf
swap_dbuf();
run_L3();
// mtir vi03_dbuf_read_a, vf04_dbuf.x
vu.dbuf_read_a = get_dbuf();
// bal vi12_ra, L5
// mtir vi04_dbuf_read_b, vf04_dbuf.y
vu.dbuf_read_b = get_dbuf_other();
run_L5(render_state, prof);
// nop :e
// nop
}
namespace {
void lq_buffer(Mask mask, Vf& dest, Vf* src) {
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
dest.data[i] = src->data[i];
}
}
}
void sq_buffer(Mask mask, const Vf& src, Vf* dest) {
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
dest->data[i] = src.data[i];
}
}
}
void sq_buffer_giftag(const u8* src, Vf* dest) {
memcpy(dest, src, 16);
}
} // namespace
void OceanTexture::run_L3() {
Vf base_pos; // vf15
u16 loop_idx;
Vf vtx0; // vf16
Vf vtx1; // vf17
Vf vtx2; // vf18
Vf vtx3; // vf19
Vf res0; // vf20
Vf res1; // vf21
Vf res2; // vf22
Vf res3; // vf23
Vf nrm0; // vf24
Vf nrm1; // vf25
Vf nrm2; // vf26
Vf reflect; // vf27
Vf cout0; // vf28
Vf cout1; // vf29
Vf cout2; // vf30
Vf cout3; // vf31
Accumulator acc;
const Vf ones(1, 1, 1, 1);
const Vf vf00(0, 0, 0, 1);
const u16 vi11 = 0x80;
bool bc;
// clang-format off
// L3:
// ior vi07, vi06, vi00 | nop 56
vu.dbuf_write_base = vu.dbuf_write;
// move.xyzw vf15, vf14 | nop 57
base_pos.move(Mask::xyzw, vu.startx);
// iaddi vi01, vi00, 0x8 | nop 58
loop_idx = 8;
// lq.xyzw vf24, 1(vi05) | mulw.xyzw vf20, vf15, vf00 59 (?? what are they doing here)
res0.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm0, vu.in_ptr + 1);
// lq.xyzw vf25, 3(vi05) | mulw.xyzw vf21, vf15, vf00 60
res1.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm1, vu.in_ptr + 3);
// lq.xyzw vf26, 5(vi05) | mulw.xyzw vf22, vf15, vf00 61
res2.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm2, vu.in_ptr + 5);
// nop | mulw.xyzw vf23, vf15, vf00 62
res3.mul(Mask::xyzw, base_pos, 1.f);
// nop | mulax.xyzw ACC, vf24, vf06 63
acc.mula(Mask::xyzw, nrm0, m_texture_constants.cam_nrm.x());
// nop | madday.xyzw ACC, vf25, vf06 64
acc.madda(Mask::xyzw, nrm1, m_texture_constants.cam_nrm.y());
// nop | maddz.xyzw vf27, vf26, vf06 65
acc.madd(Mask::xyzw, reflect, nrm2, m_texture_constants.cam_nrm.z());
// nop | addx.x vf21, vf21, vf02 66
res1.add(Mask::x, res1, m_texture_constants.offsets.x());
// nop | addy.x vf22, vf22, vf02 67
res2.add(Mask::x, res2, m_texture_constants.offsets.y());
L4:
// nop | addz.x vf23, vf23, vf02 68
res3.add(Mask::x, res3, m_texture_constants.offsets.z());
// nop | addw.x vf15, vf15, vf02 69
base_pos.add(Mask::x, base_pos, m_texture_constants.offsets.w());
// sq.xyzw vf20, 2(vi06) | mulx.x vf28, vf01, vf24 70
cout0.mul(Mask::x, ones, nrm0.x()); sq_buffer(Mask::xyzw, res0, vu.dbuf_write + 2);
// sq.xyzw vf21, 5(vi06) | muly.x vf29, vf01, vf24 71
cout1.mul(Mask::x, ones, nrm0.y()); sq_buffer(Mask::xyzw, res1, vu.dbuf_write + 5);
// sq.xyzw vf22, 8(vi06) | mulz.x vf30, vf01, vf24 72
cout2.mul(Mask::x, ones, nrm0.z()); sq_buffer(Mask::xyzw, res2, vu.dbuf_write + 8);
// sq.xyzw vf23, 11(vi06) | mulw.x vf31, vf01, vf24 73
cout3.mul(Mask::x, ones, nrm0.w()); sq_buffer(Mask::xyzw, res3, vu.dbuf_write + 11);
// lq.xyzw vf16, 0(vi05) | mulx.y vf28, vf01, vf25 74
cout0.mul(Mask::y, ones, nrm1.x()); lq_buffer(Mask::xyzw, vtx0, vu.in_ptr);
// lq.xyzw vf17, 2(vi05) | muly.y vf29, vf01, vf25 75
cout1.mul(Mask::y, ones, nrm1.y()); lq_buffer(Mask::xyzw, vtx1, vu.in_ptr + 2);
// lq.xyzw vf18, 4(vi05) | mulz.y vf30, vf01, vf25 76
cout2.mul(Mask::y, ones, nrm1.z()); lq_buffer(Mask::xyzw, vtx2, vu.in_ptr + 4);
// lq.xyzw vf19, 6(vi05) | mulw.y vf31, vf01, vf25 77
cout3.mul(Mask::y, ones, nrm1.w()); lq_buffer(Mask::xyzw, vtx3, vu.in_ptr + 6);
// iaddi vi05, vi05, 0x8 | mulx.xy vf28, vf28, vf27 78
cout0.mul(Mask::xy, cout0, reflect.x()); vu.in_ptr = vu.in_ptr + 8;
// nop | muly.xy vf29, vf29, vf27 79
cout1.mul(Mask::xy, cout1, reflect.y());
// nop | mulz.xy vf30, vf30, vf27 80
cout2.mul(Mask::xy, cout2, reflect.z());
// nop | mulw.xy vf31, vf31, vf27 81
cout3.mul(Mask::xy, cout3, reflect.w());
// nop | mulw.xy vf28, vf28, vf16 82
cout0.mul(Mask::xy, cout0, vtx0.w());
// nop | mulw.xy vf29, vf29, vf17 83
cout1.mul(Mask::xy, cout1, vtx1.w());
// nop | mulw.xy vf30, vf30, vf18 84
cout2.mul(Mask::xy, cout2, vtx2.w());
// nop | mulw.xy vf31, vf31, vf19 85
cout3.mul(Mask::xy, cout3, vtx3.w());
// nop | ftoi0.xyzw vf16, vf16 86
vtx0.ftoi0(Mask::xyzw, vtx0);
// nop | ftoi0.xyzw vf17, vf17 87
vtx1.ftoi0(Mask::xyzw, vtx1);
// nop | ftoi0.xyzw vf18, vf18 88
vtx2.ftoi0(Mask::xyzw, vtx2);
// iaddi vi01, vi01, -0x1 | ftoi0.xyzw vf19, vf19 89
vtx3.ftoi0(Mask::xyzw, vtx3); loop_idx = loop_idx + -1;
// mfir.w vf16, vi11 | add.xyzw vf28, vf28, vf06 90
cout0.add(Mask::xyzw, cout0, m_texture_constants.cam_nrm); vtx0.mfir(Mask::w, vi11);
// mfir.w vf17, vi11 | add.xyzw vf29, vf29, vf06 91
cout1.add(Mask::xyzw, cout1, m_texture_constants.cam_nrm); vtx1.mfir(Mask::w, vi11);
// mfir.w vf18, vi11 | add.xyzw vf30, vf30, vf06 92
cout2.add(Mask::xyzw, cout2, m_texture_constants.cam_nrm); vtx2.mfir(Mask::w, vi11);
// mfir.w vf19, vi11 | add.xyzw vf31, vf31, vf06 93
cout3.add(Mask::xyzw, cout3, m_texture_constants.cam_nrm); vtx3.mfir(Mask::w, vi11);
// nop | mulx.xyzw vf28, vf28, vf07 94
cout0.mul(Mask::xyzw, cout0, m_texture_constants.constants.x());
// nop | mulx.xyzw vf29, vf29, vf07 95
cout1.mul(Mask::xyzw, cout1, m_texture_constants.constants.x());
// nop | mulx.xyzw vf30, vf30, vf07 96
cout2.mul(Mask::xyzw, cout2, m_texture_constants.constants.x());
// nop | mulx.xyzw vf31, vf31, vf07 97
cout3.mul(Mask::xyzw, cout3, m_texture_constants.constants.x());
// nop | addy.xyzw vf28, vf28, vf07 98
cout0.add(Mask::xyzw, cout0, m_texture_constants.constants.y());
// nop | addy.xyzw vf29, vf29, vf07 99
cout1.add(Mask::xyzw, cout1, m_texture_constants.constants.y());
// nop | addy.xyzw vf30, vf30, vf07 100
cout2.add(Mask::xyzw, cout2, m_texture_constants.constants.y());
// nop | addy.xyzw vf31, vf31, vf07 101
cout3.add(Mask::xyzw, cout3, m_texture_constants.constants.y());
// sq.xyzw vf16, 1(vi06) | sub.zw vf28, vf01, vf00 102
cout0.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx0, vu.dbuf_write + 1);
// sq.xyzw vf17, 4(vi06) | sub.zw vf29, vf01, vf00 103
cout1.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx1, vu.dbuf_write + 4);
// sq.xyzw vf18, 7(vi06) | sub.zw vf30, vf01, vf00 104
cout2.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx2, vu.dbuf_write + 7);
// sq.xyzw vf19, 10(vi06) | sub.zw vf31, vf01, vf00 105
cout3.sub(Mask::zw, ones, vf00); sq_buffer(Mask::xyzw, vtx3, vu.dbuf_write + 10);
// lq.xyzw vf24, 1(vi05) | mulw.xyzw vf20, vf15, vf00 106
res0.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm0, vu.in_ptr + 1);
// lq.xyzw vf25, 3(vi05) | mulw.xyzw vf21, vf15, vf00 107
res1.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm1, vu.in_ptr + 3);
// lq.xyzw vf26, 5(vi05) | mulw.xyzw vf22, vf15, vf00 108
res2.mul(Mask::xyzw, base_pos, 1.f); lq_buffer(Mask::xyzw, nrm2, vu.in_ptr + 5);
// sq.xyzw vf28, 0(vi06) | mulw.xyzw vf23, vf15, vf00 109
res3.mul(Mask::xyzw, base_pos, 1.f); sq_buffer(Mask::xyzw, cout0, vu.dbuf_write);
// sq.xyzw vf29, 3(vi06) | mulax.xyzw ACC, vf24, vf06 110
acc.mula(Mask::xyzw, nrm0, m_texture_constants.cam_nrm.x()); sq_buffer(Mask::xyzw, cout1, vu.dbuf_write + 3);
// sq.xyzw vf30, 6(vi06) | madday.xyzw ACC, vf25, vf06 111
acc.madda(Mask::xyzw, nrm1, m_texture_constants.cam_nrm.y()); sq_buffer(Mask::xyzw, cout2, vu.dbuf_write + 6);
// sq.xyzw vf31, 9(vi06) | maddz.xyzw vf27, vf26, vf06 112
acc.madd(Mask::xyzw, reflect, nrm2, m_texture_constants.cam_nrm.z()); sq_buffer(Mask::xyzw, cout3, vu.dbuf_write + 9);
// BRANCH!
// ibgtz vi01, L4 | addx.x vf21, vf21, vf02 113
res1.add(Mask::x, res1, m_texture_constants.offsets.x()); bc = ((s16)loop_idx) > 0;
// iaddi vi06, vi06, 0xc | addy.x vf22, vf22, vf02 114
res2.add(Mask::x, res2, m_texture_constants.offsets.y()); vu.dbuf_write = vu.dbuf_write + 12;
if (bc) { goto L4; }
// lq.xyzw vf28, 0(vi07) | addx.y vf14, vf14, vf02 115
vu.startx.add(Mask::y, vu.startx, m_texture_constants.offsets.x()); lq_buffer(Mask::xyzw, cout0, vu.dbuf_write_base);
// lq.xyzw vf16, 1(vi07) | nop 116
lq_buffer(Mask::xyzw, vtx0, vu.dbuf_write_base + 1);
// sq.xyzw vf20, 2(vi06) | nop 117
sq_buffer(Mask::xyzw, res0, vu.dbuf_write + 2);
// sq.xyzw vf28, 0(vi06) | nop 118
sq_buffer(Mask::xyzw, cout0, vu.dbuf_write);
// jr vi12 | nop 119
// sq.xyzw vf16, 1(vi06) | nop 120
sq_buffer(Mask::xyzw, vtx0, vu.dbuf_write + 1);
// clang-format on
}
void OceanTexture::run_L5(SharedRenderState* render_state, ScopedProfilerNode& prof) {
// clang-format off
u16 loop_idx;
Vf res0;
Vf res1;
Vf cout0;
Vf cout1;
Vf vtx0;
Vf vtx1;
bool bc;
// L5:
// iaddiu vi01, vi00, 0x21 | nop 121
loop_idx = 0x21; /* 33 */
// sq.xyzw vf05, 0(vi08) | nop 122
sq_buffer_giftag(m_texture_constants.giftag, vu.tptr);
// iaddi vi08, vi08, 0x1 | nop 123
vu.tptr = vu.tptr + 1;
L6:
// iaddi vi01, vi01, -0x1 | nop 124
loop_idx = loop_idx + -1;
// lq.xyzw vf20, 2(vi03) | nop 125
lq_buffer(Mask::xyzw, res0, vu.dbuf_read_a + 2);
// lq.xyzw vf21, 2(vi04) | nop 126
lq_buffer(Mask::xyzw, res1, vu.dbuf_read_b + 2);
// lq.xyzw vf28, 0(vi03) | nop 127
lq_buffer(Mask::xyzw, cout0, vu.dbuf_read_a);
// lq.xyzw vf16, 1(vi03) | nop 128
lq_buffer(Mask::xyzw, vtx0, vu.dbuf_read_a + 1);
// lq.xyzw vf29, 0(vi04) | ftoi4.xyzw vf20, vf20 129
res0.ftoi4(Mask::xyzw, res0); lq_buffer(Mask::xyzw, cout1, vu.dbuf_read_b);
// lq.xyzw vf17, 1(vi04) | ftoi4.xyzw vf21, vf21 130
res1.ftoi4(Mask::xyzw, res1); lq_buffer(Mask::xyzw, vtx1, vu.dbuf_read_b + 1);
// sq.xyzw vf28, 0(vi08) | nop 131
sq_buffer(Mask::xyzw, cout0, vu.tptr);
// sq.xyzw vf16, 1(vi08) | nop 132
sq_buffer(Mask::xyzw, vtx0, vu.tptr + 1);
// sq.xyzw vf20, 2(vi08) | nop 133
sq_buffer(Mask::xyzw, res0, vu.tptr + 2);
// sq.xyzw vf29, 3(vi08) | nop 134
sq_buffer(Mask::xyzw, cout1, vu.tptr + 3);
// sq.xyzw vf17, 4(vi08) | nop 135
sq_buffer(Mask::xyzw, vtx1, vu.tptr + 4);
// sq.xyzw vf21, 5(vi08) | nop 136
sq_buffer(Mask::xyzw, res1, vu.tptr + 5);
// iaddi vi03, vi03, 0x3 | nop 137
vu.dbuf_read_a = vu.dbuf_read_a + 3;
// iaddi vi04, vi04, 0x3 | nop 138
vu.dbuf_read_b = vu.dbuf_read_b + 3;
// BRANCH!
// ibgtz vi01, L6 | nop 139
bc = ((s16)loop_idx) > 0;
// iaddi vi08, vi08, 0x6 | nop 140
vu.tptr = vu.tptr + 6;
if (bc) { goto L6; }
// xgkick vi09 | nop 141
xgkick(vu.tbase, render_state, prof);
// mtir vi08, vf03.x | nop 142
// vu.tptr = vu.vf03.x_as_u16();
vu.tptr = get_tbuf();
// mtir vi09, vf03.x | nop 143
// vu.vi09 = vu.vf03.x_as_u16();
vu.tbase = get_tbuf();
// jr vi12 | nop 144
// ASSERT(false);
// mr32.xyzw vf03, vf03 | nop 145
// vu.vf03.mr32(Mask::xyzw, vu.vf03);
swap_tbuf();
// clang-format on
}
void OceanTexture::xgkick(Vf* src, SharedRenderState* render_state, ScopedProfilerNode& prof) {
// KICK
m_hack_renderer.render_gif((const u8*)src, UINT32_MAX, render_state, prof);
}
@@ -0,0 +1,12 @@
#version 430 core
out vec4 color;
in vec2 tex_coord;
in vec4 fragment_color;
uniform sampler2D tex_T0;
void main() {
vec4 tex = texture(tex_T0, tex_coord);
color = fragment_color * tex * 2;
}
@@ -0,0 +1,15 @@
#version 430 core
layout (location = 0) in vec2 position_in;
layout (location = 1) in vec4 rgba_in;
layout (location = 2) in vec2 tex_coord_in;
out vec4 fragment_color;
out vec2 tex_coord;
void main() {
// inputs are 0 - 2048.
gl_Position = vec4((position_in.x - 1024) / 1024, (position_in.y - 1024) / 1024, 0.5, 1.0);
fragment_color = vec4(rgba_in.x, rgba_in.y, rgba_in.z, 1);
tex_coord = tex_coord_in;
}
+3 -3
View File
@@ -714,7 +714,7 @@ void MC_set_language(s32 l) {
* Set the current memory card operation to FORMAT the given card.
* Doesn't do anything in the port because we don't use memory cards.
*/
u64 MC_format(s32 card_idx) {
u64 MC_format(s32 /*card_idx*/) {
return u64(McStatusCode::OK);
// u64 can_add = op.operation == MemoryCardOperationKind::NO_OP;
// mc_print("requested format");
@@ -732,7 +732,7 @@ u64 MC_format(s32 card_idx) {
* Set the current memory card operation to UNFORMAT the given card.
* You get the idea.
*/
u64 MC_unformat(s32 card_idx) {
u64 MC_unformat(s32 /*card_idx*/) {
return u64(McStatusCode::OK);
// u64 can_add = op.operation == MemoryCardOperationKind::NO_OP;
// mc_print("requested unformat");
@@ -750,7 +750,7 @@ u64 MC_unformat(s32 card_idx) {
* Set the current memory card operation to create the save file.
* The data I believe is just an empty buffer used as temporary storage.
*/
u64 MC_createfile(s32 param, Ptr<u8> data) {
u64 MC_createfile(s32 /*param*/, Ptr<u8> /*data*/) {
return u64(McStatusCode::OK);
// u64 can_add = op.operation == MemoryCardOperationKind::NO_OP;
// mc_print("requested createfile");
-4
View File
@@ -14,8 +14,6 @@ struct Cache {
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 call_addr = 0;
c->daddiu(sp, sp, -16); // daddiu sp, sp, -16
c->sd(fp, 8, sp); // sd fp, 8(sp)
c->mov64(fp, t9); // or fp, t9, r0
@@ -280,8 +278,6 @@ struct Cache {
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
c->copy_vfs_from_other(&ocean_regs_vfs);
bool bc = false;
u32 call_addr = 0;
c->mov64(v1, a0); // or v1, a0, r0
get_fake_spad_addr(t4, cache.fake_scratchpad_data, 0, c);// lui t4, 28672
c->ori(t4, t4, 12288); // ori t4, t4, 12288
+644
View File
@@ -0,0 +1,644 @@
// clang-format off
//--------------------------MIPS2C---------------------
#include "game/mips2c/mips2c_private.h"
#include "game/kernel/kscheme.h"
namespace Mips2C {
namespace ocean_interp_wave {
struct Cache {
void* ocean_wave_frames; // *ocean-wave-frames*
void* ocean_work; // *ocean-work*
} cache;
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
c->daddiu(sp, sp, -16); // daddiu sp, sp, -16
c->sd(fp, 8, sp); // sd fp, 8(sp)
c->mov64(fp, t9); // or fp, t9, r0
c->dsra(a2, a1, 5); // dsra a2, a1, 5
c->andi(v1, a2, 63); // andi v1, a2, 63
c->dsll(v1, v1, 10); // dsll v1, v1, 10
c->daddu(v1, r0, v1); // daddu v1, r0, v1
c->load_symbol(a3, cache.ocean_wave_frames); // lw a3, *ocean-wave-frames*(s7)
c->daddu(v1, v1, a3); // daddu v1, v1, a3
c->daddiu(a2, a2, 1); // daddiu a2, a2, 1
c->andi(a2, a2, 63); // andi a2, a2, 63
c->dsll(a2, a2, 10); // dsll a2, a2, 10
c->daddu(a2, r0, a2); // daddu a2, r0, a2
c->load_symbol(a3, cache.ocean_wave_frames); // lw a3, *ocean-wave-frames*(s7)
c->daddu(a2, a2, a3); // daddu a2, a2, a3
c->fprs[f0] = 0.03125; // lwc1 f0, L12(fp)
c->andi(a1, a1, 31); // andi a1, a1, 31
c->mtc1(f1, a1); // mtc1 f1, a1
c->cvtsw(f1, f1); // cvt.s.w f1, f1
c->muls(f0, f0, f1); // mul.s f0, f0, f1
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->swc1(f0, 64, a1); // swc1 f0, 64(a1)
c->fprs[f0] = 1.0; // lwc1 f0, L11(fp)
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->lwc1(f1, 64, a1); // lwc1 f1, 64(a1)
c->subs(f0, f0, f1); // sub.s f0, f0, f1
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->swc1(f0, 60, a1); // swc1 f0, 60(a1)
c->fprs[f0] = 0.333; // lwc1 f0, L10(fp)
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->lwc1(f1, 60, a1); // lwc1 f1, 60(a1)
c->muls(f0, f0, f1); // mul.s f0, f0, f1
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->swc1(f0, 60, a1); // swc1 f0, 60(a1)
c->fprs[f0] = 0.333; // lwc1 f0, L10(fp)
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->lwc1(f1, 64, a1); // lwc1 f1, 64(a1)
c->muls(f0, f0, f1); // mul.s f0, f0, f1
c->load_symbol(a1, cache.ocean_work); // lw a1, *ocean-work*(s7)
c->swc1(f0, 64, a1); // swc1 f0, 64(a1)
c->load_symbol(a3, cache.ocean_work); // lw a3, *ocean-work*(s7)
c->addiu(a1, r0, 32); // addiu a1, r0, 32
c->lqc2(vf1, 60, a3); // lqc2 vf1, 60(a3)
// nop // sll r0, r0, 0
c->lw(a3, 0, v1); // lw a3, 0(v1)
// nop // sll r0, r0, 0
c->lw(t0, 0, a2); // lw t0, 0(a2)
block_1:
c->pextlb(t1, a3, r0); // pextlb t1, a3, r0
c->lw(a3, 4, v1); // lw a3, 4(v1)
c->pextlb(t2, t0, r0); // pextlb t2, t0, r0
c->lw(t0, 4, a2); // lw t0, 4(a2)
c->pextlb(t3, a3, r0); // pextlb t3, a3, r0
c->lw(a3, 8, v1); // lw a3, 8(v1)
c->pextlb(t4, t0, r0); // pextlb t4, t0, r0
c->lw(t0, 8, a2); // lw t0, 8(a2)
c->pextlh(t5, t1, r0); // pextlh t5, t1, r0
c->lw(t1, 12, v1); // lw t1, 12(v1)
c->pextlh(t6, t2, r0); // pextlh t6, t2, r0
c->lw(t2, 12, a2); // lw t2, 12(a2)
c->pextlh(t3, t3, r0); // pextlh t3, t3, r0
c->mov128_vf_gpr(vf2, t5); // qmtc2.i vf2, t5
c->pextlh(t4, t4, r0); // pextlh t4, t4, r0
c->mov128_vf_gpr(vf10, t6); // qmtc2.i vf10, t6
c->pextlb(a3, a3, r0); // pextlb a3, a3, r0
c->mov128_vf_gpr(vf3, t3); // qmtc2.i vf3, t3
c->pextlb(t0, t0, r0); // pextlb t0, t0, r0
c->mov128_vf_gpr(vf11, t4); // qmtc2.i vf11, t4
c->pextlb(t4, t1, r0); // pextlb t4, t1, r0
c->vitof15(DEST::xyzw, vf2, vf2); // vitof15.xyzw vf2, vf2
c->pextlb(t3, t2, r0); // pextlb t3, t2, r0
c->vitof15(DEST::xyzw, vf10, vf10); // vitof15.xyzw vf10, vf10
c->pextlh(a3, a3, r0); // pextlh a3, a3, r0
c->vitof15(DEST::xyzw, vf3, vf3); // vitof15.xyzw vf3, vf3
c->pextlh(t1, t0, r0); // pextlh t1, t0, r0
c->vitof15(DEST::xyzw, vf11, vf11); // vitof15.xyzw vf11, vf11
c->pextlh(t2, t4, r0); // pextlh t2, t4, r0
c->lw(t5, 16, v1); // lw t5, 16(v1)
c->pextlh(t3, t3, r0); // pextlh t3, t3, r0
c->lw(t6, 16, a2); // lw t6, 16(a2)
c->vmula_bc(DEST::xyzw, BC::x, vf2, vf1); // vmulax.xyzw acc, vf2, vf1
c->lw(t4, 20, v1); // lw t4, 20(v1)
c->vmadd_bc(DEST::xyzw, BC::y, vf2, vf10, vf1); // vmaddy.xyzw vf2, vf10, vf1
c->lw(t0, 20, a2); // lw t0, 20(a2)
c->vmula_bc(DEST::xyzw, BC::x, vf3, vf1); // vmulax.xyzw acc, vf3, vf1
c->mov128_vf_gpr(vf4, a3); // qmtc2.i vf4, a3
c->vmadd_bc(DEST::xyzw, BC::y, vf3, vf11, vf1); // vmaddy.xyzw vf3, vf11, vf1
c->mov128_vf_gpr(vf12, t1); // qmtc2.i vf12, t1
c->pextlb(a3, t5, r0); // pextlb a3, t5, r0
c->mov128_vf_gpr(vf5, t2); // qmtc2.i vf5, t2
c->pextlb(t1, t6, r0); // pextlb t1, t6, r0
c->mov128_vf_gpr(vf13, t3); // qmtc2.i vf13, t3
c->pextlb(t2, t4, r0); // pextlb t2, t4, r0
c->vitof15(DEST::xyzw, vf4, vf4); // vitof15.xyzw vf4, vf4
c->pextlb(t0, t0, r0); // pextlb t0, t0, r0
c->vitof15(DEST::xyzw, vf12, vf12); // vitof15.xyzw vf12, vf12
c->pextlh(a3, a3, r0); // pextlh a3, a3, r0
c->vitof15(DEST::xyzw, vf5, vf5); // vitof15.xyzw vf5, vf5
c->pextlh(t1, t1, r0); // pextlh t1, t1, r0
c->vitof15(DEST::xyzw, vf13, vf13); // vitof15.xyzw vf13, vf13
c->pextlh(t2, t2, r0); // pextlh t2, t2, r0
c->lw(t5, 24, v1); // lw t5, 24(v1)
c->pextlh(t3, t0, r0); // pextlh t3, t0, r0
c->lw(t6, 24, a2); // lw t6, 24(a2)
c->vmula_bc(DEST::xyzw, BC::x, vf4, vf1); // vmulax.xyzw acc, vf4, vf1
c->lw(t4, 28, v1); // lw t4, 28(v1)
c->vmadd_bc(DEST::xyzw, BC::y, vf4, vf12, vf1); // vmaddy.xyzw vf4, vf12, vf1
c->lw(t0, 28, a2); // lw t0, 28(a2)
c->vmula_bc(DEST::xyzw, BC::x, vf5, vf1); // vmulax.xyzw acc, vf5, vf1
c->mov128_vf_gpr(vf6, a3); // qmtc2.i vf6, a3
c->vmadd_bc(DEST::xyzw, BC::y, vf5, vf13, vf1); // vmaddy.xyzw vf5, vf13, vf1
c->mov128_vf_gpr(vf14, t1); // qmtc2.i vf14, t1
c->pextlb(a3, t5, r0); // pextlb a3, t5, r0
c->mov128_vf_gpr(vf7, t2); // qmtc2.i vf7, t2
c->pextlb(t1, t6, r0); // pextlb t1, t6, r0
c->mov128_vf_gpr(vf15, t3); // qmtc2.i vf15, t3
c->pextlb(t2, t4, r0); // pextlb t2, t4, r0
c->vitof15(DEST::xyzw, vf6, vf6); // vitof15.xyzw vf6, vf6
c->pextlb(t0, t0, r0); // pextlb t0, t0, r0
c->vitof15(DEST::xyzw, vf14, vf14); // vitof15.xyzw vf14, vf14
c->pextlh(a3, a3, r0); // pextlh a3, a3, r0
c->vitof15(DEST::xyzw, vf7, vf7); // vitof15.xyzw vf7, vf7
c->pextlh(t1, t1, r0); // pextlh t1, t1, r0
c->vitof15(DEST::xyzw, vf15, vf15); // vitof15.xyzw vf15, vf15
c->pextlh(t2, t2, r0); // pextlh t2, t2, r0
c->sqc2(vf2, 0, a0); // sqc2 vf2, 0(a0)
c->pextlh(t0, t0, r0); // pextlh t0, t0, r0
c->sqc2(vf3, 16, a0); // sqc2 vf3, 16(a0)
c->vmula_bc(DEST::xyzw, BC::x, vf6, vf1); // vmulax.xyzw acc, vf6, vf1
c->sqc2(vf4, 32, a0); // sqc2 vf4, 32(a0)
c->vmadd_bc(DEST::xyzw, BC::y, vf6, vf14, vf1); // vmaddy.xyzw vf6, vf14, vf1
c->sqc2(vf5, 48, a0); // sqc2 vf5, 48(a0)
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf1); // vmulax.xyzw acc, vf7, vf1
c->mov128_vf_gpr(vf8, a3); // qmtc2.i vf8, a3
c->vmadd_bc(DEST::xyzw, BC::y, vf7, vf15, vf1); // vmaddy.xyzw vf7, vf15, vf1
c->mov128_vf_gpr(vf16, t1); // qmtc2.i vf16, t1
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf9, t2); // qmtc2.i vf9, t2
// nop // sll r0, r0, 0
c->mov128_vf_gpr(vf17, t0); // qmtc2.i vf17, t0
// nop // sll r0, r0, 0
c->vitof15(DEST::xyzw, vf8, vf8); // vitof15.xyzw vf8, vf8
c->daddiu(a0, a0, 128); // daddiu a0, a0, 128
c->vitof15(DEST::xyzw, vf16, vf16); // vitof15.xyzw vf16, vf16
c->lw(a3, 32, v1); // lw a3, 32(v1)
c->vitof15(DEST::xyzw, vf9, vf9); // vitof15.xyzw vf9, vf9
c->lw(t0, 32, a2); // lw t0, 32(a2)
c->vitof15(DEST::xyzw, vf17, vf17); // vitof15.xyzw vf17, vf17
c->vmula_bc(DEST::xyzw, BC::x, vf8, vf1); // vmulax.xyzw acc, vf8, vf1
c->sqc2(vf6, -64, a0); // sqc2 vf6, -64(a0)
c->vmadd_bc(DEST::xyzw, BC::y, vf8, vf16, vf1); // vmaddy.xyzw vf8, vf16, vf1
c->sqc2(vf7, -48, a0); // sqc2 vf7, -48(a0)
c->vmula_bc(DEST::xyzw, BC::x, vf9, vf1); // vmulax.xyzw acc, vf9, vf1
c->daddiu(a1, a1, -1); // daddiu a1, a1, -1
c->vmadd_bc(DEST::xyzw, BC::y, vf9, vf17, vf1); // vmaddy.xyzw vf9, vf17, vf1
c->daddiu(v1, v1, 32); // daddiu v1, v1, 32
// nop // sll r0, r0, 0
c->daddiu(a2, a2, 32); // daddiu a2, a2, 32
// nop // sll r0, r0, 0
c->sqc2(vf8, -32, a0); // sqc2 vf8, -32(a0)
bc = ((s64)c->sgpr64(a1)) > 0; // bgtz a1, L5
c->sqc2(vf9, -16, a0); // sqc2 vf9, -16(a0)
if (bc) {goto block_1;} // branch non-likely
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
c->ld(fp, 8, sp); // ld fp, 8(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 16); // daddiu sp, sp, 16
goto end_of_function; // return
end_of_function:
return c->gprs[v0].du64[0];
}
void link() {
cache.ocean_wave_frames = intern_from_c("*ocean-wave-frames*").c();
cache.ocean_work = intern_from_c("*ocean-work*").c();
gLinkedFunctionTable.reg("ocean-interp-wave", execute, 256);
}
} // namespace ocean_interp_wave
} // namespace Mips2C
//--------------------------MIPS2C---------------------
#include "game/mips2c/mips2c_private.h"
#include "game/kernel/kscheme.h"
namespace Mips2C {
namespace ocean_generate_verts {
struct Cache {
void* ocean_vu0_work; // *ocean-vu0-work*
void* time_of_day_context; // *time-of-day-context*
void* ocean_vu0_block; // ocean-vu0-block
void* upload_vu0_program; // upload-vu0-program
void* vector; // vector*!
void* vu_lights_light_group; // vu-lights<-light-group!
void* ocean_generate_verts_vector;
} cache;
void vcallms0(ExecutionContext* c) {
// nop | mulay.x ACC, vf12, vf02 0
c->acc.vf.mula(Mask::x, c->vf_src(vf12).vf, c->vf_src(vf02).vf.y());
// nop | mulax.z ACC, vf12, vf03 1
c->acc.vf.mula(Mask::z, c->vf_src(vf12).vf, c->vf_src(vf03).vf.x());
// nop | msubx.xz vf24, vf12, vf02 2
// ASSERT(false);
c->acc.vf.msub(Mask::xz, c->vfs[vf24].vf, c->vf_src(vf12).vf, c->vf_src(vf02).vf.x());
// nop | mulaz.x ACC, vf12, vf02 3
c->acc.vf.mula(Mask::x, c->vf_src(vf12).vf, c->vf_src(vf02).vf.z());
// nop | mulay.z ACC, vf12, vf03 4
c->acc.vf.mula(Mask::z, c->vf_src(vf12).vf, c->vf_src(vf03).vf.y());
// nop | msuby.xz vf25, vf12, vf02 5
// ASSERT(false);
c->acc.vf.msub(Mask::xz, c->vfs[vf25].vf, c->vf_src(vf12).vf, c->vf_src(vf02).vf.y());
// nop | mulaw.x ACC, vf12, vf02 6
c->acc.vf.mula(Mask::x, c->vf_src(vf12).vf, c->vf_src(vf02).vf.w());
// nop | mulaz.z ACC, vf12, vf03 7
c->acc.vf.mula(Mask::z, c->vf_src(vf12).vf, c->vf_src(vf03).vf.z());
// nop | msubz.xz vf26, vf12, vf02 8
// ASSERT(false);
c->acc.vf.msub(Mask::xz, c->vfs[vf26].vf, c->vf_src(vf12).vf, c->vf_src(vf02).vf.z());
// nop | mulax.x ACC, vf12, vf04 9
c->acc.vf.mula(Mask::x, c->vf_src(vf12).vf, c->vf_src(vf04).vf.x());
// nop | mulaw.z ACC, vf12, vf03 10
c->acc.vf.mula(Mask::z, c->vf_src(vf12).vf, c->vf_src(vf03).vf.w());
// nop | msubw.xz vf27, vf12, vf02 11
// ASSERT(false);
c->acc.vf.msub(Mask::xz, c->vfs[vf27].vf, c->vf_src(vf12).vf, c->vf_src(vf02).vf.w());
// nop | mul.xz vf28, vf24, vf24 12
c->vfs[vf28].vf.mul(Mask::xz, c->vf_src(vf24).vf, c->vf_src(vf24).vf);
// nop | mul.xz vf29, vf25, vf25 13
c->vfs[vf29].vf.mul(Mask::xz, c->vf_src(vf25).vf, c->vf_src(vf25).vf);
// nop | mul.xz vf30, vf26, vf26 14
c->vfs[vf30].vf.mul(Mask::xz, c->vf_src(vf26).vf, c->vf_src(vf26).vf);
// nop | mul.xz vf31, vf27, vf27 15
c->vfs[vf31].vf.mul(Mask::xz, c->vf_src(vf27).vf, c->vf_src(vf27).vf);
// nop | subx.y vf24, vf01, vf28 16
c->vfs[vf24].vf.sub(Mask::y, c->vf_src(vf01).vf, c->vf_src(vf28).vf.x());
// nop | subx.y vf25, vf01, vf29 17
c->vfs[vf25].vf.sub(Mask::y, c->vf_src(vf01).vf, c->vf_src(vf29).vf.x());
// nop | subx.y vf26, vf01, vf30 18
c->vfs[vf26].vf.sub(Mask::y, c->vf_src(vf01).vf, c->vf_src(vf30).vf.x());
// nop | subx.y vf27, vf01, vf31 19
c->vfs[vf27].vf.sub(Mask::y, c->vf_src(vf01).vf, c->vf_src(vf31).vf.x());
// nop | subz.y vf24, vf24, vf28 20
c->vfs[vf24].vf.sub(Mask::y, c->vf_src(vf24).vf, c->vf_src(vf28).vf.z());
// nop | subz.y vf25, vf25, vf29 21
c->vfs[vf25].vf.sub(Mask::y, c->vf_src(vf25).vf, c->vf_src(vf29).vf.z());
// nop | subz.y vf26, vf26, vf30 22
c->vfs[vf26].vf.sub(Mask::y, c->vf_src(vf26).vf, c->vf_src(vf30).vf.z());
// nop | subz.y vf27, vf27, vf31 23
c->vfs[vf27].vf.sub(Mask::y, c->vf_src(vf27).vf, c->vf_src(vf31).vf.z());
// nop | mulx.w vf24, vf01, vf02 24
c->vfs[vf24].vf.mul(Mask::w, c->vf_src(vf01).vf, c->vf_src(vf02).vf.x());
// nop | muly.w vf25, vf01, vf02 25
c->vfs[vf25].vf.mul(Mask::w, c->vf_src(vf01).vf, c->vf_src(vf02).vf.y());
// nop | mulz.w vf26, vf01, vf02 26
c->vfs[vf26].vf.mul(Mask::w, c->vf_src(vf01).vf, c->vf_src(vf02).vf.z());
// nop | mulw.w vf27, vf01, vf02 27
c->vfs[vf27].vf.mul(Mask::w, c->vf_src(vf01).vf, c->vf_src(vf02).vf.w());
// nop | mulax.xyzw ACC, vf05, vf24 28
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf24).vf.x());
// nop | madday.xyzw ACC, vf06, vf24 29
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf24].vf.y());
// nop | maddz.xyz vf16, vf07, vf24 30
c->acc.vf.madd(Mask::xyz, c->vfs[vf16].vf, c->vf_src(vf07).vf, c->vf_src(vf24).vf.z());
// nop | subw.z vf24, vf24, vf00 31
c->vfs[vf24].vf.sub(Mask::z, c->vf_src(vf24).vf, c->vf_src(vf00).vf.w());
// nop | mulax.xyzw ACC, vf05, vf25 32
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf25).vf.x());
// nop | madday.xyzw ACC, vf06, vf25 33
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf25].vf.y());
// nop | maddz.xyz vf17, vf07, vf25 34
c->acc.vf.madd(Mask::xyz, c->vfs[vf17].vf, c->vf_src(vf07).vf, c->vf_src(vf25).vf.z());
// div Q, vf00.w, vf24.z | subw.z vf25, vf25, vf00 35
c->vfs[vf25].vf.sub(Mask::z, c->vf_src(vf25).vf, c->vf_src(vf00).vf.w()); c->Q = 1.f / c->vf_src(vf24).vf.z();
// nop | mulax.xyzw ACC, vf05, vf26 36
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf26).vf.x());
// nop | madday.xyzw ACC, vf06, vf26 37
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf26].vf.y());
// nop | maddz.xyz vf18, vf07, vf26 38
c->acc.vf.madd(Mask::xyz, c->vfs[vf18].vf, c->vf_src(vf07).vf, c->vf_src(vf26).vf.z());
// nop | subw.z vf26, vf26, vf00 39
c->vfs[vf26].vf.sub(Mask::z, c->vf_src(vf26).vf, c->vf_src(vf00).vf.w());
// nop | mulax.xyzw ACC, vf05, vf27 40
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf05).vf, c->vf_src(vf27).vf.x());
// nop | madday.xyzw ACC, vf06, vf27 41
c->acc.vf.madda(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf27].vf.y());
// nop | mul.w vf20, vf00, Q 42
c->vfs[vf20].vf.mul(Mask::w, c->vf_src(vf00).vf, c->Q);
// div Q, vf00.w, vf25.z | maddz.xyz vf19, vf07, vf27 43
c->acc.vf.madd(Mask::xyz, c->vfs[vf19].vf, c->vf_src(vf07).vf, c->vf_src(vf27).vf.z()); c->Q = 1.f / c->vf_src(vf25).vf.z();
// nop | subw.z vf27, vf27, vf00 44
c->vfs[vf27].vf.sub(Mask::z, c->vf_src(vf27).vf, c->vf_src(vf00).vf.w());
// nop | maxx.xyz vf16, vf16, vf00 45
c->vfs[vf16].vf.max(Mask::xyz, c->vf_src(vf16).vf, c->vf_src(vf00).vf.x());
// nop | maxx.xyz vf17, vf17, vf00 46
c->vfs[vf17].vf.max(Mask::xyz, c->vf_src(vf17).vf, c->vf_src(vf00).vf.x());
// nop | maxx.xyz vf18, vf18, vf00 47
c->vfs[vf18].vf.max(Mask::xyz, c->vf_src(vf18).vf, c->vf_src(vf00).vf.x());
// nop | maxx.xyz vf19, vf19, vf00 48
c->vfs[vf19].vf.max(Mask::xyz, c->vf_src(vf19).vf, c->vf_src(vf00).vf.x());
// nop | mul.w vf21, vf00, Q 49
c->vfs[vf21].vf.mul(Mask::w, c->vf_src(vf00).vf, c->Q);
// div Q, vf00.w, vf26.z | mula.xyzw ACC, vf01, vf11 50
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf); c->Q = 1.f / c->vf_src(vf26).vf.z();
// nop | maddax.xyz ACC, vf08, vf16 51
c->acc.vf.madda(Mask::xyz, c->vfs[vf08].vf, c->vfs[vf16].vf.x());
// nop | madday.xyz ACC, vf09, vf16 52
c->acc.vf.madda(Mask::xyz, c->vfs[vf09].vf, c->vfs[vf16].vf.y());
// nop | maddz.xyz vf20, vf10, vf16 53
c->acc.vf.madd(Mask::xyz, c->vfs[vf20].vf, c->vf_src(vf10).vf, c->vf_src(vf16).vf.z());
// nop | mula.xyzw ACC, vf01, vf11 54
// vu.acc.mula(Mask::xyzw, vu.vf01, vu.vf11);
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf);
// nop | maddax.xyz ACC, vf08, vf17 55
c->acc.vf.madda(Mask::xyz, c->vfs[vf08].vf, c->vfs[vf17].vf.x());
// nop | madday.xyz ACC, vf09, vf17 56
c->acc.vf.madda(Mask::xyz, c->vfs[vf09].vf, c->vfs[vf17].vf.y());
// nop | mul.w vf22, vf00, Q 57
c->vfs[vf22].vf.mul(Mask::w, c->vf_src(vf00).vf, c->Q);
// nop | maddz.xyz vf21, vf10, vf17 58
c->acc.vf.madd(Mask::xyz, c->vfs[vf21].vf, c->vf_src(vf10).vf, c->vf_src(vf17).vf.z());
// div Q, vf00.w, vf27.z | mula.xyzw ACC, vf01, vf11 59
// vu.acc.mula(Mask::xyzw, vu.vf01, vu.vf11);
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf);
c->Q = 1.f / c->vf_src(vf27).vf.z();
// nop | maddax.xyz ACC, vf08, vf18 60
c->acc.vf.madda(Mask::xyz, c->vfs[vf08].vf, c->vfs[vf18].vf.x());
// nop | madday.xyz ACC, vf09, vf18 61
c->acc.vf.madda(Mask::xyz, c->vfs[vf09].vf, c->vfs[vf18].vf.y());
// nop | maddz.xyz vf22, vf10, vf18 62
c->acc.vf.madd(Mask::xyz, c->vfs[vf22].vf, c->vf_src(vf10).vf, c->vf_src(vf18).vf.z());
// nop | mula.xyzw ACC, vf01, vf11 63
// vu.acc.mula(Mask::xyzw, vu.vf01, vu.vf11);
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf);
// nop | maddax.xyz ACC, vf08, vf19 64
c->acc.vf.madda(Mask::xyz, c->vfs[vf08].vf, c->vfs[vf19].vf.x());
// nop | madday.xyz ACC, vf09, vf19 65
c->acc.vf.madda(Mask::xyz, c->vfs[vf09].vf, c->vfs[vf19].vf.y());
// nop | maddz.xyz vf23, vf10, vf19 66
c->acc.vf.madd(Mask::xyz, c->vfs[vf23].vf, c->vf_src(vf10).vf, c->vf_src(vf19).vf.z());
// nop | mul.w vf23, vf00, Q 67
c->vfs[vf23].vf.mul(Mask::w, c->vf_src(vf00).vf, c->Q);
// nop | miniy.xyz vf20, vf20, vf12 68
c->vfs[vf20].vf.mini(Mask::xyz, c->vf_src(vf20).vf, c->vf_src(vf12).vf.y());
// nop | miniy.xyz vf21, vf21, vf12 69
c->vfs[vf21].vf.mini(Mask::xyz, c->vf_src(vf21).vf, c->vf_src(vf12).vf.y());
// nop | miniy.xyz vf22, vf22, vf12 :e 70
c->vfs[vf22].vf.mini(Mask::xyz, c->vf_src(vf22).vf, c->vf_src(vf12).vf.y());
// nop | miniy.xyz vf23, vf23, vf12 71
c->vfs[vf23].vf.mini(Mask::xyz, c->vf_src(vf23).vf, c->vf_src(vf12).vf.y());
}
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 call_addr = 0;
c->daddiu(sp, sp, -64); // daddiu sp, sp, -64
c->sd(ra, 0, sp); // sd ra, 0(sp)
c->sd(fp, 8, sp); // sd fp, 8(sp)
c->mov64(fp, t9); // or fp, t9, r0
c->sq(s4, 16, sp); // sq s4, 16(sp)
c->sq(s5, 32, sp); // sq s5, 32(sp)
c->sq(gp, 48, sp); // sq gp, 48(sp)
c->mov64(s5, a0); // or s5, a0, r0
c->mov64(gp, a1); // or gp, a1, r0
c->load_symbol(t9, cache.upload_vu0_program); // lw t9, upload-vu0-program(s7)
c->load_symbol(a0, cache.ocean_vu0_block); // lw a0, ocean-vu0-block(s7)
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a1, v1, 160); // daddiu a1, v1, 160
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->load_symbol(t9, cache.vu_lights_light_group); // lw t9, vu-lights<-light-group!(s7)
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a0, v1, 48); // daddiu a0, v1, 48
c->load_symbol(v1, cache.time_of_day_context); // lw v1, *time-of-day-context*(s7)
c->daddiu(a1, v1, 156); // daddiu a1, v1, 156
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
// daddiu s4, fp, L7 // daddiu s4, fp, L7 TODO
c->load_symbol(s4, cache.ocean_generate_verts_vector); // HACK
c->load_symbol(t9, cache.vector); // lw t9, vector*!(s7)
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a0, v1, 96); // daddiu a0, v1, 96
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a1, v1, 96); // daddiu a1, v1, 96
c->mov64(a2, s4); // or a2, s4, 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->load_symbol(t9, cache.vector); // lw t9, vector*!(s7)
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a0, v1, 112); // daddiu a0, v1, 112
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a1, v1, 112); // daddiu a1, v1, 112
c->mov64(a2, s4); // or a2, s4, 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->load_symbol(t9, cache.vector); // lw t9, vector*!(s7)
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a0, v1, 128); // daddiu a0, v1, 128
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a1, v1, 128); // daddiu a1, v1, 128
c->mov64(a2, s4); // or a2, s4, 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->load_symbol(t9, cache.vector); // lw t9, vector*!(s7)
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a0, v1, 144); // daddiu a0, v1, 144
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->daddiu(a1, v1, 144); // daddiu a1, v1, 144
c->mov64(a2, s4); // or a2, s4, 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
c->load_symbol(v1, cache.ocean_vu0_work); // lw v1, *ocean-vu0-work*(s7)
c->vmax_bc(DEST::xyzw, BC::w, vf1, vf0, vf0); // vmaxw.xyzw vf1, vf0, vf0
c->lqc2(vf12, 0, v1); // lqc2 vf12, 0(v1)
c->lqc2(vf5, 48, v1); // lqc2 vf5, 48(v1)
c->lqc2(vf6, 64, v1); // lqc2 vf6, 64(v1)
c->lqc2(vf7, 80, v1); // lqc2 vf7, 80(v1)
c->lqc2(vf8, 96, v1); // lqc2 vf8, 96(v1)
c->lqc2(vf9, 112, v1); // lqc2 vf9, 112(v1)
c->lqc2(vf10, 128, v1); // lqc2 vf10, 128(v1)
c->lqc2(vf11, 144, v1); // lqc2 vf11, 144(v1)
c->addiu(v1, r0, 31); // addiu v1, r0, 31
c->mov64(a0, gp); // or a0, gp, r0
c->daddiu(a1, gp, 128); // daddiu a1, gp, 128
block_1:
c->lqc2(vf2, 0, gp); // lqc2 vf2, 0(gp)
c->addiu(t2, r0, 6); // addiu t2, r0, 6
c->lqc2(vf3, 16, gp); // lqc2 vf3, 16(gp)
c->daddiu(t5, gp, 16); // daddiu t5, gp, 16
c->lqc2(vf4, 0, a1); // lqc2 vf4, 0(a1)
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
// Unknown instr: vcallms 0
vcallms0(c);
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t1, vf20); // qmfc2.i t1, vf20
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t0, vf21); // qmfc2.i t0, vf21
// nop // sll r0, r0, 0
c->mov128_gpr_vf(a3, vf22); // qmfc2.i a3, vf22
// nop // sll r0, r0, 0
c->mov128_gpr_vf(a2, vf23); // qmfc2.i a2, vf23
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t6, vf24); // qmfc2.i t6, vf24
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t7, vf25); // qmfc2.i t7, vf25
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t3, vf26); // qmfc2.i t3, vf26
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t4, vf27); // qmfc2.i t4, vf27
// nop // sll r0, r0, 0
c->lqc2(vf2, 0, t5); // lqc2 vf2, 0(t5)
// nop // sll r0, r0, 0
c->lqc2(vf3, 16, t5); // lqc2 vf3, 16(t5)
c->daddiu(gp, t5, 16); // daddiu gp, t5, 16
c->lqc2(vf4, 0, a1); // lqc2 vf4, 0(a1)
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
block_2:
// Unknown instr: vcallms 0
vcallms0(c);
// nop // sll r0, r0, 0
c->pextlw(t5, t7, t6); // pextlw t5, t7, t6
// nop // sll r0, r0, 0
c->pextuw(t6, t7, t6); // pextuw t6, t7, t6
// nop // sll r0, r0, 0
c->pextlw(t7, t4, t3); // pextlw t7, t4, t3
// nop // sll r0, r0, 0
c->pextuw(t4, t4, t3); // pextuw t4, t4, t3
// nop // sll r0, r0, 0
c->pcpyld(t3, t7, t5); // pcpyld t3, t7, t5
c->sq(t1, 0, s5); // sq t1, 0(s5)
c->pcpyud(t1, t5, t7); // pcpyud t1, t5, t7
c->sq(t0, 32, s5); // sq t0, 32(s5)
c->pcpyld(t0, t4, t6); // pcpyld t0, t4, t6
c->sq(a3, 64, s5); // sq a3, 64(s5)
c->pcpyud(a3, t6, t4); // pcpyud a3, t6, t4
c->sq(a2, 96, s5); // sq a2, 96(s5)
c->sq(t3, 16, s5); // sq t3, 16(s5)
// nop // sll r0, r0, 0
c->sq(t1, 48, s5); // sq t1, 48(s5)
// nop // sll r0, r0, 0
c->sq(t0, 80, s5); // sq t0, 80(s5)
// nop // sll r0, r0, 0
c->sq(a3, 112, s5); // sq a3, 112(s5)
c->daddiu(s5, s5, 128); // daddiu s5, s5, 128
c->mov128_gpr_vf(t1, vf20); // qmfc2.i t1, vf20
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t0, vf21); // qmfc2.i t0, vf21
// nop // sll r0, r0, 0
c->mov128_gpr_vf(a3, vf22); // qmfc2.i a3, vf22
// nop // sll r0, r0, 0
c->mov128_gpr_vf(a2, vf23); // qmfc2.i a2, vf23
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t6, vf24); // qmfc2.i t6, vf24
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t7, vf25); // qmfc2.i t7, vf25
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t3, vf26); // qmfc2.i t3, vf26
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t4, vf27); // qmfc2.i t4, vf27
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
c->lqc2(vf2, 0, gp); // lqc2 vf2, 0(gp)
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
c->lqc2(vf3, 16, gp); // lqc2 vf3, 16(gp)
c->daddiu(gp, gp, 16); // daddiu gp, gp, 16
bc = ((s64)c->sgpr64(t2)) > 0; // bgtz t2, L3
c->lqc2(vf4, -16, a1); // lqc2 vf4, -16(a1)
if (bc) {goto block_2;} // branch non-likely
c->lqc2(vf3, -128, gp); // lqc2 vf3, -128(gp)
// nop // sll r0, r0, 0
// Unknown instr: vcallms 0
vcallms0(c);
// nop // sll r0, r0, 0
c->pextlw(t2, t7, t6); // pextlw t2, t7, t6
// nop // sll r0, r0, 0
c->pextuw(t5, t7, t6); // pextuw t5, t7, t6
// nop // sll r0, r0, 0
c->pextlw(t6, t4, t3); // pextlw t6, t4, t3
// nop // sll r0, r0, 0
c->pextuw(t4, t4, t3); // pextuw t4, t4, t3
// nop // sll r0, r0, 0
c->pcpyld(t3, t6, t2); // pcpyld t3, t6, t2
c->sq(t1, 0, s5); // sq t1, 0(s5)
c->pcpyud(t1, t2, t6); // pcpyud t1, t2, t6
c->sq(t0, 32, s5); // sq t0, 32(s5)
c->pcpyld(t0, t4, t5); // pcpyld t0, t4, t5
c->sq(a3, 64, s5); // sq a3, 64(s5)
c->pcpyud(a3, t5, t4); // pcpyud a3, t5, t4
c->sq(a2, 96, s5); // sq a2, 96(s5)
c->sq(t3, 16, s5); // sq t3, 16(s5)
// nop // sll r0, r0, 0
c->sq(t1, 48, s5); // sq t1, 48(s5)
// nop // sll r0, r0, 0
c->sq(t0, 80, s5); // sq t0, 80(s5)
// nop // sll r0, r0, 0
c->sq(a3, 112, s5); // sq a3, 112(s5)
c->daddiu(a2, s5, 128); // daddiu a2, s5, 128
c->mov128_gpr_vf(t2, vf20); // qmfc2.i t2, vf20
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t1, vf21); // qmfc2.i t1, vf21
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t0, vf22); // qmfc2.i t0, vf22
// nop // sll r0, r0, 0
c->mov128_gpr_vf(a3, vf23); // qmfc2.i a3, vf23
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t4, vf24); // qmfc2.i t4, vf24
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t7, vf25); // qmfc2.i t7, vf25
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t5, vf26); // qmfc2.i t5, vf26
// nop // sll r0, r0, 0
c->mov128_gpr_vf(t6, vf27); // qmfc2.i t6, vf27
c->daddiu(v1, v1, -1); // daddiu v1, v1, -1
c->pextlw(t3, t7, t4); // pextlw t3, t7, t4
// nop // sll r0, r0, 0
c->pextuw(t4, t7, t4); // pextuw t4, t7, t4
// nop // sll r0, r0, 0
c->pextlw(t7, t6, t5); // pextlw t7, t6, t5
// nop // sll r0, r0, 0
c->pextuw(t6, t6, t5); // pextuw t6, t6, t5
// nop // sll r0, r0, 0
c->pcpyld(t5, t7, t3); // pcpyld t5, t7, t3
c->sq(t2, 0, a2); // sq t2, 0(a2)
c->pcpyud(t2, t3, t7); // pcpyud t2, t3, t7
c->sq(t1, 32, a2); // sq t1, 32(a2)
c->pcpyld(t1, t6, t4); // pcpyld t1, t6, t4
c->sq(t0, 64, a2); // sq t0, 64(a2)
c->pcpyud(t0, t4, t6); // pcpyud t0, t4, t6
c->sq(a3, 96, a2); // sq a3, 96(a2)
c->sq(t5, 16, a2); // sq t5, 16(a2)
// nop // sll r0, r0, 0
c->sq(t2, 48, a2); // sq t2, 48(a2)
// nop // sll r0, r0, 0
c->sq(t1, 80, a2); // sq t1, 80(a2)
// nop // sll r0, r0, 0
c->sq(t0, 112, a2); // sq t0, 112(a2)
c->daddiu(s5, a2, 128); // daddiu s5, a2, 128
bc = ((s64)c->sgpr64(v1)) > 0; // bgtz v1, L2
// nop // sll r0, r0, 0
if (bc) {goto block_1;} // branch non-likely
bc = c->sgpr64(v1) == 0; // beq v1, r0, L2
c->mov64(a1, a0); // or a1, a0, r0
if (bc) {goto block_1;} // branch non-likely
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
c->ld(ra, 0, sp); // ld ra, 0(sp)
c->ld(fp, 8, sp); // ld fp, 8(sp)
c->lq(gp, 48, sp); // lq gp, 48(sp)
c->lq(s5, 32, sp); // lq s5, 32(sp)
c->lq(s4, 16, sp); // lq s4, 16(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 64); // daddiu sp, sp, 64
goto end_of_function; // return
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
end_of_function:
return c->gprs[v0].du64[0];
}
void link() {
cache.ocean_vu0_work = intern_from_c("*ocean-vu0-work*").c();
cache.time_of_day_context = intern_from_c("*time-of-day-context*").c();
cache.ocean_vu0_block = intern_from_c("ocean-vu0-block").c();
cache.upload_vu0_program = intern_from_c("upload-vu0-program").c();
cache.vector = intern_from_c("vector*!").c();
cache.vu_lights_light_group = intern_from_c("vu-lights<-light-group!").c();
cache.ocean_generate_verts_vector = intern_from_c("*ocean-generate-verts-vector*").c();
gLinkedFunctionTable.reg("ocean-generate-verts", execute, 128);
}
} // namespace ocean_generate_verts
} // namespace Mips2C
+8 -2
View File
@@ -269,6 +269,12 @@ extern void link();
namespace draw_large_polygon_ocean {
extern void link();
}
namespace ocean_interp_wave {
extern void link();
}
namespace ocean_generate_verts {
extern void link();
}
LinkedFunctionTable gLinkedFunctionTable;
Rng gRng;
std::unordered_map<std::string, std::vector<void (*)()>> gMips2CLinkCallbacks = {
@@ -314,8 +320,8 @@ std::unordered_map<std::string, std::vector<void (*)()>> gMips2CLinkCallbacks =
{"ripple",
{ripple_execute_init::link, ripple_create_wave_table::link, ripple_apply_wave_table::link,
ripple_matrix_scale::link}},
{"ocean",
{init_ocean_far_regs::link, render_ocean_quad::link, draw_large_polygon_ocean::link}}};
{"ocean", {init_ocean_far_regs::link, render_ocean_quad::link, draw_large_polygon_ocean::link}},
{"ocean-vu0", {ocean_interp_wave::link, ocean_generate_verts::link}}};
void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) {
const auto& it = m_executes.insert({name, {exec, Ptr<u8>()}});
+1 -1
View File
@@ -1048,7 +1048,7 @@
(update-time-of-day *time-of-day-context*)
;; closest
(update-ocean)
;; (draw-ocean)
(draw-ocean)
(set! (-> *merc-global-array* count) (the-as uint 0))
(set! *merc-globals* (the-as merc-globals (-> *merc-global-array* globals)))
(set! (-> *shadow-queue* cur-run) (the-as uint 0))
+11 -8
View File
@@ -9,6 +9,7 @@
(define-extern ocean-get-height (function vector float))
(define-extern update-ocean (function none))
(define-extern draw-ocean (function none))
(define-extern draw-ocean-texture (function dma-buffer (inline-array vector) symbol none))
;; The "ocean" renderer is used to render the infinite water.
;; It doesn't draw the rivers in FJ or the water near the farmer.
@@ -233,7 +234,7 @@
(define *ocean-mid-off* #f)
(define *ocean-near-off* #f)
(define *ocean-heights* (the-as ocean-wave-info #f))
(define *ocean-verts* (the-as (pointer vector) #f))
(define *ocean-verts* (the-as (inline-array vector) #f))
(deftype ocean-vu0-work (structure)
((scales vector :inline :offset-assert 0)
@@ -248,13 +249,13 @@
)
(deftype ocean-texture-constants (structure)
((giftag qword :inline :offset-assert 0)
(buffers vector4w :inline :offset-assert 16)
(dests vector4w :inline :offset-assert 32)
(start vector :inline :offset-assert 48)
(offsets vector :inline :offset-assert 64)
(constants vector :inline :offset-assert 80)
(cam-nrm vector :inline :offset-assert 96)
((giftag gs-gif-tag :inline :offset-assert 0)
(buffers vector4w :inline :offset-assert 16)
(dests vector4w :inline :offset-assert 32)
(start vector :inline :offset-assert 48)
(offsets vector :inline :offset-assert 64)
(constants vector :inline :offset-assert 80)
(cam-nrm vector :inline :offset-assert 96)
)
:method-count-assert 9
:size-assert #x70
@@ -419,3 +420,5 @@
)
(define-extern *ocean-trans-corner-table* (inline-array vector4w-2))
(define-extern ocean-interp-wave (function ocean-wave-info uint none))
(define-extern ocean-generate-verts (function (inline-array vector) ocean-wave-info none))
+619
View File
@@ -5,3 +5,622 @@
;; name in dgo: ocean-texture
;; dgos: GAME, ENGINE
;; definition for symbol *ocean-texture-work*, type ocean-texture-work
(define *ocean-texture-work*
(new 'static 'ocean-texture-work
:sprite-tmpl
(new 'static 'dma-gif-packet
:dma-vif
(new 'static 'dma-packet
:dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt))
:vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1)
)
:gif0 (new 'static 'gif-tag64
:nloop #x1
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type sprite) :tme #x1 :fst #x1)
:nreg #x5
)
:gif1 (new 'static 'gif-tag-regs
:regs0 (gif-reg-id rgbaq)
:regs1 (gif-reg-id uv)
:regs2 (gif-reg-id xyz2)
:regs3 (gif-reg-id uv)
:regs4 (gif-reg-id xyz2)
)
)
:sprite-tmpl2
(new 'static 'dma-gif-packet
:dma-vif
(new 'static 'dma-packet
:dma (new 'static 'dma-tag :qwc #x4 :id (dma-tag-id cnt))
:vif1 (new 'static 'vif-tag :imm #x4 :cmd (vif-cmd direct) :msk #x1)
)
:gif0 (new 'static 'gif-tag64
:nloop #x1
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type sprite) :abe #x1)
:nreg #x3
)
:gif1 (new 'static 'gif-tag-regs :regs0 (gif-reg-id rgbaq) :regs1 (gif-reg-id xyz2) :regs2 (gif-reg-id xyz2))
)
:adgif-tmpl
(new 'static 'dma-gif-packet
:dma-vif
(new 'static 'dma-packet
:dma (new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt))
:vif1 (new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1)
)
:gif0 (new 'static 'gif-tag64 :nloop #x5 :eop #x1 :nreg #x1)
:gif1 (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d))
)
)
)
;; definition for symbol ocean-texture-vu1-block, type vu-function
(define ocean-texture-vu1-block (new 'static 'vu-function #|:length #x92 :qlength 73|#))
(defun ocean-texture-setup-constants ((arg0 ocean-texture-constants))
"Set the constant values used in Ocean Texture VU1 program."
(set! (-> arg0 giftag tag)
(new 'static 'gif-tag64
:nloop #x42
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1)
:nreg #x3
)
)
(set! (-> arg0 giftag regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyz2))
)
;; these are VU1 data addresses
(set-vector! (-> arg0 buffers) 384 583 384 583)
(set-vector! (-> arg0 dests) 782 881 782 881)
(set-vector! (-> arg0 start) 0.0 0.0 1048575.94 0.0)
(set-vector! (-> arg0 offsets) 4.0 8.0 12.0 16.0)
(set-vector! (-> arg0 constants) 0.5 0.5 0.0 0.0)
(set! (-> arg0 cam-nrm x) (- (-> *math-camera* inv-camera-rot vector 2 x)))
(set! (-> arg0 cam-nrm y) (- (-> *math-camera* inv-camera-rot vector 2 y)))
(set! (-> arg0 cam-nrm z) (- (-> *math-camera* inv-camera-rot vector 2 z)))
(set! (-> arg0 cam-nrm w) 0.0)
0
(none)
)
(defun ocean-texture-add-constants ((arg0 dma-buffer))
"Add DMA packet to upload ocean constants. The constants are stored in the DMA buffer."
(let* ((a1-0 7)
(v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a1-0))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a0-1) vif1)
(new 'static 'vif-tag :imm #x3d9 :cmd (vif-cmd unpack-v4-32) :num a1-0)
)
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(ocean-texture-setup-constants (the-as ocean-texture-constants (-> arg0 base)))
(let ((v0-1 (&+ (-> arg0 base) 112)))
(set! (-> arg0 base) v0-1)
v0-1
)
)
;; definition for function ocean-texture-add-envmap
;; Used lq/sq
(defun ocean-texture-add-envmap ((arg0 dma-buffer))
"Add DMA packet to set up the GS with the env map texture's ADGIF shader."
(let ((v1-0 (-> arg0 base)))
;; DMA template for ADGIF setup.
(set! (-> (the-as (pointer uint128) v1-0) 0) (-> *ocean-texture-work* adgif-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-0) 1) (-> *ocean-texture-work* adgif-tmpl quad 1))
(let ((s4-0 (&+ v1-0 32)))
;; this just stores the adgif directly in the DMA buffer
(adgif-shader<-texture-simple!
(the-as adgif-shader s4-0)
(lookup-texture-by-id (new 'static 'texture-id :index #x1 :page #x100))
)
)
)
(let ((v0-2 (&+ (-> arg0 base) 112)))
(set! (-> arg0 base) v0-2)
v0-2
)
)
;; definition for function ocean-texture-add-verts
(defun ocean-texture-add-verts ((arg0 dma-buffer) (arg1 (inline-array vector)))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma)
(new 'static 'dma-tag :qwc #xc0 :id (dma-tag-id ref) :addr (the-as int arg1))
)
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a0-1) vif1)
(new 'static 'vif-tag :imm #x8000 :num #xc0 :cmd (vif-cmd unpack-v4-32))
)
(let ((v0-0 (&+ (the-as pointer a0-1) 16)))
(set! (-> v1-0 base) v0-0)
v0-0
)
)
)
;; definition for function ocean-texture-add-verts-last
(defun ocean-texture-add-verts-last ((arg0 dma-buffer) (arg1 (inline-array vector)) (arg2 (inline-array vector)))
(let* ((v1-0 arg0)
(a3-0 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a3-0) dma)
(new 'static 'dma-tag :qwc #x80 :id (dma-tag-id ref) :addr (the-as int arg1))
)
(set! (-> (the-as dma-packet a3-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a3-0) vif1)
(new 'static 'vif-tag :imm #x8000 :num #x80 :cmd (vif-cmd unpack-v4-32))
)
(set! (-> v1-0 base) (&+ (the-as pointer a3-0) 16))
)
(let* ((v1-1 arg0)
(a0-1 (the-as object (-> v1-1 base)))
)
(set! (-> (the-as dma-packet a0-1) dma)
(new 'static 'dma-tag :qwc #x40 :id (dma-tag-id ref) :addr (the-as int arg2))
)
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a0-1) vif1)
(new 'static 'vif-tag :imm #x8080 :num #x40 :cmd (vif-cmd unpack-v4-32))
)
(let ((v0-0 (&+ (the-as pointer a0-1) 16)))
(set! (-> v1-1 base) v0-0)
v0-0
)
)
)
;; definition for function ocean-texture-add-call-start
;; INFO: Return type mismatch pointer vs none.
(defun ocean-texture-add-call-start ((arg0 dma-buffer))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1))
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(none)
)
;; definition for function ocean-texture-add-call-rest
;; INFO: Return type mismatch pointer vs none.
(defun ocean-texture-add-call-rest ((arg0 dma-buffer))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd mscalf) :msk #x1))
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(none)
)
;; definition for function ocean-texture-add-call-done
;; INFO: Return type mismatch pointer vs none.
(defun ocean-texture-add-call-done ((arg0 dma-buffer))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x4 :cmd (vif-cmd mscalf) :msk #x1))
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(none)
)
;; definition for function draw-ocean-texture
;; INFO: Return type mismatch int vs none.
;; Used lq/sq
(defun draw-ocean-texture ((arg0 dma-buffer) (arg1 (inline-array vector)) (arg2 symbol))
(local-vars (sv-16 (inline-array vector)) (sv-32 int) (sv-48 vector) (sv-64 (inline-array vector)))
(set! sv-64 arg1)
(let* ((s0-0 arg2)
(ocean-tex-page-0 *ocean-base-page*)
(ocean-tex-block-0 *ocean-base-block*)
(ocean-tex-page-1 (+ ocean-tex-page-0 8))
(ocean-tex-block-1 (* ocean-tex-page-1 32))
(ocean-tex-page-2 (+ ocean-tex-page-0 10))
(ocean-tex-block-2 (* ocean-tex-page-2 32))
)
(set-display-gs-state arg0 ocean-tex-page-0 128 128 0 0)
(dma-buffer-add-vu-function arg0 ocean-texture-vu1-block 1)
(let* ((v1-0 arg0)
(a0-3 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-3) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-3) vif0) (new 'static 'vif-tag :cmd (vif-cmd base)))
(set! (-> (the-as dma-packet a0-3) vif1) (new 'static 'vif-tag :imm #xc0 :cmd (vif-cmd offset)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-3) 16))
)
(ocean-texture-add-constants arg0)
(ocean-texture-add-envmap arg0)
(set! sv-16 sv-64)
(ocean-texture-add-verts arg0 sv-16)
(set! sv-48 (-> sv-16 192))
(ocean-texture-add-call-start arg0)
(set! sv-32 0)
(while (< sv-32 9)
(ocean-texture-add-verts arg0 (the-as (inline-array vector) sv-48))
(set! sv-48 (-> (the-as (inline-array vector) sv-48) 192))
(ocean-texture-add-call-rest arg0)
(set! sv-32 (+ sv-32 1))
)
(ocean-texture-add-verts-last arg0 (the-as (inline-array vector) sv-48) sv-64)
(ocean-texture-add-call-rest arg0)
(ocean-texture-add-call-done arg0)
; (when s0-0
; (set-display-gs-state arg0 ocean-tex-page-1 64 64 0 0)
; (let* ((v1-13 arg0)
; (a0-15 (the-as object (-> v1-13 base)))
; )
; (set! (-> (the-as dma-packet a0-15) dma) (new 'static 'dma-tag :qwc #x7 :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-15) vif0) (new 'static 'vif-tag))
; (set! (-> (the-as dma-packet a0-15) vif1) (new 'static 'vif-tag :imm #x7 :cmd (vif-cmd direct) :msk #x1))
; (set! (-> v1-13 base) (&+ (the-as pointer a0-15) 16))
; )
; (let* ((v1-14 arg0)
; (a0-17 (the-as object (-> v1-14 base)))
; )
; (set! (-> (the-as gs-gif-tag a0-17) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x6))
; (set! (-> (the-as gs-gif-tag a0-17) regs)
; (new 'static 'gif-tag-regs
; :regs0 (gif-reg-id a+d)
; :regs1 (gif-reg-id a+d)
; :regs2 (gif-reg-id a+d)
; :regs3 (gif-reg-id a+d)
; :regs4 (gif-reg-id a+d)
; :regs5 (gif-reg-id a+d)
; :regs6 (gif-reg-id a+d)
; :regs7 (gif-reg-id a+d)
; :regs8 (gif-reg-id a+d)
; :regs9 (gif-reg-id a+d)
; :regs10 (gif-reg-id a+d)
; :regs11 (gif-reg-id a+d)
; :regs12 (gif-reg-id a+d)
; :regs13 (gif-reg-id a+d)
; :regs14 (gif-reg-id a+d)
; :regs15 (gif-reg-id a+d)
; )
; )
; (set! (-> v1-14 base) (&+ (the-as pointer a0-17) 16))
; )
; (let* ((s1-1 arg0)
; (s0-1 (-> s1-1 base))
; )
; (set! (-> (the-as (pointer gs-test) s0-1) 0)
; (new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest always))
; )
; (set! (-> (the-as (pointer gs-reg64) s0-1) 1) (gs-reg64 test-1))
; (set! (-> (the-as (pointer gs-alpha) s0-1) 2) (new 'static 'gs-alpha :b #x1 :d #x1))
; (set! (-> (the-as (pointer gs-reg64) s0-1) 3) (gs-reg64 alpha-1))
; (set! (-> (the-as (pointer gs-tex0) s0-1) 4)
; (new 'static 'gs-tex0 :tbw #x2 :tcc #x1 :th (log2 128) :tw (log2 128) :tbp0 ocean-tex-block-0)
; )
; (set! (-> (the-as (pointer gs-reg64) s0-1) 5) (gs-reg64 tex0-1))
; (set! (-> (the-as (pointer gs-tex1) s0-1) 6) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1))
; (set! (-> (the-as (pointer gs-reg64) s0-1) 7) (gs-reg64 tex1-1))
; (set! (-> (the-as (pointer gs-clamp) s0-1) 8) (new 'static 'gs-clamp))
; (set! (-> (the-as (pointer gs-reg64) s0-1) 9) (gs-reg64 clamp-1))
; (set! (-> (the-as (pointer uint64) s0-1) 10) (the-as uint 0))
; (set! (-> (the-as (pointer gs-reg64) s0-1) 11) (gs-reg64 texflush))
; (set! (-> s1-1 base) (&+ s0-1 96))
; )
; (let ((v1-31 (-> arg0 base)))
; (set! (-> (the-as (pointer uint128) v1-31) 0) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
; (set! (-> (the-as (pointer uint128) v1-31) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
; (set-vector! (the-as vector4w (&+ v1-31 32)) 128 128 128 64)
; (set-vector! (the-as vector4w (&+ v1-31 48)) 0 0 0 0)
; (set-vector! (the-as vector4w (&+ v1-31 64)) 0 0 #xffffff 0)
; (set-vector! (the-as vector4w (&+ v1-31 80)) 2048 2048 0 0)
; (set-vector! (the-as vector4w (&+ v1-31 96)) 1024 1024 #xffffff 0)
; )
; (&+! (-> arg0 base) 112)
; (set-display-gs-state arg0 ocean-tex-page-2 64 32 0 0)
; (let* ((v1-35 arg0)
; (a0-35 (the-as object (-> v1-35 base)))
; )
; (set! (-> (the-as dma-packet a0-35) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-35) vif0) (new 'static 'vif-tag))
; (set! (-> (the-as dma-packet a0-35) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
; (set! (-> v1-35 base) (&+ (the-as pointer a0-35) 16))
; )
; (let* ((v1-36 arg0)
; (a0-37 (the-as object (-> v1-36 base)))
; )
; (set! (-> (the-as gs-gif-tag a0-37) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
; (set! (-> (the-as gs-gif-tag a0-37) regs)
; (new 'static 'gif-tag-regs
; :regs0 (gif-reg-id a+d)
; :regs1 (gif-reg-id a+d)
; :regs2 (gif-reg-id a+d)
; :regs3 (gif-reg-id a+d)
; :regs4 (gif-reg-id a+d)
; :regs5 (gif-reg-id a+d)
; :regs6 (gif-reg-id a+d)
; :regs7 (gif-reg-id a+d)
; :regs8 (gif-reg-id a+d)
; :regs9 (gif-reg-id a+d)
; :regs10 (gif-reg-id a+d)
; :regs11 (gif-reg-id a+d)
; :regs12 (gif-reg-id a+d)
; :regs13 (gif-reg-id a+d)
; :regs14 (gif-reg-id a+d)
; :regs15 (gif-reg-id a+d)
; )
; )
; (set! (-> v1-36 base) (&+ (the-as pointer a0-37) 16))
; )
; (let* ((s3-1 arg0)
; (s2-3 (-> s3-1 base))
; )
; (set! (-> (the-as (pointer gs-tex0) s2-3) 0)
; (new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 64) :tw (log2 64) :tbp0 ocean-tex-block-1)
; )
; (set! (-> (the-as (pointer gs-reg64) s2-3) 1) (gs-reg64 tex0-1))
; (set! (-> (the-as (pointer uint64) s2-3) 2) (the-as uint 0))
; (set! (-> (the-as (pointer gs-reg64) s2-3) 3) (gs-reg64 texflush))
; (set! (-> s3-1 base) (&+ s2-3 32))
; )
; (let ((v1-46 (-> arg0 base)))
; (set! (-> (the-as (pointer uint128) v1-46)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
; (set! (-> (the-as (pointer uint128) v1-46) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
; (set-vector! (the-as vector4w (&+ v1-46 32)) 128 128 128 0)
; (set-vector! (the-as vector4w (&+ v1-46 48)) 0 0 0 0)
; (set-vector! (the-as vector4w (&+ v1-46 64)) 0 0 #xffffff 0)
; (set-vector! (the-as vector4w (&+ v1-46 80)) 1024 1024 0 0)
; (set-vector! (the-as vector4w (&+ v1-46 96)) 512 512 #xffffff 0)
; )
; (&+! (-> arg0 base) 112)
; (let* ((v1-50 arg0)
; (a0-54 (the-as object (-> v1-50 base)))
; )
; (set! (-> (the-as dma-packet a0-54) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-54) vif0) (new 'static 'vif-tag))
; (set! (-> (the-as dma-packet a0-54) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
; (set! (-> v1-50 base) (&+ (the-as pointer a0-54) 16))
; )
; (let* ((v1-51 arg0)
; (a0-56 (the-as object (-> v1-51 base)))
; )
; (set! (-> (the-as gs-gif-tag a0-56) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
; (set! (-> (the-as gs-gif-tag a0-56) regs)
; (new 'static 'gif-tag-regs
; :regs0 (gif-reg-id a+d)
; :regs1 (gif-reg-id a+d)
; :regs2 (gif-reg-id a+d)
; :regs3 (gif-reg-id a+d)
; :regs4 (gif-reg-id a+d)
; :regs5 (gif-reg-id a+d)
; :regs6 (gif-reg-id a+d)
; :regs7 (gif-reg-id a+d)
; :regs8 (gif-reg-id a+d)
; :regs9 (gif-reg-id a+d)
; :regs10 (gif-reg-id a+d)
; :regs11 (gif-reg-id a+d)
; :regs12 (gif-reg-id a+d)
; :regs13 (gif-reg-id a+d)
; :regs14 (gif-reg-id a+d)
; :regs15 (gif-reg-id a+d)
; )
; )
; (set! (-> v1-51 base) (&+ (the-as pointer a0-56) 16))
; )
; (let* ((s4-3 arg0)
; (s3-2 (-> s4-3 base))
; )
; (set! (-> (the-as (pointer gs-tex0) s3-2) 0)
; (new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 32) :tw (log2 32) :tbp0 ocean-tex-block-2)
; )
; (set! (-> (the-as (pointer gs-reg64) s3-2) 1) (gs-reg64 tex0-1))
; (set! (-> (the-as (pointer uint64) s3-2) 2) (the-as uint 0))
; (set! (-> (the-as (pointer gs-reg64) s3-2) 3) (gs-reg64 texflush))
; (set! (-> s4-3 base) (&+ s3-2 32))
; )
; (let ((v1-61 (-> arg0 base)))
; (set! (-> (the-as (pointer uint128) v1-61)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
; (set! (-> (the-as (pointer uint128) v1-61) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
; (set-vector! (the-as vector4w (&+ v1-61 32)) 128 128 128 0)
; (set-vector! (the-as vector4w (&+ v1-61 48)) 0 0 0 0)
; (set-vector! (the-as vector4w (&+ v1-61 64)) 512 0 #xffffff 0)
; (set-vector! (the-as vector4w (&+ v1-61 80)) 512 512 0 0)
; (set-vector! (the-as vector4w (&+ v1-61 96)) 768 256 #xffffff 0)
; )
; (&+! (-> arg0 base) 112)
; (let* ((v1-65 arg0)
; (a0-73 (the-as object (-> v1-65 base)))
; )
; (set! (-> (the-as dma-packet a0-73) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-73) vif0) (new 'static 'vif-tag))
; (set! (-> (the-as dma-packet a0-73) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
; (set! (-> v1-65 base) (&+ (the-as pointer a0-73) 16))
; )
; (let* ((v1-66 arg0)
; (a0-75 (the-as object (-> v1-66 base)))
; )
; (set! (-> (the-as gs-gif-tag a0-75) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
; (set! (-> (the-as gs-gif-tag a0-75) regs)
; (new 'static 'gif-tag-regs
; :regs0 (gif-reg-id a+d)
; :regs1 (gif-reg-id a+d)
; :regs2 (gif-reg-id a+d)
; :regs3 (gif-reg-id a+d)
; :regs4 (gif-reg-id a+d)
; :regs5 (gif-reg-id a+d)
; :regs6 (gif-reg-id a+d)
; :regs7 (gif-reg-id a+d)
; :regs8 (gif-reg-id a+d)
; :regs9 (gif-reg-id a+d)
; :regs10 (gif-reg-id a+d)
; :regs11 (gif-reg-id a+d)
; :regs12 (gif-reg-id a+d)
; :regs13 (gif-reg-id a+d)
; :regs14 (gif-reg-id a+d)
; :regs15 (gif-reg-id a+d)
; )
; )
; (set! (-> v1-66 base) (&+ (the-as pointer a0-75) 16))
; )
; (let* ((s4-4 arg0)
; (s3-3 (-> s4-4 base))
; )
; (set! (-> (the-as (pointer gs-tex0) s3-3) 0)
; (new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 16) :tw (log2 16) :tbp0 (+ ocean-tex-block-2 16))
; )
; (set! (-> (the-as (pointer gs-reg64) s3-3) 1) (gs-reg64 tex0-1))
; (set! (-> (the-as (pointer uint64) s3-3) 2) (the-as uint 0))
; (set! (-> (the-as (pointer gs-reg64) s3-3) 3) (gs-reg64 texflush))
; (set! (-> s4-4 base) (&+ s3-3 32))
; )
; (let ((v1-76 (-> arg0 base)))
; (set! (-> (the-as (pointer uint128) v1-76)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
; (set! (-> (the-as (pointer uint128) v1-76) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
; (set-vector! (the-as vector4w (&+ v1-76 32)) 128 128 128 0)
; (set-vector! (the-as vector4w (&+ v1-76 48)) 0 0 0 0)
; (set-vector! (the-as vector4w (&+ v1-76 64)) 768 0 #xffffff 0)
; (set-vector! (the-as vector4w (&+ v1-76 80)) 256 256 0 0)
; (set-vector! (the-as vector4w (&+ v1-76 96)) 896 128 #xffffff 0)
; )
; (&+! (-> arg0 base) 112)
; (let* ((v1-80 arg0)
; (a0-93 (the-as object (-> v1-80 base)))
; )
; (set! (-> (the-as dma-packet a0-93) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-93) vif0) (new 'static 'vif-tag))
; (set! (-> (the-as dma-packet a0-93) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
; (set! (-> v1-80 base) (&+ (the-as pointer a0-93) 16))
; )
; (let* ((v1-81 arg0)
; (a0-95 (the-as object (-> v1-81 base)))
; )
; (set! (-> (the-as gs-gif-tag a0-95) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
; (set! (-> (the-as gs-gif-tag a0-95) regs)
; (new 'static 'gif-tag-regs
; :regs0 (gif-reg-id a+d)
; :regs1 (gif-reg-id a+d)
; :regs2 (gif-reg-id a+d)
; :regs3 (gif-reg-id a+d)
; :regs4 (gif-reg-id a+d)
; :regs5 (gif-reg-id a+d)
; :regs6 (gif-reg-id a+d)
; :regs7 (gif-reg-id a+d)
; :regs8 (gif-reg-id a+d)
; :regs9 (gif-reg-id a+d)
; :regs10 (gif-reg-id a+d)
; :regs11 (gif-reg-id a+d)
; :regs12 (gif-reg-id a+d)
; :regs13 (gif-reg-id a+d)
; :regs14 (gif-reg-id a+d)
; :regs15 (gif-reg-id a+d)
; )
; )
; (set! (-> v1-81 base) (&+ (the-as pointer a0-95) 16))
; )
; (let* ((s4-5 arg0)
; (s3-4 (-> s4-5 base))
; )
; (set! (-> (the-as (pointer gs-tex0) s3-4) 0)
; (new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 8) :tw (log2 8) :tbp0 (+ ocean-tex-block-2 20))
; )
; (set! (-> (the-as (pointer gs-reg64) s3-4) 1) (gs-reg64 tex0-1))
; (set! (-> (the-as (pointer uint64) s3-4) 2) (the-as uint 0))
; (set! (-> (the-as (pointer gs-reg64) s3-4) 3) (gs-reg64 texflush))
; (set! (-> s4-5 base) (&+ s3-4 32))
; )
; (let ((v1-91 (-> arg0 base)))
; (set! (-> (the-as (pointer uint128) v1-91)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
; (set! (-> (the-as (pointer uint128) v1-91) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
; (set-vector! (the-as vector4w (&+ v1-91 32)) 128 128 128 0)
; (set-vector! (the-as vector4w (&+ v1-91 48)) 0 0 0 0)
; (set-vector! (the-as vector4w (&+ v1-91 64)) 896 0 #xffffff 0)
; (set-vector! (the-as vector4w (&+ v1-91 80)) 256 256 0 0)
; (set-vector! (the-as vector4w (&+ v1-91 96)) 1024 128 #xffffff 0)
; )
; (&+! (-> arg0 base) 112)
; (let* ((v1-95 arg0)
; (a0-113 (the-as object (-> v1-95 base)))
; )
; (set! (-> (the-as dma-packet a0-113) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-113) vif0) (new 'static 'vif-tag))
; (set! (-> (the-as dma-packet a0-113) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
; (set! (-> v1-95 base) (&+ (the-as pointer a0-113) 16))
; )
; (let* ((v1-96 arg0)
; (a0-115 (the-as object (-> v1-96 base)))
; )
; (set! (-> (the-as gs-gif-tag a0-115) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
; (set! (-> (the-as gs-gif-tag a0-115) regs)
; (new 'static 'gif-tag-regs
; :regs0 (gif-reg-id a+d)
; :regs1 (gif-reg-id a+d)
; :regs2 (gif-reg-id a+d)
; :regs3 (gif-reg-id a+d)
; :regs4 (gif-reg-id a+d)
; :regs5 (gif-reg-id a+d)
; :regs6 (gif-reg-id a+d)
; :regs7 (gif-reg-id a+d)
; :regs8 (gif-reg-id a+d)
; :regs9 (gif-reg-id a+d)
; :regs10 (gif-reg-id a+d)
; :regs11 (gif-reg-id a+d)
; :regs12 (gif-reg-id a+d)
; :regs13 (gif-reg-id a+d)
; :regs14 (gif-reg-id a+d)
; :regs15 (gif-reg-id a+d)
; )
; )
; (set! (-> v1-96 base) (&+ (the-as pointer a0-115) 16))
; )
; (let* ((s4-6 arg0)
; (s3-5 (-> s4-6 base))
; )
; (set! (-> (the-as (pointer gs-tex0) s3-5) 0)
; (new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 4) :tw (log2 4) :tbp0 (+ ocean-tex-block-2 21))
; )
; (set! (-> (the-as (pointer gs-reg64) s3-5) 1) (gs-reg64 tex0-1))
; (set! (-> (the-as (pointer uint64) s3-5) 2) (the-as uint 0))
; (set! (-> (the-as (pointer gs-reg64) s3-5) 3) (gs-reg64 texflush))
; (set! (-> s4-6 base) (&+ s3-5 32))
; )
; (let ((v1-106 (-> arg0 base)))
; (set! (-> (the-as (pointer uint128) v1-106)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
; (set! (-> (the-as (pointer uint128) v1-106) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
; (set-vector! (the-as vector4w (&+ v1-106 32)) 128 128 128 0)
; (set-vector! (the-as vector4w (&+ v1-106 48)) 0 0 0 0)
; (set-vector! (the-as vector4w (&+ v1-106 64)) 768 128 #xffffff 0)
; (set-vector! (the-as vector4w (&+ v1-106 80)) 512 512 0 0)
; (set-vector! (the-as vector4w (&+ v1-106 96)) 896 256 #xffffff 0)
; )
; (&+! (-> arg0 base) 112)
; (let* ((v1-110 arg0)
; (a0-133 (the-as object (-> v1-110 base)))
; )
; (set! (-> (the-as dma-packet a0-133) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
; (set! (-> (the-as dma-packet a0-133) vif0) (new 'static 'vif-tag :cmd (vif-cmd flush) :msk #x1))
; (set! (-> (the-as dma-packet a0-133) vif1) (new 'static 'vif-tag))
; (set! (-> v1-110 base) (&+ (the-as pointer a0-133) 16))
; )
; )
)
; (reset-display-gs-state *display* arg0 *oddeven*)
0
(none)
)
+2 -2
View File
@@ -15,8 +15,8 @@
)
)
;; (def-mips2c ocean-interp-wave (function ocean-wave-info uint none)) ;; TODO mips2c
(def-mips2c ocean-interp-wave (function ocean-wave-info uint none)) ;; TODO mips2c
(define ocean-vu0-block (new 'static 'vu-function :length #x0 :qlength #x0))
;; (def-mips2c ocean-generate-verts (function (pointer vector) ocean-wave-info none)) ;; TODO mips2c
(def-mips2c ocean-generate-verts (function (inline-array vector) ocean-wave-info none)) ;; TODO mips2c
+20 -10
View File
@@ -600,17 +600,27 @@
)
)
;; PC Port hack
(define *ocean-generate-verts-vector* (new 'global 'vector))
(set-vector! *ocean-generate-verts-vector*
(the-as float #x42800000)
(the-as float #x43000000)
(the-as float #x43000000)
(the-as float #x43000000)
)
(defun draw-ocean ()
(set! *ocean-heights* #f)
(set! *ocean-verts* (the-as (pointer vector) #f))
; (let ((gp-0 (-> *display* frames (-> *display* on-screen) frame global-buf)))
; (set! *ocean-heights* (the-as ocean-wave-info (-> gp-0 base)))
; (ocean-interp-wave *ocean-heights* (the-as uint (-> *display* integral-frame-counter)))
; (&+! (-> gp-0 base) 4096)
; (set! *ocean-verts* (the-as (pointer vector) (-> gp-0 base)))
; (ocean-generate-verts *ocean-verts* *ocean-heights*)
; (&+! (-> gp-0 base) #x8000)
; )
(set! *ocean-verts* (the-as (inline-array vector) #f))
(let ((gp-0 (-> *display* frames (-> *display* on-screen) frame global-buf)))
(set! *ocean-heights* (the-as ocean-wave-info (-> gp-0 base)))
(ocean-interp-wave *ocean-heights* (the-as uint (-> *display* integral-frame-counter)))
(&+! (-> gp-0 base) 4096)
(set! *ocean-verts* (the-as (inline-array vector) (-> gp-0 base)))
(ocean-generate-verts *ocean-verts* *ocean-heights*)
(&+! (-> gp-0 base) #x8000)
)
(when *ocean-map*
(let* ((v1-12 (camera-pos))
(a0-6 *swamp-low-ocean-marker*)
@@ -635,7 +645,7 @@
(let* ((s5-0 (-> *display* frames (-> *display* on-screen) frame global-buf))
(gp-1 (-> s5-0 base))
)
;; (draw-ocean-texture s5-0 *ocean-verts* #t)
(draw-ocean-texture s5-0 *ocean-verts* #t)
(ocean-init-buffer s5-0)
(draw-ocean-far s5-0)
; (if (not *ocean-mid-off*)
+9 -9
View File
@@ -443,8 +443,8 @@
;; definition for symbol *ocean-heights*, type ocean-wave-info
(define *ocean-heights* (the-as ocean-wave-info #f))
;; definition for symbol *ocean-verts*, type (pointer vector)
(define *ocean-verts* (the-as (pointer vector) #f))
;; definition for symbol *ocean-verts*, type (inline-array vector)
(define *ocean-verts* (the-as (inline-array vector) #f))
;; definition of type ocean-vu0-work
(deftype ocean-vu0-work (structure)
@@ -472,13 +472,13 @@
;; definition of type ocean-texture-constants
(deftype ocean-texture-constants (structure)
((giftag qword :inline :offset-assert 0)
(buffers vector4w :inline :offset-assert 16)
(dests vector4w :inline :offset-assert 32)
(start vector :inline :offset-assert 48)
(offsets vector :inline :offset-assert 64)
(constants vector :inline :offset-assert 80)
(cam-nrm vector :inline :offset-assert 96)
((giftag gs-gif-tag :inline :offset-assert 0)
(buffers vector4w :inline :offset-assert 16)
(dests vector4w :inline :offset-assert 32)
(start vector :inline :offset-assert 48)
(offsets vector :inline :offset-assert 64)
(constants vector :inline :offset-assert 80)
(cam-nrm vector :inline :offset-assert 96)
)
:method-count-assert 9
:size-assert #x70
+603
View File
@@ -0,0 +1,603 @@
;;-*-Lisp-*-
(in-package goal)
;; definition for symbol *ocean-texture-work*, type ocean-texture-work
(define *ocean-texture-work* (new 'static 'ocean-texture-work
:sprite-tmpl
(new 'static 'dma-gif-packet
:dma-vif
(new 'static 'dma-packet
:dma
(new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt))
:vif1
(new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1)
)
:gif
(new 'static 'array uint64 2 #x508b400000008001 #x53531)
)
:sprite-tmpl2
(new 'static 'dma-gif-packet
:dma-vif
(new 'static 'dma-packet
:dma
(new 'static 'dma-tag :qwc #x4 :id (dma-tag-id cnt))
:vif1
(new 'static 'vif-tag :imm #x4 :cmd (vif-cmd direct) :msk #x1)
)
:gif
(new 'static 'array uint64 2 #x3023400000008001 #x551)
)
:adgif-tmpl
(new 'static 'dma-gif-packet
:dma-vif
(new 'static 'dma-packet
:dma
(new 'static 'dma-tag :qwc #x6 :id (dma-tag-id cnt))
:vif1
(new 'static 'vif-tag :imm #x6 :cmd (vif-cmd direct) :msk #x1)
)
:gif
(new 'static 'array uint64 2 #x1000000000008005 #xe)
)
)
)
;; definition for symbol ocean-texture-vu1-block, type vu-function
(define ocean-texture-vu1-block (new 'static 'vu-function :length #x92 :qlength 73))
;; definition for function ocean-texture-setup-constants
;; INFO: Return type mismatch int vs none.
(defun ocean-texture-setup-constants ((arg0 ocean-texture-constants))
(set! (-> arg0 giftag tag)
(new 'static 'gif-tag64
:nloop #x42
:eop #x1
:pre #x1
:prim (new 'static 'gs-prim :prim (gs-prim-type tri-strip) :iip #x1 :tme #x1)
:nreg #x3
)
)
(set! (-> arg0 giftag regs)
(new 'static 'gif-tag-regs :regs0 (gif-reg-id st) :regs1 (gif-reg-id rgbaq) :regs2 (gif-reg-id xyz2))
)
(set-vector! (-> arg0 buffers) 384 583 384 583)
(set-vector! (-> arg0 dests) 782 881 782 881)
(set-vector! (-> arg0 start) 0.0 0.0 1048575.94 0.0)
(set-vector! (-> arg0 offsets) 4.0 8.0 12.0 16.0)
(set-vector! (-> arg0 constants) 0.5 0.5 0.0 0.0)
(set! (-> arg0 cam-nrm x) (- (-> *math-camera* inv-camera-rot vector 2 x)))
(set! (-> arg0 cam-nrm y) (- (-> *math-camera* inv-camera-rot vector 2 y)))
(set! (-> arg0 cam-nrm z) (- (-> *math-camera* inv-camera-rot vector 2 z)))
(set! (-> arg0 cam-nrm w) 0.0)
0
(none)
)
;; definition for function ocean-texture-add-constants
(defun ocean-texture-add-constants ((arg0 dma-buffer))
(let* ((a1-0 7)
(v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc a1-0))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a0-1) vif1)
(new 'static 'vif-tag :imm #x3d9 :cmd (vif-cmd unpack-v4-32) :num a1-0)
)
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(ocean-texture-setup-constants (the-as ocean-texture-constants (-> arg0 base)))
(let ((v0-1 (&+ (-> arg0 base) 112)))
(set! (-> arg0 base) v0-1)
v0-1
)
)
;; definition for function ocean-texture-add-envmap
;; Used lq/sq
(defun ocean-texture-add-envmap ((arg0 dma-buffer))
(let ((v1-0 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-0) 0) (-> *ocean-texture-work* adgif-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-0) 1) (-> *ocean-texture-work* adgif-tmpl quad 1))
(let ((s4-0 (&+ v1-0 32)))
(adgif-shader<-texture-simple!
(the-as adgif-shader s4-0)
(lookup-texture-by-id (new 'static 'texture-id :index #x1 :page #x100))
)
)
)
(let ((v0-2 (&+ (-> arg0 base) 112)))
(set! (-> arg0 base) v0-2)
v0-2
)
)
;; definition for function ocean-texture-add-verts
(defun ocean-texture-add-verts ((arg0 dma-buffer) (arg1 (inline-array vector)))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma)
(new 'static 'dma-tag :qwc #xc0 :id (dma-tag-id ref) :addr (the-as int arg1))
)
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a0-1) vif1)
(new 'static 'vif-tag :imm #x8000 :num #xc0 :cmd (vif-cmd unpack-v4-32))
)
(let ((v0-0 (&+ (the-as pointer a0-1) 16)))
(set! (-> v1-0 base) v0-0)
v0-0
)
)
)
;; definition for function ocean-texture-add-verts-last
(defun ocean-texture-add-verts-last ((arg0 dma-buffer) (arg1 (inline-array vector)) (arg2 (inline-array vector)))
(let* ((v1-0 arg0)
(a3-0 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a3-0) dma)
(new 'static 'dma-tag :qwc #x80 :id (dma-tag-id ref) :addr (the-as int arg1))
)
(set! (-> (the-as dma-packet a3-0) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a3-0) vif1)
(new 'static 'vif-tag :imm #x8000 :num #x80 :cmd (vif-cmd unpack-v4-32))
)
(set! (-> v1-0 base) (&+ (the-as pointer a3-0) 16))
)
(let* ((v1-1 arg0)
(a0-1 (the-as object (-> v1-1 base)))
)
(set! (-> (the-as dma-packet a0-1) dma)
(new 'static 'dma-tag :qwc #x40 :id (dma-tag-id ref) :addr (the-as int arg2))
)
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x404 :cmd (vif-cmd stcycl)))
(set! (-> (the-as dma-packet a0-1) vif1)
(new 'static 'vif-tag :imm #x8080 :num #x40 :cmd (vif-cmd unpack-v4-32))
)
(let ((v0-0 (&+ (the-as pointer a0-1) 16)))
(set! (-> v1-1 base) v0-0)
v0-0
)
)
)
;; definition for function ocean-texture-add-call-start
;; INFO: Return type mismatch pointer vs none.
(defun ocean-texture-add-call-start ((arg0 dma-buffer))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :cmd (vif-cmd mscalf) :msk #x1))
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(none)
)
;; definition for function ocean-texture-add-call-rest
;; INFO: Return type mismatch pointer vs none.
(defun ocean-texture-add-call-rest ((arg0 dma-buffer))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd mscalf) :msk #x1))
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(none)
)
;; definition for function ocean-texture-add-call-done
;; INFO: Return type mismatch pointer vs none.
(defun ocean-texture-add-call-done ((arg0 dma-buffer))
(let* ((v1-0 arg0)
(a0-1 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag :imm #x4 :cmd (vif-cmd mscalf) :msk #x1))
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :cmd (vif-cmd stmod)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-1) 16))
)
(none)
)
;; definition for function draw-ocean-texture
;; INFO: Return type mismatch int vs none.
;; Used lq/sq
(defun draw-ocean-texture ((arg0 dma-buffer) (arg1 (inline-array vector)) (arg2 symbol))
(local-vars (sv-16 (inline-array vector)) (sv-32 int) (sv-48 vector) (sv-64 (inline-array vector)))
(set! sv-64 arg1)
(let* ((s0-0 arg2)
(a1-1 *ocean-base-page*)
(s2-0 *ocean-base-block*)
(s1-0 (+ a1-1 8))
(s4-0 (* s1-0 32))
(s3-0 (+ a1-1 10))
(s5-0 (* s3-0 32))
)
(set-display-gs-state arg0 a1-1 128 128 0 0)
(dma-buffer-add-vu-function arg0 ocean-texture-vu1-block 1)
(let* ((v1-0 arg0)
(a0-3 (the-as object (-> v1-0 base)))
)
(set! (-> (the-as dma-packet a0-3) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-3) vif0) (new 'static 'vif-tag :cmd (vif-cmd base)))
(set! (-> (the-as dma-packet a0-3) vif1) (new 'static 'vif-tag :imm #xc0 :cmd (vif-cmd offset)))
(set! (-> v1-0 base) (&+ (the-as pointer a0-3) 16))
)
(ocean-texture-add-constants arg0)
(ocean-texture-add-envmap arg0)
(set! sv-16 sv-64)
(ocean-texture-add-verts arg0 sv-16)
(set! sv-48 (-> sv-16 192))
(ocean-texture-add-call-start arg0)
(set! sv-32 0)
(while (< sv-32 9)
(ocean-texture-add-verts arg0 (the-as (inline-array vector) sv-48))
(set! sv-48 (-> (the-as (inline-array vector) sv-48) 192))
(ocean-texture-add-call-rest arg0)
(set! sv-32 (+ sv-32 1))
)
(ocean-texture-add-verts-last arg0 (the-as (inline-array vector) sv-48) sv-64)
(ocean-texture-add-call-rest arg0)
(ocean-texture-add-call-done arg0)
(when s0-0
(set-display-gs-state arg0 s1-0 64 64 0 0)
(let* ((v1-13 arg0)
(a0-15 (the-as object (-> v1-13 base)))
)
(set! (-> (the-as dma-packet a0-15) dma) (new 'static 'dma-tag :qwc #x7 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-15) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a0-15) vif1) (new 'static 'vif-tag :imm #x7 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-13 base) (&+ (the-as pointer a0-15) 16))
)
(let* ((v1-14 arg0)
(a0-17 (the-as object (-> v1-14 base)))
)
(set! (-> (the-as gs-gif-tag a0-17) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x6))
(set! (-> (the-as gs-gif-tag a0-17) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-14 base) (&+ (the-as pointer a0-17) 16))
)
(let* ((s1-1 arg0)
(s0-1 (-> s1-1 base))
)
(set! (-> (the-as (pointer gs-test) s0-1) 0)
(new 'static 'gs-test :ate #x1 :atst (gs-atest always) :zte #x1 :ztst (gs-ztest always))
)
(set! (-> (the-as (pointer gs-reg64) s0-1) 1) (gs-reg64 test-1))
(set! (-> (the-as (pointer gs-alpha) s0-1) 2) (new 'static 'gs-alpha :b #x1 :d #x1))
(set! (-> (the-as (pointer gs-reg64) s0-1) 3) (gs-reg64 alpha-1))
(set! (-> (the-as (pointer gs-tex0) s0-1) 4)
(new 'static 'gs-tex0 :tbw #x2 :tcc #x1 :th (log2 128) :tw (log2 128) :tbp0 s2-0)
)
(set! (-> (the-as (pointer gs-reg64) s0-1) 5) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer gs-tex1) s0-1) 6) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1))
(set! (-> (the-as (pointer gs-reg64) s0-1) 7) (gs-reg64 tex1-1))
(set! (-> (the-as (pointer gs-clamp) s0-1) 8) (new 'static 'gs-clamp))
(set! (-> (the-as (pointer gs-reg64) s0-1) 9) (gs-reg64 clamp-1))
(set! (-> (the-as (pointer uint64) s0-1) 10) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) s0-1) 11) (gs-reg64 texflush))
(set! (-> s1-1 base) (&+ s0-1 96))
)
(let ((v1-31 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-31) 0) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-31) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
(set-vector! (the-as vector4w (&+ v1-31 32)) 128 128 128 64)
(set-vector! (the-as vector4w (&+ v1-31 48)) 0 0 0 0)
(set-vector! (the-as vector4w (&+ v1-31 64)) 0 0 #xffffff 0)
(set-vector! (the-as vector4w (&+ v1-31 80)) 2048 2048 0 0)
(set-vector! (the-as vector4w (&+ v1-31 96)) 1024 1024 #xffffff 0)
)
(&+! (-> arg0 base) 112)
(set-display-gs-state arg0 s3-0 64 32 0 0)
(let* ((v1-35 arg0)
(a0-35 (the-as object (-> v1-35 base)))
)
(set! (-> (the-as dma-packet a0-35) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-35) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a0-35) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-35 base) (&+ (the-as pointer a0-35) 16))
)
(let* ((v1-36 arg0)
(a0-37 (the-as object (-> v1-36 base)))
)
(set! (-> (the-as gs-gif-tag a0-37) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-37) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-36 base) (&+ (the-as pointer a0-37) 16))
)
(let* ((s3-1 arg0)
(s2-3 (-> s3-1 base))
)
(set! (-> (the-as (pointer gs-tex0) s2-3) 0)
(new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 64) :tw (log2 64) :tbp0 s4-0)
)
(set! (-> (the-as (pointer gs-reg64) s2-3) 1) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer uint64) s2-3) 2) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) s2-3) 3) (gs-reg64 texflush))
(set! (-> s3-1 base) (&+ s2-3 32))
)
(let ((v1-46 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-46)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-46) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
(set-vector! (the-as vector4w (&+ v1-46 32)) 128 128 128 0)
(set-vector! (the-as vector4w (&+ v1-46 48)) 0 0 0 0)
(set-vector! (the-as vector4w (&+ v1-46 64)) 0 0 #xffffff 0)
(set-vector! (the-as vector4w (&+ v1-46 80)) 1024 1024 0 0)
(set-vector! (the-as vector4w (&+ v1-46 96)) 512 512 #xffffff 0)
)
(&+! (-> arg0 base) 112)
(let* ((v1-50 arg0)
(a0-54 (the-as object (-> v1-50 base)))
)
(set! (-> (the-as dma-packet a0-54) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-54) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a0-54) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-50 base) (&+ (the-as pointer a0-54) 16))
)
(let* ((v1-51 arg0)
(a0-56 (the-as object (-> v1-51 base)))
)
(set! (-> (the-as gs-gif-tag a0-56) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-56) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-51 base) (&+ (the-as pointer a0-56) 16))
)
(let* ((s4-3 arg0)
(s3-2 (-> s4-3 base))
)
(set! (-> (the-as (pointer gs-tex0) s3-2) 0)
(new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 32) :tw (log2 32) :tbp0 s5-0)
)
(set! (-> (the-as (pointer gs-reg64) s3-2) 1) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer uint64) s3-2) 2) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) s3-2) 3) (gs-reg64 texflush))
(set! (-> s4-3 base) (&+ s3-2 32))
)
(let ((v1-61 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-61)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-61) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
(set-vector! (the-as vector4w (&+ v1-61 32)) 128 128 128 0)
(set-vector! (the-as vector4w (&+ v1-61 48)) 0 0 0 0)
(set-vector! (the-as vector4w (&+ v1-61 64)) 512 0 #xffffff 0)
(set-vector! (the-as vector4w (&+ v1-61 80)) 512 512 0 0)
(set-vector! (the-as vector4w (&+ v1-61 96)) 768 256 #xffffff 0)
)
(&+! (-> arg0 base) 112)
(let* ((v1-65 arg0)
(a0-73 (the-as object (-> v1-65 base)))
)
(set! (-> (the-as dma-packet a0-73) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-73) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a0-73) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-65 base) (&+ (the-as pointer a0-73) 16))
)
(let* ((v1-66 arg0)
(a0-75 (the-as object (-> v1-66 base)))
)
(set! (-> (the-as gs-gif-tag a0-75) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-75) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-66 base) (&+ (the-as pointer a0-75) 16))
)
(let* ((s4-4 arg0)
(s3-3 (-> s4-4 base))
)
(set! (-> (the-as (pointer gs-tex0) s3-3) 0)
(new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 16) :tw (log2 16) :tbp0 (+ s5-0 16))
)
(set! (-> (the-as (pointer gs-reg64) s3-3) 1) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer uint64) s3-3) 2) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) s3-3) 3) (gs-reg64 texflush))
(set! (-> s4-4 base) (&+ s3-3 32))
)
(let ((v1-76 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-76)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-76) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
(set-vector! (the-as vector4w (&+ v1-76 32)) 128 128 128 0)
(set-vector! (the-as vector4w (&+ v1-76 48)) 0 0 0 0)
(set-vector! (the-as vector4w (&+ v1-76 64)) 768 0 #xffffff 0)
(set-vector! (the-as vector4w (&+ v1-76 80)) 256 256 0 0)
(set-vector! (the-as vector4w (&+ v1-76 96)) 896 128 #xffffff 0)
)
(&+! (-> arg0 base) 112)
(let* ((v1-80 arg0)
(a0-93 (the-as object (-> v1-80 base)))
)
(set! (-> (the-as dma-packet a0-93) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-93) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a0-93) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-80 base) (&+ (the-as pointer a0-93) 16))
)
(let* ((v1-81 arg0)
(a0-95 (the-as object (-> v1-81 base)))
)
(set! (-> (the-as gs-gif-tag a0-95) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-95) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-81 base) (&+ (the-as pointer a0-95) 16))
)
(let* ((s4-5 arg0)
(s3-4 (-> s4-5 base))
)
(set! (-> (the-as (pointer gs-tex0) s3-4) 0)
(new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 8) :tw (log2 8) :tbp0 (+ s5-0 20))
)
(set! (-> (the-as (pointer gs-reg64) s3-4) 1) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer uint64) s3-4) 2) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) s3-4) 3) (gs-reg64 texflush))
(set! (-> s4-5 base) (&+ s3-4 32))
)
(let ((v1-91 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-91)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-91) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
(set-vector! (the-as vector4w (&+ v1-91 32)) 128 128 128 0)
(set-vector! (the-as vector4w (&+ v1-91 48)) 0 0 0 0)
(set-vector! (the-as vector4w (&+ v1-91 64)) 896 0 #xffffff 0)
(set-vector! (the-as vector4w (&+ v1-91 80)) 256 256 0 0)
(set-vector! (the-as vector4w (&+ v1-91 96)) 1024 128 #xffffff 0)
)
(&+! (-> arg0 base) 112)
(let* ((v1-95 arg0)
(a0-113 (the-as object (-> v1-95 base)))
)
(set! (-> (the-as dma-packet a0-113) dma) (new 'static 'dma-tag :qwc #x3 :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-113) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet a0-113) vif1) (new 'static 'vif-tag :imm #x3 :cmd (vif-cmd direct) :msk #x1))
(set! (-> v1-95 base) (&+ (the-as pointer a0-113) 16))
)
(let* ((v1-96 arg0)
(a0-115 (the-as object (-> v1-96 base)))
)
(set! (-> (the-as gs-gif-tag a0-115) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x2))
(set! (-> (the-as gs-gif-tag a0-115) regs)
(new 'static 'gif-tag-regs
:regs0 (gif-reg-id a+d)
:regs1 (gif-reg-id a+d)
:regs2 (gif-reg-id a+d)
:regs3 (gif-reg-id a+d)
:regs4 (gif-reg-id a+d)
:regs5 (gif-reg-id a+d)
:regs6 (gif-reg-id a+d)
:regs7 (gif-reg-id a+d)
:regs8 (gif-reg-id a+d)
:regs9 (gif-reg-id a+d)
:regs10 (gif-reg-id a+d)
:regs11 (gif-reg-id a+d)
:regs12 (gif-reg-id a+d)
:regs13 (gif-reg-id a+d)
:regs14 (gif-reg-id a+d)
:regs15 (gif-reg-id a+d)
)
)
(set! (-> v1-96 base) (&+ (the-as pointer a0-115) 16))
)
(let* ((s4-6 arg0)
(s3-5 (-> s4-6 base))
)
(set! (-> (the-as (pointer gs-tex0) s3-5) 0)
(new 'static 'gs-tex0 :tbw #x1 :tcc #x1 :th (log2 4) :tw (log2 4) :tbp0 (+ s5-0 21))
)
(set! (-> (the-as (pointer gs-reg64) s3-5) 1) (gs-reg64 tex0-1))
(set! (-> (the-as (pointer uint64) s3-5) 2) (the-as uint 0))
(set! (-> (the-as (pointer gs-reg64) s3-5) 3) (gs-reg64 texflush))
(set! (-> s4-6 base) (&+ s3-5 32))
)
(let ((v1-106 (-> arg0 base)))
(set! (-> (the-as (pointer uint128) v1-106)) (-> *ocean-texture-work* sprite-tmpl dma-vif quad))
(set! (-> (the-as (pointer uint128) v1-106) 1) (-> *ocean-texture-work* sprite-tmpl quad 1))
(set-vector! (the-as vector4w (&+ v1-106 32)) 128 128 128 0)
(set-vector! (the-as vector4w (&+ v1-106 48)) 0 0 0 0)
(set-vector! (the-as vector4w (&+ v1-106 64)) 768 128 #xffffff 0)
(set-vector! (the-as vector4w (&+ v1-106 80)) 512 512 0 0)
(set-vector! (the-as vector4w (&+ v1-106 96)) 896 256 #xffffff 0)
)
(&+! (-> arg0 base) 112)
(let* ((v1-110 arg0)
(a0-133 (the-as object (-> v1-110 base)))
)
(set! (-> (the-as dma-packet a0-133) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
(set! (-> (the-as dma-packet a0-133) vif0) (new 'static 'vif-tag :cmd (vif-cmd flush) :msk #x1))
(set! (-> (the-as dma-packet a0-133) vif1) (new 'static 'vif-tag))
(set! (-> v1-110 base) (&+ (the-as pointer a0-133) 16))
)
)
)
(reset-display-gs-state *display* arg0 *oddeven*)
0
(none)
)