+ if (pl_vout_buf != NULL && vout_w == pl_vout_w && vout_h == pl_vout_h
+ && vout_bpp == pl_vout_bpp)
+ return;
+
+ update_layer_size(vout_w, vout_h);
+
+ pl_vout_buf = plat_gvideo_set_mode(&vout_w, &vout_h, &vout_bpp);
+ if (pl_vout_buf == NULL)
+ fprintf(stderr, "failed to set mode %dx%d@%d\n",
+ psx_w, psx_h, psx_bpp);
+ else {
+ pl_vout_w = vout_w;
+ pl_vout_h = vout_h;
+ pl_vout_bpp = vout_bpp;
+ }
+
+ menu_notify_mode_change(pl_vout_w, pl_vout_h, pl_vout_bpp);
+}
+
+static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
+{
+ static int doffs_old, clear_counter;
+ unsigned char *dest = pl_vout_buf;
+ const unsigned short *src = vram;
+ int dstride = pl_vout_w, h1 = h;
+ int doffs;
+
+ pcnt_start(PCNT_BLIT);
+
+ if (dest == NULL)
+ goto out;
+
+ if (vram == NULL) {
+ // blanking
+ memset(pl_vout_buf, 0, dstride * pl_vout_h * pl_vout_bpp / 8);
+ goto out;
+ }
+
+ // borders
+ doffs = (dstride - w * pl_vout_scale) / 2 & ~1;
+ dest += doffs * 2;
+
+ if (doffs > doffs_old)
+ clear_counter = 2;
+ doffs_old = doffs;
+
+ if (clear_counter > 0) {
+ memset(pl_vout_buf, 0, dstride * pl_vout_h * pl_vout_bpp / 8);
+ clear_counter--;