vsync bugfix + refactoring
authornotaz <notasas@gmail.com>
Fri, 7 Aug 2009 19:43:35 +0000 (19:43 +0000)
committernotaz <notasas@gmail.com>
Fri, 7 Aug 2009 19:43:35 +0000 (19:43 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@738 be3aeb3a-fb24-0410-a615-afba39da0efa

platform/common/emu.c
platform/common/emu.h
platform/gp2x/emu.c
platform/gp2x/menu.c
platform/gp2x/soc_pollux.c

index 4341d6a..118dc38 100644 (file)
@@ -1276,9 +1276,6 @@ void emu_loop(void)
        if (PicoAHW & PAHW_MCD)\r
                PicoCDBufferInit();\r
 \r
-       if (currentConfig.EmuOpt & EOPT_PSYNC)\r
-               plat_video_wait_vsync();\r
-\r
        pemu_loop_prep();\r
 \r
        timestamp_fps = get_ticks();\r
@@ -1286,6 +1283,8 @@ void emu_loop(void)
 \r
        frames_done = frames_shown = pframes_done = 0;\r
 \r
+       plat_video_wait_vsync();\r
+\r
        /* loop with resync every 1 sec. */\r
        while (engineState == PGS_Running)\r
        {\r
@@ -1414,12 +1413,9 @@ void emu_loop(void)
                        if (diff < diff_lim)\r
                        {\r
                                // we are too fast\r
-                               if (currentConfig.EmuOpt & EOPT_PSYNC) {\r
-                                       if (diff_lim - diff > target_frametime/2)\r
-                                               plat_wait_till_us(timestamp_base + target_frametime/4);\r
+                               plat_wait_till_us(timestamp_base + diff_lim - target_frametime / 4);\r
+                               if (currentConfig.EmuOpt & EOPT_VSYNC)\r
                                        plat_video_wait_vsync();\r
-                               } else\r
-                                       plat_wait_till_us(timestamp_base + diff_lim);\r
                        }\r
                }\r
 \r
index 192d268..2f5357a 100644 (file)
@@ -32,7 +32,7 @@ extern int g_screen_height;
 #define EOPT_EN_CD_LEDS   (1<<10)
 #define EOPT_CONFIRM_LOAD (1<<11)
 #define EOPT_A_SN_GAMMA   (1<<12)
-#define EOPT_PSYNC        (1<<13)
+#define EOPT_VSYNC        (1<<13)
 #define EOPT_GIZ_SCANLN   (1<<14)
 #define EOPT_GIZ_DBLBUF   (1<<15)
 #define EOPT_VSYNC_MODE   (1<<16)
index acc3881..3245075 100644 (file)
@@ -756,6 +756,9 @@ void pemu_loop_prep(void)
 {\r
        static int gp2x_old_clock = -1, EmuOpt_old = 0, pal_old = 0;\r
        static int gp2x_old_gamma = 100;\r
+       gp2x_soc_t soc;\r
+\r
+       soc = soc_detect();\r
 \r
        if ((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_RAM_TIMINGS) {\r
                if (currentConfig.EmuOpt & EOPT_RAM_TIMINGS)\r
@@ -773,16 +776,16 @@ void pemu_loop_prep(void)
                printf(" done\n");\r
        }\r
 \r
-       if (gp2x_old_gamma != currentConfig.gamma || (EmuOpt_old&0x1000) != (currentConfig.EmuOpt&0x1000)) {\r
-               set_lcd_gamma(currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
+       if (gp2x_old_gamma != currentConfig.gamma || ((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_A_SN_GAMMA)) {\r
+               set_lcd_gamma(currentConfig.gamma, !!(currentConfig.EmuOpt & EOPT_A_SN_GAMMA));\r
                gp2x_old_gamma = currentConfig.gamma;\r
                printf("updated gamma to %i, A_SN's curve: %i\n", currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
        }\r
 \r
-       if (((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_PSYNC) || Pico.m.pal != pal_old) {\r
-               if (currentConfig.EmuOpt & EOPT_PSYNC)\r
+       if (((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_VSYNC) || Pico.m.pal != pal_old) {\r
+               if ((currentConfig.EmuOpt & EOPT_VSYNC) || soc == SOCID_POLLUX)\r
                        set_lcd_custom_rate(Pico.m.pal);\r
-               else\r
+               else if (EmuOpt_old & EOPT_VSYNC)\r
                        unset_lcd_custom_rate();\r
        }\r
 \r
index 5500529..e8908d2 100644 (file)
@@ -89,7 +89,7 @@ static const char *mgn_aopt_gamma(menu_id id, int *offs)
        mee_onoff     ("Tearing Fix",              MA_OPT_TEARING_FIX,    currentConfig.EmuOpt, EOPT_WIZ_TEAR_FIX), \
        mee_range_cust("Gamma correction",         MA_OPT2_GAMMA,         currentConfig.gamma, 1, 300, mgn_aopt_gamma), \
        mee_onoff     ("A_SN's gamma curve",       MA_OPT2_A_SN_GAMMA,    currentConfig.EmuOpt, EOPT_A_SN_GAMMA), \
-       mee_onoff     ("Perfect vsync",            MA_OPT2_VSYNC,         currentConfig.EmuOpt, EOPT_PSYNC),
+       mee_onoff     ("Vsync",                    MA_OPT2_VSYNC,         currentConfig.EmuOpt, EOPT_VSYNC),
 
 #define MENU_GP2X_OPTIONS_ADV \
        mee_onoff     ("Use second CPU for sound", MA_OPT_ARM940_SOUND,   PicoOpt, POPT_EXT_FM), \
index 2cda031..922305a 100644 (file)
@@ -34,6 +34,17 @@ static unsigned int pllsetreg0;
 static int last_pal_setting = 0;
 
 
+/* misc */
+static void pollux_set_fromenv(const char *env_var)
+{
+       const char *set_string;
+       set_string = getenv(env_var);
+       if (set_string)
+               pollux_set(memregs, set_string);
+       else
+               printf("env var %s not defined.\n", env_var);
+}
+
 /* video stuff */
 static void pollux_video_flip(int buf_count)
 {
@@ -62,6 +73,7 @@ static void gp2x_video_changemode_ll_(int bpp)
        int code = 0, bytes = 2;
        int rot_cmd[2] = { 0, 0 };
        unsigned int r;
+       char buff[32];
        int ret;
 
        if (bpp == prev_bpp)
@@ -79,7 +91,8 @@ static void gp2x_video_changemode_ll_(int bpp)
        memregl[0x4000>>2] |= 1 << 3;
 
        /* the above ioctl resets LCD timings, so set them here */
-       set_lcd_custom_rate(last_pal_setting);
+       snprintf(buff, sizeof(buff), "POLLUX_LCD_TIMINGS_%s", last_pal_setting ? "PAL" : "NTSC");
+       pollux_set_fromenv(buff);
 
        switch (abs(bpp))
        {
@@ -141,17 +154,6 @@ static void gp2x_set_cpuclk_(unsigned int mhz)
        cpuclk_was_changed = 1;
 }
 
-/* misc */
-static void pollux_set_fromenv(const char *env_var)
-{
-       const char *set_string;
-       set_string = getenv(env_var);
-       if (set_string)
-               pollux_set(memregs, set_string);
-       else
-               printf("env var %s not defined.\n", env_var);
-}
-
 /* RAM timings */
 static void set_ram_timings_(void)
 {
@@ -175,10 +177,7 @@ static void unset_ram_timings_(void)
 /* LCD refresh */
 static void set_lcd_custom_rate_(int is_pal)
 {
-       char buff[32];
-
-       snprintf(buff, sizeof(buff), "POLLUX_LCD_TIMINGS_%s", is_pal ? "PAL" : "NTSC");
-       pollux_set_fromenv(buff);
+       /* just remember PAL/NTSC. We always set timings in _changemode_ll() */
        last_pal_setting = is_pal;
 }