portx64: pd-extract util gbi: fixed gdl conversion so it works on x86

it works but is still a bit messy, may rewrite it later
This commit is contained in:
Raf committed 2024-08-04 18:34:04 +08:00
1 parent 373f08ca3e
commit e8006f3446
1 file changed
+25 -15
+25 -15
View File
@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "common.h" #include "common.h"
#include "gbi.h"
#ifdef FORCE_BE32 #ifdef FORCE_BE32
#define HOST_DWORDS_PER_CMD 1 #define HOST_DWORDS_PER_CMD 1
@@ -117,7 +118,7 @@ void gbi_convert_vtx(u8 *dst, u32 offset, int count)
* Segment 5 is the start of the model file. The data in these files shifts * Segment 5 is the start of the model file. The data in these files shifts
* depending on the pointer size, so this function adjusts the offset accordingly. * depending on the pointer size, so this function adjusts the offset accordingly.
*/ */
static uint64_t gbi_rewrite_addr(uint64_t cmd, u8 opcode) static u64 gbi_rewrite_addr(u64 cmd, u8 opcode)
{ {
u8 segment = (cmd & 0x0f000000) >> 24; u8 segment = (cmd & 0x0f000000) >> 24;
u32 offset = cmd & 0x00ffffff; u32 offset = cmd & 0x00ffffff;
@@ -143,34 +144,42 @@ void gbi_gdl_rewrite_addrs(u8 *dst, u32 offset)
{ {
if (!offset) return; if (!offset) return;
uint64_t *cmds = (uint64_t*)(dst + (offset & 0x00ffffff)); u64 *cmds = (u64 *)(dst + (offset & 0x00ffffff));
if (!cmds) return; if (!cmds) return;
uint64_t cmd; u64 cmd;
do { do {
cmd = *cmds; cmd = *cmds;
Gfx* gfxcmd = cmds;
int idx = 0;
u8 opcode = (cmd >> 24) & 0xff;
if (CMD_HAS_ADDR((cmd << 32))) { #if HOST_DWORDS_PER_CMD == 2
u8 opcode = (cmd >> 24) & 0xff; idx = 1;
cmds[1] = gbi_rewrite_addr(cmds[1], opcode); opcode = (cmd >> 24) & 0xff;
#endif
cmd = (u64)opcode << 56;
if (CMD_HAS_ADDR(cmd)) {
cmds[idx] = gbi_rewrite_addr(cmds[idx], opcode);
} }
if (CMD_IS_SEGMENTED((cmd << 32))) { if (CMD_IS_SEGMENTED(cmd)) {
cmds[1] |= 1; gfxcmd->words.w1 |= 1;
} }
cmds += 2; cmds += HOST_DWORDS_PER_CMD;
} while (!CMD_IS_ENDDL((cmd << 32))); } while (!CMD_IS_ENDDL(cmd));
} }
u32 gbi_convert_gdl(u8 *dst, u32 dstpos, u8 *src, u32 srcpos, int segment_cmds) u32 gbi_convert_gdl(u8 *dst, u32 dstpos, u8 *src, u32 srcpos, int segment_cmds)
{ {
dstpos = ALIGN8(dstpos); dstpos = ALIGN8(dstpos);
uint64_t *n64_cmd = (uint64_t*)&src[srcpos]; u64 *n64_cmd = (u64*)&src[srcpos];
uint64_t *host_cmd = (uint64_t*)&dst[dstpos]; u64 *host_cmd = (u64*)&dst[dstpos];
uint64_t cmd; u64 cmd;
do { do {
cmd = srctoh64(*n64_cmd); cmd = srctoh64(*n64_cmd);
@@ -183,10 +192,11 @@ u32 gbi_convert_gdl(u8 *dst, u32 dstpos, u8 *src, u32 srcpos, int segment_cmds)
host_cmd[1] |= 1; host_cmd[1] |= 1;
} }
#else #else
host_cmd[0] = htodst64(cmd); host_cmd[0] = (cmd >> 32) | ((cmd & 0xffffffff) << 32);
if (segment_cmds && CMD_IS_SEGMENTED(cmd)) { if (segment_cmds && CMD_IS_SEGMENTED(cmd)) {
host_cmd[0] |= 1; Gfx* gfxcmd = (Gfx*)host_cmd;
gfxcmd->words.w1 |= 1;
} }
#endif #endif