gpulib: allow commands to span list entries
authornotaz <notasas@gmail.com>
Mon, 14 Nov 2022 22:57:47 +0000 (00:57 +0200)
committernotaz <notasas@gmail.com>
Mon, 14 Nov 2022 22:57:47 +0000 (00:57 +0200)
libretro/pcsx_rearmed#271

plugins/gpulib/gpu.c

index f468cf8..e9714e4 100644 (file)
@@ -551,12 +551,22 @@ long GPUdmaChain(uint32_t *rambase, uint32_t start_addr, uint32_t *progress_addr
     if (len > 0)
       cpu_cycles += 5 + len;
 
-    log_io(".chain %08x #%d\n", (list - rambase) * 4, len);
+    log_io(".chain %08lx #%d+%d\n",
+      (long)(list - rambase) * 4, len, gpu.cmd_len);
+    if (unlikely(gpu.cmd_len > 0)) {
+      memcpy(gpu.cmd_buffer + gpu.cmd_len, list + 1, len * 4);
+      gpu.cmd_len += len;
+      flush_cmd_buffer();
+      continue;
+    }
 
     if (len) {
       left = do_cmd_buffer(list + 1, len);
-      if (left)
-        log_anomaly("GPUdmaChain: discarded %d/%d words\n", left, len);
+      if (left) {
+        memcpy(gpu.cmd_buffer, list + 1 + len - left, left * 4);
+        gpu.cmd_len = left;
+        log_anomaly("GPUdmaChain: %d/%d words left\n", left, len);
+      }
     }
 
     if (progress_addr) {