[graphics] tie generic (#1341)

* [gtie] tie inst and proto functions

* first chain input to generic ee looks good

* m

* works

* ugh

* add tie generic

* rm debug print

* rm generic ties from fr3
This commit is contained in:
water111
2022-04-29 23:44:53 -04:00
committed by GitHub
parent 08d701bb26
commit a51536de8d
26 changed files with 5513 additions and 52 deletions
+13 -10
View File
@@ -46,7 +46,9 @@ set(RUNTIME_SOURCE
mips2c/functions/collide_probe.cpp
mips2c/functions/draw_string.cpp
mips2c/functions/generic_effect.cpp
mips2c/functions/generic_effect2.cpp
mips2c/functions/generic_merc.cpp
mips2c/functions/generic_tie.cpp
mips2c/functions/joint.cpp
mips2c/functions/merc_blend_shape.cpp
mips2c/functions/ocean.cpp
@@ -59,6 +61,7 @@ set(RUNTIME_SOURCE
mips2c/functions/test_func.cpp
mips2c/functions/texture.cpp
mips2c/functions/tfrag.cpp
mips2c/functions/tie_methods.cpp
mips2c/functions/time_of_day.cpp
overlord/dma.cpp
overlord/fake_iso.cpp
@@ -128,19 +131,19 @@ set(RUNTIME_SOURCE
find_package(Git)
function(write_svnrev_h)
set(GIT_SHORT_SHA "")
if (GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
EXECUTE_PROCESS(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
OUTPUT_VARIABLE GIT_SHORT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(GIT_SHORT_SHA "")
if (GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
EXECUTE_PROCESS(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
OUTPUT_VARIABLE GIT_SHORT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
set(GIT_SHORT_SHA "unk. rev.")
endif()
if(NOT GIT_SHORT_SHA)
set(GIT_SHORT_SHA "unk. rev.")
set(GIT_SHORT_SHA "unk. rev.")
endif()
if(NOT GIT_SHORT_SHA)
set(GIT_SHORT_SHA "unk. rev.")
else()
string(SUBSTRING ${GIT_SHORT_SHA} 0 6 GIT_SHORT_SHA)
endif()
endif()
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/kernel/svnrev.h "#define GIT_SHORT_SHA \"rev. ${GIT_SHORT_SHA}\"\n")
endfunction()
+8
View File
@@ -528,6 +528,14 @@ struct alignas(16) Accumulator {
}
}
void msuba(Mask mask, const Vf& a, float b) {
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << 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++) {
@@ -108,16 +108,25 @@ void Generic2::determine_draw_modes() {
u64 bonus_adgif_data[4];
memcpy(bonus_adgif_data, frag.header + (5 * 16), 4 * sizeof(u64));
// ADGIF 5
ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::TEST_1));
u64 final_test = bonus_adgif_data[0];
// ADGIF 6
if ((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::ALPHA_1)) {
final_alpha = bonus_adgif_data[2];
} else {
u64 final_test;
if ((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::ALPHA_1)) {
ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::ALPHA_1));
final_alpha = bonus_adgif_data[0];
ASSERT((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::TEST_1));
final_test = bonus_adgif_data[2];
} else {
// ADGIF 5
ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::TEST_1));
final_test = bonus_adgif_data[0];
// ADGIF 6
if ((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::ALPHA_1)) {
final_alpha = bonus_adgif_data[2];
} else {
ASSERT((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::TEST_1));
final_test = bonus_adgif_data[2];
}
}
if (final_alpha) {
@@ -58,7 +58,7 @@ void main() {
// color
if (mode == 0) {
fragment_color = vec4(0.4, 0.5, 0.5, 1);
fragment_color = vec4((normal_in + 1)*.5, 1);
fragment_color.xyz *= (pow(cam_dot, 3) + 0.3);
} else {
fragment_color = vec4(0.0, 0.3, 0.3, 1);
+3 -2
View File
@@ -368,8 +368,9 @@ void load_and_link_dgo_from_c(const char* name,
char objName[64];
strcpy(objName, (dgoObj + 4).cast<char>().c()); // name from dgo object header
lg::debug("[link and exec] {:18s} {} {:6d} heap-use {:8d} {:8d}", objName, lastObjectLoaded,
objSize, kheapused(kglobalheap), kdebugheap.offset ? kheapused(kdebugheap) : 0);
lg::debug("[link and exec] {:18s} {} {:6d} heap-use {:8d} {:8d}: 0x{:x}", objName,
lastObjectLoaded, objSize, kheapused(kglobalheap),
kdebugheap.offset ? kheapused(kdebugheap) : 0, kglobalheap->current.offset);
link_and_exec(obj, objName, objSize, heap, linkFlag, jump_from_c_to_goal); // link now!
// inform IOP we are done
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+55
View File
@@ -475,6 +475,15 @@ struct ExecutionContext {
}
}
void ppacw(int rd, int rs, int rt) {
auto s = gpr_src(rs);
auto t = gpr_src(rt);
gprs[rd].du32[0] = t.du32[0];
gprs[rd].du32[1] = t.du32[2];
gprs[rd].du32[2] = s.du32[0];
gprs[rd].du32[3] = s.du32[2];
}
void ppach(int rd, int rs, int rt) {
auto s = gpr_src(rs);
auto t = gpr_src(rt);
@@ -713,6 +722,20 @@ struct ExecutionContext {
gprs[dest].du16[7] = hi.du16[6];
}
void pmfhl_uw(int dest) {
gprs[dest].du32[0] = lo.du32[1];
gprs[dest].du32[1] = hi.du32[1];
gprs[dest].du32[2] = lo.du32[3];
gprs[dest].du32[3] = hi.du32[3];
}
void pmfhl_lw(int dest) {
gprs[dest].du32[0] = lo.du32[0];
gprs[dest].du32[1] = hi.du32[0];
gprs[dest].du32[2] = lo.du32[2];
gprs[dest].du32[3] = hi.du32[2];
}
void vsub_bc(DEST mask, BC bc, int dest, int src0, int src1) {
auto s0 = vf_src(src0);
auto s1 = vf_src(src1);
@@ -801,6 +824,17 @@ struct ExecutionContext {
}
}
void vmula(DEST mask, int src0, int src1) {
auto s0 = vf_src(src0);
auto s1 = vf_src(src1);
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
acc.f[i] = s0.f[i] * s1.f[i];
}
}
}
void vadda_bc(DEST mask, BC bc, int src0, int src1) {
auto s0 = vf_src(src0);
auto s1 = vf_src(src1);
@@ -878,6 +912,27 @@ struct ExecutionContext {
}
}
void vmsub(DEST mask, int dst, int src0, int src1) {
auto s0 = vf_src(src0);
auto s1 = vf_src(src1);
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
vfs[dst].f[i] = acc.f[i] - s0.f[i] * s1.f[i];
}
}
}
void vmsubq(DEST mask, int dst, int src0) {
auto s0 = vf_src(src0);
for (int i = 0; i < 4; i++) {
if ((u64)mask & (1 << i)) {
vfs[dst].f[i] = acc.f[i] - s0.f[i] * Q;
}
}
}
void vdiv(int src0, BC bc0, int src1, BC bc1) {
Q = vf_src(src0).f[(int)bc0] / vf_src(src1).f[(int)bc1];
}
+29 -2
View File
@@ -320,6 +320,29 @@ extern void link();
namespace shadow_xform_verts {
extern void link();
}
namespace draw_inline_array_instance_tie {
extern void link();
}
namespace draw_inline_array_prototype_tie_generic_asm {
extern void link();
}
namespace generic_tie_dma_to_spad_sync {
extern void link();
}
namespace generic_envmap_dproc {
extern void link();
}
namespace generic_interp_dproc {
extern void link();
}
namespace generic_no_light_dproc {
extern void link();
}
namespace generic_tie_convert {
extern void link();
}
LinkedFunctionTable gLinkedFunctionTable;
Rng gRng;
std::unordered_map<std::string, std::vector<void (*)()>> gMips2CLinkCallbacks = {
@@ -361,7 +384,8 @@ std::unordered_map<std::string, std::vector<void (*)()>> gMips2CLinkCallbacks =
high_speed_reject::link}},
{"generic-effect",
{generic_prepare_dma_double::link, generic_light_proc::link, generic_envmap_proc::link,
generic_prepare_dma_single::link}},
generic_prepare_dma_single::link, generic_envmap_dproc::link, generic_interp_dproc::link,
generic_no_light_dproc::link}},
{"ripple",
{ripple_execute_init::link, ripple_create_wave_table::link, ripple_apply_wave_table::link,
ripple_matrix_scale::link}},
@@ -373,7 +397,10 @@ std::unordered_map<std::string, std::vector<void (*)()>> gMips2CLinkCallbacks =
shadow_find_double_edges::link, shadow_find_facing_double_tris::link,
shadow_find_single_edges::link, shadow_find_facing_single_tris::link, shadow_init_vars::link,
shadow_scissor_top::link, shadow_scissor_edges::link, shadow_calc_dual_verts::link,
shadow_xform_verts::link}}};
shadow_xform_verts::link}},
{"tie-methods",
{draw_inline_array_instance_tie::link, draw_inline_array_prototype_tie_generic_asm::link}},
{"generic-tie", {generic_tie_dma_to_spad_sync::link, generic_tie_convert::link}}};
void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) {
const auto& it = m_executes.insert({name, {exec, Ptr<u8>()}});