mirror of
https://github.com/open-goal/jak-project
synced 2026-07-07 14:13:45 -04:00
[gfx] remove the generic v1 renderer, cleanup (#1345)
* remove the generic v1 renderer, cleanup * rm the toggle too
This commit is contained in:
@@ -133,7 +133,7 @@ GameTextResult process_game_text(ObjectFileData& data, GameTextVersion version)
|
||||
}
|
||||
|
||||
std::string write_game_text(
|
||||
const Config& cfg,
|
||||
const Config& /*cfg*/,
|
||||
const std::unordered_map<int, std::unordered_map<int, std::string>>& data) {
|
||||
// first sort languages:
|
||||
std::vector<int> languages;
|
||||
|
||||
@@ -1222,7 +1222,7 @@ std::string CollideFragment::print(const PrintSettings& settings, int indent) co
|
||||
|
||||
void CollideFragMesh::read_from_file(TypedRef ref,
|
||||
const decompiler::DecompilerTypeSystem& dts,
|
||||
DrawStats* stats) {
|
||||
DrawStats* /*stats*/) {
|
||||
strip_data_len = read_plain_data_field<u16>(ref, "strip-data-len", dts);
|
||||
poly_count = read_plain_data_field<u16>(ref, "poly-count", dts);
|
||||
vertex_count = read_plain_data_field<u8>(ref, "vertex-count", dts);
|
||||
@@ -1235,7 +1235,7 @@ void CollideFragMesh::read_from_file(TypedRef ref,
|
||||
pat_array = deref_label(get_field_ref(ref, "pat-array", dts));
|
||||
}
|
||||
|
||||
std::string CollideFragMesh::print(const PrintSettings& settings, int indent) const {
|
||||
std::string CollideFragMesh::print(const PrintSettings& /*settings*/, int indent) const {
|
||||
std::string is(indent, ' ');
|
||||
std::string result;
|
||||
result += fmt::format("{}strip-data-len: {}\n", is, strip_data_len);
|
||||
|
||||
@@ -104,8 +104,6 @@ set(RUNTIME_SOURCE
|
||||
graphics/opengl_renderer/DirectRenderer.cpp
|
||||
graphics/opengl_renderer/DirectRenderer2.cpp
|
||||
graphics/opengl_renderer/EyeRenderer.cpp
|
||||
graphics/opengl_renderer/GenericProgram.cpp
|
||||
graphics/opengl_renderer/GenericRenderer.cpp
|
||||
graphics/opengl_renderer/dma_helpers.cpp
|
||||
graphics/opengl_renderer/Loader.cpp
|
||||
graphics/opengl_renderer/MercProgram.cpp
|
||||
|
||||
@@ -39,7 +39,6 @@ struct SharedRenderState {
|
||||
bool enable_merc_xgkick = true;
|
||||
bool enable_generic_xgkick = true;
|
||||
bool use_direct2 = true;
|
||||
bool use_generic2 = true;
|
||||
math::Vector<u8, 4> fog_color;
|
||||
float fog_intensity = 1.f;
|
||||
bool no_multidraw = false;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,318 +0,0 @@
|
||||
#include "GenericRenderer.h"
|
||||
#include "third-party/imgui/imgui.h"
|
||||
|
||||
GenericRenderer::GenericRenderer(const std::string& name, BucketId my_id)
|
||||
: BucketRenderer(name, my_id),
|
||||
m_direct2(30000, 60000, 1000, name, true),
|
||||
m_debug_gen2(name, my_id, 1500000, 10000, 3000, 800) {}
|
||||
|
||||
void GenericRenderer::init_shaders(ShaderLibrary& shaders) {
|
||||
m_direct2.init_shaders(shaders);
|
||||
m_debug_gen2.init_shaders(shaders);
|
||||
}
|
||||
|
||||
void GenericRenderer::render(DmaFollower& dma,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof) {
|
||||
if (render_state->use_generic2) {
|
||||
m_debug_gen2.render(dma, render_state, prof);
|
||||
return;
|
||||
}
|
||||
m_xgkick_idx = 0;
|
||||
m_skipped_tags = 0;
|
||||
m_debug.clear();
|
||||
|
||||
// if the first draw should have no blending, it sets ABE in PRIM, but not ALPHA.
|
||||
// the default ALPHA doesn't seem to be right. I don't know what's supposed to set it here.
|
||||
// although this is definitely a hack, it doesn't seem to cause problems when the first thing to
|
||||
// draw is transparent.
|
||||
// m_direct.hack_disable_blend();
|
||||
|
||||
// skip if disabled
|
||||
if (!m_enabled) {
|
||||
while (dma.current_tag_offset() != render_state->next_bucket) {
|
||||
dma.read_and_advance();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while (dma.current_tag_offset() != render_state->next_bucket) {
|
||||
auto data = dma.read_and_advance();
|
||||
m_debug += fmt::format("{} : {} {}\n", data.size_bytes, data.vifcode0().print(),
|
||||
data.vifcode1().print());
|
||||
auto v0 = data.vifcode0();
|
||||
auto v1 = data.vifcode1();
|
||||
if (data.size_bytes == 0) {
|
||||
m_debug += "Emtpy Tag\n";
|
||||
switch (v0.kind) {
|
||||
case VifCode::Kind::STCYCL:
|
||||
vu.stcycl = v0.immediate;
|
||||
break;
|
||||
case VifCode::Kind::NOP:
|
||||
break;
|
||||
default:
|
||||
ASSERT_MSG(false, fmt::format("unknown vifcode0 empty tag: {}", v0.print()));
|
||||
}
|
||||
switch (v1.kind) {
|
||||
case VifCode::Kind::STCYCL:
|
||||
vu.stcycl = v1.immediate;
|
||||
break;
|
||||
case VifCode::Kind::NOP:
|
||||
break;
|
||||
case VifCode::Kind::MSCAL:
|
||||
mscal(v1.immediate, render_state, prof);
|
||||
break;
|
||||
default:
|
||||
ASSERT_MSG(false, fmt::format("unknown vifcode1 empty tag: {}", v1.print()));
|
||||
}
|
||||
} else if (v0.kind == VifCode::Kind::FLUSHA && v1.kind == VifCode::Kind::DIRECT) {
|
||||
if (render_state->use_direct2) {
|
||||
m_direct2.render_gif_data(data.data, render_state, prof);
|
||||
}
|
||||
ASSERT(v1.immediate == data.size_bytes / 16);
|
||||
} else if (v0.kind == VifCode::Kind::NOP && v1.kind == VifCode::Kind::DIRECT) {
|
||||
if (render_state->use_direct2) {
|
||||
m_direct2.render_gif_data(data.data, render_state, prof);
|
||||
}
|
||||
ASSERT(v1.immediate == data.size_bytes / 16);
|
||||
} else if (v0.kind == VifCode::Kind::STCYCL && v1.kind == VifCode::Kind::UNPACK_V4_32) {
|
||||
vu.stcycl = v0.immediate;
|
||||
u32 bytes_used = unpack32_4(VifCodeUnpack(v1), data.data, v1.num);
|
||||
if (bytes_used < data.size_bytes) {
|
||||
handle_dma_stream(data.data + bytes_used, data.size_bytes - bytes_used, render_state, prof);
|
||||
} else if (bytes_used > data.size_bytes) {
|
||||
ASSERT(false);
|
||||
}
|
||||
} else if (v0.kind == VifCode::Kind::MSCALF && v1.kind == VifCode::Kind::STMOD) {
|
||||
mscal(v0.immediate, render_state, prof);
|
||||
ASSERT(v1.immediate == 0);
|
||||
|
||||
u32 data_offset = 0;
|
||||
u32 base_vifcode_data;
|
||||
memcpy(&base_vifcode_data, data.data + data_offset, 4);
|
||||
VifCode base_vc(base_vifcode_data);
|
||||
ASSERT(base_vc.immediate == 0);
|
||||
data_offset += 4;
|
||||
|
||||
u32 offset_vifcode_data;
|
||||
memcpy(&offset_vifcode_data, data.data + data_offset, 4);
|
||||
VifCode offset_vc(offset_vifcode_data);
|
||||
ASSERT(offset_vc.immediate == 0);
|
||||
data_offset += 4;
|
||||
|
||||
for (int i = 0; i < 1; i++) {
|
||||
u32 nop_vifcode_data;
|
||||
memcpy(&nop_vifcode_data, data.data + data_offset, 4);
|
||||
VifCode next_vc(nop_vifcode_data);
|
||||
ASSERT(next_vc.kind == VifCode::Kind::NOP);
|
||||
data_offset += 4;
|
||||
}
|
||||
|
||||
u32 strow_vifcode_data;
|
||||
memcpy(&strow_vifcode_data, data.data + data_offset, 4);
|
||||
VifCode strow_vc(strow_vifcode_data);
|
||||
data_offset += 4;
|
||||
ASSERT(strow_vc.kind == VifCode::Kind::STROW);
|
||||
|
||||
memcpy(vu.row, data.data + data_offset, 16);
|
||||
data_offset += 16;
|
||||
|
||||
ASSERT(data_offset == 32);
|
||||
ASSERT(data_offset == data.size_bytes);
|
||||
} else if (v0.kind == VifCode::Kind::NOP && v1.kind == VifCode::Kind::UNPACK_V3_32) {
|
||||
u32 bytes_used = unpack32_3(VifCodeUnpack(v1), data.data, v1.num);
|
||||
if (bytes_used < data.size_bytes) {
|
||||
handle_dma_stream(data.data + bytes_used, data.size_bytes - bytes_used, render_state, prof);
|
||||
} else if (bytes_used > data.size_bytes) {
|
||||
ASSERT(false);
|
||||
}
|
||||
} else {
|
||||
ASSERT_MSG(false,
|
||||
fmt::format("Generic encountered unknown DMA. Size bytes: {}. VIF0: {}. VIF1: {}",
|
||||
data.size_bytes, data.vifcode0().print(), data.vifcode1().print()));
|
||||
}
|
||||
m_skipped_tags++;
|
||||
}
|
||||
if (render_state->use_direct2) {
|
||||
m_direct2.flush_pending(render_state, prof);
|
||||
}
|
||||
}
|
||||
|
||||
void GenericRenderer::handle_dma_stream(const u8* data,
|
||||
u32 bytes,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof) {
|
||||
while (bytes) {
|
||||
u32 tag_data;
|
||||
memcpy(&tag_data, data, 4);
|
||||
bytes -= 4;
|
||||
data += 4;
|
||||
VifCode vc(tag_data);
|
||||
switch (vc.kind) {
|
||||
case VifCode::Kind::NOP:
|
||||
break;
|
||||
case VifCode::Kind::STCYCL:
|
||||
vu.stcycl = vc.immediate;
|
||||
break;
|
||||
case VifCode::Kind::UNPACK_V3_32: {
|
||||
u32 bytes_transferred = unpack32_3(VifCodeUnpack(vc), data, vc.num);
|
||||
bytes -= bytes_transferred;
|
||||
data += bytes_transferred;
|
||||
} break;
|
||||
case VifCode::Kind::UNPACK_V4_8: {
|
||||
u32 bytes_transferred = unpack8_4(VifCodeUnpack(vc), data, vc.num);
|
||||
bytes -= bytes_transferred;
|
||||
data += bytes_transferred;
|
||||
} break;
|
||||
case VifCode::Kind::UNPACK_V2_16: {
|
||||
u32 bytes_transferred = unpack16_2(VifCodeUnpack(vc), data, vc.num);
|
||||
bytes -= bytes_transferred;
|
||||
data += bytes_transferred;
|
||||
} break;
|
||||
case VifCode::Kind::UNPACK_V4_32: {
|
||||
u32 bytes_transferred = unpack32_4(VifCodeUnpack(vc), data, vc.num);
|
||||
bytes -= bytes_transferred;
|
||||
data += bytes_transferred;
|
||||
} break;
|
||||
case VifCode::Kind::MSCAL:
|
||||
mscal(vc.immediate, render_state, prof);
|
||||
break;
|
||||
default:
|
||||
ASSERT_MSG(false, fmt::format("Generic encountered unknown DMA in handle_dma_stream. Bytes "
|
||||
"remaining: {}. VIF: {}",
|
||||
bytes, vc.print()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GenericRenderer::draw_debug_window() {
|
||||
ImGui::Text("Skipped %d tags", m_skipped_tags);
|
||||
ImGui::InputInt("kick min", &m_min_xgkick);
|
||||
ImGui::InputInt("kick max", &m_max_xgkick);
|
||||
ImGui::Text("Debug:\n%s\n", m_debug.c_str());
|
||||
if (ImGui::TreeNode("Gen2")) {
|
||||
m_debug_gen2.draw_debug_window();
|
||||
ImGui::TreePop();
|
||||
}
|
||||
}
|
||||
|
||||
u32 GenericRenderer::unpack32_4(const VifCodeUnpack& up, const u8* data, u32 imm) {
|
||||
ASSERT(vu.stcycl == 0x404);
|
||||
ASSERT(!up.is_unsigned);
|
||||
u32 addr = up.addr_qw;
|
||||
ASSERT(imm != 0);
|
||||
// ASSERT(!m_vif.stmod);
|
||||
ASSERT(!up.use_tops_flag);
|
||||
// if (up.use_tops_flag) {
|
||||
// addr += xitop();
|
||||
// }
|
||||
|
||||
u32 start_in_buff = (addr)*16;
|
||||
u32 end_in_buff = start_in_buff + imm * 16;
|
||||
ASSERT(start_in_buff < sizeof(m_buffer.data));
|
||||
ASSERT(end_in_buff <= sizeof(m_buffer.data));
|
||||
memcpy(m_buffer.data + start_in_buff, data, imm * 16);
|
||||
|
||||
// fmt::print("---------------------------------unpack32_4: {} to {}\n", addr, addr + imm);
|
||||
return imm * 16;
|
||||
}
|
||||
|
||||
u32 GenericRenderer::unpack32_3(const VifCodeUnpack& up, const u8* data, u32 imm) {
|
||||
u32 bytes_read = 0;
|
||||
ASSERT(!up.use_tops_flag);
|
||||
ASSERT(!up.is_unsigned);
|
||||
ASSERT(vu.stcycl == 0x103); // w = 1, c = 3
|
||||
ASSERT(imm != 0);
|
||||
|
||||
for (u32 i = 0; i < imm; i++) {
|
||||
u32 xyzw[4];
|
||||
memcpy(xyzw, data + bytes_read, 12);
|
||||
bytes_read += 12;
|
||||
xyzw[3] = 0xbeef;
|
||||
|
||||
// check for garbage going into GENERIC VU1 code.
|
||||
float f[3];
|
||||
memcpy(f, xyzw, 12);
|
||||
// if (std::abs(f[0]) > 100000) {
|
||||
// fmt::print("VERY SUSPICIOUS VERTEX: {} 0x{:x} at 0x{:x}\n", f[0], xyzw[0],
|
||||
// (data + bytes_read) - g_ee_main_mem);
|
||||
// }
|
||||
|
||||
// fmt::print("vtx: {} {} {}\n", f[0], f[1], f[2]);
|
||||
u32 total_addr = 16 * (up.addr_qw + 3 * i);
|
||||
ASSERT(total_addr + 16 <= sizeof(m_buffer.data));
|
||||
memcpy(m_buffer.data + total_addr, xyzw, 16);
|
||||
}
|
||||
// fmt::print("---------------------------------unpack32_3: {} to {} imm {}\n", up.addr_qw,
|
||||
// (up.addr_qw + 3 * imm), imm);
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
u32 GenericRenderer::unpack8_4(const VifCodeUnpack& up, const u8* data, u32 imm) {
|
||||
u32 bytes_read = 0;
|
||||
ASSERT(!up.use_tops_flag);
|
||||
ASSERT(up.is_unsigned);
|
||||
ASSERT(vu.stcycl == 0x103); // w = 1, c = 3
|
||||
ASSERT(imm != 0);
|
||||
for (u32 i = 0; i < imm; i++) {
|
||||
u32 xyzw[4] = {data[0], data[1], data[2], data[3]};
|
||||
bytes_read += 4;
|
||||
data += 4;
|
||||
u32 total_addr = 16 * (up.addr_qw + 3 * i);
|
||||
ASSERT(total_addr + 16 <= sizeof(m_buffer.data));
|
||||
memcpy(m_buffer.data + total_addr, xyzw, 16);
|
||||
}
|
||||
// fmt::print("---------------------------------unpack8_4: {} to {} imm {}\n", up.addr_qw,
|
||||
// (up.addr_qw + 3 * imm), imm);
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
u32 GenericRenderer::unpack16_2(const VifCodeUnpack& up, const u8* data, u32 imm) {
|
||||
u32 bytes_read = 0;
|
||||
ASSERT(!up.use_tops_flag);
|
||||
ASSERT(!up.is_unsigned);
|
||||
ASSERT(vu.stcycl == 0x103); // w = 1, c = 3
|
||||
ASSERT(imm != 0);
|
||||
for (u32 i = 0; i < imm; i++) {
|
||||
s32 xyzw[4];
|
||||
s16 x, y;
|
||||
memcpy(&x, data + bytes_read, 2);
|
||||
memcpy(&y, data + bytes_read + 2, 2);
|
||||
bytes_read += 4;
|
||||
xyzw[0] = x;
|
||||
xyzw[1] = y;
|
||||
xyzw[2] = 0;
|
||||
xyzw[3] = 0;
|
||||
|
||||
u32 total_addr = 16 * (up.addr_qw + 3 * i);
|
||||
ASSERT(total_addr + 16 <= sizeof(m_buffer.data));
|
||||
memcpy(m_buffer.data + total_addr, xyzw, 16);
|
||||
}
|
||||
// fmt::print("---------------------------------unpack16_2: {} to {} imm {}\n", up.addr_qw,
|
||||
// (up.addr_qw + 3 * imm), imm);
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
void GenericRenderer::mscal(int imm, SharedRenderState* render_state, ScopedProfilerNode& prof) {
|
||||
m_debug += fmt::format("mscal: {}\n", imm);
|
||||
switch (imm) {
|
||||
case 0:
|
||||
mscal0();
|
||||
break;
|
||||
default:
|
||||
mscal_dispatch(imm, render_state, prof);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GenericRenderer::xgkick(u16 addr, SharedRenderState* render_state, ScopedProfilerNode& prof) {
|
||||
if (render_state->enable_generic_xgkick && m_xgkick_idx >= m_min_xgkick &&
|
||||
m_xgkick_idx < m_max_xgkick) {
|
||||
if (!render_state->use_generic2) {
|
||||
if (render_state->use_direct2) {
|
||||
m_direct2.render_gif_data(m_buffer.data + (16 * addr), render_state, prof);
|
||||
}
|
||||
}
|
||||
}
|
||||
m_xgkick_idx++;
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "game/graphics/opengl_renderer/BucketRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/DirectRenderer2.h"
|
||||
#include "game/graphics/opengl_renderer/foreground/Generic2.h"
|
||||
#include "game/common/vu.h"
|
||||
|
||||
class GenericRenderer : public BucketRenderer {
|
||||
public:
|
||||
GenericRenderer(const std::string& name, BucketId my_id);
|
||||
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
|
||||
void draw_debug_window() override;
|
||||
void init_shaders(ShaderLibrary& shaders) override;
|
||||
|
||||
private:
|
||||
u32 unpack32_4(const VifCodeUnpack& up, const u8* data, u32 imm);
|
||||
u32 unpack32_3(const VifCodeUnpack& up, const u8* data, u32 imm);
|
||||
u32 unpack8_4(const VifCodeUnpack& up, const u8* data, u32 imm);
|
||||
u32 unpack16_2(const VifCodeUnpack& up, const u8* data, u32 imm);
|
||||
|
||||
void mscal(int imm, SharedRenderState* render_state, ScopedProfilerNode& prof);
|
||||
void mscal0();
|
||||
void mscal_dispatch(int imm, SharedRenderState* render_state, ScopedProfilerNode& prof);
|
||||
void mscal_noclip_nopipe(SharedRenderState* render_state, ScopedProfilerNode& prof);
|
||||
void handle_dma_stream(const u8* data,
|
||||
u32 bytes,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof);
|
||||
void lq_buffer(Mask mask, Vf& dest, u16 addr);
|
||||
void isw_buffer(Mask mask, u16 val, u16 addr);
|
||||
void ilw_buffer(Mask mask, u16& dest, u16 addr);
|
||||
void xgkick(u16 addr, SharedRenderState* render_state, ScopedProfilerNode& prof);
|
||||
|
||||
void sq_buffer(Mask mask, const Vf& data, u32 qw) {
|
||||
ASSERT(qw * 16 < sizeof(m_buffer.data));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if ((u64)mask & (1 << i)) {
|
||||
memcpy(m_buffer.data + qw * 16 + i * 4, data.data + i, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int m_skipped_tags = 0;
|
||||
DirectRenderer2 m_direct2;
|
||||
Generic2 m_debug_gen2;
|
||||
std::string m_debug;
|
||||
|
||||
struct Vu {
|
||||
u32 row[4];
|
||||
u32 stcycl = 0;
|
||||
Vf vf03, vf18, vf19, vf20, vf21, vf22, vf23, vf24, vf25, vf26, vf27, vf28, vf29, vf30, vf31;
|
||||
const Vf vf00;
|
||||
u16 vi01, vi02, vi03, vi04, vi05, vi06, vi07, vi09, vi08, vi11, vi12, vi13, vi10, vi14, vi15;
|
||||
float I, P, Q;
|
||||
|
||||
Accumulator acc;
|
||||
const u16 vi00 = 0;
|
||||
Vu() : vf00(0, 0, 0, 1) {}
|
||||
} vu;
|
||||
|
||||
struct {
|
||||
Vf fog;
|
||||
Vf adgif_tmpl;
|
||||
Vf hvdf_off;
|
||||
Vf hmge_scale;
|
||||
Vf guard;
|
||||
|
||||
Vf mat0, mat1, mat2, mat3;
|
||||
|
||||
Vf vtx_p0, vtx_p1, vtx_p2, vtx_p3;
|
||||
|
||||
Vf vtx_load0, vtx_load1;
|
||||
} gen;
|
||||
|
||||
struct alignas(16) BufferMemory {
|
||||
u8 data[1024 * 16];
|
||||
} m_buffer;
|
||||
|
||||
int m_xgkick_idx = 0;
|
||||
int m_min_xgkick = 0;
|
||||
int m_max_xgkick = 1000000;
|
||||
};
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "game/graphics/opengl_renderer/MercRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/EyeRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/ShadowRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/GenericRenderer.h"
|
||||
#include "game/graphics/opengl_renderer/foreground/Generic2.h"
|
||||
#include "game/graphics/opengl_renderer/ocean/OceanMidAndFar.h"
|
||||
#include "game/graphics/opengl_renderer/ocean/OceanNear.h"
|
||||
|
||||
@@ -109,8 +109,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
init_bucket_renderer<MercRenderer>("l0-tfrag-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_TFRAG_TEX_LEVEL0);
|
||||
// 11 : GMERC_TFRAG_TEX_LEVEL0
|
||||
init_bucket_renderer<GenericRenderer>("l0-tfrag-gmerc", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GMERC_TFRAG_TEX_LEVEL0);
|
||||
init_bucket_renderer<Generic2>("l0-tfrag-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_TFRAG_TEX_LEVEL0);
|
||||
|
||||
//-----------------------
|
||||
// LEVEL 1 tfrag texture
|
||||
@@ -129,8 +129,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
init_bucket_renderer<MercRenderer>("l1-tfrag-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_TFRAG_TEX_LEVEL1);
|
||||
// 18 : GMERC_TFRAG_TEX_LEVEL1
|
||||
init_bucket_renderer<GenericRenderer>("l1-tfrag-gmerc", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GMERC_TFRAG_TEX_LEVEL1);
|
||||
init_bucket_renderer<Generic2>("l1-tfrag-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_TFRAG_TEX_LEVEL1);
|
||||
|
||||
//-----------------------
|
||||
// LEVEL 0 shrub texture
|
||||
@@ -157,8 +157,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
// 28 : SHRUB_BILLBOARD_LEVEL1
|
||||
// 29 : SHRUB_TRANS_LEVEL1
|
||||
// 30 : SHRUB_GENERIC_LEVEL1
|
||||
init_bucket_renderer<GenericRenderer>("mystery-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::SHRUB_GENERIC_LEVEL1);
|
||||
init_bucket_renderer<Generic2>("mystery-generic", BucketCategory::GENERIC,
|
||||
BucketId::SHRUB_GENERIC_LEVEL1);
|
||||
|
||||
//-----------------------
|
||||
// LEVEL 0 alpha texture
|
||||
@@ -197,8 +197,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
init_bucket_renderer<MercRenderer>("common-alpha-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_AFTER_ALPHA);
|
||||
|
||||
init_bucket_renderer<GenericRenderer>("common-alpha-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GENERIC_ALPHA); // 46
|
||||
init_bucket_renderer<Generic2>("common-alpha-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_ALPHA); // 46
|
||||
init_bucket_renderer<ShadowRenderer>("shadow", BucketCategory::OTHER, BucketId::SHADOW); // 47
|
||||
|
||||
//-----------------------
|
||||
@@ -208,8 +208,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
BucketId::PRIS_TEX_LEVEL0); // 48
|
||||
init_bucket_renderer<MercRenderer>("l0-pris-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_PRIS_LEVEL0); // 49
|
||||
init_bucket_renderer<GenericRenderer>("l0-pris-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GENERIC_PRIS_LEVEL0); // 50
|
||||
init_bucket_renderer<Generic2>("l0-pris-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_PRIS_LEVEL0); // 50
|
||||
|
||||
//-----------------------
|
||||
// LEVEL 1 pris texture
|
||||
@@ -218,16 +218,16 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
BucketId::PRIS_TEX_LEVEL1); // 51
|
||||
init_bucket_renderer<MercRenderer>("l1-pris-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_PRIS_LEVEL1); // 52
|
||||
init_bucket_renderer<GenericRenderer>("l1-pris-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GENERIC_PRIS_LEVEL1); // 53
|
||||
init_bucket_renderer<Generic2>("l1-pris-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_PRIS_LEVEL1); // 53
|
||||
|
||||
// other renderers may output to the eye renderer
|
||||
m_render_state.eye_renderer = init_bucket_renderer<EyeRenderer>(
|
||||
"common-pris-eyes", BucketCategory::OTHER, BucketId::MERC_EYES_AFTER_PRIS); // 54
|
||||
init_bucket_renderer<MercRenderer>("common-pris-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_AFTER_PRIS); // 55
|
||||
init_bucket_renderer<GenericRenderer>("common-pris-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GENERIC_PRIS); // 56
|
||||
init_bucket_renderer<Generic2>("common-pris-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_PRIS); // 56
|
||||
|
||||
//-----------------------
|
||||
// LEVEL 0 water texture
|
||||
@@ -236,8 +236,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
BucketId::WATER_TEX_LEVEL0); // 57
|
||||
init_bucket_renderer<MercRenderer>("l0-water-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_WATER_LEVEL0); // 58
|
||||
init_bucket_renderer<GenericRenderer>("l0-water-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GENERIC_WATER_LEVEL0); // 59
|
||||
init_bucket_renderer<Generic2>("l0-water-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_WATER_LEVEL0); // 59
|
||||
|
||||
//-----------------------
|
||||
// LEVEL 1 water texture
|
||||
@@ -246,8 +246,8 @@ void OpenGLRenderer::init_bucket_renderers() {
|
||||
BucketId::WATER_TEX_LEVEL1); // 60
|
||||
init_bucket_renderer<MercRenderer>("l1-water-merc", BucketCategory::MERC,
|
||||
BucketId::MERC_WATER_LEVEL1); // 61
|
||||
init_bucket_renderer<GenericRenderer>("l1-water-generic", BucketCategory::GENERIC_MERC,
|
||||
BucketId::GENERIC_WATER_LEVEL1); // 62
|
||||
init_bucket_renderer<Generic2>("l1-water-generic", BucketCategory::GENERIC,
|
||||
BucketId::GENERIC_WATER_LEVEL1); // 62
|
||||
|
||||
init_bucket_renderer<OceanNear>("ocean-near", BucketCategory::OCEAN, BucketId::OCEAN_NEAR); // 63
|
||||
// 64?
|
||||
@@ -374,7 +374,6 @@ void OpenGLRenderer::draw_renderer_selection_window() {
|
||||
ImGui::Checkbox("Generic XGKICK", &m_render_state.enable_generic_xgkick);
|
||||
ImGui::Checkbox("Blackout Loads", &m_enable_fast_blackout_loads);
|
||||
ImGui::Checkbox("Direct 2", &m_render_state.use_direct2);
|
||||
ImGui::Checkbox("Generic 2", &m_render_state.use_generic2);
|
||||
|
||||
for (size_t i = 0; i < m_bucket_renderers.size(); i++) {
|
||||
auto renderer = m_bucket_renderers[i].get();
|
||||
|
||||
@@ -14,14 +14,14 @@ enum class BucketId {
|
||||
TIE_NEAR_LEVEL0 = 8,
|
||||
TIE_LEVEL0 = 9,
|
||||
MERC_TFRAG_TEX_LEVEL0 = 10,
|
||||
GMERC_TFRAG_TEX_LEVEL0 = 11,
|
||||
GENERIC_TFRAG_TEX_LEVEL0 = 11,
|
||||
TFRAG_TEX_LEVEL1 = 12,
|
||||
TFRAG_LEVEL1 = 13,
|
||||
TFRAG_NEAR_LEVEL1 = 14,
|
||||
TIE_NEAR_LEVEL1 = 15,
|
||||
TIE_LEVEL1 = 16,
|
||||
MERC_TFRAG_TEX_LEVEL1 = 17,
|
||||
GMERC_TFRAG_TEX_LEVEL1 = 18,
|
||||
GENERIC_TFRAG_TEX_LEVEL1 = 18,
|
||||
SHRUB_TEX_LEVEL0 = 19,
|
||||
SHRUB_NORMAL_LEVEL0 = 20,
|
||||
// 21
|
||||
@@ -82,7 +82,7 @@ enum class BucketCategory {
|
||||
SHRUB,
|
||||
TEX,
|
||||
MERC,
|
||||
GENERIC_MERC,
|
||||
GENERIC,
|
||||
SPRITE,
|
||||
OCEAN,
|
||||
OTHER,
|
||||
@@ -90,4 +90,4 @@ enum class BucketCategory {
|
||||
};
|
||||
|
||||
constexpr const char* BUCKET_CATEGORY_NAMES[(int)BucketCategory::MAX_CATEGORIES] = {
|
||||
"tfrag", "tie", "shrub", "tex", "merc", "mercneric", "sprite", "ocean", "other"};
|
||||
"tfrag", "tie", "shrub", "tex", "merc", "generic", "sprite", "ocean", "other"};
|
||||
|
||||
@@ -6,10 +6,10 @@ class Generic2 : public BucketRenderer {
|
||||
public:
|
||||
Generic2(const std::string& name,
|
||||
BucketId my_id,
|
||||
u32 num_verts,
|
||||
u32 num_frags,
|
||||
u32 num_adgif,
|
||||
u32 num_buckets);
|
||||
u32 num_verts = 1500000,
|
||||
u32 num_frags = 10000,
|
||||
u32 num_adgif = 3000,
|
||||
u32 num_buckets = 800);
|
||||
~Generic2();
|
||||
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
|
||||
void draw_debug_window() override;
|
||||
|
||||
@@ -325,7 +325,7 @@ static void gl_set_fullscreen(GfxDisplay* display, int mode, int /*screen*/) {
|
||||
}
|
||||
}
|
||||
|
||||
static void gl_screen_size(GfxDisplay* display,
|
||||
static void gl_screen_size(GfxDisplay* /*display*/,
|
||||
int vmode_idx,
|
||||
int /*screen*/,
|
||||
s32* w_out,
|
||||
|
||||
@@ -128,7 +128,6 @@ struct Cache {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
// nop // sll r0, r0, 0
|
||||
get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
|
||||
c->lui(v1, 16256); // lui v1, 16256
|
||||
@@ -667,7 +666,6 @@ struct Cache {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
|
||||
// nop // sll r0, r0, 0
|
||||
c->lw(v1, 80, at); // lw v1, 80(at)
|
||||
@@ -847,7 +845,6 @@ struct Cache {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -128); // daddiu sp, sp, -128
|
||||
c->sd(ra, 12432, at); // sd ra, 12432(at)
|
||||
c->sq(s0, 12448, at); // sq s0, 12448(at)
|
||||
|
||||
@@ -10,8 +10,6 @@ struct Cache {
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
// nop // sll r0, r0, 0
|
||||
get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672
|
||||
c->ori(a2, r0, 65535); // ori a2, r0, 65535
|
||||
@@ -47,7 +45,6 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_3:
|
||||
c->addiu(a3, r0, 324); // addiu a3, r0, 324
|
||||
// c->sw(a2, 128, v1); // sw a2, 128(v1)
|
||||
u32 sadr = c->sgpr64(a2);
|
||||
@@ -87,7 +84,6 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_6:
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
//jr ra // jr ra
|
||||
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
||||
@@ -155,7 +151,7 @@ void lq_buffer(Mask mask, Vf& data, u32 qw) {
|
||||
}
|
||||
|
||||
|
||||
void vcallms_104(ExecutionContext* c) {
|
||||
void vcallms_104() {
|
||||
// iaddi vi02, vi00, 0x0 | nop 104
|
||||
vis[vi02] = 0;
|
||||
// iadd vi03, vi02, vi08 | nop 105
|
||||
@@ -508,7 +504,6 @@ void vcallms_257(ExecutionContext* c) {
|
||||
|
||||
void vcallms_264(ExecutionContext* c);
|
||||
void vcallms_259(ExecutionContext* c) {
|
||||
PROG_259:
|
||||
// ior vi01, vi13, vi00 | nop 259
|
||||
vis[vi01] = vis[vi13];
|
||||
// lqi.xyzw vf09, vi01 | nop 260
|
||||
@@ -523,7 +518,6 @@ void vcallms_259(ExecutionContext* c) {
|
||||
}
|
||||
|
||||
void vcallms_264(ExecutionContext* c) {
|
||||
PROG_264:
|
||||
// move.xyzw vf15, vf21 | mulax.xyzw ACC, vf01, vf09 264
|
||||
c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf09).vf.x()); c->vfs[vf15].vf.move(Mask::xyzw, c->vf_src(vf21).vf);
|
||||
// move.xyzw vf20, vf22 | madday.xyzw ACC, vf02, vf09 265
|
||||
@@ -641,7 +635,6 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_4:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lw(v1, 724, at); // lw v1, 724(at)
|
||||
// nop // sll r0, r0, 0
|
||||
@@ -907,7 +900,7 @@ u64 execute(void* ctxt) {
|
||||
c->addiu(a2, r0, 324); // addiu a2, r0, 324
|
||||
{
|
||||
// spr to
|
||||
u32 sadr = c->sgpr64(a1);
|
||||
sadr = c->sgpr64(a1);
|
||||
u32 tadr = c->sgpr64(v1);
|
||||
spad_to_dma_blerc_chain(cache.fake_scratchpad_data, sadr & 0x3fff, tadr);
|
||||
}
|
||||
@@ -1076,7 +1069,7 @@ u64 execute(void* ctxt) {
|
||||
vis[vi09] = c->gpr_src(a2).du16[0]; // ctc2.i vi9, a2
|
||||
c->daddu(t4, t2, t5); // daddu t4, t2, t5
|
||||
// Unknown instr: vcallms 104
|
||||
vcallms_104(c);
|
||||
vcallms_104();
|
||||
|
||||
block_33:
|
||||
c->pextuh(t5, t7, r0); // pextuh t5, t7, r0
|
||||
|
||||
@@ -171,7 +171,6 @@ u64 execute(void* ctxt) {
|
||||
u16 vi01 = 0;
|
||||
|
||||
u32 madr, sadr, qwc;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -128); // daddiu sp, sp, -128
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s0, 16, sp); // sq s0, 16(sp)
|
||||
@@ -313,7 +312,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_14:
|
||||
// block_14:
|
||||
// c->sw(t3, 16, t1); // sw t3, 16(t1)
|
||||
madr = c->sgpr64(t3);
|
||||
c->xori(t6, t2, 2048); // xori t6, t2, 2048
|
||||
@@ -409,7 +408,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_23:
|
||||
// block_23:
|
||||
// c->sw(a1, 128, a3); // sw a1, 128(a3)
|
||||
sadr = c->sgpr64(a1);
|
||||
c->xori(a1, a1, 12288); // xori a1, a1, 12288
|
||||
@@ -921,7 +920,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_46:
|
||||
// block_46:
|
||||
// c->sw(a1, 128, a3); // sw a1, 128(a3)
|
||||
sadr = c->sgpr64(a1);
|
||||
c->xori(a1, a1, 12288); // xori a1, a1, 12288
|
||||
@@ -1174,7 +1173,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_59:
|
||||
// block_59:
|
||||
// c->sw(a1, 128, a3); // sw a1, 128(a3)
|
||||
sadr = c->sgpr64(a1);
|
||||
c->xori(a1, a1, 12288); // xori a1, a1, 12288
|
||||
@@ -1267,7 +1266,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_67:
|
||||
// block_67:
|
||||
// c->sw(a1, 128, a3); // sw a1, 128(a3)
|
||||
sadr = c->sgpr64(a1);
|
||||
c->xori(a0, a1, 12288); // xori a0, a1, 12288
|
||||
@@ -1359,7 +1358,7 @@ struct Cache {
|
||||
void block29_call(ExecutionContext* c) {
|
||||
bool bc;
|
||||
u32 sadr, madr, qwc;
|
||||
block_29:
|
||||
// block_29:
|
||||
c->addiu(t6, t6, 32); // addiu t6, t6, 32
|
||||
c->sw(t5, 232, t0); // sw t5, 232(t0)
|
||||
|
||||
@@ -1398,7 +1397,7 @@ void block29_call(ExecutionContext* c) {
|
||||
*/
|
||||
|
||||
|
||||
block_33:
|
||||
// block_33:
|
||||
// c->sw(t2, 128, t1); // sw t2, 128(t1)
|
||||
sadr = c->sgpr64(t2);
|
||||
c->xori(t2, t2, 4096); // xori t2, t2, 4096
|
||||
@@ -1468,7 +1467,6 @@ void block29_call(ExecutionContext* c) {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
u32 madr, sadr, qwc;
|
||||
c->daddiu(sp, sp, -112); // daddiu sp, sp, -112
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
@@ -1565,7 +1563,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_5:
|
||||
// block_5:
|
||||
// c->sw(t2, 128, t1); // sw t2, 128(t1)
|
||||
sadr = c->sgpr64(t2);
|
||||
c->xori(t2, t2, 4096); // xori t2, t2, 4096
|
||||
@@ -1627,7 +1625,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_9:
|
||||
// block_9:
|
||||
// c->sw(ra, 16, t4); // sw ra, 16(t4)
|
||||
madr = c->sgpr64(ra);
|
||||
c->daddiu(t9, t9, -32); // daddiu t9, t9, -32
|
||||
@@ -1674,7 +1672,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_13:
|
||||
// block_13:
|
||||
// c->sw(ra, 16, t4); // sw ra, 16(t4)
|
||||
madr = c->sgpr64(ra);
|
||||
// nop // sll r0, r0, 0
|
||||
@@ -1888,7 +1886,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_39:
|
||||
// block_39:
|
||||
// c->sw(t2, 128, t1); // sw t2, 128(t1)
|
||||
sadr = c->sgpr64(t2);
|
||||
// nop // sll r0, r0, 0
|
||||
@@ -1930,7 +1928,7 @@ u64 execute(void* ctxt) {
|
||||
*/
|
||||
|
||||
|
||||
block_42:
|
||||
// block_42:
|
||||
c->lw(a0, 10260, a3); // lw a0, 10260(a3)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(v1, 4, a0); // sw v1, 4(a0)
|
||||
|
||||
@@ -755,14 +755,13 @@
|
||||
(when (< current-login-pos (-> s1-2 length))
|
||||
(set! sv-16 (-> s1-2 array-data (the-as uint current-login-pos)))
|
||||
(set! sv-32 0)
|
||||
(when (!= (-> sv-16 envmap-fade-far) 0.0)
|
||||
(format 0 "proto: ~A: ~f ~f~%" (-> sv-16 name) (-> sv-16 envmap-rfade) (-> sv-16 envmap-fade-far))
|
||||
(format 0 " d: ~`vector`P~%" (-> sv-16 dists))
|
||||
(format 0 " d: ~`vector`P~%" (-> sv-16 rdists))
|
||||
;(set! (-> sv-16 dists x) 1.)
|
||||
;(set! (-> sv-16 dists y) 100000000.)
|
||||
(*! (-> sv-16 envmap-fade-far) 10000.)
|
||||
|
||||
|
||||
(#when PC_PORT
|
||||
;; if a TIE uses environment mapping, disable the fade out so it always renderers with
|
||||
;; the generic renderer. In the port, we just make envmapped things always envmap.
|
||||
(when (!= (-> sv-16 envmap-fade-far) 0.0)
|
||||
(*! (-> sv-16 envmap-fade-far) 10000.)
|
||||
)
|
||||
)
|
||||
|
||||
(while (< sv-32 4)
|
||||
|
||||
Reference in New Issue
Block a user