+ else if (scanlines != 0 && scanline_level != 100 && bpp == 16) {
+ if (h <= 256)
+ pl_vout_scale_h = 2;
+ }
+#endif
+ vout_w *= pl_vout_scale_w;
+ vout_h *= pl_vout_scale_h;
+
+ 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 && pl_plat_blit == NULL)
+ fprintf(stderr, "failed to set mode %dx%d@%d\n",
+ vout_w, vout_h, vout_bpp);
+ else {
+ pl_vout_w = vout_w;
+ pl_vout_h = vout_h;
+ pl_vout_bpp = vout_bpp;
+ pl_vout_yoffset = buf_yoffset;
+ }
+ if (pl_vout_buf != NULL)
+ pl_vout_buf = (char *)pl_vout_buf
+ + pl_vout_yoffset * pl_vout_w * pl_vout_bpp / 8;
+
+ 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 x, int y, int w, int h, int dims_changed)
+{
+ static int clear_counter;
+ unsigned char *dest = pl_vout_buf;
+ const unsigned short *src = vram;
+ int dstride = pl_vout_w, h1 = h;
+ int h_full = pl_vout_h - pl_vout_yoffset;
+ int xoffs = 0, doffs;
+
+ pcnt_start(PCNT_BLIT);
+
+ if (vram == NULL) {
+ // blanking
+ if (pl_plat_clear)
+ pl_plat_clear();
+ else
+ memset(pl_vout_buf, 0,
+ dstride * h_full * pl_vout_bpp / 8);
+ goto out_hud;
+ }
+
+ assert(x + w <= pl_vout_w);
+ assert(y + h <= pl_vout_h);
+
+ // offset
+ xoffs = x * pl_vout_scale_w;
+ doffs = xoffs + y * dstride;
+
+ if (dims_changed)
+ clear_counter = 2;
+
+ if (clear_counter > 0) {
+ if (pl_plat_clear)
+ pl_plat_clear();
+ else
+ memset(pl_vout_buf, 0,
+ dstride * h_full * pl_vout_bpp / 8);
+ clear_counter--;
+ }
+
+ if (pl_plat_blit)
+ {
+ pl_plat_blit(doffs, src, w, h, stride, bgr24);
+ goto out_hud;
+ }
+
+ if (dest == NULL)
+ goto out;
+
+ dest += doffs * 2;
+
+ if (bgr24)
+ {
+ if (pl_rearmed_cbs.only_16bpp) {
+ for (; h1-- > 0; dest += dstride * 2, src += stride)
+ {
+ bgr888_to_rgb565(dest, src, w * 3);
+ }
+ }
+ else {
+ dest -= doffs * 2;
+ dest += (doffs / 8) * 24;
+
+ for (; h1-- > 0; dest += dstride * 3, src += stride)
+ {
+ bgr888_to_rgb888(dest, src, w * 3);
+ }
+ }
+ }
+#ifdef __ARM_NEON__
+ else if (soft_filter == SOFT_FILTER_SCALE2X && pl_vout_scale_w == 2)
+ {
+ neon_scale2x_16_16(src, (void *)dest, w,
+ stride * 2, dstride * 2, h);
+ }
+ else if (soft_filter == SOFT_FILTER_EAGLE2X && pl_vout_scale_w == 2)
+ {
+ neon_eagle2x_16_16(src, (void *)dest, w,
+ stride * 2, dstride * 2, h);
+ }
+ else if (scanlines != 0 && scanline_level != 100)
+ {
+ int l = scanline_level * 2048 / 100;
+ int stride_0 = pl_vout_scale_h >= 2 ? 0 : stride;
+
+ h1 *= pl_vout_scale_h;
+ for (; h1 >= 2; h1 -= 2)
+ {
+ bgr555_to_rgb565(dest, src, w * 2);
+ dest += dstride * 2, src += stride_0;
+
+ bgr555_to_rgb565_b(dest, src, w * 2, l);
+ dest += dstride * 2, src += stride;
+ }
+ }
+#endif
+ else
+ {
+ for (; h1-- > 0; dest += dstride * 2, src += stride)
+ {
+ bgr555_to_rgb565(dest, src, w * 2);
+ }
+ }
+
+out_hud:
+ print_hud(xoffs, w * pl_vout_scale_w, (y + h) * pl_vout_scale_h);
+
+out:
+ pcnt_end(PCNT_BLIT);