new 32x renderers, auto fskip change, massive refactoring
[libpicofe.git] / common / emu.c
index f86526c..786a026 100644 (file)
@@ -1116,7 +1116,7 @@ static void emu_tray_close(void)
 \r
 void emu_32x_startup(void)\r
 {\r
-       plat_video_toggle_renderer(0, 1, 0);\r
+       plat_video_toggle_renderer(0, 0);\r
        system_announce();\r
 }\r
 \r
@@ -1247,9 +1247,9 @@ static void run_events_ui(unsigned int which)
                        PicoStateProgressCB = NULL;\r
                }\r
        }\r
-       if ((which & PEV_SWITCH_RND) && !(PicoAHW & PAHW_32X))\r
+       if (which & PEV_SWITCH_RND)\r
        {\r
-               plat_video_toggle_renderer(1, 0, 0);\r
+               plat_video_toggle_renderer(1, 0);\r
        }\r
        if (which & (PEV_SSLOT_PREV|PEV_SSLOT_NEXT))\r
        {\r
@@ -1493,17 +1493,15 @@ void emu_loop(void)
                {\r
                        if ((currentConfig.EmuOpt & EOPT_NO_FRMLIMIT) && currentConfig.Frameskip >= 0)\r
                                pframes_done = 0;\r
-                       else {\r
+                       else\r
                                pframes_done -= target_fps;\r
-                               /* don't allow it to drift during heavy slowdowns */\r
-                               if (pframes_done < -5) {\r
-                                       reset_timing = 1;\r
-                                       continue;\r
-                               }\r
-                               if (pframes_done < -2)\r
-                                       pframes_done = -2;\r
+                       if (pframes_done < -2) {\r
+                               /* don't drag more than 2 frames behind */\r
+                               pframes_done = -2;\r
+                               timestamp_base = timestamp - 2 * target_frametime;\r
                        }\r
-                       timestamp_base += ms_to_ticks(1000);\r
+                       else\r
+                               timestamp_base += ms_to_ticks(1000);\r
                }\r
 \r
                diff = timestamp - timestamp_base;\r
@@ -1528,15 +1526,13 @@ void emu_loop(void)
                else if (diff > diff_lim)\r
                {\r
                        /* no time left for this frame - skip */\r
-                       if (diff - diff_lim >= ms_to_ticks(200)) {\r
-                               /* if too much behind, reset instead */\r
-                               reset_timing = 1;\r
+                       /* limit auto frameskip to 8 */\r
+                       if (frames_done / 8 <= frames_shown) {\r
+                               emu_update_input();\r
+                               skip_frame(diff < diff_lim + target_frametime * 16);\r
+                               pframes_done++; frames_done++;\r
                                continue;\r
                        }\r
-                       emu_update_input();\r
-                       skip_frame(diff < diff_lim + target_frametime * 2);\r
-                       pframes_done++; frames_done++;\r
-                       continue;\r
                }\r
 \r
                emu_update_input();\r