aboutsummaryrefslogtreecommitdiff
path: root/patches/picodrive/0001-frameskip-interval.patch
blob: 29b4b246df50d7ba3d797bd3ec6728b5e50335dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
diff --git a/platform/libretro/libretro.c b/platform/libretro/libretro.c
index 3c0f726..84aa5f1 100644
--- a/platform/libretro/libretro.c
+++ b/platform/libretro/libretro.c
@@ -137,13 +137,11 @@ char **g_argv;
 static unsigned frameskip_type             = 0;
 static unsigned frameskip_threshold        = 0;
 static uint16_t frameskip_counter          = 0;
+static unsigned frameskip_interval         = 0;
 
 static bool retro_audio_buff_active        = false;
 static unsigned retro_audio_buff_occupancy = 0;
 static bool retro_audio_buff_underrun      = false;
-/* Maximum number of consecutive frames that
- * can be skipped */
-#define FRAMESKIP_MAX 60
 
 static unsigned audio_latency              = 0;
 static bool update_audio_latency           = false;
@@ -1982,7 +1980,7 @@ static void update_variables(bool first_run)
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
       if (strcmp(var.value, "auto") == 0)
          frameskip_type = 1;
-      else if (strcmp(var.value, "manual") == 0)
+      else if (strcmp(var.value, "auto_threshold") == 0)
          frameskip_type = 2;
    }
 
@@ -1991,6 +1989,11 @@ static void update_variables(bool first_run)
    var.value           = NULL;
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
       frameskip_threshold = strtol(var.value, NULL, 10);
+   frameskip_interval  = 4;
+   var.key             = "picodrive_frameskip_interval";
+   var.value           = NULL;
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+      frameskip_interval = strtol(var.value, NULL, 10);
 
    old_vout_format = vout_format;
    var.value = NULL;
@@ -2099,7 +2102,7 @@ void retro_run(void)
             break;
       }
 
-      if (!PicoIn.skipFrame || (frameskip_counter >= FRAMESKIP_MAX)) {
+      if (!PicoIn.skipFrame || (frameskip_counter >= frameskip_interval)) {
          PicoIn.skipFrame  = 0;
          frameskip_counter = 0;
       } else
@@ -2284,6 +2287,7 @@ void retro_init(void)
    frameskip_type             = 0;
    frameskip_threshold        = 0;
    frameskip_counter          = 0;
+   frameskip_interval         = 0;
    retro_audio_buff_active    = false;
    retro_audio_buff_occupancy = 0;
    retro_audio_buff_underrun  = false;
diff --git a/platform/libretro/libretro_core_options.h b/platform/libretro/libretro_core_options.h
index 9cd2f85..d2ebede 100644
--- a/platform/libretro/libretro_core_options.h
+++ b/platform/libretro/libretro_core_options.h
@@ -340,13 +340,13 @@ struct retro_core_option_v2_definition option_defs_us[] = {
       "picodrive_frameskip",
       "Frameskip",
       NULL,
-      "Skip frames to avoid audio buffer under-run (crackling). Improves performance at the expense of visual smoothness. 'Auto' skips frames when advised by the frontend. 'Manual' utilises the 'Frameskip Threshold (%)' setting.",
+      "Skip frames to avoid audio buffer under-run (crackling). Improves performance at the expense of visual smoothness. 'Auto' skips frames when advised by the frontend. 'Threshold' utilises the 'Frameskip Threshold (%)' setting.",
       NULL,
       "performance",
       {
-         { "disabled", NULL },
-         { "auto",     "Auto" },
-         { "manual",   "Manual" },
+         { "disabled",       NULL },
+         { "auto",           "Auto" },
+         { "auto_threshold", "Threshold" },
          { NULL, NULL },
       },
       "disabled"
@@ -355,7 +355,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
       "picodrive_frameskip_threshold",
       "Frameskip Threshold (%)",
       NULL,
-      "When 'Frameskip' is set to 'Manual', specifies the audio buffer occupancy threshold (percentage) below which frames will be skipped. Higher values reduce the risk of crackling by causing frames to be dropped more frequently.",
+      "When 'Frameskip' is set to 'Threshold', specifies the audio buffer occupancy threshold (percentage) below which frames will be skipped. Higher values reduce the risk of crackling by causing frames to be dropped more frequently.",
       NULL,
       "performance",
       {
@@ -379,6 +379,28 @@ struct retro_core_option_v2_definition option_defs_us[] = {
       },
       "33"
    },
+   {
+      "picodrive_frameskip_interval",
+      "Frameskip Interval",
+      NULL,
+      "The maximum number of frames that can be skipped before a new frame is rendered.",
+      NULL,
+      "performance",
+      {
+         { "1",  NULL },
+         { "2",  NULL },
+         { "3",  NULL },
+         { "4",  NULL },
+         { "5",  NULL },
+         { "6",  NULL },
+         { "7",  NULL },
+         { "8",  NULL },
+         { "9",  NULL },
+         { "10", NULL },
+         { NULL, NULL },
+      },
+      "3"
+   },
    {
       "picodrive_sprlim",
       "No Sprite Limit",