gpulib: clear fb when display is blanked
[pcsx_rearmed.git] / plugins / gpulib / vout_pl.c
index 91de057..0bd1ecf 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"
@@ -36,8 +37,8 @@ static void check_mode_change(void)
   {
     old_status = gpu.status.reg;
     old_h = gpu.screen.h;
-    screen_buf = cbs->pl_vout_set_mode(gpu.screen.hres,
-                                       gpu.screen.h, gpu.status.rgb24 ? 24 : 16);
+    screen_buf = cbs->pl_vout_set_mode(gpu.screen.hres, gpu.screen.h,
+      (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16);
   }
 }
 
@@ -52,29 +53,33 @@ static void blit(void)
   int fb_offs, doffs;
   uint8_t *dest;
 
-  fb_offs = y * 1024 + x;
   dest = (uint8_t *)screen_buf;
+  if (dest == NULL)
+    return;
+
+  fb_offs = y * 1024 + x;
 
   // only do centering, at least for now
   doffs = (stride - w) / 2 & ~1;
 
   if (gpu.status.rgb24)
   {
-#ifndef MAEMO
-    dest += (doffs / 8) * 24;
-    for (; h-- > 0; dest += stride * 3, fb_offs += 1024)
-    {
-      fb_offs &= 1024*512-1;
-      bgr888_to_rgb888(dest, vram + fb_offs, w * 3);
+    if (cbs->only_16bpp) {
+      dest += doffs * 2;
+      for (; h-- > 0; dest += stride * 2, fb_offs += 1024)
+      {
+        fb_offs &= 1024*512-1;
+        bgr888_to_rgb565(dest, vram + fb_offs, w * 3);
+      }
     }
-#else
-    dest += doffs * 2;
-    for (; h-- > 0; dest += stride * 2, fb_offs += 1024)
-    {
-      fb_offs &= 1024*512-1;
-      bgr888_to_rgb565(dest, vram + fb_offs, w * 3);
+    else {
+      dest += (doffs / 8) * 24;
+      for (; h-- > 0; dest += stride * 3, fb_offs += 1024)
+      {
+        fb_offs &= 1024*512-1;
+        bgr888_to_rgb888(dest, vram + fb_offs, w * 3);
+      }
     }
-#endif
   }
   else
   {
@@ -98,6 +103,16 @@ void vout_update(void)
     blit();
 }
 
+void vout_blank(void)
+{
+  check_mode_change();
+  if (cbs->pl_vout_raw_flip == NULL) {
+    int bytespp = gpu.status.rgb24 ? 3 : 2;
+    memset(screen_buf, 0, gpu.screen.hres * gpu.screen.h * bytespp);
+    screen_buf = cbs->pl_vout_flip();
+  }
+}
+
 long GPUopen(void **unused)
 {
   gpu.frameskip.active = 0;