Revert "duplicate every instance of a display list"
Some checks are pending
Build coop / build-ubuntu (push) Waiting to run
Build coop / build-windows (push) Waiting to run
Build coop / build-macos-arm (push) Waiting to run
Build coop / build-macos-intel (push) Waiting to run

This reverts commit 4ebb8fe2cb.
This commit is contained in:
Isaac0-dev 2025-03-25 09:02:33 +10:00
parent 4ebb8fe2cb
commit 26dd81d5cb
4 changed files with 8 additions and 58 deletions

View file

@ -11,8 +11,6 @@
#include "include/geo_commands.h" #include "include/geo_commands.h"
#include "pc/debuglog.h" #include "pc/debuglog.h"
static struct DynamicPool *sDisplayListDupPool = NULL;
// unused Mtx(s) // unused Mtx(s)
s16 identityMtx[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; s16 identityMtx[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } };
s16 zeroMtx[4][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; s16 zeroMtx[4][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
@ -22,50 +20,6 @@ Vec3s gVec3sZero = { 0, 0, 0 };
Vec3f gVec3fOne = { 1.0f, 1.0f, 1.0f }; Vec3f gVec3fOne = { 1.0f, 1.0f, 1.0f };
UNUSED Vec3s gVec3sOne = { 1, 1, 1 }; UNUSED Vec3s gVec3sOne = { 1, 1, 1 };
#define C0(cmd, pos, width) (((cmd)->words.w0 >> (pos)) & ((1U << width) - 1))
// Get the size of a display list by iterating
// until gsSPEndDisplayList or gsSPBranchList is found
u32 gfx_get_size(const Gfx* gfx) {
for (u16 i = 0;;) {
u32 op = (gfx + i)->words.w0 >> 24;
u8 cmdSize = 1;
switch (op) {
case G_DL:
if (C0(gfx + i, 16, 1) == G_DL_NOPUSH) { return i + 1; } // For displaylists that end with branches (jumps)
break;
case G_ENDDL:
return i + 1;
case G_TEXRECT:
case G_TEXRECTFLIP:
cmdSize = 3;
break;
case G_FILLRECT:
cmdSize = 2;
break;
}
i += cmdSize;
}
}
// Display lists need to be duplicated so they can be modified by mods
// also to prevent trying to write to read only memory for vanilla display lists
Gfx *gfx_dup_display_list(const Gfx *gfx) {
if (!gfx) { return NULL; }
if (!sDisplayListDupPool) { sDisplayListDupPool = dynamic_pool_init(); }
u32 size = gfx_get_size(gfx) * sizeof(Gfx);
void *mem = dynamic_pool_alloc(sDisplayListDupPool, size);
memcpy(mem, gfx, size);
return mem;
}
void gfx_displaylist_dup_pool_reset() {
dynamic_pool_free_pool(sDisplayListDupPool);
sDisplayListDupPool = NULL;
}
/** /**
* Initialize a geo node with a given type. Sets all links such that there * Initialize a geo node with a given type. Sets all links such that there
* are no siblings, parent or children for this node. * are no siblings, parent or children for this node.
@ -281,7 +235,7 @@ init_graph_node_translation_rotation(struct DynamicPool *pool,
vec3s_copy(graphNode->translation, translation); vec3s_copy(graphNode->translation, translation);
vec3s_copy(graphNode->rotation, rotation); vec3s_copy(graphNode->rotation, rotation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;
@ -303,7 +257,7 @@ struct GraphNodeTranslation *init_graph_node_translation(struct DynamicPool *poo
vec3s_copy(graphNode->translation, translation); vec3s_copy(graphNode->translation, translation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;
@ -324,7 +278,7 @@ struct GraphNodeRotation *init_graph_node_rotation(struct DynamicPool *pool,
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_ROTATION); init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_ROTATION);
vec3s_copy(graphNode->rotation, rotation); vec3s_copy(graphNode->rotation, rotation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;
@ -345,7 +299,7 @@ struct GraphNodeScale *init_graph_node_scale(struct DynamicPool *pool,
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->scale = scale; graphNode->scale = scale;
graphNode->prevScale = scale; graphNode->prevScale = scale;
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;
@ -415,7 +369,7 @@ struct GraphNodeAnimatedPart *init_graph_node_animated_part(struct DynamicPool *
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_ANIMATED_PART); init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_ANIMATED_PART);
vec3s_copy(graphNode->translation, translation); vec3s_copy(graphNode->translation, translation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;
@ -436,7 +390,7 @@ struct GraphNodeBillboard *init_graph_node_billboard(struct DynamicPool *pool,
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_BILLBOARD); init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_BILLBOARD);
vec3s_copy(graphNode->translation, translation); vec3s_copy(graphNode->translation, translation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;
@ -455,7 +409,7 @@ struct GraphNodeDisplayList *init_graph_node_display_list(struct DynamicPool *po
if (graphNode != NULL) { if (graphNode != NULL) {
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_DISPLAY_LIST); init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_DISPLAY_LIST);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = gfx_dup_display_list(displayList); graphNode->displayList = displayList;
} }
return graphNode; return graphNode;

View file

@ -385,8 +385,6 @@ extern Vec3s gVec3sZero;
extern Vec3f gVec3fOne; extern Vec3f gVec3fOne;
extern Vec3s gVec3sOne; extern Vec3s gVec3sOne;
void gfx_displaylist_dup_pool_reset();
void init_scene_graph_node_links(struct GraphNode *graphNode, s32 type); void init_scene_graph_node_links(struct GraphNode *graphNode, s32 type);
struct GraphNodeRoot *init_graph_node_root(struct DynamicPool *pool, struct GraphNodeRoot *graphNode, struct GraphNodeRoot *init_graph_node_root(struct DynamicPool *pool, struct GraphNodeRoot *graphNode,

View file

@ -363,8 +363,6 @@ static void level_cmd_clear_level(void) {
} }
static void level_reset_globals(void) { static void level_reset_globals(void) {
gfx_displaylist_dup_pool_reset();
// free previous level pool // free previous level pool
if (gLevelPool != NULL) { if (gLevelPool != NULL) {
dynamic_pool_free_pool(gLevelPool); dynamic_pool_free_pool(gLevelPool);

View file

@ -121,7 +121,7 @@ void gfx_parse(Gfx* cmd, LuaFunction func) {
u32 op = cmd->words.w0 >> 24; u32 op = cmd->words.w0 >> 24;
switch (op) { switch (op) {
case G_DL: case G_DL:
if (C0(16, 1) == G_DL_PUSH) { if (C0(16, 1) == 0) {
gfx_parse((Gfx *) cmd->words.w1, func); gfx_parse((Gfx *) cmd->words.w1, func);
} else { } else {
cmd = (Gfx *) cmd->words.w1; cmd = (Gfx *) cmd->words.w1;