[gfx] remove the generic v1 renderer, cleanup (#1345)

* remove the generic v1 renderer, cleanup

* rm the toggle too
This commit is contained in:
water111
2022-04-30 13:10:33 -04:00
committed by GitHub
parent a51536de8d
commit caf4aed127
15 changed files with 53 additions and 1566 deletions
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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);
-2
View File
@@ -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();
+4 -4
View File
@@ -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;
+1 -1
View File
@@ -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)
+3 -10
View File
@@ -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
+12 -14
View File
@@ -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)
+7 -8
View File
@@ -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)