From b7d64dbdb78425b501093dfb137072459b5b3f0f Mon Sep 17 00:00:00 2001
From: notaz <notasas@gmail.com>
Date: Sun, 28 Jul 2013 16:45:13 +0300
Subject: [PATCH] tune flip calls and frame setup

for pandora, mostly
---
 pico/draw.c             | 10 +++++-----
 platform/common/emu.c   | 11 ++++++-----
 platform/common/emu.h   |  1 +
 platform/gp2x/plat.c    |  1 +
 platform/pandora/plat.c |  5 ++---
 5 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/pico/draw.c b/pico/draw.c
index d24d5d79..ede11f5d 100644
--- a/pico/draw.c
+++ b/pico/draw.c
@@ -1424,11 +1424,6 @@ PICO_INTERNAL void PicoFrameStart(void)
     lines = 240;
   }
 
-  HighCol = HighColBase + offs * HighColIncrement;
-  DrawLineDest = (char *)DrawLineDestBase + offs * DrawLineDestIncrement;
-  DrawScanline = 0;
-  skip_next_line = 0;
-
   if (rendstatus != rendstatus_old || lines != rendlines) {
     rendlines = lines;
     // mode_change() might reset rendstatus_old by calling SetColorFormat
@@ -1437,6 +1432,11 @@ PICO_INTERNAL void PicoFrameStart(void)
     rendstatus_old = rendstatus;
   }
 
+  HighCol = HighColBase + offs * HighColIncrement;
+  DrawLineDest = (char *)DrawLineDestBase + offs * DrawLineDestIncrement;
+  DrawScanline = 0;
+  skip_next_line = 0;
+
   if (PicoOpt & POPT_ALT_RENDERER)
     return;
 
diff --git a/platform/common/emu.c b/platform/common/emu.c
index b828595f..4098bd25 100644
--- a/platform/common/emu.c
+++ b/platform/common/emu.c
@@ -48,7 +48,8 @@ currentConfig_t currentConfig, defaultConfig;
 int state_slot = 0;
 int config_slot = 0, config_slot_current = 0;
 int pico_pen_x = 320/2, pico_pen_y = 240/2;
-int pico_inp_mode = 0;
+int pico_inp_mode;
+int flip_after_sync;
 int engineState = PGS_Menu;
 
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];
@@ -1431,7 +1432,8 @@ void emu_loop(void)
 		PicoFrame();
 		pemu_finalize_frame(fpsbuff, notice_msg);
 
-		// plat_video_flip();
+		if (!flip_after_sync)
+			plat_video_flip();
 
 		/* frame limiter */
 		if (!reset_timing && !(currentConfig.EmuOpt & (EOPT_NO_FRMLIMIT|EOPT_EXT_FRMLIMIT)))
@@ -1449,9 +1451,8 @@ void emu_loop(void)
 			}
 		}
 
-		// XXX: for some plats it might be better to flip before vsync
-		// (due to shadow registers in display hw)
-		plat_video_flip();
+		if (flip_after_sync)
+			plat_video_flip();
 
 		pframes_done++; frames_done++; frames_shown++;
 
diff --git a/platform/common/emu.h b/platform/common/emu.h
index d721f94a..836d7d4b 100644
--- a/platform/common/emu.h
+++ b/platform/common/emu.h
@@ -82,6 +82,7 @@ extern int state_slot;
 extern int config_slot, config_slot_current;
 extern unsigned char *movie_data;
 extern int reset_timing;
+extern int flip_after_sync;
 
 #define PICO_PEN_ADJUST_X 4
 #define PICO_PEN_ADJUST_Y 2
diff --git a/platform/gp2x/plat.c b/platform/gp2x/plat.c
index 88154535..2a3b0794 100644
--- a/platform/gp2x/plat.c
+++ b/platform/gp2x/plat.c
@@ -202,6 +202,7 @@ void plat_init(void)
 		in_set_config(in_name_to_id("evdev:pollux-analog"), IN_CFG_KEY_NAMES,
 				caanoo_keys, sizeof(caanoo_keys));
 
+	flip_after_sync = 1;
 	gp2x_menu_init();
 }
 
diff --git a/platform/pandora/plat.c b/platform/pandora/plat.c
index 72c63aa3..a9fa9920 100644
--- a/platform/pandora/plat.c
+++ b/platform/pandora/plat.c
@@ -300,9 +300,6 @@ void emu_video_mode_change(int start_line, int line_count, int is_32cols)
 	if (doing_bg_frame)
 		return;
 
-	PicoDrawSetOutFormat(PDF_RGB555, 1);
-	PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
-
 	if (is_32cols) {
 		fb_w = 256;
 		fb_left = fb_right = 32;
@@ -353,6 +350,8 @@ void emu_video_mode_change(int start_line, int line_count, int is_32cols)
 	vout_fbdev_clear(layer_fb);
 	vout_fbdev_resize(layer_fb, fb_w, fb_h, 16, fb_left, fb_right, fb_top, fb_bottom, 3);
 	plat_video_flip();
+
+	PicoDrawSetOutFormat(PDF_RGB555, 0);
 }
 
 void plat_video_loop_prepare(void)
-- 
2.39.5