pandora: use quad buffering so that ff doesn't tear
[picodrive.git] / platform / common / emu.c
index e7a9912..1573d12 100644 (file)
@@ -10,7 +10,7 @@
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <stdarg.h>\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
 #include <unistd.h>\r
 #endif\r
 \r
 #include <pico/pico_int.h>\r
 #include <pico/patch.h>\r
 \r
+#ifndef _WIN32\r
+#define PATH_SEP      "/"\r
+#define PATH_SEP_C    '/'\r
+#else\r
+#define PATH_SEP      "\\"\r
+#define PATH_SEP_C    '\\'\r
+#endif\r
 \r
 #define STATUS_MSG_TIMEOUT 2000\r
 \r
 void *g_screen_ptr;\r
 \r
-#if !SCREEN_SIZE_FIXED\r
-int g_screen_width  = SCREEN_WIDTH;\r
-int g_screen_height = SCREEN_HEIGHT;\r
-#endif\r
+int g_screen_width  = 320;\r
+int g_screen_height = 240;\r
 \r
 char *PicoConfigFile = "config.cfg";\r
 currentConfig_t currentConfig, defaultConfig;\r
 int state_slot = 0;\r
 int config_slot = 0, config_slot_current = 0;\r
 int pico_pen_x = 320/2, pico_pen_y = 240/2;\r
-int pico_inp_mode = 0;\r
+int pico_inp_mode;\r
+int flip_after_sync;\r
 int engineState = PGS_Menu;\r
 \r
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];\r
@@ -548,6 +554,8 @@ void emu_prep_defconfig(void)
        defaultConfig.gamma = 100;\r
        defaultConfig.scaling = 0;\r
        defaultConfig.turbo_rate = 15;\r
+       defaultConfig.msh2_khz = PICO_MSH2_HZ / 1000;\r
+       defaultConfig.ssh2_khz = PICO_SSH2_HZ / 1000;\r
 \r
        // platform specific overrides\r
        pemu_prep_defconfig();\r
@@ -561,8 +569,6 @@ void emu_set_defconfig(void)
        PicoRegionOverride = currentConfig.s_PicoRegion;\r
        PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
        PicoCDBuffers = currentConfig.s_PicoCDBuffers;\r
-       p32x_msh2_multiplier = MSH2_MULTI_DEFAULT;\r
-       p32x_ssh2_multiplier = SSH2_MULTI_DEFAULT;\r
 }\r
 \r
 int emu_read_config(const char *rom_fname, int no_defaults)\r
@@ -649,7 +655,7 @@ int emu_write_config(int is_game)
        lprintf("emu_write_config: %s ", cfg);\r
        ret = config_write(cfg);\r
        if (write_lrom) config_writelrom(cfg);\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
        sync();\r
 #endif\r
        lprintf((ret == 0) ? "(ok)\n" : "(failed)\n");\r
@@ -859,7 +865,7 @@ int emu_save_load_game(int load, int sram)
                                ret = fwrite(sram_data, 1, sram_size, sramFile);\r
                                ret = (ret != sram_size) ? -1 : 0;\r
                                fclose(sramFile);\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
                                sync();\r
 #endif\r
                        }\r
@@ -870,7 +876,7 @@ int emu_save_load_game(int load, int sram)
        {\r
                ret = PicoState(saveFname, !load);\r
                if (!ret) {\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
                        if (!load) sync();\r
 #endif\r
                        emu_status_msg(load ? "STATE LOADED" : "STATE SAVED");\r
@@ -1198,7 +1204,7 @@ void emu_finish(void)
                char cfg[512];\r
                make_config_cfg(cfg);\r
                config_writelrom(cfg);\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
                sync();\r
 #endif\r
        }\r
@@ -1364,10 +1370,8 @@ void emu_loop(void)
                        sprintf(fpsbuff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2);\r
                        printf("%s\n", fpsbuff);\r
 #else\r
-                       if (currentConfig.EmuOpt & EOPT_SHOW_FPS) {\r
-                               sprintf(fpsbuff, "%02i/%02i", frames_shown, frames_done);\r
-                               if (fpsbuff[5] == 0) { fpsbuff[5] = fpsbuff[6] = ' '; fpsbuff[7] = 0; }\r
-                       }\r
+                       if (currentConfig.EmuOpt & EOPT_SHOW_FPS)\r
+                               sprintf(fpsbuff, "%02i/%02i  ", frames_shown, frames_done);\r
 #endif\r
                        frames_shown = frames_done = 0;\r
                        timestamp_fps += ms_to_ticks(1000);\r
@@ -1426,7 +1430,8 @@ void emu_loop(void)
                PicoFrame();\r
                pemu_finalize_frame(fpsbuff, notice_msg);\r
 \r
-               // plat_video_flip();\r
+               if (!flip_after_sync)\r
+                       plat_video_flip();\r
 \r
                /* frame limiter */\r
                if (!reset_timing && !(currentConfig.EmuOpt & (EOPT_NO_FRMLIMIT|EOPT_EXT_FRMLIMIT)))\r
@@ -1444,9 +1449,8 @@ void emu_loop(void)
                        }\r
                }\r
 \r
-               // XXX: for some plats it might be better to flip before vsync\r
-               // (due to shadow registers in display hw)\r
-               plat_video_flip();\r
+               if (flip_after_sync)\r
+                       plat_video_flip();\r
 \r
                pframes_done++; frames_done++; frames_shown++;\r
 \r