fix another missed double resolution change
[pcsx_rearmed.git] / plugins / gpulib / gpu.c
index 8e92c78..e9714e4 100644 (file)
@@ -126,17 +126,16 @@ static noinline void get_gpu_info(uint32_t data)
     case 0x02:
     case 0x03:
     case 0x04:
-    case 0x05:
       gpu.gp0 = gpu.ex_regs[data & 7] & 0xfffff;
       break;
-    case 0x06:
-      gpu.gp0 = gpu.ex_regs[5] & 0xfffff;
+    case 0x05:
+      gpu.gp0 = gpu.ex_regs[5] & 0x3fffff;
       break;
     case 0x07:
       gpu.gp0 = 2;
       break;
     default:
-      gpu.gp0 = 0;
+      // gpu.gp0 unchanged
       break;
   }
 }
@@ -360,7 +359,7 @@ static void start_vram_transfer(uint32_t pos_word, uint32_t size_word, int is_re
   if (is_read) {
     gpu.status |= PSX_GPU_STATUS_IMG;
     // XXX: wrong for width 1
-    memcpy(&gpu.gp0, VRAM_MEM_XY(gpu.dma.x, gpu.dma.y), 4);
+    gpu.gp0 = LE32TOH(*(uint32_t *) VRAM_MEM_XY(gpu.dma.x, gpu.dma.y));
     gpu.state.last_vram_read_frame = *gpu.state.frame_count;
   }
 
@@ -528,7 +527,7 @@ void GPUwriteData(uint32_t data)
     flush_cmd_buffer();
 }
 
-long GPUdmaChain(uint32_t *rambase, uint32_t start_addr)
+long GPUdmaChain(uint32_t *rambase, uint32_t start_addr, uint32_t *progress_addr)
 {
   uint32_t addr, *list, ld_addr = 0;
   int len, left, count;
@@ -552,14 +551,28 @@ long GPUdmaChain(uint32_t *rambase, uint32_t start_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) {
+      *progress_addr = addr;
+      break;
+    }
     #define LD_THRESHOLD (8*1024)
     if (count >= LD_THRESHOLD) {
       if (count == LD_THRESHOLD) {
@@ -612,8 +625,11 @@ uint32_t GPUreadData(void)
     flush_cmd_buffer();
 
   ret = gpu.gp0;
-  if (gpu.dma.h)
+  if (gpu.dma.h) {
+    ret = HTOLE32(ret);
     do_vram_io(&ret, 1, 1);
+    ret = LE32TOH(ret);
+  }
 
   log_io("gpu_read %08x\n", ret);
   return ret;