From ddffc8860effdd0946124393237866e081a246b8 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Wed, 18 Jan 2023 13:47:11 +0100 Subject: [PATCH] Fixes to make things work on real hardware again: - Struct pointers need to be 32-bit aligned, otherwise the PS1 will crash - For this purpose, some structs have been padded to make them a multiple of 4 bytes in size - Vector data needs to be copied into scratch RAM at a 32-bit aligned address --- common.h | 2 ++ memory.c | 2 +- memory.h | 2 +- ps1bsp.h | 6 +++--- qmath.h | 2 +- test.ps1bsp | Bin 136909 -> 138479 bytes world.c | 50 ++++++++++++++++++++++++++++---------------------- 7 files changed, 36 insertions(+), 28 deletions(-) diff --git a/common.h b/common.h index 30c4378..527a20f 100644 --- a/common.h +++ b/common.h @@ -2,6 +2,8 @@ #define __COMMON_H__ #include +#include +#include #include #include #include diff --git a/memory.c b/memory.c index c907400..4777157 100644 --- a/memory.c +++ b/memory.c @@ -7,7 +7,7 @@ static char primbuff[2][PRIMBUFLEN]; // Primitive buffer, just a raw buffer of b static char *nextpri; static char *primbuff_bounds; -u_char* const scratchpad_root = (char*)0x1F800000; +u_char* const scratchpad = (char*)0x1F800000; void *mem_scratch(char **scratch_offset, unsigned short size) { diff --git a/memory.h b/memory.h index 21b4d94..4b03443 100644 --- a/memory.h +++ b/memory.h @@ -1,7 +1,7 @@ #ifndef __MEMORY_H__ #define __MEMORY_H__ -extern u_char* const scratchpad_root; // Starting address of scratchpad memory +extern u_char* const scratchpad; // Starting address of scratchpad memory /** * @brief Allocate memory in the fast scratchpad RAM buffer. diff --git a/ps1bsp.h b/ps1bsp.h index a071133..e385a10 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -66,13 +66,13 @@ typedef struct typedef struct { unsigned short index; - unsigned char light; + unsigned short light; } ps1bsp_facevertex_t; typedef struct { unsigned short firstFaceVertex; - unsigned char numFaceVertices; + unsigned short numFaceVertices; u_long drawFrame; // Which frame was this face last drawn on? Used to check if this face should be drawn. } ps1bsp_face_t; @@ -80,7 +80,7 @@ typedef struct typedef struct { SVECTOR normal; - short dist; + int dist; } ps1bsp_plane_t; typedef struct diff --git a/qmath.h b/qmath.h index 24176f5..cba16a9 100644 --- a/qmath.h +++ b/qmath.h @@ -9,7 +9,7 @@ INLINE short m_dot12(const SVECTOR *a, const SVECTOR *b) } // TODO: worth a benchmark: is it faster to copy these vectors and use them from the stack, or to do six pointer dereferences? -INLINE short m_pointPlaneDist2(const VECTOR point2, const SVECTOR normal12, short dist2) +INLINE short m_pointPlaneDist2(const VECTOR point2, const SVECTOR normal12, int dist2) { int x = ((int)point2.vx * normal12.vx) >> 12; int y = ((int)point2.vy * normal12.vy) >> 12; diff --git a/test.ps1bsp b/test.ps1bsp index f2ba1c8c53a9e0de7bf07b25ad458cf6c64cb451..855c22c371816ad4f16d498957d1bd0f2aec55b8 100755 GIT binary patch delta 49525 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 diff --git a/world.c b/world.c index 06ef638..4490687 100644 --- a/world.c +++ b/world.c @@ -22,10 +22,17 @@ static CVECTOR colors[] = }; static const int numColors = sizeof(colors) / sizeof(CVECTOR); +// Set data pointers directly from an in-memory byte buffer #define LOAD_CHUNK(type, dst, num, src, entry) \ dst = (type*)((src) + (entry).offset); \ num = (entry).size / sizeof(type); +// Allocate memory per chunk and copy data from a byte buffer +// #define LOAD_CHUNK(type, dst, num, src, entry) \ +// dst = (type*)malloc((entry).size); \ +// memcpy(dst, (src) + (entry).offset, (entry).size); \ +// num = (entry).size / sizeof(type); + void world_load(const u_long *data, world_t *world) { const char *bytes = (const char*)data; @@ -214,12 +221,11 @@ static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) } } -static void world_drawface(const world_t *world, const ps1bsp_face_t *face, u_char *scratchptr) +static void world_drawface(const world_t *world, const ps1bsp_face_t *face) { const CVECTOR *col = &colors[(u_long)face % numColors]; - SVECTOR *vecs = (SVECTOR*)scratchptr; - // scratchptr += sizeof(SVECTOR) * face->numFaceVertices; // No need to move the scratchpad pointer right now + SVECTOR *vecs = (SVECTOR*)(scratchpad + 256); // Copy this face's vertices into scratch RAM for fast reuse // TODO: this is the main performance bottleneck right now! @@ -237,7 +243,7 @@ static void world_drawface(const world_t *world, const ps1bsp_face_t *face, u_ch drawface_quad_strip(face, vecs); } -static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs, u_char *scratchptr) +static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs) { u_long frameNum = time_getFrameNumber(); @@ -259,7 +265,7 @@ static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs, u_c if (face->drawFrame == frameNum) continue; - world_drawface(world, face, scratchptr); + world_drawface(world, face); face->drawFrame = frameNum; } @@ -276,7 +282,7 @@ static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs, u_c // if (face->drawFrame == frameNum) // continue; - // world_drawface(world, face, scratchptr); + // world_drawface(world, face); // face->drawFrame = frameNum; // } @@ -286,21 +292,21 @@ static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs, u_c // Draw child nodes in front-to-back order; adding faces to the OT will reverse the drawing order if (dist > 0) { - world_drawnode(world, node->front, pvs, scratchptr); - world_drawnode(world, node->back, pvs, scratchptr); + world_drawnode(world, node->front, pvs); + world_drawnode(world, node->back, pvs); } else { - world_drawnode(world, node->back, pvs, scratchptr); - world_drawnode(world, node->front, pvs, scratchptr); + world_drawnode(world, node->back, pvs); + world_drawnode(world, node->front, pvs); } } -// Decompress PVS data for the given leaf ID and store it in scratch RAM at the given scratch pointer location. -// Returns the memory location of decompressed PVS data, and moves the scratch pointer forward. -static u_char *world_loadVisData(const world_t *world, u_short leafIdx, u_char **scratchptr) +// Decompress PVS data for the given leaf ID and store it in RAM at the given buffer pointer location. +// Returns the memory location of decompressed PVS data, and moves the buffer pointer forward. +static u_char *world_loadVisData(const world_t *world, u_short leafIdx, u_char **buffer) { - u_char *head = *scratchptr; + u_char *head = *buffer; u_char *tail = head; const ps1bsp_leaf_t *leaf = &world->leaves[leafIdx]; @@ -324,13 +330,13 @@ static u_char *world_loadVisData(const world_t *world, u_short leafIdx, u_char * } } - *scratchptr = tail; + *buffer = tail; return head; } -static u_char *world_noVisData(const world_t *world, u_char **scratchptr) +static u_char *world_noVisData(const world_t *world, u_char **buffer) { - u_char *head = *scratchptr; + u_char *head = *buffer; u_char *tail = head; for (int l = 1; l < world->numLeaves; l += 8) @@ -338,7 +344,7 @@ static u_char *world_noVisData(const world_t *world, u_char **scratchptr) *tail++ = 0xFF; } - *scratchptr = tail; + *buffer = tail; return head; } @@ -369,9 +375,9 @@ void world_draw(const world_t *world) cam_leaf = world_leafAtPoint(world, &cam_pos); - u_char *scratchptr = scratchpad_root; - u_char *pvs = world_loadVisData(world, cam_leaf, &scratchptr); - //u_char *pvs = world_noVisData(world, &scratchptr); + u_char *pvsbuf = scratchpad; + u_char *pvs = world_loadVisData(world, cam_leaf, &pvsbuf); + //u_char *pvs = world_noVisData(world, &pvsbuf); - world_drawnode(world, 0, pvs, scratchptr); + world_drawnode(world, 0, pvs); }