gpu_neon: handle 0xEx cmds while frameskiping
authornotaz <notasas@gmail.com>
Fri, 12 Aug 2011 23:13:13 +0000 (02:13 +0300)
committernotaz <notasas@gmail.com>
Fri, 12 Aug 2011 23:15:08 +0000 (02:15 +0300)
otherwise things go out of sync

plugins/gpu_neon/gpu.c
plugins/gpu_neon/gpu.h
plugins/gpu_neon/peops_if.c
plugins/gpu_neon/vout_fb.c

index 2db4379..03b0c71 100644 (file)
@@ -328,11 +328,12 @@ static int check_cmd(uint32_t *data, int count)
       start_vram_transfer(data[pos + 1], data[pos + 2], cmd == 0xc0);
       pos += len;
     }
-
-    if (cmd == -1)
+    else if (cmd == -1)
       break;
   }
 
+  if (gpu.frameskip.active)
+    renderer_sync_ecmds(gpu.ex_regs);
   gpu.state.fb_dirty |= vram_dirty;
 
   return count - pos;
@@ -498,6 +499,7 @@ long GPUfreeze(uint32_t type, GPUFreeze_t *freeze)
         gpu.regs[i] ^= 1; // avoid reg change detection
         GPUwriteStatus((i << 24) | (gpu.regs[i] ^ 1));
       }
+      renderer_sync_ecmds(gpu.ex_regs);
       break;
   }
 
index cc202c5..a0cdbf7 100644 (file)
@@ -86,6 +86,7 @@ extern const unsigned char cmd_lengths[256];
 void do_cmd_list(uint32_t *list, int count);
 
 int  renderer_init(void);
+void renderer_sync_ecmds(uint32_t * ecmds);
 void renderer_invalidate_caches(int x, int y, int w, int h);
 void renderer_flush_queues(void);
 
index 04c2595..1a4072f 100644 (file)
@@ -365,6 +365,16 @@ void do_cmd_list(unsigned int *list, int list_len)
   }
 }
 
+void renderer_sync_ecmds(uint32_t *ecmds)
+{
+  cmdTexturePage((unsigned char *)&ecmds[1]);
+  cmdTextureWindow((unsigned char *)&ecmds[2]);
+  cmdDrawAreaStart((unsigned char *)&ecmds[3]);
+  cmdDrawAreaEnd((unsigned char *)&ecmds[4]);
+  cmdDrawOffset((unsigned char *)&ecmds[5]);
+  cmdSTP((unsigned char *)&ecmds[6]);
+}
+
 void renderer_invalidate_caches(int x, int y, int w, int h)
 {
 }
index 1dfa8ab..b2b5b25 100644 (file)
@@ -85,7 +85,7 @@ void GPUupdateLace(void)
     return;
 
   if (gpu.frameskip.enabled) {
-    if (!gpu.frameskip.frame_ready && gpu.frameskip.skipped_blits < 6) {
+    if (!gpu.frameskip.frame_ready && gpu.frameskip.skipped_blits < 9) {
       gpu.frameskip.skipped_blits++;
       return;
     }