gpu_neon: support caching renderers, update rearmed if
authornotaz <notasas@gmail.com>
Fri, 12 Aug 2011 10:21:51 +0000 (13:21 +0300)
committernotaz <notasas@gmail.com>
Fri, 12 Aug 2011 21:57:33 +0000 (00:57 +0300)
plugins/gpu_neon/gpu.c
plugins/gpu_neon/gpu.h
plugins/gpu_neon/vout_fb.c
plugins/gpu_neon/vout_sdl.c

index 30e6009..5bd4151 100644 (file)
@@ -21,8 +21,8 @@
 
 //#define log_io gpu_log
 #define log_io(...)
-#define log_anomaly gpu_log
-//#define log_anomaly(...)
+//#define log_anomaly gpu_log
+#define log_anomaly(...)
 
 struct psx_gpu gpu __attribute__((aligned(64)));
 
@@ -90,11 +90,14 @@ static noinline void get_gpu_info(uint32_t data)
 
 long GPUinit(void)
 {
-  int ret = vout_init();
-  do_reset();
+  int ret;
+  ret  = vout_init();
+  ret |= renderer_init();
+
   gpu.lcf_hc = &gpu.zero;
   gpu.state.frame_count = 0;
   gpu.state.hcnt = &gpu.zero;
+  do_reset();
   return ret;
 }
 
@@ -247,6 +250,8 @@ static void start_vram_transfer(uint32_t pos_word, uint32_t size_word, int is_re
 
   if (is_read)
     gpu.status.img = 1;
+  else
+    renderer_invalidate_caches(gpu.dma.x, gpu.dma.y, gpu.dma.w, gpu.dma.h);
 
   log_io("start_vram_transfer %c (%d, %d) %dx%d\n", is_read ? 'r' : 'w',
     gpu.dma.x, gpu.dma.y, gpu.dma.w, gpu.dma.h);
@@ -484,6 +489,7 @@ long GPUfreeze(uint32_t type, GPUFreeze_t *freeze)
       freeze->ulStatus = gpu.status.reg;
       break;
     case 0: // load
+      renderer_invalidate_caches(0, 0, 1024, 512);
       memcpy(gpu.vram, freeze->psxVRam, sizeof(gpu.vram));
       memcpy(gpu.regs, freeze->ulControl, sizeof(gpu.regs));
       memcpy(gpu.ex_regs, freeze->ulControl + 0xe0, sizeof(gpu.ex_regs));
index aa0eb7b..033581e 100644 (file)
@@ -84,5 +84,9 @@ extern const unsigned char cmd_lengths[256];
 
 void do_cmd_list(uint32_t *list, int count);
 
+int  renderer_init(void);
+void renderer_invalidate_caches(int x, int y, int w, int h);
+void renderer_flush_queues(void);
+
 int vout_init(void);
 int vout_finish(void);
index f80a29f..b7cb41b 100644 (file)
@@ -43,7 +43,7 @@ static void blit(void)
   {
     old_status = gpu.status.reg;
     old_h = h;
-    screen_buf = cbs->pl_fbdev_set_mode(stride, h, gpu.status.rgb24 ? 24 : 16);
+    screen_buf = cbs->pl_vout_set_mode(stride, h, gpu.status.rgb24 ? 24 : 16);
   }
 
   dest = screen_buf;
@@ -76,7 +76,7 @@ static void blit(void)
     }
   }
 
-  screen_buf = cbs->pl_fbdev_flip();
+  screen_buf = cbs->pl_vout_flip();
 }
 
 void GPUupdateLace(void)
@@ -85,6 +85,7 @@ void GPUupdateLace(void)
     return;
 
   if (!gpu.status.blanking && gpu.state.fb_dirty) {
+    renderer_flush_queues();
     blit();
     gpu.state.fb_dirty = 0;
   }
@@ -95,14 +96,14 @@ long GPUopen(void)
   gpu.frameskip.enabled = cbs->frameskip;
   gpu.frameskip.advice = &cbs->fskip_advice;
 
-  cbs->pl_fbdev_open();
-  screen_buf = cbs->pl_fbdev_flip();
+  cbs->pl_vout_open();
+  screen_buf = cbs->pl_vout_flip();
   return 0;
 }
 
 long GPUclose(void)
 {
-  cbs->pl_fbdev_close();
+  cbs->pl_vout_close();
   return 0;
 }
 
index f2f87e9..3152c32 100644 (file)
@@ -79,8 +79,11 @@ static void blit(void)
 
 void GPUupdateLace(void)
 {
-  if (!gpu.status.blanking)
+  if (!gpu.status.blanking && gpu.state.fb_dirty) {
+    renderer_flush_queues();
     blit();
+    gpu.state.fb_dirty = 0;
+  }
 }
 
 long GPUopen(void **dpy)