mirror of
https://github.com/open-goal/jak-project
synced 2026-07-02 04:26:09 -04:00
[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:
+13
-10
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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>()}});
|
||||
|
||||
Reference in New Issue
Block a user