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(¤t_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