From 27ca2fe4f492377a01b4b23b948eccda295eb4f9 Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Mon, 17 Mar 2025 00:02:16 +0200 Subject: [PATCH 1/3] dc.cpp: Set custom assert handlers to redirect system asserts, cleanup stacktrace --- src/liberty/skel/dc/dc.cpp | 20 +++++++++++++++----- src/miami/skel/dc/dc.cpp | 20 +++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/liberty/skel/dc/dc.cpp b/src/liberty/skel/dc/dc.cpp index 5e6da543..529e8bc0 100644 --- a/src/liberty/skel/dc/dc.cpp +++ b/src/liberty/skel/dc/dc.cpp @@ -1,4 +1,6 @@ #if defined RW_DC +#include +#undef assert // only included for assert_set_handler #include "vmu/vmu.h" #include @@ -1982,13 +1984,13 @@ __attribute__((noinline)) void stacktrace() { : : ); dbglog(DBG_CRITICAL, "%s\n", getExecutableTag()); - dbglog(DBG_CRITICAL, "Stack trace: %p ", (void*)pr); + dbglog(DBG_CRITICAL, "Stack trace: %08X ", (uintptr_t)pr); int found = 0; if(!(sp & 3) && sp > 0x8c000000 && sp < _arch_mem_top) { char** sp_ptr = (char**)sp; for (int so = 0; so < 16384; so++) { if (uintptr_t(&sp_ptr[so]) >= _arch_mem_top) { - dbglog(DBG_CRITICAL, "(@@%p) ", &sp_ptr[so]); + dbglog(DBG_CRITICAL, "(@@%08X) ", (uintptr_t)&sp_ptr[so]); break; } if (sp_ptr[so] > (char*)0x8c000000 && sp_ptr[so] < etext) { @@ -2004,9 +2006,9 @@ __attribute__((noinline)) void stacktrace() { uint16_t instr = instrp[-2]; // BSR or BSRF or JSR @Rn ? if (((instr & 0xf000) == 0xB000) || ((instr & 0xf0ff) == 0x0003) || ((instr & 0xf0ff) == 0x400B)) { - dbglog(DBG_CRITICAL, "%p ", instrp); + dbglog(DBG_CRITICAL, "%08X ", (uintptr_t)instrp); if (found++ > 24) { - dbglog(DBG_CRITICAL, "(@%p) ", &sp_ptr[so]); + dbglog(DBG_CRITICAL, "(@%08X) ", (uintptr_t)&sp_ptr[so]); break; } } else { @@ -2018,7 +2020,7 @@ __attribute__((noinline)) void stacktrace() { } dbglog(DBG_CRITICAL, "end\n"); } else { - dbglog(DBG_CRITICAL, "(@%p)\n", (void*)sp); + dbglog(DBG_CRITICAL, "(@%08X)\n", (uintptr_t)sp); } } @@ -2039,6 +2041,14 @@ int main(int argc, char *argv[]) { dbglog(DBG_CRITICAL, "%s\n", getExecutableTag()); + + #if defined(DC_SH4) + assert_set_handler([](const char * file, int line, const char * expr, const char * msg, const char * func) { + (void)msg; + re3_assert(expr, file, line, func); + }); + #endif + #if !defined(DC_SIM) std::set_terminate([]() { fflush(stdout); diff --git a/src/miami/skel/dc/dc.cpp b/src/miami/skel/dc/dc.cpp index 7c997e69..c8708f98 100644 --- a/src/miami/skel/dc/dc.cpp +++ b/src/miami/skel/dc/dc.cpp @@ -1,4 +1,6 @@ #if defined RW_DC +#include +#undef assert // only included for assert_set_handler #include "vmu/vmu.h" #include @@ -2016,13 +2018,13 @@ __attribute__((noinline)) void stacktrace() { : : ); dbglog(DBG_CRITICAL, "%s\n", getExecutableTag()); - dbglog(DBG_CRITICAL, "Stack trace: %p ", (void*)pr); + dbglog(DBG_CRITICAL, "Stack trace: %08X ", (uintptr_t)pr); int found = 0; if(!(sp & 3) && sp > 0x8c000000 && sp < _arch_mem_top) { char** sp_ptr = (char**)sp; for (int so = 0; so < 16384; so++) { if (uintptr_t(&sp_ptr[so]) >= _arch_mem_top) { - dbglog(DBG_CRITICAL, "(@@%p) ", &sp_ptr[so]); + dbglog(DBG_CRITICAL, "(@@%08X) ", (uintptr_t)&sp_ptr[so]); break; } if (sp_ptr[so] > (char*)0x8c000000 && sp_ptr[so] < etext) { @@ -2038,9 +2040,9 @@ __attribute__((noinline)) void stacktrace() { uint16_t instr = instrp[-2]; // BSR or BSRF or JSR @Rn ? if (((instr & 0xf000) == 0xB000) || ((instr & 0xf0ff) == 0x0003) || ((instr & 0xf0ff) == 0x400B)) { - dbglog(DBG_CRITICAL, "%p ", instrp); + dbglog(DBG_CRITICAL, "%08X ", (uintptr_t)instrp); if (found++ > 24) { - dbglog(DBG_CRITICAL, "(@%p) ", &sp_ptr[so]); + dbglog(DBG_CRITICAL, "(@%08X) ", (uintptr_t)&sp_ptr[so]); break; } } else { @@ -2052,7 +2054,7 @@ __attribute__((noinline)) void stacktrace() { } dbglog(DBG_CRITICAL, "end\n"); } else { - dbglog(DBG_CRITICAL, "(@%p)\n", (void*)sp); + dbglog(DBG_CRITICAL, "(@%08X)\n", (uintptr_t)sp); } } @@ -2073,6 +2075,14 @@ int main(int argc, char *argv[]) { dbglog(DBG_CRITICAL, "%s\n", getExecutableTag()); + + #if defined(DC_SH4) + assert_set_handler([](const char * file, int line, const char * expr, const char * msg, const char * func) { + (void)msg; + re3_assert(expr, file, line, func); + }); + #endif + #if !defined(DC_SIM) std::set_terminate([]() { fflush(stdout); From 06e183fbd90d4ecd362d1557250eb199a9aec11f Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Mon, 17 Mar 2025 00:19:03 +0200 Subject: [PATCH 2/3] Header file fixups --- src/common/thread/thread.h | 2 ++ src/common/vmu/vmu.cpp | 1 + src/common/vmu/vmu.h | 3 --- src/liberty/fakerw/rwcore.h | 11 +++++------ src/miami/fakerw/rwcore.h | 11 +++++------ vendor/librw/src/dc/rwdc.cpp | 20 +++++++++++--------- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/common/thread/thread.h b/src/common/thread/thread.h index 9c26574d..88c7361a 100644 --- a/src/common/thread/thread.h +++ b/src/common/thread/thread.h @@ -1,5 +1,7 @@ #ifndef DC_THREAD_H #define DC_THREAD_H +#include +#include namespace dc { diff --git a/src/common/vmu/vmu.cpp b/src/common/vmu/vmu.cpp index a435795c..4e04e09a 100644 --- a/src/common/vmu/vmu.cpp +++ b/src/common/vmu/vmu.cpp @@ -1,4 +1,5 @@ #include "vmu.h" +#include "sampman.h" #if !defined(DC_TEXCONV) diff --git a/src/common/vmu/vmu.h b/src/common/vmu/vmu.h index c9858085..c30bdcb9 100644 --- a/src/common/vmu/vmu.h +++ b/src/common/vmu/vmu.h @@ -1,9 +1,6 @@ #ifndef VMU_H_ #define VMU_H_ -#include "common.h" -#include "sampman.h" - #include "thread/thread.h" #include diff --git a/src/liberty/fakerw/rwcore.h b/src/liberty/fakerw/rwcore.h index 3430a5ae..fc0528ce 100644 --- a/src/liberty/fakerw/rwcore.h +++ b/src/liberty/fakerw/rwcore.h @@ -359,16 +359,15 @@ typedef RwCamera *(*RwCameraCallBack)(RwCamera *camera, void *data); enum RwCameraClearMode { - rwCAMERACLEARIMAGE = 0x1, - rwCAMERACLEARZ = 0x2, - rwCAMERACLEARSTENCIL = 0x4 + rwCAMERACLEARIMAGE = rw::Camera::CLEARIMAGE, + rwCAMERACLEARZ = rw::Camera::CLEARZ, + rwCAMERACLEARSTENCIL = rw::Camera::CLEARSTENCIL }; enum RwCameraProjection { - rwNACAMERAPROJECTION = 0, - rwPERSPECTIVE = 1, - rwPARALLEL = 2 + rwPERSPECTIVE = rw::Camera::PERSPECTIVE, + rwPARALLEL = rw::Camera::PARALLEL }; enum RwFrustumTestResult diff --git a/src/miami/fakerw/rwcore.h b/src/miami/fakerw/rwcore.h index ab0a719f..ab2e66bd 100644 --- a/src/miami/fakerw/rwcore.h +++ b/src/miami/fakerw/rwcore.h @@ -359,16 +359,15 @@ typedef RwCamera *(*RwCameraCallBack)(RwCamera *camera, void *data); enum RwCameraClearMode { - rwCAMERACLEARIMAGE = 0x1, - rwCAMERACLEARZ = 0x2, - rwCAMERACLEARSTENCIL = 0x4 + rwCAMERACLEARIMAGE = rw::Camera::CLEARIMAGE, + rwCAMERACLEARZ = rw::Camera::CLEARZ, + rwCAMERACLEARSTENCIL = rw::Camera::CLEARSTENCIL }; enum RwCameraProjection { - rwNACAMERAPROJECTION = 0, - rwPERSPECTIVE = 1, - rwPARALLEL = 2 + rwPERSPECTIVE = rw::Camera::PERSPECTIVE, + rwPARALLEL = rw::Camera::PARALLEL }; enum RwFrustumTestResult diff --git a/vendor/librw/src/dc/rwdc.cpp b/vendor/librw/src/dc/rwdc.cpp index db3fc965..24760b5b 100644 --- a/vendor/librw/src/dc/rwdc.cpp +++ b/vendor/librw/src/dc/rwdc.cpp @@ -37,6 +37,8 @@ extern const char* currentFile; #include #include +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + #define errorf(...) dbglog(DBG_CRITICAL, __VA_ARGS__) #define logf(...) // printf(__VA_ARGS__) bool re3RemoveLeastUsedModel(); @@ -1178,7 +1180,7 @@ void endUpdate(Camera* cam) { } void clearCamera(Camera* cam,RGBA* col,uint32 flags) { - if (flags & rwCAMERACLEARIMAGE) { + if (flags & rw::Camera::CLEARIMAGE) { cam->clearColor = *col; } UNIMPL_LOG(); @@ -1314,7 +1316,7 @@ setRenderState(int32 state, void *pvalue) case FOGCOLOR: #if !defined(DC_TEXCONV) // Set fog color when state changes - if(fogColor != value || fogStart != RwCameraGetFogDistance(rwdcCam)) { + if(fogColor != value || fogStart != rwdcCam->fogPlane) { fogColor = value; RGBA c; c.red = value; @@ -1323,8 +1325,8 @@ setRenderState(int32 state, void *pvalue) c.alpha = value>>24; pvr_fog_table_color(c.alpha / 255.0f, c.red / 255.0f, c.green / 255.0f, c.blue / 255.0f); - fogStart = RwCameraGetFogDistance(rwdcCam); - float fogEnd = RwCameraGetFarClipPlane(rwdcCam); + fogStart = rwdcCam->fogPlane; + float fogEnd = rwdcCam->farPlane; float fogIntensity[129]; uint8_t idx = 0; float startIntensity = (-fogStart) / (fogEnd - fogStart); //interpolate between start and end to get initial intensity @@ -1888,7 +1890,7 @@ struct MeshInfo { static_assert(sizeof(MeshInfo) == 4); struct MeshletInfo { - RwSphere boundingSphere; + rw::Sphere boundingSphere; uint16_t flags; int8_t pad; int8_t vertexSize; @@ -3543,11 +3545,11 @@ void defaultRenderCB(ObjPipeline *pipe, Atomic *atomic) { // Frustum Culling auto global_frustumTestResult = AtomicFrustumSphereNearCB(atomic, cam); - if (global_frustumTestResult == rwSPHEREOUTSIDE) { + if (global_frustumTestResult == rw::Camera::SPHEREOUTSIDE) { return; } - bool global_needsNoClip = global_frustumTestResult == rwSPHEREINSIDE; + bool global_needsNoClip = global_frustumTestResult == rw::Camera::SPHEREINSIDE; // Material *m; @@ -3780,8 +3782,8 @@ void defaultRenderCB(ObjPipeline *pipe, Atomic *atomic) { if (!global_needsNoClip) { if (!skin) { - RwSphere sphere = meshlet->boundingSphere; - RwV3dTransformPoints(&sphere.center, &sphere.center, 1, atomic->getFrame()->getLTM()); + rw::Sphere sphere = meshlet->boundingSphere; + rw::V3d::transformPoints(&sphere.center, &sphere.center, 1, atomic->getFrame()->getLTM()); auto local_frustumTestResult = cam->frustumTestSphereNear(&sphere);; if ( local_frustumTestResult == Camera::SPHEREOUTSIDE) { From 4d8ecc3bfb8745136f73f804d77c45803d9e3dd7 Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Mon, 17 Mar 2025 00:25:37 +0200 Subject: [PATCH 3/3] Fix texconv build --- vendor/librw/src/dc/rwdc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vendor/librw/src/dc/rwdc.cpp b/vendor/librw/src/dc/rwdc.cpp index 24760b5b..9c5aeeb3 100644 --- a/vendor/librw/src/dc/rwdc.cpp +++ b/vendor/librw/src/dc/rwdc.cpp @@ -5209,7 +5209,7 @@ struct write_vector: std::vector { std::copy(p, p + sizeof(T), begin() + offset); } - void packVertex(RwSphere* volume, V3d* vertex, TexCoords* texcoord, V3d* normal, RGBA* color, bool big_vertex, bool pad_xyz, bool big_uv) { + void packVertex(rw::Sphere* volume, V3d* vertex, TexCoords* texcoord, V3d* normal, RGBA* color, bool big_vertex, bool pad_xyz, bool big_uv) { if (big_vertex) { write(vertex->x); write(vertex->y); @@ -5329,8 +5329,8 @@ unsigned caluclateVertexSize(bool textured, bool normaled, bool colored, bool bi return vertexBytes; } -RwSphere calculateBoundingSphere(V3d* vertexData, size_t count) { - RwSphere sphere; +rw::Sphere calculateBoundingSphere(V3d* vertexData, size_t count) { + rw::Sphere sphere; sphere.center = {0, 0, 0}; sphere.radius = 0; @@ -5379,8 +5379,8 @@ struct meshlet { return false; } - RwSphere calculateBoundingSphere(V3d* vertexData) { - RwSphere sphere; + rw::Sphere calculateBoundingSphere(V3d* vertexData) { + rw::Sphere sphere; sphere.center = {0, 0, 0}; sphere.radius = 0;