- if (is_rom_loaded)
- {
- // darken the active framebuffer
- memset(g_screen_ptr, 0, 320*8*2);
- menu_darken_bg((char *)g_screen_ptr + 320*8*2, 320*224, 1);
- memset((char *)g_screen_ptr + 320*232*2, 0, 320*8*2);
- }
+ gp2x_video_changemode_ll(bpp);
+
+ gp2x_memset_all_buffers(0, 0, 320*240*2);
+ gp2x_video_flip();
+}
+
+static void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)
+{
+ char *dst;
+ if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }
+ if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }
+ if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }
+ if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }
+}
+
+void gp2x_memcpy_all_buffers(void *data, int offset, int len)
+{
+ gp2x_memcpy_buffers(0xf, data, offset, len);
+}
+
+void gp2x_memset_all_buffers(int offset, int byte, int len)
+{
+ memset((char *)gp2x_screens[0] + offset, byte, len);
+ memset((char *)gp2x_screens[1] + offset, byte, len);
+ memset((char *)gp2x_screens[2] + offset, byte, len);
+ memset((char *)gp2x_screens[3] + offset, byte, len);
+}
+
+void gp2x_make_fb_bufferable(int yes)
+{
+ int ret = 0;
+
+ yes = yes ? 1 : 0;
+ ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[0], 320*240*2);
+ ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[1], 320*240*2);
+ ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[2], 320*240*2);
+ ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[3], 320*240*2);
+
+ if (ret)
+ fprintf(stderr, "could not make fb buferable.\n");