aboutsummaryrefslogtreecommitdiff
path: root/plugins/dfxvideo/gpulib_if.c
diff options
context:
space:
mode:
authornotaz2012-02-24 01:07:33 +0200
committernotaz2012-02-27 00:27:46 +0200
commitb243416b907e6ce366b051e77ed8a434f7668d5d (patch)
tree0d1bce54ae1c19934c83f9546257de94723bd76e /plugins/dfxvideo/gpulib_if.c
parentf7be0e2b7adc4f6c4057f44f789bd7405844701c (diff)
downloadpcsx_rearmed-b243416b907e6ce366b051e77ed8a434f7668d5d.tar.gz
pcsx_rearmed-b243416b907e6ce366b051e77ed8a434f7668d5d.tar.bz2
pcsx_rearmed-b243416b907e6ce366b051e77ed8a434f7668d5d.zip
gpulib: eliminate list scan-ahead
Diffstat (limited to 'plugins/dfxvideo/gpulib_if.c')
-rw-r--r--plugins/dfxvideo/gpulib_if.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/plugins/dfxvideo/gpulib_if.c b/plugins/dfxvideo/gpulib_if.c
index 82bc38d..12aa0a3 100644
--- a/plugins/dfxvideo/gpulib_if.c
+++ b/plugins/dfxvideo/gpulib_if.c
@@ -296,16 +296,27 @@ int renderer_init(void)
extern const unsigned char cmd_lengths[256];
-void do_cmd_list(unsigned int *list, int list_len)
+int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
{
- unsigned int cmd, len;
-
+ unsigned int cmd = 0, len;
+ unsigned int *list_start = list;
unsigned int *list_end = list + list_len;
for (; list < list_end; list += 1 + len)
{
cmd = *list >> 24;
len = cmd_lengths[cmd];
+ if (list + 1 + len > list_end) {
+ cmd = -1;
+ break;
+ }
+
+#ifndef TEST
+ if (cmd == 0xa0 || cmd == 0xc0)
+ break; // image i/o, forward to upper layer
+ else if ((cmd & 0xf8) == 0xe0)
+ gpu.ex_regs[cmd & 7] = list[0];
+#endif
primTableJ[cmd]((void *)list);
@@ -313,8 +324,8 @@ void do_cmd_list(unsigned int *list, int list_len)
{
case 0x48 ... 0x4F:
{
- u32 num_vertexes = 1;
- u32 *list_position = &(list[2]);
+ u32 num_vertexes = 2;
+ u32 *list_position = &(list[3]);
while(1)
{
@@ -325,16 +336,14 @@ void do_cmd_list(unsigned int *list, int list_len)
num_vertexes++;
}
- if(num_vertexes > 2)
- len += (num_vertexes - 2);
-
+ len += (num_vertexes - 2);
break;
}
case 0x58 ... 0x5F:
{
- u32 num_vertexes = 1;
- u32 *list_position = &(list[2]);
+ u32 num_vertexes = 2;
+ u32 *list_position = &(list[4]);
while(1)
{
@@ -345,9 +354,7 @@ void do_cmd_list(unsigned int *list, int list_len)
num_vertexes++;
}
- if(num_vertexes > 2)
- len += (num_vertexes - 2) * 2;
-
+ len += (num_vertexes - 2) * 2;
break;
}
@@ -365,6 +372,12 @@ void do_cmd_list(unsigned int *list, int list_len)
#endif
}
}
+
+ gpu.ex_regs[1] &= ~0x1ff;
+ gpu.ex_regs[1] |= lGPUstatusRet & 0x1ff;
+
+ *last_cmd = cmd;
+ return list - list_start;
}
void renderer_sync_ecmds(uint32_t *ecmds)