gpu: move enhacement logic out of vout_pl
[pcsx_rearmed.git] / plugins / gpulib / vout_pl.c
index 79b6c3e..9a84432 100644 (file)
@@ -9,6 +9,7 @@
  * See the COPYING file in the top-level directory.
  */
 
+#include <string.h>
 #include "gpu.h"
 #include "cspace.h"
 #include "../../frontend/plugin_lib.h"
@@ -30,13 +31,25 @@ static void check_mode_change(void)
 {
   static uint32_t old_status;
   static int old_h;
+  int w = gpu.screen.hres;
+  int h = gpu.screen.h;
+
+  gpu.state.enhancement_active =
+    gpu.get_enhancement_bufer != NULL && gpu.state.enhancement_enable
+    && w <= 512 && h <= 256 && !gpu.status.rgb24;
+
+  if (gpu.state.enhancement_active) {
+    w *= 2;
+    h *= 2;
+  }
 
   // width|rgb24 change?
-  if ((gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || gpu.screen.h != old_h)
+  if ((gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || h != old_h)
   {
     old_status = gpu.status.reg;
-    old_h = gpu.screen.h;
-    screen_buf = cbs->pl_vout_set_mode(gpu.screen.hres, gpu.screen.h,
+    old_h = h;
+
+    screen_buf = cbs->pl_vout_set_mode(w, h,
       (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16);
   }
 }
@@ -49,11 +62,19 @@ static void blit(void)
   int h = gpu.screen.h;
   uint16_t *vram = gpu.vram;
   int stride = gpu.screen.hres;
+  int vram_stride = 1024;
+  int vram_mask = 1024 * 512 - 1;
   int fb_offs, doffs;
   uint8_t *dest;
 
-  fb_offs = y * 1024 + x;
   dest = (uint8_t *)screen_buf;
+  if (dest == NULL || w == 0 || stride == 0)
+    return;
+
+  if (gpu.state.enhancement_active)
+    vram = gpu.get_enhancement_bufer(&x, &y, &w, &h, &stride, &vram_mask);
+
+  fb_offs = y * vram_stride + x;
 
   // only do centering, at least for now
   doffs = (stride - w) / 2 & ~1;
@@ -62,17 +83,17 @@ static void blit(void)
   {
     if (cbs->only_16bpp) {
       dest += doffs * 2;
-      for (; h-- > 0; dest += stride * 2, fb_offs += 1024)
+      for (; h-- > 0; dest += stride * 2, fb_offs += vram_stride)
       {
-        fb_offs &= 1024*512-1;
+        fb_offs &= vram_mask;
         bgr888_to_rgb565(dest, vram + fb_offs, w * 3);
       }
     }
     else {
       dest += (doffs / 8) * 24;
-      for (; h-- > 0; dest += stride * 3, fb_offs += 1024)
+      for (; h-- > 0; dest += stride * 3, fb_offs += vram_stride)
       {
-        fb_offs &= 1024*512-1;
+        fb_offs &= vram_mask;
         bgr888_to_rgb888(dest, vram + fb_offs, w * 3);
       }
     }
@@ -80,9 +101,9 @@ static void blit(void)
   else
   {
     dest += doffs * 2;
-    for (; h-- > 0; dest += stride * 2, fb_offs += 1024)
+    for (; h-- > 0; dest += stride * 2, fb_offs += vram_stride)
     {
-      fb_offs &= 1024*512-1;
+      fb_offs &= vram_mask;
       bgr555_to_rgb565(dest, vram + fb_offs, w * 2);
     }
   }
@@ -99,6 +120,21 @@ void vout_update(void)
     blit();
 }
 
+void vout_blank(void)
+{
+  if (cbs->pl_vout_raw_flip == NULL) {
+    int w = gpu.screen.hres;
+    int h = gpu.screen.h;
+    int bytespp = gpu.status.rgb24 ? 3 : 2;
+    if (gpu.state.enhancement_active) {
+      w *= 2;
+      h *= 2;
+    }
+    memset(screen_buf, 0, w * h * bytespp);
+    screen_buf = cbs->pl_vout_flip();
+  }
+}
+
 long GPUopen(void **unused)
 {
   gpu.frameskip.active = 0;