1 #define RARCH_TIMER_TICK(_timer, current_time) \
2    _timer.current    = current_time; \
3    _timer.timeout_us = (_timer.timeout_end - _timer.current) \
4 
5 #define RARCH_TIMER_END(_timer) \
6    _timer.timer_end   = true; \
7    _timer.timer_begin = false; \
8    _timer.timeout_end = 0
9 
10 #define RARCH_TIMER_BEGIN_NEW_TIME_USEC(_timer, current_usec, timeout_usec) \
11    _timer.timeout_us  = timeout_usec; \
12    _timer.current     = current_usec; \
13    _timer.timeout_end = _timer.current + _timer.timeout_us
14 
15 #define RARCH_TIMER_GET_TIMEOUT(_timer) ((int)(_timer.timeout_us / 1000000))
16 
17 #define RARCH_TIMER_HAS_EXPIRED(_timer) ((_timer.timeout_us <= 0) ? true : false)
18 
19 #define DRIVERS_CMD_ALL \
20       ( DRIVER_AUDIO_MASK \
21       | DRIVER_VIDEO_MASK \
22       | DRIVER_INPUT_MASK \
23       | DRIVER_CAMERA_MASK \
24       | DRIVER_LOCATION_MASK \
25       | DRIVER_MENU_MASK \
26       | DRIVERS_VIDEO_INPUT_MASK \
27       | DRIVER_BLUETOOTH_MASK \
28       | DRIVER_WIFI_MASK \
29       | DRIVER_LED_MASK \
30       | DRIVER_MIDI_MASK )
31 
32 #define DRIVERS_CMD_ALL_BUT_MENU \
33       ( DRIVER_AUDIO_MASK \
34       | DRIVER_VIDEO_MASK \
35       | DRIVER_INPUT_MASK \
36       | DRIVER_CAMERA_MASK \
37       | DRIVER_LOCATION_MASK \
38       | DRIVERS_VIDEO_INPUT_MASK \
39       | DRIVER_BLUETOOTH_MASK \
40       | DRIVER_WIFI_MASK \
41       | DRIVER_LED_MASK \
42       | DRIVER_MIDI_MASK )
43 
44 
45 #define _PSUPP(var, name, desc) printf("  %s:\n\t\t%s: %s\n", name, desc, var ? "yes" : "no")
46 
47 #define FAIL_CPU(p_rarch, simd_type) do { \
48    RARCH_ERR(simd_type " code is compiled in, but CPU does not support this feature. Cannot continue.\n"); \
49    retroarch_fail(p_rarch, 1, "validate_cpu_features()"); \
50 } while (0)
51 
52 #ifdef HAVE_ZLIB
53 #define DEFAULT_EXT "zip"
54 #else
55 #define DEFAULT_EXT ""
56 #endif
57 
58 #define SHADER_FILE_WATCH_DELAY_MSEC 500
59 #define HOLD_BTN_DELAY_SEC 2
60 
61 #define QUIT_DELAY_USEC 3 * 1000000 /* 3 seconds */
62 
63 #define DEBUG_INFO_FILENAME "debug_info.txt"
64 
65 #define MAGIC_INDEX        0
66 #define SERIALIZER_INDEX   1
67 #define CRC_INDEX          2
68 #define STATE_SIZE_INDEX   3
69 
70 #ifdef HAVE_BSV_MOVIE
71 #define BSV_MAGIC          0x42535631
72 
73 #define BSV_MOVIE_IS_PLAYBACK_ON() (p_rarch->bsv_movie_state_handle && p_rarch->bsv_movie_state.movie_playback)
74 #define BSV_MOVIE_IS_PLAYBACK_OFF() (p_rarch->bsv_movie_state_handle && !p_rarch->bsv_movie_state.movie_playback)
75 #endif
76 
77 #define MEASURE_FRAME_TIME_SAMPLES_COUNT (2 * 1024)
78 
79 #define TIME_TO_FPS(last_time, new_time, frames) ((1000000.0f * (frames)) / ((new_time) - (last_time)))
80 
81 #define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024)
82 
83 #define MENU_SOUND_FORMATS "ogg|mod|xm|s3m|mp3|flac|wav"
84 
85 #define MIDI_DRIVER_BUF_SIZE 4096
86 
87 /**
88  * db_to_gain:
89  * @db          : Decibels.
90  *
91  * Converts decibels to voltage gain.
92  *
93  * Returns: voltage gain value.
94  **/
95 #define DB_TO_GAIN(db) (powf(10.0f, (db) / 20.0f))
96 
97 #define DEFAULT_NETWORK_GAMEPAD_PORT 55400
98 #define UDP_FRAME_PACKETS 16
99 
100 #ifdef HAVE_OVERLAY
101 #define OVERLAY_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1)
102 #define OVERLAY_SET_KEY(state, key) (state)->keys[(key) / 32] |= 1 << ((key) % 32)
103 
104 #define MAX_VISIBILITY 32
105 #endif
106 
107 #define DECLARE_BIND(base, bind, desc) { #base, desc, 0, bind, true }
108 #define DECLARE_META_BIND(level, base, bind, desc) { #base, desc, level, bind, true }
109 
110 #ifdef HAVE_THREADS
111 #define VIDEO_DRIVER_IS_THREADED_INTERNAL() ((!video_driver_is_hw_context() && p_rarch->video_driver_threaded) ? true : false)
112 #else
113 #define VIDEO_DRIVER_IS_THREADED_INTERNAL() (false)
114 #endif
115 
116 #ifdef HAVE_THREADS
117 #define VIDEO_DRIVER_LOCK() \
118    if (p_rarch->display_lock) \
119       slock_lock(p_rarch->display_lock)
120 
121 #define VIDEO_DRIVER_UNLOCK() \
122    if (p_rarch->display_lock) \
123       slock_unlock(p_rarch->display_lock)
124 
125 #define VIDEO_DRIVER_CONTEXT_LOCK() \
126    if (p_rarch->context_lock) \
127       slock_lock(p_rarch->context_lock)
128 
129 #define VIDEO_DRIVER_CONTEXT_UNLOCK() \
130    if (p_rarch->context_lock) \
131       slock_unlock(p_rarch->context_lock)
132 
133 #define VIDEO_DRIVER_LOCK_FREE() \
134    slock_free(p_rarch->display_lock); \
135    slock_free(p_rarch->context_lock); \
136    p_rarch->display_lock = NULL; \
137    p_rarch->context_lock = NULL
138 
139 #define VIDEO_DRIVER_THREADED_LOCK(is_threaded) \
140    if (is_threaded) \
141       VIDEO_DRIVER_LOCK()
142 
143 #define VIDEO_DRIVER_THREADED_UNLOCK(is_threaded) \
144    if (is_threaded) \
145       VIDEO_DRIVER_UNLOCK()
146 #else
147 #define VIDEO_DRIVER_LOCK()            ((void)0)
148 #define VIDEO_DRIVER_UNLOCK()          ((void)0)
149 #define VIDEO_DRIVER_LOCK_FREE()       ((void)0)
150 #define VIDEO_DRIVER_THREADED_LOCK(is_threaded)   ((void)0)
151 #define VIDEO_DRIVER_THREADED_UNLOCK(is_threaded) ((void)0)
152 #define VIDEO_DRIVER_CONTEXT_LOCK()    ((void)0)
153 #define VIDEO_DRIVER_CONTEXT_UNLOCK()  ((void)0)
154 #endif
155 
156 #ifdef HAVE_THREADS
157 #define VIDEO_DRIVER_GET_PTR_INTERNAL(p_rarch) ((VIDEO_DRIVER_IS_THREADED_INTERNAL()) ? video_thread_get_ptr(p_rarch) : p_rarch->video_driver_data)
158 #else
159 #define VIDEO_DRIVER_GET_PTR_INTERNAL(p_rarch) (p_rarch->video_driver_data)
160 #endif
161 
162 #define VIDEO_DRIVER_GET_HW_CONTEXT_INTERNAL(p_rarch) (&p_rarch->hw_render)
163 
164 #ifdef HAVE_THREADS
165 #define RUNLOOP_MSG_QUEUE_LOCK(runloop) slock_lock(runloop.msg_queue_lock)
166 #define RUNLOOP_MSG_QUEUE_UNLOCK(runloop) slock_unlock(runloop.msg_queue_lock)
167 #else
168 #define RUNLOOP_MSG_QUEUE_LOCK(p_runloop)
169 #define RUNLOOP_MSG_QUEUE_UNLOCK(p_runloop)
170 #endif
171 
172 #ifdef HAVE_BSV_MOVIE
173 #define BSV_MOVIE_IS_EOF(p_rarch) || (p_rarch->bsv_movie_state.movie_end && p_rarch->bsv_movie_state.eof_exit)
174 #else
175 #define BSV_MOVIE_IS_EOF(p_rarch)
176 #endif
177 
178 /* Time to exit out of the main loop?
179  * Reasons for exiting:
180  * a) Shutdown environment callback was invoked.
181  * b) Quit key was pressed.
182  * c) Frame count exceeds or equals maximum amount of frames to run.
183  * d) Video driver no longer alive.
184  * e) End of BSV movie and BSV EOF exit is true. (TODO/FIXME - explain better)
185  */
186 #define TIME_TO_EXIT(quit_key_pressed) (runloop_state.shutdown_initiated || quit_key_pressed || !is_alive BSV_MOVIE_IS_EOF(p_rarch) || ((runloop_state.max_frames != 0) && (frame_count >= runloop_state.max_frames)) || runloop_exec)
187 
188 /* Depends on ASCII character values */
189 #define ISPRINT(c) (((int)(c) >= ' ' && (int)(c) <= '~') ? 1 : 0)
190 
191 #define INPUT_CONFIG_BIND_MAP_GET(i) ((const struct input_bind_map*)&input_config_bind_map[(i)])
192 
193 #define VIDEO_HAS_FOCUS(p_rarch) (p_rarch->current_video->focus ? (p_rarch->current_video->focus(p_rarch->video_driver_data)) : true)
194 
195 #if HAVE_DYNAMIC
196 #define RUNAHEAD_RUN_SECONDARY(p_rarch) \
197    if (!secondary_core_run_use_last_input(p_rarch)) \
198       p_rarch->runahead_secondary_core_available = false
199 #endif
200 
201 #define RUNAHEAD_RESUME_VIDEO(p_rarch) \
202    if (p_rarch->runahead_video_driver_is_active) \
203       p_rarch->video_driver_active = true; \
204    else \
205       p_rarch->video_driver_active = false
206 
207 #define _PSUPP_BUF(buf, var, name, desc) \
208    strlcat(buf, "  ", sizeof(buf)); \
209    strlcat(buf, name, sizeof(buf)); \
210    strlcat(buf, ":\n\t\t", sizeof(buf)); \
211    strlcat(buf, desc, sizeof(buf)); \
212    strlcat(buf, ": ", sizeof(buf)); \
213    strlcat(buf, var ? "yes\n" : "no\n", sizeof(buf))
214 
215 #define HOTKEY_CHECK(cmd1, cmd2, cond, cond2) \
216    { \
217       static bool old_pressed                   = false; \
218       bool pressed                              = BIT256_GET(current_bits, cmd1); \
219       if (pressed && !old_pressed) \
220          if (cond) \
221             command_event(cmd2, cond2); \
222       old_pressed                               = pressed; \
223    }
224 
225 #define HOTKEY_CHECK3(cmd1, cmd2, cmd3, cmd4, cmd5, cmd6) \
226    { \
227       static bool old_pressed                   = false; \
228       static bool old_pressed2                  = false; \
229       static bool old_pressed3                  = false; \
230       bool pressed                              = BIT256_GET(current_bits, cmd1); \
231       bool pressed2                             = BIT256_GET(current_bits, cmd3); \
232       bool pressed3                             = BIT256_GET(current_bits, cmd5); \
233       if (pressed && !old_pressed) \
234          command_event(cmd2, (void*)(intptr_t)0); \
235       else if (pressed2 && !old_pressed2) \
236          command_event(cmd4, (void*)(intptr_t)0); \
237       else if (pressed3 && !old_pressed3) \
238          command_event(cmd6, (void*)(intptr_t)0); \
239       old_pressed                               = pressed; \
240       old_pressed2                              = pressed2; \
241       old_pressed3                              = pressed3; \
242    }
243 
244 #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD)
245 #define INPUT_REMOTE_KEY_PRESSED(p_rarch, key, port) (p_rarch->remote_st_ptr.buttons[(port)] & (UINT64_C(1) << (key)))
246 #endif
247 
248 /**
249  * check_input_driver_block_hotkey:
250  *
251  * Checks if 'hotkey enable' key is pressed.
252  *
253  * If we haven't bound anything to this,
254  * always allow hotkeys.
255 
256  * If we hold ENABLE_HOTKEY button, block all libretro input to allow
257  * hotkeys to be bound to same keys as RetroPad.
258  **/
259 #define CHECK_INPUT_DRIVER_BLOCK_HOTKEY(normal_bind, autoconf_bind) \
260 ( \
261          (((normal_bind)->key      != RETROK_UNKNOWN) \
262       || ((normal_bind)->mbutton   != NO_BTN) \
263       || ((normal_bind)->joykey    != NO_BTN) \
264       || ((normal_bind)->joyaxis   != AXIS_NONE) \
265       || ((autoconf_bind)->key     != RETROK_UNKNOWN) \
266       || ((autoconf_bind)->joykey  != NO_BTN) \
267       || ((autoconf_bind)->joyaxis != AXIS_NONE)) \
268 )
269 
270 #define INHERIT_JOYAXIS(binds) (((binds)[x_plus].joyaxis == (binds)[x_minus].joyaxis) || (  (binds)[y_plus].joyaxis == (binds)[y_minus].joyaxis))
271 
272 #define MAPPER_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1)
273 #define MAPPER_SET_KEY(state, key) (state)->keys[(key) / 32] |= 1 << ((key) % 32)
274 #define MAPPER_UNSET_KEY(state, key) (state)->keys[(key) / 32] &= ~(1 << ((key) % 32))
275 
276 
277 #ifdef HAVE_MENU
278 #define MENU_LIST_GET(list, idx) ((list) ? ((list)->menu_stack[(idx)]) : NULL)
279 
280 #define MENU_LIST_GET_SELECTION(list, idx) ((list) ? ((list)->selection_buf[(idx)]) : NULL)
281 
282 #define MENU_LIST_GET_STACK_SIZE(list, idx) ((list)->menu_stack[(idx)]->size)
283 
284 #define MENU_ENTRIES_GET_SELECTION_BUF_PTR_INTERNAL(menu_st, idx) ((menu_st->entries.list) ? MENU_LIST_GET_SELECTION(menu_st->entries.list, (unsigned)idx) : NULL)
285 #define MENU_ENTRIES_NEEDS_REFRESH(menu_st) (!(menu_st->entries_nonblocking_refresh || !menu_st->entries_need_refresh))
286 #endif
287 
288 #define CDN_URL "https://cdn.discordapp.com/avatars"
289 
290 #ifdef HAVE_DYNAMIC
291 #define SYMBOL(x) do { \
292    function_t func = dylib_proc(lib_handle_local, #x); \
293    memcpy(&current_core->x, &func, sizeof(func)); \
294    if (!current_core->x) { RARCH_ERR("Failed to load symbol: \"%s\"\n", #x); retroarch_fail(p_rarch, 1, "init_libretro_symbols()"); } \
295 } while (0)
296 #else
297 #define SYMBOL(x) current_core->x = x
298 #endif
299 
300 #define SYMBOL_DUMMY(x) current_core->x = libretro_dummy_##x
301 
302 #ifdef HAVE_FFMPEG
303 #define SYMBOL_FFMPEG(x) current_core->x = libretro_ffmpeg_##x
304 #endif
305 
306 #ifdef HAVE_MPV
307 #define SYMBOL_MPV(x) current_core->x = libretro_mpv_##x
308 #endif
309 
310 #ifdef HAVE_IMAGEVIEWER
311 #define SYMBOL_IMAGEVIEWER(x) current_core->x = libretro_imageviewer_##x
312 #endif
313 
314 #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD)
315 #define SYMBOL_NETRETROPAD(x) current_core->x = libretro_netretropad_##x
316 #endif
317 
318 #if defined(HAVE_VIDEOPROCESSOR)
319 #define SYMBOL_VIDEOPROCESSOR(x) current_core->x = libretro_videoprocessor_##x
320 #endif
321 
322 #ifdef HAVE_GONG
323 #define SYMBOL_GONG(x) current_core->x = libretro_gong_##x
324 #endif
325 
326 #define CORE_SYMBOLS(x) \
327             x(retro_init); \
328             x(retro_deinit); \
329             x(retro_api_version); \
330             x(retro_get_system_info); \
331             x(retro_get_system_av_info); \
332             x(retro_set_environment); \
333             x(retro_set_video_refresh); \
334             x(retro_set_audio_sample); \
335             x(retro_set_audio_sample_batch); \
336             x(retro_set_input_poll); \
337             x(retro_set_input_state); \
338             x(retro_set_controller_port_device); \
339             x(retro_reset); \
340             x(retro_run); \
341             x(retro_serialize_size); \
342             x(retro_serialize); \
343             x(retro_unserialize); \
344             x(retro_cheat_reset); \
345             x(retro_cheat_set); \
346             x(retro_load_game); \
347             x(retro_load_game_special); \
348             x(retro_unload_game); \
349             x(retro_get_region); \
350             x(retro_get_memory_data); \
351             x(retro_get_memory_size);
352 
353 #define FFMPEG_RECORD_ARG "r:"
354 
355 #ifdef HAVE_DYNAMIC
356 #define DYNAMIC_ARG "L:"
357 #else
358 #define DYNAMIC_ARG
359 #endif
360 
361 #ifdef HAVE_NETWORKING
362 #define NETPLAY_ARG "HC:F:"
363 #else
364 #define NETPLAY_ARG
365 #endif
366 
367 #ifdef HAVE_CONFIGFILE
368 #define CONFIG_FILE_ARG "c:"
369 #else
370 #define CONFIG_FILE_ARG
371 #endif
372 
373 #ifdef HAVE_BSV_MOVIE
374 #define BSV_MOVIE_ARG "P:R:M:"
375 #else
376 #define BSV_MOVIE_ARG
377 #endif
378 
379 #ifdef HAVE_LIBNX
380 #define LIBNX_SWKBD_LIMIT 500 /* enforced by HOS */
381 #endif
382 
383 /* Griffin hack */
384 #ifdef HAVE_QT
385 #ifndef HAVE_MAIN
386 #define HAVE_MAIN
387 #endif
388 #endif
389 
390 #ifdef _WIN32
391 #define PERF_LOG_FMT "[PERF]: Avg (%s): %I64u ticks, %I64u runs.\n"
392 #else
393 #define PERF_LOG_FMT "[PERF]: Avg (%s): %llu ticks, %llu runs.\n"
394 #endif
395 
396 #ifdef HAVE_MENU
397 #define SCROLL_INDEX_SIZE          (2 * (26 + 2) + 1)
398 
399 #define POWERSTATE_CHECK_INTERVAL  (30 * 1000000)
400 #define DATETIME_CHECK_INTERVAL    1000000
401 
402 #define MENU_MAX_BUTTONS           219
403 #define MENU_MAX_AXES              32
404 #define MENU_MAX_HATS              4
405 #define MENU_MAX_MBUTTONS          32 /* Enough to cover largest libretro constant*/
406 #endif
407 
408 /* DRIVERS */
409 
410 audio_driver_t audio_null = {
411    NULL, /* init */
412    NULL, /* write */
413    NULL, /* stop */
414    NULL, /* start */
415    NULL, /* alive */
416    NULL, /* set_nonblock_state */
417    NULL, /* free */
418    NULL, /* use_float */
419    "null",
420    NULL,
421    NULL,
422    NULL, /* write_avail */
423    NULL
424 };
425 
426 static const audio_driver_t *audio_drivers[] = {
427 #ifdef HAVE_ALSA
428    &audio_alsa,
429 #if !defined(__QNX__) && defined(HAVE_THREADS)
430    &audio_alsathread,
431 #endif
432 #endif
433 #ifdef HAVE_TINYALSA
434 	&audio_tinyalsa,
435 #endif
436 #if defined(HAVE_AUDIOIO)
437    &audio_audioio,
438 #endif
439 #if defined(HAVE_OSS) || defined(HAVE_OSS_BSD)
440    &audio_oss,
441 #endif
442 #ifdef HAVE_RSOUND
443    &audio_rsound,
444 #endif
445 #ifdef HAVE_COREAUDIO
446    &audio_coreaudio,
447 #endif
448 #ifdef HAVE_COREAUDIO3
449    &audio_coreaudio3,
450 #endif
451 #ifdef HAVE_AL
452    &audio_openal,
453 #endif
454 #ifdef HAVE_SL
455    &audio_opensl,
456 #endif
457 #ifdef HAVE_ROAR
458    &audio_roar,
459 #endif
460 #ifdef HAVE_JACK
461    &audio_jack,
462 #endif
463 #if defined(HAVE_SDL) || defined(HAVE_SDL2)
464    &audio_sdl,
465 #endif
466 #ifdef HAVE_XAUDIO
467    &audio_xa,
468 #endif
469 #ifdef HAVE_DSOUND
470    &audio_dsound,
471 #endif
472 #ifdef HAVE_WASAPI
473    &audio_wasapi,
474 #endif
475 #ifdef HAVE_PULSE
476    &audio_pulse,
477 #endif
478 #if defined(__PSL1GHT__) || defined(__PS3__)
479    &audio_ps3,
480 #endif
481 #ifdef XENON
482    &audio_xenon360,
483 #endif
484 #ifdef GEKKO
485    &audio_gx,
486 #endif
487 #ifdef WIIU
488    &audio_ax,
489 #endif
490 #ifdef EMSCRIPTEN
491    &audio_rwebaudio,
492 #endif
493 #if defined(PSP) || defined(VITA) || defined(ORBIS)
494   &audio_psp,
495 #endif
496 #if defined(PS2)
497   &audio_ps2,
498 #endif
499 #ifdef _3DS
500    &audio_ctr_csnd,
501    &audio_ctr_dsp,
502 #ifdef HAVE_THREADS
503    &audio_ctr_dsp_thread,
504 #endif
505 #endif
506 #ifdef SWITCH
507    &audio_switch,
508    &audio_switch_thread,
509 #ifdef HAVE_LIBNX
510    &audio_switch_libnx_audren,
511    &audio_switch_libnx_audren_thread,
512 #endif
513 #endif
514    &audio_null,
515    NULL,
516 };
517 
518 static const video_display_server_t dispserv_null = {
519    NULL, /* init */
520    NULL, /* destroy */
521    NULL, /* set_window_opacity */
522    NULL, /* set_window_progress */
523    NULL, /* set_window_decorations */
524    NULL, /* set_resolution */
525    NULL, /* get_resolution_list */
526    NULL, /* get_output_options */
527    NULL, /* set_screen_orientation */
528    NULL, /* get_screen_orientation */
529    NULL, /* get_flags */
530    "null"
531 };
532 
video_null_init(const video_info_t * video,input_driver_t ** input,void ** input_data)533 static void *video_null_init(const video_info_t *video,
534       input_driver_t **input, void **input_data)
535 {
536    *input       = NULL;
537    *input_data = NULL;
538 
539    frontend_driver_install_signal_handler();
540 
541    return (void*)-1;
542 }
543 
video_null_frame(void * data,const void * frame,unsigned frame_width,unsigned frame_height,uint64_t frame_count,unsigned pitch,const char * msg,video_frame_info_t * video_info)544 static bool video_null_frame(void *data, const void *frame,
545       unsigned frame_width, unsigned frame_height, uint64_t frame_count,
546       unsigned pitch, const char *msg, video_frame_info_t *video_info)
547 {
548    return true;
549 }
550 
video_null_free(void * data)551 static void video_null_free(void *data) { }
video_null_set_nonblock_state(void * a,bool b,bool c,unsigned d)552 static void video_null_set_nonblock_state(void *a, bool b, bool c, unsigned d) { }
video_null_alive(void * data)553 static bool video_null_alive(void *data) { return frontend_driver_get_signal_handler_state() != 1; }
video_null_focus(void * data)554 static bool video_null_focus(void *data) { return true; }
video_null_has_windowed(void * data)555 static bool video_null_has_windowed(void *data) { return true; }
video_null_suppress_screensaver(void * data,bool enable)556 static bool video_null_suppress_screensaver(void *data, bool enable) { return false; }
video_null_set_shader(void * data,enum rarch_shader_type type,const char * path)557 static bool video_null_set_shader(void *data,
558       enum rarch_shader_type type, const char *path) { return false; }
559 
560 static video_driver_t video_null = {
561    video_null_init,
562    video_null_frame,
563    video_null_set_nonblock_state,
564    video_null_alive,
565    video_null_focus,
566    video_null_suppress_screensaver,
567    video_null_has_windowed,
568    video_null_set_shader,
569    video_null_free,
570    "null",
571    NULL, /* set_viewport */
572    NULL, /* set_rotation */
573    NULL, /* viewport_info */
574    NULL, /* read_viewport */
575    NULL, /* read_frame_raw */
576 
577 #ifdef HAVE_OVERLAY
578   NULL, /* overlay_interface */
579 #endif
580 #ifdef HAVE_VIDEO_LAYOUT
581    NULL,
582 #endif
583   NULL, /* get_poke_interface */
584 };
585 
586 static const video_driver_t *video_drivers[] = {
587 #ifdef __PSL1GHT__
588    &video_gcm,
589 #endif
590 #ifdef HAVE_VITA2D
591    &video_vita2d,
592 #endif
593 #ifdef HAVE_OPENGL
594    &video_gl2,
595 #endif
596 #if defined(HAVE_OPENGL_CORE)
597    &video_gl_core,
598 #endif
599 #ifdef HAVE_OPENGL1
600    &video_gl1,
601 #endif
602 #ifdef HAVE_VULKAN
603    &video_vulkan,
604 #endif
605 #ifdef HAVE_METAL
606    &video_metal,
607 #endif
608 #ifdef XENON
609    &video_xenon360,
610 #endif
611 #if defined(HAVE_D3D12)
612    &video_d3d12,
613 #endif
614 #if defined(HAVE_D3D11)
615    &video_d3d11,
616 #endif
617 #if defined(HAVE_D3D10)
618    &video_d3d10,
619 #endif
620 #if defined(HAVE_D3D9)
621    &video_d3d9,
622 #endif
623 #if defined(HAVE_D3D8)
624    &video_d3d8,
625 #endif
626 #ifdef PSP
627    &video_psp1,
628 #endif
629 #ifdef PS2
630    &video_ps2,
631 #endif
632 #ifdef _3DS
633    &video_ctr,
634 #endif
635 #ifdef SWITCH
636    &video_switch,
637 #endif
638 #ifdef HAVE_ODROIDGO2
639    &video_oga,
640 #endif
641 #if defined(HAVE_SDL) && !defined(HAVE_SDL_DINGUX)
642    &video_sdl,
643 #endif
644 #ifdef HAVE_SDL2
645    &video_sdl2,
646 #endif
647 #ifdef HAVE_SDL_DINGUX
648 #if defined(RS90)
649    &video_sdl_rs90,
650 #else
651    &video_sdl_dingux,
652 #endif
653 #endif
654 #ifdef HAVE_XVIDEO
655    &video_xvideo,
656 #endif
657 #ifdef GEKKO
658    &video_gx,
659 #endif
660 #ifdef WIIU
661    &video_wiiu,
662 #endif
663 #ifdef HAVE_VG
664    &video_vg,
665 #endif
666 #ifdef HAVE_OMAP
667    &video_omap,
668 #endif
669 #ifdef HAVE_EXYNOS
670    &video_exynos,
671 #endif
672 #ifdef HAVE_DISPMANX
673    &video_dispmanx,
674 #endif
675 #ifdef HAVE_SUNXI
676    &video_sunxi,
677 #endif
678 #ifdef HAVE_PLAIN_DRM
679    &video_drm,
680 #endif
681 #ifdef HAVE_XSHM
682    &video_xshm,
683 #endif
684 #if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
685 #ifdef HAVE_GDI
686    &video_gdi,
687 #endif
688 #endif
689 #ifdef DJGPP
690    &video_vga,
691 #endif
692 #ifdef HAVE_FPGA
693    &video_fpga,
694 #endif
695 #ifdef HAVE_SIXEL
696    &video_sixel,
697 #endif
698 #ifdef HAVE_CACA
699    &video_caca,
700 #endif
701 #ifdef HAVE_NETWORK_VIDEO
702    &video_network,
703 #endif
704    &video_null,
705    NULL,
706 };
707 
708 #ifdef HAVE_VULKAN
709 static const gfx_ctx_driver_t *gfx_ctx_vk_drivers[] = {
710 #if defined(__APPLE__)
711    &gfx_ctx_cocoavk,
712 #endif
713 #if defined(_WIN32) && !defined(__WINRT__)
714    &gfx_ctx_w_vk,
715 #endif
716 #if defined(ANDROID)
717    &gfx_ctx_vk_android,
718 #endif
719 #if defined(HAVE_WAYLAND)
720    &gfx_ctx_vk_wayland,
721 #endif
722 #if defined(HAVE_X11)
723    &gfx_ctx_vk_x,
724 #endif
725 #if defined(HAVE_VULKAN_DISPLAY)
726    &gfx_ctx_khr_display,
727 #endif
728    &gfx_ctx_null,
729    NULL
730 };
731 #endif
732 
733 static const gfx_ctx_driver_t *gfx_ctx_gl_drivers[] = {
734 #if defined(ORBIS)
735    &orbis_ctx,
736 #endif
737 #if defined(HAVE_VITAGL) | defined(HAVE_VITAGLES)
738    &vita_ctx,
739 #endif
740 #if !defined(__PSL1GHT__) && defined(__PS3__)
741    &gfx_ctx_ps3,
742 #endif
743 #if defined(HAVE_LIBNX) && defined(HAVE_OPENGL)
744    &switch_ctx,
745 #endif
746 #if defined(HAVE_VIDEOCORE)
747    &gfx_ctx_videocore,
748 #endif
749 #if defined(HAVE_MALI_FBDEV)
750    &gfx_ctx_mali_fbdev,
751 #endif
752 #if defined(HAVE_VIVANTE_FBDEV)
753    &gfx_ctx_vivante_fbdev,
754 #endif
755 #if defined(HAVE_OPENDINGUX_FBDEV)
756    &gfx_ctx_opendingux_fbdev,
757 #endif
758 #if defined(_WIN32) && !defined(__WINRT__) && (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE))
759    &gfx_ctx_wgl,
760 #endif
761 #if defined(__WINRT__) && defined(HAVE_OPENGLES)
762    &gfx_ctx_uwp,
763 #endif
764 #if defined(HAVE_WAYLAND)
765    &gfx_ctx_wayland,
766 #endif
767 #if defined(HAVE_X11) && !defined(HAVE_OPENGLES)
768 #if defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE)
769    &gfx_ctx_x,
770 #endif
771 #endif
772 #if defined(HAVE_X11) && defined(HAVE_OPENGL) && defined(HAVE_EGL)
773    &gfx_ctx_x_egl,
774 #endif
775 #if defined(HAVE_KMS)
776 #if defined(HAVE_ODROIDGO2)
777    &gfx_ctx_go2_drm,
778 #endif
779    &gfx_ctx_drm,
780 #endif
781 #if defined(ANDROID)
782    &gfx_ctx_android,
783 #endif
784 #if defined(__QNX__)
785    &gfx_ctx_qnx,
786 #endif
787 #if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL)
788 #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
789    &gfx_ctx_cocoagl,
790 #endif
791 #endif
792 #if (defined(HAVE_SDL) || defined(HAVE_SDL2)) && (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE))
793    &gfx_ctx_sdl_gl,
794 #endif
795 #ifdef HAVE_OSMESA
796    &gfx_ctx_osmesa,
797 #endif
798 #ifdef EMSCRIPTEN
799    &gfx_ctx_emscripten,
800 #endif
801    &gfx_ctx_null,
802    NULL
803 };
804 
input_null_init(const char * joypad_driver)805 static void *input_null_init(const char *joypad_driver) { return (void*)-1; }
input_null_poll(void * data)806 static void input_null_poll(void *data) { }
input_null_input_state(void * data,const input_device_driver_t * joypad,const input_device_driver_t * sec_joypad,rarch_joypad_info_t * joypad_info,const struct retro_keybind ** retro_keybinds,bool keyboard_mapping_blocked,unsigned port,unsigned device,unsigned index,unsigned id)807 static int16_t input_null_input_state(
808       void *data,
809       const input_device_driver_t *joypad,
810       const input_device_driver_t *sec_joypad,
811       rarch_joypad_info_t *joypad_info,
812       const struct retro_keybind **retro_keybinds,
813       bool keyboard_mapping_blocked,
814       unsigned port, unsigned device, unsigned index, unsigned id) { return 0; }
input_null_free(void * data)815 static void input_null_free(void *data) { }
input_null_set_sensor_state(void * data,unsigned port,enum retro_sensor_action action,unsigned rate)816 static bool input_null_set_sensor_state(void *data, unsigned port,
817          enum retro_sensor_action action, unsigned rate) { return false; }
input_null_get_sensor_input(void * data,unsigned port,unsigned id)818 static float input_null_get_sensor_input(void *data, unsigned port, unsigned id) { return 0.0; }
input_null_get_capabilities(void * data)819 static uint64_t input_null_get_capabilities(void *data) { return 0; }
input_null_grab_mouse(void * data,bool state)820 static void input_null_grab_mouse(void *data, bool state) { }
input_null_grab_stdin(void * data)821 static bool input_null_grab_stdin(void *data) { return false; }
822 
823 static input_driver_t input_null = {
824    input_null_init,
825    input_null_poll,
826    input_null_input_state,
827    input_null_free,
828    input_null_set_sensor_state,
829    input_null_get_sensor_input,
830    input_null_get_capabilities,
831    "null",
832    input_null_grab_mouse,
833    input_null_grab_stdin
834 };
835 
836 static input_driver_t *input_drivers[] = {
837 #ifdef ORBIS
838    &input_ps4,
839 #endif
840 #if defined(__PSL1GHT__) || defined(__PS3__)
841    &input_ps3,
842 #endif
843 #if defined(SN_TARGET_PSP2) || defined(PSP) || defined(VITA)
844    &input_psp,
845 #endif
846 #if defined(PS2)
847    &input_ps2,
848 #endif
849 #if defined(_3DS)
850    &input_ctr,
851 #endif
852 #if defined(SWITCH)
853    &input_switch,
854 #endif
855 #if defined(HAVE_SDL) || defined(HAVE_SDL2)
856    &input_sdl,
857 #endif
858 #if defined(DINGUX) && defined(HAVE_SDL_DINGUX)
859    &input_sdl_dingux,
860 #endif
861 #ifdef HAVE_DINPUT
862    &input_dinput,
863 #endif
864 #ifdef HAVE_X11
865    &input_x,
866 #endif
867 #ifdef __WINRT__
868    &input_uwp,
869 #endif
870 #ifdef XENON
871    &input_xenon360,
872 #endif
873 #if defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1) || defined(__WINRT__)
874    &input_xinput,
875 #endif
876 #ifdef GEKKO
877    &input_gx,
878 #endif
879 #ifdef WIIU
880    &input_wiiu,
881 #endif
882 #ifdef ANDROID
883    &input_android,
884 #endif
885 #ifdef HAVE_UDEV
886    &input_udev,
887 #endif
888 #if defined(__linux__) && !defined(ANDROID)
889    &input_linuxraw,
890 #endif
891 #if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL)
892    &input_cocoa,
893 #endif
894 #ifdef __QNX__
895    &input_qnx,
896 #endif
897 #ifdef EMSCRIPTEN
898    &input_rwebinput,
899 #endif
900 #ifdef DJGPP
901    &input_dos,
902 #endif
903 #if defined(_WIN32) && !defined(_XBOX) && _WIN32_WINNT >= 0x0501 && !defined(__WINRT__)
904 #ifdef HAVE_WINRAWINPUT
905    /* winraw only available since XP */
906    &input_winraw,
907 #endif
908 #endif
909    &input_null,
910    NULL,
911 };
912 
913 static input_device_driver_t null_joypad = {
914    NULL, /* init */
915    NULL, /* query_pad */
916    NULL, /* destroy */
917    NULL, /* button */
918    NULL, /* state */
919    NULL, /* get_buttons */
920    NULL, /* axis */
921    NULL, /* poll */
922    NULL,
923    NULL, /* name */
924    "null",
925 };
926 
927 static input_device_driver_t *joypad_drivers[] = {
928 #ifdef HAVE_XINPUT
929    &xinput_joypad,
930 #endif
931 #ifdef GEKKO
932    &gx_joypad,
933 #endif
934 #ifdef WIIU
935    &wiiu_joypad,
936 #endif
937 #ifdef _XBOX1
938    &xdk_joypad,
939 #endif
940 #if defined(ORBIS)
941    &ps4_joypad,
942 #endif
943 #if defined(__PSL1GHT__) || defined(__PS3__)
944    &ps3_joypad,
945 #endif
946 #if defined(PSP) || defined(VITA)
947    &psp_joypad,
948 #endif
949 #if defined(PS2)
950    &ps2_joypad,
951 #endif
952 #ifdef _3DS
953    &ctr_joypad,
954 #endif
955 #ifdef SWITCH
956    &switch_joypad,
957 #endif
958 #ifdef HAVE_DINPUT
959    &dinput_joypad,
960 #endif
961 #ifdef HAVE_UDEV
962    &udev_joypad,
963 #endif
964 #if defined(__linux) && !defined(ANDROID)
965    &linuxraw_joypad,
966 #endif
967 #ifdef HAVE_PARPORT
968    &parport_joypad,
969 #endif
970 #ifdef ANDROID
971    &android_joypad,
972 #endif
973 #if defined(HAVE_SDL) || defined(HAVE_SDL2)
974    &sdl_joypad,
975 #endif
976 #if defined(DINGUX) && defined(HAVE_SDL_DINGUX)
977    &sdl_dingux_joypad,
978 #endif
979 #ifdef __QNX__
980    &qnx_joypad,
981 #endif
982 #ifdef HAVE_MFI
983    &mfi_joypad,
984 #endif
985 #ifdef DJGPP
986    &dos_joypad,
987 #endif
988 /* Selecting the HID gamepad driver disables the Wii U gamepad. So while
989  * we want the HID code to be compiled & linked, we don't want the driver
990  * to be selectable in the UI. */
991 #if defined(HAVE_HID) && !defined(WIIU)
992    &hid_joypad,
993 #endif
994 #ifdef EMSCRIPTEN
995    &rwebpad_joypad,
996 #endif
997    &null_joypad,
998    NULL,
999 };
1000 
1001 #ifdef HAVE_HID
null_hid_joypad_query(void * data,unsigned pad)1002 static bool null_hid_joypad_query(void *data, unsigned pad) {
1003    return pad < MAX_USERS; }
null_hid_joypad_name(void * data,unsigned pad)1004 static const char *null_hid_joypad_name(
1005       void *data, unsigned pad) { return NULL; }
null_hid_joypad_get_buttons(void * data,unsigned port,input_bits_t * state)1006 static void null_hid_joypad_get_buttons(void *data,
1007       unsigned port, input_bits_t *state) { BIT256_CLEAR_ALL_PTR(state); }
null_hid_joypad_button(void * data,unsigned port,uint16_t joykey)1008 static int16_t null_hid_joypad_button(
1009       void *data, unsigned port, uint16_t joykey) { return 0; }
null_hid_joypad_rumble(void * data,unsigned pad,enum retro_rumble_effect effect,uint16_t strength)1010 static bool null_hid_joypad_rumble(void *data, unsigned pad,
1011       enum retro_rumble_effect effect, uint16_t strength) { return false; }
null_hid_joypad_axis(void * data,unsigned port,uint32_t joyaxis)1012 static int16_t null_hid_joypad_axis(
1013       void *data, unsigned port, uint32_t joyaxis) { return 0; }
null_hid_init(void)1014 static void *null_hid_init(void) { return (void*)-1; }
null_hid_free(const void * data)1015 static void null_hid_free(const void *data) { }
null_hid_poll(void * data)1016 static void null_hid_poll(void *data) { }
null_hid_joypad_state(void * data,rarch_joypad_info_t * joypad_info,const void * binds_data,unsigned port)1017 static int16_t null_hid_joypad_state(
1018       void *data,
1019       rarch_joypad_info_t *joypad_info,
1020       const void *binds_data,
1021       unsigned port) { return 0; }
1022 
1023 static hid_driver_t null_hid = {
1024    null_hid_init,               /* init */
1025    null_hid_joypad_query,       /* joypad_query */
1026    null_hid_free,               /* free */
1027    null_hid_joypad_button,      /* button */
1028    null_hid_joypad_state,       /* state */
1029    null_hid_joypad_get_buttons, /* get_buttons */
1030    null_hid_joypad_axis,        /* axis */
1031    null_hid_poll,               /* poll */
1032    null_hid_joypad_rumble,      /* rumble */
1033    null_hid_joypad_name,        /* joypad_name */
1034    "null",
1035 };
1036 
1037 static hid_driver_t *hid_drivers[] = {
1038 #if defined(HAVE_BTSTACK)
1039    &btstack_hid,
1040 #endif
1041 #if defined(__APPLE__) && defined(HAVE_IOHIDMANAGER)
1042    &iohidmanager_hid,
1043 #endif
1044 #if defined(HAVE_LIBUSB) && defined(HAVE_THREADS)
1045    &libusb_hid,
1046 #endif
1047 #ifdef HW_RVL
1048    &wiiusb_hid,
1049 #endif
1050    &null_hid,
1051    NULL,
1052 };
1053 #endif
1054 
1055 static bluetooth_driver_t bluetooth_null = {
1056    NULL, /* init */
1057    NULL, /* free */
1058    NULL, /* scan */
1059    NULL, /* get_devices */
1060    NULL, /* device_is_connected */
1061    NULL, /* device_get_sublabel */
1062    NULL, /* connect_device */
1063    "null",
1064 };
1065 
1066 static const bluetooth_driver_t *bluetooth_drivers[] = {
1067 #ifdef HAVE_BLUETOOTH
1068    &bluetooth_bluetoothctl,
1069 #ifdef HAVE_DBUS
1070    &bluetooth_bluez,
1071 #endif
1072 #endif
1073    &bluetooth_null,
1074    NULL,
1075 };
1076 
1077 static wifi_driver_t wifi_null = {
1078    NULL, /* init */
1079    NULL, /* free */
1080    NULL, /* start */
1081    NULL, /* stop */
1082    NULL, /* enable */
1083    NULL, /* connection_info */
1084    NULL, /* scan */
1085    NULL, /* get_ssids */
1086    NULL, /* ssid_is_online */
1087    NULL, /* connect_ssid */
1088    NULL, /* disconnect_ssid */
1089    NULL, /* tether_start_stop */
1090    "null",
1091 };
1092 
1093 static const wifi_driver_t *wifi_drivers[] = {
1094 #ifdef HAVE_LAKKA
1095    &wifi_connmanctl,
1096 #endif
1097 #ifdef HAVE_WIFI
1098    &wifi_nmcli,
1099 #endif
1100    &wifi_null,
1101    NULL,
1102 };
1103 
1104 static location_driver_t location_null = {
1105    NULL,
1106    NULL,
1107    NULL,
1108    NULL,
1109    NULL,
1110    NULL,
1111    "null",
1112 };
1113 
1114 static const location_driver_t *location_drivers[] = {
1115 #ifdef ANDROID
1116    &location_android,
1117 #endif
1118    &location_null,
1119    NULL,
1120 };
1121 
1122 static ui_companion_driver_t ui_companion_null = {
1123    NULL, /* init */
1124    NULL, /* deinit */
1125    NULL, /* toggle */
1126    NULL, /* event_command */
1127    NULL, /* notify_content_loaded */
1128    NULL, /* notify_list_loaded */
1129    NULL, /* notify_refresh */
1130    NULL, /* msg_queue_push */
1131    NULL, /* render_messagebox */
1132    NULL, /* get_main_window */
1133    NULL, /* log_msg */
1134    NULL, /* is_active */
1135    NULL, /* browser_window */
1136    NULL, /* msg_window */
1137    NULL, /* window */
1138    NULL, /* application */
1139    "null", /* ident */
1140 };
1141 
1142 static const ui_companion_driver_t *ui_companion_drivers[] = {
1143 #if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
1144    &ui_companion_win32,
1145 #endif
1146 #if defined(OSX)
1147    &ui_companion_cocoa,
1148 #endif
1149    &ui_companion_null,
1150    NULL
1151 };
1152 
1153 static const record_driver_t record_null = {
1154    NULL, /* new */
1155    NULL, /* free */
1156    NULL, /* push_video */
1157    NULL, /* push_audio */
1158    NULL, /* finalize */
1159    "null",
1160 };
1161 
1162 static const record_driver_t *record_drivers[] = {
1163 #ifdef HAVE_FFMPEG
1164    &record_ffmpeg,
1165 #endif
1166    &record_null,
1167    NULL,
1168 };
1169 
1170 extern midi_driver_t midi_winmm;
1171 extern midi_driver_t midi_alsa;
1172 
null_midi_free(void * p)1173 static void null_midi_free(void *p) { }
null_midi_init(const char * input,const char * output)1174 static void *null_midi_init(const char *input, const char *output) { return (void*)-1; }
null_midi_get_avail_inputs(struct string_list * inputs)1175 static bool null_midi_get_avail_inputs(struct string_list *inputs) { union string_list_elem_attr attr = {0}; return string_list_append(inputs, "Null", attr); }
null_midi_get_avail_outputs(struct string_list * outputs)1176 static bool null_midi_get_avail_outputs(struct string_list *outputs) { union string_list_elem_attr attr = {0}; return string_list_append(outputs, "Null", attr); }
null_midi_set_input(void * p,const char * input)1177 static bool null_midi_set_input(void *p, const char *input) { return input == NULL || string_is_equal(input, "Null"); }
null_midi_set_output(void * p,const char * output)1178 static bool null_midi_set_output(void *p, const char *output) { return output == NULL || string_is_equal(output, "Null"); }
null_midi_read(void * p,midi_event_t * event)1179 static bool null_midi_read(void *p, midi_event_t *event) { return false; }
null_midi_write(void * p,const midi_event_t * event)1180 static bool null_midi_write(void *p, const midi_event_t *event) { return true; }
null_midi_flush(void * p)1181 static bool null_midi_flush(void *p) { return true; }
1182 
1183 static midi_driver_t midi_null = {
1184    "null",
1185    null_midi_get_avail_inputs,
1186    null_midi_get_avail_outputs,
1187    null_midi_init,
1188    null_midi_free,
1189    null_midi_set_input,
1190    null_midi_set_output,
1191    null_midi_read,
1192    null_midi_write,
1193    null_midi_flush
1194 };
1195 
1196 static midi_driver_t *midi_drivers[] = {
1197 #if defined(HAVE_ALSA) && !defined(HAVE_HAKCHI) && !defined(HAVE_SEGAM) && !defined(DINGUX)
1198    &midi_alsa,
1199 #endif
1200 #ifdef HAVE_WINMM
1201    &midi_winmm,
1202 #endif
1203    &midi_null
1204 };
1205 
nullcamera_init(const char * device,uint64_t caps,unsigned width,unsigned height)1206 static void *nullcamera_init(const char *device, uint64_t caps,
1207       unsigned width, unsigned height) { return (void*)-1; }
nullcamera_free(void * data)1208 static void nullcamera_free(void *data) { }
nullcamera_stop(void * data)1209 static void nullcamera_stop(void *data) { }
nullcamera_start(void * data)1210 static bool nullcamera_start(void *data) { return true; }
nullcamera_poll(void * a,retro_camera_frame_raw_framebuffer_t b,retro_camera_frame_opengl_texture_t c)1211 static bool nullcamera_poll(void *a,
1212       retro_camera_frame_raw_framebuffer_t b,
1213       retro_camera_frame_opengl_texture_t c) { return true; }
1214 
1215 static camera_driver_t camera_null = {
1216    nullcamera_init,
1217    nullcamera_free,
1218    nullcamera_start,
1219    nullcamera_stop,
1220    nullcamera_poll,
1221    "null",
1222 };
1223 
1224 static const camera_driver_t *camera_drivers[] = {
1225 #ifdef HAVE_V4L2
1226    &camera_v4l2,
1227 #endif
1228 #ifdef EMSCRIPTEN
1229    &camera_rwebcam,
1230 #endif
1231 #ifdef ANDROID
1232    &camera_android,
1233 #endif
1234    &camera_null,
1235    NULL,
1236 };
1237 
1238 /* MAIN GLOBAL VARIABLES */
1239 
1240 /* Descriptive names for options without short variant.
1241  *
1242  * Please keep the name in sync with the option name.
1243  * Order does not matter. */
1244 enum
1245 {
1246    RA_OPT_MENU = 256, /* must be outside the range of a char */
1247    RA_OPT_STATELESS,
1248    RA_OPT_CHECK_FRAMES,
1249    RA_OPT_PORT,
1250    RA_OPT_SPECTATE,
1251    RA_OPT_NICK,
1252    RA_OPT_COMMAND,
1253    RA_OPT_APPENDCONFIG,
1254    RA_OPT_BPS,
1255    RA_OPT_IPS,
1256    RA_OPT_NO_PATCH,
1257    RA_OPT_RECORDCONFIG,
1258    RA_OPT_SUBSYSTEM,
1259    RA_OPT_SIZE,
1260    RA_OPT_FEATURES,
1261    RA_OPT_VERSION,
1262    RA_OPT_EOF_EXIT,
1263    RA_OPT_LOG_FILE,
1264    RA_OPT_MAX_FRAMES,
1265    RA_OPT_MAX_FRAMES_SCREENSHOT,
1266    RA_OPT_MAX_FRAMES_SCREENSHOT_PATH,
1267    RA_OPT_SET_SHADER,
1268    RA_OPT_ACCESSIBILITY,
1269    RA_OPT_LOAD_MENU_ON_ERROR
1270 };
1271 
1272 enum  runloop_state
1273 {
1274    RUNLOOP_STATE_ITERATE = 0,
1275    RUNLOOP_STATE_POLLED_AND_SLEEP,
1276    RUNLOOP_STATE_MENU_ITERATE,
1277    RUNLOOP_STATE_END,
1278    RUNLOOP_STATE_QUIT
1279 };
1280 
1281 enum rarch_movie_type
1282 {
1283    RARCH_MOVIE_PLAYBACK = 0,
1284    RARCH_MOVIE_RECORD
1285 };
1286 
1287 enum poll_type_override_t
1288 {
1289    POLL_TYPE_OVERRIDE_DONTCARE = 0,
1290    POLL_TYPE_OVERRIDE_EARLY,
1291    POLL_TYPE_OVERRIDE_NORMAL,
1292    POLL_TYPE_OVERRIDE_LATE
1293 };
1294 
1295 enum auto_shader_operation
1296 {
1297    AUTO_SHADER_OP_SAVE = 0,
1298    AUTO_SHADER_OP_REMOVE,
1299    AUTO_SHADER_OP_EXISTS
1300 };
1301 
1302 enum input_game_focus_cmd_type
1303 {
1304    GAME_FOCUS_CMD_OFF = 0,
1305    GAME_FOCUS_CMD_ON,
1306    GAME_FOCUS_CMD_TOGGLE,
1307    GAME_FOCUS_CMD_REAPPLY
1308 };
1309 
1310 typedef struct runloop_ctx_msg_info
1311 {
1312    const char *msg;
1313    unsigned prio;
1314    unsigned duration;
1315    bool flush;
1316 } runloop_ctx_msg_info_t;
1317 
1318 typedef struct
1319 {
1320    unsigned priority;
1321    float duration;
1322    char str[128];
1323    bool set;
1324 } runloop_core_status_msg_t;
1325 
1326 struct rarch_dir_shader_list
1327 {
1328    struct string_list *shader_list;
1329    char *directory;
1330    size_t selection;
1331    bool shader_loaded;
1332    bool remember_last_preset_dir;
1333 };
1334 
1335 #ifdef HAVE_BSV_MOVIE
1336 struct bsv_state
1337 {
1338    /* Movie playback/recording support. */
1339    char movie_path[PATH_MAX_LENGTH];
1340    /* Immediate playback/recording. */
1341    char movie_start_path[PATH_MAX_LENGTH];
1342 
1343    bool movie_start_recording;
1344    bool movie_start_playback;
1345    bool movie_playback;
1346    bool eof_exit;
1347    bool movie_end;
1348 
1349 };
1350 
1351 struct bsv_movie
1352 {
1353    intfstream_t *file;
1354    uint8_t *state;
1355    /* A ring buffer keeping track of positions
1356     * in the file for each frame. */
1357    size_t *frame_pos;
1358    size_t frame_mask;
1359    size_t frame_ptr;
1360    size_t min_file_pos;
1361    size_t state_size;
1362 
1363    bool playback;
1364    bool first_rewind;
1365    bool did_rewind;
1366 };
1367 #endif
1368 
1369 typedef struct video_pixel_scaler
1370 {
1371    struct scaler_ctx *scaler;
1372    void *scaler_out;
1373 } video_pixel_scaler_t;
1374 
1375 typedef struct
1376 {
1377    struct string_list *list;
1378    enum gfx_ctx_api api;
1379 } gfx_api_gpu_map;
1380 
1381 struct remote_message
1382 {
1383    int port;
1384    int device;
1385    int index;
1386    int id;
1387    uint16_t state;
1388 };
1389 
1390 struct input_remote
1391 {
1392 #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD)
1393    int net_fd[MAX_USERS];
1394 #endif
1395    bool state[RARCH_BIND_LIST_END];
1396 };
1397 
1398 #ifdef HAVE_BSV_MOVIE
1399 typedef struct bsv_movie bsv_movie_t;
1400 #endif
1401 
1402 typedef struct input_remote input_remote_t;
1403 
1404 typedef struct input_remote_state
1405 {
1406    /* This is a bitmask of (1 << key_bind_id). */
1407    uint64_t buttons[MAX_USERS];
1408    /* Left X, Left Y, Right X, Right Y */
1409    int16_t analog[4][MAX_USERS];
1410 } input_remote_state_t;
1411 
1412 typedef struct input_list_element_t
1413 {
1414    int16_t *state;
1415    unsigned port;
1416    unsigned device;
1417    unsigned index;
1418    unsigned int state_size;
1419 } input_list_element;
1420 
1421 typedef void *(*constructor_t)(void);
1422 typedef void  (*destructor_t )(void*);
1423 
1424 typedef struct my_list_t
1425 {
1426    void **data;
1427    constructor_t constructor;
1428    destructor_t destructor;
1429    int capacity;
1430    int size;
1431 } my_list;
1432 
1433 #ifdef HAVE_OVERLAY
1434 typedef struct input_overlay_state
1435 {
1436    uint32_t keys[RETROK_LAST / 32 + 1];
1437    /* Left X, Left Y, Right X, Right Y */
1438    int16_t analog[4];
1439    /* This is a bitmask of (1 << key_bind_id). */
1440    input_bits_t buttons;
1441 } input_overlay_state_t;
1442 
1443 struct input_overlay
1444 {
1445    struct overlay *overlays;
1446    const struct overlay *active;
1447    void *iface_data;
1448    const video_overlay_interface_t *iface;
1449    input_overlay_state_t overlay_state;
1450 
1451    size_t index;
1452    size_t size;
1453 
1454    unsigned next_index;
1455 
1456    enum overlay_status state;
1457 
1458    bool enable;
1459    bool blocked;
1460    bool alive;
1461 };
1462 #endif
1463 
1464 /* Input config. */
1465 struct input_bind_map
1466 {
1467    const char *base;
1468 
1469    enum msg_hash_enums desc;
1470 
1471    /* Meta binds get input as prefix, not input_playerN".
1472     * 0 = libretro related.
1473     * 1 = Common hotkey.
1474     * 2 = Uncommon/obscure hotkey.
1475     */
1476    uint8_t meta;
1477 
1478    uint8_t retro_key;
1479 
1480    bool valid;
1481 };
1482 
1483 typedef struct turbo_buttons turbo_buttons_t;
1484 
1485 /* Turbo support. */
1486 struct turbo_buttons
1487 {
1488    int32_t turbo_pressed[MAX_USERS];
1489    unsigned count;
1490    uint16_t enable[MAX_USERS];
1491    bool frame_enable[MAX_USERS];
1492    bool mode1_enable[MAX_USERS];
1493 };
1494 
1495 struct input_keyboard_line
1496 {
1497    char *buffer;
1498    void *userdata;
1499    /** Line complete callback.
1500     * Calls back after return is
1501     * pressed with the completed line.
1502     * Line can be NULL.
1503     **/
1504    input_keyboard_line_complete_t cb;
1505    size_t ptr;
1506    size_t size;
1507    bool enabled;
1508 };
1509 
1510 typedef struct input_game_focus_state
1511 {
1512    bool enabled;
1513    bool core_requested;
1514 } input_game_focus_state_t;
1515 
1516 #ifdef HAVE_RUNAHEAD
1517 typedef bool(*runahead_load_state_function)(const void*, size_t);
1518 #endif
1519 
1520 #ifdef HAVE_MENU
1521 typedef struct menu_ctx_load_image
1522 {
1523    void *data;
1524    enum menu_image_type type;
1525 } menu_ctx_load_image_t;
1526 
1527 struct menu_list
1528 {
1529    file_list_t **menu_stack;
1530    size_t menu_stack_size;
1531    file_list_t **selection_buf;
1532    size_t selection_buf_size;
1533 };
1534 
1535 typedef struct menu_list menu_list_t;
1536 
1537 struct menu_state
1538 {
1539    /* Timers */
1540    retro_time_t current_time_us;
1541    retro_time_t powerstate_last_time_us;
1542    retro_time_t datetime_last_time_us;
1543    retro_time_t input_last_time_us;
1544 
1545    struct
1546    {
1547       rarch_setting_t *list_settings;
1548       menu_list_t *list;
1549       size_t begin;
1550    } entries;
1551    size_t   selection_ptr;
1552 
1553    /* Quick jumping indices with L/R.
1554     * Rebuilt when parsing directory. */
1555    struct
1556    {
1557       size_t   index_list[SCROLL_INDEX_SIZE];
1558       unsigned index_size;
1559       unsigned acceleration;
1560    } scroll;
1561 
1562    /* Storage container for current menu datetime
1563     * representation string */
1564    char datetime_cache[255];
1565 
1566    /* When generating a menu list in menu_displaylist_build_list(),
1567     * the entry with a label matching 'pending_selection' will
1568     * be selected automatically */
1569    char pending_selection[PATH_MAX_LENGTH];
1570 
1571    /* when enabled, on next iteration the 'Quick Menu' list will
1572     * be pushed onto the stack */
1573    bool pending_quick_menu;
1574    bool prevent_populate;
1575    /* The menu driver owns the userdata */
1576    bool data_own;
1577    /* Flagged when menu entries need to be refreshed */
1578    bool entries_need_refresh;
1579    bool entries_nonblocking_refresh;
1580    /* 'Close Content'-hotkey menu resetting */
1581    bool pending_close_content;
1582    /* Screensaver status
1583     * - Does menu driver support screensaver functionality?
1584     * - Is screensaver currently active? */
1585    bool screensaver_supported;
1586    bool screensaver_active;
1587 };
1588 
1589 struct menu_bind_state_port
1590 {
1591    int16_t axes[MENU_MAX_AXES];
1592    uint16_t hats[MENU_MAX_HATS];
1593    bool mouse_buttons[MENU_MAX_MBUTTONS];
1594    bool buttons[MENU_MAX_BUTTONS];
1595 };
1596 
1597 struct menu_bind_axis_state
1598 {
1599    /* Default axis state. */
1600    int16_t rested_axes[MENU_MAX_AXES];
1601    /* Locked axis state. If we configured an axis,
1602     * avoid having the same axis state trigger something again right away. */
1603    int16_t locked_axes[MENU_MAX_AXES];
1604 };
1605 
1606 struct menu_bind_state
1607 {
1608    rarch_timer_t timer_timeout;
1609    rarch_timer_t timer_hold;
1610 
1611    struct retro_keybind *output;
1612    struct retro_keybind buffer;
1613 
1614    struct menu_bind_state_port state[MAX_USERS];
1615    struct menu_bind_axis_state axis_state[MAX_USERS];
1616 
1617    unsigned begin;
1618    unsigned last;
1619    unsigned user;
1620    unsigned port;
1621 
1622    bool skip;
1623 };
1624 #endif
1625 
1626 typedef struct input_mapper
1627 {
1628    /* Left X, Left Y, Right X, Right Y */
1629    int16_t analog_value[MAX_USERS][8];
1630    /* The whole keyboard state */
1631    uint32_t keys[RETROK_LAST / 32 + 1];
1632    /* RetroPad button state of remapped keyboard keys */
1633    unsigned key_button[RETROK_LAST];
1634    /* This is a bitmask of (1 << key_bind_id). */
1635    input_bits_t buttons[MAX_USERS];
1636 } input_mapper_t;
1637 
1638 #ifdef HAVE_DISCORD
1639 /* The Discord API specifies these variables:
1640 - userId --------- char[24]   - the userId of the player asking to join
1641 - username ------- char[344]  - the username of the player asking to join
1642 - discriminator -- char[8]    - the discriminator of the player asking to join
1643 - spectateSecret - char[128] - secret used for spectatin matches
1644 - joinSecret     - char[128] - secret used to join matches
1645 - partyId        - char[128] - the party you would be joining
1646 */
1647 
1648 struct discord_state
1649 {
1650    int64_t start_time;
1651    int64_t pause_time;
1652    int64_t elapsed_time;
1653 
1654    DiscordRichPresence presence;       /* int64_t alignment */
1655 
1656    unsigned status;
1657 
1658    char self_party_id[128];
1659    char peer_party_id[128];
1660    char user_name[344];
1661    char user_avatar[344];
1662 
1663    bool ready;
1664    bool avatar_ready;
1665    bool connecting;
1666 };
1667 
1668 typedef struct discord_state discord_state_t;
1669 #endif
1670 
1671 struct runloop
1672 {
1673    retro_usec_t frame_time_last;        /* int64_t alignment */
1674 
1675    msg_queue_t msg_queue;                        /* ptr alignment */
1676 #ifdef HAVE_THREADS
1677    slock_t *msg_queue_lock;
1678 #endif
1679    size_t msg_queue_size;
1680 
1681    core_option_manager_t *core_options;
1682    retro_keyboard_event_t key_event;             /* ptr alignment */
1683    retro_keyboard_event_t frontend_key_event;    /* ptr alignment */
1684 
1685    rarch_system_info_t system;                   /* ptr alignment */
1686    struct retro_frame_time_callback frame_time;  /* ptr alignment */
1687    struct retro_audio_buffer_status_callback audio_buffer_status; /* ptr alignment */
1688    unsigned pending_windowed_scale;
1689    unsigned max_frames;
1690    unsigned audio_latency;
1691 
1692    struct retro_fastforwarding_override fastmotion_override; /* float alignment */
1693 
1694    bool missing_bios;
1695    bool force_nonblock;
1696    bool paused;
1697    bool idle;
1698    bool slowmotion;
1699    bool fastmotion;
1700    bool shutdown_initiated;
1701    bool core_shutdown_initiated;
1702    bool core_running;
1703    bool perfcnt_enable;
1704    bool game_options_active;
1705    bool folder_options_active;
1706    bool autosave;
1707 #ifdef HAVE_CONFIGFILE
1708    bool overrides_active;
1709 #endif
1710    bool remaps_core_active;
1711    bool remaps_game_active;
1712    bool remaps_content_dir_active;
1713 #ifdef HAVE_SCREENSHOTS
1714    bool max_frames_screenshot;
1715    char max_frames_screenshot_path[PATH_MAX_LENGTH];
1716 #endif
1717 };
1718 
1719 typedef struct runloop runloop_state_t;
1720 
1721 struct rarch_state
1722 {
1723    double audio_source_ratio_original;
1724    double audio_source_ratio_current;
1725    struct retro_system_av_info video_driver_av_info; /* double alignment */
1726 #ifdef HAVE_CRTSWITCHRES
1727    videocrt_switch_t crt_switch_st;                  /* double alignment */
1728 #endif
1729    retro_time_t frame_limit_minimum_time;
1730    retro_time_t frame_limit_last_time;
1731    retro_time_t libretro_core_runtime_last;
1732    retro_time_t libretro_core_runtime_usec;
1733    retro_time_t video_driver_frame_time_samples[
1734       MEASURE_FRAME_TIME_SAMPLES_COUNT];
1735    struct global              g_extern;         /* retro_time_t alignment */
1736 #ifdef HAVE_MENU
1737    menu_input_t menu_input_state;               /* retro_time_t alignment */
1738 #endif
1739 
1740 
1741 
1742 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
1743    rarch_timer_t shader_delay_timer;            /* int64_t alignment */
1744 #endif
1745 #ifdef HAVE_DISCORD
1746    discord_state_t discord_st;                  /* int64_t alignment */
1747 #endif
1748 #ifdef HAVE_MENU
1749    struct menu_state menu_driver_state;         /* int64_t alignment */
1750 #endif
1751 #ifdef HAVE_GFX_WIDGETS
1752    dispgfx_widget_t dispwidget_st;              /* uint64_t alignment */
1753 #endif
1754 #ifdef HAVE_MENU
1755    struct menu_bind_state menu_input_binds;     /* uint64_t alignment */
1756 #endif
1757    struct retro_core_t        current_core;     /* uint64_t alignment */
1758 #if defined(HAVE_RUNAHEAD)
1759 #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
1760    struct retro_core_t secondary_core;          /* uint64_t alignment */
1761 #endif
1762 #endif
1763 
1764    uint64_t audio_driver_free_samples_count;
1765 
1766 #ifdef HAVE_RUNAHEAD
1767    uint64_t runahead_last_frame_count;
1768 #endif
1769 
1770    uint64_t video_driver_frame_time_count;
1771    uint64_t video_driver_frame_count;
1772    struct retro_camera_callback camera_cb;    /* uint64_t alignment */
1773    gfx_animation_t anim;                      /* uint64_t alignment */
1774    gfx_thumbnail_state_t gfx_thumb_state;     /* uint64_t alignment */
1775 #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD)
1776    input_remote_state_t remote_st_ptr;        /* uint64_t alignment */
1777 #endif
1778 
1779    struct string_list *subsystem_fullpaths;
1780    struct string_list *midi_drv_inputs;
1781    struct string_list *midi_drv_outputs;
1782    struct string_list *audio_driver_devices_list;
1783 
1784    uint8_t *video_driver_record_gpu_buffer;
1785    uint8_t *midi_drv_input_buffer;
1786    uint8_t *midi_drv_output_buffer;
1787    bool    *load_no_content_hook;
1788    float   *audio_driver_output_samples_buf;
1789    char    *osk_grid[45];
1790 #if defined(HAVE_RUNAHEAD)
1791 #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
1792    char    *secondary_library_path;
1793 #endif
1794    retro_ctx_load_content_info_t *load_content_info;
1795 #endif
1796 #ifdef HAVE_MENU
1797    const char **menu_input_dialog_keyboard_buffer;
1798 #endif
1799 
1800    const record_driver_t *recording_driver;
1801    void *recording_data;
1802 
1803 #ifdef HAVE_THREADS
1804    slock_t *display_lock;
1805    slock_t *context_lock;
1806 #endif
1807 
1808    const camera_driver_t *camera_driver;
1809    void *camera_data;
1810 
1811    void *midi_drv_data;
1812 
1813    const ui_companion_driver_t *ui_companion;
1814    void *ui_companion_data;
1815 
1816 #ifdef HAVE_QT
1817    void *ui_companion_qt_data;
1818 #endif
1819 
1820    const location_driver_t *location_driver;
1821    void *location_data;
1822 
1823    const bluetooth_driver_t *bluetooth_driver;
1824    void *bluetooth_data;
1825 
1826    const wifi_driver_t *wifi_driver;
1827    void *wifi_data;
1828 
1829    void *current_display_server_data;
1830 
1831 #ifdef HAVE_VIDEO_FILTER
1832    rarch_softfilter_t *video_driver_state_filter;
1833    void               *video_driver_state_buffer;
1834 #endif
1835 
1836    const void *frame_cache_data;
1837 
1838    void *video_driver_data;
1839    video_driver_t *current_video;
1840 
1841    /* Interface for "poking". */
1842    const video_poke_interface_t *video_driver_poke;
1843 
1844    /* Used for 15-bit -> 16-bit conversions that take place before
1845     * being passed to video driver. */
1846    video_pixel_scaler_t *video_driver_scaler_ptr;
1847 
1848    const struct
1849       retro_hw_render_context_negotiation_interface *
1850       hw_render_context_negotiation;
1851 
1852    void *video_context_data;
1853 
1854 #ifdef HAVE_REWIND
1855    int16_t *audio_driver_rewind_buf;
1856 #endif
1857    int16_t *audio_driver_output_samples_conv_buf;
1858 
1859 #ifdef HAVE_DSP_FILTER
1860    retro_dsp_filter_t *audio_driver_dsp;
1861 #endif
1862    const retro_resampler_t *audio_driver_resampler;
1863 
1864    void *audio_driver_resampler_data;
1865    const audio_driver_t *current_audio;
1866    void *audio_driver_context_audio_data;
1867 #ifdef HAVE_OVERLAY
1868    input_overlay_t *overlay_ptr;
1869 #endif
1870 
1871    pad_connection_listener_t *pad_connection_listener;
1872 
1873    void *keyboard_press_data;
1874 
1875 #ifdef HAVE_COMMAND
1876    command_t *input_driver_command[MAX_CMD_DRIVERS];
1877 #endif
1878 #ifdef HAVE_NETWORKGAMEPAD
1879    input_remote_t *input_driver_remote;
1880 #endif
1881    input_driver_t *current_input;
1882    void *current_input_data;
1883 
1884 #ifdef HAVE_HID
1885    const void *hid_data;
1886 #endif
1887    settings_t *configuration_settings;
1888 #ifdef HAVE_MENU
1889    menu_handle_t *menu_driver_data;
1890    void *menu_userdata;
1891    const menu_ctx_driver_t *menu_driver_ctx;
1892 #endif
1893 #ifdef HAVE_NETWORKING
1894    /* Used while Netplay is running */
1895    netplay_t *netplay_data;
1896 #endif
1897 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
1898    struct video_shader *menu_driver_shader;
1899 #endif
1900    frontend_ctx_driver_t *current_frontend_ctx;
1901 #ifdef HAVE_RUNAHEAD
1902    my_list *runahead_save_state_list;
1903    my_list *input_state_list;
1904 #endif
1905 
1906    struct retro_perf_counter *perf_counters_rarch[MAX_COUNTERS];
1907    struct retro_perf_counter *perf_counters_libretro[MAX_COUNTERS];
1908 
1909    const struct retro_keybind *libretro_input_binds[MAX_USERS];
1910 
1911 #ifdef HAVE_REWIND
1912    struct state_manager_rewind_state rewind_st;
1913 #endif
1914    input_keyboard_line_t keyboard_line; /* ptr alignment */
1915    struct retro_subsystem_rom_info
1916       subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS]
1917       [SUBSYSTEM_MAX_SUBSYSTEM_ROMS];                    /* ptr alignment */
1918 
1919    gfx_ctx_driver_t current_video_context;               /* ptr alignment */
1920    content_state_t            content_st;                /* ptr alignment */
1921    midi_event_t midi_drv_input_event;                    /* ptr alignment */
1922    midi_event_t midi_drv_output_event;                   /* ptr alignment */
1923    core_info_state_t core_info_st;                       /* ptr alignment */
1924    struct retro_hw_render_callback hw_render;            /* ptr alignment */
1925    const input_device_driver_t *joypad;                  /* ptr alignment */
1926 #ifdef HAVE_MFI
1927    const input_device_driver_t *sec_joypad;              /* ptr alignment */
1928 #endif
1929 #ifdef HAVE_BSV_MOVIE
1930    bsv_movie_t     *bsv_movie_state_handle;              /* ptr alignment */
1931 #endif
1932    gfx_display_t              dispgfx;                   /* ptr alignment */
1933    input_keyboard_press_t keyboard_press_cb;             /* ptr alignment */
1934    retro_input_state_t input_state_callback_original;    /* ptr alignment */
1935    struct retro_audio_callback audio_callback;           /* ptr alignment */
1936    video_driver_frame_t frame_bak;                       /* ptr alignment */
1937    struct rarch_dir_shader_list dir_shader_list;         /* ptr alignment */
1938 #ifdef HAVE_RUNAHEAD
1939    function_t retro_reset_callback_original;             /* ptr alignment */
1940    function_t original_retro_deinit;                     /* ptr alignment */
1941    function_t original_retro_unload;                     /* ptr alignment */
1942    runahead_load_state_function
1943       retro_unserialize_callback_original;               /* ptr alignment */
1944 #endif
1945    struct retro_callbacks     retro_ctx;                 /* ptr alignment */
1946 #if defined(HAVE_RUNAHEAD)
1947 #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
1948    struct retro_callbacks secondary_callbacks;           /* ptr alignment */
1949 #endif
1950 #endif
1951 #ifdef HAVE_AUDIOMIXER
1952    struct audio_mixer_stream
1953       audio_mixer_streams[AUDIO_MIXER_MAX_SYSTEM_STREAMS];
1954                                                          /* ptr alignment */
1955 #endif
1956 #ifdef HAVE_NETWORKING
1957    struct netplay_room netplay_host_room;                /* ptr alignment */
1958 #endif
1959 #ifdef HAVE_DYNAMIC
1960    dylib_t lib_handle;                                   /* ptr alignment */
1961 #endif
1962 #if defined(HAVE_RUNAHEAD)
1963 #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
1964    dylib_t secondary_lib_handle;                         /* ptr alignment */
1965 #endif
1966 #endif
1967 
1968    /* Opaque handles to currently running window.
1969     * Used by e.g. input drivers which bind to a window.
1970     * Drivers are responsible for setting these if an input driver
1971     * could potentially make use of this. */
1972    uintptr_t video_driver_display_userdata;
1973    uintptr_t video_driver_display;
1974    uintptr_t video_driver_window;
1975 
1976    size_t recording_gpu_width;
1977    size_t recording_gpu_height;
1978 
1979    size_t frame_cache_pitch;
1980 
1981    size_t audio_driver_chunk_size;
1982    size_t audio_driver_chunk_nonblock_size;
1983    size_t audio_driver_chunk_block_size;
1984 
1985 #ifdef HAVE_REWIND
1986    size_t audio_driver_rewind_ptr;
1987    size_t audio_driver_rewind_size;
1988 #endif
1989    size_t audio_driver_buffer_size;
1990    size_t audio_driver_data_ptr;
1991 
1992 #ifdef HAVE_RUNAHEAD
1993    size_t runahead_save_state_size;
1994 #endif
1995 
1996    jmp_buf error_sjlj_context;              /* 4-byte alignment,
1997                                                put it right before long */
1998 
1999    turbo_buttons_t input_driver_turbo_btns; /* int32_t alignment */
2000    int osk_ptr;
2001 #if defined(HAVE_COMMAND)
2002 #ifdef HAVE_NETWORK_CMD
2003    int lastcmd_net_fd;
2004 #endif
2005 #endif
2006 
2007 #ifdef HAVE_TRANSLATE
2008    int ai_service_auto;
2009 #endif
2010 
2011 #if defined(HAVE_RUNAHEAD)
2012 #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
2013    int port_map[MAX_USERS];
2014 #endif
2015 #endif
2016 
2017 #if defined(HAVE_ACCESSIBILITY) && defined(HAVE_TRANSLATE)
2018    int ai_gamepad_state[MAX_USERS];
2019 #endif
2020 #ifdef HAVE_NETWORKING
2021    int reannounce;
2022 #endif
2023 
2024    input_device_info_t input_device_info[MAX_INPUT_DEVICES];
2025                                           /* unsigned alignment */
2026 #ifdef HAVE_MENU
2027    menu_dialog_t dialog_st;               /* unsigned alignment */
2028 #endif
2029 #ifdef HAVE_THREAD_STORAGE
2030    sthread_tls_t rarch_tls;               /* unsigned alignment */
2031 #endif
2032    unsigned fastforward_after_frames;
2033 
2034 #ifdef HAVE_MENU
2035    unsigned menu_input_dialog_keyboard_type;
2036    unsigned menu_input_dialog_keyboard_idx;
2037 #endif
2038 
2039    unsigned recording_width;
2040    unsigned recording_height;
2041 
2042 #ifdef HAVE_VIDEO_FILTER
2043    unsigned video_driver_state_scale;
2044    unsigned video_driver_state_out_bpp;
2045 #endif
2046    unsigned frame_cache_width;
2047    unsigned frame_cache_height;
2048    unsigned video_driver_width;
2049    unsigned video_driver_height;
2050    unsigned osk_last_codepoint;
2051    unsigned osk_last_codepoint_len;
2052    unsigned input_driver_flushing_input;
2053    unsigned input_driver_max_users;
2054    unsigned input_hotkey_block_counter;
2055 #ifdef HAVE_ACCESSIBILITY
2056    unsigned gamepad_input_override;
2057 #endif
2058 #ifdef HAVE_NETWORKING
2059    unsigned server_port_deferred;
2060 #endif
2061 
2062    unsigned audio_driver_free_samples_buf[
2063       AUDIO_BUFFER_FREE_SAMPLES_COUNT];
2064    unsigned perf_ptr_rarch;
2065    unsigned perf_ptr_libretro;
2066 
2067    float *audio_driver_input_data;
2068    float video_driver_core_hz;
2069    float video_driver_aspect_ratio;
2070 
2071 #ifdef HAVE_AUDIOMIXER
2072    float audio_driver_mixer_volume_gain;
2073 #endif
2074 
2075    float audio_driver_rate_control_delta;
2076    float audio_driver_input;
2077    float audio_driver_volume_gain;
2078 
2079    float input_driver_axis_threshold;
2080 
2081    enum osk_type osk_idx;
2082    enum rarch_core_type current_core_type;
2083    enum rarch_core_type explicit_current_core_type;
2084    enum rotation initial_screen_orientation;
2085    enum rotation current_screen_orientation;
2086    enum retro_pixel_format video_driver_pix_fmt;
2087 #if defined(HAVE_COMMAND)
2088    enum cmd_source_t lastcmd_source;
2089 #endif
2090 #if defined(HAVE_RUNAHEAD)
2091    enum rarch_core_type last_core_type;
2092 #endif
2093    enum rarch_display_type video_driver_display_type;
2094    enum poll_type_override_t core_poll_type_override;
2095 #ifdef HAVE_OVERLAY
2096    enum overlay_visibility *overlay_visibility;
2097 #endif
2098 
2099 #ifdef HAVE_MENU
2100    menu_input_pointer_hw_state_t menu_input_pointer_hw_state;
2101                                                 /* int16_t alignment */
2102 #endif
2103 
2104 #ifdef HAVE_MENU
2105    unsigned char menu_keyboard_key_state[RETROK_LAST];
2106 #endif
2107    /**
2108     * dynamic.c:dynamic_request_hw_context will try to set flag data when the context
2109     * is in the middle of being rebuilt; in these cases we will save flag
2110     * data and set this to true.
2111     * When the context is reinit, it checks this, reads from
2112     * deferred_flag_data and cleans it.
2113     *
2114     * TODO - Dirty hack, fix it better
2115     */
2116    gfx_ctx_flags_t deferred_flag_data;          /* uint32_t alignment */
2117    retro_bits_t has_set_libretro_device;        /* uint32_t alignment */
2118    input_mapper_t input_driver_mapper;          /* uint32_t alignment */
2119 
2120 
2121 #ifdef HAVE_BSV_MOVIE
2122    struct bsv_state bsv_movie_state;            /* char alignment */
2123 #endif
2124    char cached_video_driver[32];
2125    char video_driver_title_buf[64];
2126    char video_driver_gpu_device_string[128];
2127    char video_driver_gpu_api_version_string[128];
2128    char error_string[255];
2129 #ifdef HAVE_MENU
2130    char menu_input_dialog_keyboard_label_setting[256];
2131    char menu_input_dialog_keyboard_label[256];
2132 #endif
2133    char video_driver_window_title[512];
2134 #ifdef HAVE_NETWORKING
2135    char server_address_deferred[512];
2136 #endif
2137    char current_library_name[256];
2138    char current_library_version[256];
2139    char current_valid_extensions[256];
2140    char launch_arguments[4096];
2141    char path_main_basename[8192];
2142 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
2143    char cli_shader[PATH_MAX_LENGTH];
2144    char runtime_shader_preset[PATH_MAX_LENGTH];
2145 #endif
2146    char runtime_content_path[PATH_MAX_LENGTH];
2147    char runtime_core_path[PATH_MAX_LENGTH];
2148    char subsystem_path[PATH_MAX_LENGTH];
2149    char path_default_shader_preset[PATH_MAX_LENGTH];
2150    char path_content[PATH_MAX_LENGTH];
2151    char path_libretro[PATH_MAX_LENGTH];
2152    char path_config_file[PATH_MAX_LENGTH];
2153    char path_config_append_file[PATH_MAX_LENGTH];
2154    char path_core_options_file[PATH_MAX_LENGTH];
2155    char dir_system[PATH_MAX_LENGTH];
2156    char dir_savefile[PATH_MAX_LENGTH];
2157    char current_savefile_dir[PATH_MAX_LENGTH];
2158    char current_savestate_dir[PATH_MAX_LENGTH];
2159    char dir_savestate[PATH_MAX_LENGTH];
2160 
2161 #ifdef HAVE_GFX_WIDGETS
2162    bool widgets_active;
2163    bool widgets_persisting;
2164 #endif
2165 #ifdef HAVE_NETWORKING
2166 /* Only used before init_netplay */
2167    bool netplay_enabled;
2168    bool netplay_is_client;
2169    /* Used to avoid recursive netplay calls */
2170    bool in_netplay;
2171    bool netplay_client_deferred;
2172    bool is_mitm;
2173 #endif
2174    bool has_set_username;
2175    bool rarch_error_on_init;
2176    bool rarch_force_fullscreen;
2177    bool has_set_core;
2178    bool has_set_verbosity;
2179    bool has_set_libretro;
2180    bool has_set_libretro_directory;
2181    bool has_set_save_path;
2182    bool has_set_state_path;
2183 #ifdef HAVE_PATCH
2184    bool has_set_ups_pref;
2185    bool has_set_bps_pref;
2186    bool has_set_ips_pref;
2187 #endif
2188 #ifdef HAVE_QT
2189    bool qt_is_inited;
2190 #endif
2191    bool has_set_log_to_file;
2192    bool rarch_is_inited;
2193    bool rarch_is_switching_display_mode;
2194    bool rarch_is_sram_load_disabled;
2195    bool rarch_is_sram_save_disabled;
2196    bool rarch_use_sram;
2197    bool rarch_ups_pref;
2198    bool rarch_bps_pref;
2199    bool rarch_ips_pref;
2200 #ifdef HAVE_PATCH
2201    bool rarch_patch_blocked;
2202 #endif
2203    bool video_driver_window_title_update;
2204 
2205    /**
2206     * dynamic.c:dynamic_request_hw_context will try to set
2207     * flag data when the context
2208     * is in the middle of being rebuilt; in these cases we will save flag
2209     * data and set this to true.
2210     * When the context is reinit, it checks this, reads from
2211     * deferred_flag_data and cleans it.
2212     *
2213     * TODO - Dirty hack, fix it better
2214     */
2215    bool deferred_video_context_driver_set_flags;
2216    bool ignore_environment_cb;
2217    bool core_set_shared_context;
2218 
2219    /* Graphics driver requires RGBA byte order data (ABGR on little-endian)
2220     * for 32-bit.
2221     * This takes effect for overlay and shader cores that wants to load
2222     * data into graphics driver. Kinda hackish to place it here, it is only
2223     * used for GLES.
2224     * TODO: Refactor this better. */
2225    bool video_driver_use_rgba;
2226 
2227    /* If set during context deinit, the driver should keep
2228     * graphics context alive to avoid having to reset all
2229     * context state. */
2230    bool video_driver_cache_context;
2231 
2232    /* Set to true by driver if context caching succeeded. */
2233    bool video_driver_cache_context_ack;
2234 
2235 #ifdef HAVE_GFX_WIDGETS
2236    bool gfx_widgets_paused;
2237    bool gfx_widgets_fast_forward;
2238    bool gfx_widgets_rewinding;
2239 #endif
2240 #ifdef HAVE_ACCESSIBILITY
2241    /* Is text-to-speech accessibility turned on? */
2242    bool accessibility_enabled;
2243 #endif
2244 #ifdef HAVE_CONFIGFILE
2245    bool rarch_block_config_read;
2246 #endif
2247 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
2248    bool cli_shader_disable;
2249 #endif
2250 
2251    bool location_driver_active;
2252    bool bluetooth_driver_active;
2253    bool wifi_driver_active;
2254    bool video_driver_active;
2255    bool audio_driver_active;
2256    bool camera_driver_active;
2257 #ifdef HAVE_VIDEO_FILTER
2258    bool video_driver_state_out_rgb32;
2259 #endif
2260    bool video_driver_crt_switching_active;
2261    bool video_driver_threaded;
2262 
2263    bool video_started_fullscreen;
2264 
2265    bool audio_driver_control;
2266    bool audio_driver_mute_enable;
2267    bool audio_driver_use_float;
2268 
2269    bool audio_suspended;
2270 
2271 #ifdef HAVE_RUNAHEAD
2272    bool has_variable_update;
2273    bool runahead_save_state_size_known;
2274    bool request_fast_savestate;
2275    bool hard_disable_audio;
2276 
2277    bool input_is_dirty;
2278 #endif
2279 
2280 #if defined(HAVE_NETWORKING)
2281    bool has_set_netplay_mode;
2282    bool has_set_netplay_ip_address;
2283    bool has_set_netplay_ip_port;
2284    bool has_set_netplay_stateless_mode;
2285    bool has_set_netplay_check_frames;
2286 #endif
2287 
2288    bool input_driver_keyboard_linefeed_enable;
2289 
2290    bool input_driver_block_hotkey;
2291    bool input_driver_block_libretro_input;
2292    bool input_driver_nonblock_state;
2293    bool input_driver_grab_mouse_state;
2294    bool input_driver_analog_requested[MAX_USERS];
2295 
2296    input_game_focus_state_t game_focus_state; /* bool alignment */
2297 
2298 #ifdef HAVE_MENU
2299    bool menu_input_dialog_keyboard_display;
2300    /* Is the menu driver still running? */
2301    bool menu_driver_alive;
2302    /* Are we binding a button inside the menu? */
2303    bool menu_driver_is_binding;
2304 #endif
2305 
2306    bool recording_enable;
2307    bool streaming_enable;
2308 
2309    bool midi_drv_input_enabled;
2310    bool midi_drv_output_enabled;
2311 
2312    bool midi_drv_output_pending;
2313 
2314    bool main_ui_companion_is_on_foreground;
2315    bool keyboard_mapping_blocked;
2316    retro_bits_512_t keyboard_mapping_bits;
2317 
2318 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
2319    bool shader_presets_need_reload;
2320 #endif
2321 #ifdef HAVE_RUNAHEAD
2322    bool runahead_video_driver_is_active;
2323    bool runahead_available;
2324    bool runahead_secondary_core_available;
2325    bool runahead_force_input_dirty;
2326 #endif
2327 
2328 #ifdef HAVE_AUDIOMIXER
2329    bool audio_driver_mixer_mute_enable;
2330    bool audio_mixer_active;
2331 #endif
2332 };
2333 
2334 static struct rarch_state         rarch_st;
2335 
2336 #ifdef HAVE_THREAD_STORAGE
2337 static const void *MAGIC_POINTER                                 = (void*)(uintptr_t)0x0DEFACED;
2338 #endif
2339 
2340 static runloop_core_status_msg_t runloop_core_status_msg         =
2341 {
2342    0,
2343    0.0f,
2344    "",
2345    false
2346 };
2347 
2348 #ifdef HAVE_LIBNX
2349 /* TODO/FIXME - public global variable */
2350 extern u32 __nx_applet_type;
2351 #endif
2352 
2353 static midi_driver_t *midi_drv                                   = &midi_null;
2354 static const video_display_server_t *current_display_server      = &dispserv_null;
2355 
2356 struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END] = {
2357    { 1.3333f,         "4:3"           },
2358    { 1.7778f,         "16:9"          },
2359    { 1.6f,            "16:10"         },
2360    { 16.0f / 15.0f,   "16:15"         },
2361    { 21.0f / 9.0f,    "21:9"          },
2362    { 1.0f,            "1:1"           },
2363    { 2.0f,            "2:1"           },
2364    { 1.5f,            "3:2"           },
2365    { 0.75f,           "3:4"           },
2366    { 4.0f,            "4:1"           },
2367    { 0.5625f,         "9:16"          },
2368    { 1.25f,           "5:4"           },
2369    { 1.2f,            "6:5"           },
2370    { 0.7777f,         "7:9"           },
2371    { 2.6666f,         "8:3"           },
2372    { 1.1428f,         "8:7"           },
2373    { 1.5833f,         "19:12"         },
2374    { 1.3571f,         "19:14"         },
2375    { 1.7647f,         "30:17"         },
2376    { 3.5555f,         "32:9"          },
2377    { 0.0f,            "Config"        },
2378    { 1.0f,            "Square pixel"  },
2379    { 1.0f,            "Core provided" },
2380    { 0.0f,            "Custom"        },
2381    { 1.3333f,         "Full" }
2382 };
2383 
2384 static gfx_api_gpu_map gpu_map[] = {
2385    { NULL,                   GFX_CTX_VULKAN_API     },
2386    { NULL,                   GFX_CTX_DIRECT3D10_API },
2387    { NULL,                   GFX_CTX_DIRECT3D11_API },
2388    { NULL,                   GFX_CTX_DIRECT3D12_API }
2389 };
2390 
2391 static const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = {
2392       DECLARE_BIND(b,         RETRO_DEVICE_ID_JOYPAD_B,      MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B),
2393       DECLARE_BIND(y,         RETRO_DEVICE_ID_JOYPAD_Y,      MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y),
2394       DECLARE_BIND(select,    RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT),
2395       DECLARE_BIND(start,     RETRO_DEVICE_ID_JOYPAD_START,  MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START),
2396       DECLARE_BIND(up,        RETRO_DEVICE_ID_JOYPAD_UP,     MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP),
2397       DECLARE_BIND(down,      RETRO_DEVICE_ID_JOYPAD_DOWN,   MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN),
2398       DECLARE_BIND(left,      RETRO_DEVICE_ID_JOYPAD_LEFT,   MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT),
2399       DECLARE_BIND(right,     RETRO_DEVICE_ID_JOYPAD_RIGHT,  MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT),
2400       DECLARE_BIND(a,         RETRO_DEVICE_ID_JOYPAD_A,      MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A),
2401       DECLARE_BIND(x,         RETRO_DEVICE_ID_JOYPAD_X,      MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X),
2402       DECLARE_BIND(l,         RETRO_DEVICE_ID_JOYPAD_L,      MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L),
2403       DECLARE_BIND(r,         RETRO_DEVICE_ID_JOYPAD_R,      MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R),
2404       DECLARE_BIND(l2,        RETRO_DEVICE_ID_JOYPAD_L2,     MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2),
2405       DECLARE_BIND(r2,        RETRO_DEVICE_ID_JOYPAD_R2,     MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2),
2406       DECLARE_BIND(l3,        RETRO_DEVICE_ID_JOYPAD_L3,     MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3),
2407       DECLARE_BIND(r3,        RETRO_DEVICE_ID_JOYPAD_R3,     MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3),
2408       DECLARE_BIND(l_x_plus,  RARCH_ANALOG_LEFT_X_PLUS,      MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS),
2409       DECLARE_BIND(l_x_minus, RARCH_ANALOG_LEFT_X_MINUS,     MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS),
2410       DECLARE_BIND(l_y_plus,  RARCH_ANALOG_LEFT_Y_PLUS,      MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS),
2411       DECLARE_BIND(l_y_minus, RARCH_ANALOG_LEFT_Y_MINUS,     MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS),
2412       DECLARE_BIND(r_x_plus,  RARCH_ANALOG_RIGHT_X_PLUS,     MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS),
2413       DECLARE_BIND(r_x_minus, RARCH_ANALOG_RIGHT_X_MINUS,    MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS),
2414       DECLARE_BIND(r_y_plus,  RARCH_ANALOG_RIGHT_Y_PLUS,     MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS),
2415       DECLARE_BIND(r_y_minus, RARCH_ANALOG_RIGHT_Y_MINUS,    MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS),
2416 
2417       DECLARE_BIND( gun_trigger,			RARCH_LIGHTGUN_TRIGGER,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER ),
2418       DECLARE_BIND( gun_offscreen_shot,RARCH_LIGHTGUN_RELOAD,	      MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD ),
2419       DECLARE_BIND( gun_aux_a,			RARCH_LIGHTGUN_AUX_A,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A ),
2420       DECLARE_BIND( gun_aux_b,			RARCH_LIGHTGUN_AUX_B,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B ),
2421       DECLARE_BIND( gun_aux_c,			RARCH_LIGHTGUN_AUX_C,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C ),
2422       DECLARE_BIND( gun_start,			RARCH_LIGHTGUN_START,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START ),
2423       DECLARE_BIND( gun_select,			RARCH_LIGHTGUN_SELECT,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT ),
2424       DECLARE_BIND( gun_dpad_up,			RARCH_LIGHTGUN_DPAD_UP,			MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP ),
2425       DECLARE_BIND( gun_dpad_down,		RARCH_LIGHTGUN_DPAD_DOWN,		MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN ),
2426       DECLARE_BIND( gun_dpad_left,		RARCH_LIGHTGUN_DPAD_LEFT,		MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT ),
2427       DECLARE_BIND( gun_dpad_right,		RARCH_LIGHTGUN_DPAD_RIGHT,		MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT ),
2428 
2429       DECLARE_BIND( turbo,             RARCH_TURBO_ENABLE,           MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE),
2430 
2431       DECLARE_META_BIND(1, toggle_fast_forward,   RARCH_FAST_FORWARD_KEY,      MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY),
2432       DECLARE_META_BIND(2, hold_fast_forward,     RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY),
2433       DECLARE_META_BIND(1, toggle_slowmotion,     RARCH_SLOWMOTION_KEY,        MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY),
2434       DECLARE_META_BIND(2, hold_slowmotion,       RARCH_SLOWMOTION_HOLD_KEY,   MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY),
2435       DECLARE_META_BIND(1, load_state,            RARCH_LOAD_STATE_KEY,        MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY),
2436       DECLARE_META_BIND(1, save_state,            RARCH_SAVE_STATE_KEY,        MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY),
2437       DECLARE_META_BIND(2, toggle_fullscreen,     RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY),
2438       DECLARE_META_BIND(2, close_content,         RARCH_CLOSE_CONTENT_KEY,     MENU_ENUM_LABEL_VALUE_INPUT_META_CLOSE_CONTENT_KEY),
2439 #ifdef HAVE_LAKKA
2440       DECLARE_META_BIND(2, exit_emulator,         RARCH_QUIT_KEY,              MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY),
2441 #else
2442       DECLARE_META_BIND(2, exit_emulator,         RARCH_QUIT_KEY,              MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY),
2443 #endif
2444       DECLARE_META_BIND(2, state_slot_increase,   RARCH_STATE_SLOT_PLUS,       MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS),
2445       DECLARE_META_BIND(2, state_slot_decrease,   RARCH_STATE_SLOT_MINUS,      MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS),
2446       DECLARE_META_BIND(1, rewind,                RARCH_REWIND,                MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND),
2447       DECLARE_META_BIND(2, movie_record_toggle,   RARCH_BSV_RECORD_TOGGLE,     MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE),
2448       DECLARE_META_BIND(2, pause_toggle,          RARCH_PAUSE_TOGGLE,          MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE),
2449       DECLARE_META_BIND(2, frame_advance,         RARCH_FRAMEADVANCE,          MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE),
2450       DECLARE_META_BIND(2, reset,                 RARCH_RESET,                 MENU_ENUM_LABEL_VALUE_INPUT_META_RESET),
2451       DECLARE_META_BIND(2, shader_next,           RARCH_SHADER_NEXT,           MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT),
2452       DECLARE_META_BIND(2, shader_prev,           RARCH_SHADER_PREV,           MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV),
2453       DECLARE_META_BIND(2, cheat_index_plus,      RARCH_CHEAT_INDEX_PLUS,      MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS),
2454       DECLARE_META_BIND(2, cheat_index_minus,     RARCH_CHEAT_INDEX_MINUS,     MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS),
2455       DECLARE_META_BIND(2, cheat_toggle,          RARCH_CHEAT_TOGGLE,          MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE),
2456       DECLARE_META_BIND(2, screenshot,            RARCH_SCREENSHOT,            MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT),
2457       DECLARE_META_BIND(2, audio_mute,            RARCH_MUTE,                  MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE),
2458       DECLARE_META_BIND(2, osk_toggle,            RARCH_OSK,                   MENU_ENUM_LABEL_VALUE_INPUT_META_OSK),
2459       DECLARE_META_BIND(2, fps_toggle,            RARCH_FPS_TOGGLE,            MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE),
2460       DECLARE_META_BIND(2, send_debug_info,       RARCH_SEND_DEBUG_INFO,       MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO),
2461       DECLARE_META_BIND(2, netplay_host_toggle,   RARCH_NETPLAY_HOST_TOGGLE,   MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE),
2462       DECLARE_META_BIND(2, netplay_game_watch,    RARCH_NETPLAY_GAME_WATCH,    MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH),
2463       DECLARE_META_BIND(2, enable_hotkey,         RARCH_ENABLE_HOTKEY,         MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY),
2464       DECLARE_META_BIND(2, volume_up,             RARCH_VOLUME_UP,             MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP),
2465       DECLARE_META_BIND(2, volume_down,           RARCH_VOLUME_DOWN,           MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN),
2466       DECLARE_META_BIND(2, overlay_next,          RARCH_OVERLAY_NEXT,          MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT),
2467       DECLARE_META_BIND(2, disk_eject_toggle,     RARCH_DISK_EJECT_TOGGLE,     MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE),
2468       DECLARE_META_BIND(2, disk_next,             RARCH_DISK_NEXT,             MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT),
2469       DECLARE_META_BIND(2, disk_prev,             RARCH_DISK_PREV,             MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV),
2470       DECLARE_META_BIND(2, grab_mouse_toggle,     RARCH_GRAB_MOUSE_TOGGLE,     MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE),
2471       DECLARE_META_BIND(2, game_focus_toggle,     RARCH_GAME_FOCUS_TOGGLE,     MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE),
2472       DECLARE_META_BIND(2, desktop_menu_toggle,   RARCH_UI_COMPANION_TOGGLE,   MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE),
2473 #ifdef HAVE_MENU
2474       DECLARE_META_BIND(1, menu_toggle,           RARCH_MENU_TOGGLE,           MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE),
2475 #endif
2476       DECLARE_META_BIND(2, recording_toggle,      RARCH_RECORDING_TOGGLE,      MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE),
2477       DECLARE_META_BIND(2, streaming_toggle,      RARCH_STREAMING_TOGGLE,      MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE),
2478       DECLARE_META_BIND(2, runahead_toggle,       RARCH_RUNAHEAD_TOGGLE,       MENU_ENUM_LABEL_VALUE_INPUT_META_RUNAHEAD_TOGGLE),
2479       DECLARE_META_BIND(2, ai_service,            RARCH_AI_SERVICE,            MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE),
2480 };
2481 
2482 /* TODO/FIXME - turn these into static global variable */
2483 #ifdef HAVE_DISCORD
2484 bool discord_is_inited                                          = false;
2485 #endif
2486 uint64_t lifecycle_state                                        = 0;
2487 unsigned subsystem_current_count                                = 0;
2488 struct retro_keybind input_config_binds[MAX_USERS][RARCH_BIND_LIST_END];
2489 struct retro_keybind input_autoconf_binds[MAX_USERS][RARCH_BIND_LIST_END];
2490 struct retro_subsystem_info subsystem_data[SUBSYSTEM_MAX_SUBSYSTEMS];
2491 
2492 #ifdef HAVE_MENU
2493 /* TODO/FIXME - public global variables */
2494 struct key_desc key_descriptors[RARCH_MAX_KEYS] =
2495 {
2496    {RETROK_FIRST,         "Unmapped"},
2497    {RETROK_BACKSPACE,     "Backspace"},
2498    {RETROK_TAB,           "Tab"},
2499    {RETROK_CLEAR,         "Clear"},
2500    {RETROK_RETURN,        "Return"},
2501    {RETROK_PAUSE,         "Pause"},
2502    {RETROK_ESCAPE,        "Escape"},
2503    {RETROK_SPACE,         "Space"},
2504    {RETROK_EXCLAIM,       "!"},
2505    {RETROK_QUOTEDBL,      "\""},
2506    {RETROK_HASH,          "#"},
2507    {RETROK_DOLLAR,        "$"},
2508    {RETROK_AMPERSAND,     "&"},
2509    {RETROK_QUOTE,         "\'"},
2510    {RETROK_LEFTPAREN,     "("},
2511    {RETROK_RIGHTPAREN,    ")"},
2512    {RETROK_ASTERISK,      "*"},
2513    {RETROK_PLUS,          "+"},
2514    {RETROK_COMMA,         ","},
2515    {RETROK_MINUS,         "-"},
2516    {RETROK_PERIOD,        "."},
2517    {RETROK_SLASH,         "/"},
2518    {RETROK_0,             "0"},
2519    {RETROK_1,             "1"},
2520    {RETROK_2,             "2"},
2521    {RETROK_3,             "3"},
2522    {RETROK_4,             "4"},
2523    {RETROK_5,             "5"},
2524    {RETROK_6,             "6"},
2525    {RETROK_7,             "7"},
2526    {RETROK_8,             "8"},
2527    {RETROK_9,             "9"},
2528    {RETROK_COLON,         ":"},
2529    {RETROK_SEMICOLON,     ";"},
2530    {RETROK_LESS,          "<"},
2531    {RETROK_EQUALS,        "="},
2532    {RETROK_GREATER,       ">"},
2533    {RETROK_QUESTION,      "?"},
2534    {RETROK_AT,            "@"},
2535    {RETROK_LEFTBRACKET,   "["},
2536    {RETROK_BACKSLASH,     "\\"},
2537    {RETROK_RIGHTBRACKET,  "]"},
2538    {RETROK_CARET,         "^"},
2539    {RETROK_UNDERSCORE,    "_"},
2540    {RETROK_BACKQUOTE,     "`"},
2541    {RETROK_a,             "A"},
2542    {RETROK_b,             "B"},
2543    {RETROK_c,             "C"},
2544    {RETROK_d,             "D"},
2545    {RETROK_e,             "E"},
2546    {RETROK_f,             "F"},
2547    {RETROK_g,             "G"},
2548    {RETROK_h,             "H"},
2549    {RETROK_i,             "I"},
2550    {RETROK_j,             "J"},
2551    {RETROK_k,             "K"},
2552    {RETROK_l,             "L"},
2553    {RETROK_m,             "M"},
2554    {RETROK_n,             "N"},
2555    {RETROK_o,             "O"},
2556    {RETROK_p,             "P"},
2557    {RETROK_q,             "Q"},
2558    {RETROK_r,             "R"},
2559    {RETROK_s,             "S"},
2560    {RETROK_t,             "T"},
2561    {RETROK_u,             "U"},
2562    {RETROK_v,             "V"},
2563    {RETROK_w,             "W"},
2564    {RETROK_x,             "X"},
2565    {RETROK_y,             "Y"},
2566    {RETROK_z,             "Z"},
2567    {RETROK_DELETE,        "Delete"},
2568 
2569    {RETROK_KP0,           "Numpad 0"},
2570    {RETROK_KP1,           "Numpad 1"},
2571    {RETROK_KP2,           "Numpad 2"},
2572    {RETROK_KP3,           "Numpad 3"},
2573    {RETROK_KP4,           "Numpad 4"},
2574    {RETROK_KP5,           "Numpad 5"},
2575    {RETROK_KP6,           "Numpad 6"},
2576    {RETROK_KP7,           "Numpad 7"},
2577    {RETROK_KP8,           "Numpad 8"},
2578    {RETROK_KP9,           "Numpad 9"},
2579    {RETROK_KP_PERIOD,     "Numpad ."},
2580    {RETROK_KP_DIVIDE,     "Numpad /"},
2581    {RETROK_KP_MULTIPLY,   "Numpad *"},
2582    {RETROK_KP_MINUS,      "Numpad -"},
2583    {RETROK_KP_PLUS,       "Numpad +"},
2584    {RETROK_KP_ENTER,      "Numpad Enter"},
2585    {RETROK_KP_EQUALS,     "Numpad ="},
2586 
2587    {RETROK_UP,            "Up"},
2588    {RETROK_DOWN,          "Down"},
2589    {RETROK_RIGHT,         "Right"},
2590    {RETROK_LEFT,          "Left"},
2591    {RETROK_INSERT,        "Insert"},
2592    {RETROK_HOME,          "Home"},
2593    {RETROK_END,           "End"},
2594    {RETROK_PAGEUP,        "Page Up"},
2595    {RETROK_PAGEDOWN,      "Page Down"},
2596 
2597    {RETROK_F1,            "F1"},
2598    {RETROK_F2,            "F2"},
2599    {RETROK_F3,            "F3"},
2600    {RETROK_F4,            "F4"},
2601    {RETROK_F5,            "F5"},
2602    {RETROK_F6,            "F6"},
2603    {RETROK_F7,            "F7"},
2604    {RETROK_F8,            "F8"},
2605    {RETROK_F9,            "F9"},
2606    {RETROK_F10,           "F10"},
2607    {RETROK_F11,           "F11"},
2608    {RETROK_F12,           "F12"},
2609    {RETROK_F13,           "F13"},
2610    {RETROK_F14,           "F14"},
2611    {RETROK_F15,           "F15"},
2612 
2613    {RETROK_NUMLOCK,       "Num Lock"},
2614    {RETROK_CAPSLOCK,      "Caps Lock"},
2615    {RETROK_SCROLLOCK,     "Scroll Lock"},
2616    {RETROK_RSHIFT,        "Right Shift"},
2617    {RETROK_LSHIFT,        "Left Shift"},
2618    {RETROK_RCTRL,         "Right Control"},
2619    {RETROK_LCTRL,         "Left Control"},
2620    {RETROK_RALT,          "Right Alt"},
2621    {RETROK_LALT,          "Left Alt"},
2622    {RETROK_RMETA,         "Right Meta"},
2623    {RETROK_LMETA,         "Left Meta"},
2624    {RETROK_RSUPER,        "Right Super"},
2625    {RETROK_LSUPER,        "Left Super"},
2626    {RETROK_MODE,          "Mode"},
2627    {RETROK_COMPOSE,       "Compose"},
2628 
2629    {RETROK_HELP,          "Help"},
2630    {RETROK_PRINT,         "Print"},
2631    {RETROK_SYSREQ,        "Sys Req"},
2632    {RETROK_BREAK,         "Break"},
2633    {RETROK_MENU,          "Menu"},
2634    {RETROK_POWER,         "Power"},
2635    {RETROK_EURO,          {-30, -126, -84, 0}}, /* "�" */
2636    {RETROK_UNDO,          "Undo"},
2637    {RETROK_OEM_102,       "OEM-102"}
2638 };
2639 
null_menu_init(void ** userdata,bool video_is_threaded)2640 static void *null_menu_init(void **userdata, bool video_is_threaded)
2641 {
2642    menu_handle_t *menu = (menu_handle_t*)calloc(1, sizeof(*menu));
2643    if (!menu)
2644       return NULL;
2645    return menu;
2646 }
2647 
null_menu_list_bind_init(menu_file_list_cbs_t * cbs,const char * path,const char * label,unsigned type,size_t idx)2648 static int null_menu_list_bind_init(menu_file_list_cbs_t *cbs,
2649       const char *path, const char *label, unsigned type, size_t idx) { return 0; }
2650 
2651 static menu_ctx_driver_t menu_ctx_null = {
2652   NULL,  /* set_texture */
2653   NULL,  /* render_messagebox */
2654   NULL,  /* render */
2655   NULL,  /* frame */
2656   null_menu_init,
2657   NULL,  /* free */
2658   NULL,  /* context_reset */
2659   NULL,  /* context_destroy */
2660   NULL,  /* populate_entries */
2661   NULL,  /* toggle */
2662   NULL,  /* navigation_clear */
2663   NULL,  /* navigation_decrement */
2664   NULL,  /* navigation_increment */
2665   NULL,  /* navigation_set */
2666   NULL,  /* navigation_set_last */
2667   NULL,  /* navigation_descend_alphabet */
2668   NULL,  /* navigation_ascend_alphabet */
2669   NULL,  /* lists_init */
2670   NULL,  /* list_insert */
2671   NULL,  /* list_prepend */
2672   NULL,  /* list_delete */
2673   NULL,  /* list_clear */
2674   NULL,  /* list_cache */
2675   NULL,  /* list_push */
2676   NULL,  /* list_get_selection */
2677   NULL,  /* list_get_size */
2678   NULL,  /* list_get_entry */
2679   NULL,  /* list_set_selection */
2680   null_menu_list_bind_init,
2681   NULL,  /* load_image */
2682   "null",
2683   NULL,  /* environ */
2684   NULL,  /* update_thumbnail_path */
2685   NULL,  /* update_thumbnail_image */
2686   NULL,  /* refresh_thumbnail_image */
2687   NULL,  /* set_thumbnail_system */
2688   NULL,  /* get_thumbnail_system */
2689   NULL,  /* set_thumbnail_content */
2690   NULL,  /* osk_ptr_at_pos */
2691   NULL,  /* update_savestate_thumbnail_path */
2692   NULL,  /* update_savestate_thumbnail_image */
2693   NULL,  /* pointer_down */
2694   NULL,  /* pointer_up   */
2695   NULL   /* entry_action */
2696 };
2697 
2698 /* Menu drivers */
2699 static const menu_ctx_driver_t *menu_ctx_drivers[] = {
2700 #if defined(HAVE_MATERIALUI)
2701    &menu_ctx_mui,
2702 #endif
2703 #if defined(HAVE_OZONE)
2704    &menu_ctx_ozone,
2705 #endif
2706 #if defined(HAVE_RGUI)
2707    &menu_ctx_rgui,
2708 #endif
2709 #if defined(HAVE_STRIPES)
2710    &menu_ctx_stripes,
2711 #endif
2712 #if defined(HAVE_XMB)
2713    &menu_ctx_xmb,
2714 #endif
2715    &menu_ctx_null,
2716    NULL
2717 };
2718 #endif
2719