From bdc68b1044d36b56c749931bf320ea380aa24398 Mon Sep 17 00:00:00 2001 From: natinusala Date: Wed, 28 Nov 2018 14:52:05 +0100 Subject: [PATCH 001/116] Lakka: rename Quit RetroArch to Restart RetroArch (english & french) --- intl/msg_hash_ar.h | 17 +++++++++++++++++ intl/msg_hash_cht.h | 7 +++++++ intl/msg_hash_eo.h | 22 ++++++++++++++++++++++ intl/msg_hash_fr.h | 17 +++++++++++++++++ intl/msg_hash_ko.h | 7 +++++++ intl/msg_hash_us.h | 44 ++++++++++++++++++++++++++++++++------------ intl/msg_hash_vn.h | 17 +++++++++++++++++ 7 files changed, 119 insertions(+), 12 deletions(-) diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index b4ba128781..51d335b326 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -888,8 +888,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, "Overlay next") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pause toggle") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Restart RetroArch") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, "Quit RetroArch") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, "Reset game") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, @@ -2662,8 +2667,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, "Show network interface(s) and associated IP addresses.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, "Show information specific to the device.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Restart the program.") +#else MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, "Quit the program.") +#endif MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, "Set the custom width size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, @@ -3337,10 +3347,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, "Show Help") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Show/hide the 'Help' option.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option.") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, "Show Quit RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, "Show/hide the 'Quit RetroArch' option.") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Show Reboot") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index ad767dcb25..fe9142de21 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -3145,10 +3145,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, "顯示 Help") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "顯示/隱藏 the 'Help' option.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "顯示 Restart RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "顯示/隱藏 the 'Restart RetroArch' option.") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, "顯示 Quit RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, "顯示/隱藏 the 'Quit RetroArch' option.") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "顯示 Reboot") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index b4eda865a4..4d2d6a1351 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -745,8 +745,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, "Overlay next") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pause toggle") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Restart RetroArch") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, "Quit RetroArch") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, "Reset game") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, @@ -1055,8 +1060,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PRESENT, "Present") MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, "Privacy") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "Restart RetroArch") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, "Quit RetroArch") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, "Analog supported") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, @@ -2365,8 +2375,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, "Show network interface(s) and associated IP addresses.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, "Show information specific to the device.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Restart the program.") +#else MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, "Quit the program.") +#endif MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, "Set the custom width size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, @@ -3020,10 +3035,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, "Show Help") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Show/hide the 'Help' option.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option.") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, "Show Quit RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, "Show/hide the 'Quit RetroArch' option.") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Show Reboot") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 0d2de27a1b..e886c3bc00 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -828,8 +828,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, "Overlay suivant") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pause") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Redémarrer RetroArch") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, "Quitter RetroArch") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, "Redémarrer le jeu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, @@ -1162,8 +1167,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PRESENT, "Présent") MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, "Confidentialité") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "Redémarrer RetroArch") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, "Quitter RetroArch") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, "Support de l'analogique") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, @@ -3179,10 +3189,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, "Afficher l'aide") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Afficher/cacher l'option 'Afficher l'aide'.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Afficher Redémarrer RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Afficher/cacher l'option 'Redémarrer RetroArch'.") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, "Afficher Quitter RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, "Afficher/cacher l'option 'Quitter RetroArch'.") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Afficher Redémarrer") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 1a16c5793d..ff58ec9500 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -3140,10 +3140,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, "Show Help") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Show/hide the 'Help' option.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option.") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, "Show Quit RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, "Show/hide the 'Quit RetroArch' option.") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Show Reboot") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index bc5a90f3be..95ab759629 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1299,10 +1299,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pause toggle" ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Restart RetroArch" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, "Quit RetroArch" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, "Reset game" @@ -2051,10 +2058,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS, "MIDI" ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "Restart RetroArch" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, "Quit RetroArch" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, "Analog supported" @@ -4896,10 +4910,13 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, "Show information specific to the device." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_QUIT_RETROARCH, - "Quit the program." - ) +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Restart the program.") +#else +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Quit the program.") +#endif MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, "Set the custom width for the display window." @@ -6087,14 +6104,17 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Show/hide the 'Help' option." ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Show Quit RetroArch" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Show/hide the 'Quit RetroArch' option." - ) +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option.") +#else +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Quit RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Quit RetroArch' option.") +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Show Reboot" diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index e1c45a5d7e..d0919d746c 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -828,8 +828,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, "Overlay next") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pause toggle") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Restart RetroArch") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, "Quit RetroArch") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, "Reset game") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, @@ -2530,8 +2535,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, "Show network interface(s) and associated IP addresses.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, "Show information specific to the device.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Restart the program.") +#else MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, "Quit the program.") +#endif MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, "Set the custom width size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, @@ -3177,10 +3187,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, "Show Help") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Show/hide the 'Help' option.") +#ifdef HAVE_LAKKA +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option.") +#else MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, "Show Quit RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, "Show/hide the 'Quit RetroArch' option.") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Show Reboot") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, From 45c85aa6fe6c21f3437e4dfcd031ebbc0dbad06e Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 22 Dec 2018 14:51:33 -0800 Subject: [PATCH 002/116] xmb: Don't show a black background without assets. This also now only hides the time icon instead of the entire time without assets. Fixes https://github.com/libretro/RetroArch/issues/7795 --- menu/drivers/xmb.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) mode change 100755 => 100644 menu/drivers/xmb.c diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c old mode 100755 new mode 100644 index 8e212f474b..e3604a42f5 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -370,7 +370,6 @@ static float item_color[] = { 1, 1, 1, 1 }; - float gradient_dark_purple[16] = { 20/255.0, 13/255.0, 20/255.0, 1.0, 20/255.0, 13/255.0, 20/255.0, 1.0, @@ -2023,7 +2022,6 @@ static void xmb_context_reset_horizontal_list( continue; } - file_list_get_at_offset(xmb->horizontal_list, i, &path, NULL, NULL, NULL); @@ -2192,7 +2190,6 @@ static void xmb_list_open(xmb_handle_t *xmb) xmb_list_open_new(xmb, selection_buf, dir, selection); - entry.duration = XMB_DELAY; entry.target_value = xmb->icon_size * -(xmb->depth*2-2); entry.subject = &xmb->x; @@ -2314,7 +2311,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR: return xmb->textures.list[XMB_TEXTURE_RDB]; - /* Menu collection submenus*/ case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: return xmb->textures.list[XMB_TEXTURE_ZIP]; @@ -2965,7 +2961,6 @@ static int xmb_draw_item( TEXT_ALIGN_LEFT, width, height, xmb->font); - menu_display_set_alpha(color, MIN(node->alpha, xmb->alpha)); if ( @@ -2995,7 +2990,6 @@ static int xmb_draw_item( menu_display_rotate_z(&rotate_draw, video_info); - xmb_draw_icon(video_info, xmb->icon_size, &mymat_tmp, @@ -3795,13 +3789,13 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) } } - if (video_info->timedate_enable && !xmb->assets_missing) + if (video_info->timedate_enable) { menu_display_ctx_datetime_t datetime; char timedate[255]; int x_pos = 0; - if (coord_white[3] != 0) + if (coord_white[3] != 0 && !xmb->assets_missing) { int x_pos = 0; @@ -4162,7 +4156,6 @@ static void xmb_layout_ps3(xmb_handle_t *xmb, int width) xmb->font2_size = 24.0 * scale_factor; new_header_height = 128.0 * scale_factor; - xmb->thumbnail_width = 1024.0 * scale_factor; xmb->left_thumbnail_width = 1024.0 * scale_factor; xmb->savestate_thumbnail_width= 460.0 * scale_factor; @@ -4876,6 +4869,8 @@ static void xmb_context_reset_textures( settings_t *settings = config_get_ptr(); xmb->assets_missing = false; + menu_display_allocate_white_texture(); + for (i = 0; i < XMB_TEXTURE_LAST; i++) { if (!menu_display_reset_textures_list(xmb_texture_path(i), iconpath, &xmb->textures.list[i], TEXTURE_FILTER_MIPMAP_LINEAR)) @@ -4910,8 +4905,6 @@ static void xmb_context_reset_textures( } } - menu_display_allocate_white_texture(); - xmb->main_menu_node.icon = xmb->textures.list[XMB_TEXTURE_MAIN_MENU]; xmb->main_menu_node.alpha = xmb->categories_active_alpha; xmb->main_menu_node.zoom = xmb->categories_active_zoom; @@ -4957,7 +4950,7 @@ static void xmb_context_reset_textures( return; error: - xmb->assets_missing = true ; + xmb->assets_missing = true; RARCH_WARN("[XMB] Critical asset missing, no icons will be drawn\n"); return; } @@ -5347,7 +5340,6 @@ static void xmb_list_cache(void *data, enum menu_list_type type, unsigned action } } - static void xmb_context_destroy(void *data) { unsigned i; @@ -5547,7 +5539,6 @@ static int xmb_list_push(void *data, void *userdata, if (settings->bools.menu_show_load_content) { - entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); /* Core fully loaded, use the subsystem data */ From 0b8e39dd6b1b509b78ae4afaa3a5d90c58f210e6 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 22 Dec 2018 20:36:42 -0500 Subject: [PATCH 003/116] fix #7002 --- menu/cbs/menu_cbs_left.c | 2 ++ menu/cbs/menu_cbs_right.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index fe390d3f4a..2fcb431cf5 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -505,6 +505,8 @@ static int menu_cbs_init_bind_left_compare_label(menu_file_list_cbs_t *cbs, { switch (cbs->enum_idx) { + case MENU_ENUM_LABEL_SUBSYSTEM_ADD: + case MENU_ENUM_LABEL_SUBSYSTEM_LOAD: case MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM: BIND_ACTION_LEFT(cbs, action_left_mainmenu); break; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index f1b3859530..f0f902a2c2 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -634,6 +634,8 @@ static int menu_cbs_init_bind_right_compare_label(menu_file_list_cbs_t *cbs, { switch (cbs->enum_idx) { + case MENU_ENUM_LABEL_SUBSYSTEM_ADD: + case MENU_ENUM_LABEL_SUBSYSTEM_LOAD: case MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM: BIND_ACTION_RIGHT(cbs, action_right_mainmenu); break; From 2675fa26c074ec29bf6fdaec53111706ac0171d8 Mon Sep 17 00:00:00 2001 From: markwkidd Date: Sun, 23 Dec 2018 09:59:37 -0500 Subject: [PATCH 004/116] Update theme selection sublabel in msg_hash_us.h This PR updates the sub-label for the Menu Icon Theme in order to: 1. remove the outdated instruction to restart RA 2. reflect that the theme setting controls more than just icons --- intl/msg_hash_us.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 861dec2e47..2378305be4 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -5646,7 +5646,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_XMB_THEME, - "Select a different theme for the icon. Changes will take effect after you restart the program." + "Select a different icon theme for RetroArch." ) MSG_HASH( MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, From 6eae0df01080ae37d93b5d8eef437dfcbb4f6f7a Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Dec 2018 11:16:42 -0500 Subject: [PATCH 005/116] reset on hardcore enable --- intl/msg_hash_us.h | 2 +- menu/menu_setting.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 2378305be4..33fc6b1876 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3558,7 +3558,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Enable or disable savestates, cheats, rewind, pause, and slow-motion for all games." + "Enables hardcore mode, this will enable or disable savestates, cheats, rewind, pause, and slow-motion.\nToggling this setting at runtime will restart your game." ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index c46ad63d68..00aea98a01 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -3021,12 +3021,12 @@ static void achievement_hardcore_mode_write_handler(rarch_setting_t *setting) if (!setting) return; - if (settings && settings->bools.cheevos_hardcore_mode_enable + if (settings && settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable && cheevos_state_loaded_flag ) { - cheevos_hardcore_paused = true; - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEEVOS_HARDCORE_MODE_DISABLED), 0, 180, true); + cheevos_toggle_hardcore_mode(); + command_event(CMD_EVENT_RESET, NULL); return; } } @@ -9289,7 +9289,7 @@ static bool setting_append_list( &group_info, &subgroup_info, parent_group, - general_write_handler, + achievement_hardcore_mode_write_handler, general_read_handler, SD_FLAG_NONE ); From 3c5a391c9e8804fe8fdaf7f7c796a0127ad4cb92 Mon Sep 17 00:00:00 2001 From: langerhans Date: Sat, 22 Dec 2018 00:23:54 +0100 Subject: [PATCH 006/116] Android: Implement Gradle build for easy debugging Adds a CoreSideLoadingActivity to sideload cores for debugging purposes. Adds instructions on how to debug both the RetroArch frontend and cores from within Android Studio Co-authored-by: natinusala --- pkg/android/phoenix-gradle/.gitignore | 135 ++++++++++++ pkg/android/phoenix-gradle/README.md | 83 ++++++++ pkg/android/phoenix-gradle/app/build.gradle | 68 +++++++ .../app/src/main/AndroidManifest.xml | 43 ++++ pkg/android/phoenix-gradle/build.gradle | 17 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + pkg/android/phoenix-gradle/gradlew | 172 ++++++++++++++++ pkg/android/phoenix-gradle/gradlew.bat | 84 ++++++++ pkg/android/phoenix-gradle/settings.gradle | 1 + .../sideload_core_android_studio.png | Bin 0 -> 102975 bytes pkg/android/phoenix/AndroidManifest.xml | 1 + .../browser/debug/CoreSideloadActivity.java | 192 ++++++++++++++++++ pkg/android/phoenix64/AndroidManifest.xml | 1 + 14 files changed, 802 insertions(+) create mode 100644 pkg/android/phoenix-gradle/.gitignore create mode 100644 pkg/android/phoenix-gradle/README.md create mode 100644 pkg/android/phoenix-gradle/app/build.gradle create mode 100644 pkg/android/phoenix-gradle/app/src/main/AndroidManifest.xml create mode 100644 pkg/android/phoenix-gradle/build.gradle create mode 100644 pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.jar create mode 100644 pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.properties create mode 100644 pkg/android/phoenix-gradle/gradlew create mode 100644 pkg/android/phoenix-gradle/gradlew.bat create mode 100644 pkg/android/phoenix-gradle/settings.gradle create mode 100644 pkg/android/phoenix-gradle/sideload_core_android_studio.png create mode 100644 pkg/android/phoenix/src/com/retroarch/browser/debug/CoreSideloadActivity.java diff --git a/pkg/android/phoenix-gradle/.gitignore b/pkg/android/phoenix-gradle/.gitignore new file mode 100644 index 0000000000..5559a70cbb --- /dev/null +++ b/pkg/android/phoenix-gradle/.gitignore @@ -0,0 +1,135 @@ + +# Created by https://www.gitignore.io/api/androidstudio +# Edit at https://www.gitignore.io/?templates=androidstudio + +### AndroidStudio ### +# Covers files to be ignored for android development using Android Studio. + +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle +.gradle/ +build/ + +# Signing files +.signing/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio +/*/build/ +/*/local.properties +/*/out +/*/*/build +/*/*/production +captures/ +.navigation/ +*.ipr +*~ +*.swp + +# Android Patch +gen-external-apklibs + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# NDK +obj/ + +# IntelliJ IDEA +*.iml +*.iws +/out/ + +# User-specific configurations +.idea/caches/ +.idea/libraries/ +.idea/shelf/ +.idea/workspace.xml +.idea/tasks.xml +.idea/.name +.idea/compiler.xml +.idea/copyright/profiles_settings.xml +.idea/encodings.xml +.idea/misc.xml +.idea/modules.xml +.idea/scopes/scope_settings.xml +.idea/dictionaries +.idea/vcs.xml +.idea/jsLibraryMappings.xml +.idea/datasources.xml +.idea/dataSources.ids +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml +.idea/assetWizardSettings.xml + +# OS-specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Legacy Eclipse project files +.classpath +.project +.cproject +.settings/ + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.war +*.ear + +# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) +hs_err_pid* + +## Plugin-specific files: + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Mongo Explorer plugin +.idea/mongoSettings.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### AndroidStudio Patch ### + +!/gradle/wrapper/gradle-wrapper.jar + +# End of https://www.gitignore.io/api/androidstudio diff --git a/pkg/android/phoenix-gradle/README.md b/pkg/android/phoenix-gradle/README.md new file mode 100644 index 0000000000..faca8c28b4 --- /dev/null +++ b/pkg/android/phoenix-gradle/README.md @@ -0,0 +1,83 @@ +Phoenix Gradle Build +==================== + +Implements a Gradle build based on the existing phoenix sources. + +It is currently only useful for running and debugging the RetroArch frontend in Android Studio. +This is caused by the fact that this build can't support the same older API level that the old Ant +based build does. The minimum supported API level for this build is 16. Also this will not build the +mips variant cause support for this architecture has long been removed from the Android NDK. +The only file that had to be duplicated is the AndroidManifest.xml because the modern Android build +won't allow SDK versions defined in this file anymore. It's also easier to change the app name this way. + +To get this running follow these steps: + +* Install the Android SDK Platform 28 +* Install the latest Android NDK +* Import the project into Android Studio +* Make sure to select the appropriate build variant for your device (32 or 64 bit) + +Sideloading a core +------------------ + +The `CoreSideloadActivity` activity allows you to sideload and run a core (with content) from your computer through ADB. + +**Keep in mind that forcefully stopping the process will not save any configuration you did in RetroArch. If you want your config to be saved, use "Quit RetroArch" in the main menu.** + +Usage : + +``` +adb shell am force-stop +adb push /data/local/tmp +adb shell am start -n /com.retroarch.browser.debug.CoreSideloadActivity --es "LIBRETRO" "/data/local/tmp/" --es "ROM" "" +``` + +Where `` is the target RetroArch app package name : + - `com.retroarch` (RetroArch) + - `com.retroarch.aarch64` (RetroArch64) +`` is the path to the content to load (on your device) (optional) +and `` is the path to the core to sideload (on your computer). + +Alternatively you can set up Android Studio so that it prompts you for a core file to sideload on launching the app. +In the Run/Debug configuration dialog add another run configuration as outlined in the following screenshot +![Sideload run configuration](sideload_core_android_studio.png) +Specifically take note of the Launch Options section and make sure to add a new step to the "Before launch" section that prompts for the +core file to load. The tool configuration is shown on the right. If yu run this configuration a file chooser dialog will show +where you can select the core to load. Keep in mind the filename is hardcoded so every time you load a different core it will be +overwritten. You can create multiple configurations like this to work around this limitation. + + +Debugging a core +---------------- + +This has so far only been tested with a limited number of cores that use ndk-build. In theory this also works with CMake, but that's currently untested. + +Following is an example of what it takes to debug the dosbox-svn core in Android Studio. It is based on the sideload technique outlined above. + +**Note**: Make sure the filename of the core does not get changed. Set up your Run/Debug configuration accordingly (Launch flags and ADB arguments)! Otherwise debugging will not work. + +* Clone dosbox-svn next to your RetroArch repo +* Run `ndk-build NDK_DEBUG=1` in dosbox-svn/libretro/jni +* In Android Studio create a new Gradle module of type Android Library. You can delete everything but AndroidManifest.xml and build.gradle from the new directory. +* In the newly created build.gradle file add the following in the `defaultConfig {}` block: +``` +ndk { + moduleName "dosbox-svn" +} +``` +Also add the following in the `android {}` block: +``` +externalNativeBuild { + ndkBuild { + path file('../../../../../dosbox-svn/libretro/jni/Android.mk') + } +} +``` +* Let the offered Gradle Sync run. You should see the core sources pop up in Android Studio. +* Set a breakpoint in the core code. + * A good example to check if the setup is working is `retro_get_system_info` which is called on core load +* In the Run/Debug Configurations dialog in Android Studio under Debugger -> Symbol Directories make sure to have your core symbols loaded. You should have two directories there (as per your architecture and core): + * /path/to/phoenix-gradle/app/build/intermediates/ndkBuild/ra<32 or 64>/debug/obj/local/ + * /path/to/dosbox-svn/libretro/obj/local/ +* Start the app with the sideload debug config from Android Studio +* The breakpoint should trigger once the core gets loaded diff --git a/pkg/android/phoenix-gradle/app/build.gradle b/pkg/android/phoenix-gradle/app/build.gradle new file mode 100644 index 0000000000..a5d62c00ea --- /dev/null +++ b/pkg/android/phoenix-gradle/app/build.gradle @@ -0,0 +1,68 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + buildToolsVersion "28.0.3" + + defaultConfig { + applicationId "com.retroarch" + minSdkVersion 16 + targetSdkVersion 28 + + ndk { + moduleName "retroarch-activity" + } + + externalNativeBuild { + ndkBuild { + arguments "-j${Runtime.runtime.availableProcessors()}" + } + } + } + + flavorDimensions "abi" + productFlavors { + ra32 { + dimension "abi" + ndk { + abiFilters 'armeabi-v7a', 'x86' + } + resValue "string", "app_name", "RetroArch" + } + ra64 { + dimension "abi" + ndk { + abiFilters 'arm64-v8a', 'x86_64' + } + applicationIdSuffix '.aarch64' + resValue "string", "app_name", "RetroArch (AArch64)" + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } + externalNativeBuild { + ndkBuild { + path file('../../phoenix/jni/Android.mk') + } + } + + sourceSets { + ra32 { + java.srcDirs = ['../../phoenix/src'] + res.srcDirs = ['../../phoenix/res', '../../phoenix/libs/googleplay/res'] + } + ra64 { + java.srcDirs = ['../../phoenix/src'] + res.srcDirs = ['../../phoenix64/res', '../../phoenix64/libs/googleplay/res'] + } + } +} + +dependencies { + implementation files('../../phoenix/libs/googleplay/libs/google-play-services.jar') +} diff --git a/pkg/android/phoenix-gradle/app/src/main/AndroidManifest.xml b/pkg/android/phoenix-gradle/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..18f81c4611 --- /dev/null +++ b/pkg/android/phoenix-gradle/app/src/main/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/android/phoenix-gradle/build.gradle b/pkg/android/phoenix-gradle/build.gradle new file mode 100644 index 0000000000..2b29ba2521 --- /dev/null +++ b/pkg/android/phoenix-gradle/build.gradle @@ -0,0 +1,17 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} diff --git a/pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.jar b/pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 zzqSuO91lJod(SBDDw<*sX(+F6Uq~YAeYV#2A;XQu_p=N5X+#cmu19Qk>QAnV=k!?wbk5I;tDWgFc}0NkvC*G=V+Yh1cyeJVq~9czZiDXe+S=VfL2g`LWo8om z$Y~FQc6MFjV-t1Y`^D9XMwY*U_re2R?&(O~68T&D4S{X`6JYU-pz=}ew-)V0AOUT1 zVOkHAB-8uBcRjLvz<9HS#a@X*Kc@|W)nyiSgi|u5$Md|P()%2(?olGg@ypoJwp6>m z*dnfjjWC>?_1p;%1brqZyDRR;8EntVA92EJ3ByOxj6a+bhPl z;a?m4rQAV1@QU^#M1HX)0+}A<7TCO`ZR_RzF}X9-M>cRLyN4C+lCk2)kT^3gN^`IT zNP~fAm(wyIoR+l^lQDA(e1Yv}&$I!n?&*p6?lZcQ+vGLLd~fM)qt}wsbf3r=tmVYe zl)ntf#E!P7wlakP9MXS7m0nsAmqxZ*)#j;M&0De`oNmFgi$ov#!`6^4)iQyxg5Iuj zjLAhzQ)r`^hf7`*1`Rh`X;LVBtDSz@0T?kkT1o!ijeyTGt5vc^Cd*tmNgiNo^EaWvaC8$e+nb_{W01j3%=1Y&92YacjCi>eNbwk%-gPQ@H-+4xskQ}f_c=jg^S-# zYFBDf)2?@5cy@^@FHK5$YdAK9cI;!?Jgd}25lOW%xbCJ>By3=HiK@1EM+I46A)Lsd zeT|ZH;KlCml=@;5+hfYf>QNOr^XNH%J-lvev)$Omy8MZ`!{`j>(J5cG&ZXXgv)TaF zg;cz99i$4CX_@3MIb?GL0s*8J=3`#P(jXF(_(6DXZjc@(@h&=M&JG)9&Te1?(^XMW zjjC_70|b=9hB6pKQi`S^Ls7JyJw^@P>Ko^&q8F&?>6i;#CbxUiLz1ZH4lNyd@QACd zu>{!sqjB!2Dg}pbAXD>d!3jW}=5aN0b;rw*W>*PAxm7D)aw(c*RX2@bTGEI|RRp}vw7;NR2wa;rXN{L{Q#=Fa z$x@ms6pqb>!8AuV(prv>|aU8oWV={C&$c zMa=p=CDNOC2tISZcd8~18GN5oTbKY+Vrq;3_obJlfSKRMk;Hdp1`y`&LNSOqeauR_ z^j*Ojl3Ohzb5-a49A8s|UnM*NM8tg}BJXdci5%h&;$afbmRpN0&~9rCnBA`#lG!p zc{(9Y?A0Y9yo?wSYn>iigf~KP$0*@bGZ>*YM4&D;@{<%Gg5^uUJGRrV4 z(aZOGB&{_0f*O=Oi0k{@8vN^BU>s3jJRS&CJOl3o|BE{FAA&a#2YYiX3pZz@|Go-F z|Fly;7eX2OTs>R}<`4RwpHFs9nwh)B28*o5qK1Ge=_^w0m`uJOv!=&!tzt#Save(C zgKU=Bsgql|`ui(e1KVxR`?>Dx>(rD1$iWp&m`v)3A!j5(6vBm*z|aKm*T*)mo(W;R zNGo2`KM!^SS7+*9YxTm6YMm_oSrLceqN*nDOAtagULuZl5Q<7mOnB@Hq&P|#9y{5B z!2x+2s<%Cv2Aa0+u{bjZXS);#IFPk(Ph-K7K?3i|4ro> zRbqJoiOEYo(Im^((r}U4b8nvo_>4<`)ut`24?ILnglT;Pd&U}$lV3U$F9#PD(O=yV zgNNA=GW|(E=&m_1;uaNmipQe?pon4{T=zK!N!2_CJL0E*R^XXIKf*wi!>@l}3_P9Z zF~JyMbW!+n-+>!u=A1ESxzkJy$DRuG+$oioG7(@Et|xVbJ#BCt;J43Nvj@MKvTxzy zMmjNuc#LXBxFAwIGZJk~^!q$*`FME}yKE8d1f5Mp}KHNq(@=Z8YxV}0@;YS~|SpGg$_jG7>_8WWYcVx#4SxpzlV9N4aO>K{c z$P?a_fyDzGX$Of3@ykvedGd<@-R;M^Shlj*SswJLD+j@hi_&_>6WZ}#AYLR0iWMK|A zH_NBeu(tMyG=6VO-=Pb>-Q#$F*or}KmEGg*-n?vWQREURdB#+6AvOj*I%!R-4E_2$ zU5n9m>RWs|Wr;h2DaO&mFBdDb-Z{APGQx$(L`if?C|njd*fC=rTS%{o69U|meRvu?N;Z|Y zbT|ojL>j;q*?xXmnHH#3R4O-59NV1j=uapkK7}6@Wo*^Nd#(;$iuGsb;H315xh3pl zHaJ>h-_$hdNl{+|Zb%DZH%ES;*P*v0#}g|vrKm9;j-9e1M4qX@zkl&5OiwnCz=tb6 zz<6HXD+rGIVpGtkb{Q^LIgExOm zz?I|oO9)!BOLW#krLmWvX5(k!h{i>ots*EhpvAE;06K|u_c~y{#b|UxQ*O@Ks=bca z^_F0a@61j3I(Ziv{xLb8AXQj3;R{f_l6a#H5ukg5rxwF9A$?Qp-Mo54`N-SKc}fWp z0T)-L@V$$&my;l#Ha{O@!fK4-FSA)L&3<${Hcwa7ue`=f&YsXY(NgeDU#sRlT3+9J z6;(^(sjSK@3?oMo$%L-nqy*E;3pb0nZLx6 z;h5)T$y8GXK1DS-F@bGun8|J(v-9o=42&nLJy#}M5D0T^5VWBNn$RpC zZzG6Bt66VY4_?W=PX$DMpKAI!d`INr) zkMB{XPQ<52rvWVQqgI0OL_NWxoe`xxw&X8yVftdODPj5|t}S6*VMqN$-h9)1MBe0N zYq?g0+e8fJCoAksr0af1)FYtz?Me!Cxn`gUx&|T;)695GG6HF7!Kg1zzRf_{VWv^bo81v4$?F6u2g|wxHc6eJQAg&V z#%0DnWm2Rmu71rPJ8#xFUNFC*V{+N_qqFH@gYRLZ6C?GAcVRi>^n3zQxORPG)$-B~ z%_oB?-%Zf7d*Fe;cf%tQwcGv2S?rD$Z&>QC2X^vwYjnr5pa5u#38cHCt4G3|efuci z@3z=#A13`+ztmp;%zjXwPY_aq-;isu*hecWWX_=Z8paSqq7;XYnUjK*T>c4~PR4W7 z#C*%_H&tfGx`Y$w7`dXvVhmovDnT>btmy~SLf>>~84jkoQ%cv=MMb+a{JV&t0+1`I z32g_Y@yDhKe|K^PevP~MiiVl{Ou7^Mt9{lOnXEQ`xY^6L8D$705GON{!1?1&YJEl#fTf5Z)da=yiEQ zGgtC-soFGOEBEB~ZF_{7b(76En>d}mI~XIwNw{e>=Fv)sgcw@qOsykWr?+qAOZSVrQfg}TNI ztKNG)1SRrAt6#Q?(me%)>&A_^DM`pL>J{2xu>xa$3d@90xR61TQDl@fu%_85DuUUA za9tn64?At;{`BAW6oykwntxHeDpXsV#{tmt5RqdN7LtcF4vR~_kZNT|wqyR#z^Xcd zFdymVRZvyLfTpBT>w9<)Ozv@;Yk@dOSVWbbtm^y@@C>?flP^EgQPAwsy75bveo=}T zFxl(f)s)j(0#N_>Or(xEuV(n$M+`#;Pc$1@OjXEJZumkaekVqgP_i}p`oTx;terTx zZpT+0dpUya2hqlf`SpXN{}>PfhajNk_J0`H|2<5E;U5Vh4F8er z;RxLSFgpGhkU>W?IwdW~NZTyOBrQ84H7_?gviIf71l`EETodG9a1!8e{jW?DpwjL? zGEM&eCzwoZt^P*8KHZ$B<%{I}>46IT%jJ3AnnB5P%D2E2Z_ z1M!vr#8r}1|KTqWA4%67ZdbMW2YJ81b(KF&SQ2L1Qn(y-=J${p?xLMx3W7*MK;LFQ z6Z`aU;;mTL4XrrE;HY*Rkh6N%?qviUGNAKiCB~!P}Z->IpO6E(gGd7I#eDuT7j|?nZ zK}I(EJ>$Kb&@338M~O+em9(L!+=0zBR;JAQesx|3?Ok90)D1aS9P?yTh6Poh8Cr4X zk3zc=f2rE7jj+aP7nUsr@~?^EGP>Q>h#NHS?F{Cn`g-gD<8F&dqOh-0sa%pfL`b+1 zUsF*4a~)KGb4te&K0}bE>z3yb8% zibb5Q%Sfiv7feb1r0tfmiMv z@^4XYwg@KZI=;`wC)`1jUA9Kv{HKe2t$WmRcR4y8)VAFjRi zaz&O7Y2tDmc5+SX(bj6yGHYk$dBkWc96u3u&F)2yEE~*i0F%t9Kg^L6MJSb&?wrXi zGSc;_rln$!^ybwYBeacEFRsVGq-&4uC{F)*Y;<0y7~USXswMo>j4?~5%Zm!m@i@-> zXzi82sa-vpU{6MFRktJy+E0j#w`f`>Lbog{zP|9~hg(r{RCa!uGe>Yl536cn$;ouH za#@8XMvS-kddc1`!1LVq;h57~zV`7IYR}pp3u!JtE6Q67 zq3H9ZUcWPm2V4IukS}MCHSdF0qg2@~ufNx9+VMjQP&exiG_u9TZAeAEj*jw($G)zL zq9%#v{wVyOAC4A~AF=dPX|M}MZV)s(qI9@aIK?Pe+~ch|>QYb+78lDF*Nxz2-vpRbtQ*F4$0fDbvNM#CCatgQ@z1+EZWrt z2dZfywXkiW=no5jus-92>gXn5rFQ-COvKyegmL=4+NPzw6o@a?wGE-1Bt;pCHe;34K%Z z-FnOb%!nH;)gX+!a3nCk?5(f1HaWZBMmmC@lc({dUah+E;NOros{?ui1zPC-Q0);w zEbJmdE$oU$AVGQPdm{?xxI_0CKNG$LbY*i?YRQ$(&;NiA#h@DCxC(U@AJ$Yt}}^xt-EC_ z4!;QlLkjvSOhdx!bR~W|Ezmuf6A#@T`2tsjkr>TvW*lFCMY>Na_v8+{Y|=MCu1P8y z89vPiH5+CKcG-5lzk0oY>~aJC_0+4rS@c@ZVKLAp`G-sJB$$)^4*A!B zmcf}lIw|VxV9NSoJ8Ag3CwN&d7`|@>&B|l9G8tXT^BDHOUPrtC70NgwN4${$k~d_4 zJ@eo6%YQnOgq$th?0{h`KnqYa$Nz@vlHw<%!C5du6<*j1nwquk=uY}B8r7f|lY+v7 zm|JU$US08ugor8E$h3wH$c&i~;guC|3-tqJy#T;v(g( zBZtPMSyv%jzf->435yM(-UfyHq_D=6;ouL4!ZoD+xI5uCM5ay2m)RPmm$I}h>()hS zO!0gzMxc`BPkUZ)WXaXam%1;)gedA7SM8~8yIy@6TPg!hR0=T>4$Zxd)j&P-pXeSF z9W`lg6@~YDhd19B9ETv(%er^Xp8Yj@AuFVR_8t*KS;6VHkEDKI#!@l!l3v6`W1`1~ zP{C@keuV4Q`Rjc08lx?zmT$e$!3esc9&$XZf4nRL(Z*@keUbk!GZi(2Bmyq*saOD? z3Q$V<*P-X1p2}aQmuMw9nSMbOzuASsxten7DKd6A@ftZ=NhJ(0IM|Jr<91uAul4JR zADqY^AOVT3a(NIxg|U;fyc#ZnSzw2cr}#a5lZ38>nP{05D)7~ad7JPhw!LqOwATXtRhK!w0X4HgS1i<%AxbFmGJx9?sEURV+S{k~g zGYF$IWSlQonq6}e;B(X(sIH|;52+(LYW}v_gBcp|x%rEAVB`5LXg_d5{Q5tMDu0_2 z|LOm$@K2?lrLNF=mr%YP|U-t)~9bqd+wHb4KuPmNK<}PK6e@aosGZK57=Zt+kcszVOSbe;`E^dN! ze7`ha3WUUU7(nS0{?@!}{0+-VO4A{7+nL~UOPW9_P(6^GL0h${SLtqG!} zKl~Ng5#@Sy?65wk9z*3SA`Dpd4b4T^@C8Fhd8O)k_4%0RZL5?#b~jmgU+0|DB%0Z) zql-cPC>A9HPjdOTpPC` zQwvF}uB5kG$Xr4XnaH#ruSjM*xG?_hT7y3G+8Ox`flzU^QIgb_>2&-f+XB6MDr-na zSi#S+c!ToK84<&m6sCiGTd^8pNdXo+$3^l3FL_E`0 z>8it5YIDxtTp2Tm(?}FX^w{fbfgh7>^8mtvN>9fWgFN_*a1P`Gz*dyOZF{OV7BC#j zQV=FQM5m>47xXgapI$WbPM5V`V<7J9tD)oz@d~MDoM`R^Y6-Na(lO~uvZlpu?;zw6 zVO1faor3dg#JEb5Q*gz4<W8tgC3nE2BG2jeIQs1)<{In&7hJ39x=;ih;CJDy)>0S1at*7n?Wr0ahYCpFjZ|@u91Zl7( zv;CSBRC65-6f+*JPf4p1UZ)k=XivKTX6_bWT~7V#rq0Xjas6hMO!HJN8GdpBKg_$B zwDHJF6;z?h<;GXFZan8W{XFNPpOj!(&I1`&kWO86p?Xz`a$`7qV7Xqev|7nn_lQuX ziGpU1MMYt&5dE2A62iX3;*0WzNB9*nSTzI%62A+N?f?;S>N@8M=|ef3gtQTIA*=yq zQAAjOqa!CkHOQo4?TsqrrsJLclXcP?dlAVv?v`}YUjo1Htt;6djP@NPFH+&p1I+f_ z)Y279{7OWomY8baT(4TAOlz1OyD{4P?(DGv3XyJTA2IXe=kqD)^h(@*E3{I~w;ws8 z)ZWv7E)pbEM zd3MOXRH3mQhks9 zv6{s;k0y5vrcjXaVfw8^>YyPo=oIqd5IGI{)+TZq5Z5O&hXAw%ZlL}^6FugH;-%vP zAaKFtt3i^ag226=f0YjzdPn6|4(C2sC5wHFX{7QF!tG1E-JFA`>eZ`}$ymcRJK?0c zN363o{&ir)QySOFY0vcu6)kX#;l??|7o{HBDVJN+17rt|w3;(C_1b>d;g9Gp=8YVl zYTtA52@!7AUEkTm@P&h#eg+F*lR zQ7iotZTcMR1frJ0*V@Hw__~CL>_~2H2cCtuzYIUD24=Cv!1j6s{QS!v=PzwQ(a0HS zBKx04KA}-Ue+%9d`?PG*hIij@54RDSQpA7|>qYVIrK_G6%6;#ZkR}NjUgmGju)2F`>|WJoljo)DJgZr4eo1k1i1+o z1D{>^RlpIY8OUaOEf5EBu%a&~c5aWnqM zxBpJq98f=%M^{4mm~5`CWl%)nFR64U{(chmST&2jp+-r z3675V<;Qi-kJud%oWnCLdaU-)xTnMM%rx%Jw6v@=J|Ir=4n-1Z23r-EVf91CGMGNz zb~wyv4V{H-hkr3j3WbGnComiqmS0vn?n?5v2`Vi>{Ip3OZUEPN7N8XeUtF)Ry6>y> zvn0BTLCiqGroFu|m2zG-;Xb6;W`UyLw)@v}H&(M}XCEVXZQoWF=Ykr5lX3XWwyNyF z#jHv)A*L~2BZ4lX?AlN3X#axMwOC)PoVy^6lCGse9bkGjb=qz%kDa6}MOmSwK`cVO zt(e*MW-x}XtU?GY5}9{MKhRhYOlLhJE5=ca+-RmO04^ z66z{40J=s=ey9OCdc(RCzy zd7Zr1%!y3}MG(D=wM_ebhXnJ@MLi7cImDkhm0y{d-Vm81j`0mbi4lF=eirlr)oW~a zCd?26&j^m4AeXEsIUXiTal)+SPM4)HX%%YWF1?(FV47BaA`h9m67S9x>hWMVHx~Hg z1meUYoLL(p@b3?x|9DgWeI|AJ`Ia84*P{Mb%H$ZRROouR4wZhOPX15=KiBMHl!^JnCt$Az`KiH^_d>cev&f zaG2>cWf$=A@&GP~DubsgYb|L~o)cn5h%2`i^!2)bzOTw2UR!>q5^r&2Vy}JaWFUQE04v>2;Z@ZPwXr?y&G(B^@&y zsd6kC=hHdKV>!NDLIj+3rgZJ|dF`%N$DNd;B)9BbiT9Ju^Wt%%u}SvfM^=|q-nxDG zuWCQG9e#~Q5cyf8@y76#kkR^}{c<_KnZ0QsZcAT|YLRo~&tU|N@BjxOuy`#>`X~Q< z?R?-Gsk$$!oo(BveQLlUrcL#eirhgBLh`qHEMg`+sR1`A=1QX7)ZLMRT+GBy?&mM8 zQG^z-!Oa&J-k7I(3_2#Q6Bg=NX<|@X&+YMIOzfEO2$6Mnh}YV!m!e^__{W@-CTprr zbdh3f=BeCD$gHwCrmwgM3LAv3!Mh$wM)~KWzp^w)Cu6roO7uUG5z*}i0_0j47}pK; ztN530`ScGatLOL06~zO)Qmuv`h!gq5l#wx(EliKe&rz-5qH(hb1*fB#B+q`9=jLp@ zOa2)>JTl7ovxMbrif`Xe9;+fqB1K#l=Dv!iT;xF zdkCvS>C5q|O;}ns3AgoE({Ua-zNT-9_5|P0iANmC6O76Sq_(AN?UeEQJ>#b54fi3k zFmh+P%b1x3^)0M;QxXLP!BZ^h|AhOde*{9A=f3|Xq*JAs^Y{eViF|=EBfS6L%k4ip zk+7M$gEKI3?bQg?H3zaE@;cyv9kv;cqK$VxQbFEsy^iM{XXW0@2|DOu$!-k zSFl}Y=jt-VaT>Cx*KQnHTyXt}f9XswFB9ibYh+k2J!ofO+nD?1iw@mwtrqI4_i?nE zhLkPp41ED62me}J<`3RN80#vjW;wt`pP?%oQ!oqy7`miL>d-35a=qotK$p{IzeSk# ze_$CFYp_zIkrPFVaW^s#U4xT1lI^A0IBe~Y<4uS%zSV=wcuLr%gQT=&5$&K*bwqx| zWzCMiz>7t^Et@9CRUm9E+@hy~sBpm9fri$sE1zgLU((1?Yg{N1Sars=DiW&~Zw=3I zi7y)&oTC?UWD2w97xQ&5vx zRXEBGeJ(I?Y}eR0_O{$~)bMJRTsNUPIfR!xU9PE7A>AMNr_wbrFK>&vVw=Y;RH zO$mlpmMsQ}-FQ2cSj7s7GpC+~^Q~dC?y>M}%!-3kq(F3hGWo9B-Gn02AwUgJ>Z-pKOaj zysJBQx{1>Va=*e@sLb2z&RmQ7ira;aBijM-xQ&cpR>X3wP^foXM~u1>sv9xOjzZpX z0K;EGouSYD~oQ&lAafj3~EaXfFShC+>VsRlEMa9cg9i zFxhCKO}K0ax6g4@DEA?dg{mo>s+~RPI^ybb^u--^nTF>**0l5R9pocwB?_K)BG_)S zyLb&k%XZhBVr7U$wlhMqwL)_r&&n%*N$}~qijbkfM|dIWP{MyLx}X&}ES?}7i;9bW zmTVK@zR)7kE2+L42Q`n4m0VVg5l5(W`SC9HsfrLZ=v%lpef=Gj)W59VTLe+Z$8T8i z4V%5+T0t8LnM&H>Rsm5C%qpWBFqgTwL{=_4mE{S3EnBXknM&u8n}A^IIM4$s3m(Rd z>zq=CP-!9p9es2C*)_hoL@tDYABn+o#*l;6@7;knWIyDrt5EuakO99S$}n((Fj4y} zD!VvuRzghcE{!s;jC*<_H$y6!6QpePo2A3ZbX*ZzRnQq*b%KK^NF^z96CHaWmzU@f z#j;y?X=UP&+YS3kZx7;{ zDA{9(wfz7GF`1A6iB6fnXu0?&d|^p|6)%3$aG0Uor~8o? z*e}u#qz7Ri?8Uxp4m_u{a@%bztvz-BzewR6bh*1Xp+G=tQGpcy|4V_&*aOqu|32CM zz3r*E8o8SNea2hYJpLQ-_}R&M9^%@AMx&`1H8aDx4j%-gE+baf2+9zI*+Pmt+v{39 zDZ3Ix_vPYSc;Y;yn68kW4CG>PE5RoaV0n@#eVmk?p$u&Fy&KDTy!f^Hy6&^-H*)#u zdrSCTJPJw?(hLf56%2;_3n|ujUSJOU8VPOTlDULwt0jS@j^t1WS z!n7dZIoT+|O9hFUUMbID4Ec$!cc($DuQWkocVRcYSikFeM&RZ=?BW)mG4?fh#)KVG zcJ!<=-8{&MdE)+}?C8s{k@l49I|Zwswy^ZN3;E!FKyglY~Aq?4m74P-0)sMTGXqd5(S<-(DjjM z&7dL-Mr8jhUCAG$5^mI<|%`;JI5FVUnNj!VO2?Jiqa|c2;4^n!R z`5KK0hyB*F4w%cJ@Un6GC{mY&r%g`OX|1w2$B7wxu97%<@~9>NlXYd9RMF2UM>(z0 zouu4*+u+1*k;+nFPk%ly!nuMBgH4sL5Z`@Rok&?Ef=JrTmvBAS1h?C0)ty5+yEFRz zY$G=coQtNmT@1O5uk#_MQM1&bPPnspy5#>=_7%WcEL*n$;sSAZcXxMpcXxLe;_mLA z5F_paad+bGZV*oh@8h0(|D2P!q# zTHjmiphJ=AazSeKQPkGOR-D8``LjzToyx{lfK-1CDD6M7?pMZOdLKFtjZaZMPk4}k zW)97Fh(Z+_Fqv(Q_CMH-YYi?fR5fBnz7KOt0*t^cxmDoIokc=+`o# zrud|^h_?KW=Gv%byo~(Ln@({?3gnd?DUf-j2J}|$Mk>mOB+1{ZQ8HgY#SA8END(Zw z3T+W)a&;OO54~m}ffemh^oZ!Vv;!O&yhL0~hs(p^(Yv=(3c+PzPXlS5W79Er8B1o* z`c`NyS{Zj_mKChj+q=w)B}K za*zzPhs?c^`EQ;keH{-OXdXJet1EsQ)7;{3eF!-t^4_Srg4(Ot7M*E~91gwnfhqaM zNR7dFaWm7MlDYWS*m}CH${o?+YgHiPC|4?X?`vV+ws&Hf1ZO-w@OGG^o4|`b{bLZj z&9l=aA-Y(L11!EvRjc3Zpxk7lc@yH1e$a}8$_-r$)5++`_eUr1+dTb@ zU~2P1HM#W8qiNN3b*=f+FfG1!rFxnNlGx{15}BTIHgxO>Cq4 z;#9H9YjH%>Z2frJDJ8=xq>Z@H%GxXosS@Z>cY9ppF+)e~t_hWXYlrO6)0p7NBMa`+ z^L>-#GTh;k_XnE)Cgy|0Dw;(c0* zSzW14ZXozu)|I@5mRFF1eO%JM=f~R1dkNpZM+Jh(?&Zje3NgM{2ezg1N`AQg5%+3Y z64PZ0rPq6;_)Pj-hyIOgH_Gh`1$j1!jhml7ksHA1`CH3FDKiHLz+~=^u@kUM{ilI5 z^FPiJ7mSrzBs9{HXi2{sFhl5AyqwUnU{sPcUD{3+l-ZHAQ)C;c$=g1bdoxeG(5N01 zZy=t8i{*w9m?Y>V;uE&Uy~iY{pY4AV3_N;RL_jT_QtLFx^KjcUy~q9KcLE3$QJ{!)@$@En{UGG7&}lc*5Kuc^780;7Bj;)X?1CSy*^^ zPP^M)Pr5R>mvp3_hmCtS?5;W^e@5BjE>Cs<`lHDxj<|gtOK4De?Sf0YuK5GX9G93i zMYB{8X|hw|T6HqCf7Cv&r8A$S@AcgG1cF&iJ5=%+x;3yB`!lQ}2Hr(DE8=LuNb~Vs z=FO&2pdc16nD$1QL7j+!U^XWTI?2qQKt3H8=beVTdHHa9=MiJ&tM1RRQ-=+vy!~iz zj3O{pyRhCQ+b(>jC*H)J)%Wq}p>;?@W*Eut@P&?VU+Sdw^4kE8lvX|6czf{l*~L;J zFm*V~UC;3oQY(ytD|D*%*uVrBB}BbAfjK&%S;z;7$w68(8PV_whC~yvkZmX)xD^s6 z{$1Q}q;99W?*YkD2*;)tRCS{q2s@JzlO~<8x9}X<0?hCD5vpydvOw#Z$2;$@cZkYrp83J0PsS~!CFtY%BP=yxG?<@#{7%2sy zOc&^FJxsUYN36kSY)d7W=*1-{7ghPAQAXwT7z+NlESlkUH&8ODlpc8iC*iQ^MAe(B z?*xO4i{zFz^G=^G#9MsLKIN64rRJykiuIVX5~0#vAyDWc9-=6BDNT_aggS2G{B>dD ze-B%d3b6iCfc5{@yz$>=@1kdK^tX9qh0=ocv@9$ai``a_ofxT=>X7_Y0`X}a^M?d# z%EG)4@`^Ej_=%0_J-{ga!gFtji_byY&Vk@T1c|ucNAr(JNr@)nCWj?QnCyvXg&?FW;S-VOmNL6^km_dqiVjJuIASVGSFEos@EVF7St$WE&Z%)`Q##+0 zjaZ=JI1G@0!?l|^+-ZrNd$WrHBi)DA0-Eke>dp=_XpV<%CO_Wf5kQx}5e<90dt>8k zAi00d0rQ821nA>B4JHN7U8Zz=0;9&U6LOTKOaC1FC8GgO&kc=_wHIOGycL@c*$`ce703t%>S}mvxEnD-V!;6c`2(p74V7D0No1Xxt`urE66$0(ThaAZ1YVG#QP$ zy~NN%kB*zhZ2Y!kjn826pw4bh)75*e!dse+2Db(;bN34Uq7bLpr47XTX{8UEeC?2i z*{$`3dP}32${8pF$!$2Vq^gY|#w+VA_|o(oWmQX8^iw#n_crb(K3{69*iU?<%C-%H zuKi)3M1BhJ@3VW>JA`M>L~5*_bxH@Euy@niFrI$82C1}fwR$p2E&ZYnu?jlS}u7W9AyfdXh2pM>78bIt3 z)JBh&XE@zA!kyCDfvZ1qN^np20c1u#%P6;6tU&dx0phT1l=(mw7`u!-0e=PxEjDds z9E}{E!7f9>jaCQhw)&2TtG-qiD)lD(4jQ!q{`x|8l&nmtHkdul# zy+CIF8lKbp9_w{;oR+jSLtTfE+B@tOd6h=QePP>rh4@~!8c;Hlg9m%%&?e`*Z?qz5-zLEWfi>`ord5uHF-s{^bexKAoMEV@9nU z^5nA{f{dW&g$)BAGfkq@r5D)jr%!Ven~Q58c!Kr;*Li#`4Bu_?BU0`Y`nVQGhNZk@ z!>Yr$+nB=`z#o2nR0)V3M7-eVLuY`z@6CT#OTUXKnxZn$fNLPv7w1y7eGE=Qv@Hey`n;`U=xEl|q@CCV^#l)s0ZfT+mUf z^(j5r4)L5i2jnHW4+!6Si3q_LdOLQi<^fu?6WdohIkn79=jf%Fs3JkeXwF(?_tcF? z?z#j6iXEd(wJy4|p6v?xNk-)iIf2oX5^^Y3q3ziw16p9C6B;{COXul%)`>nuUoM*q zzmr|NJ5n)+sF$!yH5zwp=iM1#ZR`O%L83tyog-qh1I z0%dcj{NUs?{myT~33H^(%0QOM>-$hGFeP;U$puxoJ>>o-%Lk*8X^rx1>j|LtH$*)>1C!Pv&gd16%`qw5LdOIUbkNhaBBTo}5iuE%K&ZV^ zAr_)kkeNKNYJRgjsR%vexa~&8qMrQYY}+RbZ)egRg9_$vkoyV|Nc&MH@8L)`&rpqd zXnVaI@~A;Z^c3+{x=xgdhnocA&OP6^rr@rTvCnhG6^tMox$ulw2U7NgUtW%|-5VeH z_qyd47}1?IbuKtqNbNx$HR`*+9o=8`%vM8&SIKbkX9&%TS++x z5|&6P<%=F$C?owUI`%uvUq^yW0>`>yz!|WjzsoB9dT;2Dx8iSuK%%_XPgy0dTD4kd zDXF@&O_vBVVKQq(9YTClUPM30Sk7B!v7nOyV`XC!BA;BIVwphh+c)?5VJ^(C;GoQ$ zvBxr7_p*k$T%I1ke}`U&)$uf}I_T~#3XTi53OX)PoXVgxEcLJgZG^i47U&>LY(l%_ z;9vVDEtuMCyu2fqZeez|RbbIE7@)UtJvgAcVwVZNLccswxm+*L&w`&t=ttT=sv6Aq z!HouSc-24Y9;0q$>jX<1DnnGmAsP))- z^F~o99gHZw`S&Aw7e4id6Lg7kMk-e)B~=tZ!kE7sGTOJ)8@q}np@j7&7Sy{2`D^FH zI7aX%06vKsfJ168QnCM2=l|i>{I{%@gcr>ExM0Dw{PX6ozEuqFYEt z087%MKC;wVsMV}kIiuu9Zz9~H!21d!;Cu#b;hMDIP7nw3xSX~#?5#SSjyyg+Y@xh| z%(~fv3`0j#5CA2D8!M2TrG=8{%>YFr(j)I0DYlcz(2~92?G*?DeuoadkcjmZszH5& zKI@Lis%;RPJ8mNsbrxH@?J8Y2LaVjUIhRUiO-oqjy<&{2X~*f|)YxnUc6OU&5iac= z*^0qwD~L%FKiPmlzi&~a*9sk2$u<7Al=_`Ox^o2*kEv?p`#G(p(&i|ot8}T;8KLk- zPVf_4A9R`5^e`Om2LV*cK59EshYXse&IoByj}4WZaBomoHAPKqxRKbPcD`lMBI)g- zeMRY{gFaUuecSD6q!+b5(?vAnf>c`Z(8@RJy%Ulf?W~xB1dFAjw?CjSn$ph>st5bc zUac1aD_m6{l|$#g_v6;=32(mwpveQDWhmjR7{|B=$oBhz`7_g7qNp)n20|^^op3 zSfTdWV#Q>cb{CMKlWk91^;mHap{mk)o?udk$^Q^^u@&jd zfZ;)saW6{e*yoL6#0}oVPb2!}r{pAUYtn4{P~ES9tTfC5hXZnM{HrC8^=Pof{G4%Bh#8 ze~?C9m*|fd8MK;{L^!+wMy>=f^8b&y?yr6KnTq28$pFMBW9Oy7!oV5z|VM$s-cZ{I|Xf@}-)1=$V&x7e;9v81eiTi4O5-vs?^5pCKy2l>q);!MA zS!}M48l$scB~+Umz}7NbwyTn=rqt@`YtuwiQSMvCMFk2$83k50Q>OK5&fe*xCddIm)3D0I6vBU<+!3=6?(OhkO|b4fE_-j zimOzyfBB_*7*p8AmZi~X2bgVhyPy>KyGLAnOpou~sx9)S9%r)5dE%ADs4v%fFybDa_w*0?+>PsEHTbhKK^G=pFz z@IxLTCROWiKy*)cV3y%0FwrDvf53Ob_XuA1#tHbyn%Ko!1D#sdhBo`;VC*e1YlhrC z?*y3rp86m#qI|qeo8)_xH*G4q@70aXN|SP+6MQ!fJQqo1kwO_v7zqvUfU=Gwx`CR@ zRFb*O8+54%_8tS(ADh}-hUJzE`s*8wLI>1c4b@$al)l}^%GuIXjzBK!EWFO8W`>F^ ze7y#qPS0NI7*aU)g$_ziF(1ft;2<}6Hfz10cR8P}67FD=+}MfhrpOkF3hFhQu;Q1y zu%=jJHTr;0;oC94Hi@LAF5quAQ(rJG(uo%BiRQ@8U;nhX)j0i?0SL2g-A*YeAqF>RVCBOTrn{0R27vu}_S zS>tX4!#&U4W;ikTE!eFH+PKw%p+B(MR2I%n#+m0{#?qRP_tR@zpgCb=4rcrL!F=;A zh%EIF8m6%JG+qb&mEfuFTLHSxUAZEvC-+kvZKyX~SA3Umt`k}}c!5dy?-sLIM{h@> z!2=C)@nx>`;c9DdwZ&zeUc(7t<21D7qBj!|1^Mp1eZ6)PuvHx+poKSDCSBMFF{bKy z;9*&EyKitD99N}%mK8431rvbT+^%|O|HV23{;RhmS{$5tf!bIPoH9RKps`-EtoW5h zo6H_!s)Dl}2gCeGF6>aZtah9iLuGd19^z0*OryPNt{70RvJSM<#Ox9?HxGg04}b^f zrVEPceD%)#0)v5$YDE?f`73bQ6TA6wV;b^x*u2Ofe|S}+q{s5gr&m~4qGd!wOu|cZ||#h_u=k*fB;R6&k?FoM+c&J;ISg70h!J7*xGus)ta4veTdW)S^@sU@ z4$OBS=a~@F*V0ECic;ht4@?Jw<9kpjBgHfr2FDPykCCz|v2)`JxTH55?b3IM={@DU z!^|9nVO-R#s{`VHypWyH0%cs;0GO3E;It6W@0gX6wZ%W|Dzz&O%m17pa19db(er}C zUId1a4#I+Ou8E1MU$g=zo%g7K(=0Pn$)Rk z<4T2u<0rD)*j+tcy2XvY+0 z0d2pqm4)4lDewsAGThQi{2Kc3&C=|OQF!vOd#WB_`4gG3@inh-4>BoL!&#ij8bw7? zqjFRDaQz!J-YGitV4}$*$hg`vv%N)@#UdzHFI2E<&_@0Uw@h_ZHf}7)G;_NUD3@18 zH5;EtugNT0*RXVK*by>WS>jaDDfe!A61Da=VpIK?mcp^W?!1S2oah^wowRnrYjl~`lgP-mv$?yb6{{S55CCu{R z$9;`dyf0Y>uM1=XSl_$01Lc1Iy68IosWN8Q9Op=~I(F<0+_kKfgC*JggjxNgK6 z-3gQm6;sm?J&;bYe&(dx4BEjvq}b`OT^RqF$J4enP1YkeBK#>l1@-K`ajbn05`0J?0daOtnzh@l3^=BkedW1EahZlRp;`j*CaT;-21&f2wU z+Nh-gc4I36Cw+;3UAc<%ySb`#+c@5y ze~en&bYV|kn?Cn|@fqmGxgfz}U!98$=drjAkMi`43I4R%&H0GKEgx-=7PF}y`+j>r zg&JF`jomnu2G{%QV~Gf_-1gx<3Ky=Md9Q3VnK=;;u0lyTBCuf^aUi?+1+`4lLE6ZK zT#(Bf`5rmr(tgTbIt?yA@y`(Ar=f>-aZ}T~>G32EM%XyFvhn&@PWCm#-<&ApLDCXT zD#(9m|V(OOo7PmE@`vD4$S5;+9IQm19dd zvMEU`)E1_F+0o0-z>YCWqg0u8ciIknU#{q02{~YX)gc_u;8;i233D66pf(IkTDxeN zL=4z2)?S$TV9=ORVr&AkZMl<4tTh(v;Ix1{`pPVqI3n2ci&4Dg+W|N8TBUfZ*WeLF zqCH_1Q0W&f9T$lx3CFJ$o@Lz$99 zW!G&@zFHxTaP!o#z^~xgF|(vrHz8R_r9eo;TX9}2ZyjslrtH=%6O)?1?cL&BT(Amp zTGFU1%%#xl&6sH-UIJk_PGk_McFn7=%yd6tAjm|lnmr8bE2le3I~L{0(ffo}TQjyo zHZZI{-}{E4ohYTlZaS$blB!h$Jq^Rf#(ch}@S+Ww&$b);8+>g84IJcLU%B-W?+IY& zslcZIR>+U4v3O9RFEW;8NpCM0w1ROG84=WpKxQ^R`{=0MZCubg3st z48AyJNEvyxn-jCPTlTwp4EKvyEwD3e%kpdY?^BH0!3n6Eb57_L%J1=a*3>|k68A}v zaW`*4YitylfD}ua8V)vb79)N_Ixw_mpp}yJGbNu+5YYOP9K-7nf*jA1#<^rb4#AcS zKg%zCI)7cotx}L&J8Bqo8O1b0q;B1J#B5N5Z$Zq=wX~nQFgUfAE{@u0+EnmK{1hg> zC{vMfFLD;L8b4L+B51&LCm|scVLPe6h02rws@kGv@R+#IqE8>Xn8i|vRq_Z`V;x6F zNeot$1Zsu`lLS92QlLWF54za6vOEKGYQMdX($0JN*cjG7HP&qZ#3+bEN$8O_PfeAb z0R5;=zXac2IZ?fxu59?Nka;1lKm|;0)6|#RxkD05P5qz;*AL@ig!+f=lW5^Jbag%2 z%9@iM0ph$WFlxS!`p31t92z~TB}P-*CS+1Oo_g;7`6k(Jyj8m8U|Q3Sh7o-Icp4kV zK}%qri5>?%IPfamXIZ8pXbm-#{ytiam<{a5A+3dVP^xz!Pvirsq7Btv?*d7eYgx7q zWFxrzb3-%^lDgMc=Vl7^={=VDEKabTG?VWqOngE`Kt7hs236QKidsoeeUQ_^FzsXjprCDd@pW25rNx#6x&L6ZEpoX9Ffzv@olnH3rGOSW( zG-D|cV0Q~qJ>-L}NIyT?T-+x+wU%;+_GY{>t(l9dI%Ximm+Kmwhee;FK$%{dnF;C% zFjM2&$W68Sz#d*wtfX?*WIOXwT;P6NUw}IHdk|)fw*YnGa0rHx#paG!m=Y6GkS4VX zX`T$4eW9k1W!=q8!(#8A9h67fw))k_G)Q9~Q1e3f`aV@kbcSv7!priDUN}gX(iXTy zr$|kU0Vn%*ylmyDCO&G0Z3g>%JeEPFAW!5*H2Ydl>39w3W+gEUjL&vrRs(xGP{(ze zy7EMWF14@Qh>X>st8_029||TP0>7SG9on_xxeR2Iam3G~Em$}aGsNt$iES9zFa<3W zxtOF*!G@=PhfHO!=9pVPXMUVi30WmkPoy$02w}&6A7mF)G6-`~EVq5CwD2`9Zu`kd)52``#V zNSb`9dG~8(dooi1*-aSMf!fun7Sc`-C$-E(3BoSC$2kKrVcI!&yC*+ff2+C-@!AT_ zsvlAIV+%bRDfd{R*TMF><1&_a%@yZ0G0lg2K;F>7b+7A6pv3-S7qWIgx+Z?dt8}|S z>Qbb6x(+^aoV7FQ!Ph8|RUA6vXWQH*1$GJC+wXLXizNIc9p2yLzw9 z0=MdQ!{NnOwIICJc8!+Jp!zG}**r#E!<}&Te&}|B4q;U57$+pQI^}{qj669zMMe_I z&z0uUCqG%YwtUc8HVN7?0GHpu=bL7&{C>hcd5d(iFV{I5c~jpX&!(a{yS*4MEoYXh z*X4|Y@RVfn;piRm-C%b@{0R;aXrjBtvx^HO;6(>i*RnoG0Rtcd25BT6edxTNOgUAOjn zJ2)l{ipj8IP$KID2}*#F=M%^n&=bA0tY98@+2I+7~A&T-tw%W#3GV>GTmkHaqftl)#+E zMU*P(Rjo>8%P@_@#UNq(_L{}j(&-@1iY0TRizhiATJrnvwSH0v>lYfCI2ex^><3$q znzZgpW0JlQx?JB#0^^s-Js1}}wKh6f>(e%NrMwS`Q(FhazkZb|uyB@d%_9)_xb$6T zS*#-Bn)9gmobhAtvBmL+9H-+0_0US?g6^TOvE8f3v=z3o%NcPjOaf{5EMRnn(_z8- z$|m0D$FTU zDy;21v-#0i)9%_bZ7eo6B9@Q@&XprR&oKl4m>zIj-fiRy4Dqy@VVVs?rscG| zmzaDQ%>AQTi<^vYCmv#KOTd@l7#2VIpsj?nm_WfRZzJako`^uU%Nt3e;cU*y*|$7W zLm%fX#i_*HoUXu!NI$ey>BA<5HQB=|nRAwK!$L#n-Qz;~`zACig0PhAq#^5QS<8L2 zS3A+8%vbVMa7LOtTEM?55apt(DcWh#L}R^P2AY*c8B}Cx=6OFAdMPj1f>k3#^#+Hk z6uW1WJW&RlBRh*1DLb7mJ+KO>!t^t8hX1#_Wk`gjDio9)9IGbyCAGI4DJ~orK+YRv znjxRMtshZQHc$#Y-<-JOV6g^Cr@odj&Xw5B(FmI)*qJ9NHmIz_r{t)TxyB`L-%q5l ztzHgD;S6cw?7Atg*6E1!c6*gPRCb%t7D%z<(xm+K{%EJNiI2N0l8ud0Ch@_av_RW? zIr!nO4dL5466WslE6MsfMss7<)-S!e)2@r2o=7_W)OO`~CwklRWzHTfpB)_HYwgz=BzLhgZ9S<{nLBOwOIgJU=94uj6r!m>Xyn9>&xP+=5!zG_*yEoRgM0`aYts z^)&8(>z5C-QQ*o_s(8E4*?AX#S^0)aqB)OTyX>4BMy8h(cHjA8ji1PRlox@jB*1n? zDIfyDjzeg91Ao(;Q;KE@zei$}>EnrF6I}q&Xd=~&$WdDsyH0H7fJX|E+O~%LS*7^Q zYzZ4`pBdY{b7u72gZm6^5~O-57HwzwAz{)NvVaowo`X02tL3PpgLjwA`^i9F^vSpN zAqH3mRjG8VeJNHZ(1{%!XqC+)Z%D}58Qel{_weSEHoygT9pN@i zi=G;!Vj6XQk2tuJC>lza%ywz|`f7TIz*EN2Gdt!s199Dr4Tfd_%~fu8gXo~|ogt5Q zlEy_CXEe^BgsYM^o@L?s33WM14}7^T(kqohOX_iN@U?u;$l|rAvn{rwy>!yfZw13U zB@X9)qt&4;(C6dP?yRsoTMI!j-f1KC!<%~i1}u7yLXYn)(#a;Z6~r>hp~kfP));mi zcG%kdaB9H)z9M=H!f>kM->fTjRVOELNwh1amgKQT=I8J66kI)u_?0@$$~5f`u%;zl zC?pkr^p2Fe=J~WK%4ItSzKA+QHqJ@~m|Cduv=Q&-P8I5rQ-#G@bYH}YJr zUS(~(w|vKyU(T(*py}jTUp%I%{2!W!K(i$uvotcPjVddW z8_5HKY!oBCwGZcs-q`4Yt`Zk~>K?mcxg51wkZlX5e#B08I75F7#dgn5yf&Hrp`*%$ zQ;_Qg>TYRzBe$x=T(@WI9SC!ReSas9vDm(yslQjBJZde5z8GDU``r|N(MHcxNopGr z_}u39W_zwWDL*XYYt>#Xo!9kL#97|EAGyGBcRXtLTd59x%m=3i zL^9joWYA)HfL15l9%H?q`$mY27!<9$7GH(kxb%MV>`}hR4a?+*LH6aR{dzrX@?6X4 z3e`9L;cjqYb`cJmophbm(OX0b)!AFG?5`c#zLagzMW~o)?-!@e80lvk!p#&CD8u5_r&wp4O0zQ>y!k5U$h_K;rWGk=U)zX!#@Q%|9g*A zWx)qS1?fq6X<$mQTB$#3g;;5tHOYuAh;YKSBz%il3Ui6fPRv#v62SsrCdMRTav)Sg zTq1WOu&@v$Ey;@^+_!)cf|w_X<@RC>!=~+A1-65O0bOFYiH-)abINwZvFB;hJjL_$ z(9iScmUdMp2O$WW!520Hd0Q^Yj?DK%YgJD^ez$Z^?@9@Ab-=KgW@n8nC&88)TDC+E zlJM)L3r+ZJfZW_T$;Imq*#2<(j+FIk8ls7)WJ6CjUu#r5PoXxQs4b)mZza<8=v{o)VlLRM<9yw^0En#tXAj`Sylxvki{<1DPe^ zhjHwx^;c8tb?Vr$6ZB;$Ff$+3(*oinbwpN-#F)bTsXq@Sm?43MC#jQ~`F|twI=7oC zH4TJtu#;ngRA|Y~w5N=UfMZi?s0%ZmKUFTAye&6Y*y-%c1oD3yQ%IF2q2385Zl+=> zfz=o`Bedy|U;oxbyb^rB9ixG{Gb-{h$U0hVe`J;{ql!s_OJ_>>eoQn(G6h7+b^P48 zG<=Wg2;xGD-+d@UMZ!c;0>#3nws$9kIDkK13IfloGT@s14AY>&>>^#>`PT7GV$2Hp zN<{bN*ztlZu_%W=&3+=#3bE(mka6VoHEs~0BjZ$+=0`a@R$iaW)6>wp2w)=v2@|2d z%?34!+iOc5S@;AAC4hELWLH56RGxo4jw8MDMU0Wk2k_G}=Vo(>eRFo(g3@HjG|`H3 zm8b*dK=moM*oB<)*A$M9!!5o~4U``e)wxavm@O_R(`P|u%9^LGi(_%IF<6o;NLp*0 zKsfZ0#24GT8(G`i4UvoMh$^;kOhl?`0yNiyrC#HJH=tqOH^T_d<2Z+ zeN>Y9Zn!X4*DMCK^o75Zk2621bdmV7Rx@AX^alBG4%~;G_vUoxhfhFRlR&+3WwF^T zaL)8xPq|wCZoNT^>3J0K?e{J-kl+hu2rZI>CUv#-z&u@`hjeb+bBZ>bcciQVZ{SbW zez04s9oFEgc8Z+Kp{XFX`MVf-s&w9*dx7wLen(_@y34}Qz@&`$2+osqfxz4&d}{Ql z*g1ag00Gu+$C`0avds{Q65BfGsu9`_`dML*rX~hyWIe$T>CsPRoLIr%MTk3pJ^2zH1qub1MBzPG}PO;Wmav9w%F7?%l=xIf#LlP`! z_Nw;xBQY9anH5-c8A4mME}?{iewjz(Sq-29r{fV;Fc>fv%0!W@(+{={Xl-sJ6aMoc z)9Q+$bchoTGTyWU_oI19!)bD=IG&OImfy;VxNXoIO2hYEfO~MkE#IXTK(~?Z&!ae! zl8z{D&2PC$Q*OBC(rS~-*-GHNJ6AC$@eve>LB@Iq;jbBZj`wk4|LGogE||Ie=M5g= z9d`uYQ1^Sr_q2wmZE>w2WG)!F%^KiqyaDtIAct?}D~JP4shTJy5Bg+-(EA8aXaxbd~BKMtTf2iQ69jD1o* zZF9*S3!v-TdqwK$%&?91Sh2=e63;X0Lci@n7y3XOu2ofyL9^-I767eHESAq{m+@*r zbVDx!FQ|AjT;!bYsXv8ilQjy~Chiu&HNhFXt3R_6kMC8~ChEFqG@MWu#1Q1#=~#ix zrkHpJre_?#r=N0wv`-7cHHqU`phJX2M_^{H0~{VP79Dv{6YP)oA1&TSfKPEPZn2)G z9o{U1huZBLL;Tp_0OYw@+9z(jkrwIGdUrOhKJUbwy?WBt zlIK)*K0lQCY0qZ!$%1?3A#-S70F#YyUnmJF*`xx?aH5;gE5pe-15w)EB#nuf6B*c~ z8Z25NtY%6Wlb)bUA$w%HKs5$!Z*W?YKV-lE0@w^{4vw;J>=rn?u!rv$&eM+rpU6rc=j9>N2Op+C{D^mospMCjF2ZGhe4eADA#skp2EA26%p3Ex9wHW8l&Y@HX z$Qv)mHM}4*@M*#*ll5^hE9M^=q~eyWEai*P;4z<9ZYy!SlNE5nlc7gm;M&Q zKhKE4d*%A>^m0R?{N}y|i6i^k>^n4(wzKvlQeHq{l&JuFD~sTsdhs`(?lFK@Q{pU~ zb!M3c@*3IwN1RUOVjY5>uT+s-2QLWY z4T2>fiSn>>Fob+%B868-v9D@AfWr#M8eM6w#eAlhc#zk6jkLxGBGk`E3$!A@*am!R zy>29&ptYK6>cvP`b!syNp)Q$0UOW|-O@)8!?94GOYF_}+zlW%fCEl|Tep_zx05g6q z>tp47e-&R*hSNe{6{H!mL?+j$c^TXT{C&@T-xIaesNCl05 z9SLb@q&mSb)I{VXMaiWa3PWj=Ed!>*GwUe;^|uk=Pz$njNnfFY^MM>E?zqhf6^{}0 zx&~~dA5#}1ig~7HvOQ#;d9JZBeEQ+}-~v$at`m!(ai z$w(H&mWCC~;PQ1$%iuz3`>dWeb3_p}X>L2LK%2l59Tyc}4m0>9A!8rhoU3m>i2+hl zx?*qs*c^j}+WPs>&v1%1Ko8_ivAGIn@QK7A`hDz-Emkcgv2@wTbYhkiwX2l=xz*XG zaiNg+j4F-I>9v+LjosI-QECrtKjp&0T@xIMKVr+&)gyb4@b3y?2CA?=ooN zT#;rU86WLh(e@#mF*rk(NV-qSIZyr z$6!ZUmzD)%yO-ot`rw3rp6?*_l*@Z*IB0xn4|BGPWHNc-1ZUnNSMWmDh=EzWJRP`) zl%d%J613oXzh5;VY^XWJi{lB`f#u+ThvtP7 zq(HK<4>tw(=yzSBWtYO}XI`S1pMBe3!jFxBHIuwJ(@%zdQFi1Q_hU2eDuHqXte7Ki zOV55H2D6u#4oTfr7|u*3p75KF&jaLEDpxk!4*bhPc%mpfj)Us3XIG3 zIKMX^s^1wt8YK7Ky^UOG=w!o5e7W-<&c|fw2{;Q11vm@J{)@N3-p1U>!0~sKWHaL= zWV(0}1IIyt1p%=_-Fe5Kfzc71wg}`RDDntVZv;4!=&XXF-$48jS0Sc;eDy@Sg;+{A zFStc{dXT}kcIjMXb4F7MbX~2%i;UrBxm%qmLKb|2=?uPr00-$MEUIGR5+JG2l2Nq` zkM{{1RO_R)+8oQ6x&-^kCj)W8Z}TJjS*Wm4>hf+4#VJP)OBaDF%3pms7DclusBUw} z{ND#!*I6h85g6DzNvdAmnwWY{&+!KZM4DGzeHI?MR@+~|su0{y-5-nICz_MIT_#FE zm<5f3zlaKq!XyvY3H`9s&T};z!cK}G%;~!rpzk9-6L}4Rg7vXtKFsl}@sT#U#7)x- z7UWue5sa$R>N&b{J61&gvKcKlozH*;OjoDR+elkh|4bJ!_3AZNMOu?n9&|L>OTD78 z^i->ah_Mqc|Ev)KNDzfu1P3grBIM#%`QZqj5W{qu(HocQhjyS;UINoP`{J+DvV?|1 z_sw6Yr3z6%e7JKVDY<$P=M)dbk@~Yw9|2!Cw!io3%j92wTD!c^e9Vj+7VqXo3>u#= zv#M{HHJ=e$X5vQ>>ML?E8#UlmvJgTnb73{PSPTf*0)mcj6C z{KsfUbDK|F$E(k;ER%8HMdDi`=BfpZzP3cl5yJHu;v^o2FkHNk;cXc17tL8T!CsYI zfeZ6sw@;8ia|mY_AXjCS?kUfxdjDB28)~Tz1dGE|{VfBS9`0m2!m1yG?hR})er^pl4c@9Aq+|}ZlDaHL)K$O| z%9Jp-imI-Id0|(d5{v~w6mx)tUKfbuVD`xNt04Mry%M+jXzE>4(TBsx#&=@wT2Vh) z1yeEY&~17>0%P(eHP0HB^|7C+WJxQBTG$uyOWY@iDloRIb-Cf!p<{WQHR!422#F34 zG`v|#CJ^G}y9U*7jgTlD{D&y$Iv{6&PYG>{Ixg$pGk?lWrE#PJ8KunQC@}^6OP!|< zS;}p3to{S|uZz%kKe|;A0bL0XxPB&Q{J(9PyX`+Kr`k~r2}yP^ND{8!v7Q1&vtk& z2Y}l@J@{|2`oA%sxvM9i0V+8IXrZ4;tey)d;LZI70Kbim<4=WoTPZy=Yd|34v#$Kh zx|#YJ8s`J>W&jt#GcMpx84w2Z3ur-rK7gf-p5cE)=w1R2*|0mj12hvapuUWM0b~dG zMg9p8FmAZI@i{q~0@QuY44&mMUNXd7z>U58shA3o`p5eVLpq>+{(<3->DWuSFVZwC zxd50Uz(w~LxC4}bgag#q#NNokK@yNc+Q|Ap!u>Ddy+df>v;j@I12CDNN9do+0^n8p zMQs7X#+FVF0C5muGfN{r0|Nkql%BQT|K(DDNdR2pzM=_ea5+GO|J67`05AV92t@4l z0Qno0078PIHdaQGHZ~Scw!dzgqjK~3B7kf>BcP__&lLyU(cu3B^uLo%{j|Mb0NR)tkeT7Hcwp4O# z)yzu>cvG(d9~0a^)eZ;;%3ksk@F&1eEBje~ zW+-_s)&RgiweQc!otF>4%vbXKaOU41{!hw?|2`Ld3I8$&#WOsq>EG)1ANb!{N4z9@ zsU!bPG-~-bqCeIDzo^Q;gnucB{tRzm{ZH^Orphm2U+REA!*<*J6YQV83@&xoDl%#wnl5qcBqCcAF-vX5{30}(oJrnSH z{RY85hylK2dMOh2%oO1J8%)0?8TOL%rS8)+CsDv}aQ>4D)Jv+DLK)9gI^n-T^$)Tc zFPUD75qJm!Y-KBqj;JP4dV4 z`X{lGmn<)1IGz330}s}Jrjtf{(lnuuNHe5(ezA(pYa=1|Ff-LhPFK8 zyJh_b{yzu0yll6ZkpRzRjezyYivjyjW7QwO;@6X`m;2Apn2EK2!~7S}-*=;5*7K$B z`x(=!^?zgj(-`&ApZJXI09aDLXaT@<;CH=?fBOY5d|b~wBA@@p^K#nxr`)?i?SqTupI_PJ(A3cx`z~9mX_*)>L F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.properties b/pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..ae45383b6d --- /dev/null +++ b/pkg/android/phoenix-gradle/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/pkg/android/phoenix-gradle/gradlew b/pkg/android/phoenix-gradle/gradlew new file mode 100644 index 0000000000..cccdd3d517 --- /dev/null +++ b/pkg/android/phoenix-gradle/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/pkg/android/phoenix-gradle/gradlew.bat b/pkg/android/phoenix-gradle/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/pkg/android/phoenix-gradle/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pkg/android/phoenix-gradle/settings.gradle b/pkg/android/phoenix-gradle/settings.gradle new file mode 100644 index 0000000000..e7b4def49c --- /dev/null +++ b/pkg/android/phoenix-gradle/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/pkg/android/phoenix-gradle/sideload_core_android_studio.png b/pkg/android/phoenix-gradle/sideload_core_android_studio.png new file mode 100644 index 0000000000000000000000000000000000000000..a683c21b9398d7dd40072bd0ca8c1c8f1c9c437c GIT binary patch literal 102975 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

{JF(Q-Efh>F1NYMaiia-A?9v8_Y#7 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�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 literal 0 HcmV?d00001 diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index a5202a74f4..c7b2531e27 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -39,5 +39,6 @@ + diff --git a/pkg/android/phoenix/src/com/retroarch/browser/debug/CoreSideloadActivity.java b/pkg/android/phoenix/src/com/retroarch/browser/debug/CoreSideloadActivity.java new file mode 100644 index 0000000000..76d255c43f --- /dev/null +++ b/pkg/android/phoenix/src/com/retroarch/browser/debug/CoreSideloadActivity.java @@ -0,0 +1,192 @@ +package com.retroarch.browser.debug; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.provider.Settings; +import android.util.Log; +import android.widget.TextView; + +import com.retroarch.browser.mainmenu.MainMenuActivity; +import com.retroarch.browser.preferences.util.UserPreferences; +import com.retroarch.browser.retroactivity.RetroActivityFuture; +import com.retroarch.browser.retroactivity.RetroActivityPast; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * This activity allows developers to sideload and run a core + * from their PC through adb + * + * Usage : see Phoenix Gradle Build README.md + */ +public class CoreSideloadActivity extends Activity +{ + private static final String EXTRA_CORE = "LIBRETRO"; + private static final String EXTRA_CONTENT = "ROM"; + + private TextView textView; + private CoreSideloadWorkerTask workerThread; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // The most simple layout is no layout at all + textView = new TextView(this); + setContentView(textView); + + // Check that we have at least the core extra + if (!getIntent().hasExtra(EXTRA_CORE)) + { + textView.setText("Missing extra \"LIBRETRO\""); + return; + } + + // Start our worker thread + workerThread = new CoreSideloadWorkerTask(this, textView, getIntent().getStringExtra(EXTRA_CORE), getIntent().getStringExtra(EXTRA_CONTENT)); + workerThread.execute(); + } + + @Override + protected void onDestroy() { + if (workerThread != null) + { + workerThread.cancel(true); + workerThread = null; + } + super.onDestroy(); + } + + private static class CoreSideloadWorkerTask extends AsyncTask + { + private TextView progressTextView; + private String core; + private String content; + private Activity ctx; + private File destination; + + public CoreSideloadWorkerTask(Activity ctx, TextView progressTextView, String corePath, String contentPath) + { + this.progressTextView = progressTextView; + this.core = corePath; + this.ctx = ctx; + this.content = contentPath; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + progressTextView.setText("Sideloading..."); + } + + @Override + protected String doInBackground(Void... voids) { + File coreFile = new File(core); + File corePath = new File(UserPreferences.getPreferences(ctx).getString("libretro_path", ctx.getApplicationInfo().dataDir + "/cores/")); + + // Check that both files exist + if (!coreFile.exists()) + return "Input file doesn't exist (" + core + ")"; + + if (!corePath.exists()) + return "Destination directory doesn't exist (" + corePath.getAbsolutePath() + ")"; + + destination = new File(corePath, coreFile.getName()); + + // Copy it + Log.d("sideload", "Copying " + coreFile.getAbsolutePath() + " to " + destination.getAbsolutePath()); + long copied = 0; + long max = coreFile.length(); + try + { + InputStream is = new FileInputStream(coreFile); + OutputStream os = new FileOutputStream(destination); + + byte[] buf = new byte[1024]; + int length; + + while ((length = is.read(buf)) > 0) + { + os.write(buf, 0, length); + + copied += length; + publishProgress((int)(copied / max * 100)); + } + + is.close(); + os.close(); + } + catch (IOException ex) + { + ex.printStackTrace(); + return ex.getMessage(); + } + + return null; + } + + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + + if (values.length > 0) + progressTextView.setText("Sideloading: " + values[0] + "%"); + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + + // Everything went as expected + if (s == null) + { + progressTextView.setText("Done!"); + + // Run RA with our newly sideloaded core (and content) + Intent retro; + + if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) + { + retro = new Intent(ctx, RetroActivityFuture.class); + } + else + { + retro = new Intent(ctx, RetroActivityPast.class); + } + + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); + + retro.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + + Log.d("sideload", "Running RetroArch with core " + destination.getAbsolutePath()); + + MainMenuActivity.startRetroActivity( + retro, + content, + destination.getAbsolutePath(), + UserPreferences.getDefaultConfigPath(ctx), + Settings.Secure.getString(ctx.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD), + ctx.getApplicationInfo().dataDir, + ctx.getApplicationInfo().sourceDir); + + ctx.startActivity(retro); + ctx.finish(); + } + // An error occured + else + { + progressTextView.setText("Error: " + s); + } + } + } +} diff --git a/pkg/android/phoenix64/AndroidManifest.xml b/pkg/android/phoenix64/AndroidManifest.xml index a2a1ad7d22..03dcee9dc2 100644 --- a/pkg/android/phoenix64/AndroidManifest.xml +++ b/pkg/android/phoenix64/AndroidManifest.xml @@ -39,5 +39,6 @@ + From 770bd52411f3ba0093b33834e7e8c94ae6b64607 Mon Sep 17 00:00:00 2001 From: Nano Date: Sun, 23 Dec 2018 18:08:59 +0100 Subject: [PATCH 007/116] Fix issue #2791 black bug --- gfx/drivers/gl.c | 31 +++++++++++++++++++++++++++---- gfx/video_thread_wrapper.c | 2 +- gfx/video_thread_wrapper.h | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index d62bd67cf4..f11d74ffe1 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -2502,6 +2502,12 @@ static void video_texture_load_gl( ); } +static void video_texture_unload_gl( + uintptr_t *id) +{ + glDeleteTextures(1, (GLuint*)id); +} + #ifdef HAVE_THREADS static int video_texture_load_wrap_gl_mipmap(void *data) { @@ -2524,6 +2530,14 @@ static int video_texture_load_wrap_gl(void *data) TEXTURE_FILTER_LINEAR, &id); return (int)id; } + +static int video_texture_unload_wrap_gl(void *data) +{ + if (!data) + return 0; + video_texture_unload_gl((uintptr_t *)data); + return 0; +} #endif static uintptr_t gl_load_texture(void *video_data, void *data, @@ -2545,7 +2559,7 @@ static uintptr_t gl_load_texture(void *video_data, void *data, default: break; } - return video_thread_texture_load(data, func); + return video_thread_custom_cmd(data, func); } #endif @@ -2553,14 +2567,23 @@ static uintptr_t gl_load_texture(void *video_data, void *data, return id; } -static void gl_unload_texture(void *data, uintptr_t id) +static void gl_unload_texture(void *data, uintptr_t id, bool threaded) { GLuint glid; if (!id) return; - glid = (GLuint)id; - glDeleteTextures(1, &glid); + +#ifdef HAVE_THREADS + if (threaded) + { + custom_command_method_t func = video_texture_unload_wrap_gl; + video_thread_custom_cmd(&glid, func); + return; + } +#endif + + video_texture_unload_gl(&glid); } static void gl_set_coords(void *handle_data, void *shader_data, diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index 7f3b2a2c0e..1290b3792d 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -1425,7 +1425,7 @@ bool video_thread_font_init(const void **font_driver, void **font_handle, return pkt.data.font_init.return_value; } -unsigned video_thread_texture_load(void *data, +unsigned video_thread_custom_cmd(void *data, custom_command_method_t func) { thread_video_t *thr = (thread_video_t*)video_driver_get_ptr(true); diff --git a/gfx/video_thread_wrapper.h b/gfx/video_thread_wrapper.h index 3fd306590a..5aba4fd741 100644 --- a/gfx/video_thread_wrapper.h +++ b/gfx/video_thread_wrapper.h @@ -83,7 +83,7 @@ bool video_thread_font_init( custom_font_command_method_t func, bool is_threaded); -unsigned video_thread_texture_load(void *data, +unsigned video_thread_custom_cmd(void *data, custom_command_method_t func); RETRO_END_DECLS From c079a2f9535de6d3afbb7c196df85f2244ae8f64 Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 23 Dec 2018 09:43:27 -0800 Subject: [PATCH 008/116] Makefile: Install assets only for enabled menus. Currently RetroArch will install assets for xmb, materialui and ozone unconditionally. This change will now only install assets when RetroArch is compiled with support for the relevant menu driver. This also exposes assets from the nuklear and zarch menu drivers which are still disabled by default. --- Makefile | 20 ++++++++++++++++---- Makefile.common | 23 ++++++++++++++--------- qb/config.libs.sh | 2 +- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 7f4b717e69..304bc4309f 100644 --- a/Makefile +++ b/Makefile @@ -243,12 +243,24 @@ install: $(TARGET) chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch.6 chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch-cg2glsl.6 chmod 644 $(DESTDIR)$(DATA_DIR)/pixmaps/retroarch.svg - @if test -d media/assets; then \ + @if test -d media/assets && test $(HAVE_ASSETS); then \ echo "Installing media assets..."; \ mkdir -p $(DESTDIR)$(ASSETS_DIR)/assets; \ - cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/assets; \ - cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/assets; \ - cp -r media/assets/ozone/ $(DESTDIR)$(ASSETS_DIR)/assets; \ + if test $(HAVE_ZARCH) = 1; then \ + cp -r media/assets/zarch/ $(DESTDIR)$(ASSETS_DIR)/assets; \ + fi; \ + if test $(HAVE_MATERIALUI) = 1; then \ + cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/assets; \ + fi; \ + if test $(HAVE_NUKLEAR) = 1; then \ + cp -r media/assets/nuklear/ $(DESTDIR)$(ASSETS_DIR)/assets; \ + fi; \ + if test $(HAVE_XMB) = 1; then \ + cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/assets; \ + fi; \ + if test $(HAVE_OZONE) = 1; then \ + cp -r media/assets/ozone/ $(DESTDIR)$(ASSETS_DIR)/assets; \ + fi; \ cp media/assets/COPYING $(DESTDIR)$(DOC_DIR)/COPYING.assets; \ echo "Asset copying done."; \ fi diff --git a/Makefile.common b/Makefile.common index cf455191a6..23ff641e43 100644 --- a/Makefile.common +++ b/Makefile.common @@ -657,25 +657,25 @@ endif # XMB and MaterialUI are always enabled if supported and not explicitly disabled ifeq ($(HW_CONTEXT_MENU_DRIVERS), 1) - #ifeq ($(HAVE_ZARCH),) - #HAVE_ZARCH = 1 - #endif + ifeq ($(HAVE_ZARCH),) + HAVE_ZARCH = 0 + endif ifeq ($(HAVE_MATERIALUI),) HAVE_MATERIALUI = 1 endif - #ifeq ($(HAVE_NUKLEAR),) - #HAVE_NUKLEAR = 1 - #endif + ifeq ($(HAVE_NUKLEAR),) + HAVE_NUKLEAR = 0 + endif ifeq ($(HAVE_XMB),) HAVE_XMB = 1 endif - #ifeq ($(HAVE_STRIPES),) - #HAVE_STRIPES = 1 - #endif + ifeq ($(HAVE_STRIPES),) + HAVE_STRIPES = 0 + endif ifeq ($(HAVE_OZONE),) HAVE_OZONE = 1 @@ -697,6 +697,7 @@ ifeq ($(HAVE_RGUI), 1) OBJ += menu/drivers/materialui.o DEFINES += -DHAVE_MATERIALUI HAVE_MENU_COMMON = 1 + HAVE_ASSETS = 1 endif ifeq ($(HAVE_NUKLEAR), 1) OBJ += menu/drivers/nuklear/nk_common.o @@ -704,10 +705,12 @@ ifeq ($(HAVE_RGUI), 1) OBJ += menu/drivers/nuklear/nk_wnd_debug.o OBJ += menu/drivers/nuklear.o DEFINES += -DHAVE_NUKLEAR + HAVE_ASSETS = 1 endif ifeq ($(HAVE_ZARCH), 1) OBJ += menu/drivers/zarch.o DEFINES += -DHAVE_ZARCH + HAVE_ASSETS = 1 endif endif @@ -715,6 +718,7 @@ ifeq ($(HAVE_XMB), 1) OBJ += menu/drivers/xmb.o DEFINES += -DHAVE_XMB HAVE_MENU_COMMON = 1 + HAVE_ASSETS = 1 endif ifeq ($(HAVE_OZONE), 1) @@ -726,6 +730,7 @@ ifeq ($(HAVE_OZONE), 1) OBJ += menu/drivers/ozone/ozone_sidebar.o DEFINES += -DHAVE_OZONE HAVE_MENU_COMMON = 1 + HAVE_ASSETS = 1 endif ifeq ($(HAVE_STRIPES), 1) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 3156d9e7a2..9ba639ec91 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -556,7 +556,7 @@ fi check_pkgconf PYTHON python3 -if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" != 'no' ]; then +if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" != 'no' ] || [ "$HAVE_OZONE" != 'no' ]; then if [ "$HAVE_RGUI" = 'no' ]; then HAVE_MATERIALUI=no HAVE_XMB=no From d51b8012218b0062d72bd0bb5bcc8690b0a0c258 Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 23 Dec 2018 11:40:47 -0800 Subject: [PATCH 009/116] ozone: Fix crash with menu_use_preferred_system_color_theme. Fixes https://github.com/libretro/RetroArch/issues/7805 --- menu/drivers/ozone/ozone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 1ef225cfd5..fa9fd08a87 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -195,8 +195,8 @@ static void *ozone_init(void **userdata, bool video_is_threaded) setsysExit(); } else - fallback_color_theme = true; #endif + fallback_color_theme = true; } else fallback_color_theme = true; From 90d816f31a09dfb9df9dd50d357194de0ca0f500 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Dec 2018 16:24:18 -0500 Subject: [PATCH 010/116] reset on toggle everytime --- menu/menu_setting.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 00aea98a01..5bf9a944d2 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -3021,9 +3021,7 @@ static void achievement_hardcore_mode_write_handler(rarch_setting_t *setting) if (!setting) return; - if (settings && settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable - && cheevos_state_loaded_flag - ) + if (settings && settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable) { cheevos_toggle_hardcore_mode(); command_event(CMD_EVENT_RESET, NULL); From d2a2878b2c33e0a3010189575a9f4bc1c47789d4 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Dec 2018 19:55:26 -0500 Subject: [PATCH 011/116] fix #935 thanks to @bparker --- gfx/common/win32_common.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 79f3dd6b9e..567b524f31 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -591,8 +591,13 @@ static LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message, settings_t *settings = config_get_ptr(); if (settings && string_is_equal(settings->arrays.input_driver, "raw")) keysym = (unsigned)wparam; + else #endif - + { + /* extended keys will map to dinput if the high bit is set */ + if (input_get_ptr() == &input_dinput && (lparam >> 24 & 0x1)) + keysym |= 0x80; + } /* Key released? */ if (message == WM_KEYUP || message == WM_SYSKEYUP) keydown = false; From 992d221af9d65472ae11a03dce947d93275b76de Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 24 Dec 2018 03:31:01 +0100 Subject: [PATCH 012/116] (D3D8/D3D9) Buildfixes --- gfx/drivers/d3d8.c | 2 +- gfx/drivers/d3d9.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers/d3d8.c b/gfx/drivers/d3d8.c index a5dcf1b2a1..207d88fed7 100644 --- a/gfx/drivers/d3d8.c +++ b/gfx/drivers/d3d8.c @@ -1845,7 +1845,7 @@ static uintptr_t d3d8_load_texture(void *video_data, void *data, info.type = filter_type; if (threaded) - return video_thread_texture_load(&info, + return video_thread_custom_cmd(&info, d3d8_video_texture_load_wrap_d3d); d3d8_video_texture_load_d3d(&info, &id); diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index a383190b48..5e6f708305 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -2011,7 +2011,7 @@ static uintptr_t d3d9_load_texture(void *video_data, void *data, info.type = filter_type; if (threaded) - return video_thread_texture_load(&info, + return video_thread_custom_cmd(&info, d3d9_video_texture_load_wrap_d3d); d3d9_video_texture_load_d3d(&info, &id); From 1aee59f9f425864e5b131803fec3df0b6790dc1a Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Mon, 24 Dec 2018 03:33:18 +0100 Subject: [PATCH 013/116] Revert "Fix issue #2791 black bug" --- gfx/drivers/gl.c | 31 ++++--------------------------- gfx/video_thread_wrapper.c | 2 +- gfx/video_thread_wrapper.h | 2 +- 3 files changed, 6 insertions(+), 29 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index f11d74ffe1..d62bd67cf4 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -2502,12 +2502,6 @@ static void video_texture_load_gl( ); } -static void video_texture_unload_gl( - uintptr_t *id) -{ - glDeleteTextures(1, (GLuint*)id); -} - #ifdef HAVE_THREADS static int video_texture_load_wrap_gl_mipmap(void *data) { @@ -2530,14 +2524,6 @@ static int video_texture_load_wrap_gl(void *data) TEXTURE_FILTER_LINEAR, &id); return (int)id; } - -static int video_texture_unload_wrap_gl(void *data) -{ - if (!data) - return 0; - video_texture_unload_gl((uintptr_t *)data); - return 0; -} #endif static uintptr_t gl_load_texture(void *video_data, void *data, @@ -2559,7 +2545,7 @@ static uintptr_t gl_load_texture(void *video_data, void *data, default: break; } - return video_thread_custom_cmd(data, func); + return video_thread_texture_load(data, func); } #endif @@ -2567,23 +2553,14 @@ static uintptr_t gl_load_texture(void *video_data, void *data, return id; } -static void gl_unload_texture(void *data, uintptr_t id, bool threaded) +static void gl_unload_texture(void *data, uintptr_t id) { GLuint glid; if (!id) return; + glid = (GLuint)id; - -#ifdef HAVE_THREADS - if (threaded) - { - custom_command_method_t func = video_texture_unload_wrap_gl; - video_thread_custom_cmd(&glid, func); - return; - } -#endif - - video_texture_unload_gl(&glid); + glDeleteTextures(1, &glid); } static void gl_set_coords(void *handle_data, void *shader_data, diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index 1290b3792d..7f3b2a2c0e 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -1425,7 +1425,7 @@ bool video_thread_font_init(const void **font_driver, void **font_handle, return pkt.data.font_init.return_value; } -unsigned video_thread_custom_cmd(void *data, +unsigned video_thread_texture_load(void *data, custom_command_method_t func) { thread_video_t *thr = (thread_video_t*)video_driver_get_ptr(true); diff --git a/gfx/video_thread_wrapper.h b/gfx/video_thread_wrapper.h index 5aba4fd741..3fd306590a 100644 --- a/gfx/video_thread_wrapper.h +++ b/gfx/video_thread_wrapper.h @@ -83,7 +83,7 @@ bool video_thread_font_init( custom_font_command_method_t func, bool is_threaded); -unsigned video_thread_custom_cmd(void *data, +unsigned video_thread_texture_load(void *data, custom_command_method_t func); RETRO_END_DECLS From 374384128c8b29c041b31ac8c11fd087c1eda1b0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 24 Dec 2018 03:34:58 +0100 Subject: [PATCH 014/116] Revert "(D3D8/D3D9) Buildfixes" This reverts commit 992d221af9d65472ae11a03dce947d93275b76de. --- gfx/drivers/d3d8.c | 2 +- gfx/drivers/d3d9.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers/d3d8.c b/gfx/drivers/d3d8.c index 207d88fed7..a5dcf1b2a1 100644 --- a/gfx/drivers/d3d8.c +++ b/gfx/drivers/d3d8.c @@ -1845,7 +1845,7 @@ static uintptr_t d3d8_load_texture(void *video_data, void *data, info.type = filter_type; if (threaded) - return video_thread_custom_cmd(&info, + return video_thread_texture_load(&info, d3d8_video_texture_load_wrap_d3d); d3d8_video_texture_load_d3d(&info, &id); diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 5e6f708305..a383190b48 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -2011,7 +2011,7 @@ static uintptr_t d3d9_load_texture(void *video_data, void *data, info.type = filter_type; if (threaded) - return video_thread_custom_cmd(&info, + return video_thread_texture_load(&info, d3d9_video_texture_load_wrap_d3d); d3d9_video_texture_load_d3d(&info, &id); From abc31fa092f4a7361e40dbcbcb41d8a17146c9ac Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 24 Dec 2018 00:49:19 -0500 Subject: [PATCH 015/116] allow playing video from http/https sources --- paths.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paths.c b/paths.c index 869d6b8e34..67a71840c2 100644 --- a/paths.c +++ b/paths.c @@ -724,6 +724,8 @@ enum rarch_content_type path_is_media_type(const char *path) /* hack, to detect livestreams so the ffmpeg core can be started */ if ( strstr(path, "udp://") || + strstr(path, "http://") || + strstr(path, "https://")|| strstr(path, "tcp://") || strstr(path, "rtmp://") || strstr(path, "rtp://") From 476abf7dad43ae2f473e93a224fd103e6a220dcf Mon Sep 17 00:00:00 2001 From: orbea Date: Mon, 24 Dec 2018 15:30:54 -0800 Subject: [PATCH 016/116] materialui: Move 'Start Core' before 'Load Core'. This matches other menu drivers better where its already like this in rgui, xmb and ozone. --- menu/drivers/materialui.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index cc6b7deede..9099662cd8 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -2057,6 +2057,12 @@ static int materialui_list_push(void *data, void *userdata, menu_displaylist_setting(&entry); } + if (system->load_no_content) + { + entry.enum_idx = MENU_ENUM_LABEL_START_CORE; + menu_displaylist_setting(&entry); + } + #ifndef HAVE_DYNAMIC if (frontend_driver_has_fork()) #endif @@ -2068,12 +2074,6 @@ static int materialui_list_push(void *data, void *userdata, } } - if (system->load_no_content) - { - entry.enum_idx = MENU_ENUM_LABEL_START_CORE; - menu_displaylist_setting(&entry); - } - if (settings->bools.menu_show_load_content) { entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; From 80ed61f2571f74b2b31db61091c01e5584eac8bf Mon Sep 17 00:00:00 2001 From: orbea Date: Tue, 25 Dec 2018 13:08:42 -0800 Subject: [PATCH 017/116] cli: Fix the --no-patch argument. Fixes https://github.com/libretro/RetroArch/issues/5885 First bad commit: https://github.com/libretro/RetroArch/commit/d28c138d09922f5458c8ee86a049aa3a961d0262 --- tasks/task_content.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_content.c b/tasks/task_content.c index af23201538..60e08e11da 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -1899,6 +1899,7 @@ bool content_init(void) temporary_content = string_list_new(); content_ctx.check_firmware_before_loading = settings->bools.check_firmware_before_loading; + content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.is_ips_pref = rarch_ctl(RARCH_CTL_IS_IPS_PREF, NULL); content_ctx.is_bps_pref = rarch_ctl(RARCH_CTL_IS_BPS_PREF, NULL); content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); @@ -1913,7 +1914,6 @@ bool content_init(void) content_ctx.block_extract = false; content_ctx.need_fullpath = false; content_ctx.set_supports_no_game_enable = false; - content_ctx.patch_is_blocked = false; content_ctx.subsystem.data = NULL; content_ctx.subsystem.size = 0; From bcfa332be9efde8c252689537401501b2adecfc4 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 25 Dec 2018 20:18:19 -0500 Subject: [PATCH 018/116] stop litering emmmc for temporary files --- frontend/drivers/platform_unix.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index ddce3cc9c0..440b336050 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -1562,8 +1562,6 @@ static void frontend_unix_get_env(int *argc, { fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], app_dir, "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], app_dir, - "tmp", sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], app_dir, "shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_OVERLAY], app_dir, @@ -1628,6 +1626,10 @@ static void frontend_unix_get_env(int *argc, internal_storage_app_path, "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], + internal_storage_app_path, "temp", + sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE])); + if(!string_is_empty(screenshot_dir) && test_permissions(screenshot_dir)) { @@ -1686,6 +1688,10 @@ static void frontend_unix_get_env(int *argc, app_dir, "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], + app_dir, "temp", + sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE])); + if( !string_is_empty(screenshot_dir) && test_permissions(screenshot_dir)) { @@ -1749,6 +1755,10 @@ static void frontend_unix_get_env(int *argc, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], internal_storage_path, "RetroArch/cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], + internal_storage_path, "temp", + sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE])); default: break; } From 6e25978be5721e88121a76939acec241d9b68855 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 25 Dec 2018 20:23:56 -0500 Subject: [PATCH 019/116] try to fix #7811 --- runahead/secondary_core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runahead/secondary_core.c b/runahead/secondary_core.c index 801d2e491e..02d708e736 100644 --- a/runahead/secondary_core.c +++ b/runahead/secondary_core.c @@ -18,6 +18,7 @@ #include "mem_util.h" #include "../core.h" +#include "../configuration.h" #include "../dynamic.h" #include "../paths.h" #include "../content.h" @@ -50,6 +51,7 @@ void clear_controller_port_map(void); static char *get_temp_directory_alloc(void) { + settings_t *settings = config_get_ptr(); char *path = NULL; #ifdef _WIN32 #ifdef LEGACY_WIN32 @@ -67,6 +69,8 @@ static char *get_temp_directory_alloc(void) path = utf16_to_utf8_string_alloc(wideStr); free(wideStr); #endif +#elif defined ANDROID + path = strcpy_alloc_force(settings->paths.directory_libretro); #else path = "/tmp"; if (getenv("TMPDIR")) From 90ba2df9727de3fb433806c9c6df01b90be3ad96 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Sun, 11 Nov 2018 17:14:06 +0100 Subject: [PATCH 020/116] Put proper license in the files for the PS2 development --- frontend/drivers/platform_ps2.c | 3 +-- gfx/drivers/ps2_gfx.c | 2 +- input/drivers/ps2_input.c | 3 +-- input/drivers_joypad/ps2_joypad.c | 4 +--- input/drivers_joypad/ps2_joypad_copy.c | 0 ps2/compat_ctype.c | 14 ++++++++++++++ ps2/include/compat_ctype.h | 14 ++++++++++++++ ps2/include/inttypes.h | 14 ++++++++++++++ ps2/include/math.h | 14 ++++++++++++++ ps2/include/pte_types.h | 14 +++++++++++++- ps2/include/stdint.h | 14 ++++++++++++++ 11 files changed, 87 insertions(+), 9 deletions(-) delete mode 100644 input/drivers_joypad/ps2_joypad_copy.c diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index 93d389d889..17471f1401 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -1,6 +1,5 @@ /* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index cb921bbc68..45f67c28c8 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -1,5 +1,5 @@ /* RetroArch - A frontend for libretro. - * Copyright (C) 2018 - Francisco Javier Trujillo Mata + * Copyright (C) 2018 - Francisco Javier Trujillo Mata - fjtrujy * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- diff --git a/input/drivers/ps2_input.c b/input/drivers/ps2_input.c index 6942c700f9..733bd75b04 100644 --- a/input/drivers/ps2_input.c +++ b/input/drivers/ps2_input.c @@ -1,6 +1,5 @@ /* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2011-2018 - Francisco Javier Trujillo Mata - fjtrujy * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- diff --git a/input/drivers_joypad/ps2_joypad.c b/input/drivers_joypad/ps2_joypad.c index 969c075ebe..35d05cf3e9 100644 --- a/input/drivers_joypad/ps2_joypad.c +++ b/input/drivers_joypad/ps2_joypad.c @@ -1,7 +1,5 @@ /* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2013-2014 - CatalystG + * Copyright (C) 2011-2018 - Francisco Javier Trujillo Mata - fjtrujy * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- diff --git a/input/drivers_joypad/ps2_joypad_copy.c b/input/drivers_joypad/ps2_joypad_copy.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/ps2/compat_ctype.c b/ps2/compat_ctype.c index 0c5dba835d..03da546d38 100644 --- a/ps2/compat_ctype.c +++ b/ps2/compat_ctype.c @@ -1,3 +1,17 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + #include #include #include diff --git a/ps2/include/compat_ctype.h b/ps2/include/compat_ctype.h index 1d80025c28..e1038f2f09 100644 --- a/ps2/include/compat_ctype.h +++ b/ps2/include/compat_ctype.h @@ -1,3 +1,17 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + #ifndef COMPAT_CTYPE_H #define COMPAT_CTYPE_H diff --git a/ps2/include/inttypes.h b/ps2/include/inttypes.h index 3049fbdbba..8b37fcc33e 100644 --- a/ps2/include/inttypes.h +++ b/ps2/include/inttypes.h @@ -1,3 +1,17 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + #ifndef INTTYPES_H #define INTTYPES_H diff --git a/ps2/include/math.h b/ps2/include/math.h index bf0071edb1..fa0672624f 100644 --- a/ps2/include/math.h +++ b/ps2/include/math.h @@ -1,3 +1,17 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + #ifndef MATH_H #define MATH_H diff --git a/ps2/include/pte_types.h b/ps2/include/pte_types.h index 7e81156684..4da1ebac65 100644 --- a/ps2/include/pte_types.h +++ b/ps2/include/pte_types.h @@ -1,4 +1,16 @@ -/* pte_types.h */ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ #ifndef PTE_TYPES_H #define PTE_TYPES_H diff --git a/ps2/include/stdint.h b/ps2/include/stdint.h index 813efd21f8..e9f805b7d3 100644 --- a/ps2/include/stdint.h +++ b/ps2/include/stdint.h @@ -1,3 +1,17 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + #ifndef STDINT_H #define STDINT_H From 40b028ebce628b2faa9ffdbb0f4c86c751c8d9be Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Sun, 11 Nov 2018 17:14:39 +0100 Subject: [PATCH 021/116] Replace malloc for calloc in the ps2_gfx --- gfx/drivers/ps2_gfx.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index 45f67c28c8..a25c9c8239 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -66,10 +66,7 @@ static GSGLOBAL *init_GSGlobal(void) { } static GSTEXTURE * prepare_new_texture(void) { - GSTEXTURE *texture = malloc(sizeof *texture); - texture->Width = 0; - texture->Height = 0; - texture->Mem = NULL; + GSTEXTURE *texture = calloc(1, sizeof(*texture)); return texture; } From 282e688ee6c779e96df7c8f08cefae34c3e67530 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Mon, 12 Nov 2018 18:34:50 +0100 Subject: [PATCH 022/116] Cleaning not needed libraries for the PS2 --- Makefile.ps2 | 13 ++++++++++--- audio/drivers/nullaudio.c | 2 +- frontend/drivers/platform_ps2.c | 18 +++++++++--------- ps2/compat_ctype.c | 5 +++++ ps2/include/compat_ctype.h | 1 + 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Makefile.ps2 b/Makefile.ps2 index cbd9a5c556..d770baf8ed 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -2,7 +2,7 @@ BUILD_PRX = 0 DEBUG = 1 HAVE_KERNEL_PRX = 0 HAVE_LOGGER = 0 -HAVE_FILE_LOGGER = 0 +HAVE_FILE_LOGGER = 1 HAVE_THREADS = 0 BIG_STACK = 0 WHOLE_ARCHIVE_LINK = 0 @@ -34,13 +34,13 @@ CFLAGS = $(OPTIMIZE_LV) -ffast-math -fsingle-precision-constant ASFLAGS = $(CFLAGS) RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DWANT_ZLIB -RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER +RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_IMAGEVIEWER -DHAVE_7ZIP -DHAVE_CC_RESAMPLER LIBDIR = LDFLAGS = -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. #LIBS = $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -lstdc++ -lm -lz -lgskit -ldmakit -lpng -laudsrv -lpad -lcdvd -lmad -lfileXio -lpatches LIBS += $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -LIBS += -lm -lg -lz -ldebug -lfileXio -laudsrv -lpatches -lpoweroff -ldma -lgskit -ldmakit -lpad -lsdl +LIBS += -lgskit -lpad -lsdl -lm -lz -lfileXio -laudsrv -lpatches -lpoweroff #IRX modules # IRX modules - modules have to be in IRX_DIR @@ -102,4 +102,11 @@ $(EE_IRX_OBJ): #Include preferences include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal + + +# $(EE_BIN): $(EE_OBJS) $(PS2SDK)/ee/startup/crt0.o +# $(EE_CXX) $(EE_NO_CRT) -T$(PS2SDK)/ee/startup/linkfile $(EE_CXXFLAGS) \ +# -o $(EE_BIN) $(PS2SDK)/ee/startup/crt0.o $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(EE_OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) $(EE_LDFLAGS) $(EE_LIBS) + + \ No newline at end of file diff --git a/audio/drivers/nullaudio.c b/audio/drivers/nullaudio.c index 39be26d4d0..c7dffc6f7e 100644 --- a/audio/drivers/nullaudio.c +++ b/audio/drivers/nullaudio.c @@ -21,7 +21,7 @@ static void *null_audio_init(const char *device, unsigned rate, unsigned latency unsigned block_frames, unsigned *new_rate) { - RARCH_ERR("Using the null audio driver. RetroArch will be silent."); + RARCH_ERR("Using the null audio driver. RetroArch will be silent.\n"); (void)device; (void)rate; diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index 17471f1401..ca7411bb45 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -165,13 +165,6 @@ static const char *getMountParams(const char *command, char *BlockDevice) { static void create_path_names(void) { -#ifndef IS_SALAMANDER -#if defined(HAVE_LOGGER) - -#elif defined(HAVE_FILE_LOGGER) - retro_main_log_file_init("ux0:/temp/retroarch-log.txt"); // It really depend from where we are executing this -#endif -#endif fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE], g_defaults.dirs[DEFAULT_DIR_PORT], "CORES", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); @@ -231,7 +224,6 @@ static void frontend_ps2_get_environment_settings(int *argc, char *argv[], const char *mountPoint; int bootDeviceID; - //TODO: I DONT KNOW YET, WHY IT CRASHES IF UNCOMENT THIS PART getcwd(cwd, sizeof(cwd)); bootDeviceID=getBootDeviceID(cwd); //Mount the HDD partition, if required. @@ -331,6 +323,14 @@ static void frontend_ps2_init(void *data) audsrv_init(); SDL_Init(SDL_INIT_TIMER); + + +retro_sleep(100); + +#if defined(HAVE_FILE_LOGGER) + retro_main_log_file_init("retroarch.log"); + verbosity_enable(); +#endif } static void frontend_ps2_deinit(void *data) @@ -466,7 +466,7 @@ static int frontend_ps2_parse_drive_list(void *data, bool load_content) enum_idx, FILE_TYPE_DIRECTORY, 0, 0); menu_entries_append_enum(list, - "host:/", + "host:", msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); diff --git a/ps2/compat_ctype.c b/ps2/compat_ctype.c index 03da546d38..4dbd400cea 100644 --- a/ps2/compat_ctype.c +++ b/ps2/compat_ctype.c @@ -439,3 +439,8 @@ int link(const char *oldpath, const char *newpath) { return fileXioSymlink(oldpath, newpath); } + +int unlink(const char *path) +{ + return fileXioRemove(path); +} diff --git a/ps2/include/compat_ctype.h b/ps2/include/compat_ctype.h index e1038f2f09..cd1b96f543 100644 --- a/ps2/include/compat_ctype.h +++ b/ps2/include/compat_ctype.h @@ -20,5 +20,6 @@ char *strtok_r(char *str, const char *delim, char **saveptr); unsigned long long strtoull(const char * __restrict nptr, char ** __restrict endptr, int base); int link(const char *oldpath, const char *newpath); +int unlink(const char *path); #endif From 5b7a71abd370cf1e9317945ead956da0d4886d91 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Wed, 19 Dec 2018 20:30:17 +0100 Subject: [PATCH 023/116] Make logs work for the PS2 --- verbosity.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/verbosity.c b/verbosity.c index 42a79f4977..9db900e8e4 100644 --- a/verbosity.c +++ b/verbosity.c @@ -118,9 +118,11 @@ void retro_main_log_file_init(const char *path) log_file_fp = (FILE*)fopen_utf8(path, "wb"); log_file_initialized = true; +#if !defined(PS2) /* TODO: this is only useful for a few platforms, find which and add ifdef */ log_file_buf = calloc(1, 0x4000); setvbuf(log_file_fp, (char*)log_file_buf, _IOFBF, 0x4000); +#endif } void retro_main_log_file_deinit(void) From 69ad3273b9410c000bd8738bb565821d52696752 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Mon, 24 Dec 2018 16:15:05 +0100 Subject: [PATCH 024/116] Disable use of `setvbuf` for the PS2 --- Makefile.ps2 | 15 +++++++-------- gfx/drivers/ps2_gfx.c | 1 - libretro-common/file/config_file.c | 2 ++ libretro-common/vfs/vfs_implementation.c | 2 ++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Makefile.ps2 b/Makefile.ps2 index d770baf8ed..5c82d24d40 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -6,7 +6,7 @@ HAVE_FILE_LOGGER = 1 HAVE_THREADS = 0 BIG_STACK = 0 WHOLE_ARCHIVE_LINK = 0 -PS2_IP = 192.168.1.150 +PS2_IP = 192.168.2.150 #Configuration for IRX EE_BIN2O = bin2o @@ -26,7 +26,7 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1) WHOLE_END := -Wl,--no-whole-archive endif -INCDIR = -I$(PS2SDK)/ports/include -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/iop/include -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include +INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include INCDIR += -Ips2 -Ips2/include -Ilibretro-common/include INCDIR += -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ideps/pthreads -Ideps/pthreads/platform/ps2 -Ideps/pthreads/platform/helper GPVAL = -G0 @@ -37,10 +37,9 @@ RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHA RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_IMAGEVIEWER -DHAVE_7ZIP -DHAVE_CC_RESAMPLER LIBDIR = -LDFLAGS = -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. -#LIBS = $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -lstdc++ -lm -lz -lgskit -ldmakit -lpng -laudsrv -lpad -lcdvd -lmad -lfileXio -lpatches +LDFLAGS = -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. -s LIBS += $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -LIBS += -lgskit -lpad -lsdl -lm -lz -lfileXio -laudsrv -lpatches -lpoweroff +LIBS += -lgskit -ldmakit -lpad -lmc -lhdd -lsdl -lc -lfileXio -lpatches -lpoweroff -ldebug -lc #IRX modules # IRX modules - modules have to be in IRX_DIR @@ -104,9 +103,9 @@ include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal -# $(EE_BIN): $(EE_OBJS) $(PS2SDK)/ee/startup/crt0.o -# $(EE_CXX) $(EE_NO_CRT) -T$(PS2SDK)/ee/startup/linkfile $(EE_CXXFLAGS) \ -# -o $(EE_BIN) $(PS2SDK)/ee/startup/crt0.o $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(EE_OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) $(EE_LDFLAGS) $(EE_LIBS) +$(EE_BIN): $(EE_OBJS) $(PS2SDK)/ee/startup/crt0.o + $(EE_CXX) $(EE_NO_CRT) -T$(PS2SDK)/ee/startup/linkfile $(EE_CXXFLAGS) \ + -o $(EE_BIN) $(PS2SDK)/ee/startup/crt0.o $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(EE_OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) $(EE_LDFLAGS) $(EE_LIBS) \ No newline at end of file diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index a25c9c8239..5080fde489 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -18,7 +18,6 @@ #include "../../driver.h" #include "../../verbosity.h" -#include #include #include #include diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 846fa2c6fc..fcf95de2e9 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -986,8 +986,10 @@ bool config_file_write(config_file_t *conf, const char *path) return false; /* TODO: this is only useful for a few platforms, find which and add ifdef */ +#if !defined(PS2) buf = calloc(1, 0x4000); setvbuf(file, (char*)buf, _IOFBF, 0x4000); +#endif config_file_dump(conf, file); diff --git a/libretro-common/vfs/vfs_implementation.c b/libretro-common/vfs/vfs_implementation.c index 0213c06091..4721e7259e 100644 --- a/libretro-common/vfs/vfs_implementation.c +++ b/libretro-common/vfs/vfs_implementation.c @@ -294,8 +294,10 @@ libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, uns */ /* TODO: this is only useful for a few platforms, find which and add ifdef */ stream->fp = fp; +#if !defined(PS2) stream->buf = (char*)calloc(1, 0x4000); setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); +#endif } else { From 38397370e60105c1fa807732e807c7843d105e9a Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Wed, 26 Dec 2018 13:24:57 +0100 Subject: [PATCH 025/116] Apply proper color correction for 16 bits --- gfx/drivers/ps2_gfx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index 5080fde489..39a9053793 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -45,7 +45,7 @@ static GSGLOBAL *init_GSGlobal(void) { GSGLOBAL *gsGlobal = gsKit_init_global(); gsGlobal->PSM = GS_PSM_CT16; - gsGlobal->PSMZ = GS_PSMZ_16S; + gsGlobal->PSMZ = GS_PSMZ_16; gsGlobal->DoubleBuffering = GS_SETTING_OFF; gsGlobal->ZBuffering = GS_SETTING_OFF; gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; @@ -98,7 +98,7 @@ static void color_correction16(uint16_t *buffer, uint32_t dimensions) uint16_t x16; for (i = 0; i < dimensions; i++) { x16 = buffer[i]; - buffer[i] = (x16 & 0x8000) | ((x16 << 10) & 0x7C00) | (x16 & 0x3E0) | ((x16 >> 10) & 0x1F); + buffer[i] = (x16 & 0x8000) | ((x16 << 10) & 0x7C00) | ((x16 >> 1) & 0x3E0) | ((x16 >> 11) & 0x1F); } } From 0224bf22b2ba6dc05ab64ca7bed41bf5ce8cafb4 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Wed, 26 Dec 2018 13:40:20 +0100 Subject: [PATCH 026/116] Add release option in the Makefile.ps2 --- Makefile.ps2 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile.ps2 b/Makefile.ps2 index 5c82d24d40..90c51cff3e 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -1,5 +1,5 @@ BUILD_PRX = 0 -DEBUG = 1 +DEBUG = 0 HAVE_KERNEL_PRX = 0 HAVE_LOGGER = 0 HAVE_FILE_LOGGER = 1 @@ -13,6 +13,7 @@ EE_BIN2O = bin2o IRX_DIR = $(PS2SDK)/iop/irx TARGET = retroarchps2.elf +TARGET_RELEASE = retroarchps2-release.elf ifeq ($(DEBUG), 1) OPTIMIZE_LV := -O0 -g @@ -94,6 +95,9 @@ run: debug: clean prepare all run +release: clean all + ps2-packer $(EE_BIN) $(TARGET_RELEASE) + #Specific file name and output per IRX Module $(EE_IRX_OBJ): $(EE_BIN2O) $(EE_GPVAL) $(IRX_DIR)/$(@:.o=.irx) $@ $(@:.o=_irx) From 9ec293bb5b179b0df16e0820cc840fa177fea7ce Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Wed, 26 Dec 2018 14:26:46 +0100 Subject: [PATCH 027/116] Including fjtrujy in the list of Authors ;) --- AUTHORS.h | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.h b/AUTHORS.h index a7f3298fb4..a94c292b12 100644 --- a/AUTHORS.h +++ b/AUTHORS.h @@ -94,6 +94,7 @@ FIX94 Flame Sage (chris062689) flyinghead Francisco José García García (frangarcj) +Francisco Javier Trujillo Mata (fjtrujy) GameDragon2k Garrett Brown (garbear) gblues From ff63852a7cf59d7fdd2bd62aa06332df560c3ace Mon Sep 17 00:00:00 2001 From: orbea Date: Wed, 26 Dec 2018 09:14:10 -0800 Subject: [PATCH 028/116] menu: Hide 'Parent Directory' in compressed archives. When browsing compressed archives 'Parent Directory' will not work and will endlessly recurse into non-existent empty directories where the user will have to press the back button to get out of every instance. This will now hide 'Parent Directory' in compressed archives to avoid this issue. The user will still be able to press the back button to exit. Fixes https://github.com/libretro/RetroArch/issues/2604 --- menu/widgets/menu_filebrowser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c index 4999bcca5e..4175bcb9ba 100644 --- a/menu/widgets/menu_filebrowser.c +++ b/menu/widgets/menu_filebrowser.c @@ -305,7 +305,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) } end: - if (info) + if (info && !path_is_compressed) menu_entries_prepend(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), path, From b84b1b083a9ee6b7a0d7ab9afc0e3224bf6f7ce7 Mon Sep 17 00:00:00 2001 From: orbea Date: Wed, 26 Dec 2018 09:39:06 -0800 Subject: [PATCH 029/116] menu: Hide options for the kiosk menu. This hides 'reset core association', 'start recording' and 'start streaming' when the kiosk menu is active. Fixes https://github.com/libretro/RetroArch/issues/7824 Fixes https://github.com/libretro/RetroArch/issues/7825 --- menu/menu_displaylist.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index cdf3fda1ce..631cb9abe6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2672,7 +2672,7 @@ static int menu_displaylist_parse_load_content_settings( { if (!recording_is_enabled()) { - if (settings->bools.quick_menu_show_start_recording) + if (settings->bools.quick_menu_show_start_recording && !settings->bools.kiosk_mode_enable) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_RECORDING), @@ -2680,7 +2680,7 @@ static int menu_displaylist_parse_load_content_settings( MENU_ENUM_LABEL_QUICK_MENU_START_RECORDING, MENU_SETTING_ACTION, 0, 0); } - if (settings->bools.quick_menu_show_start_streaming) + if (settings->bools.quick_menu_show_start_streaming && !settings->bools.kiosk_mode_enable) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_STREAMING), @@ -2893,7 +2893,7 @@ static int menu_displaylist_parse_horizontal_content_actions( MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); } - if (settings->bools.quick_menu_show_reset_core_association) + if (settings->bools.quick_menu_show_reset_core_association && !settings->bools.kiosk_mode_enable) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION), From 39343f99a725ec488d30c59e4f173bd150ab0e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Thu, 27 Dec 2018 20:16:43 +0100 Subject: [PATCH 030/116] [ORBIS] Add Makefile --- Makefile.orbis | 176 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 Makefile.orbis diff --git a/Makefile.orbis b/Makefile.orbis new file mode 100644 index 0000000000..6412952378 --- /dev/null +++ b/Makefile.orbis @@ -0,0 +1,176 @@ +TARGET := retroarch_ps4 +DEBUG ?= 0 +GRIFFIN_BUILD = 0 +WHOLE_ARCHIVE_LINK = 0 + +PS4_TITLE_ID := RETROARCH +PS4_TITLE_NAME := RetroArch + +PC_DEVELOPMENT_IP_ADDRESS = +PC_DEVELOPMENT_UDP_PORT = + +OBJ := + +DEFINES := + +ifeq ($(GRIFFIN_BUILD), 1) + OBJ += griffin/griffin.o + DEFINES += -DHAVE_GRIFFIN=1 + DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB + DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB -DHAVE_CC_RESAMPLER + ifeq ($(DEBUG), 1) + DEFINES += -DHAVE_NETLOGGER + endif +else + + HAVE_FILTERS_BUILTIN := 1 + HAVE_LANGEXTRA := 0 + HAVE_RPNG := 1 + HAVE_RJPEG := 1 + HAVE_RBMP := 1 + HAVE_RTGA := 1 + HAVE_ZLIB := 0 + HAVE_OVERLAY := 1 + HAVE_7ZIP := 1 + HAVE_EGL := 1 + HAVE_OPENGLES := 1 + HAVE_NETWORKING := 0 + HAVE_SOCKET_LEGACY := 0 + HAVE_MENU := 1 + HAVE_MENU_COMMON := 1 + HAVE_RGUI := 1 + HAVE_MATERIALUI := 0 + HAVE_XMB := 0 + HAVE_ZARCH := 0 + HAVE_THREADS := 1 + HAVE_LIBRETRODB := 1 + HAVE_CC_RESAMPLER := 1 + HAVE_CHEEVOS := 1 + RARCH_CONSOLE := 1 + HAVE_STATIC_VIDEO_FILTERS = 1 + HAVE_STATIC_AUDIO_FILTERS = 1 + + ifeq ($(DEBUG), 1) + HAVE_NETLOGGER = 1 + endif + + include Makefile.common + BLACKLIST := + OBJ := $(filter-out $(BLACKLIST),$(OBJ)) + + #OBJ += input/drivers/psp_input.o + #OBJ += input/drivers_joypad/psp_joypad.o + #OBJ += audio/drivers/psp_audio.o + OBJ += frontend/drivers/platform_orbis.o +endif + + +ifeq ($(strip $(PS4SDK)),) +$(error "Please set PS4SDK in your environment. export PS4SDK=ps4sdk") +endif + +export PATH := $(PATH):$(PS4SDK)/bin + +PREFIX := + +CC := $(PREFIX)clang +CXX := $(PREFIX)clang +AS := $(PREFIX)clang +AR := $(PREFIX)ar +OBJCOPY := $(PREFIX)objcopy +STRIP := $(PREFIX)strip +NM := $(PREFIX)nm +LD := $(CXX) + +INCDIRS := -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include -Ideps/stb +LIBDIRS := -L. + +ARCHFLAGS := -m64 -DORBIS +CFLAGS += $(ARCHFLAGS) -std=c11 -mcmodel=large -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector + +ifeq ($(DEBUG), 1) + CFLAGS += -O2 -g +else + CFLAGS += -O3 +endif + +ASFLAGS := $(ARCHFLAGS) -I$(PS4SDK)/include -target x86_64-scei-ps4-elf -fPIE +LDFLAGS := -O3 -Wall -m64 -nostartfiles -nostdlib -L$(PS4SDK)/lib -pie +ARFLAGS := rcs + +CRTFILE ?= $(PS4SDK)/crt0.s + +CFLAGS += -Wall -pedantic -Wno-zero-length-array -Wno-format-pedantic +CFLAGS += -D__PS4__ -I$(PS4SDK)/include -I $(PS4SDK)/include/sce +CFLAGS += -target x86_64-scei-ps4-elf -fPIE +CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE +CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES) + +ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),) + CFLAGS += -DPC_DEVELOPMENT_IP_ADDRESS='"$(PC_DEVELOPMENT_IP_ADDRESS)"' +endif + +ifneq ($(PC_DEVELOPMENT_UDP_PORT),) + CFLAGS += -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) +endif + +ifeq ($(WHOLE_ARCHIVE_LINK), 1) + WHOLE_START := -Wl,--whole-archive + WHOLE_END := -Wl,--no-whole-archive +endif +CXXFLAGS := $(CFLAGS) + +PS4_LIBS := -lps4link -ldebugnet -lorbisFile -lelfloader -lorbisKeyboard -lorbis2d -lpng -lz -lorbisGl -lorbisPad -lorbisAudio -lmod -lorbisAudio -lmod -lorbisFileBrowser -lorbisXbmFont -lSceNet_stub -lScePigletv2VSH_stub -lSceSystemService_stub -lSceUserService_stub -lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceSysmodule_stub \ + -lPs4_extension_kernel_execute_dynlib_prepare_dlclose -lPs4_extension_kernel_call_standard \ + -lPs4_common_kernel -lPs4_common_user -lPs4_common_generic \ + -lPs4LibCInternalAdaptive_stub -lPs4LibKernelAdaptive_stub \ + -lSceLibcInternal_stub -lkernel_stub -lps4Kernel_stub \ + -lPs4_base_stub_resolve_minimal -lPs4_base_kernel_dlsym_standard \ + -lPs4_base_kernel_seek_elf_address_standard -lPs4_base_assembler_register_parameter_standard \ + -lPs4_base_assembler_system_call_rop_0x93a4FFFF8 + + +LIBS := $(WHOLE_START) -lretro_orbis $(WHOLE_END) $(PS4_LIBS) + +TARGETS := $(TARGET).elf + +DEPFLAGS = -MT $@ -MMD -MP -MF $*.Tdepend +POSTCOMPILE = mv -f $*.Tdepend $*.depend + + +all: $(TARGETS) + +%.o: %.cpp +%.o: %.cpp %.depend + $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) $(DEPFLAGS) + $(POSTCOMPILE) + +%.o: %.c +%.o: %.c %.depend + $(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS) + $(POSTCOMPILE) + + +%.o: %.S +%.o: %.S %.depend + $(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) + $(POSTCOMPILE) + +%.o: %.s +%.o: %.s %.depend + $(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) + $(POSTCOMPILE) + +%.depend: ; + +$(TARGET).elf: $(OBJ) libretro_orbis.a + $(LD) $(CRTFILE) $(OBJ) $(LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ + +clean: + rm -f $(OBJ) $(TARGET).elf + rm -f $(OBJ:.o=.depend) + +.PHONY: clean all +.PRECIOUS: %.depend + +-include $(OBJ:.o=.depend) \ No newline at end of file From f02ef2e0c68920ac6c22fa21803c9362f886ebb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Thu, 27 Dec 2018 20:17:48 +0100 Subject: [PATCH 031/116] [ORBIS] Initial Platform driver + minor changes --- frontend/drivers/platform_orbis.c | 389 ++++++++++++++++++++++++++++ griffin/griffin.c | 2 + libretro-common/rthreads/rthreads.c | 2 +- 3 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 frontend/drivers/platform_orbis.c diff --git a/frontend/drivers/platform_orbis.c b/frontend/drivers/platform_orbis.c new file mode 100644 index 0000000000..020086661d --- /dev/null +++ b/frontend/drivers/platform_orbis.c @@ -0,0 +1,389 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#ifndef IS_SALAMANDER +#include +#endif + +#ifdef HAVE_MENU +#include "../../menu/menu_driver.h" +#endif + +#include "../frontend_driver.h" +#include "../../defaults.h" +#include "../../file_path_special.h" +#include "../../retroarch.h" +#include "../../paths.h" +#include "../../verbosity.h" + +typedef struct OrbisGlobalConf +{ + Orbis2dConfig *conf; + OrbisPadConfig *confPad; + OrbisAudioConfig *confAudio; + OrbisKeyboardConfig *confKeyboard; + ps4LinkConfiguration *confLink; + int orbisLinkFlag; +}OrbisGlobalConf; + +OrbisGlobalConf *myConf; + +char eboot_path[512]; +char user_path[512]; + +static enum frontend_fork orbis_fork_mode = FRONTEND_FORK_NONE; + +static void frontend_orbis_get_environment_settings(int *argc, char *argv[], + void *args, void *params_data) +{ + unsigned i; + struct rarch_main_wrap *params = NULL; + + (void)args; + +#ifndef IS_SALAMANDER +#if defined(HAVE_LOGGER) + logger_init(); +#elif defined(HAVE_FILE_LOGGER) + retro_main_log_file_init("host0:/temp/retroarch-log.txt"); +#endif +#endif + + int ret; + + uintptr_t intptr=0; + sscanf(argv[1],"%p",&intptr); + myConf=(OrbisGlobalConf *)intptr; + ret=ps4LinkInitWithConf(myConf->confLink); + if(!ret) + { + ps4LinkFinish(); + return; + } + + + strlcpy(eboot_path, "host0:/", sizeof(eboot_path)); + strlcpy(g_defaults.dirs[DEFAULT_DIR_PORT], eboot_path, sizeof(g_defaults.dirs[DEFAULT_DIR_PORT])); + strlcpy(user_path, "host0:/data/retroarch/", sizeof(user_path)); + + RARCH_LOG("port dir: [%s]\n", g_defaults.dirs[DEFAULT_DIR_PORT]); + + /* bundle data*/ + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE], g_defaults.dirs[DEFAULT_DIR_PORT], + "", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_PORT], + "info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); + /* user data*/ + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], user_path, + "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], user_path, + "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], user_path, + "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], user_path, + "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], user_path, + "config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], user_path, + "downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], user_path, + "playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_REMAP], user_path, + "remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SRAM], user_path, + "savefiles", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], user_path, + "savestates", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], user_path, + "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], user_path, + "temp", sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_OVERLAY], user_path, + "overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], user_path, + "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + strlcpy(g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY], + user_path, sizeof(g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY])); + fill_pathname_join(g_defaults.path.config, user_path, + file_path_str(FILE_PATH_MAIN_CONFIG), sizeof(g_defaults.path.config)); + +#ifndef IS_SALAMANDER + params = (struct rarch_main_wrap*)params_data; + params->verbose = true; + + if (!string_is_empty(argv[1])) + { + static char path[PATH_MAX_LENGTH] = {0}; + struct rarch_main_wrap *args = + (struct rarch_main_wrap*)params_data; + + if (args) + { + strlcpy(path, argv[1], sizeof(path)); + + args->touched = true; + args->no_content = false; + args->verbose = false; + args->config_path = NULL; + args->sram_path = NULL; + args->state_path = NULL; + args->content_path = path; + args->libretro_path = NULL; + + RARCH_LOG("argv[0]: %s\n", argv[0]); + RARCH_LOG("argv[1]: %s\n", argv[1]); + RARCH_LOG("argv[2]: %s\n", argv[2]); + + RARCH_LOG("Auto-start game %s.\n", argv[1]); + } + } +#endif + + for (i = 0; i < DEFAULT_DIR_LAST; i++) + { + const char *dir_path = g_defaults.dirs[i]; + if (!string_is_empty(dir_path)) + path_mkdir(dir_path); + } +} + +static void frontend_orbis_deinit(void *data) +{ + (void)data; +#ifndef IS_SALAMANDER + verbosity_disable(); +#ifdef HAVE_FILE_LOGGER + command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); +#endif + +#endif + ps4LinkFinish(); +} + +static void frontend_orbis_shutdown(bool unused) +{ + (void)unused; + return; +} + + +static void frontend_orbis_init(void *data) +{ + +} + +static void frontend_orbis_exec(const char *path, bool should_load_game) +{ + char argp[512] = {0}; + int args = 0; + +#ifndef IS_SALAMANDER + if (should_load_game && !path_is_empty(RARCH_PATH_CONTENT)) + { + argp[args] = '\0'; + strlcat(argp + args, path_get(RARCH_PATH_CONTENT), sizeof(argp) - args); + args += strlen(argp + args) + 1; + } +#endif + + RARCH_LOG("Attempt to load executable: [%s].\n", path); + RARCH_LOG("Attempt to load executable: %d [%s].\n", args, argp); + //int ret = sceAppMgrLoadExec(path, args==0? NULL : (char * const*)((const char*[]){argp, 0}), NULL); + //RARCH_LOG("Attempt to load executable: [%d].\n", ret); + +} + +#ifndef IS_SALAMANDER +static bool frontend_orbis_set_fork(enum frontend_fork fork_mode) +{ + switch (fork_mode) + { + case FRONTEND_FORK_CORE: + RARCH_LOG("FRONTEND_FORK_CORE\n"); + orbis_fork_mode = fork_mode; + break; + case FRONTEND_FORK_CORE_WITH_ARGS: + RARCH_LOG("FRONTEND_FORK_CORE_WITH_ARGS\n"); + orbis_fork_mode = fork_mode; + break; + case FRONTEND_FORK_RESTART: + RARCH_LOG("FRONTEND_FORK_RESTART\n"); + /* NOTE: We don't implement Salamander, so just turn + * this into FRONTEND_FORK_CORE. */ + orbis_fork_mode = FRONTEND_FORK_CORE; + break; + case FRONTEND_FORK_NONE: + default: + return false; + } + + return true; +} +#endif + +static void frontend_orbis_exitspawn(char *s, size_t len) +{ + bool should_load_game = false; +#ifndef IS_SALAMANDER + if (orbis_fork_mode == FRONTEND_FORK_NONE) + return; + + switch (orbis_fork_mode) + { + case FRONTEND_FORK_CORE_WITH_ARGS: + should_load_game = true; + break; + case FRONTEND_FORK_NONE: + default: + break; + } +#endif + frontend_orbis_exec(s, should_load_game); +} + +static int frontend_orbis_get_rating(void) +{ +#ifdef VITA + return 6; /* Go with a conservative figure for now. */ +#else + return 4; +#endif +} + +enum frontend_architecture frontend_orbis_get_architecture(void) +{ + return FRONTEND_ARCH_X86_64; +} + +static int frontend_orbis_parse_drive_list(void *data, bool load_content) +{ +#ifndef IS_SALAMANDER + file_list_t *list = (file_list_t*)data; + enum msg_hash_enums enum_idx = load_content ? + MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : + MSG_UNKNOWN; + +#ifdef VITA + menu_entries_append_enum(list, + "app0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + "ur0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + "ux0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + "uma0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + "imc0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); +#else + menu_entries_append_enum(list, + "ms0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + "ef0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + "host0:/", + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); +#endif +#endif + + return 0; +} + +frontend_ctx_driver_t frontend_ctx_orbis = { + frontend_orbis_get_environment_settings, + frontend_orbis_init, + frontend_orbis_deinit, + frontend_orbis_exitspawn, + NULL, /* process_args */ + frontend_orbis_exec, +#ifdef IS_SALAMANDER + NULL, +#else + frontend_orbis_set_fork, +#endif + frontend_orbis_shutdown, + NULL, /* get_name */ + NULL, /* get_os */ + frontend_orbis_get_rating, + NULL, /* load_content */ + frontend_orbis_get_architecture, + NULL, + frontend_orbis_parse_drive_list, + NULL, /* get_mem_total */ + NULL, /* get_mem_free */ + NULL, /* install_signal_handler */ + NULL, /* get_sighandler_state */ + NULL, /* set_sighandler_state */ + NULL, /* destroy_sighandler_state */ + NULL, /* attach_console */ + NULL, /* detach_console */ + NULL, /* watch_path_for_changes */ + NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ +#ifdef VITA + "vita", +#else + "orbis", +#endif +}; diff --git a/griffin/griffin.c b/griffin/griffin.c index 4589cafc12..da3b6e426e 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -966,6 +966,8 @@ FRONTEND #include "../frontend/drivers/platform_wiiu.c" #elif defined(PSP) || defined(VITA) #include "../frontend/drivers/platform_psp.c" +#elif defined(ORBIS) +#include "../frontend/drivers/platform_orbis.c" #elif defined(PS2) #include "../frontend/drivers/platform_ps2.c" #elif defined(_3DS) diff --git a/libretro-common/rthreads/rthreads.c b/libretro-common/rthreads/rthreads.c index 50251bc768..7c67d9465c 100644 --- a/libretro-common/rthreads/rthreads.c +++ b/libretro-common/rthreads/rthreads.c @@ -60,7 +60,7 @@ #include #endif -#if defined(VITA) || defined(BSD) +#if defined(VITA) || defined(BSD) || defined(ORBIS) #include #endif From 19549ddccfad0f11ce188b5e80c31241aac5de5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Thu, 27 Dec 2018 20:18:53 +0100 Subject: [PATCH 032/116] [ORBIS] Fix __assert --- gfx/video_filters/snes_ntsc/snes_ntsc_impl.h | 6 +++--- libretro-common/audio/audio_mixer.c | 2 ++ libretro-common/formats/jpeg/rjpeg.c | 4 ++-- menu/menu_animation.c | 3 +++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h b/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h index fc9be63739..36d767d697 100644 --- a/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h +++ b/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h @@ -4,7 +4,7 @@ /* Common implementation of NTSC filters */ -#include +#include #include /* Copyright (C) 2006 Shay Green. This module is free software; you @@ -121,7 +121,7 @@ static void init_filters( init_t* impl, snes_ntsc_setup_t const* setup ) { int x = kernel_size * 3 / 2 - kernel_half + i; kernels [x] *= sum; - assert( kernels [x] == kernels [x] ); /* catch numerical instability */ + retro_assert( kernels [x] == kernels [x] ); /* catch numerical instability */ } } @@ -156,7 +156,7 @@ static void init_filters( init_t* impl, snes_ntsc_setup_t const* setup ) for ( x = i; x < kernel_size; x += 2 ) { kernels [x] *= sum; - assert( kernels [x] == kernels [x] ); /* catch numerical instability */ + retro_assert( kernels [x] == kernels [x] ); /* catch numerical instability */ } } } diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c index a44ba38d6a..3b66d0b1f2 100644 --- a/libretro-common/audio/audio_mixer.c +++ b/libretro-common/audio/audio_mixer.c @@ -55,6 +55,8 @@ #ifdef HAVE_DR_MP3 #define DR_MP3_IMPLEMENTATION +#include +#define DRMP3_ASSERT(expression) retro_assert(expression) #include #endif diff --git a/libretro-common/formats/jpeg/rjpeg.c b/libretro-common/formats/jpeg/rjpeg.c index 65cb6c3966..e321b69b33 100644 --- a/libretro-common/formats/jpeg/rjpeg.c +++ b/libretro-common/formats/jpeg/rjpeg.c @@ -419,7 +419,7 @@ static INLINE int rjpeg__jpeg_huff_decode(rjpeg__jpeg *j, rjpeg__huffman *h) /* convert the huffman code to the symbol id */ c = ((j->code_buffer >> (32 - k)) & rjpeg__bmask[k]) + h->delta[k]; - assert((((j->code_buffer) >> (32 - h->size[c])) & rjpeg__bmask[h->size[c]]) == h->code[c]); + retro_assert((((j->code_buffer) >> (32 - h->size[c])) & rjpeg__bmask[h->size[c]]) == h->code[c]); /* convert the id to a symbol */ j->code_bits -= k; @@ -441,7 +441,7 @@ static INLINE int rjpeg__extend_receive(rjpeg__jpeg *j, int n) sgn = (int32_t)j->code_buffer >> 31; /* sign bit is always in MSB */ k = rjpeg_lrot(j->code_buffer, n); - assert(n >= 0 && n < (int) (sizeof(rjpeg__bmask)/sizeof(*rjpeg__bmask))); + retro_assert(n >= 0 && n < (int) (sizeof(rjpeg__bmask)/sizeof(*rjpeg__bmask))); j->code_buffer = k & ~rjpeg__bmask[n]; k &= rjpeg__bmask[n]; j->code_bits -= n; diff --git a/menu/menu_animation.c b/menu/menu_animation.c index 4912a86bcc..d55bad6166 100644 --- a/menu/menu_animation.c +++ b/menu/menu_animation.c @@ -24,6 +24,9 @@ #include #define DG_DYNARR_IMPLEMENTATION +#include +#include +#define DG_DYNARR_ASSERT(cond, msg) (void)0 #include #undef DG_DYNARR_IMPLEMENTATION From 06d0a19e95ee54eca46128844357c22907f7d106 Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 27 Dec 2018 12:57:55 -0800 Subject: [PATCH 033/116] Fix png file names for screenshots with contentless cores. For contentless cores like 2048 and the retropad RetroArch will save png files with the content field missing. -181227-133151.png Now RetroArch will save png files with the correct names for contentless cores. 2048-181227-133151.png RetroPad Remote-181227-133202.png Cores with content will have no change in behavior. Akumajou Dracula (J)-181227-133232.png And with cores that support content and no content such as 4DO both variations will work. 4DO-181227-144102.png LuciennesQuest-181227-144118.png Fixes https://github.com/libretro/RetroArch/issues/7828 --- tasks/task_screenshot.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 2ea95618ac..d84167bf00 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -195,10 +195,14 @@ static bool screenshot_dump( calloc(1, sizeof(*state)); const char *screenshot_dir = settings->paths.directory_screenshot; char shotname[256]; + struct retro_system_info system_info; shotname[0] = '\0'; screenshot_path[0] = '\0'; + if (!core_get_system_info(&system_info)) + return false; + /* If fullpath is true, name_base already contains a static path + filename to save the screenshot to. */ if (fullpath) strlcpy(state->filename, name_base, sizeof(state->filename)); @@ -232,8 +236,14 @@ static bool screenshot_dump( else { if (settings->bools.auto_screenshot_filename) - fill_str_dated_filename(shotname, path_basename(name_base), - IMG_EXT, sizeof(shotname)); + { + if (path_is_empty(RARCH_PATH_CONTENT)) + fill_str_dated_filename(shotname, system_info.library_name, + IMG_EXT, sizeof(shotname)); + else + fill_str_dated_filename(shotname, path_basename(name_base), + IMG_EXT, sizeof(shotname)); + } else snprintf(shotname, sizeof(shotname), "%s.png", path_basename(name_base)); From 48167d46bca81e407d0979588606b9199b7f8dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Fri, 28 Dec 2018 01:27:13 +0100 Subject: [PATCH 034/116] [ORBIS] Initial video context driver --- Makefile.common | 5 + Makefile.orbis | 4 +- gfx/common/orbis_common.h | 29 +++ gfx/drivers_context/orbis_ctx.c | 302 ++++++++++++++++++++++++++++++++ gfx/video_driver.c | 3 + gfx/video_driver.h | 1 + 6 files changed, 342 insertions(+), 2 deletions(-) create mode 100644 gfx/common/orbis_common.h create mode 100644 gfx/drivers_context/orbis_ctx.c diff --git a/Makefile.common b/Makefile.common index 23ff641e43..da7cd321f6 100644 --- a/Makefile.common +++ b/Makefile.common @@ -869,6 +869,11 @@ ifeq ($(TARGET), retroarch_switch) frontend/drivers/platform_switch.o endif +ifeq ($(TARGET), retroarch_orbis) + OBJ += gfx/drivers_context/orbis_ctx.o \ + frontend/drivers/platform_orbis.o +endif + ifeq ($(HAVE_WAYLAND), 1) OBJ += gfx/drivers_context/wayland_ctx.o \ input/drivers/wayland_input.o \ diff --git a/Makefile.orbis b/Makefile.orbis index 6412952378..085835f82b 100644 --- a/Makefile.orbis +++ b/Makefile.orbis @@ -1,4 +1,4 @@ -TARGET := retroarch_ps4 +TARGET := retroarch_orbis DEBUG ?= 0 GRIFFIN_BUILD = 0 WHOLE_ARCHIVE_LINK = 0 @@ -61,7 +61,7 @@ else #OBJ += input/drivers/psp_input.o #OBJ += input/drivers_joypad/psp_joypad.o #OBJ += audio/drivers/psp_audio.o - OBJ += frontend/drivers/platform_orbis.o + #OBJ += frontend/drivers/platform_orbis.o endif diff --git a/gfx/common/orbis_common.h b/gfx/common/orbis_common.h new file mode 100644 index 0000000000..b31ad5c48f --- /dev/null +++ b/gfx/common/orbis_common.h @@ -0,0 +1,29 @@ +#ifndef ORBIS_COMMON_H__ +#define ORBIS_COMMON_H__ + +#ifdef HAVE_EGL +#include +#include "../common/egl_common.h" +#endif + +#define ATTR_ORBISGL_WIDTH 1920 +#define ATTR_ORBISGL_HEIGHT 1080 + +typedef struct +{ +#ifdef HAVE_EGL + egl_ctx_data_t egl; + ScePglConfig pgl_config; +#endif + + struct + { + unsigned short width; + unsigned short height; + } native_window; + bool resize; + unsigned width, height; + float refresh_rate; +} orbis_ctx_data_t; + +#endif diff --git a/gfx/drivers_context/orbis_ctx.c b/gfx/drivers_context/orbis_ctx.c new file mode 100644 index 0000000000..33f4904641 --- /dev/null +++ b/gfx/drivers_context/orbis_ctx.c @@ -0,0 +1,302 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2018 - M4xw + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + + +#include "../common/orbis_common.h" +#include "../../frontend/frontend_driver.h" + +static enum gfx_ctx_api ctx_orbis_api = GFX_CTX_OPENGL_API; + +orbis_ctx_data_t *nx_ctx_ptr = NULL; + +extern bool platform_orbis_has_focus; + +void orbis_ctx_destroy(void *data) +{ + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + + if (ctx_orbis) + { +#ifdef HAVE_EGL + egl_destroy(&ctx_orbis->egl); +#endif + ctx_orbis->resize = false; + free(ctx_orbis); + } +} + +static void orbis_ctx_get_video_size(void *data, + unsigned *width, unsigned *height) +{ + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + + *width = ATTR_ORBISGL_WIDTH; + *height = ATTR_ORBISGL_HEIGHT; +} + +static void *orbis_ctx_init(video_frame_info_t *video_info, void *video_driver) +{ +#ifdef HAVE_EGL + int ret; + EGLint n; + EGLint major, minor; + static const EGLint attribs[] = { + EGL_BLUE_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_RED_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_NONE}; +#endif + + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)calloc(1, sizeof(*ctx_orbis)); + + if (!ctx_orbis) + return NULL; + + nx_ctx_ptr = ctx_orbis; + +#ifdef HAVE_EGL + + memset(&ctx_orbis->pgl_config, 0, sizeof(ctx_orbis->pgl_config)); + { + ctx_orbis->pgl_config.size=sizeof(ctx_orbis->pgl_config); + ctx_orbis->pgl_config.flags=SCE_PGL_FLAGS_USE_COMPOSITE_EXT | SCE_PGL_FLAGS_USE_FLEXIBLE_MEMORY | 0x60; + ctx_orbis->pgl_config.processOrder=1; + ctx_orbis->pgl_config.systemSharedMemorySize=0x200000; + ctx_orbis->pgl_config.videoSharedMemorySize=0x2400000; + ctx_orbis->pgl_config.maxMappedFlexibleMemory=0xAA00000; + ctx_orbis->pgl_config.drawCommandBufferSize=0xC0000; + ctx_orbis->pgl_config.lcueResourceBufferSize=0x10000; + ctx_orbis->pgl_config.dbgPosCmd_0x40=ATTR_ORBISGL_WIDTH; + ctx_orbis->pgl_config.dbgPosCmd_0x44=ATTR_ORBISGL_HEIGHT; + ctx_orbis->pgl_config.dbgPosCmd_0x48=0; + ctx_orbis->pgl_config.dbgPosCmd_0x4C=0; + ctx_orbis->pgl_config.unk_0x5C=2; + } + ret = scePigletSetConfigurationVSH(&ctx_orbis->pgl_config); + if (!ret) + { + printf("[ORBISGL] scePigletSetConfigurationVSH failed 0x%08X.\n",ret); + goto error; + } + + if (!egl_init_context(&ctx_orbis->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, + &major, &minor, &n, attribs, NULL)) + { + egl_report_error(); + printf("[ORBIS]: EGL error: %d.\n", eglGetError()); + goto error; + } +#endif + + return ctx_orbis; + +error: + orbis_ctx_destroy(video_driver); + return NULL; +} + +static void orbis_ctx_check_window(void *data, bool *quit, + bool *resize, unsigned *width, unsigned *height, bool is_shutdown) +{ + unsigned new_width, new_height; + + orbis_ctx_get_video_size(data, &new_width, &new_height); + + if (new_width != *width || new_height != *height) + { + *width = new_width; + *height = new_height; + *resize = true; + } + + *quit = (bool)false; +} + +static bool orbis_ctx_set_video_mode(void *data, + video_frame_info_t *video_info, + unsigned width, unsigned height, + bool fullscreen) +{ + /* Create an EGL rendering context */ + static const EGLint contextAttributeList[] = + { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE}; + + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + + ctx_orbis->width = ATTR_ORBISGL_HEIGHT; + ctx_orbis->height = ATTR_ORBISGL_WIDTH; + + ctx_orbis->native_window.width = ctx_orbis->width; + ctx_orbis->native_window.height = ctx_orbis->height; + + ctx_orbis->refresh_rate = 60; + +#ifdef HAVE_EGL + if (!egl_create_context(&ctx_orbis->egl, contextAttributeList)) + { + egl_report_error(); + goto error; + } +#endif + +#ifdef HAVE_EGL + if (!egl_create_surface(&ctx_orbis->egl, &ctx_orbis->native_window)) + goto error; +#endif + + return true; + +error: + printf("[ctx_orbis]: EGL error: %d.\n", eglGetError()); + orbis_ctx_destroy(data); + + return false; +} + +static void orbis_ctx_input_driver(void *data, + const char *name, + const input_driver_t **input, void **input_data) +{ + *input = NULL; + *input_data = NULL; +} + +static enum gfx_ctx_api orbis_ctx_get_api(void *data) +{ + return ctx_orbis_api; +} + +static bool orbis_ctx_bind_api(void *data, + enum gfx_ctx_api api, unsigned major, unsigned minor) +{ + (void)data; + ctx_orbis_api = api; + + if (api == GFX_CTX_OPENGL_API) + if (eglBindAPI(EGL_OPENGL_API) != EGL_FALSE) + return true; + + return false; +} + +static bool orbis_ctx_has_focus(void *data) +{ + (void)data; + return true; +} + +static bool orbis_ctx_suppress_screensaver(void *data, bool enable) +{ + (void)data; + (void)enable; + return false; +} + +static void orbis_ctx_set_swap_interval(void *data, + int swap_interval) +{ + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + +#ifdef HAVE_EGL + egl_set_swap_interval(&ctx_orbis->egl, swap_interval); +#endif +} + +static void orbis_ctx_swap_buffers(void *data, void *data2) +{ + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + +#ifdef HAVE_EGL + egl_swap_buffers(&ctx_orbis->egl); +#endif +} + +static gfx_ctx_proc_t orbis_ctx_get_proc_address(const char *symbol) +{ +#ifdef HAVE_EGL + return egl_get_proc_address(symbol); +#endif +} + +static void orbis_ctx_bind_hw_render(void *data, bool enable) +{ + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + +#ifdef HAVE_EGL + egl_bind_hw_render(&ctx_orbis->egl, enable); +#endif +} + +static uint32_t orbis_ctx_get_flags(void *data) +{ + uint32_t flags = 0; + BIT32_SET(flags, GFX_CTX_FLAGS_NONE); + + return flags; +} + +static void orbis_ctx_set_flags(void *data, uint32_t flags) +{ + (void)data; +} + +static float orbis_ctx_get_refresh_rate(void *data) +{ + orbis_ctx_data_t *ctx_orbis = (orbis_ctx_data_t *)data; + + return ctx_orbis->refresh_rate; +} + +const gfx_ctx_driver_t orbis_ctx = { + orbis_ctx_init, + orbis_ctx_destroy, + orbis_ctx_get_api, + orbis_ctx_bind_api, + orbis_ctx_set_swap_interval, + orbis_ctx_set_video_mode, + orbis_ctx_get_video_size, + orbis_ctx_get_refresh_rate, + NULL, /* get_video_output_size */ + NULL, /* get_video_output_prev */ + NULL, /* get_video_output_next */ + NULL, /* get_metrics */ + NULL, + NULL, /* update_title */ + orbis_ctx_check_window, + NULL, /* set_resize */ + orbis_ctx_has_focus, + orbis_ctx_suppress_screensaver, + NULL, /* has_windowed */ + orbis_ctx_swap_buffers, + orbis_ctx_input_driver, + orbis_ctx_get_proc_address, + NULL, + NULL, + NULL, + "orbis", + orbis_ctx_get_flags, + orbis_ctx_set_flags, + orbis_ctx_bind_hw_render, + NULL, + NULL}; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 88ef1862ef..a3b15c5932 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -357,6 +357,9 @@ static const video_driver_t *video_drivers[] = { }; static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { +#if defined(ORBIS) + &orbis_ctx, +#endif #if defined(HAVE_LIBNX) && defined(HAVE_OPENGL) &switch_ctx, #endif diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 3a261ebdb8..ba380809c4 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -1299,6 +1299,7 @@ extern const gfx_ctx_driver_t gfx_ctx_khr_display; extern const gfx_ctx_driver_t gfx_ctx_gdi; extern const gfx_ctx_driver_t gfx_ctx_sixel; extern const gfx_ctx_driver_t switch_ctx; +extern const gfx_ctx_driver_t orbis_ctx; extern const gfx_ctx_driver_t gfx_ctx_null; From 912060fc4b23702b87936f0cb49a9620992c3468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Fri, 28 Dec 2018 11:19:28 +0100 Subject: [PATCH 035/116] [ORBIS] Use SceWindow --- gfx/common/orbis_common.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/gfx/common/orbis_common.h b/gfx/common/orbis_common.h index b31ad5c48f..2463fa2754 100644 --- a/gfx/common/orbis_common.h +++ b/gfx/common/orbis_common.h @@ -16,11 +16,7 @@ typedef struct ScePglConfig pgl_config; #endif - struct - { - unsigned short width; - unsigned short height; - } native_window; + SceWindow native_window; bool resize; unsigned width, height; float refresh_rate; From 465b3e5774ceb4f58f9f5f14b9c2afd96ab516ba Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 28 Dec 2018 10:32:00 -0800 Subject: [PATCH 036/116] qb: Disable the builtin lua by default. Disables the builtin lua as it causes the mpv core to segfault and doesn't do anything yet. --- qb/config.params.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qb/config.params.sh b/qb/config.params.sh index bf62a58029..0248eb8aa7 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -117,7 +117,7 @@ C89_QT=no HAVE_XSHM=no # XShm video driver support HAVE_CHEEVOS=yes # Retro Achievements C89_CHEEVOS=no -HAVE_LUA=yes # Lua support (for Retro Achievements) +HAVE_LUA=no # Lua support (for Retro Achievements) HAVE_DISCORD=yes # Discord Integration C89_DISCORD=no HAVE_SHADERPIPELINE=yes # Additional shader-based pipelines From 1e513598d33da0df8b088417fb3349ef4090e580 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 28 Dec 2018 11:51:22 -0800 Subject: [PATCH 037/116] qb: Only print threading warning when ffmpeg is not disabled. --- qb/config.libs.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 9ba639ec91..6dbe6f41ef 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -413,7 +413,12 @@ if [ "$HAVE_MPV" != 'no' ]; then check_pkgconf MPV libmpv fi -if [ "$HAVE_THREADS" != 'no' ] && [ "$HAVE_FFMPEG" != 'no' ]; then +if [ "$HAVE_THREADS" = 'no' ] && [ "$HAVE_FFMPEG" != 'no' ]; then + HAVE_FFMPEG='no' + die : 'Notice: Threads are not available, FFmpeg will also be disabled.' +fi + +if [ "$HAVE_FFMPEG" != 'no' ]; then check_pkgconf AVCODEC libavcodec 54 check_pkgconf AVFORMAT libavformat 54 check_pkgconf AVDEVICE libavdevice @@ -438,7 +443,6 @@ if [ "$HAVE_THREADS" != 'no' ] && [ "$HAVE_FFMPEG" != 'no' ]; then die : 'Notice: FFmpeg built-in support disabled due to missing or unsuitable packages.' fi else - die : 'Notice: Not building with threading support. Will skip FFmpeg.' HAVE_FFMPEG='no' fi From 9872111dbcc590a13d8e3cac7dcbb61e8ff60104 Mon Sep 17 00:00:00 2001 From: waitingmoon Date: Sat, 29 Dec 2018 05:06:52 +0900 Subject: [PATCH 038/116] Update msg_hash_ja.h (#7831) --- intl/msg_hash_ja.h | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 0f3bfe42fb..109939b0f0 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -3919,10 +3919,10 @@ MSG_HASH( "カスタムリフレッシュレートを使用") MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, - "Select the output port connected to the CRT display.") + "CRTディスプレイに接続されている出力ポートを選択します。") MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, - "Output Display ID") + "出力ディスプレイの識別番号") MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_RECORDING, "録画を開始" @@ -4015,45 +4015,45 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_OZONE_MENU_COLOR_THEME, "メニューの色テーマ") MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_WHITE, - "Basic White" + "ベーシックホワイト" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_BLACK, - "Basic Black" + "ベーシックブラック" ) MSG_HASH( MENU_ENUM_SUBLABEL_OZONE_MENU_COLOR_THEME, - "Select a different color theme." + "色テーマを選択します。" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Use preferred system color theme") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Use your operating system's color theme (if any) - overrides theme settings.") MSG_HASH(MSG_RESAMPLER_QUALITY_LOWEST, - "Lowest") + "最低") MSG_HASH(MSG_RESAMPLER_QUALITY_LOWER, - "Lower") + "低") MSG_HASH(MSG_RESAMPLER_QUALITY_NORMAL, - "Normal") + "普通") MSG_HASH(MSG_RESAMPLER_QUALITY_HIGHER, - "Higher") + "高") MSG_HASH(MSG_RESAMPLER_QUALITY_HIGHEST, - "Highest") + "最高") MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_MUSIC_AVAILABLE, - "No music available." + "音楽ファイルがありません。" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_VIDEOS_AVAILABLE, - "No videos available." + "動画ファイルがありません。" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_IMAGES_AVAILABLE, - "No images available." + "画像ファイルがありません。" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_FAVORITES_AVAILABLE, - "No favorites available." + "お気に入りがありません。" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, - "Remember Window Position and Size") + "ウィンドウの位置とサイズを記憶") From b201d669b5ea1470bb239036aa944342a0591a95 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 28 Dec 2018 12:41:38 +0100 Subject: [PATCH 039/116] First iteration of UWP support Enough to kind of run Working drivers: xinput, d3d11 Still missing: input driver with keyboard support, audio driver --- AUTHORS.h | 1 + configuration.c | 19 +- dynamic.c | 2 + frontend/drivers/platform_win32.c | 102 +++- gfx/common/d3d10_common.c | 2 +- gfx/common/d3d11_common.c | 2 +- gfx/common/d3d11_common.h | 4 + gfx/common/d3d12_common.c | 4 +- gfx/common/d3d_common.c | 25 + gfx/common/d3d_common.h | 4 +- gfx/common/d3dcompiler_common.c | 2 +- gfx/common/dxgi_common.c | 29 +- gfx/common/dxgi_common.h | 3 +- gfx/drivers/d3d10.c | 27 +- gfx/drivers/d3d11.c | 101 +++- gfx/drivers/d3d12.c | 23 +- gfx/drivers/d3d8.c | 42 +- gfx/drivers/d3d9.c | 43 +- gfx/font_driver.c | 4 +- gfx/video_display_server.c | 2 +- gfx/video_driver.c | 4 +- griffin/griffin.c | 6 +- input/drivers_joypad/xinput_joypad.c | 52 +- input/input_driver.c | 4 +- input/input_keymaps.c | 7 +- libretro-common/dynamic/dylib.c | 45 +- libretro-common/file/file_path.c | 95 +++- libretro-common/file/nbio/nbio_intf.c | 2 +- libretro-common/include/file/file_path.h | 2 + menu/menu_displaylist.c | 6 +- menu/menu_driver.c | 2 +- pkg/msvc/RetroArch-msvc2017-UWP.sln | 51 ++ .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1430 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 7700 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 2937 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 1647 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1255 bytes pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.png | Bin 0 -> 1451 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 3204 bytes pkg/msvc/msvc-2017-UWP/Package.appxmanifest | 49 ++ .../RetroArch-msvc2017-UWP.vcxproj | 506 ++++++++++++++++++ .../RetroArch-msvc2017-UWP.vcxproj.filters | 280 ++++++++++ .../msvc-2017-UWP_TemporaryKey.pfx | Bin 0 -> 2504 bytes ui/ui_companion_driver.c | 2 +- uwp/uwp_func.h | 35 ++ uwp/uwp_main.cpp | 479 +++++++++++++++++ uwp/uwp_main.h | 82 +++ verbosity.c | 19 +- 48 files changed, 1986 insertions(+), 183 deletions(-) create mode 100644 pkg/msvc/RetroArch-msvc2017-UWP.sln create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/LockScreenLogo.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Package.appxmanifest create mode 100644 pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj create mode 100644 pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters create mode 100644 pkg/msvc/msvc-2017-UWP/msvc-2017-UWP_TemporaryKey.pfx create mode 100644 uwp/uwp_func.h create mode 100644 uwp/uwp_main.cpp create mode 100644 uwp/uwp_main.h diff --git a/AUTHORS.h b/AUTHORS.h index a94c292b12..4863d9b0fb 100644 --- a/AUTHORS.h +++ b/AUTHORS.h @@ -142,6 +142,7 @@ JuanVCS Justin Jacobs (dorkster) Justin Weiss (justinweiss) Ken Rossato (rossato) +Krzysztof Haładyn (krzys_h) kurumushi kwyxz l3iggs diff --git a/configuration.c b/configuration.c index 871a7cc7b6..7ab65f20d9 100644 --- a/configuration.c +++ b/configuration.c @@ -56,6 +56,10 @@ #include "record/record_driver.h" +#ifdef __WINRT__ +#include "uwp/uwp_func.h" +#endif + static const char* invalid_filename_chars[] = { /* https://support.microsoft.com/en-us/help/905231/information-about-the-characters-that-you-cannot-use-in-site-names--fo */ "~", "#", "%", "&", "*", "{", "}", "\\", ":", "[", "]", "?", "/", "|", "\'", "\"", @@ -319,6 +323,12 @@ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WII; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WIIU; #elif defined(XENON) static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XENON360; +#elif defined(HAVE_D3D12) +static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D12; +#elif defined(HAVE_D3D11) +static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D11; +#elif defined(HAVE_D3D10) +static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D10; #elif defined(HAVE_D3D9) static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D9; #elif defined(HAVE_D3D8) @@ -2221,8 +2231,13 @@ static config_file_t *open_default_config_file(void) (void)path_size; -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) - fill_pathname_application_path(app_path, path_size); +#if defined(_WIN32) && !defined(_XBOX) +#ifdef __WINRT__ + /* On UWP, the app install directory is not writable so use the writable LocalState dir instead */ + fill_pathname_home_dir(app_path, path_size); +#else + fill_pathname_application_dir(app_path, path_size); +#endif fill_pathname_resolve_relative(conf_path, app_path, file_path_str(FILE_PATH_MAIN_CONFIG), path_size); diff --git a/dynamic.c b/dynamic.c index 049aad7883..89bcc8f1c7 100644 --- a/dynamic.c +++ b/dynamic.c @@ -306,6 +306,7 @@ static void libretro_get_environment_info(void (*func)(retro_environment_t), static bool load_dynamic_core(void) { +#ifndef __WINRT__ /* Can't lookup symbols in itself on UWP */ function_t sym = dylib_proc(NULL, "retro_init"); if (sym) @@ -319,6 +320,7 @@ static bool load_dynamic_core(void) RARCH_ERR("Proceeding could cause a crash. Aborting ...\n"); retroarch_fail(1, "init_libretro_sym()"); } +#endif if (string_is_empty(path_get(RARCH_PATH_CORE))) { diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 59905c9884..c655a594c5 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -43,6 +43,11 @@ #include "../../verbosity.h" #include "../../ui/drivers/ui_win32.h" +#ifdef __WINRT__ +#include "../../uwp/uwp_func.h" +#endif + +#ifndef __WINRT__ /* We only load this library once, so we let it be * unloaded at application shutdown, since unloading * it early seems to cause issues on some systems. @@ -145,6 +150,7 @@ static void gfx_set_dwm(void) RARCH_ERR("Failed to set composition state ...\n"); dwm_composition_disabled = settings->bools.video_disable_composition; } +#endif static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) { @@ -165,7 +171,9 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) GetVersionEx((OSVERSIONINFO*)&vi); server = vi.wProductType != VER_NT_WORKSTATION; +#ifndef __WINRT__ serverR2 = GetSystemMetrics(SM_SERVERR2); +#endif switch (si.wProcessorArchitecture) { @@ -302,10 +310,19 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) strlcat(s, " ", len); strlcat(s, vi.szCSDVersion, len); } + +#ifdef __WINRT__ + if (!string_is_empty(uwp_device_family)) + { + strlcat(s, " ", len); + strlcat(s, uwp_device_family, len); + } +#endif } static void frontend_win32_init(void *data) { +#ifndef __WINRT__ typedef BOOL (WINAPI *isProcessDPIAwareProc)(); typedef BOOL (WINAPI *setProcessDPIAwareProc)(); #ifdef HAVE_DYNAMIC @@ -324,6 +341,7 @@ static void frontend_win32_init(void *data) if (!isDPIAwareProc()) if (setDPIAwareProc) setDPIAwareProc(); +#endif } enum frontend_powerstate frontend_win32_get_powerstate(int *seconds, int *percent) @@ -385,13 +403,14 @@ enum frontend_architecture frontend_win32_get_architecture(void) static int frontend_win32_parse_drive_list(void *data, bool load_content) { #ifdef HAVE_MENU + file_list_t *list = (file_list_t*)data; + enum msg_hash_enums enum_idx = load_content ? + MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : + MSG_UNKNOWN; +#ifndef __WINRT__ size_t i = 0; unsigned drives = GetLogicalDrives(); char drive[] = " :\\"; - file_list_t *list = (file_list_t*)data; - enum msg_hash_enums enum_idx = load_content ? - MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : - MSG_UNKNOWN; for (i = 0; i < 32; i++) { @@ -403,6 +422,22 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) enum_idx, FILE_TYPE_DIRECTORY, 0, 0); } +#else + /* TODO (krzys_h): UWP storage sandboxing */ + + char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + + fill_pathname_home_dir(home_dir, + PATH_MAX_LENGTH * sizeof(char)); + + menu_entries_append_enum(list, + home_dir, + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + + free(home_dir); +#endif #endif return 0; @@ -411,6 +446,7 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) static void frontend_win32_environment_get(int *argc, char *argv[], void *args, void *params_data) { +#ifndef __WINRT__ gfx_set_dwm(); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], @@ -459,6 +495,57 @@ static void frontend_win32_environment_get(int *argc, char *argv[], ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); +#else + /* On UWP, we have to use the writable directory instead of the install directory */ + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], + "~\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER], + "~\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], + "~\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS], + "~\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE], + "~\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR], + "~\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], + "~\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], + "~\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], + "~\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], + "~\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP], + "~\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], + "~\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], + "~\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY], + "~\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); + /* This one is an exception: cores have to be loaded from the install directory, + * since this is the only place UWP apps can take .dlls from */ + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE], + ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], + "~\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], + "~\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER], + "~\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + "~\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], + "~\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM], + "~\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], + "~\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], + "~\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); +#endif #ifdef HAVE_MENU #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) @@ -502,6 +589,7 @@ static uint64_t frontend_win32_get_mem_used(void) #endif } +#ifndef __WINRT__ static void frontend_win32_attach_console(void) { #ifdef _WIN32 @@ -560,6 +648,7 @@ static void frontend_win32_detach_console(void) #endif #endif } +#endif frontend_ctx_driver_t frontend_ctx_win32 = { frontend_win32_environment_get, @@ -583,8 +672,13 @@ frontend_ctx_driver_t frontend_ctx_win32 = { NULL, /* get_sighandler_state */ NULL, /* set_sighandler_state */ NULL, /* destroy_sighandler_state */ +#ifndef __WINRT__ frontend_win32_attach_console, /* attach_console */ frontend_win32_detach_console, /* detach_console */ +#else + NULL, + NULL, +#endif NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ diff --git a/gfx/common/d3d10_common.c b/gfx/common/d3d10_common.c index 1b145015f7..16a35b9c57 100644 --- a/gfx/common/d3d10_common.c +++ b/gfx/common/d3d10_common.c @@ -20,7 +20,7 @@ #include "d3d10_common.h" #include "d3dcompiler_common.h" -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) #include typedef HRESULT(WINAPI* PFN_D3D10_CREATE_DEVICE_AND_SWAP_CHAIN)( diff --git a/gfx/common/d3d11_common.c b/gfx/common/d3d11_common.c index 16b32151e1..dbb3b53c42 100644 --- a/gfx/common/d3d11_common.c +++ b/gfx/common/d3d11_common.c @@ -20,7 +20,7 @@ #include "d3d11_common.h" #include "d3dcompiler_common.h" -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) #include HRESULT WINAPI D3D11CreateDeviceAndSwapChain( diff --git a/gfx/common/d3d11_common.h b/gfx/common/d3d11_common.h index 69128cd07a..db6254e8c1 100644 --- a/gfx/common/d3d11_common.h +++ b/gfx/common/d3d11_common.h @@ -2159,6 +2159,7 @@ static INLINE HRESULT D3D11ValidateContextForDispatch(D3D11Debug debug, D3D11Dev { return debug->lpVtbl->ValidateContextForDispatch(debug, context); } +#ifndef __WINRT__ static INLINE BOOL D3D11SetUseRef(D3D11SwitchToRef switch_to_ref, BOOL use_ref) { return switch_to_ref->lpVtbl->SetUseRef(switch_to_ref, use_ref); @@ -2167,6 +2168,7 @@ static INLINE BOOL D3D11GetUseRef(D3D11SwitchToRef switch_to_ref) { return switch_to_ref->lpVtbl->GetUseRef(switch_to_ref); } +#endif static INLINE HRESULT D3D11SetShaderTrackingOptionsByType( D3D11TracingDevice tracing_device, UINT resource_type_flags, UINT options) { @@ -2188,6 +2190,7 @@ static INLINE void D3D11ClearStoredMessages(D3D11InfoQueue info_queue) { info_queue->lpVtbl->ClearStoredMessages(info_queue); } +#ifndef __WINRT__ static INLINE HRESULT D3D11GetMessageA( D3D11InfoQueue info_queue, UINT64 message_index, @@ -2196,6 +2199,7 @@ static INLINE HRESULT D3D11GetMessageA( { return info_queue->lpVtbl->GetMessageA(info_queue, message_index, message, message_byte_length); } +#endif static INLINE UINT64 D3D11GetNumMessagesAllowedByStorageFilter(D3D11InfoQueue info_queue) { return info_queue->lpVtbl->GetNumMessagesAllowedByStorageFilter(info_queue); diff --git a/gfx/common/d3d12_common.c b/gfx/common/d3d12_common.c index 1b8d9478c5..a405dc5e46 100644 --- a/gfx/common/d3d12_common.c +++ b/gfx/common/d3d12_common.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2014-2018 - Ali Bouhlel * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -65,7 +65,7 @@ DEFINE_GUIDW(IID_ID3D12DebugCommandList, 0x09e0bf36, 0x54ac, 0x484f, 0x88, 0x47, /* clang-format on */ #endif -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) static dylib_t d3d12_dll; static const char* d3d12_dll_name = "d3d12.dll"; diff --git a/gfx/common/d3d_common.c b/gfx/common/d3d_common.c index c026c3c9f2..211e68939c 100644 --- a/gfx/common/d3d_common.c +++ b/gfx/common/d3d_common.c @@ -125,3 +125,28 @@ int32_t d3d_translate_filter(unsigned type) return (int32_t)D3D_TEXTURE_FILTER_POINT; } + +void d3d_input_driver(const char* input_name, const char* joypad_name, const input_driver_t** input, void** input_data) +{ +#if defined(_XBOX) || defined(__WINRT__) + void *xinput = input_xinput.init(joypad_name); + *input = xinput ? (const input_driver_t*)&input_xinput : NULL; + *input_data = xinput; +#else +#if _WIN32_WINNT >= 0x0501 + /* winraw only available since XP */ + if (string_is_equal(input_name, "raw")) + { + *input_data = input_winraw.init(joypad_name); + if (*input_data) + { + *input = &input_winraw; + return; + } + } +#endif + + *input_data = input_dinput.init(joypad_name); + *input = *input_data ? &input_dinput : NULL; +#endif +} diff --git a/gfx/common/d3d_common.h b/gfx/common/d3d_common.h index 69c9ae6526..14a724a3e7 100644 --- a/gfx/common/d3d_common.h +++ b/gfx/common/d3d_common.h @@ -20,7 +20,7 @@ #include "../../config.h" #endif -#ifndef _XBOX +#if !defined(_XBOX) && !defined(__WINRT__) #define HAVE_WINDOW #endif @@ -97,6 +97,8 @@ void *d3d_matrix_rotation_z(void *_pout, float angle); int32_t d3d_translate_filter(unsigned type); +void d3d_input_driver(const char* input_name, const char* joypad_name, const input_driver_t** input, void** input_data); + RETRO_END_DECLS #endif diff --git a/gfx/common/d3dcompiler_common.c b/gfx/common/d3dcompiler_common.c index 6da87c1ba4..22d17704a3 100644 --- a/gfx/common/d3dcompiler_common.c +++ b/gfx/common/d3dcompiler_common.c @@ -25,7 +25,7 @@ #include "d3dcompiler_common.h" #include "../../verbosity.h" -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) #include static dylib_t d3dcompiler_dll; diff --git a/gfx/common/dxgi_common.c b/gfx/common/dxgi_common.c index 3d935f41d2..86f4a7b987 100644 --- a/gfx/common/dxgi_common.c +++ b/gfx/common/dxgi_common.c @@ -30,7 +30,7 @@ #include "../video_driver.h" #include "win32_common.h" -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) #include HRESULT WINAPI CreateDXGIFactory1(REFIID riid, void** ppFactory) @@ -309,6 +309,7 @@ void dxgi_update_title(video_frame_info_t* video_info) if (settings->bools.video_memory_show) { +#ifndef __WINRT__ MEMORYSTATUS stat; char mem[128]; @@ -319,6 +320,7 @@ void dxgi_update_title(video_frame_info_t* video_info) mem, sizeof(mem), " || MEM: %.2f/%.2fMB", stat.dwAvailPhys / (1024.0f * 1024.0f), stat.dwTotalPhys / (1024.0f * 1024.0f)); strlcat(video_info->fps_text, mem, sizeof(video_info->fps_text)); +#endif } if (window) @@ -329,32 +331,11 @@ void dxgi_update_title(video_frame_info_t* video_info) video_driver_get_window_title(title, sizeof(title)); +#ifndef __WINRT__ if (title[0]) window->set_title(&main_window, title); - } -} - -void dxgi_input_driver(const char* name, const input_driver_t** input, void** input_data) -{ -#ifndef __WINRT__ - settings_t* settings = config_get_ptr(); - -#if _WIN32_WINNT >= 0x0501 - /* winraw only available since XP */ - if (string_is_equal(settings->arrays.input_driver, "raw")) - { - *input_data = input_winraw.init(name); - if (*input_data) - { - *input = &input_winraw; - return; - } - } -#endif - - *input_data = input_dinput.init(name); - *input = *input_data ? &input_dinput : NULL; #endif + } } DXGI_FORMAT glslang_format_to_dxgi(glslang_format fmt) diff --git a/gfx/common/dxgi_common.h b/gfx/common/dxgi_common.h index 0323b5d839..0e5e15e88f 100644 --- a/gfx/common/dxgi_common.h +++ b/gfx/common/dxgi_common.h @@ -444,6 +444,7 @@ static INLINE HRESULT DXGIGetAdapterDesc1(DXGIAdapter adapter, DXGI_ADAPTER_DESC { return adapter->lpVtbl->GetDesc1(adapter, desc); } +#ifndef __WINRT__ static INLINE ULONG DXGIReleaseDisplayControl(DXGIDisplayControl display_control) { return display_control->lpVtbl->Release(display_control); @@ -612,6 +613,7 @@ static INLINE HRESULT DXGICheckPresentDurationSupport( swap_chain_media, desired_present_duration, closest_smaller_present_duration, closest_larger_present_duration); } +#endif static INLINE ULONG DXGIReleaseSwapChain(DXGISwapChain swap_chain) { return swap_chain->lpVtbl->Release(swap_chain); @@ -793,7 +795,6 @@ void dxgi_copy( void* dst_data); void dxgi_update_title(video_frame_info_t* video_info); -void dxgi_input_driver(const char* name, const input_driver_t** input, void** input_data); DXGI_FORMAT glslang_format_to_dxgi(glslang_format fmt); diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index b123cda661..69a38a61a8 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2014-2018 - Ali Bouhlel * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -35,6 +35,10 @@ #include "../../menu/menu_driver.h" #endif +#ifdef __WINRT__ +#error "UWP does not support D3D10" +#endif + #ifdef HAVE_OVERLAY static void d3d10_free_overlays(d3d10_video_t* d3d10) { @@ -556,8 +560,12 @@ static void d3d10_gfx_free(void* data) Release(d3d10->device); } +#ifdef HAVE_MONITOR win32_monitor_from_window(); +#endif +#ifdef HAVE_WINDOW win32_destroy_window(); +#endif free(d3d10); } @@ -566,31 +574,39 @@ d3d10_gfx_init(const video_info_t* video, const input_driver_t** input, void** input_data) { unsigned i; +#ifdef HAVE_MONITOR MONITORINFOEX current_mon; HMONITOR hm_to_use; WNDCLASSEX wndclass = { 0 }; +#endif settings_t* settings = config_get_ptr(); d3d10_video_t* d3d10 = (d3d10_video_t*)calloc(1, sizeof(*d3d10)); if (!d3d10) return NULL; +#ifdef HAVE_WINDOW win32_window_reset(); win32_monitor_init(); wndclass.lpfnWndProc = WndProcD3D; win32_window_init(&wndclass, true, NULL); +#endif +#ifdef HAVE_MONITOR win32_monitor_info(¤t_mon, &hm_to_use, &d3d10->cur_mon_id); +#endif d3d10->vp.full_width = video->width; d3d10->vp.full_height = video->height; +#ifdef HAVE_MONITOR if (!d3d10->vp.full_width) d3d10->vp.full_width = current_mon.rcMonitor.right - current_mon.rcMonitor.left; if (!d3d10->vp.full_height) d3d10->vp.full_height = current_mon.rcMonitor.bottom - current_mon.rcMonitor.top; +#endif if (!win32_set_video_mode(d3d10, d3d10->vp.full_width, d3d10->vp.full_height, video->fullscreen)) @@ -598,7 +614,7 @@ d3d10_gfx_init(const video_info_t* video, RARCH_ERR("[D3D10]: win32_set_video_mode failed.\n"); goto error; } - dxgi_input_driver(settings->arrays.input_joypad_driver, input, input_data); + d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data); { UINT flags = 0; @@ -611,7 +627,9 @@ d3d10_gfx_init(const video_info_t* video, desc.BufferDesc.RefreshRate.Numerator = 60; desc.BufferDesc.RefreshRate.Denominator = 1; desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +#if HAVE_WINDOW desc.OutputWindow = main_window.hwnd; +#endif desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Windowed = TRUE; @@ -1598,7 +1616,12 @@ static const video_poke_interface_t d3d10_poke_interface = { d3d10_gfx_load_texture, d3d10_gfx_unload_texture, NULL, /* set_video_mode */ +#ifndef __WINRT__ win32_get_refresh_rate, +#else + /* UWP does not expose this information easily */ + NULL, +#endif d3d10_set_filtering, NULL, /* get_video_output_size */ NULL, /* get_video_output_prev */ diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 137ad02525..8e0293be3e 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2014-2018 - Ali Bouhlel * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -41,6 +41,10 @@ #include "../drivers_shader/slang_process.h" #endif +#ifdef __WINRT__ +#include "../../uwp/uwp_func.h" +#endif + static D3D11Device cached_device_d3d11; static D3D_FEATURE_LEVEL cached_supportedFeatureLevel; static D3D11DeviceContext cached_context; @@ -566,8 +570,12 @@ static void d3d11_gfx_free(void* data) Release(d3d11->device); } +#ifdef HAVE_MONITOR win32_monitor_from_window(); +#endif +#ifdef HAVE_WINDOW win32_destroy_window(); +#endif free(d3d11); } @@ -575,29 +583,37 @@ static void d3d11_gfx_free(void* data) d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** input_data) { unsigned i; +#ifdef HAVE_MONITOR MONITORINFOEX current_mon; HMONITOR hm_to_use; WNDCLASSEX wndclass = { 0 }; +#endif settings_t* settings = config_get_ptr(); d3d11_video_t* d3d11 = (d3d11_video_t*)calloc(1, sizeof(*d3d11)); if (!d3d11) return NULL; +#ifdef HAVE_WINDOW win32_window_reset(); win32_monitor_init(); wndclass.lpfnWndProc = WndProcD3D; win32_window_init(&wndclass, true, NULL); +#endif +#ifdef HAVE_MONITOR win32_monitor_info(¤t_mon, &hm_to_use, &d3d11->cur_mon_id); +#endif d3d11->vp.full_width = video->width; d3d11->vp.full_height = video->height; +#ifdef HAVE_MONITOR if (!d3d11->vp.full_width) d3d11->vp.full_width = current_mon.rcMonitor.right - current_mon.rcMonitor.left; if (!d3d11->vp.full_height) d3d11->vp.full_height = current_mon.rcMonitor.bottom - current_mon.rcMonitor.top; +#endif if (!win32_set_video_mode(d3d11, d3d11->vp.full_width, d3d11->vp.full_height, video->fullscreen)) { @@ -605,7 +621,7 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i goto error; } - dxgi_input_driver(settings->arrays.input_joypad_driver, input, input_data); + d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data); { UINT flags = 0; @@ -617,26 +633,45 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3 }; +#ifdef __WINRT__ + /* UWP requires the use of newer version of the factory which requires newer version of this struct */ + DXGI_SWAP_CHAIN_DESC1 desc = { 0 }; +#else DXGI_SWAP_CHAIN_DESC desc = { 0 }; +#endif UINT number_feature_levels = ARRAY_SIZE(requested_feature_levels); - desc.BufferCount = 1; +#ifdef __WINRT__ + /* UWP forces us to do double-buffering */ + desc.BufferCount = 2; + desc.Width = d3d11->vp.full_width; + desc.Height = d3d11->vp.full_height; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +#else + desc.BufferCount = 1; desc.BufferDesc.Width = d3d11->vp.full_width; desc.BufferDesc.Height = d3d11->vp.full_height; desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.BufferDesc.RefreshRate.Numerator = 60; desc.BufferDesc.RefreshRate.Denominator = 1; +#endif desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +#if HAVE_WINDOW desc.OutputWindow = main_window.hwnd; +#endif desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; #if 0 desc.Scaling = DXGI_SCALING_STRETCH; #endif +#if HAVE_WINDOW desc.Windowed = TRUE; +#endif #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) /* On phone, no swap effects are supported. */ desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; +#elif defined(__WINRT__) + desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; #else desc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL; #endif @@ -646,37 +681,47 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i #endif if(cached_device_d3d11 && cached_context) { - IDXGIFactory* dxgiFactory = NULL; - IDXGIDevice* dxgiDevice = NULL; - IDXGIAdapter* adapter = NULL; - d3d11->device = cached_device_d3d11; d3d11->context = cached_context; d3d11->supportedFeatureLevel = cached_supportedFeatureLevel; - - d3d11->device->lpVtbl->QueryInterface( - d3d11->device, uuidof(IDXGIDevice), (void**)&dxgiDevice); - dxgiDevice->lpVtbl->GetAdapter(dxgiDevice, &adapter); - adapter->lpVtbl->GetParent( - adapter, uuidof(IDXGIFactory1), (void**)&dxgiFactory); - dxgiFactory->lpVtbl->CreateSwapChain( - dxgiFactory, (IUnknown*)d3d11->device, - &desc, (IDXGISwapChain**)&d3d11->swapChain); - - dxgiFactory->lpVtbl->Release(dxgiFactory); - adapter->lpVtbl->Release(adapter); - dxgiDevice->lpVtbl->Release(dxgiDevice); } else { - if (FAILED(D3D11CreateDeviceAndSwapChain( + if (FAILED(D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, requested_feature_levels, number_feature_levels, - D3D11_SDK_VERSION, &desc, - (IDXGISwapChain**)&d3d11->swapChain, &d3d11->device, + D3D11_SDK_VERSION, &d3d11->device, &d3d11->supportedFeatureLevel, &d3d11->context))) goto error; } + + IDXGIDevice* dxgiDevice = NULL; + IDXGIAdapter* adapter = NULL; + + d3d11->device->lpVtbl->QueryInterface( + d3d11->device, uuidof(IDXGIDevice), (void**)&dxgiDevice); + dxgiDevice->lpVtbl->GetAdapter(dxgiDevice, &adapter); +#ifndef __WINRT__ + IDXGIFactory* dxgiFactory = NULL; + adapter->lpVtbl->GetParent( + adapter, uuidof(IDXGIFactory1), (void**)&dxgiFactory); + if (FAILED(dxgiFactory->lpVtbl->CreateSwapChain( + dxgiFactory, (IUnknown*)d3d11->device, + &desc, (IDXGISwapChain**)&d3d11->swapChain))) + goto error; +#else + IDXGIFactory2* dxgiFactory = NULL; + adapter->lpVtbl->GetParent( + adapter, uuidof(IDXGIFactory2), (void**)&dxgiFactory); + if (FAILED(dxgiFactory->lpVtbl->CreateSwapChainForCoreWindow( + dxgiFactory, (IUnknown*)d3d11->device, uwp_get_corewindow(), + &desc, NULL, (IDXGISwapChain1**)&d3d11->swapChain))) + goto error; +#endif + + dxgiFactory->lpVtbl->Release(dxgiFactory); + adapter->lpVtbl->Release(adapter); + dxgiDevice->lpVtbl->Release(dxgiDevice); } { @@ -1142,6 +1187,11 @@ static bool d3d11_gfx_frame( video_driver_set_size(&video_info->width, &video_info->height); } +#ifdef __WINRT__ + /* UWP requires double-buffering, so make sure we bind to the appropariate backbuffer */ + D3D11SetRenderTargets(context, 1, &d3d11->renderTargetView, NULL); +#endif + PERF_START(); #if 0 /* custom viewport doesn't call apply_state_changes, so we can't rely on this for now */ @@ -1622,7 +1672,12 @@ static const video_poke_interface_t d3d11_poke_interface = { d3d11_gfx_load_texture, d3d11_gfx_unload_texture, NULL, /* set_video_mode */ +#ifndef __WINRT__ win32_get_refresh_rate, +#else + /* UWP does not expose this information easily */ + NULL, +#endif d3d11_set_filtering, NULL, /* get_video_output_size */ NULL, /* get_video_output_prev */ diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index c4dab9fcc3..c89797c5db 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2014-2018 - Ali Bouhlel * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -35,6 +35,10 @@ #include "wiiu/wiiu_dbg.h" +#ifdef __WINRT__ +#error "TODO (krzys_h): DX12 could be doable on UWP?" +#endif + static void d3d12_gfx_sync(d3d12_video_t* d3d12) { if (D3D12GetCompletedValue(d3d12->queue.fence) < d3d12->queue.fenceValue) @@ -864,8 +868,12 @@ static void d3d12_gfx_free(void* data) Release(d3d12->device); Release(d3d12->adapter); +#ifdef HAVE_MONITOR win32_monitor_from_window(); +#endif +#ifdef HAVE_WINDOW win32_destroy_window(); +#endif free(d3d12); } @@ -882,20 +890,26 @@ d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** i if (!d3d12) return NULL; +#ifdef HAVE_WINDOW win32_window_reset(); win32_monitor_init(); wndclass.lpfnWndProc = WndProcD3D; win32_window_init(&wndclass, true, NULL); +#endif +#ifdef HAVE_MONITOR win32_monitor_info(¤t_mon, &hm_to_use, &d3d12->cur_mon_id); +#endif d3d12->vp.full_width = video->width; d3d12->vp.full_height = video->height; +#ifdef HAVE_MONITOR if (!d3d12->vp.full_width) d3d12->vp.full_width = current_mon.rcMonitor.right - current_mon.rcMonitor.left; if (!d3d12->vp.full_height) d3d12->vp.full_height = current_mon.rcMonitor.bottom - current_mon.rcMonitor.top; +#endif if (!win32_set_video_mode(d3d12, d3d12->vp.full_width, d3d12->vp.full_height, video->fullscreen)) { @@ -903,7 +917,7 @@ d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** i goto error; } - dxgi_input_driver(settings->arrays.input_joypad_driver, input, input_data); + d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data); if (!d3d12_init_base(d3d12)) goto error; @@ -1764,7 +1778,12 @@ static const video_poke_interface_t d3d12_poke_interface = { d3d12_gfx_load_texture, d3d12_gfx_unload_texture, NULL, /* set_video_mode */ +#ifndef __WINRT__ win32_get_refresh_rate, +#else + /* UWP does not expose this information easily */ + NULL, +#endif d3d12_set_filtering, NULL, /* get_video_output_size */ NULL, /* get_video_output_prev */ diff --git a/gfx/drivers/d3d8.c b/gfx/drivers/d3d8.c index a5dcf1b2a1..3c174fdd93 100644 --- a/gfx/drivers/d3d8.c +++ b/gfx/drivers/d3d8.c @@ -48,9 +48,11 @@ #ifdef _XBOX #define D3D8_PRESENTATIONINTERVAL D3DRS_PRESENTATIONINTERVAL #else +#ifndef __WINRT__ #define HAVE_MONITOR #define HAVE_WINDOW #endif +#endif #ifdef HAVE_MENU #include "../../menu/menu_driver.h" @@ -61,6 +63,10 @@ #include "../../core.h" #include "../../verbosity.h" +#ifdef __WINRT__ +#error "UWP does not support D3D8" +#endif + static LPDIRECT3D8 g_pD3D8; #ifdef _XBOX @@ -1137,37 +1143,6 @@ static void d3d8_set_osd_msg(void *data, d3d8_end_scene(d3d->dev); } -static void d3d8_input_driver( - const input_driver_t **input, void **input_data) -{ - settings_t *settings = config_get_ptr(); - const char *name = settings ? - settings->arrays.input_joypad_driver : NULL; -#ifdef _XBOX - void *xinput = input_xinput.init(name); - *input = xinput ? (const input_driver_t*)&input_xinput : NULL; - *input_data = xinput; -#else -#if _WIN32_WINNT >= 0x0501 - /* winraw only available since XP */ - if (string_is_equal(settings->arrays.input_driver, "raw")) - { - *input_data = input_winraw.init(name); - if (*input_data) - { - *input = &input_winraw; - dinput = NULL; - return; - } - } -#endif - - dinput = input_dinput.init(name); - *input = dinput ? &input_dinput : NULL; - *input_data = dinput; -#endif -} - static bool d3d8_init_internal(d3d8_video_t *d3d, const video_info_t *info, const input_driver_t **input, void **input_data) @@ -1255,7 +1230,7 @@ static bool d3d8_init_internal(d3d8_video_t *d3d, if (!d3d8_initialize(d3d, &d3d->video_info)) return false; - d3d8_input_driver(input, input_data); + d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data); RARCH_LOG("[D3D8]: Init complete.\n"); return true; @@ -1888,9 +1863,10 @@ static const video_poke_interface_t d3d_poke_interface = { d3d8_load_texture, d3d8_unload_texture, d3d8_set_video_mode, -#ifdef _XBOX +#if defined(_XBOX) || defined(__WINRT__) NULL, #else + /* UWP does not expose this information easily */ win32_get_refresh_rate, #endif NULL, diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index a383190b48..00917d4bbe 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2012-2014 - OV2 @@ -65,6 +65,10 @@ #include "../../verbosity.h" #include "../../retroarch.h" +#ifdef __WINRT__ +#error "UWP does not support D3D9" +#endif + static LPDIRECT3D9 g_pD3D9; void *dinput; @@ -1182,38 +1186,6 @@ static void d3d9_set_osd_msg(void *data, d3d9_end_scene(dev); } -static void d3d9_input_driver( - const input_driver_t **input, void **input_data) -{ - settings_t *settings = config_get_ptr(); - const char *name = settings ? - settings->arrays.input_joypad_driver : NULL; -#ifdef _XBOX - void *xinput = input_xinput.init(name); - *input = xinput ? (const input_driver_t*)&input_xinput : NULL; - *input_data = xinput; -#else - -#if _WIN32_WINNT >= 0x0501 - /* winraw only available since XP */ - if (string_is_equal(settings->arrays.input_driver, "raw")) - { - *input_data = input_winraw.init(name); - if (*input_data) - { - *input = &input_winraw; - dinput = NULL; - return; - } - } -#endif - - dinput = input_dinput.init(name); - *input = dinput ? &input_dinput : NULL; - *input_data = dinput; -#endif -} - static bool d3d9_init_internal(d3d9_video_t *d3d, const video_info_t *info, const input_driver_t **input, void **input_data) @@ -1325,7 +1297,7 @@ static bool d3d9_init_internal(d3d9_video_t *d3d, if (!d3d9_initialize(d3d, &d3d->video_info)) return false; - d3d9_input_driver(input, input_data); + d3d_input_driver(settings->arrays.input_joypad_driver, input, input_data); RARCH_LOG("[D3D9]: Init complete.\n"); return true; @@ -2054,9 +2026,10 @@ static const video_poke_interface_t d3d9_poke_interface = { d3d9_load_texture, d3d9_unload_texture, d3d9_set_video_mode, -#ifdef _XBOX +#if defined(_XBOX) || defined(__WINRT__) NULL, #else + /* UWP does not expose this information easily */ win32_get_refresh_rate, #endif NULL, diff --git a/gfx/font_driver.c b/gfx/font_driver.c index 07ce2dd93c..8eaf1d2447 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -278,7 +278,7 @@ static bool vga_font_init_first( } #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) static const font_renderer_t *gdi_font_backends[] = { &gdi_font, NULL, @@ -666,7 +666,7 @@ static bool font_init_first( return switch_font_init_first(font_driver, font_handle, video_data, font_path, font_size, is_threaded); #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) case FONT_DRIVER_RENDER_GDI: return gdi_font_init_first(font_driver, font_handle, video_data, font_path, font_size, is_threaded); diff --git a/gfx/video_display_server.c b/gfx/video_display_server.c index e4824a0a46..73dd8c92ca 100644 --- a/gfx/video_display_server.c +++ b/gfx/video_display_server.c @@ -39,7 +39,7 @@ void* video_display_server_init(void) switch (type) { case RARCH_DISPLAY_WIN32: -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) current_display_server = &dispserv_win32; #endif break; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 88ef1862ef..b00014fb0b 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -340,7 +340,7 @@ static const video_driver_t *video_drivers[] = { #ifdef HAVE_XSHM &video_xshm, #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) &video_gdi, #endif #ifdef DJGPP @@ -416,7 +416,7 @@ static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { #if defined(HAVE_VULKAN) && defined(HAVE_VULKAN_DISPLAY) &gfx_ctx_khr_display, #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) &gfx_ctx_gdi, #endif #ifdef HAVE_SIXEL diff --git a/griffin/griffin.c b/griffin/griffin.c index 4589cafc12..cbe29ef9e7 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -601,6 +601,8 @@ INPUT #elif defined(DJGPP) #include "../input/drivers/dos_input.c" #include "../input/drivers_joypad/dos_joypad.c" +#elif defined(__WINRT__) +#include "../input/drivers/xdk_xinput_input.c" #endif #ifdef HAVE_WAYLAND @@ -947,7 +949,7 @@ FRONTEND #include "../frontend/frontend_driver.c" -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) +#if defined(_WIN32) && !defined(_XBOX) #include "../frontend/drivers/platform_win32.c" #endif @@ -1259,7 +1261,7 @@ MENU #include "../menu/drivers_display/menu_display_vga.c" #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) #include "../menu/drivers_display/menu_display_gdi.c" #endif diff --git a/input/drivers_joypad/xinput_joypad.c b/input/drivers_joypad/xinput_joypad.c index a7b5e639a8..1961b64262 100644 --- a/input/drivers_joypad/xinput_joypad.c +++ b/input/drivers_joypad/xinput_joypad.c @@ -42,12 +42,20 @@ #ifdef HAVE_DINPUT #include "dinput_joypad.h" +#else +int g_xinput_pad_indexes[MAX_USERS]; +bool g_xinput_block_pads; +#endif + +#if defined(__WINRT__) +#include #endif /* Check if the definitions do not already exist. * Official and mingw xinput headers have different include guards. + * Windows 10 API version doesn't have an include guard at all and just uses #pragma once instead */ -#if ((!_XINPUT_H_) && (!__WINE_XINPUT_H)) +#if ((!_XINPUT_H_) && (!__WINE_XINPUT_H)) && !defined(__WINRT__) #define XINPUT_GAMEPAD_DPAD_UP 0x0001 #define XINPUT_GAMEPAD_DPAD_DOWN 0x0002 @@ -173,7 +181,7 @@ const char *xinput_joypad_name(unsigned pad) return XBOX_CONTROLLER_NAMES[xuser]; } -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) static bool load_xinput_dll(void) { const char *version = "1.4"; @@ -210,7 +218,7 @@ static bool xinput_joypad_init(void *data) unsigned i, j; XINPUT_STATE dummy_state; -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) if (!g_xinput_dll) if (!load_xinput_dll()) return false; @@ -219,6 +227,9 @@ static bool xinput_joypad_init(void *data) * First try to load ordinal 100 (XInputGetStateEx). */ g_XInputGetStateEx = (XInputGetStateEx_t)dylib_proc(g_xinput_dll, (const char*)100); +#elif defined(__WINRT__) + /* XInputGetStateEx is not available on WinRT */ + g_XInputGetStateEx = NULL; #else g_XInputGetStateEx = (XInputGetStateEx_t)XInputGetStateEx; #endif @@ -230,7 +241,7 @@ static bool xinput_joypad_init(void *data) * XInputGetState, at the cost of losing guide button support. */ g_xinput_guide_button_supported = false; -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) g_XInputGetStateEx = (XInputGetStateEx_t)dylib_proc(g_xinput_dll, "XInputGetState"); #else g_XInputGetStateEx = (XInputGetStateEx_t)XInputGetState; @@ -239,7 +250,7 @@ static bool xinput_joypad_init(void *data) if (!g_XInputGetStateEx) { RARCH_ERR("[XInput]: Failed to init: DLL is invalid or corrupt.\n"); -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) dylib_close(g_xinput_dll); #endif return false; /* DLL was loaded but did not contain the correct function. */ @@ -247,7 +258,7 @@ static bool xinput_joypad_init(void *data) RARCH_WARN("[XInput]: No guide button support.\n"); } -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) g_XInputSetState = (XInputSetState_t)dylib_proc(g_xinput_dll, "XInputSetState"); #else g_XInputSetState = (XInputSetState_t)XInputSetState; @@ -255,7 +266,7 @@ static bool xinput_joypad_init(void *data) if (!g_XInputSetState) { RARCH_ERR("[XInput]: Failed to init: DLL is invalid or corrupt.\n"); -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) dylib_close(g_xinput_dll); #endif return false; /* DLL was loaded but did not contain the correct function. */ @@ -277,7 +288,7 @@ static bool xinput_joypad_init(void *data) (!g_xinput_states[1].connected) && (!g_xinput_states[2].connected) && (!g_xinput_states[3].connected)) - return false; + return true; RARCH_LOG("[XInput]: Pads connected: %d\n", g_xinput_states[0].connected + g_xinput_states[1].connected + g_xinput_states[2].connected + g_xinput_states[3].connected); @@ -347,7 +358,7 @@ static void xinput_joypad_destroy(void) for (i = 0; i < 4; ++i) memset(&g_xinput_states[i], 0, sizeof(xinput_joypad_state)); -#ifdef HAVE_DYNAMIC +#if defined(HAVE_DYNAMIC) && !defined(__WINRT__) dylib_close(g_xinput_dll); g_xinput_dll = NULL; @@ -499,6 +510,7 @@ static void xinput_joypad_poll(void) for (i = 0; i < 4; ++i) { +#ifdef HAVE_DINPUT if (g_xinput_states[i].connected) { if (g_XInputGetStateEx && g_XInputGetStateEx(i, @@ -506,6 +518,28 @@ static void xinput_joypad_poll(void) == ERROR_DEVICE_NOT_CONNECTED) g_xinput_states[i].connected = false; } +#else + /* Normally, dinput handles device insertion/removal for us, but + * since dinput is not available on UWP we have to do it ourselves */ + /* Also note that on UWP, the controllers are not available on startup + * and are instead 'plugged in' a moment later because Microsoft reasons */ + // TODO: This may be bad for performance? + bool new_connected = g_XInputGetStateEx && g_XInputGetStateEx(i, &(g_xinput_states[i].xstate)) != ERROR_DEVICE_NOT_CONNECTED; + if (new_connected != g_xinput_states[i].connected) + { + if (new_connected) + { + /* This is kinda ugly, but it's the same thing that dinput does */ + xinput_joypad_destroy(); + xinput_joypad_init(NULL); + return; + } + else + { + g_xinput_states[i].connected = new_connected; + } + } +#endif } #ifdef HAVE_DINPUT diff --git a/input/input_driver.c b/input/input_driver.c index 3d9d60f683..5134c23e76 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -107,7 +107,7 @@ static const input_driver_t *input_drivers[] = { #ifdef XENON &input_xenon360, #endif -#if defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1) +#if defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1) || defined(__WINRT__) &input_xinput, #endif #ifdef GEKKO @@ -137,7 +137,7 @@ static const input_driver_t *input_drivers[] = { #ifdef DJGPP &input_dos, #endif -#if defined(_WIN32) && !defined(_XBOX) && _WIN32_WINNT >= 0x0501 +#if defined(_WIN32) && !defined(_XBOX) && _WIN32_WINNT >= 0x0501 && !defined(__WINRT__) /* winraw only available since XP */ &input_winraw, #endif diff --git a/input/input_keymaps.c b/input/input_keymaps.c index ff3817ad92..9ec77c755a 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -1423,7 +1423,7 @@ const struct rarch_key_map rarch_key_map_dos[] = { }; #endif -#if defined(_WIN32) && _WIN32_WINNT >= 0x0501 +#if defined(_WIN32) && _WIN32_WINNT >= 0x0501 && !defined(__WINRT__) const struct rarch_key_map rarch_key_map_winraw[] = { { VK_BACK, RETROK_BACKSPACE }, { VK_TAB, RETROK_TAB }, @@ -1539,6 +1539,11 @@ const struct rarch_key_map rarch_key_map_winraw[] = { }; #endif +#ifdef __WINRT__ +/* Refer to uwp_main.cpp - on WinRT these constants are defined as C++ enum classes + * so they can't be placed in a C source file */ +#endif + enum retro_key rarch_keysym_lut[RETROK_LAST]; /** diff --git a/libretro-common/dynamic/dylib.c b/libretro-common/dynamic/dylib.c index bc6be9fc40..1db756c734 100644 --- a/libretro-common/dynamic/dylib.c +++ b/libretro-common/dynamic/dylib.c @@ -74,17 +74,42 @@ static void set_dl_error(void) dylib_t dylib_load(const char *path) { #ifdef _WIN32 +#ifndef __WINRT__ int prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); -#ifdef LEGACY_WIN32 +#endif +#ifdef __WINRT__ + /* On UWP, you can only load DLLs inside your install directory, using a special function that takes a relative path */ + + if (!path_is_absolute(path)) + RARCH_WARN("Relative path in dylib_load! This is likely an attempt to load a system library that will fail\n"); + + char *relative_path_abbrev = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + fill_pathname_abbreviate_special(relative_path_abbrev, path, PATH_MAX_LENGTH * sizeof(char)); + + char *relative_path = relative_path_abbrev; + if (relative_path[0] != ':' || !path_char_is_slash(relative_path[1])) + RARCH_WARN("Path to dylib_load is not inside app install directory! Loading will probably fail\n"); + else + relative_path += 2; + + RARCH_LOG("Loading library using a relative path: '%s'\n", relative_path); + + wchar_t *pathW = utf8_to_utf16_string_alloc(relative_path); + dylib_t lib = LoadPackagedLibrary(pathW, 0); + free(pathW); + + free(relative_path_abbrev); +#elif defined(LEGACY_WIN32) dylib_t lib = LoadLibrary(path); #else wchar_t *pathW = utf8_to_utf16_string_alloc(path); dylib_t lib = LoadLibraryW(pathW); - free(pathW); #endif +#ifndef __WINRT__ SetErrorMode(prevmode); +#endif if (!lib) { @@ -114,8 +139,20 @@ function_t dylib_proc(dylib_t lib, const char *proc) function_t sym; #ifdef _WIN32 - sym = (function_t)GetProcAddress(lib ? - (HMODULE)lib : GetModuleHandle(NULL), proc); + HMODULE mod = (HMODULE)lib; +#ifndef __WINRT__ + if (!mod) + mod = GetModuleHandle(NULL); +#else + /* GetModuleHandle is not available on UWP */ + if (!mod) + { + RARCH_WARN("FIXME: It's not possible to look up symbols in current executable on UWP!\n"); + DebugBreak(); + return NULL; + } +#endif + sym = (function_t)GetProcAddress(mod, proc); if (!sym) { set_dl_error(); diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 1e910f4ec1..2e27217457 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -96,6 +96,12 @@ #include /* stat() is defined here */ #endif +#if !defined(RARCH_CONSOLE) && defined(RARCH_INTERNAL) +#ifdef __WINRT__ +#include +#endif +#endif + /* Assume W-functions do not work below Win2K and Xbox platforms */ #if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) @@ -1005,17 +1011,36 @@ void fill_pathname_expand_special(char *out_path, const char *in_path, size_t size) { #if !defined(RARCH_CONSOLE) && defined(RARCH_INTERNAL) - if (*in_path == '~') + if (in_path[0] == '~') { - const char *home = getenv("HOME"); - if (home) + char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + + home_dir[0] = '\0'; + + fill_pathname_home_dir(home_dir, + PATH_MAX_LENGTH * sizeof(char)); + + if (*home_dir) { - size_t src_size = strlcpy(out_path, home, size); + size_t src_size = strlcpy(out_path, home_dir, size); retro_assert(src_size < size); out_path += src_size; size -= src_size; - in_path++; + + if ( + (in_path[1] == '/') +#ifdef _WIN32 + || (in_path[1] == '\\') +#endif + ) + { + in_path += 2; + } + else + { + in_path++; + } } } else if ((in_path[0] == ':') && @@ -1027,23 +1052,24 @@ void fill_pathname_expand_special(char *out_path, ) ) { - size_t src_size; char *application_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); application_dir[0] = '\0'; - fill_pathname_application_path(application_dir, + fill_pathname_application_dir(application_dir, PATH_MAX_LENGTH * sizeof(char)); - path_basedir_wrapper(application_dir); - src_size = strlcpy(out_path, application_dir, size); - retro_assert(src_size < size); + if (*application_dir) + { + size_t src_size = strlcpy(out_path, application_dir, size); + retro_assert(src_size < size); - free(application_dir); + free(application_dir); - out_path += src_size; - size -= src_size; - in_path += 2; + out_path += src_size; + size -= src_size; + in_path += 2; + } } #endif @@ -1058,7 +1084,7 @@ void fill_pathname_abbreviate_special(char *out_path, const char *candidates[3]; const char *notations[3]; char *application_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - const char *home = getenv("HOME"); + char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); application_dir[0] = '\0'; @@ -1070,16 +1096,17 @@ void fill_pathname_abbreviate_special(char *out_path, /* ugly hack - use application_dir pointer * before filling it in. C89 reasons */ candidates[0] = application_dir; - candidates[1] = home; + candidates[1] = home_dir; candidates[2] = NULL; notations [0] = ":"; notations [1] = "~"; notations [2] = NULL; - fill_pathname_application_path(application_dir, + fill_pathname_application_dir(application_dir, + PATH_MAX_LENGTH * sizeof(char)); + fill_pathname_home_dir(home_dir, PATH_MAX_LENGTH * sizeof(char)); - path_basedir_wrapper(application_dir); for (i = 0; candidates[i]; i++) { @@ -1107,6 +1134,7 @@ void fill_pathname_abbreviate_special(char *out_path, } free(application_dir); + free(home_dir); #endif retro_assert(strlcpy(out_path, in_path, size) < size); @@ -1148,7 +1176,7 @@ void fill_pathname_application_path(char *s, size_t len) CFBundleRef bundle = CFBundleGetMainBundle(); #endif #ifdef _WIN32 - DWORD ret; + DWORD ret = 0; wchar_t wstr[PATH_MAX_LENGTH] = {0}; #endif #ifdef __HAIKU__ @@ -1160,11 +1188,11 @@ void fill_pathname_application_path(char *s, size_t len) if (!len) return; -#ifdef _WIN32 +#if defined(_WIN32) #ifdef LEGACY_WIN32 - ret = GetModuleFileNameA(GetModuleHandle(NULL), s, len); + ret = GetModuleFileNameA(NULL, s, len); #else - ret = GetModuleFileNameW(GetModuleHandle(NULL), wstr, ARRAY_SIZE(wstr)); + ret = GetModuleFileNameW(NULL, wstr, ARRAY_SIZE(wstr)); if (*wstr) { @@ -1233,4 +1261,27 @@ void fill_pathname_application_path(char *s, size_t len) } #endif } + +void fill_pathname_application_dir(char *s, size_t len) +{ +#ifdef __WINRT__ + strlcpy(s, uwp_dir_install, len); +#else + fill_pathname_application_path(s, len); + path_basedir_wrapper(s); +#endif +} + +void fill_pathname_home_dir(char *s, size_t len) +{ +#ifdef __WINRT__ + strlcpy(s, uwp_dir_data, len); +#else + const char *home = getenv("HOME"); + if (home) + strlcpy(s, home, len); + else + *s = 0; +#endif +} #endif diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index d6254ef08e..1ce6322bc9 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -38,7 +38,7 @@ extern nbio_intf_t nbio_stdio; static nbio_intf_t *internal_nbio = &nbio_linux; #elif defined(HAVE_MMAP) && defined(BSD) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; -#elif defined(_WIN32) && !defined(_XBOX) +#elif defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) static nbio_intf_t *internal_nbio = &nbio_mmap_win32; #else static nbio_intf_t *internal_nbio = &nbio_stdio; diff --git a/libretro-common/include/file/file_path.h b/libretro-common/include/file/file_path.h index 026b4f7933..b6b533a6b9 100644 --- a/libretro-common/include/file/file_path.h +++ b/libretro-common/include/file/file_path.h @@ -462,6 +462,8 @@ void fill_pathname_slash(char *path, size_t size); #if !defined(RARCH_CONSOLE) && defined(RARCH_INTERNAL) void fill_pathname_application_path(char *buf, size_t size); +void fill_pathname_application_dir(char *buf, size_t size); +void fill_pathname_home_dir(char *buf, size_t size); #endif /** diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 631cb9abe6..cc742f2ce6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -359,12 +359,14 @@ static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) } } +#ifndef __WINRT__ if (settings->bools.menu_show_core_updater) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_DELETE), msg_hash_to_str(MENU_ENUM_LABEL_CORE_DELETE), MENU_ENUM_LABEL_CORE_DELETE, MENU_SETTING_ACTION_CORE_DELETE, 0, 0); +#endif return 0; } @@ -3102,6 +3104,7 @@ static unsigned menu_displaylist_parse_options( MENU_SETTING_ACTION, 0, 0); count++; #elif defined(HAVE_NETWORKING) +#ifndef __WINRT__ if (settings->bools.menu_show_core_updater) { menu_entries_append_enum(info->list, @@ -3111,6 +3114,7 @@ static unsigned menu_displaylist_parse_options( MENU_SETTING_ACTION, 0, 0); count++; } +#endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST), @@ -4150,7 +4154,7 @@ bool menu_displaylist_process(menu_displaylist_info_t *info) if (info->need_sort) file_list_sort_on_alt(info->list); -#if defined(HAVE_NETWORKING) +#if defined(HAVE_NETWORKING) && !defined(__WINRT__) if (settings->bools.menu_show_core_updater && !settings->bools.kiosk_mode_enable) { if (info->download_core) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 5e193fca93..579e499ef9 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -148,7 +148,7 @@ static menu_display_ctx_driver_t *menu_display_ctx_drivers[] = { #ifdef WIIU &menu_display_ctx_wiiu, #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) &menu_display_ctx_gdi, #endif #ifdef DJGPP diff --git a/pkg/msvc/RetroArch-msvc2017-UWP.sln b/pkg/msvc/RetroArch-msvc2017-UWP.sln new file mode 100644 index 0000000000..30fad3eb7a --- /dev/null +++ b/pkg/msvc/RetroArch-msvc2017-UWP.sln @@ -0,0 +1,51 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.168 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-msvc2017-UWP", "msvc-2017-UWP\RetroArch-msvc2017-UWP.vcxproj", "{F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM.ActiveCfg = Debug|ARM + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM.Build.0 = Debug|ARM + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM.Deploy.0 = Debug|ARM + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM64.Build.0 = Debug|ARM64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x64.ActiveCfg = Debug|x64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x64.Build.0 = Debug|x64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x64.Deploy.0 = Debug|x64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x86.ActiveCfg = Debug|Win32 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x86.Build.0 = Debug|Win32 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x86.Deploy.0 = Debug|Win32 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM.ActiveCfg = Release|ARM + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM.Build.0 = Release|ARM + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM.Deploy.0 = Release|ARM + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM64.ActiveCfg = Release|ARM64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM64.Build.0 = Release|ARM64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM64.Deploy.0 = Release|ARM64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x64.ActiveCfg = Release|x64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x64.Build.0 = Release|x64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x64.Deploy.0 = Release|x64 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x86.ActiveCfg = Release|Win32 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x86.Build.0 = Release|Win32 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x86.Deploy.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2A811B94-2232-4C4E-A88E-33B0CDF139A2} + EndGlobalSection +EndGlobal diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LockScreenLogo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735f57adb5dfc01886d137b4e493d7e97cf13af3 GIT binary patch literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..023e7f1feda78d5100569825acedfd213a0d84e9 GIT binary patch literal 7700 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..af49fec1a5484db1d52a7f9b5ec90a27c7030186 GIT binary patch literal 2937 zcma)84OCO-8BSud5)jwMLRVKgX(S?$n?Ld|vrsm<$CF7)&zTbyy1FE5bU`Q17MRv`9ue$;R(@8kR;#vJ*IM0>cJIAOte!d7oRgdH zd%ySjdB6L9=gX^A6)VzH7p2l@v~3zJAMw|DFy#^)F@@F*`mqUn=Il>l)8_+ab;nOW{%+iPx z+s{Eu|&pIs)Z7{La9~?xKfyl z#43?gjEL15d4WbOZo#SiP%>DB^+BcnJ=7dHEe;r#G=tuw|ka z%q@}##Uh7;tc%L_64m(kHtw74ty%BJMb)_1)#S0j`)F8_1jF7vScpsnH=0V19bO8y zR`0SjIdCUo&=>JwMQF8KHA<{ODHTiQh}0^@5QRmCA?gOH6_H3K^-_sNB^RrdNuK-R zOO*vOrKCVvDwgUck`kF(E7j{I#iiN;b*ZdCt4m@HPA`EuEqGGf4%!K<;(=I=&Vyrw z%TwcWtxa}8mCZ%Cyf&ActJ6_$ox5z6-D!0-dvnRx6t7y3d+h6QYpKWO;8OdnvERo7 zuEf>ih5`wqY)~o@OeVt-wM?Q!>QzdGRj!bz6fzYrfw$hZfAKzr2-M+D+R>}~oT574c;_3zquHcElqKIsryILt3g8n3jcMb+j?i?-L3FpZJ z2WRVBRdDPc+G5aaYg#5hpE+6nQ|(VSoxT3|biF;BUq#==-27Xi=gihDPYP$7?=9cP zYKE$jeQ|3~_L0VG-(F~2ZPyD0=k{J4Q~h(t__{-mz_w8{JDY9{`1ouzz!Vr5!ECdE z6U~O1k8c}24V7~zzXWTV-Pe4)y}wQJS&q%H5`Fo_f_JvIU489aCX$;P`u#!I-=^4ijC2{&9!O&h>mi?9oYD=GC#%)6{GzN6nQYw+Fal50!#x^asjBBR50i`+mho*ttoqV)ubM2KD9S~k7+FR4>{29?6 z{!l6kDdyTN0YJ9LgkPWeXm|gyi@zM3?0@{&pXT12w|78&W-q!RRF)&iLCEZVH<|fR zN0fr2^t8H(>L?>K#>^+jWROLral(Qy-xoBq1U7A&DV||wClb)Otd9?(gZ|8znMF}D zf<1haWz^s0qgecz;RFGt0C-B4g`jNGHsFU+;{<%t65v^sjk^h$lmWn#B0#_)9ij&d z-~lc`A)YYExi^7sBuPM^Y|wA2g*5?`K?#7tzELQYNxGo$UB$4J8RJp1k(8Jj+~hMT zlN~>M@KTTh^--8y3PK_NZ@AC!{PT=CziBzGd+wTJ^@icH!Bd}%)g8V)%K?|c&WTUk zy}qv1C%(fjRoZ4ozC3{O%@5?)XzH35zHns$pgU*Q?fj4v?fp1Qbm+j;3l;9jam9Da zXVcKjPlQ73x78QPu|Ffm6x?`~e3oD=gl=4kYK?={kD5j~QCXU)`HSdduNNENzA*2$ zOm3PzF!lN5e*06-f1Uot67wY#{o-S1!KZ7E=!~7ynnk9_iJR#kFoNbAOT#^2Gd17F zMmvU6>lndZQGd|ax9kUoXXO+$N?|j@6qpsF&_j7YXvwo_C{JpmLw5&#e6k>atv%es z5)7r*Wvv_JkUpT}M!_o!nVlEk1Zbl=a*2hQ*<|%*K1Glj^FcF`6kTzGQ3lz~2tCc@ z&x|tj;aH&1&9HwcJBcT`;{?a+pnej;M1HO(6Z{#J!cZA04hnFl;NXA+&`=7bjW_^o zfC40u3LMG?NdPtwGl>Tq6u}*QG)}-y;)lu-_>ee3kibW(69n0$0Zy!}9rQz%*v1iO zT9_H>99yIrSPYVy6^);rR}7Yo=J_T@hi+qhTZXnVWyf;JDYm5#eYLTxr*?kiNn!+Y zQ+LUkBafNJ#rH#C(?d5^;gw9o#%daEI{mA*LHPIHPU`#|H$hD zwm>0&+kahQ)E#%~k>&5@&#Vg82H?s%71=)(soi@174pi9--2{w{1$}Sz4zGn3Du&x bht0Iza^2ykEt4(epJ78uh5nDlX8(TxzDYwP literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..ce342a2ec8a61291ba76c54604aea7e9d20af11b GIT binary patch literal 1647 zcmaJ?eM}Q)7(e+G1Q(|`V9JhTI2>MkceK4;p;PR&$Pi?ejk3YQ_3o`S&|W_dsOZ8# zWPTt69g`t$ab`0cj-Y0yiBSOqmd)tG7G(}M5aP0_%&9TijB#&)I{zSE^4@#z^FF`l z`8{8`o%wlL(UI|y2!cdsuVamHH~H86F!*-15em4)NqUpCQM5?aoC_eCf@lV4wvF2a zjDQn1JBL69f&@2M3rvzJcfE!eZ8FZUBlFlC5RD)it33{mF9#B82AiyQE%w)`vlwa> zv{<1sm&kSKK$&%2jSFn7$t&P%%6Ue>R=EAnG8N7fqynWG8L3p!4801a;8{+nliO(qd(jNJ_?+9W3#hLIDLoT6~3fx9=`CC-D}-AMrpEO7HK zt3$GicGPc?GmDjy7K2P@La;eu4!$zWCZ`ym{Z$b zu-O6RM&K4JT|BIZB`E-gxqG%FzanI#+2FFmqHqXG7yxWB=w55RGOM)$xMb(>kSNR z2w=1AZi%z=AmG~yea~XaXJR!v7vLn(RUnELfiB1|6D84ICOS}^Zo2AdN}<&*h}G_u z{xZ!(%>tLT3J3<5XhWy-tg+6)0nmUUENLW8TWA{R6bgVd3X;anYFZ^IRis*_P-C-r z;i>%1^eL3UI2-{w8nuFFcs0e~7J{O2k^~Ce%+Ly4U?|=!0LH=t6()xi<^I-rs+9sF z*q{E-CxZbGPeu#a;XJwE;9S1?#R&uns>^0G3p`hEUF*v`M?@h%T%J%RChmD|EVydq zmHWh*_=S%emRC*mhxaVLzT@>Z2SX0u9v*DIJ@WC^kLVdlGV6LpK$KIrlJqc zpJ921)+3JJdTx|<`G&kXpKkjGJv=76R`yYIQ{#c-`%+`#V(7}Q;&@6U8!Td1`d;?N z_9mnI#?AA}4J!r)LN4!E-@H5eXauuB7TOawS>Y|{-P?NNx-lq+z1W-+y(;39P&&LP zL{N80?&=C*qKmdA^moMZRuPcD!B<*mq$ch=0Cnlitw#txRWhb3%TQvPqjkC`F69G4b! ze7z9MZ#+;_#l?H37UqUhDFb^l&s2{oM$3I0o^Q!yx;;V)QmCMo)Tb_ui|mit8MS?U zm##6$sZZ1$@|s%?l@>4Z<*Q}sRBSKMhb4I{e5LdEhsHIHTe8Bod5c>6QtT>$XgUBz z6MK`kO$=jmt@FqggOhJ5j~e@ygRbG;<{Vu)*+nn9aQeo0;$#j;|MS=S$&L?BeV25z xs3B`@=#`5TF{^6(A1rvdY@|-RtQ|iS5{tyX+wH?;n8E)G$kykv-D^wh{{!TZT%7;_ literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c02ce97e0a802b85f6021e822c89f8bf57d5cd GIT binary patch literal 1255 zcmaJ>TWs4@7*5+{G#S+&C!qC#> zf>5N3P6jO*Cz>ug*(_DmW=)kea&m$gZ^+nyiF`;j%w@}y8)>p*SH}C`m?DXeieF2U zyQHecc_L%Gh!7GMt+hG06y;+|p4>m~}PjA}rKViGiEnn7G0ZO<>G|7q;2?NwGCM3s?eued6%hd$B+ z*kQJ{#~$S=DFE(%=E+UkmlEI*%3llUf~8Ja9YU1Vui0IbGBkW_gHB%Rd&!!ioX zs40O?i9I{};kle7GMvE7(rk`la=gTI)47=>%?q@^iL-nUo3}h4S}N-KHn8t5mVP8w z&bSErwp+37 zNJJ8?a|{r5Q3R0Z5s-LB1WHOwYC@7pCHWND#cL1cZ?{kJ368_*(UDWUDyb<}0y@o# zfMF016iMWPCb6obAxT$JlB6(2DrlXDTB&!0`!m??4F(qWMhjVZo?JXQmz`1*58Z=& zcDmB|S-E@j?BoFGix0flckqdS4jsPNzhfWyWIM98GxcLs89C(~dw%$_t;JjX-SD}E zfiGV;{8Q%8r}w9x>EEigW81>`kvnU@pK)4+xk9@+bNj9L!AAZ@SZ@q|)&BmY3+HZx zul~BeG4|}-;L%cHViQGQX?^zFfO0&#cHwel=d`lH9sJ-@Sl@n*(8J2>%Ac`IxyY?Q z{=GhWvC#gu-~Ia7*n{=+;qM?Ul_wy1+u7ho;=`>EwP^g~R@{unBds`!#@}tluZQpS zm)M~nYEifJWJGx?_6DcTy>#uh%>!H9=hb^(v`=m3F1{L>db=<5_tm+_&knAQ2EU$s Mu9UqpbNZeC0BbUo^Z)<= literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.png b/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7385b56c0e4d3c6b0efe3324aa1194157d837826 GIT binary patch literal 1451 zcmaJ>eN5D57_Z|bH;{0+1#mbl)eTU3{h)Wf7EZV?;HD@XL@{B`Ui%(2aMxQ~xdXSv z5nzWi(LW)U2=Vc-cY@s7nPt{i0hc6!7xN4NNHI#EQl>YNBy8l4%x9gr_W-j zEZMQmmTIy(>;lblRfh`dIyTgc9W5d!VP$L4(kKrN1c5G~(O_#xG zAJCNTstD^5SeXFB+&$h=ToJP2H>xr$iqPs-#O*;4(!Fjw25-!gEb*)mU}=)J;Iu>w zxK(5XoD0wrPSKQ~rbL^Cw6O_03*l*}i=ydbu7adJ6y;%@tjFeXIXT+ms30pmbOP%Q zX}S;+LBh8Tea~TSkHzvX6$rYb)+n&{kSbIqh|c7hmlxmwSiq5iVhU#iEQ<>a18|O^Sln-8t&+t`*{qBWo5M?wFM(JuimAOb5!K#D}XbslM@#1ZVz_;!9U zpfEpLAOz=0g@bd6Xj_ILi-x^!M}73h^o@}hM$1jflTs|Yuj9AL@A3<-?MV4!^4q`e z)fO@A;{9K^?W?DbnesnPr6kK>$zaKo&;FhFd(GYFCIU^T+OIMb%Tqo+P%oq(IdX7S zf6+HLO?7o0m+p>~Tp5UrXWh!UH!wZ5kv!E`_w)PTpI(#Iw{AS`gH4^b(bm^ZCq^FZ zY9DD7bH}rq9mg88+KgA$Zp!iWncuU2n1AuIa@=sWvUR-s`Qb{R*kk(SPU^`$6BXz8 zn#7yaFOIK%qGxyi`dYtm#&qqox0$h=pNi#u=M8zUG@bpiZ=3sT=1}Trr}39cC)H|v zbL?W)=&s4zrh)7>L(|cc%$1#!zfL?HjpeP%T+x_a+jZ16b^iKOHxFEX$7d|8${H-* zIrOJ5w&i$>*D>AKaIoYg`;{L@jM((Kt?$N$5OnuPqVvq**Nm}(f0wwOF%iX_Pba;V z;m@wxX&NcV3?<1+u?A{y_DIj7#m3Af1rCE)o`D&Y3}0%7E;iX1yMDiS)sh0wKi!36 zL!Wmq?P^Ku&rK~HJd97KkLTRl>ScGFYZNlYytWnhmuu|)L&ND8_PmkayQb{HOY640 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..288995b397fdbef1fb7e85afd71445d5de1952c5 GIT binary patch literal 3204 zcmbVPeQXow8NYmBd90>}0NP?GhXW~VaeThm=a0tV#EwJMI!)6M3}|c4_Bl3=Kd>G0 z(GHx1wl<7(tP?FsOQkTilSo*iIvF%uArExJ73~P zSv1xEy!U(Wd4A9D`FQV@W3@F^qJ@PEF$@z`Z!*BbFsS(^?B zyiAzJ+q})bkgiQHWqEb*jJD-coHYr1^iocg)l!Qa{Xqs-l~6J}p-|##ZHYofskQ3$ zI0;xzXyhazBeXhIsg5A=%ufo@f)1yy&ScKS0;HF^!r_2UE^lpZEom(+@duma3awTv zCrCL-%D_SvYWIcdHkmI}#50(fkUi)Qgx!80ju>g1za^}ff>JI8Z@^-iCiaCgg@TgF z+vtE?Q9{VQUX&MW9SYYmGcxA14%N2@7FwBTD4N<(2{nWgV8$e3?-F=L^&FrtWn~(U_Q~~^uYiyeY6-KoTnfh9AWz@ zIKje0)u!_Lw)E}G!#kEfwKVdNt(UAf9*f>tEL_(=xco-T%jTi@7YlC3hs2ik%Le0H ztj}RTeCF(5mwvi3_56>-yB?l;J>-1%!9~=fs|QcNG3J~a@JCu`4SB460s0ZO+##4fFUSGLcj_ja^fL4&BKALfb#$6$O?>P@qx2Agl^x0i&ugt zsy5Pyu=()`7HRMG3IB7F1@`_ z+-!J%#i6e^U$e#+C%Q>_qVRzWRsG^W_n+@OcX@vzI&z;mzHNb!GQ?LWA(wtpqHqTM z1OFw_{Zn?fD)p)`c`kOgv{de=v@suGRqY{N^U7gI1VF3*F=obwaXI6ob5__Yn zVTguS!%(NI09J8x#AO_aW!9W7k*UvB;IWDFC3srwftr{kHj%g)fvnAm;&h_dnl~

MY- zf+K}sCe8qU6Ujs`3ua{U0Of$R_gVQBuUA za0v=mu#vIOqiiAZOr&h*$WyOw&k-xr$;G4Ixa!#TJNr>95(h>l%)PUy4p+^SgR(uR zta%k*?ny-+nAr8spEk1fo{J4i!b^Fia`N{_F6@zidA2ZTTrjl#^5Z-2KfB@Cu}l9s z(*|Z2jc?p~vn2f)3y9i*7zJV1L{$?|&q)4oaT;uXi6>1GkRXVTOzAz(RHEmr=eFIi z`}<>-Q?K0GN8!IYxeP1XKXO+jsJbp~o^);Bc;%b7Flpe7;1`Ny@3r7ZR;?R)aJt8C ziNlEC<@3f_lIV4TwV}&e;D!Ee5_|e#g0LUh=5vmYWYm7&2h*M>QPKvGh9-)wfMMW3 z8J9b%1k7dzPzO0_NGQy92BZ^FR6R~6;^6?lqO;-QUP4BY%cG%3vEhbm#>4vIhPBh3 z-+pZGjh$x%Hp{?=FHsMp0&wNPlj00us{&`1ZOZTqs8%4X&xH=UDr*xyBW(Zp&Em94 zf)ZSfn#yg0N)>!1kWdkqJ^S*z0FF5|fj&qcE#Na|%OY0$uO>!&hP+1ywfD_WXk@4J(?MBftK7>$Nvqh@tDuarN%PrTLQ2Uzysx>UV=V zk^RrDSvdQ?0;=hY67EgII-f4`t=+i*yS=Y~!XlqIy_4x&%+OdfbKOFPXS2X5%4R{N z$SQMX^AK6(fA + + + + + + + + + msvc-2017-UWP + krzys + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj new file mode 100644 index 0000000000..0836dbbee9 --- /dev/null +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj @@ -0,0 +1,506 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + + {f5e937b6-1ba0-4446-b94b-f3bbdef908f4} + DirectXApp + RetroArchUWP + pl-PL + 14.0 + true + Windows Store + 10.0.17763.0 + 10.0.15063.0 + 10.0 + + + + Application + true + v141 + + + Application + true + v141 + + + Application + true + v141 + true + + + Application + true + v141 + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + msvc-2017-UWP_TemporaryKey.pfx + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + ProgramDatabase + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + ProgramDatabase + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + + + + + + + + + + false + false + false + false + false + false + false + false + + + + + + + + + Designer + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + true + + + true + + + true + + + true + + + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters new file mode 100644 index 0000000000..a133f33c90 --- /dev/null +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters @@ -0,0 +1,280 @@ + + + + + {1246fa09-e114-4a52-88c2-657b2f13d9fb} + + + {32de9679-6494-4933-afa2-430fd975e506} + + + {73676219-cf54-454f-b6fa-9b192c1454f8} + + + + + {bf1e643d-c518-4a77-a355-ae8a93efc18b} + + + {ba77ad30-f536-4bb8-ad9d-2870e8a9bd39} + + + + + assets + + + assets + + + assets + + + assets + + + assets + + + assets + + + assets + + + + + + + + + core_deps + + + cores + + + cores + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + core_deps + + + + + uwp + + + uwp + + + + + griffin + + + griffin + + + uwp + + + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/msvc-2017-UWP_TemporaryKey.pfx b/pkg/msvc/msvc-2017-UWP/msvc-2017-UWP_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..ff20a54c343d4c6e0aa5bdb5ed3b80e4c09bec18 GIT binary patch literal 2504 zcmZXUc{tQ<7sr1y#xSOwaYc&vU)k`^P!=_xm~L+}HijeUNxq7Z}8V#KYpDFqvedDt-u;4Ub<)YMn{C4$GNuP-}<_7ERP$*HW zu`zK@_Bxc#fq_J5g1R*f`f=CT;C+o!gi4etM*`XY_FB8A@-*CtMkQxVyDqDmCi(xeitv6A0$_#-B}O>9p# zj8}qu?Y^oXQwVMV>tY*YQXrRQO!e}sHZeWD2IKCi(!h)`!*8bLoq2DA{+^xw%uxm% z)aZbvB}WI5^;fB_>OSgM9($}CiWK$SRX>cfaHVS&fqQ z;*OE$Pk9fI$)(<&3G39VD2Ry8+J(Tn)+$9xN&W!%e`NGF$iINiDq+dylc6cKJg>3mWaf|7pk*5s}TGFio>;H5hxia_QIu+F)Xf(k`)3 zS7o`1d-_Y=0h>ja`cgV)_gMIachBx&dP-NUQ&Q0-EN7dPJNqYP_FHpEPA6L^L(GJ0 zt5aZj31|NN3lYY(7AAv-R$0*0YLeM7Bl zO!5-VHxWE6p^pR{unMQR({G}P1b2hPUmhpnWgl4Zn9%LmM|KXWI#<*UUhvkPhnmHg z)~$akw7-5S&Np>nV!mQ)Q)?>tmz4rg+5S4uG!)JpkU{Q&^4)dQ1943%ir=6Fm*Ry^ zeHpuv?82{+R7H%fTd>tJrF=D|fnN)B~3Y#`!tk*AKL}dRyHAlm`@JY)(Icw`> zYIh*aBX}b?OjV49FU|Qp>-}TVe}10TYtaf1B^tZX#Yb{NT<%HQAbWCoC#)n6u+9%lY0>(!)8LYIozys z^vO`qj^WExPpEKRRZMt~Gg|Gblt{)KLtZZg8t$Aproe{2xu;-5W+Mt43 zKnzE$W@FaQVRrp4na)-8Uc-oNqq?Uf!EcK0$EBa&8`=I9`@v~wL34w#jI%e#l z8mJ%AJUEda?_uiUg`g86JBBkO{TnLVi!VZ+&Zbo4Y`au&VdTP@Qyt@;6|DF)kzX3w zPmEED?KX}cF1Rirn?BIZZ ztZYCe$-e9m+&h2HSeSI(G^CHf+M;JGnB~QRxrMWp_y#f|NW40PRkzQoBJMg;1K1a2 zbujl#_yq9E?kMLj#Sl<#ZCoZIMvjT=14lr)uS}93Oixt>`F?A-r$Fqh?$@$E&7F8g zV{f9VBpsZXU`9cM&{W;*T+GB|D6<73uYjko+ymE$4g4i1E!aLM{2l%VQTg){#+syd z#5~Fu`{crnKjs>Ac@_j*6f}~(!MJa7xe7AyO)eSbnUT&v3MCJ99X~#H^io*enc68r z)oaQ=o`K_DdtASi9rfv9Nv(7VFfN^rt3sul*J;aoFSt>@;A3gy5@F99MFfQkJ%gH< z#l&;=lus9lsJ!ElYqvY4$=8HI+RKrHf;B>9u`ZkqP;b-ZckAy?#D2Q`%i9b&da-|c5N*VaI^{w4Q&%ke$ zRukdh+~NWc*yQ@Lbzl7s*J}k>(rGeD1{KTcPvJXP#_k-5sguiI%7G7n&}x0hfxjv&KY>T zmzUO<4P#_WrkKCd8B}s`mPa9;qM8@{H-kI3xtB{+_sugF|J<4. + */ + +#ifndef _UWP_FUNC_H +#define _UWP_FUNC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern char uwp_dir_install[PATH_MAX_LENGTH]; +extern char uwp_dir_data[PATH_MAX_LENGTH]; +extern char uwp_device_family[128]; + +void* uwp_get_corewindow(void); + +#ifdef __cplusplus +} +#endif + +#endif _UWP_FUNC_H diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp new file mode 100644 index 0000000000..7e3f132228 --- /dev/null +++ b/uwp/uwp_main.cpp @@ -0,0 +1,479 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Krzysztof Haładyn + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include "uwp_main.h" +#include +#include +#include +#include +#include +#include +#include +#include "uwp_func.h" + +#include + +using namespace RetroArchUWP; + +using namespace concurrency; +using namespace Windows::ApplicationModel; +using namespace Windows::ApplicationModel::Core; +using namespace Windows::ApplicationModel::Activation; +using namespace Windows::UI::Core; +using namespace Windows::UI::Input; +using namespace Windows::UI::ViewManagement; +using namespace Windows::System; +using namespace Windows::System::Profile; +using namespace Windows::Foundation; +using namespace Windows::Graphics::Display; + +char uwp_dir_install[PATH_MAX_LENGTH]; +char uwp_dir_data[PATH_MAX_LENGTH]; +char uwp_device_family[128]; + +// Some keys are unavailable in the VirtualKey enum (wtf) but the old-style constants work +const struct rarch_key_map rarch_key_map_uwp[] = { + { (unsigned int)VirtualKey::Back, RETROK_BACKSPACE }, + { (unsigned int)VirtualKey::Tab, RETROK_TAB }, + { (unsigned int)VirtualKey::Clear, RETROK_CLEAR }, + { (unsigned int)VirtualKey::Enter, RETROK_RETURN }, + { (unsigned int)VirtualKey::Pause, RETROK_PAUSE }, + { (unsigned int)VirtualKey::Escape, RETROK_ESCAPE }, + { (unsigned int)VirtualKey::ModeChange, RETROK_MODE }, + { (unsigned int)VirtualKey::Space, RETROK_SPACE }, + { (unsigned int)VirtualKey::PageUp, RETROK_PAGEUP }, + { (unsigned int)VirtualKey::PageDown, RETROK_PAGEDOWN }, + { (unsigned int)VirtualKey::End, RETROK_END }, + { (unsigned int)VirtualKey::Home, RETROK_HOME }, + { (unsigned int)VirtualKey::Left, RETROK_LEFT }, + { (unsigned int)VirtualKey::Up, RETROK_UP }, + { (unsigned int)VirtualKey::Right, RETROK_RIGHT }, + { (unsigned int)VirtualKey::Down, RETROK_DOWN }, + { (unsigned int)VirtualKey::Print, RETROK_PRINT }, + { (unsigned int)VirtualKey::Insert, RETROK_INSERT }, + { (unsigned int)VirtualKey::Delete, RETROK_DELETE }, + { (unsigned int)VirtualKey::Help, RETROK_HELP }, + { (unsigned int)VirtualKey::Number0, RETROK_0 }, + { (unsigned int)VirtualKey::Number1, RETROK_1 }, + { (unsigned int)VirtualKey::Number2, RETROK_2 }, + { (unsigned int)VirtualKey::Number3, RETROK_3 }, + { (unsigned int)VirtualKey::Number4, RETROK_4 }, + { (unsigned int)VirtualKey::Number5, RETROK_5 }, + { (unsigned int)VirtualKey::Number6, RETROK_6 }, + { (unsigned int)VirtualKey::Number7, RETROK_7 }, + { (unsigned int)VirtualKey::Number8, RETROK_8 }, + { (unsigned int)VirtualKey::Number9, RETROK_9 }, + { (unsigned int)VirtualKey::A, RETROK_a }, + { (unsigned int)VirtualKey::B, RETROK_b }, + { (unsigned int)VirtualKey::C, RETROK_c }, + { (unsigned int)VirtualKey::D, RETROK_d }, + { (unsigned int)VirtualKey::E, RETROK_e }, + { (unsigned int)VirtualKey::F, RETROK_f }, + { (unsigned int)VirtualKey::G, RETROK_g }, + { (unsigned int)VirtualKey::H, RETROK_h }, + { (unsigned int)VirtualKey::I, RETROK_i }, + { (unsigned int)VirtualKey::J, RETROK_j }, + { (unsigned int)VirtualKey::K, RETROK_k }, + { (unsigned int)VirtualKey::L, RETROK_l }, + { (unsigned int)VirtualKey::M, RETROK_m }, + { (unsigned int)VirtualKey::N, RETROK_n }, + { (unsigned int)VirtualKey::O, RETROK_o }, + { (unsigned int)VirtualKey::P, RETROK_p }, + { (unsigned int)VirtualKey::Q, RETROK_q }, + { (unsigned int)VirtualKey::R, RETROK_r }, + { (unsigned int)VirtualKey::S, RETROK_s }, + { (unsigned int)VirtualKey::T, RETROK_t }, + { (unsigned int)VirtualKey::U, RETROK_u }, + { (unsigned int)VirtualKey::V, RETROK_v }, + { (unsigned int)VirtualKey::W, RETROK_w }, + { (unsigned int)VirtualKey::X, RETROK_x }, + { (unsigned int)VirtualKey::Y, RETROK_y }, + { (unsigned int)VirtualKey::Z, RETROK_z }, + { (unsigned int)VirtualKey::LeftWindows, RETROK_LSUPER }, + { (unsigned int)VirtualKey::RightWindows, RETROK_RSUPER }, + { (unsigned int)VirtualKey::Application, RETROK_MENU }, + { (unsigned int)VirtualKey::NumberPad0, RETROK_KP0 }, + { (unsigned int)VirtualKey::NumberPad1, RETROK_KP1 }, + { (unsigned int)VirtualKey::NumberPad2, RETROK_KP2 }, + { (unsigned int)VirtualKey::NumberPad3, RETROK_KP3 }, + { (unsigned int)VirtualKey::NumberPad4, RETROK_KP4 }, + { (unsigned int)VirtualKey::NumberPad5, RETROK_KP5 }, + { (unsigned int)VirtualKey::NumberPad6, RETROK_KP6 }, + { (unsigned int)VirtualKey::NumberPad7, RETROK_KP7 }, + { (unsigned int)VirtualKey::NumberPad8, RETROK_KP8 }, + { (unsigned int)VirtualKey::NumberPad9, RETROK_KP9 }, + { (unsigned int)VirtualKey::Multiply, RETROK_KP_MULTIPLY }, + { (unsigned int)VirtualKey::Add, RETROK_KP_PLUS }, + { (unsigned int)VirtualKey::Subtract, RETROK_KP_MINUS }, + { (unsigned int)VirtualKey::Decimal, RETROK_KP_PERIOD }, + { (unsigned int)VirtualKey::Divide, RETROK_KP_DIVIDE }, + { (unsigned int)VirtualKey::F1, RETROK_F1 }, + { (unsigned int)VirtualKey::F2, RETROK_F2 }, + { (unsigned int)VirtualKey::F3, RETROK_F3 }, + { (unsigned int)VirtualKey::F4, RETROK_F4 }, + { (unsigned int)VirtualKey::F5, RETROK_F5 }, + { (unsigned int)VirtualKey::F6, RETROK_F6 }, + { (unsigned int)VirtualKey::F7, RETROK_F7 }, + { (unsigned int)VirtualKey::F8, RETROK_F8 }, + { (unsigned int)VirtualKey::F9, RETROK_F9 }, + { (unsigned int)VirtualKey::F10, RETROK_F10 }, + { (unsigned int)VirtualKey::F11, RETROK_F11 }, + { (unsigned int)VirtualKey::F12, RETROK_F12 }, + { (unsigned int)VirtualKey::F13, RETROK_F13 }, + { (unsigned int)VirtualKey::F14, RETROK_F14 }, + { (unsigned int)VirtualKey::F15, RETROK_F15 }, + { (unsigned int)VirtualKey::NumberKeyLock, RETROK_NUMLOCK }, + { (unsigned int)VirtualKey::Scroll, RETROK_SCROLLOCK }, + { (unsigned int)VirtualKey::LeftShift, RETROK_LSHIFT }, + { (unsigned int)VirtualKey::RightShift, RETROK_RSHIFT }, + { (unsigned int)VirtualKey::LeftControl, RETROK_LCTRL }, + { (unsigned int)VirtualKey::RightControl, RETROK_RCTRL }, + { (unsigned int)VirtualKey::LeftMenu, RETROK_LALT }, + { (unsigned int)VirtualKey::RightMenu, RETROK_RALT }, + { VK_RETURN, RETROK_KP_ENTER }, + { (unsigned int)VirtualKey::CapitalLock, RETROK_CAPSLOCK }, + { VK_OEM_1, RETROK_SEMICOLON }, + { VK_OEM_PLUS, RETROK_EQUALS }, + { VK_OEM_COMMA, RETROK_COMMA }, + { VK_OEM_MINUS, RETROK_MINUS }, + { VK_OEM_PERIOD, RETROK_PERIOD }, + { VK_OEM_2, RETROK_SLASH }, + { VK_OEM_3, RETROK_BACKQUOTE }, + { VK_OEM_4, RETROK_LEFTBRACKET }, + { VK_OEM_5, RETROK_BACKSLASH }, + { VK_OEM_6, RETROK_RIGHTBRACKET }, + { VK_OEM_7, RETROK_QUOTE }, + { 0, RETROK_UNKNOWN } +}; + +// The main function is only used to initialize our IFrameworkView class. +[Platform::MTAThread] +int main(Platform::Array^) +{ + Platform::String^ install_dir = Windows::ApplicationModel::Package::Current->InstalledLocation->Path + L"\\"; + wcstombs(uwp_dir_install, install_dir->Data(), PATH_MAX_LENGTH); + Platform::String^ data_dir = Windows::Storage::ApplicationData::Current->LocalFolder->Path + L"\\"; + wcstombs(uwp_dir_data, data_dir->Data(), PATH_MAX_LENGTH); + + wcstombs(uwp_device_family, AnalyticsInfo::VersionInfo->DeviceFamily->Data(), 128); + + RARCH_LOG("Data dir: %ls\n", data_dir->Data()); + RARCH_LOG("Install dir: %ls\n", install_dir->Data()); + + auto direct3DApplicationSource = ref new Direct3DApplicationSource(); + CoreApplication::Run(direct3DApplicationSource); + return 0; +} + +IFrameworkView^ Direct3DApplicationSource::CreateView() +{ + return ref new App(); +} + +App^ App::m_instance; + +App::App() : + m_initialized(false), + m_windowClosed(false), + m_windowVisible(true), + m_windowFocused(true), + m_windowResized(false) +{ + m_instance = this; +} + +// The first method called when the IFrameworkView is being created. +void App::Initialize(CoreApplicationView^ applicationView) +{ + // Register event handlers for app lifecycle. This example includes Activated, so that we + // can make the CoreWindow active and start rendering on the window. + applicationView->Activated += + ref new TypedEventHandler(this, &App::OnActivated); + + CoreApplication::Suspending += + ref new EventHandler(this, &App::OnSuspending); + + CoreApplication::Resuming += + ref new EventHandler(this, &App::OnResuming); +} + +// Called when the CoreWindow object is created (or re-created). +void App::SetWindow(CoreWindow^ window) +{ + window->SizeChanged += + ref new TypedEventHandler(this, &App::OnWindowSizeChanged); + + window->VisibilityChanged += + ref new TypedEventHandler(this, &App::OnVisibilityChanged); + + window->Activated += + ref new TypedEventHandler(this, &App::OnWindowActivated); + + window->Closed += + ref new TypedEventHandler(this, &App::OnWindowClosed); + + window->KeyDown += + ref new TypedEventHandler(this, &App::OnKeyDown); + + window->KeyUp += + ref new TypedEventHandler(this, &App::OnKeyUp); + + DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); + + currentDisplayInformation->DpiChanged += + ref new TypedEventHandler(this, &App::OnDpiChanged); + + currentDisplayInformation->OrientationChanged += + ref new TypedEventHandler(this, &App::OnOrientationChanged); + + DisplayInformation::DisplayContentsInvalidated += + ref new TypedEventHandler(this, &App::OnDisplayContentsInvalidated); + + Windows::UI::Core::SystemNavigationManager::GetForCurrentView()->BackRequested += + ref new EventHandler(this, &App::OnBackRequested); +} + +// Initializes scene resources, or loads a previously saved app state. +void App::Load(Platform::String^ entryPoint) +{ + int ret = rarch_main(NULL, NULL, NULL); + if (ret != 0) + { + RARCH_ERR("Init failed\n"); + CoreApplication::Exit(); + return; + } + input_keymaps_init_keyboard_lut(rarch_key_map_uwp); // TODO (krzys_h): move this to the input driver + m_initialized = true; +} + +// This method is called after the window becomes active. +void App::Run() +{ + if (!m_initialized) + { + RARCH_WARN("Initialization failed, so not running\n"); + return; + } + + bool x = false; + while (true) + { + CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent); + + unsigned sleep_ms = 0; + int ret = runloop_iterate(&sleep_ms); + + if (ret == 1 && sleep_ms > 0) + retro_sleep(sleep_ms); + + task_queue_check(); + + if (!x) + { + /* HACK: I have no idea why is this necessary but it is required to get proper scaling on Xbox * + * Perhaps PreferredLaunchViewSize is broken and we need to wait until the app starts to call TryResizeView */ + m_windowResized = true; + x = true; + } + + if (ret == -1) + break; + } +} + +// Required for IFrameworkView. +// Terminate events do not cause Uninitialize to be called. It will be called if your IFrameworkView +// class is torn down while the app is in the foreground. +void App::Uninitialize() +{ + main_exit(NULL); +} + +// Application lifecycle event handlers. + +void App::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args) +{ + // Run() won't start until the CoreWindow is activated. + CoreWindow::GetForCurrentThread()->Activate(); +} + +void App::OnSuspending(Platform::Object^ sender, SuspendingEventArgs^ args) +{ + // Save app state asynchronously after requesting a deferral. Holding a deferral + // indicates that the application is busy performing suspending operations. Be + // aware that a deferral may not be held indefinitely. After about five seconds, + // the app will be forced to exit. + SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral(); + + create_task([this, deferral]() + { + // TODO: Maybe creating a save state here would be a good idea? + + deferral->Complete(); + }); +} + +void App::OnResuming(Platform::Object^ sender, Platform::Object^ args) +{ + // Restore any data or state that was unloaded on suspend. By default, data + // and state are persisted when resuming from suspend. Note that this event + // does not occur if the app was previously terminated. +} + +void App::OnBackRequested(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args) +{ + /* Prevent the B controller button on Xbox One from quitting the app */ + args->Handled = true; +} + +// Window event handlers. + +void App::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args) +{ + m_windowResized = true; +} + +void App::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ args) +{ + m_windowVisible = args->Visible; +} + +void App::OnWindowActivated(CoreWindow^ sender, WindowActivatedEventArgs^ args) +{ + m_windowFocused = args->WindowActivationState != CoreWindowActivationState::Deactivated; +} + +void App::OnKeyDown(CoreWindow^ sender, KeyEventArgs^ args) +{ + OnKey(sender, args, true); +} + +void App::OnKeyUp(CoreWindow^ sender, KeyEventArgs^ args) +{ + OnKey(sender, args, false); +} + +void App::OnKey(CoreWindow^ sender, KeyEventArgs^ args, bool down) +{ + uint16_t mod = 0; + if ((sender->GetKeyState(VirtualKey::Shift) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) + mod |= RETROKMOD_SHIFT; + if ((sender->GetKeyState(VirtualKey::Control) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) + mod |= RETROKMOD_CTRL; + if ((sender->GetKeyState(VirtualKey::Menu) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) + mod |= RETROKMOD_ALT; + if ((sender->GetKeyState(VirtualKey::CapitalLock) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) + mod |= RETROKMOD_CAPSLOCK; + if ((sender->GetKeyState(VirtualKey::Scroll) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) + mod |= RETROKMOD_SCROLLOCK; + if ((sender->GetKeyState(VirtualKey::LeftWindows) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked || + (sender->GetKeyState(VirtualKey::RightWindows) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) + mod |= RETROKMOD_META; + + unsigned keycode = input_keymaps_translate_keysym_to_rk((unsigned)args->VirtualKey); + + input_keyboard_event(down, keycode, 0, mod, RETRO_DEVICE_KEYBOARD); +} + +void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args) +{ + m_windowClosed = true; +} + +// DisplayInformation event handlers. + +void App::OnDpiChanged(DisplayInformation^ sender, Object^ args) +{ + m_windowResized = true; +} + +void App::OnOrientationChanged(DisplayInformation^ sender, Object^ args) +{ + m_windowResized = true; +} + +void App::OnDisplayContentsInvalidated(DisplayInformation^ sender, Object^ args) +{ + // Probably can be ignored? +} + +// Taken from DirectX UWP samples - on Xbox, everything is scaled 200% so getting the DPI calculation correct is crucial +static inline float ConvertDipsToPixels(float dips, float dpi) +{ + static const float dipsPerInch = 96.0f; + return floorf(dips * dpi / dipsPerInch + 0.5f); +} + +// Implement UWP equivalents of various win32_* functions +extern "C" { + + bool win32_has_focus(void) + { + return App::GetInstance()->IsWindowFocused(); + } + + bool win32_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) + { + if (App::GetInstance()->IsInitialized()) + { + if (fullscreen != ApplicationView::GetForCurrentView()->IsFullScreenMode) + { + if (fullscreen) + ApplicationView::GetForCurrentView()->TryEnterFullScreenMode(); + else + ApplicationView::GetForCurrentView()->ExitFullScreenMode(); + } + ApplicationView::GetForCurrentView()->TryResizeView(Size(width, height)); + } + else + { + /* In case the window is not activated yet, TryResizeView will fail and we have to set the initial parameters instead */ + /* Note that these are preserved after restarting the app and used for the UWP splash screen size (!), so they should be set only during init and not changed afterwards */ + ApplicationView::PreferredLaunchViewSize = Size(width, height); + ApplicationView::PreferredLaunchWindowingMode = fullscreen ? ApplicationViewWindowingMode::FullScreen : ApplicationViewWindowingMode::PreferredLaunchViewSize; + } + + /* Setting the window size may sometimes fail "because UWP" + * (i.e. we are on device with no windows, or Windows sandbox decides the window can't be that small) + * so in case resizing fails we just send a resized event back to RetroArch with old size + * (and report success because otherwise it bails out hard about failing to set video mode) + */ + App::GetInstance()->SetWindowResized(); + return true; + } + + void win32_show_cursor(bool state) + { + CoreWindow::GetForCurrentThread()->PointerCursor = state ? ref new CoreCursor(CoreCursorType::Arrow, 0) : nullptr; + } + + void win32_check_window(bool *quit, bool *resize, unsigned *width, unsigned *height) + { + *quit = App::GetInstance()->IsWindowClosed(); + *resize = App::GetInstance()->CheckWindowResized(); + if (*resize) + { + float dpi = DisplayInformation::GetForCurrentView()->LogicalDpi; + *width = ConvertDipsToPixels(CoreWindow::GetForCurrentThread()->Bounds.Width, dpi); + *height = ConvertDipsToPixels(CoreWindow::GetForCurrentThread()->Bounds.Height, dpi); + } + } + + void* uwp_get_corewindow(void) + { + return (void*)CoreWindow::GetForCurrentThread(); + } +} diff --git a/uwp/uwp_main.h b/uwp/uwp_main.h new file mode 100644 index 0000000000..9d359e6e1a --- /dev/null +++ b/uwp/uwp_main.h @@ -0,0 +1,82 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Krzysztof Haładyn + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#pragma once + +#include "uwp_main.h" + +namespace RetroArchUWP +{ + // Main entry point for our app. Connects the app with the Windows shell and handles application lifecycle events. + ref class App sealed : public Windows::ApplicationModel::Core::IFrameworkView + { + public: + App(); + + // IFrameworkView methods. + virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView^ applicationView); + virtual void SetWindow(Windows::UI::Core::CoreWindow^ window); + virtual void Load(Platform::String^ entryPoint); + virtual void Run(); + virtual void Uninitialize(); + + protected: + // Application lifecycle event handlers. + void OnActivated(Windows::ApplicationModel::Core::CoreApplicationView^ applicationView, Windows::ApplicationModel::Activation::IActivatedEventArgs^ args); + void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ args); + void OnResuming(Platform::Object^ sender, Platform::Object^ args); + + void OnBackRequested(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args); + + // Window event handlers. + void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args); + void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args); + void OnWindowClosed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::CoreWindowEventArgs^ args); + void OnWindowActivated(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowActivatedEventArgs^ args); + void OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args); + void OnKeyUp(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args); + + // DisplayInformation event handlers. + void OnDpiChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); + void OnOrientationChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); + void OnDisplayContentsInvalidated(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); + + public: + bool IsInitialized() { return m_initialized; } + bool IsWindowClosed() { return m_windowClosed; } + bool IsWindowVisible() { return m_windowVisible; } + bool IsWindowFocused() { return m_windowFocused; } + bool CheckWindowResized() { bool resized = m_windowResized; m_windowResized = false; return resized; } + void SetWindowResized() { m_windowResized = true; } + static App^ GetInstance() { return m_instance; } + + private: + void OnKey(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args, bool down); + + private: + bool m_initialized; + bool m_windowClosed; + bool m_windowVisible; + bool m_windowFocused; + bool m_windowResized; + static App^ m_instance; + }; +} + +ref class Direct3DApplicationSource sealed : Windows::ApplicationModel::Core::IFrameworkViewSource +{ +public: + virtual Windows::ApplicationModel::Core::IFrameworkView^ CreateView(); +}; diff --git a/verbosity.c b/verbosity.c index 9db900e8e4..7a9cfccbd5 100644 --- a/verbosity.c +++ b/verbosity.c @@ -37,6 +37,11 @@ #include #endif +#if _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include #include #include @@ -60,7 +65,11 @@ * will write to this file. */ static FILE *log_file_fp = NULL; static void* log_file_buf = NULL; +#if _DEBUG +static bool main_verbosity = true; +#else static bool main_verbosity = false; +#endif static bool log_file_initialized = false; #ifdef NXLINK @@ -193,7 +202,7 @@ void RARCH_LOG_V(const char *tag, const char *fmt, va_list ap) #else { -#ifdef HAVE_QT +#if defined(HAVE_QT) || defined(__WINRT__) char buffer[1024]; #endif #ifdef HAVE_FILE_LOGGER @@ -202,7 +211,7 @@ void RARCH_LOG_V(const char *tag, const char *fmt, va_list ap) FILE *fp = stderr; #endif -#ifdef HAVE_QT +#if defined(HAVE_QT) || defined(__WINRT__) buffer[0] = '\0'; vsnprintf(buffer, sizeof(buffer), fmt, ap); @@ -212,7 +221,13 @@ void RARCH_LOG_V(const char *tag, const char *fmt, va_list ap) fflush(fp); } +#if defined(HAVE_QT) ui_companion_driver_log_msg(buffer); +#endif + +#if defined(__WINRT__) + OutputDebugStringA(buffer); +#endif #else #if defined(NXLINK) && !defined(HAVE_FILE_LOGGER) if (nxlink_connected) From 6038060cd7e74df4cb36c50460ce9b9654c1281c Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 28 Dec 2018 19:22:13 +0100 Subject: [PATCH 040/116] Update appx manifest and icons These were generated using Visual Studio icon generation tools --- .../Assets/LargeTile.scale-100.png | Bin 0 -> 5183 bytes .../Assets/LargeTile.scale-200.png | Bin 0 -> 10373 bytes .../Assets/LargeTile.scale-400.png | Bin 0 -> 24747 bytes .../Assets/LockScreenLogo.scale-200.png | Bin 1430 -> 0 bytes .../Assets/SmallTile.scale-100.png | Bin 0 -> 1425 bytes .../Assets/SmallTile.scale-200.png | Bin 0 -> 2535 bytes .../Assets/SmallTile.scale-400.png | Bin 0 -> 4838 bytes .../Assets/SplashScreen.scale-100.png | Bin 0 -> 9276 bytes .../Assets/SplashScreen.scale-200.png | Bin 7700 -> 20707 bytes .../Assets/SplashScreen.scale-400.png | Bin 0 -> 49647 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 2631 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 2937 -> 4927 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 10016 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 398 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 4285 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 942 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1199 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 1647 -> 2350 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 4312 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 541 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 0 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 6051 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1320 bytes pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.png | Bin 1451 -> 0 bytes .../Assets/StoreLogo.scale-100.png | Bin 0 -> 1058 bytes .../Assets/StoreLogo.scale-200.png | Bin 0 -> 1886 bytes .../Assets/StoreLogo.scale-400.png | Bin 0 -> 3394 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 0 -> 4734 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 3204 -> 9276 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 0 -> 20707 bytes pkg/msvc/msvc-2017-UWP/Package.appxmanifest | 42 ++----- .../RetroArch-msvc2017-UWP.vcxproj | 40 +++++-- .../RetroArch-msvc2017-UWP.vcxproj.filters | 110 ++++++++++++++---- 33 files changed, 126 insertions(+), 66 deletions(-) create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-400.png delete mode 100644 pkg/msvc/msvc-2017-UWP/Assets/LockScreenLogo.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-400.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-400.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-400.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-400.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-16.png delete mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-256.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-48.png delete mode 100644 pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-200.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-400.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-100.png create mode 100644 pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-400.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-100.png b/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..f73146308640b5db3c360c1fc28195303821cd46 GIT binary patch literal 5183 zcmds5_g7Qfwhou8AV>)aDj2H5K@3t%Xadr~h%`YV2nLlXB*9P=LWxR1P!uaIbOjNF zL;@kws~qW40|Zc%(4-R}wA}4^|chTNcf-7Cn@DsKYY(MLGq~<(J4~7dd?b4uCV6sShcK? ze+y2=^b{P`by}!;jZ^qKQmYJA%=oo7IlgCcj zRp-6Q5gy^tN}aj7zt_9{_^1^-@2(>vKW2PQ7kS`DqP}*&`VTtHtA# zFx=Y!@kV<09LOQl2WODDis?@ZjtYT zW0(#zff`;lX%Q=5RiQf@z7&w?tngNBgQ_v;%#v{smrm9z3)uR%|ey)Fy67%UY-p1s1 zecM?3ULO^u1OI$?-W{%0k9sK+=^eK{TS(cDK2E7#chBu|W(Bzsel$cUx=Ig>-WyM^ zUTP42)8&&OZ<3L&AIQ!lTC;i@?b{v%PIcatkK9Dj0p)z=#?~AKZEvz0w9XmyDlaY3 zJXEGT7V z?55AQLxN{M(8|g*0}%qKz#F{1-6$Q=eZ?P@a55$DBfDo8bGS^S4VLrFYLIQsy~VNm za4ZyoKr}(Yqz*77StgOV_Rac@vAv=LFpSh$Q=|oUgpPeZR3_2*Ym}>Fu?$Q<;Fk^D&=5Hj7>nEyB%2S9=OKDhQc})mzSq2^ zQ%FyE7t}qgy%ndLk-rnVB{!3YfHXmIq>c}7trJ9jur6KRp5e>Q^^-#_^2D?zQzV*_ zdJEB#Pu}-dygUR9Z+UE(>+)#kk(j((ds-0t@Tw{D9wl|*zHc#n*2nZ{6Z9gfLkq$% zSQ-zVN^ce5eY)OKqM8{VK;_f>5=CF|ESvCoVA&_s1T`jg=#O6L){!h2yWpTXMwl!5 z{XjtO@5nvwRKDnNMOgn0Zg1`>a5+PqF4uix5^=hEZ6wg5?c~Jz-^vLG_wF4Oz>Ze? z=8*TPXKLJxV>CxmIi!rG8X%{&>Pj9GZ?;RymDtKEqFuHN+Hgi14qLG%&M^t^LVV2n zX^?q*Z#%Xt!zhXena%2#t2A)z%|#z}R2MH_5=3_W9;*(!v+fjZoSQXmyWU(wDHi)f zXqe&Vupcj6co@}d>WD_v0h2z~N>EW%^(R;k8kjE?WWMEj3XrE4T_?Y;?8EYZ2I7Mz zPu$T$mg7dh+aF%5E(pw18Kyf`&DxGKTz0D_dDXbFQcjP`(7GPzT5uR z>#@Kf9QRk6Q5b#2?v1zS40r#dIqHmdR_F5_8W5qQwY0~`{-i~#t;F$7>a(vbmd7Mj z>Zf@6eCSj192J&A5$QdHYaiUY9ct60tr9$iX`amI5WIgFVC<&+8qdVZu9oecWMlRf zCZ9>CxlvT5iyM8kykzrmtYivjkSgE?04cPxPZ>uTBIL<%Y_b9Vdd+}WAy$(fYul?& z25fzYV+K~sPz6m-x$d<^(h|32B%kP$C;tJk?SnCDvbt=)EBa_;vF(MAY>ew%+=CHn z84Pf8fd$90uFUy0COC@G?YzBVXqvnIEse&3b-A;TL3BK;FkEUJu z2W{t19)@2eGZu|G^ce95%v@{zdyXAncH8YS!WT8i8$&VK#iHwWVS;^H`IMKc7m zz@zkHwqN7HC*X{_eTtE%Hy_M1L zCKg_>l7;+Vf29h-S+Ery=SEOSs0nm9oBp-yFEzt=znfA zlw7KhE~I5VXGKGQg=3GbQ&71jf%M7Nrg!uD$bJs#mj)(#%1<3TUNib@E@;>1_$~X< zq?4y5U(u&9E`ySf3#rZ8UdZB3!gu88^S|?xgS60vB^eGL(a=0@s-{{ zedG{_G;tF1sbf$N+31@}vT%K3n-oZYGxx2dE+_=K3$e!sC^QO`xuXm z)gKAqy2+wwPE#fJtFe=dhj5>BAGSHfYwPH|0`mNq-*cltT5-ddyc?e^uwN?|LLOw1 ziaNvXOg68#JS(HhTssqONAyMohaTfUj4Cwr;=g15s_m!X7hhdGm|n381L>{?=+7!) z+G!wJ5>%;b?C7<|wlpZ0s^!K1`wGtdfZ9JQCX{i^&KT1^2ttye|B6VV6jib4gu{7E zTraXa>S}MtKw}LtB2=8CiAES;B2p7CO0jTSMruvWe$|!7|MhhR`jIA*$^(Ln_Lp&Z&TZJNY;Se&DF? zLT3)tz|Syr<;L{Qifl#dE5dB@@y!u>+zEC8EqgJUw;6I4OA4Cd%TSiyT z^c#$g>E~!*dXD3gPJ4BV9@AT@BvPyg@?0ZDiUP}cxT(%`6<(%+l_V)JVbQgJ( z$f`A>ALl$xz4lq;l!M*rMiooepXw$zH@7GAy?D@au~DI=-7`5OUkMoGoPd~IyAK*I zODsyB?nj&Kt~tM=AtW1KktD=a^h%)ZC^5HE{DD#o<+JQTG^KXK*Q^Bh`| zvD|ZmHYe68oXRvhn?eHu)YItPyBMm-Hy74`0a883hcmn(^KOG{7ZS|PPa$i}kbzoY z`fY;D$Aee}OyMmZ+)W?J$Ep2vQIV=(hmG`!;(1x=@j-8kI=ON^FdbG3F4uOXu?q7L z_BnUWwft#%l0FH@D!~!KM7+8rtgYI&Sw}c|-{=Lj8^Pyc^Y52NIJ^?(#FeI^3w@_H z3Zxw8es(-`1j-+2T}hG=Zdnm?qAbF^J^-kX_;H#3((yUu1CPlXC!o|8s0OL%VFi%Y z0L*4#UdnJdYiaHj0^KUTRoVh&cYHQuo-B|lcdP{sg!KnGaDL1TWdGyMC$2^j0_A|9c5YhQzFuRC6STlm`N%S8;gI)u&T z@}1k4rOz(l5o*3>OqnCnx^hqX8h|oGQecQMV;Yx zt&mye7woLs4_M47I)KtCb!C0rC|C~quzpBa^5dAemDBLg#DH!gQU{aDa9ebdr1&>U z2)F5yUR+vdgvO?d)1^-(0OnxJdse4DQNu-a<02BsN%;p*ezss;U?Fm{@U$$$M9L49 zPYd|fL%?J}hs*slZ}&YObbZ2g`l8%6ct_GcjOA^~bT2_Q#?;rq+jegnAeDVl(+ArE z$j_$LJhaX_H;oJdz7jn?2b>7w^k0suRXm89=4<|`4i1a|L!x;Fce(DoXOyb~2C9sU zeYycKm;>R>Pi=_m*dG){4UT6hl8n=V0Sn(}WUEIAyFZ}rGh=nr zYk#Uky|lT z%f}2p4wxPb*3FV@kk+4wImv8XS8qrJO~h!&4vUbW;3g42MPFUuAf<@A5|<@n&6F@_ zIVkuR0zFE&x?w?NPAsw(Pp88h5;Z3V>@Bco8WQy;22NWP9cy5N@T&<~F6PWM1zaS! zY*vu0+$6Fog$j&ea2tl)jYu7e6KsCR!UU?mC9B7(FI5rq3|xK&T*ek82R1<=|Lzb) z&GAi0o84$yhyre2$#+xAjg@t>U}{R>&3y%B&nx0=Y?r8$ z0_{X|3g4u-?rU(P7UV33Yr0~NuTzL@5_vnFEc(ykT7$Q!`f^dnUjl|5MkB>z1Huk2gfN?aJ9YFTW{9(0UV!GzA#rlh70r}BOd z)gesnBA&=PRx0v_OoI1zxH|vy%1f`88OpfZemXePabpALHX{49M^(tOSN33u$0d|x zGnPQuBCgJHoR8i+|LRf`ly`K$=YipODXAJJ*A1N2Ee^v|fP0rNlbx<#zkX$|CJ-m{ z%m{~c)5}7i$fBP{(Mkik8$TKWqQv&DE}}fasL|pm-E7Zh>F(Z-c{?(ESCM#Q6A}5G zl_;-yk3G(;G^2=2{t~FG*qNHl+dpP@_2mTTX@=u-o?aJQt5Td``qlzMe+XY@%kN1O rAfTS-7EDl=hp#G-}ZPs+fJAjsD8qD8UUwTJ%!-4G>d literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..80c1425605f951b417501dd89c5330028595dc5d GIT binary patch literal 10373 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-400.png b/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..85140caac238ad74f1a97fccb245d4b30c054e5f GIT binary patch literal 24747 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LockScreenLogo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/LockScreenLogo.scale-200.png deleted file mode 100644 index 735f57adb5dfc01886d137b4e493d7e97cf13af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-100.png b/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1f5dc6a891b07f208b81f37478cf884905a2b0 GIT binary patch literal 1425 zcmV;C1#bF@P)pKLrFwIRCt{2n>k1{Nf?Gpr!&!wHQ7kbTpW!(Qbl1S1A|>qJfa`Z z&@&X3%|wJvJTnnARl!Uh`Nc$yOcb+Sk8HHJ-&(6F+n%qhrZ1IxV3?YjKB}Is`s(N& zix~=HrJaG#jFCfNlkwXwDr>?H<7t6B#EGa4ZHHi!*fo3zlmG^INZ)c;UqpZBVoLydC zvhD3{_WJtDN=r-Q$}%UhW;Hf8#@5!>SXEUOo1UKLS3Z}^1@2c}UG0jwy}e~aLqqKG z@zMP~PC<#uL4ig_M%c#22LC)iKhOI5`q=gLb-{fgW_fv;i^2YLb8}pf0JR6iC8#Jl zO-)U1`t0oN-IW9=6bdAe)2Kb&-QD~<6dX+qD|3E8p4j)~klBTW1vi6jZEYX6L7_w;RF4$|j#ucI$OlAtYtYoxlq(l;>;C>; z>0APBIra7RZW_Vy;o*T_dCU6$P{@o3yh(v`mX($98YBza-`{7Qot-?5-fn$;onPA0sjaPb)5pih{N1)~me1$8plmk#t{Fj~7X)Q_n;;NpyiFJT<2VA;s-2x3o)&`S z?jHF@K3`s5lm%(a>FDTi({jOuAjBJ))zwuu(*net@$qrxb7KFcrKNY@LB`_ZqWc-O z72C-{dUJD=_4oI?+lzdv3eu7zUoBio5hMjTanemnAjcyi2zkT{`4)LcEmRexB}a}o zqD%EQkF?| zVh-gMl*W9j5V}E^LVNn)C+M??5s0ZoSc+QD@e0B;qNk_FcRO6knVFe)BWcW&yi*Sf z)C3$ufaX0hG4WwCDoCYS$;g8I=2@VkqT+)Xbfex$qzdR|FkuBa9>zUgU0uayzu*F! zOsHkjLNN%48Y7QNA+Q)R06h={i6)Hn%E}7s?d>fp-ztP&LoOr;UArvCZ*g1~><=Mg ztO8M3w!rss5Xl0&EC^{-f6)X$P>fIo`$NRu-k$p%E&#??Q3PNwk==a|g0NQWod=;w z=mcO2)Ic;P)F6Qf)+&Njn-qxj){N+#<*lq`Z20>xOfLQO9e+EHei2Xr=v;>8% zH6W3vERq%!g&2_7BPdA;ib@Pf^qIi81w|uo;T!Nw&15$aKG-^R{hykfRY8#cH zxWoWbj&0jN<2-p-K@sHbhWe3|lh5b3Ez3H?pGCvwq7Z3~gPaS0?v!tl+J=;Ket!P1 z^OnWGXoLPN8iu#Epb{suA07z_y4hbOHxP4iaq$neky6Z2`Gfj*#QgVxz{nvmatMqZ f0wagO$RYR-pL!m0+cb6#00000NkvXXu0mjfHSwLy literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2057c7580188134ff05a155b82e37689e50715 GIT binary patch literal 2535 zcma)8c{JPEAEin#jipJoNF%7FmZ%CsGa3X*$ztnR+o3W=5vld7wpJ^WPVHezWmN4; zXOz}jZSADR*p6isA=IEqOBu{e`rq$&e&@{j{c+#tynEj}@7#CpAD2lX*@2~%q(wwT zzyv(bNjOu#LQ+DwE+3wg6b`9SynC34h)l;s`*;cV_>GCG@17_EF?TFdY`~u{&iMWzRFwf!n*ht*@r$xd_x0^omz9@PwQQHy z=Vl}ZznGQR*siZi+pDZ>Y2J@J!(D(!Z99?^wp}C0L|p_9TeWr?F?N?HCl6($6ryoQ zyHwS*W#ldCDUvK}90jI!=f9-t`$i@vI~~2fy)o1L<7QW1#mCLAM_!%O8)2cdva+tt zw#Du1$2J)pD1xs}Yv;HXjRlHBAdolx{ry+x2eZMhvK!Fc|EZ$C4kPRPoWRod{`Y89x7Gr__20>I4-40L_C4Y;#)$ zdfH)Ji!VPuGpMp_qX3Ox|7Zmym2w}d=Fj8VPg7E!vh;Sp8h{3{>9(FOOCp9 zq*r62tn^cl`1PshbAKJ~-&^aL?_eZ7u}gdE@z>g9-JB4+N2#j&^LZXjBU96pzqbNL z6OHt1vx3RV$+>s=rj}(R^yb5@t*yDy3gM`sN~j^I$JbYx;dF5Ei;8pw^&L?*4N1)yG5clV49`{mcM?A2}O+ ziPJ!v^_W>o1}oPOi{SDYvMM|JRY{oV5Ktk(Dl1}bqPC4+?xr!gJos}>&^Oe9w{NQh z;i5b9A7@&owkwfj{VvhoD9Xc@sEv=FsnisiluM;-iGa-Gg2VqpBPzJE%f@+yyn%uXWyBm++2)=Ui_A;b z4Y!1jrh=E)wvIM{G-SDx33++u{6LLo!_DpRUy(ZY4CL7dcMP+mM@4&YKN}}bagag} z`OzUI)>;Y!Hk{7W-=b&ST%9ZmeS z;>5A)B(N0HR4#tpzd(T3uVi`^v#=6g6!#1e?}GrwzU32nD_4L%2|B@n>dS>Jd{_*y zGAeo9+5)|`I<%H4r)U=~f)9&DCYV;}bcHbH10w9CWydEEa zW!lT8OBA_CN0Qzj*n(stxjFg|`e;y{L1s~wmhK?a*ArgGJC-;5;k6NxsGhfsV{)^! zgtW7e#tZV%7b4ewZL()0f<+8<$Wzgz)+VQk%$^GL@PXzfNH>k=cRI|4Q@sT{ovtBJ|TNVt0owOjIl1mTVw$X(FkLePQF`FG6OTJ9`Vl4TwH}>L(9$61cR1M`k1Y zs(ppaR4XUWwQsKT&hSl((ZhMV&X1VtFRdNc90_z*GjXUBrfuL3q)L&#UJ6QD4{zaZ zoOv#h3ef4bYcn4@sGJ2HY{~Sm#PTGv=R`LX{g!s{#?>1wueDNZ>x6kKfUWY%BiXyR zt1vyyU&Rg^&Nc5xc4=^NkSrXfvmnfA&Q2*Db}>G-a4?|D(A`vOm3Isb7B{%kDw&g$ zgIhJK9nbn=m|YZ_3A5&0uF}XXV@7q<;bSby93DM@+4BQP^zU|Aq7U1IHSfWo40``yJdi-!GOMCY@iSmWFvt%iPi*JR2VWNDtV| zcvwdMS;mEP1i()9*~BMaclKJ65>li%mFY-&N9{4`pWV(9IhLeA7bS;;%m^D^$IUGQ zEI6rjvHO8Cb3;9$W9U^Cql#6Wt=Qzy4UGONU4Q8Qo%!8xeQ+ZBCu(?1jQLi=rrs7p z#q$O6^Y0HSQ!XJ+KoKZaJBgq+664$0?D)_|l%N_m^%=u97kyp$gO!?$C}QqcSO zTJ>gLbZf+ogrr6^5yRy>yUZ<6U8cMRW3gz$@?eVnflM~>NDPonHX&We87)2bYlncf_=@f12cRt|* zeEX6y~#lp9KQdL;y<{B8-+1dtuw4X`^mb zO;EJuAx7`L8*AI-&ua2_ttK81f)i;MPo zg=2JIemLGkZ?ne*lCFV7n2P^b(-Ag-t&8>&5yKNu;()NHi4bf^xTjX%-+6LN`jm|L He=`37k9VlH literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-400.png b/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..398721a4614d8cfb708b8b951b09af10501a95e0 GIT binary patch literal 4838 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-100.png b/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..23acbe613d6b15496736130401c88315cb993939 GIT binary patch literal 9276 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 NU74j=`hT-Y{|o$A5k3F_ literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png index 023e7f1feda78d5100569825acedfd213a0d84e9..5fb2eb78fc37dd1b30e2413d4d9948a5e9591890 100644 GIT binary patch literal 20707 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 M=|j@_FHG|P0q81#+h5>eArRq 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 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-400.png b/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..62d2b0911b62fb7eb7e57f0a01afc5645fa85e9c GIT binary patch literal 49647 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png index af49fec1a5484db1d52a7f9b5ec90a27c7030186..22ebaab85605ef29271f142d9a8d8a21feabadb0 100644 GIT binary patch literal 4927 zcmdT|`8U-6_a7q5WUZmXpdy)Rgb+fq6hiOHn8r4d%-fPOma>Ori&8@rGKw<8%rFvR z8ew8AGh`@uG$_yy@-&^VAReqv_-;Y*QU6k{HVAIOeBQ_BbiHT2rZya|4q(LAi3S;t#Nbh?mV z`pZQ5+b4x@gWx#OzIKG<$Z>SaJ@bew+hj)*Yup##titO7ts$*TFG%K^H7g6V4z~8y zs{VW)blZ77`{m_|LiJvSzI)bHknl0rAHyLW9| zq?+!@iB`U~HkBsz_Vy0pA6+BuXmQbzS6b44WvY?AcW6~rTh}J*f0#i?i#B>U!!yLH zML}l&WS@JZn$qatrq`dKj0#zq;oO8!c}EDPMKUbxwmSFXi3AKj{n0M6YYR0Q06IJ^ zHl`j-tvbI&W`l*GaFHHz3khUec-~z4Z`D#OI45+mv0JfQ;ykLOqa#9i;@k9CMzofe*76s&7l{4cH}OrhmX6Nqbkr<35~9y?ThRf6^?i)Kz{WWBGoXG# zAX&$dGK*}6s#}1^ce;FJ>072Z8-p*ad7j=6${#qqs3vCMFSd~)fU%my@LX`?14kbD ze=n?O(`0(hxnS;x4xeJ@YV`Tl0h~dR3gU^FJmPM}m{dW3)qE|uesw5fs3T!mhN1DB zDIWn(OG``e$O-G33e*prQAw87ZSN=?d5bdGSsS$}e>nP7C&9O7J-_FZkAu2_!C*(z z@Ii*gc#F;ue0+R7K>+&T?Scy6kOV^uBmY* z6&FjM-Y1x5tmn|)%a|=6`s*)~m7Ap>RLsPS_|E;TuJ5oln)QFpN>`IUY4hgrpge@& zzK@~thn;JZSIXB?mZ=xM^E85idBVBjmkOP8gw^%GzJ=KkA zPS0%T*=d52lg15=w&qPD5~rWZRwfE(D#p_gxKDe0`r4GLxXGD8`}wK2(cpBmz{=Z z(<2HdB`Lw?Y<^CH7{k(ZxjC1W@kDg%#Yx-bl`}WbsX*-0XJrW|kBm=DFhzS`E1>Ty zqT)Zq&U>_F2UKS9zV+y%jp~m_m$W#;22WOo-k?<~pcfQSLhFkxwZv!vF+C&PgW<1_ zMwZ%)zgux(B!0{lEX@<0R~3SSDrb{&=5z?Dxp}M2>t`{N#$d+{?b2;Y#%z zj!$N+#f#L z3OW?4>Ct*9#c*SCQtrS-=u4kfbbwrmjxntkAl}YHtZ37ps~Yv!=fCKIPDqP6r$U?s z7l#yaegEnsAq2>NhGh?s(r!;da;Zkvzf+4>W6!G)Q5DXuP4ChN*UV|L>Hd_n`|el2 zTN_DKGxrVdW}^H2wspL#o@SrIiA1hor>;ydce|(oUp@1=BU&*}FXf5Y-{KDh$5MNGv;){OAE{14U{GaW{ z&^8*v@$+!iHy1As^lZ`bGOUseJiTBE);H@k0YiTYoc-e;QfKSI7EYTpuDVlLT*wSB zOMXefdsCnfe@jgCPx6#MPr*u%xSbwhhIs)CBlR|37N^k``-#(Ao_Pq4YdBsYEN7V* zoW`-I^|eyDn?xqgl4GfXa+7NkQ?qlm0~n8?}T(!niHpGiLJr3RB+nddgnRoy!tIwHJJ%i zfD>WNE!oaP7v0EDOxZ&S0Aloi5Uo9g3?MHE^<$Xuh8F6dK66$#;LR2AhRj(a-v5+< zOvfxQOPxBEwNMsDUa?p;PT%~{=%v?IE^$Dy!3>Dha=IN%4eQum`WZ6! za2IF74slst2-HYSOe|{s;ZD>=W_i&<+o*rwX0VSK5iR;r4>#H?mocyZMM$Q5h%OL0 z^z^v>dgfVXAub*%k0a@UIhLv@lQwe0M}iq;acl$XYMs{!a7Ct%~>M?w6;%bvReq5E0`NwFq$0=yAjdq(UfV&$i{Gm3J>9-DXz z&YzHEJ83sssu1$P60yl(b)bWl1J>s@_WKw$2N1C$>deAKU`zR6`Rfp}d<-qat$JA@ndEd3j67QB`MSu-+aBz?b8*sn^`t|Fb;yKPq;T1E?zUI$Z5nX2C zb=oI>!xqb9DD@U{;M~taV5N}Iu>8>mtcU@#5SC{~slvhO8;-PU=est%ZaQ@%T8?r2a%C*nR06$6xyFdowaJT;1K3CiT{~jQxKtEeYe?R8f*9v_mk25a)4g>*fY`;bjIm zEhagwY&yK|k`Y%hP5%WW^%VOgiKBb9nCJ)Qt;5v=` zRvQU>CJnMI>r_Un;eVT`GyPt8Q|deb$GKvF$q7050t6_JNidEyo+_5M76+JcAL}A< zH~Fk8&4GMx)XEYoyrYzy2+KR0bJFr*Tu#q!TlafHS9x#F$DCTj);5P`D<&44ySV|K>TapO;)q{3$u6d=$%&Ztw7gwpZt85do`%|A7 z$P`Yly9``Nu1J}>sGi4Rp1ZlBa?)OyiV*watZmQfqesvS@V(O4NhhW;79X(I!3ru! z!)$|grR3J)YXvN)FcoZfOLeExXM`9|+JSUp6Vu4%WO6T@^ZOl_j{5H03N;uRwy8v3#3gzTxeh zx^8jjL#MOemt2C0@_8K?;&@8Jpfm}BE7nA!;vDtmKU>%d-5OxQCh|>nnkL}8t0E~ zUcVYTZWbUWLaRcb7@&VikoNbPdbRiBvqiWNm`Kkitipm5{;u9=^*&u^DVUbmLg@T0^A|^km;?q@lFvpgEdU`oAs<(za^WSl#`M^hZ@XtpPjK3L|)p+x3#rRd73s?jjX6D@4V`t_Fn#k zVfZUlf1bNK@*?GY4;*c{iXL0}i8T2K6I%5o4b_w9u5|+vHP+aGT_5nmkNyuMi{=m- zi3x;q$&R-2cW~N=j6ZXGF1>A)oqBi``(7NTh{~SrD`WLL!y31%i(*HX3}`3t2571x z3Od_E%{%vC{%yH|?#8K>XJO|mXQbqp;GFllP;l-<^2aw$LX5@9Kb^$-U*DcYN9ZB? zhy;AXOCWw$spq^6P5hc?ZlO2{Dtr00?;cs>!coP@ol@-YYS zaume5IOG?H7biUuKh0H4ziKDg6&WWL+H@KScE34o*d!T9I0Vp=u4n)fq+klZcZtG# z3>_&G1v$*&%{-2hP(WYMv+arD0m$QB9sXq=SaMT+DF+RVsIlL*6-k5lplRdF08 zq=*g_Ck6^4UH5JVb~=18V^f$-U7>yyUd7DI$H#{YzRV9at3Q7Hn1peJQ%Ye*g2<6L z{8Exx0 za{D;y$Z_US(fgVC`t@~cP^_bX@^Q2gD?kjnUQI8ltPD2%ebn`E!174PV9^`Zoulw8gONHmHkRI`riS-$*!|~TJT{8(zLa!>fM2?a|Acty^3&PL z$w2B`vuEC9lpROOb=@pIo_=bs?n_hjNY~;tJ;qsD+a5aE-!%7pJrsm<$CF7)&zTbyy1FE5bU`Q17MRv`9ue$;R(@8kR;#vJ*IM0>cJIAOte!d7oRgdH zd%ySjdB6L9=gX^A6)VzH7p2l@v~3zJAMw|DFy#^)F@@F*`mqUn=Il>l)8_+ab;nOW{%+iPx z+s{Eu|&pIs)Z7{La9~?xKfyl z#43?gjEL15d4WbOZo#SiP%>DB^+BcnJ=7dHEe;r#G=tuw|ka z%q@}##Uh7;tc%L_64m(kHtw74ty%BJMb)_1)#S0j`)F8_1jF7vScpsnH=0V19bO8y zR`0SjIdCUo&=>JwMQF8KHA<{ODHTiQh}0^@5QRmCA?gOH6_H3K^-_sNB^RrdNuK-R zOO*vOrKCVvDwgUck`kF(E7j{I#iiN;b*ZdCt4m@HPA`EuEqGGf4%!K<;(=I=&Vyrw z%TwcWtxa}8mCZ%Cyf&ActJ6_$ox5z6-D!0-dvnRx6t7y3d+h6QYpKWO;8OdnvERo7 zuEf>ih5`wqY)~o@OeVt-wM?Q!>QzdGRj!bz6fzYrfw$hZfAKzr2-M+D+R>}~oT574c;_3zquHcElqKIsryILt3g8n3jcMb+j?i?-L3FpZJ z2WRVBRdDPc+G5aaYg#5hpE+6nQ|(VSoxT3|biF;BUq#==-27Xi=gihDPYP$7?=9cP zYKE$jeQ|3~_L0VG-(F~2ZPyD0=k{J4Q~h(t__{-mz_w8{JDY9{`1ouzz!Vr5!ECdE z6U~O1k8c}24V7~zzXWTV-Pe4)y}wQJS&q%H5`Fo_f_JvIU489aCX$;P`u#!I-=^4ijC2{&9!O&h>mi?9oYD=GC#%)6{GzN6nQYw+Fal50!#x^asjBBR50i`+mho*ttoqV)ubM2KD9S~k7+FR4>{29?6 z{!l6kDdyTN0YJ9LgkPWeXm|gyi@zM3?0@{&pXT12w|78&W-q!RRF)&iLCEZVH<|fR zN0fr2^t8H(>L?>K#>^+jWROLral(Qy-xoBq1U7A&DV||wClb)Otd9?(gZ|8znMF}D zf<1haWz^s0qgecz;RFGt0C-B4g`jNGHsFU+;{<%t65v^sjk^h$lmWn#B0#_)9ij&d z-~lc`A)YYExi^7sBuPM^Y|wA2g*5?`K?#7tzELQYNxGo$UB$4J8RJp1k(8Jj+~hMT zlN~>M@KTTh^--8y3PK_NZ@AC!{PT=CziBzGd+wTJ^@icH!Bd}%)g8V)%K?|c&WTUk zy}qv1C%(fjRoZ4ozC3{O%@5?)XzH35zHns$pgU*Q?fj4v?fp1Qbm+j;3l;9jam9Da zXVcKjPlQ73x78QPu|Ffm6x?`~e3oD=gl=4kYK?={kD5j~QCXU)`HSdduNNENzA*2$ zOm3PzF!lN5e*06-f1Uot67wY#{o-S1!KZ7E=!~7ynnk9_iJR#kFoNbAOT#^2Gd17F zMmvU6>lndZQGd|ax9kUoXXO+$N?|j@6qpsF&_j7YXvwo_C{JpmLw5&#e6k>atv%es z5)7r*Wvv_JkUpT}M!_o!nVlEk1Zbl=a*2hQ*<|%*K1Glj^FcF`6kTzGQ3lz~2tCc@ z&x|tj;aH&1&9HwcJBcT`;{?a+pnej;M1HO(6Z{#J!cZA04hnFl;NXA+&`=7bjW_^o zfC40u3LMG?NdPtwGl>Tq6u}*QG)}-y;)lu-_>ee3kibW(69n0$0Zy!}9rQz%*v1iO zT9_H>99yIrSPYVy6^);rR}7Yo=J_T@hi+qhTZXnVWyf;JDYm5#eYLTxr*?kiNn!+Y zQ+LUkBafNJ#rH#C(?d5^;gw9o#%daEI{mA*LHPIHPU`#|H$hD zwm>0&+kahQ)E#%~k>&5@&#Vg82H?s%71=)(soi@174pi9--2{w{1$}Sz4zGn3Du&x bht0Iza^2ykEt4(epJ78uh5nDlX8(TxzDYwP diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-400.png b/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..efe1abaff79c26362573304a0fefcdfca29a692f GIT binary patch literal 10016 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 Xa`akhB4G}E@&>zTY=J2{M~M7C5;-IJ literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b34622f9b3af1587b655a5b3dbc74498fba5e9 GIT binary patch literal 398 zcmV;90df9`P)pGKuJVFRCt`FlCg?|KoEwdo0T$FieEN zha+H6*L5N?41=z_u1n{q(`o()X_}Hu2*J#^o6*OkpdSPQG))7m)#|YVyrd*ah`_dO zA{sB%_kEH8*BFLb?!x(eCLI|1OxI9^oj|)4&jQ9ux~`i*=ERGDImn!t0`N_5x7*MA s;CNB@Hoz`z+a4zs3=imQshYp+7hz0^jHaH33;+NC07*qoM6N<$f)~fK-T(jq literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..22c0960e8ddfa8c9136bd4f6463edd84dfd7cd1c GIT binary patch literal 4285 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∨riwqg4xA*Z^HAELBRcN7O9%_;A+NEEd@<{UXh1GZECL}Q?649}IS-x9}(D08-DGHwWT52GHWr@4qKE8ccZ2<22P8C=%zWKgqH{KFD;fP@i_-ejE{xYgG-uDfK9?}luK4mN z85uH^j~J?bs40H6`)%56?1t!@L0|TcMu~TL^sro+0=`mn8tg;F_uh6_kaq&9ixyq% z9f+8VxX=}>8XLSZd-e%^OX5u&U2_bMC7zZxnUK(VQ)(B-c{_Qf*QW6+C+h}s>Vh$F zF@^UO^Up<{FWdI6Bgc}r&M$PHsLI)I%OBgcddGTh9#KZ(|ZGXQAK#s3K;9bdq{R} zC45i!#Zc$ZdnW24v$`$e`_V!;?Df;OEQ+J&b1$Bul(l|8yJXX{!Nxm%K8pf(58Fan zn6eAbNAXedl+3wNOQgy8_}|fwwr$u7+c&+USG=i7wO9GB=qRYl*g`FmoaTvy2OO%u z`UdBMdAB~-iws+AU!x(?=Qn4}vk?z+QOS&a{`(s!yCeas>Bw?CNZPMXwJ7E*g$}vr zWRw;C(1a^~u!NV%OK4@#CGWhT_2ws9!666nm=iY4b5jD;Z#eKYa;mUEul;1aO~Z8) zx1!qJpT;cVh3f0^z=1U@D3{iZq<34cHV1uiPQF=q?d-}BI_p)us99?dnzS8keoWn7fLE3tSscL&H!>sHXPrE&>XYr9m+-ezq@A21C2mD-oG)gQLejkZw?*Jix#z zZUYWy9C=7{(;pj)C8r0w^C~aG7Zy0jHz$8Kq98E8&aBBLr9 ztRSE@ruBhZeJM2_6}G6zolH@aRi(tJ&be5jBQ3-u$ti=CMISH|U%8!R$DozY>Bx6i zq|nUDOU#_h3l0DlwhxY1Uyc_BESB{4_R4OrRuLL=e-3ZW&CTS_jt;AB(Sv7+JK-8y z!hj!$Z(XdxE2CBv;oq-!$x{r7)0ceLw)Lt|4dk0lzggcGf3to_t|*&13#S)CqRC8B z1KEIV%;;^ga(Bgn5LPy!VEu~vitNi_nT*be;o+Ll@mmWE3%7oVV=R0_N<;22TUrtp zGJ);d>ZA)nH0h-|GHO`A{I$+hkk9v|mOMgFvs>T3eXGInp6y(@zwn?+@ce_xGnG$Y zM#Wa8@X@&d;O%F QpIU`a$lRCt{2nZ0WwK^Vrz#8&?RtGffER>u*0wH9q7S{;a{4QMN< zoffvDLbyV~bP=pYuJoh0PAslV`lR*a_8BtEx;L}mW=-&cMR#U)=Ka0%&eyJ&d~kW) zHo&gV0B-AZ0z{+H@4MaZ-sAE7cyEJvl5Ck=TwGKai^Wu(#|7AKw=L;`lQ15VY)MEz zU!?1sI*$wR_Q0v>D=+bLj)9M)Gl1JV1Gud-0F+E7Nh*~h(n?9X-L7WYOeRC(@i-X_ z24p&&5^1%!)wUx59qSu;P=;%S&4jj)hRUTqgZ~ zpH!<=^8EZvmdoWqelQr60q^ea$m{DXO}7i73xI|@oeuR{p-{j!gQho|O>FwO&!9Xr zP${3!N3Y>mfFlBd0Bvu*UfTn>zP_f70s!8E01*m>Xu3#d@)C&zsZ=U* zPhc#e{#YzV+htC(3;-c!AwXPRT~QA~@Ydtwqg?*s;X$*$d_FJtPA-=t>2#U`p+1Bc zAOMifW+{ZUm8NAy5V`;?OyCJ7gcZ}v%gaHYo=}znD4#FujWp|H^FD-WQ!Tw|(=-6YAW(6m z(U8;qe!n~@k%!e(4X76Kd%Yh0j{%B>&5jIj=G5VYd*$5SZnt%fhcGE1&ReY(4H^6z ziF?sz&(v;|L14ASHUJldP~e4wNB~8sA)Md@<;{fSZ|1B*IQ?4XFA;nZF(R`N zMvRy0`ol{X0sNG%d-9GDT9WGcEkXX`<#7Stz6SpHLG2WEemm{9&H!%fAEMHD^b5`o QUH||907*qoM6N<$f}z~7)Bpeg literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-100.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7216b8d86dd82df8996b911bc32178a5fe3902 GIT binary patch literal 1199 zcmV;g1W@~lP)pIaY;l$RCt{2nL8{jQ5eTR>~`c{CG~nWlC`vgl7w3d#jQL_61G%m zMb_;Q%}o#`5;f6!B(__Mo7)hbOQP}EJHHcWGQ0EGnb}#c%Rkx7_~tx*=R4nb&Y2OD zcc$1|0|eD4aHZu4+}_^)B^HZ)duYB^@bIv@Zf$Luwt;~G1)_C)d@O^5gR-)+BAc6=1@(J+dejV1rnk4(v@@{7 z!$Z%00s}WRG|0@%jO21TSzljg+gA38i3tT!ENql_QfFtU`f1(W-AQ+Mx9MpH#`FFC zeYw8A4hKx^A-t2%=fyaTNLyQ*2}>w2#b{_~$Z-&e*xlXTHUB1zm?7hUBPS;(3i|x~ zTmb{lEV+e@Coq-K(b18*0-a1I&F6R>7}VO@>I%#ZEiW&tdq4q30OE|NrzZtY4q(F( z*s80mg8}O)?Ca~3uCA^ETNEPhbuQ?uZXf43$rYIR)gGf^Cy_+j!`37$7VYSSvzEg? zIyzcVmgm@YyS{;&o10w$w9@Hx$ug*=rA0ECjIXkY!4Vctas{rftu06t-7&u?MSSz~ zD_7vXy*=64*(r#nrKP3FftmWbxjEnEJ(G@gm!(WYM-7XDCUMD~4rrE`=jUgcnwm20 zY_GGkv#LWj0k&PPP9l+rVXiD=3kwUj=WcZa10%hN>sSMp?AG34N&)c_16o^KQ*~H% zilP0=_u)rF6CS|gUBrgKc3Mgdh=I+|&#U?jzBs9^!YO3|Yv@EGVeV9PsCO_wqP+Gn z;3S;W%(%e@21cBD`}_NYRx^c{!-fM249w^`fRl(}<&|Jw-bJAf@cIB=4zydlr4;&& zBWh?ru&At8q)K_(OJ%>)MFH*CyC{;^{IJkLK(%bZMk6OV1OzsE4j3dj*fCJII|gY3Ruc` z>>aRZ!1Ykf)@}`LF_D>>8D2o(0VN@z3b16BZz1n(En!k6L4u+^+B&=4{1C9DG}LmW z7~0yZ(@IUX{V+_4o1NXv%Y6xb-`}q$xmnJOsx4SNLzF;=r9u|4C^_eFy}i;SK}ZSp zURztR=p*9$#L+9h65w$$;FC}lc}y85tQ` zvD&HnsY<-LXvFF#`!j-~q!Zwu@qNOs{h!|@KGWR5t~NKYtL@7H{{}}2`J%xL?^yr< N002ovPDHLkV1oIFON0Ob literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png index ce342a2ec8a61291ba76c54604aea7e9d20af11b..6fec1f0113eee30d077617b9e2b91a329ada95d1 100644 GIT binary patch literal 2350 zcma)8Yd8}O8=kjGBSLbRvyCk+IZv5HEG7$WMp90rG1ivIA&0G%L(2J3y^ax)Q%+k< zOF4x1qt|IpwJR$xolKZhUhl8($NS^^uIs*^`+0so*YiBr{Up0!&qzyxB>@0{w4;Na z+pc>2!+m>qBQ?j+bXP!E9XziA05V^m|@P*m;QVkG9Yu^}xVkM4<~sCSDN)u|Vaqf|S{@f;TgneI zpsb>V`2pPx%WrP4KuWZ$U;A6HZ}E}`&7)-89-Jk7DEkOJ_-{atwmpBooM&6|Bj(2< zg>|u(S&toatHN;v%j*;YEeg8|KFr57irbAe|RDkot`{-VqXyQ7zm-o zN3c+`UpIeUwt>cz!fVMXBK&i#<~=R%*xcjiFjuekocs&-38G^u!}0_gVGaK`(BeoW za$L4jB2?>#k?_{%u-QC^U{q*Vba^1StwVp}9oQ$+|)Y{rw)d*g^ zjIQky7dJb_>0CX zW@e@&Umy_J2?hoSqZkavsQ+~3t}HAqFF%*->lSB}l|d*JN}c|`A{Y!d`|B5HWTmUC zYj%GA%8D{c!dgcU>ZPr$<(H8v$Ni!_vn3L>eY?KBy*)cJf?H9JQX5u1GnU!h3Cehd z4%?@qqOv4h-+H*L2ZMDaCMNb8zs@LX;BYPtmQX)j_!T`zRa~c@tvw# zK8&8c$f3HzPG=ftEE?6P99P*>dqV?QW~HCm416vIDyFvkyo9#4wsx{2Vq;Ni>2^am z3GVLM3k>ej;MIgHhk~GI4L|6Xsf&D(OiEcw0Fmq0sw5ER2yb3q3F-AY0NsB{$mjc- zIsf!MkC@d z?+P}Sh-U^}z$H)%{T)4fwKsnz&|V&sB?g7}ZyH588LX12jxy|aN334ZdE!hnaGhIXPg zc~aR{@vsB!+`0R-^2XbZt)vd;)GYGi<{gW04Jf#zBR~NbMWq_8#wMWoM)*e=#nn$g zou0G@`;w=&c#H5oR>JXcc zgJW*tFS8eG>(iys;+mS8A;Ja_E-Vn-PbeUp+y(z6!=5#B2Ue*ZSRcutJ&pLq6(yyU7^08?5{_2cBV?ZaZt8ZQ&YbiD?!0?nOomC?`e8iri$Pe z+}HocmV{hB)4fFQUFoiS037YHcD1%Xbm@Re9rOt9Wu*3JOK{*4U|?~)Zt+5$+*ReD zZ*z`Z2O>{Ie98YZ)q0G~Yfe_7eHu`i;Z%8tf1SjSmm(>%H8&f@q83I@!}Uzy;`~s_>BJKEj$7)T zqzj?OfI+9pHZeEzik9_zuVTZ(YHMHOl>{O3oQET+A)aXk_z$J_sZ9^H%u;I)_F#-= zewuojdrZ&uWnFiCH~0IwLR7}@mXQmlb=oZWfm^6t^VRR~kIlS@9Iy4AVP9v{BR77M zwzd2^ax|B{iCg+FR7PYRK2IF!da(9|2gy5jIoCXN(zGq~qNJ`vaF?n%d8mjgO)iw5 z7S&cn9(^!U5fu6=WkRAWdhm~9uQqy3o5oBHMsAaqn__*|1sQxnOPJ7WE$t~!V{U|%WD?L~?lfeacq3 zq+Q7gy@?i!^JUvP5sQ1;g8y6&_Vna!v*W#6YXAla#1_)T!~~`wDR_Ec!G8)~-SU8f z?-(B|CaKmZV5bBNt%T8zF-0Y%&amE&QsU9xUAq(P8u(6Dc6N3}O)-=1yS<~y7cy;P zYa6E}i7eg7Z_`o4YVT@KJ6G3X%j<7jd4cB%7b{4eSty?#VS;-9o(RN&iH859sM!HP R*y|s}wLkCvI{#hazX2yUXd(ar literal 1647 zcmaJ?eM}Q)7(e+G1Q(|`V9JhTI2>MkceK4;p;PR&$Pi?ejk3YQ_3o`S&|W_dsOZ8# zWPTt69g`t$ab`0cj-Y0yiBSOqmd)tG7G(}M5aP0_%&9TijB#&)I{zSE^4@#z^FF`l z`8{8`o%wlL(UI|y2!cdsuVamHH~H86F!*-15em4)NqUpCQM5?aoC_eCf@lV4wvF2a zjDQn1JBL69f&@2M3rvzJcfE!eZ8FZUBlFlC5RD)it33{mF9#B82AiyQE%w)`vlwa> zv{<1sm&kSKK$&%2jSFn7$t&P%%6Ue>R=EAnG8N7fqynWG8L3p!4801a;8{+nliO(qd(jNJ_?+9W3#hLIDLoT6~3fx9=`CC-D}-AMrpEO7HK zt3$GicGPc?GmDjy7K2P@La;eu4!$zWCZ`ym{Z$b zu-O6RM&K4JT|BIZB`E-gxqG%FzanI#+2FFmqHqXG7yxWB=w55RGOM)$xMb(>kSNR z2w=1AZi%z=AmG~yea~XaXJR!v7vLn(RUnELfiB1|6D84ICOS}^Zo2AdN}<&*h}G_u z{xZ!(%>tLT3J3<5XhWy-tg+6)0nmUUENLW8TWA{R6bgVd3X;anYFZ^IRis*_P-C-r z;i>%1^eL3UI2-{w8nuFFcs0e~7J{O2k^~Ce%+Ly4U?|=!0LH=t6()xi<^I-rs+9sF z*q{E-CxZbGPeu#a;XJwE;9S1?#R&uns>^0G3p`hEUF*v`M?@h%T%J%RChmD|EVydq zmHWh*_=S%emRC*mhxaVLzT@>Z2SX0u9v*DIJ@WC^kLVdlGV6LpK$KIrlJqc zpJ921)+3JJdTx|<`G&kXpKkjGJv=76R`yYIQ{#c-`%+`#V(7}Q;&@6U8!Td1`d;?N z_9mnI#?AA}4J!r)LN4!E-@H5eXauuB7TOawS>Y|{-P?NNx-lq+z1W-+y(;39P&&LP zL{N80?&=C*qKmdA^moMZRuPcD!B<*mq$ch=0Cnlitw#txRWhb3%TQvPqjkC`F69G4b! ze7z9MZ#+;_#l?H37UqUhDFb^l&s2{oM$3I0o^Q!yx;;V)QmCMo)Tb_ui|mit8MS?U zm##6$sZZ1$@|s%?l@>4Z<*Q}sRBSKMhb4I{e5LdEhsHIHTe8Bod5c>6QtT>$XgUBz z6MK`kO$=jmt@FqggOhJ5j~e@ygRbG;<{Vu)*+nn9aQeo0;$#j;|MS=S$&L?BeV25z xs3B`@=#`5TF{^6(A1rvdY@|-RtQ|iS5{tyX+wH?;n8E)G$kykv-D^wh{{!TZT%7;_ diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-400.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2a9c1e200184502e2b63287cdadd61f96066c3 GIT binary patch literal 4312 zcmcJRXHZk`w#G5k(5oOtYUouF3?MD^66qLfC<@Y~OGF5vhYk`Dq$x!@(p!Y6p+giA z!=ElykS0>3$&KI6+_`gR?wL6s-ZIbn?PuP--aUIQv>8;NftH(=jEs!I&_Kt6w7&T} zXsAeYL;H#oX#x5hz=Fug7(e_SR|Xzcx|5O7#Te>nS%npB7pnTO8(#09d7w+x&Z8aJ zEp_EuK_f6zkP^-CPSoya2KtCObofMoT=1SR&T^VYFvBK10mbZ}GN8l?WZKwa70>~Q z(ahK`)c&Zyc4|In>1chqxhn>9>m0asYp%EcPjy$5F0K-@87@w5r@MSPZsz1Z8jS` zudT0Fx1Nb?oY)vuI=q%jqjuv)69j!$a|(cL(kcFA(II;>vpd@v^PNkbywvO@AQb-M{|l1&F0M(eKjJFl;=BimqY)~NA)ZKp%2RgiOuPEQ#x!lxP3 zCb_r2zpoooS%MYeoWxz!JN2|%7u`Y;?H1m)4GWL&&+YB)Ro0~yk|aGI9}ayXy<5RZ zb2%4a?aG`>jWnyW(W3dGYx&Iqwrl@M68>$5{_o&~7fRV@Dx-Vr;_R5w+ae|V$!WPT*y_Yw8|{dp{+S?WziDr>tP+<$E}&wZxNcdpn;fRTcmhsSun zC*nto({G%yxxH1%d56TJVW%rXw#`=em{85a3FwoZiR_l_127 zNCnPYU|rj_r45#nk`kQz?T+biz}8fw1LBJ7hf@7?+7ZuZc=p?UTU$PX$2)VgP(FM# zoY>&}NGA=FzzAAiUhW)W3EFehwkJ8=DX~o0LSI!*W)p)3Gc6qNF0@My{JA)LHZ(Le zyBZV}R2(vG;u%Boi>a!rs+Wcdvn_7@)9i@myn3~E5cRD|2=NmJD^y~0&3z8=ATt;E zGCFFq6E5r6mCXwd6hRzrS~~}3ryg!X?KM1RU2~?oah|Y!Mk3jr%kpy2^1gufB&6<7 zuakgj(Y@big{qIcmK!gk0+XN|Zr5B*uUePuQMU|-h5pl}ksGLd9(1KE0+dlt7Q>u|Gu{ZBYsF@wB-b zqzgj!zA#c#Q=3Kh3F)TG*$(05oUr0DY>@CNb#;*=$-SaG;k3EOYa=(%<3jAK8*QcO zVO*2)m<}JM>tB^AoE#kwg-CYE?lD-{YvW`Qy?)`oGPhVXeh`-!h?tSQc+Afl&NiiZ z`5;qF;nySZLlg>)zYo6GzKLta&r{TAA)5!YrbI5+Ors^-}j{Hm6G z18o}groa3zmXB;UF!squ$~pI(!|2=rP&;p=hf z3eb^|e=mt=EY7pMn$RRtpC2=!DACA?@?BX_b$gBMa zXd0qIS}e{;xZaW%gqQltVqCa9nn*4=36h|WX4hymD^rQt_=Ng{PP60gbeSJYkL zHT#U2nWvw(4!EPm(S#qfqZqd`Qe~|y57EVPCr}oKBUHK)iWkDrn;0G zu`n<&DR#k}f-5m`O|)9?7ZZq3<_e}TZ3xAkoc~(?NIV^le0P6W^w=*dxYDgR{XEOS z3_$+EV@vTN;_!mm#EzTBd_6Cy4M)z{*o;ZVE_TBcX4@YXSDt&tEK*P@fe2YdcX39c zFA>-p)3ob%@@IP@x)pak(KYkzGa#j1bOq1?4u>pBBTVCy4wfAux24J-ix@b>r|D&= zE9Pf#Qb@^v*I%0FP*PBEQ6r$IGA3aMl&|PTWW%45X$~;$emI-a`~-+mVLcwUU$uA= zJngWsFha3q#x;Lq1#C@l_j_-Y?jaen@dQ{IKbwj0de8F8lZM1eP7 zz&+N?e>2r#>*TI&iD+!h@qQ=iM6B^x4d4>I|$*FaK^i3i=j#?R4c?bu!tWbb~SNXyC`xSSSCt+iU zl}68&yzoH!&#dc1-cRzm_>|CK7FFJTl_tMy8*F^_{(^GM67o^_dxjf1_tFpZ34&1_ zf`5-P$AU45r#>75KzN0Bs2c&~7YDpD0hmV8fpw^Xo$WO4k0+po$qKHvG7WkyI89?U zC8Y;yU!|%hY^Zw3?W}`0O>Ss}`lpO4DrgP0Vl}Zi_|vCqc?AWEks2$h57%<8=gAkk zB=GSqIJ+M0f@o154<2MCF!6KuYQ%yW+q7Q$k!s8Q+OJd32rYJioQzC}z2FN=c~Er7 zqRQ11R$I0>TuD1bKYySdE5MDq0`lWG2hxi-@@SLzU;w$%Ebq(28ngvm6TQurj}@>Z zA!)^xlvLTb{a$f$nJtAqjKf8-4j6hmpQGf<5^y(0uxPOw8v9!69CMw*s6mPLg zNh)bdhSD&S5JW0)pGiVT)N@dp7D+HpG+(;6LdiZA^;{&)kR&jmwU(wxLI)rVl=jy{ zN{B@KeT0e?l*aJ_(A#{^X3uQtv@*nFjKdqyKx)!bPs}isp!zYS4~M%cyj6h{gKtY> zBL~&@y{e0@1*$149|wnp{dV3Y?)qRP;xa&t+m)5vok-;A!O(O}rSIdVNGpwWnOuoz zW)P#PQ^}^{390h#-H`tttkMjDKqkE0pfl38w1S4budqqZS2;P6&9IU~mzKD=xZd=X zlyeB5WaM2tUa{#Z{z138806PBY)NJSe8uH(|LrhdqjDHoBiRdSHF8$|348gf=eT57 z<+tAUDD&~pfpmUOpZ<8o)S^MN%%x(}oVzq1@htzJ7WRKNXy=?fReAF@NfyKXM6-XjvCHCqQ`aTy{39;$>9;{?o)hTi#t(CLR&yM+pF z@p<5&isT)P3a{`Aog8*i7MaeYEE@nG^-ftF-6C+bxpF_u8A`#K`4n=UTdNn5Ug8nq z_HxRXdh_LTKUrSi^J`wX_$8J4~H zjw6Mq%XPi?#}fD>r^X2Le2#QO*67;V#kdyHx||3Cc)eqWJA>`aeta!+6i6Q@a@5IN zMIKZT;P$R%r1s$5qMuH|$>T$)jw9;n^C8+tZx3xA*EEz7&UNNSWV=UAE#8;KD%O88 zLe6Q4QpUFwa3QKhGmM2irmZZ?=+f2p6JPi=d`XjEjiUO%2LV@gFQ=(Gi2b^)s22D* zl4+va#%L*nNACe;d?h|o%uKfQ&E3A2pTyHQCSG^{BLpt9EsY;O721|+z%KQZ-&j-x z>PZOS&U|h!ogK8(p3!&cZU^7nXF&|fY!vpvo=z*);Cx%JBhLel^Sst_B9(?-7d;uS zJFa?Nl>b|u3T{!{vsqo^Kpgs%a0T;hl#brOgfMbYYSJA%<&sd|lY8dluMl(I&RqrJ zrC6(cH+D5IIJPF%P~Kb28o1MgH#wY{h_KLJIb6|(ThK5L%vSPT`Ro@s=)z^rEKnxi zZ^*|%E$gaw@Cj018p&!UEe^DJS8@!q9rn&ziF2Sap{VE?X8+UtV9W@+z@y68n5i5) z$df>2aNqTPEYMGsAo6s9`g2k3QAFZ1I@EN#b85#<PxWDkNs#`2a(U8(Q1QqlKwyg zL$Q4!5(Hv>qLL{_GS~sUtYAYtJ@ z>0{2u<=C8w@2K0Mn7vfYfj*Fb+gXB47@9MX# z=FzNS%l)awPmZ=aKertSPCDgU06~S7>@%Wz4i9-Ymb@B_vr8zPI{aOX-Q1SxyI<e@}VqA?u||~TSsRn!tL_U#ih$7n3$wGpM={Ytl&dJ-KZV~T2&hrH`;c%5T{x^ z-*UA7^QR)uW*(`0>sDRE3ZPrt9}siLB%ngIuY&EeRTbSG!qg;0oMDhylODRRmcO`nD3qQUxfFMqenW-<&TYJi)x7v4iVw&~w~lNu{k# u)T6Y~DFsNqGDmTYSK^X9t>C(fl5d2#|J&iQOET||@{RiDEL#8i8~h)Ij{Z9U literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-16.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..979d24169f4e974fd71ec56ee3458e0232d638a1 GIT binary patch literal 541 zcmV+&0^pGKuJVFRCt`FlCg?|KoEwdo0T$FieEN zha+H6*L5N?41=z_u1n{q(`o()X_}Hu2*J#^o6*OkpdSPQG))7m)#|YVyrd*ah`_dO zA{sB%_kEH8*BFLb?!x(eCLI|1OxI9^oj|)4&jQ9ux~`i*=ERGDImn!t0`N_5x7*MA z;CNB@Hoz`z+a4zs3=imQshYp+7hz0^jHaH33;+NC07*qoM6N<$f_j_HCR(i)=JWYa zc^sOi!Dh4R+WYGuIa&YVaNu^qV0KA6Q>-7$Ahd1r- fgC76UgTIa+#x~A75G<*P00000NkvXXu0mjfVxRfx literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png deleted file mode 100644 index f6c02ce97e0a802b85f6021e822c89f8bf57d5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1255 zcmaJ>TWs4@7*5+{G#S+&C!qC#> zf>5N3P6jO*Cz>ug*(_DmW=)kea&m$gZ^+nyiF`;j%w@}y8)>p*SH}C`m?DXeieF2U zyQHecc_L%Gh!7GMt+hG06y;+|p4>m~}PjA}rKViGiEnn7G0ZO<>G|7q;2?NwGCM3s?eued6%hd$B+ z*kQJ{#~$S=DFE(%=E+UkmlEI*%3llUf~8Ja9YU1Vui0IbGBkW_gHB%Rd&!!ioX zs40O?i9I{};kle7GMvE7(rk`la=gTI)47=>%?q@^iL-nUo3}h4S}N-KHn8t5mVP8w z&bSErwp+37 zNJJ8?a|{r5Q3R0Z5s-LB1WHOwYC@7pCHWND#cL1cZ?{kJ368_*(UDWUDyb<}0y@o# zfMF016iMWPCb6obAxT$JlB6(2DrlXDTB&!0`!m??4F(qWMhjVZo?JXQmz`1*58Z=& zcDmB|S-E@j?BoFGix0flckqdS4jsPNzhfWyWIM98GxcLs89C(~dw%$_t;JjX-SD}E zfiGV;{8Q%8r}w9x>EEigW81>`kvnU@pK)4+xk9@+bNj9L!AAZ@SZ@q|)&BmY3+HZx zul~BeG4|}-;L%cHViQGQX?^zFfO0&#cHwel=d`lH9sJ-@Sl@n*(8J2>%Ac`IxyY?Q z{=GhWvC#gu-~Ia7*n{=+;qM?Ul_wy1+u7ho;=`>EwP^g~R@{unBds`!#@}tluZQpS zm)M~nYEifJWJGx?_6DcTy>#uh%>!H9=hb^(v`=m3F1{L>db=<5_tm+_&knAQ2EU$s Mu9UqpbNZeC0BbUo^Z)<= diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-256.png b/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..1f953b2fc8a39c3d261addb866954062a592ddb0 GIT binary patch literal 6051 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 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x diff --git a/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-100.png b/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..a065bc4725591832a4d02e29978fe1fb56c14256 GIT binary patch literal 1058 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 OfTz1JvK8^K{Qm+Mb7ay0 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-400.png b/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..bc17a33e34062cb476eb1f46c135c52d492ff927 GIT binary patch literal 3394 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png b/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png index 288995b397fdbef1fb7e85afd71445d5de1952c5..7053ee0bbf3031f8f88d0bbc0e2c167a0fb36b0c 100644 GIT binary patch literal 9276 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μl1gu+y zFk_-Ea?;Ji&WfQS3PfmC*sFxRrwL2Y;I3J>231?yQf5+A{t~sl&R4eWg;aZw zsaVUt$RC^nnk^YRkH=NMd33Zfkb&Q*2a^X@B z3@%%|7|%i~iUM?V0X5xR$=&~U=E2ET(QnzxluCHZ8Xb3B>^k#a(0DMhVdnLt1t-Ge zK(iKp#f!5h}J(-a~>Z-DK$$TxU4cM=Mb9*o4nBzxY#g#UV{)q9t)ZX zuQkjf7?l-aFAwtm0Kjkc#)8!xb#GEn0n?jjwI_#;9uJwX$ffq37Hx5+!?c&sES1DR zzygds9VIK-7n=JK<@Q|9mVNXuNzUvKJ|0DVIlDergSz!T(P}SceIjx~u)$}%ITKsQ zk7+aaf)V0`SW2^c=$c8`H;SohH>U>^V_C-Qtc!GoC3f{(M?fyPVk{rQ&~Z)y)EgyC zJ4#~m8kb|Ee@TVCMEN=5pqXVxsVW6mCS{SFcpm97AXy#4^iYLWx-cwR>yUON8ulrv z%9{~$Sk9I<0tI)|mq)7xcwae> zPbfJSYvr}G@wY@|9V8$MmPFHAXi{p) z>|YYVi>aavrz`V=q`D^A+i_J~g&@=T9mV}EXmJ#4XbtXU3anB}%vHx`kUF|!c6X%s zac>gG+X`U;x{c>o_xNa0VSqI%=XZ|G#V!Kkv*yl zlrIttq3zBkjI>3zg+n0Htj6hhJY4n5McLkKJd;Q2)Aj{I$3RCC78gQMk4v$nz6{dM$n7Z zf&6YUP~KvdkL1gS#v;YVz`Ud%_P!A5gr|vtaSIq?aE=F%;*p@<J?{itik{xA-d{bErN%qif86I@<>mm4|xc|lnb814nS7&i{k>m!!;6MN$Y zmoxQU`G(AHhgNGq5vjfLQvgTfdoFT60yoUudw(Ny?ZhMb=)EsB$~tPQPS3AE-s-sM zriZ6759Qs7MIi)ZYis`Z?J&0t7rXr8NL|m~Z_~PP&}eyf1}`e_9xkV4&E+XsKGqb} zW@m5TL;%;&Tx?krTweR;1K6D(2{Orv$H8Uw0Te&2Gw!e=uc+F_e#|9b5$*QK*xJc> zWXrm?%l5k%j>D2}TCA~RYHDhD7si^_pZtjLE&8OLXUDHh7Emkq;%VJ)s@6CmehrwS zFAP`PC?XIJVxvbQbY<-WB<(OV9%jeGmvS|{vlV^DvsgFa=YTVOzGo}9i2!Bm5U^|G z!N->09m(w#lKXGZNkF}vIxz4OggCWkmyVeIZg8<)4q&SNCcrS}N{^=V@z`1!ezu2K zLM*%e754rAxX_3(&!p01s-()jM(h9nEAKhD42_0ynY_HDt&7w=rFMUL^2go3kHqT( zB#vyzXNz`k8`+!B><+kra6JE@XPj~Pgj{wuc&DHh9F*j5td|Gk7Xbw9I?!-nq z`L4_uOD@|h^}iTgCvs6J?0z=Gcg3y<6e_J^Mz7yrvM! zbLhQz{i|c6My9;plFW`l9`Hck%oW3D47R`U3;lLMHKqLUc-t_Tzx;vRHr{FtsdkWn y=fwg6)ayt@@E+wL1d<6}xcGnd9=~D#;N#%+pKo$CD!>~F5MzB)y-FRInEwG}-+;pa literal 3204 zcmbVPeQXow8NYmBd90>}0NP?GhXW~VaeThm=a0tV#EwJMI!)6M3}|c4_Bl3=Kd>G0 z(GHx1wl<7(tP?FsOQkTilSo*iIvF%uArExJ73~P zSv1xEy!U(Wd4A9D`FQV@W3@F^qJ@PEF$@z`Z!*BbFsS(^?B zyiAzJ+q})bkgiQHWqEb*jJD-coHYr1^iocg)l!Qa{Xqs-l~6J}p-|##ZHYofskQ3$ zI0;xzXyhazBeXhIsg5A=%ufo@f)1yy&ScKS0;HF^!r_2UE^lpZEom(+@duma3awTv zCrCL-%D_SvYWIcdHkmI}#50(fkUi)Qgx!80ju>g1za^}ff>JI8Z@^-iCiaCgg@TgF z+vtE?Q9{VQUX&MW9SYYmGcxA14%N2@7FwBTD4N<(2{nWgV8$e3?-F=L^&FrtWn~(U_Q~~^uYiyeY6-KoTnfh9AWz@ zIKje0)u!_Lw)E}G!#kEfwKVdNt(UAf9*f>tEL_(=xco-T%jTi@7YlC3hs2ik%Le0H ztj}RTeCF(5mwvi3_56>-yB?l;J>-1%!9~=fs|QcNG3J~a@JCu`4SB460s0ZO+##4fFUSGLcj_ja^fL4&BKALfb#$6$O?>P@qx2Agl^x0i&ugt zsy5Pyu=()`7HRMG3IB7F1@`_ z+-!J%#i6e^U$e#+C%Q>_qVRzWRsG^W_n+@OcX@vzI&z;mzHNb!GQ?LWA(wtpqHqTM z1OFw_{Zn?fD)p)`c`kOgv{de=v@suGRqY{N^U7gI1VF3*F=obwaXI6ob5__Yn zVTguS!%(NI09J8x#AO_aW!9W7k*UvB;IWDFC3srwftr{kHj%g)fvnAm;&h_dnl~

MY- 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

ODFl(mlLT>jXv8_y@8P_bZl?G%h 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 - - - - - - - + + + - msvc-2017-UWP - krzys + RetroArch + libretro Assets\StoreLogo.png - - - + - - - - + + + + - + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj index 0836dbbee9..b6c0469a17 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj @@ -38,7 +38,7 @@ {f5e937b6-1ba0-4446-b94b-f3bbdef908f4} DirectXApp RetroArchUWP - pl-PL + en-US 14.0 true Windows Store @@ -252,15 +252,6 @@ WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - - - - - false @@ -497,6 +488,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters index a133f33c90..e62f02f8a1 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters @@ -15,33 +15,10 @@ {bf1e643d-c518-4a77-a355-ae8a93efc18b} - - {ba77ad30-f536-4bb8-ad9d-2870e8a9bd39} + + {c3155604-6d38-494a-bfe0-861cef871cb2} - - - assets - - - assets - - - assets - - - assets - - - assets - - - assets - - - assets - - @@ -277,4 +254,87 @@ uwp + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + \ No newline at end of file From cc686ba9bcdd8a0cb36165fdb7229282f682d3f0 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 28 Dec 2018 11:42:24 +0100 Subject: [PATCH 041/116] Upgrade XAudio2 headers XAudio 2.7 was part of the old DirectX SDKs. XAudio 2.8+ is part of the Windows OS itself (starting from Windows 8). Since UWP lets you access only libraries that are built-in to the OS, the headers had to be upgraded to the newer version to get audio support working. --- audio/drivers/xaudio.c | 5 + audio/drivers/xaudio.h | 358 +---------- audio/drivers/xaudio27.h | 364 +++++++++++ audio/drivers/xaudio29.h | 1313 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 1692 insertions(+), 348 deletions(-) create mode 100644 audio/drivers/xaudio27.h create mode 100644 audio/drivers/xaudio29.h diff --git a/audio/drivers/xaudio.c b/audio/drivers/xaudio.c index d344508b70..b8f2c73ad7 100644 --- a/audio/drivers/xaudio.c +++ b/audio/drivers/xaudio.c @@ -222,8 +222,13 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, if (FAILED(XAudio2Create(&handle->pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR))) goto error; +#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) + if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL, AudioCategory_GameEffects))) + goto error; +#else if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL))) goto error; +#endif xaudio2_set_wavefmt(&wfx, channels, samplerate); diff --git a/audio/drivers/xaudio.h b/audio/drivers/xaudio.h index 788fe16789..a16581807f 100644 --- a/audio/drivers/xaudio.h +++ b/audio/drivers/xaudio.h @@ -1,7 +1,5 @@ /* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2010-2014 - OV2 + * Copyright (C) 2018 - Krzysztof Haładyn * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- @@ -15,350 +13,14 @@ * If not, see . */ -/* Kinda stripped down. Only contains the bare essentials used in RetroArch. */ - -#ifndef XAUDIO2_STRIPPED_H -#define XAUDIO2_STRIPPED_H - -#include -#include - -/* All structures defined in this file use tight field packing */ -#pragma pack(push, 1) - -#if defined(__cplusplus) && !defined(CINTERFACE) -#define X2DEFAULT(x) = (x) +#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) +/* XAudio 2.7 it part of the old DirectX SDKs. XAudio 2.8+ is part of the + * Windows OS itself (starting from Windows 8). Since UWP lets you access + * only libraries that are built-in to the OS, the headers had to be + * upgraded to the newer version to get audio support working. */ +#include "xaudio29.h" #else -#define X2DEFAULT(x) +/* The old version still has to be there since XAudio 2.8 is not available + * on Windows 7 and earlier */ +#include "xaudio27.h" #endif - -#ifdef _XBOX -#include - -#ifndef __cplusplus -#define OPAQUE interface -#endif -#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) -#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) - -DEFINE_CLSID(XAudio2, 3eda9b49, 2085, 498b, 9b, b2, 39, a6, 77, 84, 93, de); -DEFINE_CLSID(XAudio2_Debug, 47199894, 7cc2, 444d, 98, 73, ce, d2, 56, 2c, c6, 0e); -DEFINE_IID(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb); - -#include /* Basic audio data types and constants */ - -#else - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include - -#ifndef __cplusplus -#undef OPAQUE -#define OPAQUE struct -#endif - -#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } -#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) -#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) - -#ifndef __cplusplus -#ifndef INTERFACE -#define INTERFACE void -#endif -#endif - -DEFINE_CLSID_X(XAudio2, 5a508685, a254, 4fba, 9b, 82, 9a, 24, b0, 03, 06, af); /* 2.7 */ -DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb); - -#endif - -#ifdef _XBOX -#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f -#else -#define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f -#endif - -#define XAUDIO2_COMMIT_NOW 0 -#define XAUDIO2_DEFAULT_CHANNELS 0 -#define XAUDIO2_DEFAULT_SAMPLERATE 0 - -#define XAUDIO2_DEBUG_ENGINE 0x0001 -#define XAUDIO2_VOICE_NOSRC 0x0004 - -typedef enum XAUDIO2_DEVICE_ROLE -{ - NotDefaultDevice = 0x0, - DefaultConsoleDevice = 0x1, - DefaultMultimediaDevice = 0x2, - DefaultCommunicationsDevice = 0x4, - DefaultGameDevice = 0x8, - GlobalDefaultDevice = 0xf, - InvalidDeviceRole = ~GlobalDefaultDevice -} XAUDIO2_DEVICE_ROLE; - -#ifdef _XBOX -typedef enum XAUDIO2_XBOX_HWTHREAD_SPECIFIER -{ - XboxThread0 = 0x01, - XboxThread1 = 0x02, - XboxThread2 = 0x04, - XboxThread3 = 0x08, - XboxThread4 = 0x10, - XboxThread5 = 0x20, - XAUDIO2_ANY_PROCESSOR = XboxThread4, - XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR -} XAUDIO2_XBOX_HWTHREAD_SPECIFIER, XAUDIO2_PROCESSOR; -#else -typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER -{ -#if defined(__STDC_C89__) - XAUDIO2_ANY_PROCESSOR = 0xffff, -#else - XAUDIO2_ANY_PROCESSOR = 0xffffffff, -#endif - XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR -} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR; -#endif - -typedef enum XAUDIO2_FILTER_TYPE { - LowPassFilter, - BandPassFilter, - HighPassFilter -} XAUDIO2_FILTER_TYPE; - -typedef struct XAUDIO2_DEVICE_DETAILS -{ - WCHAR DeviceID[256]; - WCHAR DisplayName[256]; - XAUDIO2_DEVICE_ROLE Role; - WAVEFORMATEXTENSIBLE OutputFormat; -} XAUDIO2_DEVICE_DETAILS; - -/* Forward declarations. */ -#ifdef __cplusplus -struct XAUDIO2_VOICE_DETAILS; -struct XAUDIO2_VOICE_SENDS; -struct XAUDIO2_EFFECT_DESCRIPTOR; -struct XAUDIO2_EFFECT_CHAIN; -struct XAUDIO2_FILTER_PARAMETERS; -struct XAUDIO2_BUFFER_WMA; -struct XAUDIO2_VOICE_STATE; -struct XAUDIO2_PERFORMANCE_DATA; -struct XAUDIO2_DEBUG_CONFIGURATION; -struct IXAudio2EngineCallback; -struct IXAudio2SubmixVoice; -#else -typedef OPAQUE XAUDIO2_VOICE_DETAILS XAUDIO2_VOICE_DETAILS; -typedef OPAQUE XAUDIO2_VOICE_SENDS XAUDIO2_VOICE_SENDS; -typedef OPAQUE XAUDIO2_EFFECT_DESCRIPTOR XAUDIO2_EFFECT_DESCRIPTOR; -typedef OPAQUE XAUDIO2_EFFECT_CHAIN XAUDIO2_EFFECT_CHAIN; -typedef OPAQUE XAUDIO2_FILTER_PARAMETERS XAUDIO2_FILTER_PARAMETERS; -typedef OPAQUE XAUDIO2_BUFFER_WMA XAUDIO2_BUFFER_WMA; -typedef OPAQUE XAUDIO2_VOICE_STATE XAUDIO2_VOICE_STATE; -typedef OPAQUE XAUDIO2_PERFORMANCE_DATA XAUDIO2_PERFORMANCE_DATA; -typedef OPAQUE XAUDIO2_DEBUG_CONFIGURATION XAUDIO2_DEBUG_CONFIGURATION; -typedef OPAQUE IXAudio2EngineCallback IXAudio2EngineCallback; -typedef OPAQUE IXAudio2SubmixVoice IXAudio2SubmixVoice; -#endif - - -typedef struct XAUDIO2_BUFFER -{ - UINT32 Flags; - UINT32 AudioBytes; - const BYTE* pAudioData; - UINT32 PlayBegin; - UINT32 PlayLength; - UINT32 LoopBegin; - UINT32 LoopLength; - UINT32 LoopCount; - void *pContext; -} XAUDIO2_BUFFER; - -#undef INTERFACE -#define INTERFACE IXAudio2VoiceCallback - -DECLARE_INTERFACE(IXAudio2VoiceCallback) -{ - STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE; - STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE; - STDMETHOD_(void, OnStreamEnd) (THIS) PURE; - STDMETHOD_(void, OnBufferStart) (THIS_ void *pBufferContext) PURE; - STDMETHOD_(void, OnBufferEnd) (THIS_ void *pBufferContext) PURE; - STDMETHOD_(void, OnLoopEnd) (THIS_ void *pBufferContext) PURE; - STDMETHOD_(void, OnVoiceError) (THIS_ void *pBufferContext, HRESULT Error) PURE; -}; - -#undef INTERFACE -#define INTERFACE IXAudio2Voice - -DECLARE_INTERFACE(IXAudio2Voice) -{ -#define Declare_IXAudio2Voice_Methods() \ - STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ - STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \ - STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \ - STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \ - STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \ - const void *pParameters, \ - UINT32 ParametersByteSize, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void *pParameters, \ - UINT32 ParametersByteSize) PURE; \ - STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ - STDMETHOD_(void, SetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, const XAUDIO2_FILTER_PARAMETERS* param, \ - UINT32 op X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD_(void, GetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, XAUDIO2_FILTER_PARAMETERS* param) PURE; \ - STDMETHOD(SetVolume) (THIS_ float Volume, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \ - STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \ - STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \ - UINT32 SourceChannels, UINT32 DestinationChannels, \ - const float* pLevelMatrix, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \ - UINT32 SourceChannels, UINT32 DestinationChannels, \ - float* pLevelMatrix) PURE; \ - STDMETHOD_(void, DestroyVoice) (THIS) PURE - - Declare_IXAudio2Voice_Methods(); -}; - -#undef INTERFACE -#define INTERFACE IXAudio2MasteringVoice - -DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) -{ - Declare_IXAudio2Voice_Methods(); -}; - -#undef INTERFACE -#define INTERFACE IXAudio2SourceVoice - -DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) -{ - Declare_IXAudio2Voice_Methods(); - STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE; - STDMETHOD(FlushSourceBuffers) (THIS) PURE; - STDMETHOD(Discontinuity) (THIS) PURE; - STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE; - STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio, - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE; -}; - -#undef INTERFACE -#define INTERFACE IXAudio2 - -DECLARE_INTERFACE_(IXAudio2, IUnknown) -{ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE; - STDMETHOD_(ULONG, AddRef) (THIS) PURE; - STDMETHOD_(ULONG, Release) (THIS) PURE; - STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE; - STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE; - STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0), - XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE; - STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE; - STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE; - STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice, - const WAVEFORMATEX* pSourceFormat, - UINT32 Flags X2DEFAULT(0), - float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO), - IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL), - const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), - const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; - STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice, - UINT32 InputChannels, UINT32 InputSampleRate, - UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0), - const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), - const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; - STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice, - UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS), - UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE), - UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0), - const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; - STDMETHOD(StartEngine) (THIS) PURE; - STDMETHOD_(void, StopEngine) (THIS) PURE; - STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE; - STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE; - STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration, - void *pReserved X2DEFAULT(NULL)) PURE; -}; - -#if defined(__cplusplus) && !defined(CINTERFACE) -/* C++ hooks */ -#define IXAudio2_Initialize(handle,a,b) handle->Initialize(a, b) -#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, a, b) handle->SubmitSourceBuffer(a, b) -#define IXAudio2SourceVoice_Stop(handle, a, b) handle->Stop(a, b) -#define IXAudio2SourceVoice_DestroyVoice(handle) handle->DestroyVoice() -#define IXAudio2MasteringVoice_DestroyVoice(handle) handle->DestroyVoice() -#define IXAudio2_Release(handle) handle->Release() -#define IXAudio2_CreateSourceVoice(handle, a, b, c, d, e, f, g) handle->CreateSourceVoice(a, b, c, d, e, f, g) -#define IXAudio2_CreateMasteringVoice(handle, a, b, c, d, e, f) handle->CreateMasteringVoice(a, b, c, d, e, f) -#define IXAudio2SourceVoice_Start(handle, a, b) handle->Start(a, b) -#else -/* C hooks */ -#define IXAudio2_Initialize(handle,a,b) (handle)->lpVtbl->Initialize(handle, a, b) -#define IXAudio2_Release(handle) (handle)->lpVtbl->Release(handle) -#define IXAudio2_CreateSourceVoice(handle,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (handle)->lpVtbl->CreateSourceVoice(handle, ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) -#define IXAudio2_CreateMasteringVoice(handle,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (handle)->lpVtbl->CreateMasteringVoice(handle, ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) -#define IXAudio2_GetDeviceCount(handle, puCount) (handle)->lpVtbl->GetDeviceCount(handle, puCount) -#define IXAudio2_GetDeviceDetails(handle, Index,pDeviceDetails) (handle)->lpVtbl->GetDeviceDetails(handle, Index, pDeviceDetails) -#define IXAudio2SourceVoice_Start(handle, Flags, OperationSet) (handle)->lpVtbl->Start(handle, Flags, OperationSet) -#define IXAudio2SourceVoice_Stop(handle, Flags, OperationSet) (handle)->lpVtbl->Stop(handle, Flags, OperationSet) -#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, pBuffer, pBufferWMA) (handle)->lpVtbl->SubmitSourceBuffer(handle, pBuffer, pBufferWMA) -#define IXAudio2SourceVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle) -#define IXAudio2MasteringVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle) -#endif - -#ifdef _XBOX -STDAPI XAudio2Create(__deref_out IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), - XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)); -#else -static INLINE HRESULT XAudio2Create(IXAudio2 **ppXAudio2, UINT32 flags, XAUDIO2_PROCESSOR proc) -{ - IXAudio2 *pXAudio2 = NULL; -#ifdef __cplusplus - HRESULT hr = CoCreateInstance(CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2); -#else - HRESULT hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, &IID_IXAudio2, (void**)&pXAudio2); -#endif - - if (SUCCEEDED(hr)) - { - hr = IXAudio2_Initialize(pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR); - if (SUCCEEDED(hr)) - *ppXAudio2 = pXAudio2; - else - IXAudio2_Release(pXAudio2); - } - return hr; -} -#endif - -/* Undo the #pragma pack(push, 1) directive at the top of this file */ -#pragma pack(pop) - -#endif - diff --git a/audio/drivers/xaudio27.h b/audio/drivers/xaudio27.h new file mode 100644 index 0000000000..788fe16789 --- /dev/null +++ b/audio/drivers/xaudio27.h @@ -0,0 +1,364 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2010-2014 - OV2 + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +/* Kinda stripped down. Only contains the bare essentials used in RetroArch. */ + +#ifndef XAUDIO2_STRIPPED_H +#define XAUDIO2_STRIPPED_H + +#include +#include + +/* All structures defined in this file use tight field packing */ +#pragma pack(push, 1) + +#if defined(__cplusplus) && !defined(CINTERFACE) +#define X2DEFAULT(x) = (x) +#else +#define X2DEFAULT(x) +#endif + +#ifdef _XBOX +#include + +#ifndef __cplusplus +#define OPAQUE interface +#endif +#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) + +DEFINE_CLSID(XAudio2, 3eda9b49, 2085, 498b, 9b, b2, 39, a6, 77, 84, 93, de); +DEFINE_CLSID(XAudio2_Debug, 47199894, 7cc2, 444d, 98, 73, ce, d2, 56, 2c, c6, 0e); +DEFINE_IID(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb); + +#include /* Basic audio data types and constants */ + +#else + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include + +#ifndef __cplusplus +#undef OPAQUE +#define OPAQUE struct +#endif + +#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) + +#ifndef __cplusplus +#ifndef INTERFACE +#define INTERFACE void +#endif +#endif + +DEFINE_CLSID_X(XAudio2, 5a508685, a254, 4fba, 9b, 82, 9a, 24, b0, 03, 06, af); /* 2.7 */ +DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb); + +#endif + +#ifdef _XBOX +#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f +#else +#define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f +#endif + +#define XAUDIO2_COMMIT_NOW 0 +#define XAUDIO2_DEFAULT_CHANNELS 0 +#define XAUDIO2_DEFAULT_SAMPLERATE 0 + +#define XAUDIO2_DEBUG_ENGINE 0x0001 +#define XAUDIO2_VOICE_NOSRC 0x0004 + +typedef enum XAUDIO2_DEVICE_ROLE +{ + NotDefaultDevice = 0x0, + DefaultConsoleDevice = 0x1, + DefaultMultimediaDevice = 0x2, + DefaultCommunicationsDevice = 0x4, + DefaultGameDevice = 0x8, + GlobalDefaultDevice = 0xf, + InvalidDeviceRole = ~GlobalDefaultDevice +} XAUDIO2_DEVICE_ROLE; + +#ifdef _XBOX +typedef enum XAUDIO2_XBOX_HWTHREAD_SPECIFIER +{ + XboxThread0 = 0x01, + XboxThread1 = 0x02, + XboxThread2 = 0x04, + XboxThread3 = 0x08, + XboxThread4 = 0x10, + XboxThread5 = 0x20, + XAUDIO2_ANY_PROCESSOR = XboxThread4, + XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR +} XAUDIO2_XBOX_HWTHREAD_SPECIFIER, XAUDIO2_PROCESSOR; +#else +typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER +{ +#if defined(__STDC_C89__) + XAUDIO2_ANY_PROCESSOR = 0xffff, +#else + XAUDIO2_ANY_PROCESSOR = 0xffffffff, +#endif + XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR +} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR; +#endif + +typedef enum XAUDIO2_FILTER_TYPE { + LowPassFilter, + BandPassFilter, + HighPassFilter +} XAUDIO2_FILTER_TYPE; + +typedef struct XAUDIO2_DEVICE_DETAILS +{ + WCHAR DeviceID[256]; + WCHAR DisplayName[256]; + XAUDIO2_DEVICE_ROLE Role; + WAVEFORMATEXTENSIBLE OutputFormat; +} XAUDIO2_DEVICE_DETAILS; + +/* Forward declarations. */ +#ifdef __cplusplus +struct XAUDIO2_VOICE_DETAILS; +struct XAUDIO2_VOICE_SENDS; +struct XAUDIO2_EFFECT_DESCRIPTOR; +struct XAUDIO2_EFFECT_CHAIN; +struct XAUDIO2_FILTER_PARAMETERS; +struct XAUDIO2_BUFFER_WMA; +struct XAUDIO2_VOICE_STATE; +struct XAUDIO2_PERFORMANCE_DATA; +struct XAUDIO2_DEBUG_CONFIGURATION; +struct IXAudio2EngineCallback; +struct IXAudio2SubmixVoice; +#else +typedef OPAQUE XAUDIO2_VOICE_DETAILS XAUDIO2_VOICE_DETAILS; +typedef OPAQUE XAUDIO2_VOICE_SENDS XAUDIO2_VOICE_SENDS; +typedef OPAQUE XAUDIO2_EFFECT_DESCRIPTOR XAUDIO2_EFFECT_DESCRIPTOR; +typedef OPAQUE XAUDIO2_EFFECT_CHAIN XAUDIO2_EFFECT_CHAIN; +typedef OPAQUE XAUDIO2_FILTER_PARAMETERS XAUDIO2_FILTER_PARAMETERS; +typedef OPAQUE XAUDIO2_BUFFER_WMA XAUDIO2_BUFFER_WMA; +typedef OPAQUE XAUDIO2_VOICE_STATE XAUDIO2_VOICE_STATE; +typedef OPAQUE XAUDIO2_PERFORMANCE_DATA XAUDIO2_PERFORMANCE_DATA; +typedef OPAQUE XAUDIO2_DEBUG_CONFIGURATION XAUDIO2_DEBUG_CONFIGURATION; +typedef OPAQUE IXAudio2EngineCallback IXAudio2EngineCallback; +typedef OPAQUE IXAudio2SubmixVoice IXAudio2SubmixVoice; +#endif + + +typedef struct XAUDIO2_BUFFER +{ + UINT32 Flags; + UINT32 AudioBytes; + const BYTE* pAudioData; + UINT32 PlayBegin; + UINT32 PlayLength; + UINT32 LoopBegin; + UINT32 LoopLength; + UINT32 LoopCount; + void *pContext; +} XAUDIO2_BUFFER; + +#undef INTERFACE +#define INTERFACE IXAudio2VoiceCallback + +DECLARE_INTERFACE(IXAudio2VoiceCallback) +{ + STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE; + STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE; + STDMETHOD_(void, OnStreamEnd) (THIS) PURE; + STDMETHOD_(void, OnBufferStart) (THIS_ void *pBufferContext) PURE; + STDMETHOD_(void, OnBufferEnd) (THIS_ void *pBufferContext) PURE; + STDMETHOD_(void, OnLoopEnd) (THIS_ void *pBufferContext) PURE; + STDMETHOD_(void, OnVoiceError) (THIS_ void *pBufferContext, HRESULT Error) PURE; +}; + +#undef INTERFACE +#define INTERFACE IXAudio2Voice + +DECLARE_INTERFACE(IXAudio2Voice) +{ +#define Declare_IXAudio2Voice_Methods() \ + STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ + STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \ + STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \ + STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \ + STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \ + const void *pParameters, \ + UINT32 ParametersByteSize, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void *pParameters, \ + UINT32 ParametersByteSize) PURE; \ + STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ + STDMETHOD_(void, SetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, const XAUDIO2_FILTER_PARAMETERS* param, \ + UINT32 op X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, XAUDIO2_FILTER_PARAMETERS* param) PURE; \ + STDMETHOD(SetVolume) (THIS_ float Volume, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \ + STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \ + STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + const float* pLevelMatrix, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + float* pLevelMatrix) PURE; \ + STDMETHOD_(void, DestroyVoice) (THIS) PURE + + Declare_IXAudio2Voice_Methods(); +}; + +#undef INTERFACE +#define INTERFACE IXAudio2MasteringVoice + +DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) +{ + Declare_IXAudio2Voice_Methods(); +}; + +#undef INTERFACE +#define INTERFACE IXAudio2SourceVoice + +DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) +{ + Declare_IXAudio2Voice_Methods(); + STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE; + STDMETHOD(FlushSourceBuffers) (THIS) PURE; + STDMETHOD(Discontinuity) (THIS) PURE; + STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE; + STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio, + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE; +}; + +#undef INTERFACE +#define INTERFACE IXAudio2 + +DECLARE_INTERFACE_(IXAudio2, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE; + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + STDMETHOD_(ULONG, Release) (THIS) PURE; + STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE; + STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE; + STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE; + STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE; + STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE; + STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice, + const WAVEFORMATEX* pSourceFormat, + UINT32 Flags X2DEFAULT(0), + float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO), + IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL), + const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice, + UINT32 InputChannels, UINT32 InputSampleRate, + UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0), + const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice, + UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS), + UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE), + UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0), + const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + STDMETHOD(StartEngine) (THIS) PURE; + STDMETHOD_(void, StopEngine) (THIS) PURE; + STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE; + STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE; + STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration, + void *pReserved X2DEFAULT(NULL)) PURE; +}; + +#if defined(__cplusplus) && !defined(CINTERFACE) +/* C++ hooks */ +#define IXAudio2_Initialize(handle,a,b) handle->Initialize(a, b) +#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, a, b) handle->SubmitSourceBuffer(a, b) +#define IXAudio2SourceVoice_Stop(handle, a, b) handle->Stop(a, b) +#define IXAudio2SourceVoice_DestroyVoice(handle) handle->DestroyVoice() +#define IXAudio2MasteringVoice_DestroyVoice(handle) handle->DestroyVoice() +#define IXAudio2_Release(handle) handle->Release() +#define IXAudio2_CreateSourceVoice(handle, a, b, c, d, e, f, g) handle->CreateSourceVoice(a, b, c, d, e, f, g) +#define IXAudio2_CreateMasteringVoice(handle, a, b, c, d, e, f) handle->CreateMasteringVoice(a, b, c, d, e, f) +#define IXAudio2SourceVoice_Start(handle, a, b) handle->Start(a, b) +#else +/* C hooks */ +#define IXAudio2_Initialize(handle,a,b) (handle)->lpVtbl->Initialize(handle, a, b) +#define IXAudio2_Release(handle) (handle)->lpVtbl->Release(handle) +#define IXAudio2_CreateSourceVoice(handle,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (handle)->lpVtbl->CreateSourceVoice(handle, ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) +#define IXAudio2_CreateMasteringVoice(handle,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (handle)->lpVtbl->CreateMasteringVoice(handle, ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) +#define IXAudio2_GetDeviceCount(handle, puCount) (handle)->lpVtbl->GetDeviceCount(handle, puCount) +#define IXAudio2_GetDeviceDetails(handle, Index,pDeviceDetails) (handle)->lpVtbl->GetDeviceDetails(handle, Index, pDeviceDetails) +#define IXAudio2SourceVoice_Start(handle, Flags, OperationSet) (handle)->lpVtbl->Start(handle, Flags, OperationSet) +#define IXAudio2SourceVoice_Stop(handle, Flags, OperationSet) (handle)->lpVtbl->Stop(handle, Flags, OperationSet) +#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, pBuffer, pBufferWMA) (handle)->lpVtbl->SubmitSourceBuffer(handle, pBuffer, pBufferWMA) +#define IXAudio2SourceVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle) +#define IXAudio2MasteringVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle) +#endif + +#ifdef _XBOX +STDAPI XAudio2Create(__deref_out IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)); +#else +static INLINE HRESULT XAudio2Create(IXAudio2 **ppXAudio2, UINT32 flags, XAUDIO2_PROCESSOR proc) +{ + IXAudio2 *pXAudio2 = NULL; +#ifdef __cplusplus + HRESULT hr = CoCreateInstance(CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2); +#else + HRESULT hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, &IID_IXAudio2, (void**)&pXAudio2); +#endif + + if (SUCCEEDED(hr)) + { + hr = IXAudio2_Initialize(pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR); + if (SUCCEEDED(hr)) + *ppXAudio2 = pXAudio2; + else + IXAudio2_Release(pXAudio2); + } + return hr; +} +#endif + +/* Undo the #pragma pack(push, 1) directive at the top of this file */ +#pragma pack(pop) + +#endif + diff --git a/audio/drivers/xaudio29.h b/audio/drivers/xaudio29.h new file mode 100644 index 0000000000..9743738db0 --- /dev/null +++ b/audio/drivers/xaudio29.h @@ -0,0 +1,1313 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Krzysztof Haładyn + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +/************************************************************************** + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * + * File: xaudio2.h + * Content: Declarations for the XAudio2 game audio API. + * + **************************************************************************/ + +/* Modified slightly to build without requiring the WinRT compiler since that is only available in C++ sources */ + +#ifdef _MSC_VER +#pragma once +#endif + +#ifndef __XAUDIO2_INCLUDED__ +#define __XAUDIO2_INCLUDED__ + +#include + +#if(_WIN32_WINNT < _WIN32_WINNT_WIN8) +#error "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions." +#endif // (_WIN32_WINNT < _WIN32_WINNT_WIN8) + +#include + +#pragma region Application Family +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) + +// Current name of the DLL shipped in the same SDK as this header. +// The name reflects the current version +#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) + #define XAUDIO2_DLL_A "xaudio2_9.dll" + #define XAUDIO2_DLL_W L"xaudio2_9.dll" + #define XAUDIO2D_DLL_A "xaudio2_9d.dll" + #define XAUDIO2D_DLL_W L"xaudio2_9d.dll" +#else + #define XAUDIO2_DLL_A "xaudio2_8.dll" + #define XAUDIO2_DLL_W L"xaudio2_8.dll" + #define XAUDIO2D_DLL_A "xaudio2_8.dll" + #define XAUDIO2D_DLL_W L"xaudio2_8.dll" +#endif + +#ifdef UNICODE + #define XAUDIO2_DLL XAUDIO2_DLL_W + #define XAUDIO2D_DLL XAUDIO2D_DLL_W +#else + #define XAUDIO2_DLL XAUDIO2_DLL_A + #define XAUDIO2D_DLL XAUDIO2D_DLL_A +#endif + + +/************************************************************************** + * + * XAudio2 COM object class and interface IDs. + * + **************************************************************************/ + +#include + +#if defined(__cplusplus__) && defined(__WINRT__) + +#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) + // XAudio 2.9 + interface __declspec(uuid("2B02E3CF-2E0B-4ec3-BE45-1B2A3FE7210D")) IXAudio2; +#else + // XAudio 2.8 + interface __declspec(uuid("60d8dac8-5aa1-4e8e-b597-2f5e2883d484")) IXAudio2; +#endif + +#else + +/* Modified for C support */ +#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) + +#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) + DEFINE_IID_X(IXAudio2, 2B02E3CF, 2E0B, 4ec3, BE, 45, 1B, 2A, 3F, E7, 21, 0D); +#else + DEFINE_IID_X(IXAudio2, 60d8dac8, 5aa1, 4e8e, b5, 97, 2f, 5e, 28, 83, d4, 84); +#endif + +#endif + + +// Ignore the rest of this header if only the GUID definitions were requested +#ifndef GUID_DEFS_ONLY + +#include // Windows COM declarations +#include // Markers for documenting API semantics +#include // Basic data types and constants for audio work +#include // For AUDIO_STREAM_CATEGORY + +// All structures defined in this file use tight field packing +#pragma pack(push, 1) + + +/************************************************************************** + * + * XAudio2 constants, flags and error codes. + * + **************************************************************************/ + +// Numeric boundary values +#define XAUDIO2_MAX_BUFFER_BYTES 0x80000000 // Maximum bytes allowed in a source buffer +#define XAUDIO2_MAX_QUEUED_BUFFERS 64 // Maximum buffers allowed in a voice queue +#define XAUDIO2_MAX_BUFFERS_SYSTEM 2 // Maximum buffers allowed for system threads (Xbox 360 only) +#define XAUDIO2_MAX_AUDIO_CHANNELS 64 // Maximum channels in an audio stream +#define XAUDIO2_MIN_SAMPLE_RATE 1000 // Minimum audio sample rate supported +#define XAUDIO2_MAX_SAMPLE_RATE 200000 // Maximum audio sample rate supported +#define XAUDIO2_MAX_VOLUME_LEVEL 16777216.0f // Maximum acceptable volume level (2^24) +#define XAUDIO2_MIN_FREQ_RATIO (1/1024.0f) // Minimum SetFrequencyRatio argument +#define XAUDIO2_MAX_FREQ_RATIO 1024.0f // Maximum MaxFrequencyRatio argument +#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f // Default MaxFrequencyRatio argument +#define XAUDIO2_MAX_FILTER_ONEOVERQ 1.5f // Maximum XAUDIO2_FILTER_PARAMETERS.OneOverQ +#define XAUDIO2_MAX_FILTER_FREQUENCY 1.0f // Maximum XAUDIO2_FILTER_PARAMETERS.Frequency +#define XAUDIO2_MAX_LOOP_COUNT 254 // Maximum non-infinite XAUDIO2_BUFFER.LoopCount +#define XAUDIO2_MAX_INSTANCES 8 // Maximum simultaneous XAudio2 objects on Xbox 360 + +// For XMA voices on Xbox 360 there is an additional restriction on the MaxFrequencyRatio +// argument and the voice's sample rate: the product of these numbers cannot exceed 600000 +// for one-channel voices or 300000 for voices with more than one channel. +#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MONO 600000 +#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL 300000 + +// Numeric values with special meanings +#define XAUDIO2_COMMIT_NOW 0 // Used as an OperationSet argument +#define XAUDIO2_COMMIT_ALL 0 // Used in IXAudio2::CommitChanges +#define XAUDIO2_INVALID_OPSET (UINT32)(-1) // Not allowed for OperationSet arguments +#define XAUDIO2_NO_LOOP_REGION 0 // Used in XAUDIO2_BUFFER.LoopCount +#define XAUDIO2_LOOP_INFINITE 255 // Used in XAUDIO2_BUFFER.LoopCount +#define XAUDIO2_DEFAULT_CHANNELS 0 // Used in CreateMasteringVoice +#define XAUDIO2_DEFAULT_SAMPLERATE 0 // Used in CreateMasteringVoice + +// Flags +#define XAUDIO2_DEBUG_ENGINE 0x0001 // Used in XAudio2Create +#define XAUDIO2_VOICE_NOPITCH 0x0002 // Used in IXAudio2::CreateSourceVoice +#define XAUDIO2_VOICE_NOSRC 0x0004 // Used in IXAudio2::CreateSourceVoice +#define XAUDIO2_VOICE_USEFILTER 0x0008 // Used in IXAudio2::CreateSource/SubmixVoice +#define XAUDIO2_PLAY_TAILS 0x0020 // Used in IXAudio2SourceVoice::Stop +#define XAUDIO2_END_OF_STREAM 0x0040 // Used in XAUDIO2_BUFFER.Flags +#define XAUDIO2_SEND_USEFILTER 0x0080 // Used in XAUDIO2_SEND_DESCRIPTOR.Flags +#define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 // Used in IXAudio2SourceVoice::GetState +#define XAUDIO2_STOP_ENGINE_WHEN_IDLE 0x2000 // Used in XAudio2Create to force the engine to Stop when no source voices are Started, and Start when a voice is Started +#define XAUDIO2_1024_QUANTUM 0x8000 // Used in XAudio2Create to specify nondefault processing quantum of 21.33 ms (1024 samples at 48KHz) +#define XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT 0x10000 // Used in CreateMasteringVoice to create a virtual audio client + +// Default parameters for the built-in filter +#define XAUDIO2_DEFAULT_FILTER_TYPE LowPassFilter +#define XAUDIO2_DEFAULT_FILTER_FREQUENCY XAUDIO2_MAX_FILTER_FREQUENCY +#define XAUDIO2_DEFAULT_FILTER_ONEOVERQ 1.0f + +// Internal XAudio2 constants +// The audio frame quantum can be calculated by reducing the fraction: +// SamplesPerAudioFrame / SamplesPerSecond +#define XAUDIO2_QUANTUM_NUMERATOR 1 // On Windows, XAudio2 processes audio +#define XAUDIO2_QUANTUM_DENOMINATOR 100 // in 10ms chunks (= 1/100 seconds) +#define XAUDIO2_QUANTUM_MS (1000.0f * XAUDIO2_QUANTUM_NUMERATOR / XAUDIO2_QUANTUM_DENOMINATOR) + +// XAudio2 error codes +#define FACILITY_XAUDIO2 0x896 +#define XAUDIO2_E_INVALID_CALL 0x88960001 // An API call or one of its arguments was illegal +#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 // The XMA hardware suffered an unrecoverable error +#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 // XAudio2 failed to initialize an XAPO effect +#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 // An audio device became unusable (unplugged, etc) + +/************************************************************************** + * + * Forward declarations for the XAudio2 interfaces. + * + **************************************************************************/ + +#ifdef __cplusplus + #define FWD_DECLARE(x) interface x +#else + #define FWD_DECLARE(x) typedef interface x x +#endif + +FWD_DECLARE(IXAudio2); +FWD_DECLARE(IXAudio2Voice); +FWD_DECLARE(IXAudio2SourceVoice); +FWD_DECLARE(IXAudio2SubmixVoice); +FWD_DECLARE(IXAudio2MasteringVoice); +FWD_DECLARE(IXAudio2EngineCallback); +FWD_DECLARE(IXAudio2VoiceCallback); + + +/************************************************************************** + * + * XAudio2 structures and enumerations. + * + **************************************************************************/ + +// Used in XAudio2Create, specifies which CPU(s) to use. +typedef UINT32 XAUDIO2_PROCESSOR; +#define Processor1 0x00000001 +#define Processor2 0x00000002 +#define Processor3 0x00000004 +#define Processor4 0x00000008 +#define Processor5 0x00000010 +#define Processor6 0x00000020 +#define Processor7 0x00000040 +#define Processor8 0x00000080 +#define Processor9 0x00000100 +#define Processor10 0x00000200 +#define Processor11 0x00000400 +#define Processor12 0x00000800 +#define Processor13 0x00001000 +#define Processor14 0x00002000 +#define Processor15 0x00004000 +#define Processor16 0x00008000 +#define Processor17 0x00010000 +#define Processor18 0x00020000 +#define Processor19 0x00040000 +#define Processor20 0x00080000 +#define Processor21 0x00100000 +#define Processor22 0x00200000 +#define Processor23 0x00400000 +#define Processor24 0x00800000 +#define Processor25 0x01000000 +#define Processor26 0x02000000 +#define Processor27 0x04000000 +#define Processor28 0x08000000 +#define Processor29 0x10000000 +#define Processor30 0x20000000 +#define Processor31 0x40000000 +#define Processor32 0x80000000 +#define XAUDIO2_ANY_PROCESSOR 0xffffffff +#define XAUDIO2_DEFAULT_PROCESSOR Processor1 + +// Returned by IXAudio2Voice::GetVoiceDetails +typedef struct XAUDIO2_VOICE_DETAILS +{ + UINT32 CreationFlags; // Flags the voice was created with. + UINT32 ActiveFlags; // Flags currently active. + UINT32 InputChannels; // Channels in the voice's input audio. + UINT32 InputSampleRate; // Sample rate of the voice's input audio. +} XAUDIO2_VOICE_DETAILS; + +// Used in XAUDIO2_VOICE_SENDS below +typedef struct XAUDIO2_SEND_DESCRIPTOR +{ + UINT32 Flags; // Either 0 or XAUDIO2_SEND_USEFILTER. + IXAudio2Voice* pOutputVoice; // This send's destination voice. +} XAUDIO2_SEND_DESCRIPTOR; + +// Used in the voice creation functions and in IXAudio2Voice::SetOutputVoices +typedef struct XAUDIO2_VOICE_SENDS +{ + UINT32 SendCount; // Number of sends from this voice. + XAUDIO2_SEND_DESCRIPTOR* pSends; // Array of SendCount send descriptors. +} XAUDIO2_VOICE_SENDS; + +// Used in XAUDIO2_EFFECT_CHAIN below +typedef struct XAUDIO2_EFFECT_DESCRIPTOR +{ + IUnknown* pEffect; // Pointer to the effect object's IUnknown interface. + BOOL InitialState; // TRUE if the effect should begin in the enabled state. + UINT32 OutputChannels; // How many output channels the effect should produce. +} XAUDIO2_EFFECT_DESCRIPTOR; + +// Used in the voice creation functions and in IXAudio2Voice::SetEffectChain +typedef struct XAUDIO2_EFFECT_CHAIN +{ + UINT32 EffectCount; // Number of effects in this voice's effect chain. + XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; // Array of effect descriptors. +} XAUDIO2_EFFECT_CHAIN; + +// Used in XAUDIO2_FILTER_PARAMETERS below +typedef enum XAUDIO2_FILTER_TYPE +{ + LowPassFilter, // Attenuates frequencies above the cutoff frequency (state-variable filter). + BandPassFilter, // Attenuates frequencies outside a given range (state-variable filter). + HighPassFilter, // Attenuates frequencies below the cutoff frequency (state-variable filter). + NotchFilter, // Attenuates frequencies inside a given range (state-variable filter). + LowPassOnePoleFilter, // Attenuates frequencies above the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) + HighPassOnePoleFilter // Attenuates frequencies below the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) +} XAUDIO2_FILTER_TYPE; + +// Used in IXAudio2Voice::Set/GetFilterParameters and Set/GetOutputFilterParameters +typedef struct XAUDIO2_FILTER_PARAMETERS +{ + XAUDIO2_FILTER_TYPE Type; // Filter type. + float Frequency; // Filter coefficient. + // must be >= 0 and <= XAUDIO2_MAX_FILTER_FREQUENCY + // See XAudio2CutoffFrequencyToRadians() for state-variable filter types and + // XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. + float OneOverQ; // Reciprocal of the filter's quality factor Q; + // must be > 0 and <= XAUDIO2_MAX_FILTER_ONEOVERQ. + // Has no effect for one-pole filters. +} XAUDIO2_FILTER_PARAMETERS; + +// Used in IXAudio2SourceVoice::SubmitSourceBuffer +typedef struct XAUDIO2_BUFFER +{ + UINT32 Flags; // Either 0 or XAUDIO2_END_OF_STREAM. + UINT32 AudioBytes; // Size of the audio data buffer in bytes. + const BYTE* pAudioData; // Pointer to the audio data buffer. + UINT32 PlayBegin; // First sample in this buffer to be played. + UINT32 PlayLength; // Length of the region to be played in samples, + // or 0 to play the whole buffer. + UINT32 LoopBegin; // First sample of the region to be looped. + UINT32 LoopLength; // Length of the desired loop region in samples, + // or 0 to loop the entire buffer. + UINT32 LoopCount; // Number of times to repeat the loop region, + // or XAUDIO2_LOOP_INFINITE to loop forever. + void* pContext; // Context value to be passed back in callbacks. +} XAUDIO2_BUFFER; + +// Used in IXAudio2SourceVoice::SubmitSourceBuffer when submitting XWMA data. +// NOTE: If an XWMA sound is submitted in more than one buffer, each buffer's +// pDecodedPacketCumulativeBytes[PacketCount-1] value must be subtracted from +// all the entries in the next buffer's pDecodedPacketCumulativeBytes array. +// And whether a sound is submitted in more than one buffer or not, the final +// buffer of the sound should use the XAUDIO2_END_OF_STREAM flag, or else the +// client must call IXAudio2SourceVoice::Discontinuity after submitting it. +typedef struct XAUDIO2_BUFFER_WMA +{ + const UINT32* pDecodedPacketCumulativeBytes; // Decoded packet's cumulative size array. + // Each element is the number of bytes accumulated + // when the corresponding XWMA packet is decoded in + // order. The array must have PacketCount elements. + UINT32 PacketCount; // Number of XWMA packets submitted. Must be >= 1 and + // divide evenly into XAUDIO2_BUFFER.AudioBytes. +} XAUDIO2_BUFFER_WMA; + +// Returned by IXAudio2SourceVoice::GetState +typedef struct XAUDIO2_VOICE_STATE +{ + void* pCurrentBufferContext; // The pContext value provided in the XAUDIO2_BUFFER + // that is currently being processed, or NULL if + // there are no buffers in the queue. + UINT32 BuffersQueued; // Number of buffers currently queued on the voice + // (including the one that is being processed). + UINT64 SamplesPlayed; // Total number of samples produced by the voice since + // it began processing the current audio stream. + // If XAUDIO2_VOICE_NOSAMPLESPLAYED is specified + // in the call to IXAudio2SourceVoice::GetState, + // this member will not be calculated, saving CPU. +} XAUDIO2_VOICE_STATE; + +// Returned by IXAudio2::GetPerformanceData +typedef struct XAUDIO2_PERFORMANCE_DATA +{ + // CPU usage information + UINT64 AudioCyclesSinceLastQuery; // CPU cycles spent on audio processing since the + // last call to StartEngine or GetPerformanceData. + UINT64 TotalCyclesSinceLastQuery; // Total CPU cycles elapsed since the last call + // (only counts the CPU XAudio2 is running on). + UINT32 MinimumCyclesPerQuantum; // Fewest CPU cycles spent processing any one + // audio quantum since the last call. + UINT32 MaximumCyclesPerQuantum; // Most CPU cycles spent processing any one + // audio quantum since the last call. + + // Memory usage information + UINT32 MemoryUsageInBytes; // Total heap space currently in use. + + // Audio latency and glitching information + UINT32 CurrentLatencyInSamples; // Minimum delay from when a sample is read from a + // source buffer to when it reaches the speakers. + UINT32 GlitchesSinceEngineStarted; // Audio dropouts since the engine was started. + + // Data about XAudio2's current workload + UINT32 ActiveSourceVoiceCount; // Source voices currently playing. + UINT32 TotalSourceVoiceCount; // Source voices currently existing. + UINT32 ActiveSubmixVoiceCount; // Submix voices currently playing/existing. + + UINT32 ActiveResamplerCount; // Resample xAPOs currently active. + UINT32 ActiveMatrixMixCount; // MatrixMix xAPOs currently active. + + // Usage of the hardware XMA decoder (Xbox 360 only) + UINT32 ActiveXmaSourceVoices; // Number of source voices decoding XMA data. + UINT32 ActiveXmaStreams; // A voice can use more than one XMA stream. +} XAUDIO2_PERFORMANCE_DATA; + +// Used in IXAudio2::SetDebugConfiguration +typedef struct XAUDIO2_DEBUG_CONFIGURATION +{ + UINT32 TraceMask; // Bitmap of enabled debug message types. + UINT32 BreakMask; // Message types that will break into the debugger. + BOOL LogThreadID; // Whether to log the thread ID with each message. + BOOL LogFileline; // Whether to log the source file and line number. + BOOL LogFunctionName; // Whether to log the function name. + BOOL LogTiming; // Whether to log message timestamps. +} XAUDIO2_DEBUG_CONFIGURATION; + +// Values for the TraceMask and BreakMask bitmaps. Only ERRORS and WARNINGS +// are valid in BreakMask. WARNINGS implies ERRORS, DETAIL implies INFO, and +// FUNC_CALLS implies API_CALLS. By default, TraceMask is ERRORS and WARNINGS +// and all the other settings are zero. +#define XAUDIO2_LOG_ERRORS 0x0001 // For handled errors with serious effects. +#define XAUDIO2_LOG_WARNINGS 0x0002 // For handled errors that may be recoverable. +#define XAUDIO2_LOG_INFO 0x0004 // Informational chit-chat (e.g. state changes). +#define XAUDIO2_LOG_DETAIL 0x0008 // More detailed chit-chat. +#define XAUDIO2_LOG_API_CALLS 0x0010 // Public API function entries and exits. +#define XAUDIO2_LOG_FUNC_CALLS 0x0020 // Internal function entries and exits. +#define XAUDIO2_LOG_TIMING 0x0040 // Delays detected and other timing data. +#define XAUDIO2_LOG_LOCKS 0x0080 // Usage of critical sections and mutexes. +#define XAUDIO2_LOG_MEMORY 0x0100 // Memory heap usage information. +#define XAUDIO2_LOG_STREAMING 0x1000 // Audio streaming information. + + +/************************************************************************** + * + * IXAudio2: Top-level XAudio2 COM interface. + * + **************************************************************************/ + +// Use default arguments if compiling as C++ +#ifdef __cplusplus + #define X2DEFAULT(x) =x +#else + #define X2DEFAULT(x) +#endif + +#undef INTERFACE +#define INTERFACE IXAudio2 +DECLARE_INTERFACE_(IXAudio2, IUnknown) +{ + // NAME: IXAudio2::QueryInterface + // DESCRIPTION: Queries for a given COM interface on the XAudio2 object. + // Only IID_IUnknown and IID_IXAudio2 are supported. + // + // ARGUMENTS: + // riid - IID of the interface to be obtained. + // ppvInterface - Returns a pointer to the requested interface. + // + STDMETHOD(QueryInterface) (THIS_ REFIID riid, _Outptr_ void** ppvInterface) PURE; + + // NAME: IXAudio2::AddRef + // DESCRIPTION: Adds a reference to the XAudio2 object. + // + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + + // NAME: IXAudio2::Release + // DESCRIPTION: Releases a reference to the XAudio2 object. + // + STDMETHOD_(ULONG, Release) (THIS) PURE; + + // NAME: IXAudio2::RegisterForCallbacks + // DESCRIPTION: Adds a new client to receive XAudio2's engine callbacks. + // + // ARGUMENTS: + // pCallback - Callback interface to be called during each processing pass. + // + STDMETHOD(RegisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE; + + // NAME: IXAudio2::UnregisterForCallbacks + // DESCRIPTION: Removes an existing receiver of XAudio2 engine callbacks. + // + // ARGUMENTS: + // pCallback - Previously registered callback interface to be removed. + // + STDMETHOD_(void, UnregisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE; + + // NAME: IXAudio2::CreateSourceVoice + // DESCRIPTION: Creates and configures a source voice. + // + // ARGUMENTS: + // ppSourceVoice - Returns the new object's IXAudio2SourceVoice interface. + // pSourceFormat - Format of the audio that will be fed to the voice. + // Flags - XAUDIO2_VOICE flags specifying the source voice's behavior. + // MaxFrequencyRatio - Maximum SetFrequencyRatio argument to be allowed. + // pCallback - Optional pointer to a client-provided callback interface. + // pSendList - Optional list of voices this voice should send audio to. + // pEffectChain - Optional list of effects to apply to the audio data. + // + STDMETHOD(CreateSourceVoice) (THIS_ _Outptr_ IXAudio2SourceVoice** ppSourceVoice, + _In_ const WAVEFORMATEX* pSourceFormat, + UINT32 Flags X2DEFAULT(0), + float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO), + _In_opt_ IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + + // NAME: IXAudio2::CreateSubmixVoice + // DESCRIPTION: Creates and configures a submix voice. + // + // ARGUMENTS: + // ppSubmixVoice - Returns the new object's IXAudio2SubmixVoice interface. + // InputChannels - Number of channels in this voice's input audio data. + // InputSampleRate - Sample rate of this voice's input audio data. + // Flags - XAUDIO2_VOICE flags specifying the submix voice's behavior. + // ProcessingStage - Arbitrary number that determines the processing order. + // pSendList - Optional list of voices this voice should send audio to. + // pEffectChain - Optional list of effects to apply to the audio data. + // + STDMETHOD(CreateSubmixVoice) (THIS_ _Outptr_ IXAudio2SubmixVoice** ppSubmixVoice, + UINT32 InputChannels, UINT32 InputSampleRate, + UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0), + _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + + + // NAME: IXAudio2::CreateMasteringVoice + // DESCRIPTION: Creates and configures a mastering voice. + // + // ARGUMENTS: + // ppMasteringVoice - Returns the new object's IXAudio2MasteringVoice interface. + // InputChannels - Number of channels in this voice's input audio data. + // InputSampleRate - Sample rate of this voice's input audio data. + // Flags - XAUDIO2_VOICE flags specifying the mastering voice's behavior. + // szDeviceId - Identifier of the device to receive the output audio. + // pEffectChain - Optional list of effects to apply to the audio data. + // StreamCategory - The audio stream category to use for this mastering voice + // + STDMETHOD(CreateMasteringVoice) (THIS_ _Outptr_ IXAudio2MasteringVoice** ppMasteringVoice, + UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS), + UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE), + UINT32 Flags X2DEFAULT(0), _In_opt_z_ LPCWSTR szDeviceId X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL), + _In_ AUDIO_STREAM_CATEGORY StreamCategory X2DEFAULT(AudioCategory_GameEffects)) PURE; + + // NAME: IXAudio2::StartEngine + // DESCRIPTION: Creates and starts the audio processing thread. + // + STDMETHOD(StartEngine) (THIS) PURE; + + // NAME: IXAudio2::StopEngine + // DESCRIPTION: Stops and destroys the audio processing thread. + // + STDMETHOD_(void, StopEngine) (THIS) PURE; + + // NAME: IXAudio2::CommitChanges + // DESCRIPTION: Atomically applies a set of operations previously tagged + // with a given identifier. + // + // ARGUMENTS: + // OperationSet - Identifier of the set of operations to be applied. + // + STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE; + + // NAME: IXAudio2::GetPerformanceData + // DESCRIPTION: Returns current resource usage details: memory, CPU, etc. + // + // ARGUMENTS: + // pPerfData - Returns the performance data structure. + // + STDMETHOD_(void, GetPerformanceData) (THIS_ _Out_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE; + + // NAME: IXAudio2::SetDebugConfiguration + // DESCRIPTION: Configures XAudio2's debug output (in debug builds only). + // + // ARGUMENTS: + // pDebugConfiguration - Structure describing the debug output behavior. + // pReserved - Optional parameter; must be NULL. + // + STDMETHOD_(void, SetDebugConfiguration) (THIS_ _In_opt_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration, + _Reserved_ void* pReserved X2DEFAULT(NULL)) PURE; +}; + + +/************************************************************************** + * + * IXAudio2Voice: Base voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2Voice +DECLARE_INTERFACE(IXAudio2Voice) +{ + // These methods are declared in a macro so that the same declarations + // can be used in the derived voice types (IXAudio2SourceVoice, etc). + + #define Declare_IXAudio2Voice_Methods() \ + \ + /* NAME: IXAudio2Voice::GetVoiceDetails + // DESCRIPTION: Returns the basic characteristics of this voice. + // + // ARGUMENTS: + // pVoiceDetails - Returns the voice's details. + */\ + STDMETHOD_(void, GetVoiceDetails) (THIS_ _Out_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ + \ + /* NAME: IXAudio2Voice::SetOutputVoices + // DESCRIPTION: Replaces the set of submix/mastering voices that receive + // this voice's output. + // + // ARGUMENTS: + // pSendList - Optional list of voices this voice should send audio to. + */\ + STDMETHOD(SetOutputVoices) (THIS_ _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \ + \ + /* NAME: IXAudio2Voice::SetEffectChain + // DESCRIPTION: Replaces this voice's current effect chain with a new one. + // + // ARGUMENTS: + // pEffectChain - Structure describing the new effect chain to be used. + */\ + STDMETHOD(SetEffectChain) (THIS_ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \ + \ + /* NAME: IXAudio2Voice::EnableEffect + // DESCRIPTION: Enables an effect in this voice's effect chain. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::DisableEffect + // DESCRIPTION: Disables an effect in this voice's effect chain. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetEffectState + // DESCRIPTION: Returns the running state of an effect. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // pEnabled - Returns the enabled/disabled state of the given effect. + */\ + STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, _Out_ BOOL* pEnabled) PURE; \ + \ + /* NAME: IXAudio2Voice::SetEffectParameters + // DESCRIPTION: Sets effect-specific parameters. + // + // REMARKS: Unlike IXAPOParameters::SetParameters, this method may + // be called from any thread. XAudio2 implements + // appropriate synchronization to copy the parameters to the + // realtime audio processing thread. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // pParameters - Pointer to an effect-specific parameters block. + // ParametersByteSize - Size of the pParameters array in bytes. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \ + _In_reads_bytes_(ParametersByteSize) const void* pParameters, \ + UINT32 ParametersByteSize, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetEffectParameters + // DESCRIPTION: Obtains the current effect-specific parameters. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // pParameters - Returns the current values of the effect-specific parameters. + // ParametersByteSize - Size of the pParameters array in bytes. + */\ + STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, \ + _Out_writes_bytes_(ParametersByteSize) void* pParameters, \ + UINT32 ParametersByteSize) PURE; \ + \ + /* NAME: IXAudio2Voice::SetFilterParameters + // DESCRIPTION: Sets this voice's filter parameters. + // + // ARGUMENTS: + // pParameters - Pointer to the filter's parameter structure. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetFilterParameters) (THIS_ _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetFilterParameters + // DESCRIPTION: Returns this voice's current filter parameters. + // + // ARGUMENTS: + // pParameters - Returns the filter parameters. + */\ + STDMETHOD_(void, GetFilterParameters) (THIS_ _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ + \ + /* NAME: IXAudio2Voice::SetOutputFilterParameters + // DESCRIPTION: Sets the filter parameters on one of this voice's sends. + // + // ARGUMENTS: + // pDestinationVoice - Destination voice of the send whose filter parameters will be set. + // pParameters - Pointer to the filter's parameter structure. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetOutputFilterParameters + // DESCRIPTION: Returns the filter parameters from one of this voice's sends. + // + // ARGUMENTS: + // pDestinationVoice - Destination voice of the send whose filter parameters will be read. + // pParameters - Returns the filter parameters. + */\ + STDMETHOD_(void, GetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ + \ + /* NAME: IXAudio2Voice::SetVolume + // DESCRIPTION: Sets this voice's overall volume level. + // + // ARGUMENTS: + // Volume - New overall volume level to be used, as an amplitude factor. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetVolume) (THIS_ float Volume, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetVolume + // DESCRIPTION: Obtains this voice's current overall volume level. + // + // ARGUMENTS: + // pVolume: Returns the voice's current overall volume level. + */\ + STDMETHOD_(void, GetVolume) (THIS_ _Out_ float* pVolume) PURE; \ + \ + /* NAME: IXAudio2Voice::SetChannelVolumes + // DESCRIPTION: Sets this voice's per-channel volume levels. + // + // ARGUMENTS: + // Channels - Used to confirm the voice's channel count. + // pVolumes - Array of per-channel volume levels to be used. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, _In_reads_(Channels) const float* pVolumes, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetChannelVolumes + // DESCRIPTION: Returns this voice's current per-channel volume levels. + // + // ARGUMENTS: + // Channels - Used to confirm the voice's channel count. + // pVolumes - Returns an array of the current per-channel volume levels. + */\ + STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, _Out_writes_(Channels) float* pVolumes) PURE; \ + \ + /* NAME: IXAudio2Voice::SetOutputMatrix + // DESCRIPTION: Sets the volume levels used to mix from each channel of this + // voice's output audio to each channel of a given destination + // voice's input audio. + // + // ARGUMENTS: + // pDestinationVoice - The destination voice whose mix matrix to change. + // SourceChannels - Used to confirm this voice's output channel count + // (the number of channels produced by the last effect in the chain). + // DestinationChannels - Confirms the destination voice's input channels. + // pLevelMatrix - Array of [SourceChannels * DestinationChannels] send + // levels. The level used to send from source channel S to destination + // channel D should be in pLevelMatrix[S + SourceChannels * D]. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + _In_reads_(SourceChannels * DestinationChannels) const float* pLevelMatrix, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetOutputMatrix + // DESCRIPTION: Obtains the volume levels used to send each channel of this + // voice's output audio to each channel of a given destination + // voice's input audio. + // + // ARGUMENTS: + // pDestinationVoice - The destination voice whose mix matrix to obtain. + // SourceChannels - Used to confirm this voice's output channel count + // (the number of channels produced by the last effect in the chain). + // DestinationChannels - Confirms the destination voice's input channels. + // pLevelMatrix - Array of send levels, as above. + */\ + STDMETHOD_(void, GetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + _Out_writes_(SourceChannels * DestinationChannels) float* pLevelMatrix) PURE; \ + \ + /* NAME: IXAudio2Voice::DestroyVoice + // DESCRIPTION: Destroys this voice, stopping it if necessary and removing + // it from the XAudio2 graph. + */\ + STDMETHOD_(void, DestroyVoice) (THIS) PURE + + Declare_IXAudio2Voice_Methods(); +}; + + +/************************************************************************** + * + * IXAudio2SourceVoice: Source voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2SourceVoice +DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) +{ + // Methods from IXAudio2Voice base interface + Declare_IXAudio2Voice_Methods(); + + // NAME: IXAudio2SourceVoice::Start + // DESCRIPTION: Makes this voice start consuming and processing audio. + // + // ARGUMENTS: + // Flags - Flags controlling how the voice should be started. + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(Start) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::Stop + // DESCRIPTION: Makes this voice stop consuming audio. + // + // ARGUMENTS: + // Flags - Flags controlling how the voice should be stopped. + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(Stop) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::SubmitSourceBuffer + // DESCRIPTION: Adds a new audio buffer to this voice's input queue. + // + // ARGUMENTS: + // pBuffer - Pointer to the buffer structure to be queued. + // pBufferWMA - Additional structure used only when submitting XWMA data. + // + STDMETHOD(SubmitSourceBuffer) (THIS_ _In_ const XAUDIO2_BUFFER* pBuffer, _In_opt_ const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE; + + // NAME: IXAudio2SourceVoice::FlushSourceBuffers + // DESCRIPTION: Removes all pending audio buffers from this voice's queue. + // + STDMETHOD(FlushSourceBuffers) (THIS) PURE; + + // NAME: IXAudio2SourceVoice::Discontinuity + // DESCRIPTION: Notifies the voice of an intentional break in the stream of + // audio buffers (e.g. the end of a sound), to prevent XAudio2 + // from interpreting an empty buffer queue as a glitch. + // + STDMETHOD(Discontinuity) (THIS) PURE; + + // NAME: IXAudio2SourceVoice::ExitLoop + // DESCRIPTION: Breaks out of the current loop when its end is reached. + // + // ARGUMENTS: + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::GetState + // DESCRIPTION: Returns the number of buffers currently queued on this voice, + // the pContext value associated with the currently processing + // buffer (if any), and other voice state information. + // + // ARGUMENTS: + // pVoiceState - Returns the state information. + // Flags - Flags controlling what voice state is returned. + // + STDMETHOD_(void, GetState) (THIS_ _Out_ XAUDIO2_VOICE_STATE* pVoiceState, UINT32 Flags X2DEFAULT(0)) PURE; + + // NAME: IXAudio2SourceVoice::SetFrequencyRatio + // DESCRIPTION: Sets this voice's frequency adjustment, i.e. its pitch. + // + // ARGUMENTS: + // Ratio - Frequency change, expressed as source frequency / target frequency. + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio, + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::GetFrequencyRatio + // DESCRIPTION: Returns this voice's current frequency adjustment ratio. + // + // ARGUMENTS: + // pRatio - Returns the frequency adjustment. + // + STDMETHOD_(void, GetFrequencyRatio) (THIS_ _Out_ float* pRatio) PURE; + + // NAME: IXAudio2SourceVoice::SetSourceSampleRate + // DESCRIPTION: Reconfigures this voice to treat its source data as being + // at a different sample rate than the original one specified + // in CreateSourceVoice's pSourceFormat argument. + // + // ARGUMENTS: + // UINT32 - The intended sample rate of further submitted source data. + // + STDMETHOD(SetSourceSampleRate) (THIS_ UINT32 NewSourceSampleRate) PURE; +}; + + +/************************************************************************** + * + * IXAudio2SubmixVoice: Submixing voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2SubmixVoice +DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice) +{ + // Methods from IXAudio2Voice base interface + Declare_IXAudio2Voice_Methods(); + + // There are currently no methods specific to submix voices. +}; + + +/************************************************************************** + * + * IXAudio2MasteringVoice: Mastering voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2MasteringVoice +DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) +{ + // Methods from IXAudio2Voice base interface + Declare_IXAudio2Voice_Methods(); + + // NAME: IXAudio2MasteringVoice::GetChannelMask + // DESCRIPTION: Returns the channel mask for this voice + // + // ARGUMENTS: + // pChannelMask - returns the channel mask for this voice. This corresponds + // to the dwChannelMask member of WAVEFORMATEXTENSIBLE. + // + STDMETHOD(GetChannelMask) (THIS_ _Out_ DWORD* pChannelmask) PURE; +}; + + +/************************************************************************** + * + * IXAudio2EngineCallback: Client notification interface for engine events. + * + * REMARKS: Contains methods to notify the client when certain events happen + * in the XAudio2 engine. This interface should be implemented by + * the client. XAudio2 will call these methods via the interface + * pointer provided by the client when it calls + * IXAudio2::RegisterForCallbacks. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2EngineCallback +DECLARE_INTERFACE(IXAudio2EngineCallback) +{ + // Called by XAudio2 just before an audio processing pass begins. + STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE; + + // Called just after an audio processing pass ends. + STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE; + + // Called in the event of a critical system error which requires XAudio2 + // to be closed down and restarted. The error code is given in Error. + STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE; +}; + + +/************************************************************************** + * + * IXAudio2VoiceCallback: Client notification interface for voice events. + * + * REMARKS: Contains methods to notify the client when certain events happen + * in an XAudio2 voice. This interface should be implemented by the + * client. XAudio2 will call these methods via an interface pointer + * provided by the client in the IXAudio2::CreateSourceVoice call. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2VoiceCallback +DECLARE_INTERFACE(IXAudio2VoiceCallback) +{ + // Called just before this voice's processing pass begins. + STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE; + + // Called just after this voice's processing pass ends. + STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE; + + // Called when this voice has just finished playing a buffer stream + // (as marked with the XAUDIO2_END_OF_STREAM flag on the last buffer). + STDMETHOD_(void, OnStreamEnd) (THIS) PURE; + + // Called when this voice is about to start processing a new buffer. + STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE; + + // Called when this voice has just finished processing a buffer. + // The buffer can now be reused or destroyed. + STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE; + + // Called when this voice has just reached the end position of a loop. + STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE; + + // Called in the event of a critical error during voice processing, + // such as a failing xAPO or an error from the hardware XMA decoder. + // The voice may have to be destroyed and re-created to recover from + // the error. The callback arguments report which buffer was being + // processed when the error occurred, and its HRESULT code. + STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE; +}; + + +/************************************************************************** + * + * Macros to make it easier to use the XAudio2 COM interfaces in C code. + * + **************************************************************************/ + +#ifndef __cplusplus + +// IXAudio2 +#define IXAudio2_QueryInterface(This,riid,ppvInterface) ((This)->lpVtbl->QueryInterface(This,riid,ppvInterface)) +#define IXAudio2_AddRef(This) ((This)->lpVtbl->AddRef(This)) +#define IXAudio2_Release(This) ((This)->lpVtbl->Release(This)) +#define IXAudio2_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) ((This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)) +#define IXAudio2_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) ((This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)) +#define IXAudio2_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory) ((This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory)) +#define IXAudio2_StartEngine(This) ((This)->lpVtbl->StartEngine(This)) +#define IXAudio2_StopEngine(This) ((This)->lpVtbl->StopEngine(This)) +#define IXAudio2_CommitChanges(This,OperationSet) ((This)->lpVtbl->CommitChanges(This,OperationSet)) +#define IXAudio2_GetPerformanceData(This,pPerfData) ((This)->lpVtbl->GetPerformanceData(This,pPerfData)) +#define IXAudio2_SetDebugConfiguration(This,pDebugConfiguration,pReserved) ((This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)) + +// IXAudio2Voice +#define IXAudio2Voice_GetVoiceDetails(This,pVoiceDetails) ((This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)) +#define IXAudio2Voice_SetOutputVoices(This,pSendList) ((This)->lpVtbl->SetOutputVoices(This,pSendList)) +#define IXAudio2Voice_SetEffectChain(This,pEffectChain) ((This)->lpVtbl->SetEffectChain(This,pEffectChain)) +#define IXAudio2Voice_EnableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)) +#define IXAudio2Voice_DisableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)) +#define IXAudio2Voice_GetEffectState(This,EffectIndex,pEnabled) ((This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)) +#define IXAudio2Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize, OperationSet) ((This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)) +#define IXAudio2Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) ((This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)) +#define IXAudio2Voice_SetFilterParameters(This,pParameters,OperationSet) ((This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)) +#define IXAudio2Voice_GetFilterParameters(This,pParameters) ((This)->lpVtbl->GetFilterParameters(This,pParameters)) +#define IXAudio2Voice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) ((This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)) +#define IXAudio2Voice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) ((This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)) +#define IXAudio2Voice_SetVolume(This,Volume,OperationSet) ((This)->lpVtbl->SetVolume(This,Volume,OperationSet)) +#define IXAudio2Voice_GetVolume(This,pVolume) ((This)->lpVtbl->GetVolume(This,pVolume)) +#define IXAudio2Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) ((This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)) +#define IXAudio2Voice_GetChannelVolumes(This,Channels,pVolumes) ((This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)) +#define IXAudio2Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) ((This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)) +#define IXAudio2Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) ((This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)) +#define IXAudio2Voice_DestroyVoice(This) ((This)->lpVtbl->DestroyVoice(This)) + +// IXAudio2SourceVoice +#define IXAudio2SourceVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails +#define IXAudio2SourceVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices +#define IXAudio2SourceVoice_SetEffectChain IXAudio2Voice_SetEffectChain +#define IXAudio2SourceVoice_EnableEffect IXAudio2Voice_EnableEffect +#define IXAudio2SourceVoice_DisableEffect IXAudio2Voice_DisableEffect +#define IXAudio2SourceVoice_GetEffectState IXAudio2Voice_GetEffectState +#define IXAudio2SourceVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters +#define IXAudio2SourceVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters +#define IXAudio2SourceVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters +#define IXAudio2SourceVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters +#define IXAudio2SourceVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters +#define IXAudio2SourceVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters +#define IXAudio2SourceVoice_SetVolume IXAudio2Voice_SetVolume +#define IXAudio2SourceVoice_GetVolume IXAudio2Voice_GetVolume +#define IXAudio2SourceVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes +#define IXAudio2SourceVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes +#define IXAudio2SourceVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix +#define IXAudio2SourceVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix +#define IXAudio2SourceVoice_DestroyVoice IXAudio2Voice_DestroyVoice +#define IXAudio2SourceVoice_Start(This,Flags,OperationSet) ((This)->lpVtbl->Start(This,Flags,OperationSet)) +#define IXAudio2SourceVoice_Stop(This,Flags,OperationSet) ((This)->lpVtbl->Stop(This,Flags,OperationSet)) +#define IXAudio2SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) ((This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)) +#define IXAudio2SourceVoice_FlushSourceBuffers(This) ((This)->lpVtbl->FlushSourceBuffers(This)) +#define IXAudio2SourceVoice_Discontinuity(This) ((This)->lpVtbl->Discontinuity(This)) +#define IXAudio2SourceVoice_ExitLoop(This,OperationSet) ((This)->lpVtbl->ExitLoop(This,OperationSet)) +#define IXAudio2SourceVoice_GetState(This,pVoiceState,Flags) ((This)->lpVtbl->GetState(This,pVoiceState,Flags)) +#define IXAudio2SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) ((This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)) +#define IXAudio2SourceVoice_GetFrequencyRatio(This,pRatio) ((This)->lpVtbl->GetFrequencyRatio(This,pRatio)) +#define IXAudio2SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) ((This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate)) + +// IXAudio2SubmixVoice +#define IXAudio2SubmixVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails +#define IXAudio2SubmixVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices +#define IXAudio2SubmixVoice_SetEffectChain IXAudio2Voice_SetEffectChain +#define IXAudio2SubmixVoice_EnableEffect IXAudio2Voice_EnableEffect +#define IXAudio2SubmixVoice_DisableEffect IXAudio2Voice_DisableEffect +#define IXAudio2SubmixVoice_GetEffectState IXAudio2Voice_GetEffectState +#define IXAudio2SubmixVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters +#define IXAudio2SubmixVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters +#define IXAudio2SubmixVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters +#define IXAudio2SubmixVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters +#define IXAudio2SubmixVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters +#define IXAudio2SubmixVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters +#define IXAudio2SubmixVoice_SetVolume IXAudio2Voice_SetVolume +#define IXAudio2SubmixVoice_GetVolume IXAudio2Voice_GetVolume +#define IXAudio2SubmixVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes +#define IXAudio2SubmixVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes +#define IXAudio2SubmixVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix +#define IXAudio2SubmixVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix +#define IXAudio2SubmixVoice_DestroyVoice IXAudio2Voice_DestroyVoice + +// IXAudio2MasteringVoice +#define IXAudio2MasteringVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails +#define IXAudio2MasteringVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices +#define IXAudio2MasteringVoice_SetEffectChain IXAudio2Voice_SetEffectChain +#define IXAudio2MasteringVoice_EnableEffect IXAudio2Voice_EnableEffect +#define IXAudio2MasteringVoice_DisableEffect IXAudio2Voice_DisableEffect +#define IXAudio2MasteringVoice_GetEffectState IXAudio2Voice_GetEffectState +#define IXAudio2MasteringVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters +#define IXAudio2MasteringVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters +#define IXAudio2MasteringVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters +#define IXAudio2MasteringVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters +#define IXAudio2MasteringVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters +#define IXAudio2MasteringVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters +#define IXAudio2MasteringVoice_SetVolume IXAudio2Voice_SetVolume +#define IXAudio2MasteringVoice_GetVolume IXAudio2Voice_GetVolume +#define IXAudio2MasteringVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes +#define IXAudio2MasteringVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes +#define IXAudio2MasteringVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix +#define IXAudio2MasteringVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix +#define IXAudio2MasteringVoice_DestroyVoice IXAudio2Voice_DestroyVoice +#define IXAudio2MasteringVoice_GetChannelMask(This,pChannelMask) ((This)->lpVtbl->GetChannelMask(This,pChannelMask)) + +#endif // #ifndef __cplusplus + + +/************************************************************************** + * + * Utility functions used to convert from pitch in semitones and volume + * in decibels to the frequency and amplitude ratio units used by XAudio2. + * These are only defined if the client #defines XAUDIO2_HELPER_FUNCTIONS + * prior to #including xaudio2.h. + * + **************************************************************************/ + +#ifdef XAUDIO2_HELPER_FUNCTIONS + +#define _USE_MATH_DEFINES // Make math.h define M_PI +#include // For powf, log10f, sinf and asinf + +// Calculate the argument to SetVolume from a decibel value +__inline float XAudio2DecibelsToAmplitudeRatio(float Decibels) +{ + return powf(10.0f, Decibels / 20.0f); +} + +// Recover a volume in decibels from an amplitude factor +__inline float XAudio2AmplitudeRatioToDecibels(float Volume) +{ + if (Volume == 0) + { + return -3.402823466e+38f; // Smallest float value (-FLT_MAX) + } + return 20.0f * log10f(Volume); +} + +// Calculate the argument to SetFrequencyRatio from a semitone value +__inline float XAudio2SemitonesToFrequencyRatio(float Semitones) +{ + // FrequencyRatio = 2 ^ Octaves + // = 2 ^ (Semitones / 12) + return powf(2.0f, Semitones / 12.0f); +} + +// Recover a pitch in semitones from a frequency ratio +__inline float XAudio2FrequencyRatioToSemitones(float FrequencyRatio) +{ + // Semitones = 12 * log2(FrequencyRatio) + // = 12 * log2(10) * log10(FrequencyRatio) + return 39.86313713864835f * log10f(FrequencyRatio); +} + +// Convert from filter cutoff frequencies expressed in Hertz to the radian +// frequency values used in XAUDIO2_FILTER_PARAMETERS.Frequency, state-variable +// filter types only. Use XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. +// Note that the highest CutoffFrequency supported is SampleRate/6. +// Higher values of CutoffFrequency will return XAUDIO2_MAX_FILTER_FREQUENCY. +__inline float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 SampleRate) +{ + if ((UINT32)(CutoffFrequency * 6.0f) >= SampleRate) + { + return XAUDIO2_MAX_FILTER_FREQUENCY; + } + return 2.0f * sinf((float)M_PI * CutoffFrequency / SampleRate); +} + +// Convert from radian frequencies back to absolute frequencies in Hertz +__inline float XAudio2RadiansToCutoffFrequency(float Radians, float SampleRate) +{ + return SampleRate * asinf(Radians / 2.0f) / (float)M_PI; +} + +// Convert from filter cutoff frequencies expressed in Hertz to the filter +// coefficients used with XAUDIO2_FILTER_PARAMETERS.Frequency, +// LowPassOnePoleFilter and HighPassOnePoleFilter filter types only. +// Use XAudio2CutoffFrequencyToRadians() for state-variable filter types. +__inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, UINT32 SampleRate) +{ + if ((UINT32)CutoffFrequency >= SampleRate) + { + return XAUDIO2_MAX_FILTER_FREQUENCY; + } + return ( 1.0f - powf(1.0f - 2.0f * CutoffFrequency / SampleRate, 2.0f) ); +} + + +#endif // #ifdef XAUDIO2_HELPER_FUNCTIONS + + +/************************************************************************** + * + * XAudio2Create: Top-level function that creates an XAudio2 instance. + * + * ARGUMENTS: + * + * Flags - Flags specifying the XAudio2 object's behavior. + * + * XAudio2Processor - An XAUDIO2_PROCESSOR value that specifies the + * hardware threads (Xbox) or processors (Windows) that XAudio2 + * will use. Note that XAudio2 supports concurrent processing on + * multiple threads, using any combination of XAUDIO2_PROCESSOR + * flags. The values are platform-specific; platform-independent + * code can use XAUDIO2_DEFAULT_PROCESSOR to use the default on + * each platform. + * + **************************************************************************/ + +#ifdef __cplusplus__ + +#if (defined XAUDIO2_EXPORT) + // We're building xaudio2.dll + #define XAUDIO2_STDAPI extern "C" __declspec(dllexport) HRESULT __stdcall +#else + // We're an xaudio2 client + #define XAUDIO2_STDAPI extern "C" __declspec(dllimport) HRESULT __stdcall +#endif + +#else + +/* Modified for C support */ + +#if (defined XAUDIO2_EXPORT) + // We're building xaudio2.dll + #define XAUDIO2_STDAPI __declspec(dllexport) HRESULT __stdcall +#else + // We're an xaudio2 client + #define XAUDIO2_STDAPI __declspec(dllimport) HRESULT __stdcall +#endif + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN10_RS5) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +XAUDIO2_STDAPI XAudio2CreateWithVersionInfo(_Outptr_ IXAudio2** ppXAudio2, + UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR), + DWORD ntddiVersion X2DEFAULT(NTDDI_VERSION)); + +inline HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, + UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) +{ + // When compiled for RS5 or later, try to invoke XAudio2CreateWithVersionInfo. + // Need to use LoadLibrary in case the app is running on an older OS. + typedef HRESULT(__stdcall *XAudio2CreateWithVersionInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR, DWORD); + typedef HRESULT(__stdcall *XAudio2CreateInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR); + + static HMODULE s_dllInstance = nullptr; + static XAudio2CreateWithVersionInfoFunc s_pfnAudio2CreateWithVersion = nullptr; + static XAudio2CreateInfoFunc s_pfnAudio2Create = nullptr; + + if (s_dllInstance == nullptr) + { + s_dllInstance = LoadLibraryEx(XAUDIO2_DLL, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + if (s_dllInstance == nullptr) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + s_pfnAudio2CreateWithVersion = (XAudio2CreateWithVersionInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2CreateWithVersionInfo"); + if (s_pfnAudio2CreateWithVersion == nullptr) + { + s_pfnAudio2Create = (XAudio2CreateInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2Create"); + if (s_pfnAudio2Create == nullptr) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + } + } + + if (s_pfnAudio2CreateWithVersion != nullptr) + { + return (*s_pfnAudio2CreateWithVersion)(ppXAudio2, Flags, XAudio2Processor, NTDDI_VERSION); + } + return (*s_pfnAudio2Create)(ppXAudio2, Flags, XAudio2Processor); +} +#else +// RS4 or older, or not a desktop app +XAUDIO2_STDAPI XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)); +#endif + +// Undo the #pragma pack(push, 1) directive at the top of this file +#pragma pack(pop) + +#endif // #ifndef GUID_DEFS_ONLY + +#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) */ +#pragma endregion + +#endif // #ifndef __XAUDIO2_INCLUDED__ + From f6c8a0c5c2eeb862a388a90f73851886b4d539c2 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 28 Dec 2018 12:29:04 +0100 Subject: [PATCH 042/116] Add UWP input driver Keyboard, mouse and touch support: done --- configuration.c | 7 +- gfx/common/d3d_common.c | 16 +++- griffin/griffin.c | 1 + input/drivers/uwp_input.c | 174 ++++++++++++++++++++++++++++++++++++++ input/input_driver.c | 3 + input/input_driver.h | 1 + uwp/uwp_func.h | 7 ++ uwp/uwp_main.cpp | 146 ++++++++++++++++++++++++++++---- uwp/uwp_main.h | 7 +- 9 files changed, 340 insertions(+), 22 deletions(-) create mode 100644 input/drivers/uwp_input.c diff --git a/configuration.c b/configuration.c index 7ab65f20d9..880caedd27 100644 --- a/configuration.c +++ b/configuration.c @@ -227,6 +227,7 @@ enum input_driver_enum INPUT_WII, INPUT_WIIU, INPUT_XINPUT, + INPUT_UWP, INPUT_UDEV, INPUT_LINUXRAW, INPUT_COCOA, @@ -437,7 +438,9 @@ static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_ALSA; static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_NULL; #endif -#if defined(XENON) +#ifdef __WINRT__ +static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_UWP; +#elif defined(XENON) static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XENON360; #elif defined(_XBOX360) || defined(_XBOX) || defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1) static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XINPUT; @@ -867,6 +870,8 @@ const char *config_get_default_input(void) return "xenon360"; case INPUT_XINPUT: return "xinput"; + case INPUT_UWP: + return "uwp"; case INPUT_WII: return "gx"; case INPUT_WIIU: diff --git a/gfx/common/d3d_common.c b/gfx/common/d3d_common.c index 211e68939c..4019584e6c 100644 --- a/gfx/common/d3d_common.c +++ b/gfx/common/d3d_common.c @@ -128,7 +128,21 @@ int32_t d3d_translate_filter(unsigned type) void d3d_input_driver(const char* input_name, const char* joypad_name, const input_driver_t** input, void** input_data) { -#if defined(_XBOX) || defined(__WINRT__) +#if defined(__WINRT__) + /* Plain xinput is supported on UWP, but it supports joypad only (uwp driver was added later) */ + if (string_is_equal(input_name, "xinput")) + { + void *xinput = input_xinput.init(joypad_name); + *input = xinput ? (const input_driver_t*)&input_xinput : NULL; + *input_data = xinput; + } + else + { + void *uwp = input_uwp.init(joypad_name); + *input = uwp ? (const input_driver_t*)&input_uwp : NULL; + *input_data = uwp; + } +#elif defined(_XBOX) void *xinput = input_xinput.init(joypad_name); *input = xinput ? (const input_driver_t*)&input_xinput : NULL; *input_data = xinput; diff --git a/griffin/griffin.c b/griffin/griffin.c index cbe29ef9e7..e58883035a 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -603,6 +603,7 @@ INPUT #include "../input/drivers_joypad/dos_joypad.c" #elif defined(__WINRT__) #include "../input/drivers/xdk_xinput_input.c" +#include "../input/drivers/uwp_input.c" #endif #ifdef HAVE_WAYLAND diff --git a/input/drivers/uwp_input.c b/input/drivers/uwp_input.c new file mode 100644 index 0000000000..4c2f53af19 --- /dev/null +++ b/input/drivers/uwp_input.c @@ -0,0 +1,174 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Krzysztof Haładyn + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include +#include + +#include + +#include "../input_driver.h" + +// TODO: Add support for multiple mice and multiple touch + +typedef struct uwp_input +{ + bool blocked; + const input_device_driver_t *joypad; +} uwp_input_t; + +static void uwp_input_poll(void *data) +{ + uwp_input_t *uwp = (uwp_input_t*)data; + + if (uwp && uwp->joypad) + uwp->joypad->poll(); + + uwp_input_next_frame(); +} + +static int16_t uwp_input_state(void *data, + rarch_joypad_info_t joypad_info, + const struct retro_keybind **binds, + unsigned port, unsigned device, + unsigned index, unsigned id) +{ + uwp_input_t *uwp = (uwp_input_t*)data; + + switch (device) + { + case RETRO_DEVICE_JOYPAD: + return input_joypad_pressed(uwp->joypad, joypad_info, port, binds[port], id); + case RETRO_DEVICE_ANALOG: + if (binds[port]) + return input_joypad_analog(uwp->joypad, joypad_info, port, index, id, binds[port]); + break; + + case RETRO_DEVICE_KEYBOARD: + return (id < RETROK_LAST) && uwp_keyboard_pressed(id); + + case RETRO_DEVICE_MOUSE: + case RARCH_DEVICE_MOUSE_SCREEN: + return uwp_mouse_state(port, id, device == RARCH_DEVICE_MOUSE_SCREEN); + + case RETRO_DEVICE_POINTER: + case RARCH_DEVICE_POINTER_SCREEN: + return uwp_pointer_state(index, id, device == RARCH_DEVICE_POINTER_SCREEN); + } + + return 0; +} + +static void uwp_input_free_input(void *data) +{ + uwp_input_t *uwp = (uwp_input_t*)data; + + if (!uwp) + return; + + if (uwp->joypad) + uwp->joypad->destroy(); + + free(uwp); +} + +static void *uwp_input_init(const char *joypad_driver) +{ + uwp_input_t *uwp = (uwp_input_t*)calloc(1, sizeof(*uwp)); + if (!uwp) + return NULL; + + input_keymaps_init_keyboard_lut(rarch_key_map_uwp); + + uwp->joypad = input_joypad_init_driver(joypad_driver, uwp); + + return uwp; +} + +static uint64_t uwp_input_get_capabilities(void *data) +{ + uint64_t caps = 0; + + caps |= (1 << RETRO_DEVICE_JOYPAD); + caps |= (1 << RETRO_DEVICE_MOUSE); + caps |= (1 << RETRO_DEVICE_KEYBOARD); + caps |= (1 << RETRO_DEVICE_POINTER); + caps |= (1 << RETRO_DEVICE_ANALOG); + + return caps; +} + +static bool uwp_input_set_rumble(void *data, unsigned port, + enum retro_rumble_effect effect, uint16_t strength) +{ + struct uwp_input *uwp = (struct uwp_input*)data; + if (!uwp) + return false; + return input_joypad_set_rumble(uwp->joypad, port, effect, strength); +} + +static const input_device_driver_t *uwp_input_get_joypad_driver(void *data) +{ + uwp_input_t *uwp = (uwp_input_t*)data; + if (!uwp) + return NULL; + return uwp->joypad; +} + +static void uwp_input_grab_mouse(void *data, bool state) +{ + (void)data; + (void)state; +} + +static bool uwp_keyboard_mapping_is_blocked(void *data) +{ + uwp_input_t *uwp = (uwp_input_t*)data; + if (!uwp) + return false; + return uwp->blocked; +} + +static void uwp_keyboard_mapping_set_block(void *data, bool value) +{ + uwp_input_t *uwp = (uwp_input_t*)data; + if (!uwp) + return; + uwp->blocked = value; +} + +input_driver_t input_uwp = { + uwp_input_init, + uwp_input_poll, + uwp_input_state, + uwp_input_free_input, + NULL, + NULL, + uwp_input_get_capabilities, + "uwp", + uwp_input_grab_mouse, + NULL, + uwp_input_set_rumble, + uwp_input_get_joypad_driver, + NULL, + uwp_keyboard_mapping_is_blocked, + uwp_keyboard_mapping_set_block, +}; diff --git a/input/input_driver.c b/input/input_driver.c index 5134c23e76..709fac324b 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -104,6 +104,9 @@ static const input_driver_t *input_drivers[] = { #ifdef HAVE_X11 &input_x, #endif +#ifdef __WINRT__ + &input_uwp, +#endif #ifdef XENON &input_xenon360, #endif diff --git a/input/input_driver.h b/input/input_driver.h index 1ac166478b..11fcc415b8 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -834,6 +834,7 @@ extern input_driver_t input_xenon360; extern input_driver_t input_gx; extern input_driver_t input_wiiu; extern input_driver_t input_xinput; +extern input_driver_t input_uwp; extern input_driver_t input_linuxraw; extern input_driver_t input_udev; extern input_driver_t input_cocoa; diff --git a/uwp/uwp_func.h b/uwp/uwp_func.h index 7a3e98e60e..4b92bc489b 100644 --- a/uwp/uwp_func.h +++ b/uwp/uwp_func.h @@ -28,6 +28,13 @@ extern char uwp_device_family[128]; void* uwp_get_corewindow(void); +void uwp_input_next_frame(void); +bool uwp_keyboard_pressed(unsigned key); +int16_t uwp_mouse_state(unsigned port, unsigned id, bool screen); +int16_t uwp_pointer_state(unsigned idx, unsigned id, bool screen); + +extern const struct rarch_key_map rarch_key_map_uwp[]; + #ifdef __cplusplus } #endif diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index 7e3f132228..b79cbc65ef 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -34,6 +34,7 @@ using namespace Windows::ApplicationModel::Activation; using namespace Windows::UI::Core; using namespace Windows::UI::Input; using namespace Windows::UI::ViewManagement; +using namespace Windows::Devices::Input; using namespace Windows::System; using namespace Windows::System::Profile; using namespace Windows::Foundation; @@ -158,6 +159,20 @@ const struct rarch_key_map rarch_key_map_uwp[] = { { 0, RETROK_UNKNOWN } }; +struct uwp_input_state_t { + short mouse_screen_x = 0, mouse_screen_y = 0; + short mouse_rel_x = 0, mouse_rel_y = 0; + bool mouse_left = false, mouse_right = false, mouse_middle = false; + bool mouse_button4 = false, mouse_button5 = false; + short mouse_wheel_left = 0, mouse_wheel_up = 0; + + short touch_screen_x = 0, touch_screen_y = 0; + short touch_rel_x = 0, touch_rel_y = 0; + bool touch_touched = false; +}; + +struct uwp_input_state_t uwp_current_input, uwp_next_input; + // The main function is only used to initialize our IFrameworkView class. [Platform::MTAThread] int main(Platform::Array^) @@ -225,10 +240,22 @@ void App::SetWindow(CoreWindow^ window) ref new TypedEventHandler(this, &App::OnWindowClosed); window->KeyDown += - ref new TypedEventHandler(this, &App::OnKeyDown); + ref new TypedEventHandler(this, &App::OnKey); window->KeyUp += - ref new TypedEventHandler(this, &App::OnKeyUp); + ref new TypedEventHandler(this, &App::OnKey); + + window->PointerPressed += + ref new TypedEventHandler(this, &App::OnPointer); + + window->PointerReleased += + ref new TypedEventHandler(this, &App::OnPointer); + + window->PointerMoved += + ref new TypedEventHandler(this, &App::OnPointer); + + window->PointerWheelChanged += + ref new TypedEventHandler(this, &App::OnPointer); DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); @@ -255,7 +282,6 @@ void App::Load(Platform::String^ entryPoint) CoreApplication::Exit(); return; } - input_keymaps_init_keyboard_lut(rarch_key_map_uwp); // TODO (krzys_h): move this to the input driver m_initialized = true; } @@ -356,17 +382,7 @@ void App::OnWindowActivated(CoreWindow^ sender, WindowActivatedEventArgs^ args) m_windowFocused = args->WindowActivationState != CoreWindowActivationState::Deactivated; } -void App::OnKeyDown(CoreWindow^ sender, KeyEventArgs^ args) -{ - OnKey(sender, args, true); -} - -void App::OnKeyUp(CoreWindow^ sender, KeyEventArgs^ args) -{ - OnKey(sender, args, false); -} - -void App::OnKey(CoreWindow^ sender, KeyEventArgs^ args, bool down) +void App::OnKey(CoreWindow^ sender, KeyEventArgs^ args) { uint16_t mod = 0; if ((sender->GetKeyState(VirtualKey::Shift) & CoreVirtualKeyStates::Locked) == CoreVirtualKeyStates::Locked) @@ -385,7 +401,39 @@ void App::OnKey(CoreWindow^ sender, KeyEventArgs^ args, bool down) unsigned keycode = input_keymaps_translate_keysym_to_rk((unsigned)args->VirtualKey); - input_keyboard_event(down, keycode, 0, mod, RETRO_DEVICE_KEYBOARD); + input_keyboard_event(!args->KeyStatus.IsKeyReleased, keycode, 0, mod, RETRO_DEVICE_KEYBOARD); +} + +void App::OnPointer(CoreWindow^ sender, PointerEventArgs^ args) +{ + if (args->CurrentPoint->PointerDevice->PointerDeviceType == PointerDeviceType::Mouse) + { + uwp_next_input.mouse_left = args->CurrentPoint->Properties->IsLeftButtonPressed; + uwp_next_input.mouse_middle = args->CurrentPoint->Properties->IsMiddleButtonPressed; + uwp_next_input.mouse_right = args->CurrentPoint->Properties->IsRightButtonPressed; + uwp_next_input.mouse_button4 = args->CurrentPoint->Properties->IsXButton1Pressed; + uwp_next_input.mouse_button5 = args->CurrentPoint->Properties->IsXButton2Pressed; + uwp_next_input.mouse_screen_x = args->CurrentPoint->Position.X; + uwp_next_input.mouse_screen_y = args->CurrentPoint->Position.Y; + uwp_next_input.mouse_rel_x = uwp_next_input.mouse_screen_x - uwp_current_input.mouse_screen_x; + uwp_next_input.mouse_rel_y = uwp_next_input.mouse_screen_y - uwp_current_input.mouse_screen_y; + if (args->CurrentPoint->Properties->IsHorizontalMouseWheel) + { + uwp_next_input.mouse_wheel_left += args->CurrentPoint->Properties->MouseWheelDelta; + } + else + { + uwp_next_input.mouse_wheel_up += args->CurrentPoint->Properties->MouseWheelDelta; + } + } + else + { + uwp_next_input.touch_touched = args->CurrentPoint->IsInContact; + uwp_next_input.touch_screen_x = args->CurrentPoint->Position.X; + uwp_next_input.touch_screen_y = args->CurrentPoint->Position.Y; + uwp_next_input.touch_rel_x = uwp_next_input.touch_screen_x - uwp_current_input.touch_screen_x; + uwp_next_input.touch_rel_y = uwp_next_input.touch_screen_y - uwp_current_input.touch_screen_y; + } } void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args) @@ -476,4 +524,72 @@ extern "C" { { return (void*)CoreWindow::GetForCurrentThread(); } + + void uwp_input_next_frame(void) + { + uwp_current_input = uwp_next_input; + uwp_next_input.mouse_rel_x = 0; + uwp_next_input.mouse_rel_y = 0; + uwp_next_input.mouse_wheel_up %= WHEEL_DELTA; + uwp_next_input.mouse_wheel_left %= WHEEL_DELTA; + uwp_next_input.touch_rel_x = 0; + uwp_next_input.touch_rel_y = 0; + } + + bool uwp_keyboard_pressed(unsigned key) + { + unsigned sym = rarch_keysym_lut[(enum retro_key)key]; + return (CoreWindow::GetForCurrentThread()->GetKeyState((VirtualKey)sym) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down; + } + + int16_t uwp_mouse_state(unsigned port, unsigned id, bool screen) + { + int16_t state = 0; + + switch (id) + { + case RETRO_DEVICE_ID_MOUSE_X: + return screen ? uwp_current_input.mouse_screen_x : uwp_current_input.mouse_rel_x; + case RETRO_DEVICE_ID_MOUSE_Y: + return screen ? uwp_current_input.mouse_screen_y : uwp_current_input.mouse_rel_y; + case RETRO_DEVICE_ID_MOUSE_LEFT: + return uwp_current_input.mouse_left; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return uwp_current_input.mouse_right; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return uwp_current_input.mouse_wheel_up > WHEEL_DELTA; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return uwp_current_input.mouse_wheel_up < -WHEEL_DELTA; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + return uwp_current_input.mouse_wheel_left > WHEEL_DELTA; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + return uwp_current_input.mouse_wheel_left < -WHEEL_DELTA; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return uwp_current_input.mouse_middle; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return uwp_current_input.mouse_button4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return uwp_current_input.mouse_button5; + } + + return 0; + } + + // TODO: I don't have any touch-enabled Windows devices to test if this actually works + int16_t uwp_pointer_state(unsigned idx, unsigned id, bool screen) + { + switch (id) + { + case RETRO_DEVICE_ID_POINTER_X: + return screen ? uwp_current_input.touch_screen_x : uwp_current_input.touch_rel_x; + case RETRO_DEVICE_ID_POINTER_Y: + return screen ? uwp_current_input.touch_screen_y : uwp_current_input.touch_rel_y; + case RETRO_DEVICE_ID_POINTER_PRESSED: + return uwp_current_input.touch_touched; + default: + break; + } + + return 0; + } } diff --git a/uwp/uwp_main.h b/uwp/uwp_main.h index 9d359e6e1a..623d922161 100644 --- a/uwp/uwp_main.h +++ b/uwp/uwp_main.h @@ -45,8 +45,8 @@ namespace RetroArchUWP void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args); void OnWindowClosed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::CoreWindowEventArgs^ args); void OnWindowActivated(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowActivatedEventArgs^ args); - void OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args); - void OnKeyUp(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args); + void OnKey(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args); + void OnPointer(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args); // DisplayInformation event handlers. void OnDpiChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); @@ -62,9 +62,6 @@ namespace RetroArchUWP void SetWindowResized() { m_windowResized = true; } static App^ GetInstance() { return m_instance; } - private: - void OnKey(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args, bool down); - private: bool m_initialized; bool m_windowClosed; From 4fb06703b3b14e633f932ae41fe3a3875572e618 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 28 Dec 2018 14:24:31 +0100 Subject: [PATCH 043/116] Port d3d12 driver for UWP --- configuration.c | 3 +- gfx/common/d3d12_common.c | 37 ++++++++++++++++++- gfx/common/d3d12_common.h | 6 +++ gfx/common/dxgi_common.h | 23 ++++++++++++ gfx/drivers/d3d12.c | 11 ++++-- gfx/video_driver.c | 8 ++-- .../RetroArch-msvc2017-UWP.vcxproj | 16 ++++---- 7 files changed, 85 insertions(+), 19 deletions(-) diff --git a/configuration.c b/configuration.c index 880caedd27..aef1d7db2a 100644 --- a/configuration.c +++ b/configuration.c @@ -324,7 +324,8 @@ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WII; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WIIU; #elif defined(XENON) static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XENON360; -#elif defined(HAVE_D3D12) +#elif defined(HAVE_D3D12) && false +/* FIXME: DX12 performance on Xbox is horrible for some reason, so use d3d11 as default */ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D12; #elif defined(HAVE_D3D11) static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D11; diff --git a/gfx/common/d3d12_common.c b/gfx/common/d3d12_common.c index a405dc5e46..0f060231e0 100644 --- a/gfx/common/d3d12_common.c +++ b/gfx/common/d3d12_common.c @@ -159,15 +159,24 @@ bool d3d12_init_base(d3d12_video_t* d3d12) D3D12EnableDebugLayer(d3d12->debugController); #endif +#ifdef __WINRT__ + DXGICreateFactory2(&d3d12->factory); +#else DXGICreateFactory(&d3d12->factory); +#endif { int i = 0; while (true) { +#ifdef __WINRT__ + if (FAILED(DXGIEnumAdapters2(d3d12->factory, i++, &d3d12->adapter))) + return false; +#else if (FAILED(DXGIEnumAdapters(d3d12->factory, i++, &d3d12->adapter))) return false; +#endif if (SUCCEEDED(D3D12CreateDevice_(d3d12->adapter, D3D_FEATURE_LEVEL_11_0, &d3d12->device))) break; @@ -206,18 +215,33 @@ bool d3d12_init_queue(d3d12_video_t* d3d12) return true; } +#ifdef __WINRT__ +bool d3d12_init_swapchain(d3d12_video_t* d3d12, + int width, int height, void* corewindow) +#else bool d3d12_init_swapchain(d3d12_video_t* d3d12, int width, int height, HWND hwnd) +#endif { unsigned i; +#ifdef __WINRT__ + DXGI_SWAP_CHAIN_DESC1 desc; + memset(&desc, 0, sizeof(DXGI_SWAP_CHAIN_DESC1)); +#else DXGI_SWAP_CHAIN_DESC desc; - memset(&desc, 0, sizeof(DXGI_SWAP_CHAIN_DESC)); +#endif desc.BufferCount = countof(d3d12->chain.renderTargets); +#ifdef __WINRT__ + desc.Width = width; + desc.Height = height; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +#else desc.BufferDesc.Width = width; desc.BufferDesc.Height = height; desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +#endif desc.SampleDesc.Count = 1; #if 0 desc.BufferDesc.RefreshRate.Numerator = 60; @@ -225,16 +249,25 @@ bool d3d12_init_swapchain(d3d12_video_t* d3d12, desc.SampleDesc.Quality = 0; #endif desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +#ifdef HAVE_WINDOW desc.OutputWindow = hwnd; desc.Windowed = TRUE; +#endif #if 0 desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; #else desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; #endif - DXGICreateSwapChain(d3d12->factory, d3d12->queue.handle, &desc, &d3d12->chain.handle); +#ifdef __WINRT__ + DXGICreateSwapChainForCoreWindow(d3d12->factory, d3d12->queue.handle, corewindow, &desc, NULL, &d3d12->chain.handle); +#else + DXGICreateSwapChain(d3d12->factory, d3d12->queue.handle, &desc, &d3d12->chain.handle); +#endif + +#ifdef HAVE_WINDOW DXGIMakeWindowAssociation(d3d12->factory, hwnd, DXGI_MWA_NO_ALT_ENTER); +#endif d3d12->chain.frame_index = DXGIGetCurrentBackBufferIndex(d3d12->chain.handle); diff --git a/gfx/common/d3d12_common.h b/gfx/common/d3d12_common.h index 8bb2bca7d6..08b13bf2d8 100644 --- a/gfx/common/d3d12_common.h +++ b/gfx/common/d3d12_common.h @@ -1001,6 +1001,7 @@ static INLINE void D3D12ClearStoredMessages(D3D12InfoQueue info_queue) { info_queue->lpVtbl->ClearStoredMessages(info_queue); } +#ifndef __WINRT__ static INLINE HRESULT D3D12GetMessageA( D3D12InfoQueue info_queue, UINT64 message_index, @@ -1009,6 +1010,7 @@ static INLINE HRESULT D3D12GetMessageA( { return info_queue->lpVtbl->GetMessageA(info_queue, message_index, message, message_byte_length); } +#endif static INLINE UINT64 D3D12GetNumMessagesAllowedByStorageFilter(D3D12InfoQueue info_queue) { return info_queue->lpVtbl->GetNumMessagesAllowedByStorageFilter(info_queue); @@ -1341,7 +1343,11 @@ static_assert( typedef struct { unsigned cur_mon_id; +#ifdef __WINRT__ + DXGIFactory2 factory; +#else DXGIFactory factory; +#endif DXGIAdapter adapter; D3D12Device device; diff --git a/gfx/common/dxgi_common.h b/gfx/common/dxgi_common.h index 0e5e15e88f..485142b099 100644 --- a/gfx/common/dxgi_common.h +++ b/gfx/common/dxgi_common.h @@ -270,6 +270,9 @@ typedef IDXGISurface1* DXGISurface; typedef IDXGIOutput* DXGIOutput; typedef IDXGIDevice* DXGIDevice; typedef IDXGIFactory1* DXGIFactory; +#ifdef __WINRT__ +typedef IDXGIFactory2* DXGIFactory2; +#endif typedef IDXGIAdapter1* DXGIAdapter; typedef IDXGIDisplayControl* DXGIDisplayControl; typedef IDXGIOutputDuplication* DXGIOutputDuplication; @@ -414,6 +417,14 @@ static INLINE HRESULT DXGICreateSwapChain( return factory->lpVtbl->CreateSwapChain( factory, (IUnknown*)device, desc, (IDXGISwapChain**)swap_chain); } +#ifdef __WINRT__ +static INLINE HRESULT DXGICreateSwapChainForCoreWindow( + DXGIFactory2 factory, void* device, void* corewindow, DXGI_SWAP_CHAIN_DESC1* desc, DXGIOutput restrict_to, DXGISwapChain* swap_chain) +{ + return factory->lpVtbl->CreateSwapChainForCoreWindow( + factory, (IUnknown*)device, (IUnknown*)corewindow, desc, restrict_to, (IDXGISwapChain1**)swap_chain); +} +#endif static INLINE HRESULT DXGICreateSoftwareAdapter(DXGIFactory factory, HMODULE module, DXGIAdapter* adapter) { @@ -423,6 +434,12 @@ static INLINE HRESULT DXGIEnumAdapters(DXGIFactory factory, UINT id, DXGIAdapter { return factory->lpVtbl->EnumAdapters1(factory, id, adapter); } +#ifdef __WINRT__ +static INLINE HRESULT DXGIEnumAdapters2(DXGIFactory2 factory, UINT id, DXGIAdapter* adapter) +{ + return factory->lpVtbl->EnumAdapters1(factory, id, adapter); +} +#endif static INLINE BOOL DXGIIsCurrent(DXGIFactory factory) { return factory->lpVtbl->IsCurrent(factory); @@ -760,6 +777,12 @@ static INLINE HRESULT DXGICreateFactory(DXGIFactory* factory) { return CreateDXGIFactory1(uuidof(IDXGIFactory1), (void**)factory); } +#ifdef __WINRT__ +static INLINE HRESULT DXGICreateFactory2(DXGIFactory2* factory) +{ + return CreateDXGIFactory1(uuidof(IDXGIFactory2), (void**)factory); +} +#endif /* internal */ diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index c89797c5db..6698d76897 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -35,10 +35,6 @@ #include "wiiu/wiiu_dbg.h" -#ifdef __WINRT__ -#error "TODO (krzys_h): DX12 could be doable on UWP?" -#endif - static void d3d12_gfx_sync(d3d12_video_t* d3d12) { if (D3D12GetCompletedValue(d3d12->queue.fence) < d3d12->queue.fenceValue) @@ -881,9 +877,11 @@ static void d3d12_gfx_free(void* data) static void* d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** input_data) { +#ifdef HAVE_MONITOR MONITORINFOEX current_mon; HMONITOR hm_to_use; WNDCLASSEX wndclass = { 0 }; +#endif settings_t* settings = config_get_ptr(); d3d12_video_t* d3d12 = (d3d12_video_t*)calloc(1, sizeof(*d3d12)); @@ -931,8 +929,13 @@ d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** i if (!d3d12_init_queue(d3d12)) goto error; +#ifdef __WINRT__ + if (!d3d12_init_swapchain(d3d12, d3d12->vp.full_width, d3d12->vp.full_height, uwp_get_corewindow())) + goto error; +#else if (!d3d12_init_swapchain(d3d12, d3d12->vp.full_width, d3d12->vp.full_height, main_window.hwnd)) goto error; +#endif d3d12_init_samplers(d3d12); d3d12_set_filtering(d3d12, 0, video->smooth); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index b00014fb0b..14f87744d5 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -274,14 +274,14 @@ static const video_driver_t *video_drivers[] = { #ifdef XENON &video_xenon360, #endif -#if defined(HAVE_D3D10) - &video_d3d10, +#if defined(HAVE_D3D12) + &video_d3d12, #endif #if defined(HAVE_D3D11) &video_d3d11, #endif -#if defined(HAVE_D3D12) - &video_d3d12, +#if defined(HAVE_D3D10) + &video_d3d10, #endif #if defined(HAVE_D3D9) &video_d3d9, diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj index b6c0469a17..cfb7f5a5d0 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj @@ -142,7 +142,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -157,7 +157,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -172,7 +172,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -187,7 +187,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -202,7 +202,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -218,7 +218,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -233,7 +233,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -249,7 +249,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS From 0e5fbbb9e1f6c1a3e5ffce16437749477f7f6e11 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 02:12:50 +0100 Subject: [PATCH 044/116] Silence some warnings --- gfx/common/d3d12_common.c | 10 +++------- gfx/common/d3d12_common.h | 2 +- menu/menu_driver.c | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/gfx/common/d3d12_common.c b/gfx/common/d3d12_common.c index 0f060231e0..e328af6a1b 100644 --- a/gfx/common/d3d12_common.c +++ b/gfx/common/d3d12_common.c @@ -215,13 +215,8 @@ bool d3d12_init_queue(d3d12_video_t* d3d12) return true; } -#ifdef __WINRT__ bool d3d12_init_swapchain(d3d12_video_t* d3d12, int width, int height, void* corewindow) -#else -bool d3d12_init_swapchain(d3d12_video_t* d3d12, - int width, int height, HWND hwnd) -#endif { unsigned i; #ifdef __WINRT__ @@ -229,6 +224,7 @@ bool d3d12_init_swapchain(d3d12_video_t* d3d12, memset(&desc, 0, sizeof(DXGI_SWAP_CHAIN_DESC1)); #else DXGI_SWAP_CHAIN_DESC desc; + HWND hwnd = (HWND)corewindow; memset(&desc, 0, sizeof(DXGI_SWAP_CHAIN_DESC)); #endif @@ -324,7 +320,7 @@ static D3D12_CPU_DESCRIPTOR_HANDLE d3d12_descriptor_heap_slot_alloc(d3d12_descri static void d3d12_descriptor_heap_slot_free(d3d12_descriptor_heap_t* heap, D3D12_CPU_DESCRIPTOR_HANDLE handle) { - int i; + unsigned i; if (!handle.ptr) return; @@ -336,7 +332,7 @@ d3d12_descriptor_heap_slot_free(d3d12_descriptor_heap_t* heap, D3D12_CPU_DESCRIP assert(heap->map[i]); heap->map[i] = false; - if (heap->start > i) + if (heap->start > (int)i) heap->start = i; } diff --git a/gfx/common/d3d12_common.h b/gfx/common/d3d12_common.h index 08b13bf2d8..5d4e221a3d 100644 --- a/gfx/common/d3d12_common.h +++ b/gfx/common/d3d12_common.h @@ -1505,7 +1505,7 @@ bool d3d12_init_pipeline( D3D12_GRAPHICS_PIPELINE_STATE_DESC* desc, D3D12PipelineState* out); -bool d3d12_init_swapchain(d3d12_video_t* d3d12, int width, int height, HWND hwnd); +bool d3d12_init_swapchain(d3d12_video_t* d3d12, int width, int height, void *corewindow); bool d3d12_init_queue(d3d12_video_t* d3d12); diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 579e499ef9..4750fe1ec2 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -2665,7 +2665,7 @@ void hex32_to_rgba_normalized(uint32_t hex, float* rgba, float alpha) void menu_subsystem_populate(const struct retro_subsystem_info* subsystem, menu_displaylist_info_t *info) { - int i = 0; + unsigned i = 0; if (subsystem && subsystem_current_count > 0) { for (i = 0; i < subsystem_current_count; i++, subsystem++) From 8f67cf7384952be695428443cc2ee7c5ee6a4214 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 02:20:25 +0100 Subject: [PATCH 045/116] Some buildfixes --- gfx/common/d3d_common.h | 3 ++- gfx/drivers/d3d10.c | 2 +- gfx/drivers/d3d11.c | 4 ++-- gfx/drivers/d3d9.c | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/gfx/common/d3d_common.h b/gfx/common/d3d_common.h index 14a724a3e7..a33e759914 100644 --- a/gfx/common/d3d_common.h +++ b/gfx/common/d3d_common.h @@ -97,7 +97,8 @@ void *d3d_matrix_rotation_z(void *_pout, float angle); int32_t d3d_translate_filter(unsigned type); -void d3d_input_driver(const char* input_name, const char* joypad_name, const input_driver_t** input, void** input_data); +void d3d_input_driver(const char* input_name, + const char* joypad_name, const input_driver_t** input, void** input_data); RETRO_END_DECLS diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index 69a38a61a8..abee78c5dd 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -627,7 +627,7 @@ d3d10_gfx_init(const video_info_t* video, desc.BufferDesc.RefreshRate.Numerator = 60; desc.BufferDesc.RefreshRate.Denominator = 1; desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; -#if HAVE_WINDOW +#ifdef HAVE_WINDOW desc.OutputWindow = main_window.hwnd; #endif desc.SampleDesc.Count = 1; diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 8e0293be3e..e5aab6026c 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -656,7 +656,7 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i desc.BufferDesc.RefreshRate.Denominator = 1; #endif desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; -#if HAVE_WINDOW +#ifdef HAVE_WINDOW desc.OutputWindow = main_window.hwnd; #endif desc.SampleDesc.Count = 1; @@ -664,7 +664,7 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i #if 0 desc.Scaling = DXGI_SCALING_STRETCH; #endif -#if HAVE_WINDOW +#ifdef HAVE_WINDOW desc.Windowed = TRUE; #endif #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 00917d4bbe..63d4ac0e39 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -1297,7 +1297,8 @@ static bool d3d9_init_internal(d3d9_video_t *d3d, if (!d3d9_initialize(d3d, &d3d->video_info)) return false; - d3d_input_driver(settings->arrays.input_joypad_driver, input, input_data); + d3d_input_driver(settings->arrays.input_joypad_driver, + settings->arrays.input_joypad_driver, input, input_data); RARCH_LOG("[D3D9]: Init complete.\n"); return true; From dd60b5d5764dae20974e1df3dea50e1ccf738205 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 02:54:17 +0100 Subject: [PATCH 046/116] MSVC2017 Non-UWP buildfixes --- audio/drivers/xaudio29.h | 22 ++++++++-------------- gfx/drivers/d3d11.c | 9 +++++++++ menu/drivers_display/menu_display_vulkan.c | 4 +--- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/audio/drivers/xaudio29.h b/audio/drivers/xaudio29.h index 9743738db0..20d05ae8f0 100644 --- a/audio/drivers/xaudio29.h +++ b/audio/drivers/xaudio29.h @@ -1266,33 +1266,27 @@ inline HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, typedef HRESULT(__stdcall *XAudio2CreateWithVersionInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR, DWORD); typedef HRESULT(__stdcall *XAudio2CreateInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR); - static HMODULE s_dllInstance = nullptr; - static XAudio2CreateWithVersionInfoFunc s_pfnAudio2CreateWithVersion = nullptr; - static XAudio2CreateInfoFunc s_pfnAudio2Create = nullptr; + static HMODULE s_dllInstance = NULL; + static XAudio2CreateWithVersionInfoFunc s_pfnAudio2CreateWithVersion = NULL; + static XAudio2CreateInfoFunc s_pfnAudio2Create = NULL; - if (s_dllInstance == nullptr) + if (s_dllInstance == NULL) { s_dllInstance = LoadLibraryEx(XAUDIO2_DLL, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); - if (s_dllInstance == nullptr) - { + if (s_dllInstance == NULL) return HRESULT_FROM_WIN32(GetLastError()); - } s_pfnAudio2CreateWithVersion = (XAudio2CreateWithVersionInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2CreateWithVersionInfo"); - if (s_pfnAudio2CreateWithVersion == nullptr) + if (s_pfnAudio2CreateWithVersion == NULL) { s_pfnAudio2Create = (XAudio2CreateInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2Create"); - if (s_pfnAudio2Create == nullptr) - { + if (s_pfnAudio2Create == NULL) return HRESULT_FROM_WIN32(GetLastError()); - } } } - if (s_pfnAudio2CreateWithVersion != nullptr) - { + if (s_pfnAudio2CreateWithVersion != NULL) return (*s_pfnAudio2CreateWithVersion)(ppXAudio2, Flags, XAudio2Processor, NTDDI_VERSION); - } return (*s_pfnAudio2Create)(ppXAudio2, Flags, XAudio2Processor); } #else diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index e5aab6026c..5d30a648fc 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -687,11 +687,20 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i } else { +#if defined(__WINRT__) if (FAILED(D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, requested_feature_levels, number_feature_levels, D3D11_SDK_VERSION, &d3d11->device, &d3d11->supportedFeatureLevel, &d3d11->context))) +#else + if (FAILED(D3D11CreateDeviceAndSwapChain( + NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, + requested_feature_levels, number_feature_levels, + D3D11_SDK_VERSION, &desc, + (IDXGISwapChain**)&d3d11->swapChain, &d3d11->device, + &d3d11->supportedFeatureLevel, &d3d11->context))) +#endif goto error; } diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index e1e5ee4699..6bae63a2d6 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2016-2017 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis * @@ -349,7 +349,6 @@ static bool menu_display_vk_font_init_first( static void menu_display_vk_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { - VkRect2D sci; vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; vk->tracker.use_scissor = true; @@ -362,7 +361,6 @@ static void menu_display_vk_scissor_begin(video_frame_info_t *video_info, static void menu_display_vk_scissor_end(video_frame_info_t *video_info) { - VkRect2D sci; vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; vk->tracker.use_scissor = false; vk->tracker.dirty |= VULKAN_DIRTY_DYNAMIC_BIT; From 34cb50f8dacb9b06c35f397fcb954091703c7b95 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 03:06:31 +0100 Subject: [PATCH 047/116] Update MSVC 2017 UWP --- .../RetroArch-msvc2017-UWP.vcxproj | 840 +++++++----------- .../RetroArch-msvc2017-UWP.vcxproj.filters | 468 +++------- 2 files changed, 444 insertions(+), 864 deletions(-) diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj index cfb7f5a5d0..4f10a9e7da 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj @@ -1,526 +1,316 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - Debug - ARM - - - Release - ARM - - - Debug - ARM64 - - - Release - ARM64 - - - - {f5e937b6-1ba0-4446-b94b-f3bbdef908f4} - DirectXApp - RetroArchUWP - en-US - 14.0 - true - Windows Store - 10.0.17763.0 - 10.0.15063.0 - 10.0 - - - - Application - true - v141 - - - Application - true - v141 - - - Application - true - v141 - true - - - Application - true - v141 - - - Application - false - true - v141 - true - - - Application - false - true - v141 - true - - - Application - false - true - v141 - true - - - Application - false - true - v141 - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - msvc-2017-UWP_TemporaryKey.pfx - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - ProgramDatabase - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - ProgramDatabase - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - false - false - false - false - false - false - false - false - - - - - - - - - Designer - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + + {f5e937b6-1ba0-4446-b94b-f3bbdef908f4} + DirectXApp + RetroArchUWP + en-US + 14.0 + true + Windows Store + 10.0.17763.0 + 10.0.15063.0 + 10.0 + + + + Application + true + v141 + + + Application + true + v141 + + + Application + true + v141 + true + + + Application + true + v141 + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + msvc-2017-UWP_TemporaryKey.pfx + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + ProgramDatabase + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + ProgramDatabase + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + false + false + false + false + false + false + false + false + + + + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters index e62f02f8a1..4c212ae9e5 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters @@ -1,340 +1,130 @@ - - - - - {1246fa09-e114-4a52-88c2-657b2f13d9fb} - - - {32de9679-6494-4933-afa2-430fd975e506} - - - {73676219-cf54-454f-b6fa-9b192c1454f8} - - - - - {bf1e643d-c518-4a77-a355-ae8a93efc18b} - - - {c3155604-6d38-494a-bfe0-861cef871cb2} - - - - - - - - - core_deps - - - cores - - - cores - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - core_deps - - - - - uwp - - - uwp - - - - - griffin - - - griffin - - - uwp - - - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - + + + + + {1246fa09-e114-4a52-88c2-657b2f13d9fb} + + + {32de9679-6494-4933-afa2-430fd975e506} + + + {73676219-cf54-454f-b6fa-9b192c1454f8} + + + + + {bf1e643d-c518-4a77-a355-ae8a93efc18b} + + + {c3155604-6d38-494a-bfe0-861cef871cb2} + + + + + + + + + + + uwp + + + uwp + + + + + griffin + + + griffin + + + uwp + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + \ No newline at end of file From 65cc022c31dadcc7f2ab62a6c7cb4120c33ab11a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 03:20:50 +0100 Subject: [PATCH 048/116] Update uwp_main.cpp --- uwp/uwp_main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index b79cbc65ef..85fc437215 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -14,13 +14,13 @@ */ #include "uwp_main.h" -#include #include #include -#include -#include -#include -#include +#include "../retroarch.h" +#include "../frontend/frontend.h" +#include "../input/input_keymaps.h" +#include "../input/input_driver.h" +#include "../verbosity.h" #include "uwp_func.h" #include From 118d155360f50353414a2fae647b4eaba675c563 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 04:39:13 +0100 Subject: [PATCH 049/116] Buildfix --- dynamic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynamic.c b/dynamic.c index 89bcc8f1c7..4f102e03a4 100644 --- a/dynamic.c +++ b/dynamic.c @@ -1470,8 +1470,8 @@ bool rarch_environment_cb(unsigned cmd, void *data) { memcpy(hwr, cb, offsetof(struct retro_hw_render_callback, stencil)); - memset(hwr + offsetof(struct retro_hw_render_callback, stencil), - 0, sizeof(*cb) - offsetof(struct retro_hw_render_callback, stencil)); + memset((uint8_t*)hwr + offsetof(struct retro_hw_render_callback, stencil), + 0, sizeof(*cb) - offsetof(struct retro_hw_render_callback, stencil)); } else memcpy(hwr, cb, sizeof(*cb)); From bddcd2d5e58a5c8a0f47dccdd5de9189633d8846 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Dec 2018 06:04:46 +0100 Subject: [PATCH 050/116] Buildfix - include header for prototype definition --- gfx/common/d3d_common.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gfx/common/d3d_common.c b/gfx/common/d3d_common.c index 4019584e6c..0685c6ea26 100644 --- a/gfx/common/d3d_common.c +++ b/gfx/common/d3d_common.c @@ -12,6 +12,7 @@ * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ +#include #include "../../configuration.h" #include "../../verbosity.h" @@ -88,8 +89,10 @@ void *d3d_matrix_multiply(void *_pout, for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) - pout->m[i][j] = pm1->m[i][0] * pm2->m[0][j] + pm1->m[i][1] * pm2->m[1][j] + - pm1->m[i][2] * pm2->m[2][j] + pm1->m[i][3] * pm2->m[3][j]; + pout->m[i][j] = pm1->m[i][0] * + pm2->m[0][j] + pm1->m[i][1] * pm2->m[1][j] + + pm1->m[i][2] * pm2->m[2][j] + + pm1->m[i][3] * pm2->m[3][j]; } return pout; } @@ -129,7 +132,8 @@ int32_t d3d_translate_filter(unsigned type) void d3d_input_driver(const char* input_name, const char* joypad_name, const input_driver_t** input, void** input_data) { #if defined(__WINRT__) - /* Plain xinput is supported on UWP, but it supports joypad only (uwp driver was added later) */ + /* Plain xinput is supported on UWP, but it + * supports joypad only (uwp driver was added later) */ if (string_is_equal(input_name, "xinput")) { void *xinput = input_xinput.init(joypad_name); From 1cb1ea55b13d8675e003c3f0100662bab16cd826 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sat, 29 Dec 2018 11:38:06 +0100 Subject: [PATCH 051/116] Bugfix - creating swap chain twice in d3d11 Not sure what I was thinking when writing this https://github.com/libretro/RetroArch/commit/dd60b5d5764dae20974e1df3dea50e1ccf738205#commitcomment-31801518 --- gfx/common/d3d11_common.c | 33 +++++++++++++++++++++++++++++++++ gfx/drivers/d3d11.c | 9 --------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/gfx/common/d3d11_common.c b/gfx/common/d3d11_common.c index dbb3b53c42..249033f2e7 100644 --- a/gfx/common/d3d11_common.c +++ b/gfx/common/d3d11_common.c @@ -23,6 +23,39 @@ #if defined(HAVE_DYNAMIC) && !defined(__WINRT__) #include +HRESULT WINAPI D3D11CreateDevice( + IDXGIAdapter* pAdapter, + D3D_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + CONST D3D_FEATURE_LEVEL* pFeatureLevels, + UINT FeatureLevels, + UINT SDKVersion, + ID3D11Device** ppDevice, + D3D_FEATURE_LEVEL* pFeatureLevel, + ID3D11DeviceContext** ppImmediateContext) +{ + static dylib_t d3d11_dll; + static PFN_D3D11_CREATE_DEVICE fp; + + if (!d3d11_dll) + d3d11_dll = dylib_load("d3d11.dll"); + + if (!d3d11_dll) + return TYPE_E_CANTLOADLIBRARY; + + if (!fp) + fp = (PFN_D3D11_CREATE_DEVICE)dylib_proc( + d3d11_dll, "D3D11CreateDevice"); + + if (!fp) + return TYPE_E_DLLFUNCTIONNOTFOUND; + + return fp( + pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, + ppDevice, pFeatureLevel, ppImmediateContext); +} + HRESULT WINAPI D3D11CreateDeviceAndSwapChain( IDXGIAdapter* pAdapter, D3D_DRIVER_TYPE DriverType, diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 5d30a648fc..e5aab6026c 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -687,20 +687,11 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i } else { -#if defined(__WINRT__) if (FAILED(D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, requested_feature_levels, number_feature_levels, D3D11_SDK_VERSION, &d3d11->device, &d3d11->supportedFeatureLevel, &d3d11->context))) -#else - if (FAILED(D3D11CreateDeviceAndSwapChain( - NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, - requested_feature_levels, number_feature_levels, - D3D11_SDK_VERSION, &desc, - (IDXGISwapChain**)&d3d11->swapChain, &d3d11->device, - &d3d11->supportedFeatureLevel, &d3d11->context))) -#endif goto error; } From ad782e6eb45a6c07c0c07554aef60e1316f12a52 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sat, 29 Dec 2018 15:21:18 +0100 Subject: [PATCH 052/116] Fix HOME path issues after b201d6 (libretro#7836) --- libretro-common/file/file_path.c | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 2e27217457..408a242e27 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -1028,29 +1028,12 @@ void fill_pathname_expand_special(char *out_path, out_path += src_size; size -= src_size; - if ( - (in_path[1] == '/') -#ifdef _WIN32 - || (in_path[1] == '\\') -#endif - ) - { - in_path += 2; - } - else - { - in_path++; - } + in_path++; } + + free(home_dir); } - else if ((in_path[0] == ':') && - ( - (in_path[1] == '/') -#ifdef _WIN32 - || (in_path[1] == '\\') -#endif - ) - ) + else if (in_path[0] == ':') { char *application_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); @@ -1064,12 +1047,13 @@ void fill_pathname_expand_special(char *out_path, size_t src_size = strlcpy(out_path, application_dir, size); retro_assert(src_size < size); - free(application_dir); - out_path += src_size; size -= src_size; - in_path += 2; + + in_path++; } + + free(application_dir); } #endif From 3aa8d222380abae953a5cc4dafa6f88a53de2fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 30 Dec 2018 00:09:44 +0100 Subject: [PATCH 053/116] [ORBIS] Fix main --- frontend/drivers/platform_orbis.c | 86 +++++++++---------------------- frontend/frontend.c | 2 + 2 files changed, 27 insertions(+), 61 deletions(-) diff --git a/frontend/drivers/platform_orbis.c b/frontend/drivers/platform_orbis.c index 020086661d..217dca1c04 100644 --- a/frontend/drivers/platform_orbis.c +++ b/frontend/drivers/platform_orbis.c @@ -72,6 +72,29 @@ char user_path[512]; static enum frontend_fork orbis_fork_mode = FRONTEND_FORK_NONE; +#ifdef __cplusplus +extern "C" +#endif +int main(int argc, char *argv[]) +{ + int ret; + + sceSystemServiceHideSplashScreen(); + + + uintptr_t intptr=0; + sscanf(argv[1],"%p",&intptr); + myConf=(OrbisGlobalConf *)intptr; + ret=ps4LinkInitWithConf(myConf->confLink); + if(!ret) + { + ps4LinkFinish(); + return -1; + } + + return rarch_main(argc, argv, NULL); +} + static void frontend_orbis_get_environment_settings(int *argc, char *argv[], void *args, void *params_data) { @@ -88,19 +111,6 @@ static void frontend_orbis_get_environment_settings(int *argc, char *argv[], #endif #endif - int ret; - - uintptr_t intptr=0; - sscanf(argv[1],"%p",&intptr); - myConf=(OrbisGlobalConf *)intptr; - ret=ps4LinkInitWithConf(myConf->confLink); - if(!ret) - { - ps4LinkFinish(); - return; - } - - strlcpy(eboot_path, "host0:/", sizeof(eboot_path)); strlcpy(g_defaults.dirs[DEFAULT_DIR_PORT], eboot_path, sizeof(g_defaults.dirs[DEFAULT_DIR_PORT])); strlcpy(user_path, "host0:/data/retroarch/", sizeof(user_path)); @@ -282,11 +292,7 @@ static void frontend_orbis_exitspawn(char *s, size_t len) static int frontend_orbis_get_rating(void) { -#ifdef VITA return 6; /* Go with a conservative figure for now. */ -#else - return 4; -#endif } enum frontend_architecture frontend_orbis_get_architecture(void) @@ -302,52 +308,14 @@ static int frontend_orbis_parse_drive_list(void *data, bool load_content) MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : MSG_UNKNOWN; -#ifdef VITA menu_entries_append_enum(list, - "app0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - menu_entries_append_enum(list, - "ur0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - menu_entries_append_enum(list, - "ux0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - menu_entries_append_enum(list, - "uma0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - menu_entries_append_enum(list, - "imc0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); -#else - menu_entries_append_enum(list, - "ms0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - menu_entries_append_enum(list, - "ef0:/", - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - menu_entries_append_enum(list, - "host0:/", + "app0", msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); #endif -#endif - return 0; + } frontend_ctx_driver_t frontend_ctx_orbis = { @@ -381,9 +349,5 @@ frontend_ctx_driver_t frontend_ctx_orbis = { NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ -#ifdef VITA - "vita", -#else "orbis", -#endif }; diff --git a/frontend/frontend.c b/frontend/frontend.c index b144761490..8f96af7b44 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -161,6 +161,7 @@ int rarch_main(int argc, char *argv[], void *data) } #ifndef HAVE_MAIN +#ifndef ORBIS #ifdef __cplusplus extern "C" #endif @@ -169,3 +170,4 @@ int main(int argc, char *argv[]) return rarch_main(argc, argv, NULL); } #endif +#endif From 167537ac10a8f66277b1e836b8790558683a6c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 30 Dec 2018 00:10:37 +0100 Subject: [PATCH 054/116] [ORBIS] Fix Makefile and enable XMB --- Makefile.orbis | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Makefile.orbis b/Makefile.orbis index 085835f82b..be1e90ca10 100644 --- a/Makefile.orbis +++ b/Makefile.orbis @@ -38,9 +38,9 @@ else HAVE_SOCKET_LEGACY := 0 HAVE_MENU := 1 HAVE_MENU_COMMON := 1 - HAVE_RGUI := 1 + HAVE_RGUI := 0 HAVE_MATERIALUI := 0 - HAVE_XMB := 0 + HAVE_XMB := 1 HAVE_ZARCH := 0 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 @@ -121,13 +121,7 @@ endif CXXFLAGS := $(CFLAGS) PS4_LIBS := -lps4link -ldebugnet -lorbisFile -lelfloader -lorbisKeyboard -lorbis2d -lpng -lz -lorbisGl -lorbisPad -lorbisAudio -lmod -lorbisAudio -lmod -lorbisFileBrowser -lorbisXbmFont -lSceNet_stub -lScePigletv2VSH_stub -lSceSystemService_stub -lSceUserService_stub -lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceSysmodule_stub \ - -lPs4_extension_kernel_execute_dynlib_prepare_dlclose -lPs4_extension_kernel_call_standard \ - -lPs4_common_kernel -lPs4_common_user -lPs4_common_generic \ - -lPs4LibCInternalAdaptive_stub -lPs4LibKernelAdaptive_stub \ - -lSceLibcInternal_stub -lkernel_stub -lps4Kernel_stub \ - -lPs4_base_stub_resolve_minimal -lPs4_base_kernel_dlsym_standard \ - -lPs4_base_kernel_seek_elf_address_standard -lPs4_base_assembler_register_parameter_standard \ - -lPs4_base_assembler_system_call_rop_0x93a4FFFF8 + -lPs4_extension_kernel_call_standard -lPs4_extension_kernel_execute_dynlib_prepare_dlclose -lPs4_common_kernel -lPs4_common_user -lPs4_common_generic -lPs4LibCInternalAdaptive_stub -lPs4LibKernelAdaptive_stub -lSceLibcInternal_stub -lkernel_stub -lps4Kernel_stub -lPs4_base_stub_resolve_minimal -lPs4_base_kernel_dlsym_standard -lPs4_base_kernel_seek_elf_address_standard -lPs4_base_assembler_register_parameter_standard -lPs4_base_assembler_system_call_standard LIBS := $(WHOLE_START) -lretro_orbis $(WHOLE_END) $(PS4_LIBS) From d34b94a6617fbaec22cc0bbfb76d4df50c8de814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 30 Dec 2018 00:11:53 +0100 Subject: [PATCH 055/116] [ORBIS] Several EGL and GL fixes --- gfx/common/gl_common.c | 2 +- gfx/drivers_context/orbis_ctx.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gfx/common/gl_common.c b/gfx/common/gl_common.c index 98a4c41c58..e2e8a09501 100644 --- a/gfx/common/gl_common.c +++ b/gfx/common/gl_common.c @@ -54,7 +54,7 @@ void gl_load_texture_image(GLenum target, GLenum type, const GLvoid * data) { -#ifndef HAVE_PSGL +#if !defined(HAVE_PSGL) && !defined(ORBIS) #ifdef HAVE_OPENGLES2 if (gl_check_capability(GL_CAPS_TEX_STORAGE_EXT) && internalFormat != GL_BGRA_EXT) { diff --git a/gfx/drivers_context/orbis_ctx.c b/gfx/drivers_context/orbis_ctx.c index 33f4904641..999e51ef53 100644 --- a/gfx/drivers_context/orbis_ctx.c +++ b/gfx/drivers_context/orbis_ctx.c @@ -193,8 +193,8 @@ static bool orbis_ctx_bind_api(void *data, (void)data; ctx_orbis_api = api; - if (api == GFX_CTX_OPENGL_API) - if (eglBindAPI(EGL_OPENGL_API) != EGL_FALSE) + if (api == GFX_CTX_OPENGL_ES_API) + if (eglBindAPI(EGL_OPENGL_ES_API) != EGL_FALSE) return true; return false; From 88e283f0c15682b855d00e8bb6e21ecf8bc9bbbe Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 04:51:03 +0100 Subject: [PATCH 056/116] (D3D10/11/12) Some buildfixes --- gfx/drivers/d3d10.c | 5 ++++- gfx/drivers/d3d11.c | 5 ++++- gfx/drivers/d3d12.c | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index abee78c5dd..d5c2b7458f 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -27,6 +27,7 @@ #include "../video_driver.h" #include "../font_driver.h" +#include "../common/d3d_common.h" #include "../common/win32_common.h" #include "../common/d3d10_common.h" #include "../common/dxgi_common.h" @@ -587,12 +588,14 @@ d3d10_gfx_init(const video_info_t* video, #ifdef HAVE_WINDOW win32_window_reset(); +#endif +#ifdef HAVE_MONITOR win32_monitor_init(); wndclass.lpfnWndProc = WndProcD3D; +#ifdef HAVE_WINDOW win32_window_init(&wndclass, true, NULL); #endif -#ifdef HAVE_MONITOR win32_monitor_info(¤t_mon, &hm_to_use, &d3d10->cur_mon_id); #endif diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index e5aab6026c..d740e32797 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -34,6 +34,7 @@ #include "../video_shader_parse.h" #include "../drivers_shader/slang_preprocess.h" +#include "../common/d3d_common.h" #include "../common/d3d11_common.h" #include "../common/dxgi_common.h" #include "../common/d3dcompiler_common.h" @@ -596,12 +597,14 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i #ifdef HAVE_WINDOW win32_window_reset(); +#endif +#ifdef HAVE_MONITOR win32_monitor_init(); wndclass.lpfnWndProc = WndProcD3D; +#ifdef HAVE_WINDOW win32_window_init(&wndclass, true, NULL); #endif -#ifdef HAVE_MONITOR win32_monitor_info(¤t_mon, &hm_to_use, &d3d11->cur_mon_id); #endif diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index 6698d76897..9921678ffb 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -22,6 +22,7 @@ #include "../video_driver.h" #include "../font_driver.h" +#include "../common/d3d_common.h" #include "../common/win32_common.h" #include "../common/dxgi_common.h" #include "../common/d3d12_common.h" @@ -890,12 +891,14 @@ d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** i #ifdef HAVE_WINDOW win32_window_reset(); +#endif +#ifdef HAVE_MONITOR win32_monitor_init(); wndclass.lpfnWndProc = WndProcD3D; +#ifdef HAVE_WINDOW win32_window_init(&wndclass, true, NULL); #endif -#ifdef HAVE_MONITOR win32_monitor_info(¤t_mon, &hm_to_use, &d3d12->cur_mon_id); #endif From 1cb9f7c1bf7ae2234deff8f84f059b4b9f0d221b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 05:08:57 +0100 Subject: [PATCH 057/116] Fix D3D10/11/12 drivers for Win32 build --- gfx/common/d3d_common.h | 10 +++++++++- gfx/drivers/d3d8.c | 5 ----- gfx/drivers/d3d9.c | 3 --- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gfx/common/d3d_common.h b/gfx/common/d3d_common.h index a33e759914..c5b62496a2 100644 --- a/gfx/common/d3d_common.h +++ b/gfx/common/d3d_common.h @@ -20,10 +20,18 @@ #include "../../config.h" #endif -#if !defined(_XBOX) && !defined(__WINRT__) +#if !defined(__WINRT__) && !defined(_XBOX) + +#ifndef HAVE_WINDOW #define HAVE_WINDOW #endif +#ifndef HAVE_MONITOR +#define HAVE_MONITOR +#endif + +#endif + #include #include diff --git a/gfx/drivers/d3d8.c b/gfx/drivers/d3d8.c index 3c174fdd93..5eb5080d08 100644 --- a/gfx/drivers/d3d8.c +++ b/gfx/drivers/d3d8.c @@ -47,11 +47,6 @@ #ifdef _XBOX #define D3D8_PRESENTATIONINTERVAL D3DRS_PRESENTATIONINTERVAL -#else -#ifndef __WINRT__ -#define HAVE_MONITOR -#define HAVE_WINDOW -#endif #endif #ifdef HAVE_MENU diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 63d4ac0e39..3638bb3622 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -48,9 +48,6 @@ #ifdef _XBOX #define D3D9_PRESENTATIONINTERVAL D3DRS_PRESENTINTERVAL -#else -#define HAVE_MONITOR -#define HAVE_WINDOW #endif #define FS_PRESENTINTERVAL(pp) ((pp)->PresentationInterval) From 815c525bb66aad2956b1112db1d7e577036d139f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 05:21:30 +0100 Subject: [PATCH 058/116] Buildfix for MSVC 2012 --- audio/drivers/xaudio29.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/audio/drivers/xaudio29.h b/audio/drivers/xaudio29.h index 20d05ae8f0..01ad7efa60 100644 --- a/audio/drivers/xaudio29.h +++ b/audio/drivers/xaudio29.h @@ -33,6 +33,8 @@ #include +#include + #if(_WIN32_WINNT < _WIN32_WINNT_WIN8) #error "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions." #endif // (_WIN32_WINNT < _WIN32_WINNT_WIN8) @@ -1257,7 +1259,7 @@ XAUDIO2_STDAPI XAudio2CreateWithVersionInfo(_Outptr_ IXAudio2** ppXAudio2, XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR), DWORD ntddiVersion X2DEFAULT(NTDDI_VERSION)); -inline HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, +static INLINE HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) { From 1c010e3622986591c77fb73113e242fbd283ebab Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 06:38:23 +0100 Subject: [PATCH 059/116] Change C++ comments to C --- audio/drivers/xaudio29.h | 339 ++++++++++++++++++++------------------- 1 file changed, 173 insertions(+), 166 deletions(-) diff --git a/audio/drivers/xaudio29.h b/audio/drivers/xaudio29.h index 01ad7efa60..2d71f7ce95 100644 --- a/audio/drivers/xaudio29.h +++ b/audio/drivers/xaudio29.h @@ -37,15 +37,15 @@ #if(_WIN32_WINNT < _WIN32_WINNT_WIN8) #error "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions." -#endif // (_WIN32_WINNT < _WIN32_WINNT_WIN8) +#endif /* (_WIN32_WINNT < _WIN32_WINNT_WIN8) */ #include #pragma region Application Family #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) -// Current name of the DLL shipped in the same SDK as this header. -// The name reflects the current version +/* Current name of the DLL shipped in the same SDK as this header. + * The name reflects the current version */ #if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) #define XAUDIO2_DLL_A "xaudio2_9.dll" #define XAUDIO2_DLL_W L"xaudio2_9.dll" @@ -78,10 +78,10 @@ #if defined(__cplusplus__) && defined(__WINRT__) #if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) - // XAudio 2.9 + /* XAudio 2.9 */ interface __declspec(uuid("2B02E3CF-2E0B-4ec3-BE45-1B2A3FE7210D")) IXAudio2; #else - // XAudio 2.8 + /* XAudio 2.8 */ interface __declspec(uuid("60d8dac8-5aa1-4e8e-b597-2f5e2883d484")) IXAudio2; #endif @@ -104,15 +104,15 @@ #endif -// Ignore the rest of this header if only the GUID definitions were requested +/* Ignore the rest of this header if only the GUID definitions were requested */ #ifndef GUID_DEFS_ONLY -#include // Windows COM declarations -#include // Markers for documenting API semantics -#include // Basic data types and constants for audio work -#include // For AUDIO_STREAM_CATEGORY +#include /* Windows COM declarations */ +#include /* Markers for documenting API semantics */ +#include /* Basic data types and constants for audio work */ +#include /* For AUDIO_STREAM_CATEGORY */ -// All structures defined in this file use tight field packing +/* All structures defined in this file use tight field packing */ #pragma pack(push, 1) @@ -122,68 +122,69 @@ * **************************************************************************/ -// Numeric boundary values -#define XAUDIO2_MAX_BUFFER_BYTES 0x80000000 // Maximum bytes allowed in a source buffer -#define XAUDIO2_MAX_QUEUED_BUFFERS 64 // Maximum buffers allowed in a voice queue -#define XAUDIO2_MAX_BUFFERS_SYSTEM 2 // Maximum buffers allowed for system threads (Xbox 360 only) -#define XAUDIO2_MAX_AUDIO_CHANNELS 64 // Maximum channels in an audio stream -#define XAUDIO2_MIN_SAMPLE_RATE 1000 // Minimum audio sample rate supported -#define XAUDIO2_MAX_SAMPLE_RATE 200000 // Maximum audio sample rate supported -#define XAUDIO2_MAX_VOLUME_LEVEL 16777216.0f // Maximum acceptable volume level (2^24) -#define XAUDIO2_MIN_FREQ_RATIO (1/1024.0f) // Minimum SetFrequencyRatio argument -#define XAUDIO2_MAX_FREQ_RATIO 1024.0f // Maximum MaxFrequencyRatio argument -#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f // Default MaxFrequencyRatio argument -#define XAUDIO2_MAX_FILTER_ONEOVERQ 1.5f // Maximum XAUDIO2_FILTER_PARAMETERS.OneOverQ -#define XAUDIO2_MAX_FILTER_FREQUENCY 1.0f // Maximum XAUDIO2_FILTER_PARAMETERS.Frequency -#define XAUDIO2_MAX_LOOP_COUNT 254 // Maximum non-infinite XAUDIO2_BUFFER.LoopCount -#define XAUDIO2_MAX_INSTANCES 8 // Maximum simultaneous XAudio2 objects on Xbox 360 +/* Numeric boundary values */ +#define XAUDIO2_MAX_BUFFER_BYTES 0x80000000 /* Maximum bytes allowed in a source buffer */ +#define XAUDIO2_MAX_QUEUED_BUFFERS 64 /* Maximum buffers allowed in a voice queue */ +#define XAUDIO2_MAX_BUFFERS_SYSTEM 2 /* Maximum buffers allowed for system threads (Xbox 360 only) */ +#define XAUDIO2_MAX_AUDIO_CHANNELS 64 /* Maximum channels in an audio stream */ +#define XAUDIO2_MIN_SAMPLE_RATE 1000 /* Minimum audio sample rate supported */ +#define XAUDIO2_MAX_SAMPLE_RATE 200000 /* Maximum audio sample rate supported */ +#define XAUDIO2_MAX_VOLUME_LEVEL 16777216.0f /* Maximum acceptable volume level (2^24) */ +#define XAUDIO2_MIN_FREQ_RATIO (1/1024.0f) /* Minimum SetFrequencyRatio argument */ +#define XAUDIO2_MAX_FREQ_RATIO 1024.0f /* Maximum MaxFrequencyRatio argument */ +#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f /* Default MaxFrequencyRatio argument */ +#define XAUDIO2_MAX_FILTER_ONEOVERQ 1.5f /* Maximum XAUDIO2_FILTER_PARAMETERS.OneOverQ */ +#define XAUDIO2_MAX_FILTER_FREQUENCY 1.0f /* Maximum XAUDIO2_FILTER_PARAMETERS.Frequency */ +#define XAUDIO2_MAX_LOOP_COUNT 254 /* Maximum non-infinite XAUDIO2_BUFFER.LoopCount */ +#define XAUDIO2_MAX_INSTANCES 8 /* Maximum simultaneous XAudio2 objects on Xbox 360 */ -// For XMA voices on Xbox 360 there is an additional restriction on the MaxFrequencyRatio -// argument and the voice's sample rate: the product of these numbers cannot exceed 600000 -// for one-channel voices or 300000 for voices with more than one channel. +/* For XMA voices on Xbox 360 there is an additional restriction on the MaxFrequencyRatio + * argument and the voice's sample rate: the product of these numbers cannot exceed 600000 + * for one-channel voices or 300000 for voices with more than one channel. */ #define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MONO 600000 #define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL 300000 -// Numeric values with special meanings -#define XAUDIO2_COMMIT_NOW 0 // Used as an OperationSet argument -#define XAUDIO2_COMMIT_ALL 0 // Used in IXAudio2::CommitChanges -#define XAUDIO2_INVALID_OPSET (UINT32)(-1) // Not allowed for OperationSet arguments -#define XAUDIO2_NO_LOOP_REGION 0 // Used in XAUDIO2_BUFFER.LoopCount -#define XAUDIO2_LOOP_INFINITE 255 // Used in XAUDIO2_BUFFER.LoopCount -#define XAUDIO2_DEFAULT_CHANNELS 0 // Used in CreateMasteringVoice -#define XAUDIO2_DEFAULT_SAMPLERATE 0 // Used in CreateMasteringVoice +/* Numeric values with special meanings */ +#define XAUDIO2_COMMIT_NOW 0 /* Used as an OperationSet argument */ +#define XAUDIO2_COMMIT_ALL 0 /* Used in IXAudio2::CommitChanges */ +#define XAUDIO2_INVALID_OPSET (UINT32)(-1) /* Not allowed for OperationSet arguments */ +#define XAUDIO2_NO_LOOP_REGION 0 /* Used in XAUDIO2_BUFFER.LoopCount */ +#define XAUDIO2_LOOP_INFINITE 255 /* Used in XAUDIO2_BUFFER.LoopCount */ +#define XAUDIO2_DEFAULT_CHANNELS 0 /* Used in CreateMasteringVoice */ +#define XAUDIO2_DEFAULT_SAMPLERATE 0 /* Used in CreateMasteringVoice */ -// Flags -#define XAUDIO2_DEBUG_ENGINE 0x0001 // Used in XAudio2Create -#define XAUDIO2_VOICE_NOPITCH 0x0002 // Used in IXAudio2::CreateSourceVoice -#define XAUDIO2_VOICE_NOSRC 0x0004 // Used in IXAudio2::CreateSourceVoice -#define XAUDIO2_VOICE_USEFILTER 0x0008 // Used in IXAudio2::CreateSource/SubmixVoice -#define XAUDIO2_PLAY_TAILS 0x0020 // Used in IXAudio2SourceVoice::Stop -#define XAUDIO2_END_OF_STREAM 0x0040 // Used in XAUDIO2_BUFFER.Flags -#define XAUDIO2_SEND_USEFILTER 0x0080 // Used in XAUDIO2_SEND_DESCRIPTOR.Flags -#define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 // Used in IXAudio2SourceVoice::GetState -#define XAUDIO2_STOP_ENGINE_WHEN_IDLE 0x2000 // Used in XAudio2Create to force the engine to Stop when no source voices are Started, and Start when a voice is Started -#define XAUDIO2_1024_QUANTUM 0x8000 // Used in XAudio2Create to specify nondefault processing quantum of 21.33 ms (1024 samples at 48KHz) -#define XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT 0x10000 // Used in CreateMasteringVoice to create a virtual audio client +/* Flags */ +#define XAUDIO2_DEBUG_ENGINE 0x0001 /* Used in XAudio2Create */ +#define XAUDIO2_VOICE_NOPITCH 0x0002 /* Used in IXAudio2::CreateSourceVoice */ +#define XAUDIO2_VOICE_NOSRC 0x0004 /* Used in IXAudio2::CreateSourceVoice */ +#define XAUDIO2_VOICE_USEFILTER 0x0008 /* Used in IXAudio2::CreateSource/SubmixVoice */ +#define XAUDIO2_PLAY_TAILS 0x0020 /* Used in IXAudio2SourceVoice::Stop */ +#define XAUDIO2_END_OF_STREAM 0x0040 /* Used in XAUDIO2_BUFFER.Flags */ +#define XAUDIO2_SEND_USEFILTER 0x0080 /* Used in XAUDIO2_SEND_DESCRIPTOR.Flags */ +#define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 /* Used in IXAudio2SourceVoice::GetState */ +#define XAUDIO2_STOP_ENGINE_WHEN_IDLE 0x2000 /* Used in XAudio2Create to force the engine to Stop when no source voices are Started, and Start when a voice is Started */ +#define XAUDIO2_1024_QUANTUM 0x8000 /* Used in XAudio2Create to specify nondefault processing quantum of 21.33 ms (1024 samples at 48KHz) */ +#define XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT 0x10000 /* Used in CreateMasteringVoice to create a virtual audio client */ -// Default parameters for the built-in filter +/* Default parameters for the built-in filter */ #define XAUDIO2_DEFAULT_FILTER_TYPE LowPassFilter #define XAUDIO2_DEFAULT_FILTER_FREQUENCY XAUDIO2_MAX_FILTER_FREQUENCY #define XAUDIO2_DEFAULT_FILTER_ONEOVERQ 1.0f -// Internal XAudio2 constants -// The audio frame quantum can be calculated by reducing the fraction: -// SamplesPerAudioFrame / SamplesPerSecond -#define XAUDIO2_QUANTUM_NUMERATOR 1 // On Windows, XAudio2 processes audio -#define XAUDIO2_QUANTUM_DENOMINATOR 100 // in 10ms chunks (= 1/100 seconds) +/* Internal XAudio2 constants + * The audio frame quantum can be calculated by reducing the fraction: + * SamplesPerAudioFrame / SamplesPerSecond + */ +#define XAUDIO2_QUANTUM_NUMERATOR 1 /* On Windows, XAudio2 processes audio */ +#define XAUDIO2_QUANTUM_DENOMINATOR 100 /* in 10ms chunks (= 1/100 seconds) */ #define XAUDIO2_QUANTUM_MS (1000.0f * XAUDIO2_QUANTUM_NUMERATOR / XAUDIO2_QUANTUM_DENOMINATOR) -// XAudio2 error codes +/* XAudio2 error codes */ #define FACILITY_XAUDIO2 0x896 -#define XAUDIO2_E_INVALID_CALL 0x88960001 // An API call or one of its arguments was illegal -#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 // The XMA hardware suffered an unrecoverable error -#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 // XAudio2 failed to initialize an XAPO effect -#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 // An audio device became unusable (unplugged, etc) +#define XAUDIO2_E_INVALID_CALL 0x88960001 /* An API call or one of its arguments was illegal */ +#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 /* The XMA hardware suffered an unrecoverable error */ +#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 /* XAudio2 failed to initialize an XAPO effect */ +#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 /* An audio device became unusable (unplugged, etc) */ /************************************************************************** * @@ -212,7 +213,7 @@ FWD_DECLARE(IXAudio2VoiceCallback); * **************************************************************************/ -// Used in XAudio2Create, specifies which CPU(s) to use. +/* Used in XAudio2Create, specifies which CPU(s) to use. */ typedef UINT32 XAUDIO2_PROCESSOR; #define Processor1 0x00000001 #define Processor2 0x00000002 @@ -249,45 +250,45 @@ typedef UINT32 XAUDIO2_PROCESSOR; #define XAUDIO2_ANY_PROCESSOR 0xffffffff #define XAUDIO2_DEFAULT_PROCESSOR Processor1 -// Returned by IXAudio2Voice::GetVoiceDetails +/* Returned by IXAudio2Voice::GetVoiceDetails */ typedef struct XAUDIO2_VOICE_DETAILS { - UINT32 CreationFlags; // Flags the voice was created with. - UINT32 ActiveFlags; // Flags currently active. - UINT32 InputChannels; // Channels in the voice's input audio. - UINT32 InputSampleRate; // Sample rate of the voice's input audio. + UINT32 CreationFlags; /* Flags the voice was created with. */ + UINT32 ActiveFlags; /* Flags currently active. */ + UINT32 InputChannels; /* Channels in the voice's input audio. */ + UINT32 InputSampleRate; /* Sample rate of the voice's input audio. */ } XAUDIO2_VOICE_DETAILS; -// Used in XAUDIO2_VOICE_SENDS below +/* Used in XAUDIO2_VOICE_SENDS below */ typedef struct XAUDIO2_SEND_DESCRIPTOR { - UINT32 Flags; // Either 0 or XAUDIO2_SEND_USEFILTER. - IXAudio2Voice* pOutputVoice; // This send's destination voice. + UINT32 Flags; /* Either 0 or XAUDIO2_SEND_USEFILTER. */ + IXAudio2Voice* pOutputVoice; /* This send's destination voice. */ } XAUDIO2_SEND_DESCRIPTOR; -// Used in the voice creation functions and in IXAudio2Voice::SetOutputVoices +/* Used in the voice creation functions and in IXAudio2Voice::SetOutputVoices */ typedef struct XAUDIO2_VOICE_SENDS { - UINT32 SendCount; // Number of sends from this voice. - XAUDIO2_SEND_DESCRIPTOR* pSends; // Array of SendCount send descriptors. + UINT32 SendCount; /* Number of sends from this voice. */ + XAUDIO2_SEND_DESCRIPTOR* pSends; /* Array of SendCount send descriptors. */ } XAUDIO2_VOICE_SENDS; -// Used in XAUDIO2_EFFECT_CHAIN below +/* Used in XAUDIO2_EFFECT_CHAIN below */ typedef struct XAUDIO2_EFFECT_DESCRIPTOR { - IUnknown* pEffect; // Pointer to the effect object's IUnknown interface. - BOOL InitialState; // TRUE if the effect should begin in the enabled state. - UINT32 OutputChannels; // How many output channels the effect should produce. + IUnknown* pEffect; /* Pointer to the effect object's IUnknown interface. */ + BOOL InitialState; /* TRUE if the effect should begin in the enabled state. */ + UINT32 OutputChannels; /* How many output channels the effect should produce. */ } XAUDIO2_EFFECT_DESCRIPTOR; -// Used in the voice creation functions and in IXAudio2Voice::SetEffectChain +/* Used in the voice creation functions and in IXAudio2Voice::SetEffectChain */ typedef struct XAUDIO2_EFFECT_CHAIN { - UINT32 EffectCount; // Number of effects in this voice's effect chain. - XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; // Array of effect descriptors. + UINT32 EffectCount; /* Number of effects in this voice's effect chain. */ + XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; /* Array of effect descriptors. */ } XAUDIO2_EFFECT_CHAIN; -// Used in XAUDIO2_FILTER_PARAMETERS below +/* Used in XAUDIO2_FILTER_PARAMETERS below */ typedef enum XAUDIO2_FILTER_TYPE { LowPassFilter, // Attenuates frequencies above the cutoff frequency (state-variable filter). @@ -298,20 +299,22 @@ typedef enum XAUDIO2_FILTER_TYPE HighPassOnePoleFilter // Attenuates frequencies below the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) } XAUDIO2_FILTER_TYPE; -// Used in IXAudio2Voice::Set/GetFilterParameters and Set/GetOutputFilterParameters +/* Used in IXAudio2Voice::Set/GetFilterParameters and Set/GetOutputFilterParameters */ typedef struct XAUDIO2_FILTER_PARAMETERS { - XAUDIO2_FILTER_TYPE Type; // Filter type. - float Frequency; // Filter coefficient. - // must be >= 0 and <= XAUDIO2_MAX_FILTER_FREQUENCY - // See XAudio2CutoffFrequencyToRadians() for state-variable filter types and - // XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. - float OneOverQ; // Reciprocal of the filter's quality factor Q; - // must be > 0 and <= XAUDIO2_MAX_FILTER_ONEOVERQ. - // Has no effect for one-pole filters. + XAUDIO2_FILTER_TYPE Type; /* Filter type. */ + float Frequency; /* Filter coefficient. + * must be >= 0 and <= XAUDIO2_MAX_FILTER_FREQUENCY + * See XAudio2CutoffFrequencyToRadians() for state-variable filter types and + * XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. + */ + float OneOverQ; /* Reciprocal of the filter's quality factor Q; + * must be > 0 and <= XAUDIO2_MAX_FILTER_ONEOVERQ. + * Has no effect for one-pole filters. + */ } XAUDIO2_FILTER_PARAMETERS; -// Used in IXAudio2SourceVoice::SubmitSourceBuffer +/* Used in IXAudio2SourceVoice::SubmitSourceBuffer */ typedef struct XAUDIO2_BUFFER { UINT32 Flags; // Either 0 or XAUDIO2_END_OF_STREAM. @@ -345,7 +348,7 @@ typedef struct XAUDIO2_BUFFER_WMA // divide evenly into XAUDIO2_BUFFER.AudioBytes. } XAUDIO2_BUFFER_WMA; -// Returned by IXAudio2SourceVoice::GetState +/* Returned by IXAudio2SourceVoice::GetState */ typedef struct XAUDIO2_VOICE_STATE { void* pCurrentBufferContext; // The pContext value provided in the XAUDIO2_BUFFER @@ -360,10 +363,10 @@ typedef struct XAUDIO2_VOICE_STATE // this member will not be calculated, saving CPU. } XAUDIO2_VOICE_STATE; -// Returned by IXAudio2::GetPerformanceData +/* Returned by IXAudio2::GetPerformanceData */ typedef struct XAUDIO2_PERFORMANCE_DATA { - // CPU usage information + /* CPU usage information */ UINT64 AudioCyclesSinceLastQuery; // CPU cycles spent on audio processing since the // last call to StartEngine or GetPerformanceData. UINT64 TotalCyclesSinceLastQuery; // Total CPU cycles elapsed since the last call @@ -373,15 +376,15 @@ typedef struct XAUDIO2_PERFORMANCE_DATA UINT32 MaximumCyclesPerQuantum; // Most CPU cycles spent processing any one // audio quantum since the last call. - // Memory usage information + /* Memory usage information */ UINT32 MemoryUsageInBytes; // Total heap space currently in use. - // Audio latency and glitching information + /* Audio latency and glitching information */ UINT32 CurrentLatencyInSamples; // Minimum delay from when a sample is read from a // source buffer to when it reaches the speakers. UINT32 GlitchesSinceEngineStarted; // Audio dropouts since the engine was started. - // Data about XAudio2's current workload + /* Data about XAudio2's current workload */ UINT32 ActiveSourceVoiceCount; // Source voices currently playing. UINT32 TotalSourceVoiceCount; // Source voices currently existing. UINT32 ActiveSubmixVoiceCount; // Submix voices currently playing/existing. @@ -389,9 +392,9 @@ typedef struct XAUDIO2_PERFORMANCE_DATA UINT32 ActiveResamplerCount; // Resample xAPOs currently active. UINT32 ActiveMatrixMixCount; // MatrixMix xAPOs currently active. - // Usage of the hardware XMA decoder (Xbox 360 only) - UINT32 ActiveXmaSourceVoices; // Number of source voices decoding XMA data. - UINT32 ActiveXmaStreams; // A voice can use more than one XMA stream. + /* Usage of the hardware XMA decoder (Xbox 360 only) */ + UINT32 ActiveXmaSourceVoices; /* Number of source voices decoding XMA data. */ + UINT32 ActiveXmaStreams; /* A voice can use more than one XMA stream. */ } XAUDIO2_PERFORMANCE_DATA; // Used in IXAudio2::SetDebugConfiguration @@ -405,10 +408,11 @@ typedef struct XAUDIO2_DEBUG_CONFIGURATION BOOL LogTiming; // Whether to log message timestamps. } XAUDIO2_DEBUG_CONFIGURATION; -// Values for the TraceMask and BreakMask bitmaps. Only ERRORS and WARNINGS -// are valid in BreakMask. WARNINGS implies ERRORS, DETAIL implies INFO, and -// FUNC_CALLS implies API_CALLS. By default, TraceMask is ERRORS and WARNINGS -// and all the other settings are zero. +/* Values for the TraceMask and BreakMask bitmaps. Only ERRORS and WARNINGS + * are valid in BreakMask. WARNINGS implies ERRORS, DETAIL implies INFO, and + * FUNC_CALLS implies API_CALLS. By default, TraceMask is ERRORS and WARNINGS + * and all the other settings are zero. + */ #define XAUDIO2_LOG_ERRORS 0x0001 // For handled errors with serious effects. #define XAUDIO2_LOG_WARNINGS 0x0002 // For handled errors that may be recoverable. #define XAUDIO2_LOG_INFO 0x0004 // Informational chit-chat (e.g. state changes). @@ -427,7 +431,7 @@ typedef struct XAUDIO2_DEBUG_CONFIGURATION * **************************************************************************/ -// Use default arguments if compiling as C++ +/* Use default arguments if compiling as C++ */ #ifdef __cplusplus #define X2DEFAULT(x) =x #else @@ -438,24 +442,24 @@ typedef struct XAUDIO2_DEBUG_CONFIGURATION #define INTERFACE IXAudio2 DECLARE_INTERFACE_(IXAudio2, IUnknown) { - // NAME: IXAudio2::QueryInterface - // DESCRIPTION: Queries for a given COM interface on the XAudio2 object. - // Only IID_IUnknown and IID_IXAudio2 are supported. - // - // ARGUMENTS: - // riid - IID of the interface to be obtained. - // ppvInterface - Returns a pointer to the requested interface. - // + /* NAME: IXAudio2::QueryInterface + * DESCRIPTION: Queries for a given COM interface on the XAudio2 object. + * Only IID_IUnknown and IID_IXAudio2 are supported. + * + * ARGUMENTS: + * riid - IID of the interface to be obtained. + * ppvInterface - Returns a pointer to the requested interface. + */ STDMETHOD(QueryInterface) (THIS_ REFIID riid, _Outptr_ void** ppvInterface) PURE; - // NAME: IXAudio2::AddRef - // DESCRIPTION: Adds a reference to the XAudio2 object. - // + /* NAME: IXAudio2::AddRef + * DESCRIPTION: Adds a reference to the XAudio2 object. + */ STDMETHOD_(ULONG, AddRef) (THIS) PURE; - // NAME: IXAudio2::Release - // DESCRIPTION: Releases a reference to the XAudio2 object. - // + /* NAME: IXAudio2::Release + * DESCRIPTION: Releases a reference to the XAudio2 object. + */ STDMETHOD_(ULONG, Release) (THIS) PURE; // NAME: IXAudio2::RegisterForCallbacks @@ -581,17 +585,19 @@ DECLARE_INTERFACE_(IXAudio2, IUnknown) #define INTERFACE IXAudio2Voice DECLARE_INTERFACE(IXAudio2Voice) { - // These methods are declared in a macro so that the same declarations - // can be used in the derived voice types (IXAudio2SourceVoice, etc). + /* These methods are declared in a macro so that the same declarations + * can be used in the derived voice types (IXAudio2SourceVoice, etc). + */ #define Declare_IXAudio2Voice_Methods() \ \ /* NAME: IXAudio2Voice::GetVoiceDetails - // DESCRIPTION: Returns the basic characteristics of this voice. - // - // ARGUMENTS: - // pVoiceDetails - Returns the voice's details. - */\ + * DESCRIPTION: Returns the basic characteristics of this voice. + * + * ARGUMENTS: + * pVoiceDetails - Returns the voice's details. + */ + \ STDMETHOD_(void, GetVoiceDetails) (THIS_ _Out_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ \ /* NAME: IXAudio2Voice::SetOutputVoices @@ -1017,7 +1023,7 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #ifndef __cplusplus -// IXAudio2 +/* IXAudio2 */ #define IXAudio2_QueryInterface(This,riid,ppvInterface) ((This)->lpVtbl->QueryInterface(This,riid,ppvInterface)) #define IXAudio2_AddRef(This) ((This)->lpVtbl->AddRef(This)) #define IXAudio2_Release(This) ((This)->lpVtbl->Release(This)) @@ -1030,7 +1036,7 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #define IXAudio2_GetPerformanceData(This,pPerfData) ((This)->lpVtbl->GetPerformanceData(This,pPerfData)) #define IXAudio2_SetDebugConfiguration(This,pDebugConfiguration,pReserved) ((This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)) -// IXAudio2Voice +/* IXAudio2Voice */ #define IXAudio2Voice_GetVoiceDetails(This,pVoiceDetails) ((This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)) #define IXAudio2Voice_SetOutputVoices(This,pSendList) ((This)->lpVtbl->SetOutputVoices(This,pSendList)) #define IXAudio2Voice_SetEffectChain(This,pEffectChain) ((This)->lpVtbl->SetEffectChain(This,pEffectChain)) @@ -1051,7 +1057,7 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #define IXAudio2Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) ((This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)) #define IXAudio2Voice_DestroyVoice(This) ((This)->lpVtbl->DestroyVoice(This)) -// IXAudio2SourceVoice +/* IXAudio2SourceVoice */ #define IXAudio2SourceVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails #define IXAudio2SourceVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices #define IXAudio2SourceVoice_SetEffectChain IXAudio2Voice_SetEffectChain @@ -1082,7 +1088,7 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #define IXAudio2SourceVoice_GetFrequencyRatio(This,pRatio) ((This)->lpVtbl->GetFrequencyRatio(This,pRatio)) #define IXAudio2SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) ((This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate)) -// IXAudio2SubmixVoice +/* IXAudio2SubmixVoice */ #define IXAudio2SubmixVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails #define IXAudio2SubmixVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices #define IXAudio2SubmixVoice_SetEffectChain IXAudio2Voice_SetEffectChain @@ -1103,7 +1109,7 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #define IXAudio2SubmixVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix #define IXAudio2SubmixVoice_DestroyVoice IXAudio2Voice_DestroyVoice -// IXAudio2MasteringVoice +/* IXAudio2MasteringVoice */ #define IXAudio2MasteringVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails #define IXAudio2MasteringVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices #define IXAudio2MasteringVoice_SetEffectChain IXAudio2Voice_SetEffectChain @@ -1125,7 +1131,7 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #define IXAudio2MasteringVoice_DestroyVoice IXAudio2Voice_DestroyVoice #define IXAudio2MasteringVoice_GetChannelMask(This,pChannelMask) ((This)->lpVtbl->GetChannelMask(This,pChannelMask)) -#endif // #ifndef __cplusplus +#endif /* #ifndef __cplusplus */ /************************************************************************** @@ -1139,46 +1145,47 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback) #ifdef XAUDIO2_HELPER_FUNCTIONS -#define _USE_MATH_DEFINES // Make math.h define M_PI -#include // For powf, log10f, sinf and asinf +#define _USE_MATH_DEFINES /* Make math.h define M_PI */ +#include /* For powf, log10f, sinf and asinf */ -// Calculate the argument to SetVolume from a decibel value +/* Calculate the argument to SetVolume from a decibel value */ __inline float XAudio2DecibelsToAmplitudeRatio(float Decibels) { return powf(10.0f, Decibels / 20.0f); } -// Recover a volume in decibels from an amplitude factor +/* Recover a volume in decibels from an amplitude factor */ __inline float XAudio2AmplitudeRatioToDecibels(float Volume) { if (Volume == 0) - { - return -3.402823466e+38f; // Smallest float value (-FLT_MAX) - } + return -3.402823466e+38f; /* Smallest float value (-FLT_MAX) */ return 20.0f * log10f(Volume); } -// Calculate the argument to SetFrequencyRatio from a semitone value +/* Calculate the argument to SetFrequencyRatio from a semitone value */ __inline float XAudio2SemitonesToFrequencyRatio(float Semitones) { - // FrequencyRatio = 2 ^ Octaves - // = 2 ^ (Semitones / 12) + /* FrequencyRatio = 2 ^ Octaves + * = 2 ^ (Semitones / 12) + */ return powf(2.0f, Semitones / 12.0f); } -// Recover a pitch in semitones from a frequency ratio +/* Recover a pitch in semitones from a frequency ratio */ __inline float XAudio2FrequencyRatioToSemitones(float FrequencyRatio) { - // Semitones = 12 * log2(FrequencyRatio) - // = 12 * log2(10) * log10(FrequencyRatio) + /* Semitones = 12 * log2(FrequencyRatio) + * = 12 * log2(10) * log10(FrequencyRatio) + */ return 39.86313713864835f * log10f(FrequencyRatio); } -// Convert from filter cutoff frequencies expressed in Hertz to the radian -// frequency values used in XAUDIO2_FILTER_PARAMETERS.Frequency, state-variable -// filter types only. Use XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. -// Note that the highest CutoffFrequency supported is SampleRate/6. -// Higher values of CutoffFrequency will return XAUDIO2_MAX_FILTER_FREQUENCY. +/* Convert from filter cutoff frequencies expressed in Hertz to the radian + * frequency values used in XAUDIO2_FILTER_PARAMETERS.Frequency, state-variable + * filter types only. Use XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. + * Note that the highest CutoffFrequency supported is SampleRate/6. + * Higher values of CutoffFrequency will return XAUDIO2_MAX_FILTER_FREQUENCY. + */ __inline float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 SampleRate) { if ((UINT32)(CutoffFrequency * 6.0f) >= SampleRate) @@ -1188,16 +1195,17 @@ __inline float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 Sam return 2.0f * sinf((float)M_PI * CutoffFrequency / SampleRate); } -// Convert from radian frequencies back to absolute frequencies in Hertz +/* Convert from radian frequencies back to absolute frequencies in Hertz */ __inline float XAudio2RadiansToCutoffFrequency(float Radians, float SampleRate) { return SampleRate * asinf(Radians / 2.0f) / (float)M_PI; } -// Convert from filter cutoff frequencies expressed in Hertz to the filter -// coefficients used with XAUDIO2_FILTER_PARAMETERS.Frequency, -// LowPassOnePoleFilter and HighPassOnePoleFilter filter types only. -// Use XAudio2CutoffFrequencyToRadians() for state-variable filter types. +/* Convert from filter cutoff frequencies expressed in Hertz to the filter + * coefficients used with XAUDIO2_FILTER_PARAMETERS.Frequency, + * LowPassOnePoleFilter and HighPassOnePoleFilter filter types only. + * Use XAudio2CutoffFrequencyToRadians() for state-variable filter types. + */ __inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, UINT32 SampleRate) { if ((UINT32)CutoffFrequency >= SampleRate) @@ -1207,8 +1215,7 @@ __inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, return ( 1.0f - powf(1.0f - 2.0f * CutoffFrequency / SampleRate, 2.0f) ); } - -#endif // #ifdef XAUDIO2_HELPER_FUNCTIONS +#endif /* #ifdef XAUDIO2_HELPER_FUNCTIONS */ /************************************************************************** @@ -1232,10 +1239,10 @@ __inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, #ifdef __cplusplus__ #if (defined XAUDIO2_EXPORT) - // We're building xaudio2.dll + /* We're building xaudio2.dll */ #define XAUDIO2_STDAPI extern "C" __declspec(dllexport) HRESULT __stdcall #else - // We're an xaudio2 client + /* We're an xaudio2 client */ #define XAUDIO2_STDAPI extern "C" __declspec(dllimport) HRESULT __stdcall #endif @@ -1244,10 +1251,10 @@ __inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, /* Modified for C support */ #if (defined XAUDIO2_EXPORT) - // We're building xaudio2.dll + /* We're building xaudio2.dll */ #define XAUDIO2_STDAPI __declspec(dllexport) HRESULT __stdcall #else - // We're an xaudio2 client + /* We're an xaudio2 client */ #define XAUDIO2_STDAPI __declspec(dllimport) HRESULT __stdcall #endif @@ -1263,8 +1270,8 @@ static INLINE HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) { - // When compiled for RS5 or later, try to invoke XAudio2CreateWithVersionInfo. - // Need to use LoadLibrary in case the app is running on an older OS. + /* When compiled for RS5 or later, try to invoke XAudio2CreateWithVersionInfo. + * Need to use LoadLibrary in case the app is running on an older OS. */ typedef HRESULT(__stdcall *XAudio2CreateWithVersionInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR, DWORD); typedef HRESULT(__stdcall *XAudio2CreateInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR); @@ -1292,18 +1299,18 @@ static INLINE HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, return (*s_pfnAudio2Create)(ppXAudio2, Flags, XAudio2Processor); } #else -// RS4 or older, or not a desktop app +/* RS4 or older, or not a desktop app */ XAUDIO2_STDAPI XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)); #endif -// Undo the #pragma pack(push, 1) directive at the top of this file +/* Undo the #pragma pack(push, 1) directive at the top of this file */ #pragma pack(pop) -#endif // #ifndef GUID_DEFS_ONLY +#endif /* #ifndef GUID_DEFS_ONLY */ #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) */ #pragma endregion -#endif // #ifndef __XAUDIO2_INCLUDED__ +#endif /* #ifndef __XAUDIO2_INCLUDED__ */ From de6e6a2ef3d1e2573037157cc7daca7e235c72ac Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 07:22:08 +0100 Subject: [PATCH 060/116] Update xaudio29.h --- audio/drivers/xaudio29.h | 2616 +++++++++++++++++++------------------- 1 file changed, 1303 insertions(+), 1313 deletions(-) diff --git a/audio/drivers/xaudio29.h b/audio/drivers/xaudio29.h index 2d71f7ce95..46f5d616ca 100644 --- a/audio/drivers/xaudio29.h +++ b/audio/drivers/xaudio29.h @@ -1,1316 +1,1306 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2018 - Krzysztof Haładyn - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -/************************************************************************** - * - * Copyright (c) Microsoft Corporation. All rights reserved. - * - * File: xaudio2.h - * Content: Declarations for the XAudio2 game audio API. - * - **************************************************************************/ - -/* Modified slightly to build without requiring the WinRT compiler since that is only available in C++ sources */ - -#ifdef _MSC_VER -#pragma once -#endif - -#ifndef __XAUDIO2_INCLUDED__ -#define __XAUDIO2_INCLUDED__ - -#include - -#include - -#if(_WIN32_WINNT < _WIN32_WINNT_WIN8) -#error "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions." -#endif /* (_WIN32_WINNT < _WIN32_WINNT_WIN8) */ - -#include - -#pragma region Application Family -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) - -/* Current name of the DLL shipped in the same SDK as this header. - * The name reflects the current version */ -#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) - #define XAUDIO2_DLL_A "xaudio2_9.dll" - #define XAUDIO2_DLL_W L"xaudio2_9.dll" - #define XAUDIO2D_DLL_A "xaudio2_9d.dll" - #define XAUDIO2D_DLL_W L"xaudio2_9d.dll" -#else - #define XAUDIO2_DLL_A "xaudio2_8.dll" - #define XAUDIO2_DLL_W L"xaudio2_8.dll" - #define XAUDIO2D_DLL_A "xaudio2_8.dll" - #define XAUDIO2D_DLL_W L"xaudio2_8.dll" -#endif - -#ifdef UNICODE - #define XAUDIO2_DLL XAUDIO2_DLL_W - #define XAUDIO2D_DLL XAUDIO2D_DLL_W -#else - #define XAUDIO2_DLL XAUDIO2_DLL_A - #define XAUDIO2D_DLL XAUDIO2D_DLL_A -#endif - - -/************************************************************************** - * - * XAudio2 COM object class and interface IDs. - * - **************************************************************************/ - -#include - -#if defined(__cplusplus__) && defined(__WINRT__) - -#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) - /* XAudio 2.9 */ - interface __declspec(uuid("2B02E3CF-2E0B-4ec3-BE45-1B2A3FE7210D")) IXAudio2; -#else - /* XAudio 2.8 */ - interface __declspec(uuid("60d8dac8-5aa1-4e8e-b597-2f5e2883d484")) IXAudio2; -#endif - -#else - -/* Modified for C support */ -#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } -#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) -#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) - -#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) - DEFINE_IID_X(IXAudio2, 2B02E3CF, 2E0B, 4ec3, BE, 45, 1B, 2A, 3F, E7, 21, 0D); -#else - DEFINE_IID_X(IXAudio2, 60d8dac8, 5aa1, 4e8e, b5, 97, 2f, 5e, 28, 83, d4, 84); -#endif - -#endif - - -/* Ignore the rest of this header if only the GUID definitions were requested */ -#ifndef GUID_DEFS_ONLY - -#include /* Windows COM declarations */ -#include /* Markers for documenting API semantics */ -#include /* Basic data types and constants for audio work */ -#include /* For AUDIO_STREAM_CATEGORY */ - -/* All structures defined in this file use tight field packing */ -#pragma pack(push, 1) - - -/************************************************************************** - * - * XAudio2 constants, flags and error codes. - * - **************************************************************************/ - -/* Numeric boundary values */ -#define XAUDIO2_MAX_BUFFER_BYTES 0x80000000 /* Maximum bytes allowed in a source buffer */ -#define XAUDIO2_MAX_QUEUED_BUFFERS 64 /* Maximum buffers allowed in a voice queue */ -#define XAUDIO2_MAX_BUFFERS_SYSTEM 2 /* Maximum buffers allowed for system threads (Xbox 360 only) */ -#define XAUDIO2_MAX_AUDIO_CHANNELS 64 /* Maximum channels in an audio stream */ -#define XAUDIO2_MIN_SAMPLE_RATE 1000 /* Minimum audio sample rate supported */ -#define XAUDIO2_MAX_SAMPLE_RATE 200000 /* Maximum audio sample rate supported */ -#define XAUDIO2_MAX_VOLUME_LEVEL 16777216.0f /* Maximum acceptable volume level (2^24) */ -#define XAUDIO2_MIN_FREQ_RATIO (1/1024.0f) /* Minimum SetFrequencyRatio argument */ -#define XAUDIO2_MAX_FREQ_RATIO 1024.0f /* Maximum MaxFrequencyRatio argument */ -#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f /* Default MaxFrequencyRatio argument */ -#define XAUDIO2_MAX_FILTER_ONEOVERQ 1.5f /* Maximum XAUDIO2_FILTER_PARAMETERS.OneOverQ */ -#define XAUDIO2_MAX_FILTER_FREQUENCY 1.0f /* Maximum XAUDIO2_FILTER_PARAMETERS.Frequency */ -#define XAUDIO2_MAX_LOOP_COUNT 254 /* Maximum non-infinite XAUDIO2_BUFFER.LoopCount */ -#define XAUDIO2_MAX_INSTANCES 8 /* Maximum simultaneous XAudio2 objects on Xbox 360 */ - -/* For XMA voices on Xbox 360 there is an additional restriction on the MaxFrequencyRatio - * argument and the voice's sample rate: the product of these numbers cannot exceed 600000 - * for one-channel voices or 300000 for voices with more than one channel. */ -#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MONO 600000 -#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL 300000 - -/* Numeric values with special meanings */ -#define XAUDIO2_COMMIT_NOW 0 /* Used as an OperationSet argument */ -#define XAUDIO2_COMMIT_ALL 0 /* Used in IXAudio2::CommitChanges */ -#define XAUDIO2_INVALID_OPSET (UINT32)(-1) /* Not allowed for OperationSet arguments */ -#define XAUDIO2_NO_LOOP_REGION 0 /* Used in XAUDIO2_BUFFER.LoopCount */ -#define XAUDIO2_LOOP_INFINITE 255 /* Used in XAUDIO2_BUFFER.LoopCount */ -#define XAUDIO2_DEFAULT_CHANNELS 0 /* Used in CreateMasteringVoice */ -#define XAUDIO2_DEFAULT_SAMPLERATE 0 /* Used in CreateMasteringVoice */ - -/* Flags */ -#define XAUDIO2_DEBUG_ENGINE 0x0001 /* Used in XAudio2Create */ -#define XAUDIO2_VOICE_NOPITCH 0x0002 /* Used in IXAudio2::CreateSourceVoice */ -#define XAUDIO2_VOICE_NOSRC 0x0004 /* Used in IXAudio2::CreateSourceVoice */ -#define XAUDIO2_VOICE_USEFILTER 0x0008 /* Used in IXAudio2::CreateSource/SubmixVoice */ -#define XAUDIO2_PLAY_TAILS 0x0020 /* Used in IXAudio2SourceVoice::Stop */ -#define XAUDIO2_END_OF_STREAM 0x0040 /* Used in XAUDIO2_BUFFER.Flags */ -#define XAUDIO2_SEND_USEFILTER 0x0080 /* Used in XAUDIO2_SEND_DESCRIPTOR.Flags */ -#define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 /* Used in IXAudio2SourceVoice::GetState */ -#define XAUDIO2_STOP_ENGINE_WHEN_IDLE 0x2000 /* Used in XAudio2Create to force the engine to Stop when no source voices are Started, and Start when a voice is Started */ -#define XAUDIO2_1024_QUANTUM 0x8000 /* Used in XAudio2Create to specify nondefault processing quantum of 21.33 ms (1024 samples at 48KHz) */ -#define XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT 0x10000 /* Used in CreateMasteringVoice to create a virtual audio client */ - -/* Default parameters for the built-in filter */ -#define XAUDIO2_DEFAULT_FILTER_TYPE LowPassFilter -#define XAUDIO2_DEFAULT_FILTER_FREQUENCY XAUDIO2_MAX_FILTER_FREQUENCY -#define XAUDIO2_DEFAULT_FILTER_ONEOVERQ 1.0f - -/* Internal XAudio2 constants - * The audio frame quantum can be calculated by reducing the fraction: - * SamplesPerAudioFrame / SamplesPerSecond - */ -#define XAUDIO2_QUANTUM_NUMERATOR 1 /* On Windows, XAudio2 processes audio */ -#define XAUDIO2_QUANTUM_DENOMINATOR 100 /* in 10ms chunks (= 1/100 seconds) */ -#define XAUDIO2_QUANTUM_MS (1000.0f * XAUDIO2_QUANTUM_NUMERATOR / XAUDIO2_QUANTUM_DENOMINATOR) - -/* XAudio2 error codes */ -#define FACILITY_XAUDIO2 0x896 -#define XAUDIO2_E_INVALID_CALL 0x88960001 /* An API call or one of its arguments was illegal */ -#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 /* The XMA hardware suffered an unrecoverable error */ -#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 /* XAudio2 failed to initialize an XAPO effect */ -#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 /* An audio device became unusable (unplugged, etc) */ - -/************************************************************************** - * - * Forward declarations for the XAudio2 interfaces. - * - **************************************************************************/ - -#ifdef __cplusplus - #define FWD_DECLARE(x) interface x -#else - #define FWD_DECLARE(x) typedef interface x x -#endif - -FWD_DECLARE(IXAudio2); -FWD_DECLARE(IXAudio2Voice); -FWD_DECLARE(IXAudio2SourceVoice); -FWD_DECLARE(IXAudio2SubmixVoice); -FWD_DECLARE(IXAudio2MasteringVoice); -FWD_DECLARE(IXAudio2EngineCallback); -FWD_DECLARE(IXAudio2VoiceCallback); - - -/************************************************************************** - * - * XAudio2 structures and enumerations. - * - **************************************************************************/ - -/* Used in XAudio2Create, specifies which CPU(s) to use. */ -typedef UINT32 XAUDIO2_PROCESSOR; -#define Processor1 0x00000001 -#define Processor2 0x00000002 -#define Processor3 0x00000004 -#define Processor4 0x00000008 -#define Processor5 0x00000010 -#define Processor6 0x00000020 -#define Processor7 0x00000040 -#define Processor8 0x00000080 -#define Processor9 0x00000100 -#define Processor10 0x00000200 -#define Processor11 0x00000400 -#define Processor12 0x00000800 -#define Processor13 0x00001000 -#define Processor14 0x00002000 -#define Processor15 0x00004000 -#define Processor16 0x00008000 -#define Processor17 0x00010000 -#define Processor18 0x00020000 -#define Processor19 0x00040000 -#define Processor20 0x00080000 -#define Processor21 0x00100000 -#define Processor22 0x00200000 -#define Processor23 0x00400000 -#define Processor24 0x00800000 -#define Processor25 0x01000000 -#define Processor26 0x02000000 -#define Processor27 0x04000000 -#define Processor28 0x08000000 -#define Processor29 0x10000000 -#define Processor30 0x20000000 -#define Processor31 0x40000000 -#define Processor32 0x80000000 -#define XAUDIO2_ANY_PROCESSOR 0xffffffff -#define XAUDIO2_DEFAULT_PROCESSOR Processor1 - -/* Returned by IXAudio2Voice::GetVoiceDetails */ -typedef struct XAUDIO2_VOICE_DETAILS -{ - UINT32 CreationFlags; /* Flags the voice was created with. */ - UINT32 ActiveFlags; /* Flags currently active. */ - UINT32 InputChannels; /* Channels in the voice's input audio. */ - UINT32 InputSampleRate; /* Sample rate of the voice's input audio. */ -} XAUDIO2_VOICE_DETAILS; - -/* Used in XAUDIO2_VOICE_SENDS below */ -typedef struct XAUDIO2_SEND_DESCRIPTOR -{ - UINT32 Flags; /* Either 0 or XAUDIO2_SEND_USEFILTER. */ - IXAudio2Voice* pOutputVoice; /* This send's destination voice. */ -} XAUDIO2_SEND_DESCRIPTOR; - -/* Used in the voice creation functions and in IXAudio2Voice::SetOutputVoices */ -typedef struct XAUDIO2_VOICE_SENDS -{ - UINT32 SendCount; /* Number of sends from this voice. */ - XAUDIO2_SEND_DESCRIPTOR* pSends; /* Array of SendCount send descriptors. */ -} XAUDIO2_VOICE_SENDS; - -/* Used in XAUDIO2_EFFECT_CHAIN below */ -typedef struct XAUDIO2_EFFECT_DESCRIPTOR -{ - IUnknown* pEffect; /* Pointer to the effect object's IUnknown interface. */ - BOOL InitialState; /* TRUE if the effect should begin in the enabled state. */ - UINT32 OutputChannels; /* How many output channels the effect should produce. */ -} XAUDIO2_EFFECT_DESCRIPTOR; - -/* Used in the voice creation functions and in IXAudio2Voice::SetEffectChain */ -typedef struct XAUDIO2_EFFECT_CHAIN -{ - UINT32 EffectCount; /* Number of effects in this voice's effect chain. */ - XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; /* Array of effect descriptors. */ -} XAUDIO2_EFFECT_CHAIN; - -/* Used in XAUDIO2_FILTER_PARAMETERS below */ -typedef enum XAUDIO2_FILTER_TYPE -{ - LowPassFilter, // Attenuates frequencies above the cutoff frequency (state-variable filter). - BandPassFilter, // Attenuates frequencies outside a given range (state-variable filter). - HighPassFilter, // Attenuates frequencies below the cutoff frequency (state-variable filter). - NotchFilter, // Attenuates frequencies inside a given range (state-variable filter). - LowPassOnePoleFilter, // Attenuates frequencies above the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) - HighPassOnePoleFilter // Attenuates frequencies below the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) -} XAUDIO2_FILTER_TYPE; - -/* Used in IXAudio2Voice::Set/GetFilterParameters and Set/GetOutputFilterParameters */ -typedef struct XAUDIO2_FILTER_PARAMETERS -{ - XAUDIO2_FILTER_TYPE Type; /* Filter type. */ - float Frequency; /* Filter coefficient. - * must be >= 0 and <= XAUDIO2_MAX_FILTER_FREQUENCY - * See XAudio2CutoffFrequencyToRadians() for state-variable filter types and - * XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. - */ - float OneOverQ; /* Reciprocal of the filter's quality factor Q; - * must be > 0 and <= XAUDIO2_MAX_FILTER_ONEOVERQ. - * Has no effect for one-pole filters. - */ -} XAUDIO2_FILTER_PARAMETERS; - -/* Used in IXAudio2SourceVoice::SubmitSourceBuffer */ -typedef struct XAUDIO2_BUFFER -{ - UINT32 Flags; // Either 0 or XAUDIO2_END_OF_STREAM. - UINT32 AudioBytes; // Size of the audio data buffer in bytes. - const BYTE* pAudioData; // Pointer to the audio data buffer. - UINT32 PlayBegin; // First sample in this buffer to be played. - UINT32 PlayLength; // Length of the region to be played in samples, - // or 0 to play the whole buffer. - UINT32 LoopBegin; // First sample of the region to be looped. - UINT32 LoopLength; // Length of the desired loop region in samples, - // or 0 to loop the entire buffer. - UINT32 LoopCount; // Number of times to repeat the loop region, - // or XAUDIO2_LOOP_INFINITE to loop forever. - void* pContext; // Context value to be passed back in callbacks. -} XAUDIO2_BUFFER; - -// Used in IXAudio2SourceVoice::SubmitSourceBuffer when submitting XWMA data. -// NOTE: If an XWMA sound is submitted in more than one buffer, each buffer's -// pDecodedPacketCumulativeBytes[PacketCount-1] value must be subtracted from -// all the entries in the next buffer's pDecodedPacketCumulativeBytes array. -// And whether a sound is submitted in more than one buffer or not, the final -// buffer of the sound should use the XAUDIO2_END_OF_STREAM flag, or else the -// client must call IXAudio2SourceVoice::Discontinuity after submitting it. -typedef struct XAUDIO2_BUFFER_WMA -{ - const UINT32* pDecodedPacketCumulativeBytes; // Decoded packet's cumulative size array. - // Each element is the number of bytes accumulated - // when the corresponding XWMA packet is decoded in - // order. The array must have PacketCount elements. - UINT32 PacketCount; // Number of XWMA packets submitted. Must be >= 1 and - // divide evenly into XAUDIO2_BUFFER.AudioBytes. -} XAUDIO2_BUFFER_WMA; - -/* Returned by IXAudio2SourceVoice::GetState */ -typedef struct XAUDIO2_VOICE_STATE -{ - void* pCurrentBufferContext; // The pContext value provided in the XAUDIO2_BUFFER - // that is currently being processed, or NULL if - // there are no buffers in the queue. - UINT32 BuffersQueued; // Number of buffers currently queued on the voice - // (including the one that is being processed). - UINT64 SamplesPlayed; // Total number of samples produced by the voice since - // it began processing the current audio stream. - // If XAUDIO2_VOICE_NOSAMPLESPLAYED is specified - // in the call to IXAudio2SourceVoice::GetState, - // this member will not be calculated, saving CPU. -} XAUDIO2_VOICE_STATE; - -/* Returned by IXAudio2::GetPerformanceData */ -typedef struct XAUDIO2_PERFORMANCE_DATA -{ - /* CPU usage information */ - UINT64 AudioCyclesSinceLastQuery; // CPU cycles spent on audio processing since the - // last call to StartEngine or GetPerformanceData. - UINT64 TotalCyclesSinceLastQuery; // Total CPU cycles elapsed since the last call - // (only counts the CPU XAudio2 is running on). - UINT32 MinimumCyclesPerQuantum; // Fewest CPU cycles spent processing any one - // audio quantum since the last call. - UINT32 MaximumCyclesPerQuantum; // Most CPU cycles spent processing any one - // audio quantum since the last call. - - /* Memory usage information */ - UINT32 MemoryUsageInBytes; // Total heap space currently in use. - - /* Audio latency and glitching information */ - UINT32 CurrentLatencyInSamples; // Minimum delay from when a sample is read from a - // source buffer to when it reaches the speakers. - UINT32 GlitchesSinceEngineStarted; // Audio dropouts since the engine was started. - - /* Data about XAudio2's current workload */ - UINT32 ActiveSourceVoiceCount; // Source voices currently playing. - UINT32 TotalSourceVoiceCount; // Source voices currently existing. - UINT32 ActiveSubmixVoiceCount; // Submix voices currently playing/existing. - - UINT32 ActiveResamplerCount; // Resample xAPOs currently active. - UINT32 ActiveMatrixMixCount; // MatrixMix xAPOs currently active. - - /* Usage of the hardware XMA decoder (Xbox 360 only) */ - UINT32 ActiveXmaSourceVoices; /* Number of source voices decoding XMA data. */ - UINT32 ActiveXmaStreams; /* A voice can use more than one XMA stream. */ -} XAUDIO2_PERFORMANCE_DATA; - -// Used in IXAudio2::SetDebugConfiguration -typedef struct XAUDIO2_DEBUG_CONFIGURATION -{ - UINT32 TraceMask; // Bitmap of enabled debug message types. - UINT32 BreakMask; // Message types that will break into the debugger. - BOOL LogThreadID; // Whether to log the thread ID with each message. - BOOL LogFileline; // Whether to log the source file and line number. - BOOL LogFunctionName; // Whether to log the function name. - BOOL LogTiming; // Whether to log message timestamps. -} XAUDIO2_DEBUG_CONFIGURATION; - -/* Values for the TraceMask and BreakMask bitmaps. Only ERRORS and WARNINGS - * are valid in BreakMask. WARNINGS implies ERRORS, DETAIL implies INFO, and - * FUNC_CALLS implies API_CALLS. By default, TraceMask is ERRORS and WARNINGS - * and all the other settings are zero. - */ -#define XAUDIO2_LOG_ERRORS 0x0001 // For handled errors with serious effects. -#define XAUDIO2_LOG_WARNINGS 0x0002 // For handled errors that may be recoverable. -#define XAUDIO2_LOG_INFO 0x0004 // Informational chit-chat (e.g. state changes). -#define XAUDIO2_LOG_DETAIL 0x0008 // More detailed chit-chat. -#define XAUDIO2_LOG_API_CALLS 0x0010 // Public API function entries and exits. -#define XAUDIO2_LOG_FUNC_CALLS 0x0020 // Internal function entries and exits. -#define XAUDIO2_LOG_TIMING 0x0040 // Delays detected and other timing data. -#define XAUDIO2_LOG_LOCKS 0x0080 // Usage of critical sections and mutexes. -#define XAUDIO2_LOG_MEMORY 0x0100 // Memory heap usage information. -#define XAUDIO2_LOG_STREAMING 0x1000 // Audio streaming information. - - -/************************************************************************** - * - * IXAudio2: Top-level XAudio2 COM interface. - * - **************************************************************************/ - -/* Use default arguments if compiling as C++ */ -#ifdef __cplusplus - #define X2DEFAULT(x) =x -#else - #define X2DEFAULT(x) -#endif - -#undef INTERFACE -#define INTERFACE IXAudio2 -DECLARE_INTERFACE_(IXAudio2, IUnknown) -{ - /* NAME: IXAudio2::QueryInterface - * DESCRIPTION: Queries for a given COM interface on the XAudio2 object. - * Only IID_IUnknown and IID_IXAudio2 are supported. - * - * ARGUMENTS: - * riid - IID of the interface to be obtained. - * ppvInterface - Returns a pointer to the requested interface. - */ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, _Outptr_ void** ppvInterface) PURE; - - /* NAME: IXAudio2::AddRef - * DESCRIPTION: Adds a reference to the XAudio2 object. - */ - STDMETHOD_(ULONG, AddRef) (THIS) PURE; - - /* NAME: IXAudio2::Release - * DESCRIPTION: Releases a reference to the XAudio2 object. - */ - STDMETHOD_(ULONG, Release) (THIS) PURE; - - // NAME: IXAudio2::RegisterForCallbacks - // DESCRIPTION: Adds a new client to receive XAudio2's engine callbacks. - // - // ARGUMENTS: - // pCallback - Callback interface to be called during each processing pass. - // - STDMETHOD(RegisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE; - - // NAME: IXAudio2::UnregisterForCallbacks - // DESCRIPTION: Removes an existing receiver of XAudio2 engine callbacks. - // - // ARGUMENTS: - // pCallback - Previously registered callback interface to be removed. - // - STDMETHOD_(void, UnregisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE; - - // NAME: IXAudio2::CreateSourceVoice - // DESCRIPTION: Creates and configures a source voice. - // - // ARGUMENTS: - // ppSourceVoice - Returns the new object's IXAudio2SourceVoice interface. - // pSourceFormat - Format of the audio that will be fed to the voice. - // Flags - XAUDIO2_VOICE flags specifying the source voice's behavior. - // MaxFrequencyRatio - Maximum SetFrequencyRatio argument to be allowed. - // pCallback - Optional pointer to a client-provided callback interface. - // pSendList - Optional list of voices this voice should send audio to. - // pEffectChain - Optional list of effects to apply to the audio data. - // - STDMETHOD(CreateSourceVoice) (THIS_ _Outptr_ IXAudio2SourceVoice** ppSourceVoice, - _In_ const WAVEFORMATEX* pSourceFormat, - UINT32 Flags X2DEFAULT(0), - float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO), - _In_opt_ IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL), - _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), - _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; - - // NAME: IXAudio2::CreateSubmixVoice - // DESCRIPTION: Creates and configures a submix voice. - // - // ARGUMENTS: - // ppSubmixVoice - Returns the new object's IXAudio2SubmixVoice interface. - // InputChannels - Number of channels in this voice's input audio data. - // InputSampleRate - Sample rate of this voice's input audio data. - // Flags - XAUDIO2_VOICE flags specifying the submix voice's behavior. - // ProcessingStage - Arbitrary number that determines the processing order. - // pSendList - Optional list of voices this voice should send audio to. - // pEffectChain - Optional list of effects to apply to the audio data. - // - STDMETHOD(CreateSubmixVoice) (THIS_ _Outptr_ IXAudio2SubmixVoice** ppSubmixVoice, - UINT32 InputChannels, UINT32 InputSampleRate, - UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0), - _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), - _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; - - - // NAME: IXAudio2::CreateMasteringVoice - // DESCRIPTION: Creates and configures a mastering voice. - // - // ARGUMENTS: - // ppMasteringVoice - Returns the new object's IXAudio2MasteringVoice interface. - // InputChannels - Number of channels in this voice's input audio data. - // InputSampleRate - Sample rate of this voice's input audio data. - // Flags - XAUDIO2_VOICE flags specifying the mastering voice's behavior. - // szDeviceId - Identifier of the device to receive the output audio. - // pEffectChain - Optional list of effects to apply to the audio data. - // StreamCategory - The audio stream category to use for this mastering voice - // - STDMETHOD(CreateMasteringVoice) (THIS_ _Outptr_ IXAudio2MasteringVoice** ppMasteringVoice, - UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS), - UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE), - UINT32 Flags X2DEFAULT(0), _In_opt_z_ LPCWSTR szDeviceId X2DEFAULT(NULL), - _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL), - _In_ AUDIO_STREAM_CATEGORY StreamCategory X2DEFAULT(AudioCategory_GameEffects)) PURE; - - // NAME: IXAudio2::StartEngine - // DESCRIPTION: Creates and starts the audio processing thread. - // - STDMETHOD(StartEngine) (THIS) PURE; - - // NAME: IXAudio2::StopEngine - // DESCRIPTION: Stops and destroys the audio processing thread. - // - STDMETHOD_(void, StopEngine) (THIS) PURE; - - // NAME: IXAudio2::CommitChanges - // DESCRIPTION: Atomically applies a set of operations previously tagged - // with a given identifier. - // - // ARGUMENTS: - // OperationSet - Identifier of the set of operations to be applied. - // - STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE; - - // NAME: IXAudio2::GetPerformanceData - // DESCRIPTION: Returns current resource usage details: memory, CPU, etc. - // - // ARGUMENTS: - // pPerfData - Returns the performance data structure. - // - STDMETHOD_(void, GetPerformanceData) (THIS_ _Out_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE; - - // NAME: IXAudio2::SetDebugConfiguration - // DESCRIPTION: Configures XAudio2's debug output (in debug builds only). - // - // ARGUMENTS: - // pDebugConfiguration - Structure describing the debug output behavior. - // pReserved - Optional parameter; must be NULL. - // - STDMETHOD_(void, SetDebugConfiguration) (THIS_ _In_opt_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration, - _Reserved_ void* pReserved X2DEFAULT(NULL)) PURE; -}; - - -/************************************************************************** - * - * IXAudio2Voice: Base voice management interface. - * - **************************************************************************/ - -#undef INTERFACE -#define INTERFACE IXAudio2Voice -DECLARE_INTERFACE(IXAudio2Voice) -{ - /* These methods are declared in a macro so that the same declarations - * can be used in the derived voice types (IXAudio2SourceVoice, etc). - */ - - #define Declare_IXAudio2Voice_Methods() \ - \ - /* NAME: IXAudio2Voice::GetVoiceDetails - * DESCRIPTION: Returns the basic characteristics of this voice. - * - * ARGUMENTS: - * pVoiceDetails - Returns the voice's details. - */ - \ - STDMETHOD_(void, GetVoiceDetails) (THIS_ _Out_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ - \ - /* NAME: IXAudio2Voice::SetOutputVoices - // DESCRIPTION: Replaces the set of submix/mastering voices that receive - // this voice's output. - // - // ARGUMENTS: - // pSendList - Optional list of voices this voice should send audio to. - */\ - STDMETHOD(SetOutputVoices) (THIS_ _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \ - \ - /* NAME: IXAudio2Voice::SetEffectChain - // DESCRIPTION: Replaces this voice's current effect chain with a new one. - // - // ARGUMENTS: - // pEffectChain - Structure describing the new effect chain to be used. - */\ - STDMETHOD(SetEffectChain) (THIS_ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \ - \ - /* NAME: IXAudio2Voice::EnableEffect - // DESCRIPTION: Enables an effect in this voice's effect chain. - // - // ARGUMENTS: - // EffectIndex - Index of an effect within this voice's effect chain. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::DisableEffect - // DESCRIPTION: Disables an effect in this voice's effect chain. - // - // ARGUMENTS: - // EffectIndex - Index of an effect within this voice's effect chain. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetEffectState - // DESCRIPTION: Returns the running state of an effect. - // - // ARGUMENTS: - // EffectIndex - Index of an effect within this voice's effect chain. - // pEnabled - Returns the enabled/disabled state of the given effect. - */\ - STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, _Out_ BOOL* pEnabled) PURE; \ - \ - /* NAME: IXAudio2Voice::SetEffectParameters - // DESCRIPTION: Sets effect-specific parameters. - // - // REMARKS: Unlike IXAPOParameters::SetParameters, this method may - // be called from any thread. XAudio2 implements - // appropriate synchronization to copy the parameters to the - // realtime audio processing thread. - // - // ARGUMENTS: - // EffectIndex - Index of an effect within this voice's effect chain. - // pParameters - Pointer to an effect-specific parameters block. - // ParametersByteSize - Size of the pParameters array in bytes. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \ - _In_reads_bytes_(ParametersByteSize) const void* pParameters, \ - UINT32 ParametersByteSize, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetEffectParameters - // DESCRIPTION: Obtains the current effect-specific parameters. - // - // ARGUMENTS: - // EffectIndex - Index of an effect within this voice's effect chain. - // pParameters - Returns the current values of the effect-specific parameters. - // ParametersByteSize - Size of the pParameters array in bytes. - */\ - STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, \ - _Out_writes_bytes_(ParametersByteSize) void* pParameters, \ - UINT32 ParametersByteSize) PURE; \ - \ - /* NAME: IXAudio2Voice::SetFilterParameters - // DESCRIPTION: Sets this voice's filter parameters. - // - // ARGUMENTS: - // pParameters - Pointer to the filter's parameter structure. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(SetFilterParameters) (THIS_ _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetFilterParameters - // DESCRIPTION: Returns this voice's current filter parameters. - // - // ARGUMENTS: - // pParameters - Returns the filter parameters. - */\ - STDMETHOD_(void, GetFilterParameters) (THIS_ _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ - \ - /* NAME: IXAudio2Voice::SetOutputFilterParameters - // DESCRIPTION: Sets the filter parameters on one of this voice's sends. - // - // ARGUMENTS: - // pDestinationVoice - Destination voice of the send whose filter parameters will be set. - // pParameters - Pointer to the filter's parameter structure. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(SetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ - _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetOutputFilterParameters - // DESCRIPTION: Returns the filter parameters from one of this voice's sends. - // - // ARGUMENTS: - // pDestinationVoice - Destination voice of the send whose filter parameters will be read. - // pParameters - Returns the filter parameters. - */\ - STDMETHOD_(void, GetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ - _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ - \ - /* NAME: IXAudio2Voice::SetVolume - // DESCRIPTION: Sets this voice's overall volume level. - // - // ARGUMENTS: - // Volume - New overall volume level to be used, as an amplitude factor. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(SetVolume) (THIS_ float Volume, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetVolume - // DESCRIPTION: Obtains this voice's current overall volume level. - // - // ARGUMENTS: - // pVolume: Returns the voice's current overall volume level. - */\ - STDMETHOD_(void, GetVolume) (THIS_ _Out_ float* pVolume) PURE; \ - \ - /* NAME: IXAudio2Voice::SetChannelVolumes - // DESCRIPTION: Sets this voice's per-channel volume levels. - // - // ARGUMENTS: - // Channels - Used to confirm the voice's channel count. - // pVolumes - Array of per-channel volume levels to be used. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, _In_reads_(Channels) const float* pVolumes, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetChannelVolumes - // DESCRIPTION: Returns this voice's current per-channel volume levels. - // - // ARGUMENTS: - // Channels - Used to confirm the voice's channel count. - // pVolumes - Returns an array of the current per-channel volume levels. - */\ - STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, _Out_writes_(Channels) float* pVolumes) PURE; \ - \ - /* NAME: IXAudio2Voice::SetOutputMatrix - // DESCRIPTION: Sets the volume levels used to mix from each channel of this - // voice's output audio to each channel of a given destination - // voice's input audio. - // - // ARGUMENTS: - // pDestinationVoice - The destination voice whose mix matrix to change. - // SourceChannels - Used to confirm this voice's output channel count - // (the number of channels produced by the last effect in the chain). - // DestinationChannels - Confirms the destination voice's input channels. - // pLevelMatrix - Array of [SourceChannels * DestinationChannels] send - // levels. The level used to send from source channel S to destination - // channel D should be in pLevelMatrix[S + SourceChannels * D]. - // OperationSet - Used to identify this call as part of a deferred batch. - */\ - STDMETHOD(SetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ - UINT32 SourceChannels, UINT32 DestinationChannels, \ - _In_reads_(SourceChannels * DestinationChannels) const float* pLevelMatrix, \ - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ - \ - /* NAME: IXAudio2Voice::GetOutputMatrix - // DESCRIPTION: Obtains the volume levels used to send each channel of this - // voice's output audio to each channel of a given destination - // voice's input audio. - // - // ARGUMENTS: - // pDestinationVoice - The destination voice whose mix matrix to obtain. - // SourceChannels - Used to confirm this voice's output channel count - // (the number of channels produced by the last effect in the chain). - // DestinationChannels - Confirms the destination voice's input channels. - // pLevelMatrix - Array of send levels, as above. - */\ - STDMETHOD_(void, GetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ - UINT32 SourceChannels, UINT32 DestinationChannels, \ - _Out_writes_(SourceChannels * DestinationChannels) float* pLevelMatrix) PURE; \ - \ - /* NAME: IXAudio2Voice::DestroyVoice - // DESCRIPTION: Destroys this voice, stopping it if necessary and removing - // it from the XAudio2 graph. - */\ - STDMETHOD_(void, DestroyVoice) (THIS) PURE - - Declare_IXAudio2Voice_Methods(); -}; - - -/************************************************************************** - * - * IXAudio2SourceVoice: Source voice management interface. - * - **************************************************************************/ - -#undef INTERFACE -#define INTERFACE IXAudio2SourceVoice -DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) -{ - // Methods from IXAudio2Voice base interface - Declare_IXAudio2Voice_Methods(); - - // NAME: IXAudio2SourceVoice::Start - // DESCRIPTION: Makes this voice start consuming and processing audio. - // - // ARGUMENTS: - // Flags - Flags controlling how the voice should be started. - // OperationSet - Used to identify this call as part of a deferred batch. - // - STDMETHOD(Start) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - - // NAME: IXAudio2SourceVoice::Stop - // DESCRIPTION: Makes this voice stop consuming audio. - // - // ARGUMENTS: - // Flags - Flags controlling how the voice should be stopped. - // OperationSet - Used to identify this call as part of a deferred batch. - // - STDMETHOD(Stop) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - - // NAME: IXAudio2SourceVoice::SubmitSourceBuffer - // DESCRIPTION: Adds a new audio buffer to this voice's input queue. - // - // ARGUMENTS: - // pBuffer - Pointer to the buffer structure to be queued. - // pBufferWMA - Additional structure used only when submitting XWMA data. - // - STDMETHOD(SubmitSourceBuffer) (THIS_ _In_ const XAUDIO2_BUFFER* pBuffer, _In_opt_ const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE; - - // NAME: IXAudio2SourceVoice::FlushSourceBuffers - // DESCRIPTION: Removes all pending audio buffers from this voice's queue. - // - STDMETHOD(FlushSourceBuffers) (THIS) PURE; - - // NAME: IXAudio2SourceVoice::Discontinuity - // DESCRIPTION: Notifies the voice of an intentional break in the stream of - // audio buffers (e.g. the end of a sound), to prevent XAudio2 - // from interpreting an empty buffer queue as a glitch. - // - STDMETHOD(Discontinuity) (THIS) PURE; - - // NAME: IXAudio2SourceVoice::ExitLoop - // DESCRIPTION: Breaks out of the current loop when its end is reached. - // - // ARGUMENTS: - // OperationSet - Used to identify this call as part of a deferred batch. - // - STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - - // NAME: IXAudio2SourceVoice::GetState - // DESCRIPTION: Returns the number of buffers currently queued on this voice, - // the pContext value associated with the currently processing - // buffer (if any), and other voice state information. - // - // ARGUMENTS: - // pVoiceState - Returns the state information. - // Flags - Flags controlling what voice state is returned. - // - STDMETHOD_(void, GetState) (THIS_ _Out_ XAUDIO2_VOICE_STATE* pVoiceState, UINT32 Flags X2DEFAULT(0)) PURE; - - // NAME: IXAudio2SourceVoice::SetFrequencyRatio - // DESCRIPTION: Sets this voice's frequency adjustment, i.e. its pitch. - // - // ARGUMENTS: - // Ratio - Frequency change, expressed as source frequency / target frequency. - // OperationSet - Used to identify this call as part of a deferred batch. - // - STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio, - UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; - - // NAME: IXAudio2SourceVoice::GetFrequencyRatio - // DESCRIPTION: Returns this voice's current frequency adjustment ratio. - // - // ARGUMENTS: - // pRatio - Returns the frequency adjustment. - // - STDMETHOD_(void, GetFrequencyRatio) (THIS_ _Out_ float* pRatio) PURE; - - // NAME: IXAudio2SourceVoice::SetSourceSampleRate - // DESCRIPTION: Reconfigures this voice to treat its source data as being - // at a different sample rate than the original one specified - // in CreateSourceVoice's pSourceFormat argument. - // - // ARGUMENTS: - // UINT32 - The intended sample rate of further submitted source data. - // - STDMETHOD(SetSourceSampleRate) (THIS_ UINT32 NewSourceSampleRate) PURE; -}; - - -/************************************************************************** - * - * IXAudio2SubmixVoice: Submixing voice management interface. - * - **************************************************************************/ - -#undef INTERFACE -#define INTERFACE IXAudio2SubmixVoice -DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice) -{ - // Methods from IXAudio2Voice base interface - Declare_IXAudio2Voice_Methods(); - - // There are currently no methods specific to submix voices. -}; - - -/************************************************************************** - * - * IXAudio2MasteringVoice: Mastering voice management interface. - * - **************************************************************************/ - -#undef INTERFACE -#define INTERFACE IXAudio2MasteringVoice -DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) -{ - // Methods from IXAudio2Voice base interface - Declare_IXAudio2Voice_Methods(); - - // NAME: IXAudio2MasteringVoice::GetChannelMask - // DESCRIPTION: Returns the channel mask for this voice - // - // ARGUMENTS: - // pChannelMask - returns the channel mask for this voice. This corresponds - // to the dwChannelMask member of WAVEFORMATEXTENSIBLE. - // - STDMETHOD(GetChannelMask) (THIS_ _Out_ DWORD* pChannelmask) PURE; -}; - - -/************************************************************************** - * - * IXAudio2EngineCallback: Client notification interface for engine events. - * - * REMARKS: Contains methods to notify the client when certain events happen - * in the XAudio2 engine. This interface should be implemented by - * the client. XAudio2 will call these methods via the interface - * pointer provided by the client when it calls - * IXAudio2::RegisterForCallbacks. - * - **************************************************************************/ - -#undef INTERFACE -#define INTERFACE IXAudio2EngineCallback -DECLARE_INTERFACE(IXAudio2EngineCallback) -{ - // Called by XAudio2 just before an audio processing pass begins. - STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE; - - // Called just after an audio processing pass ends. - STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE; - - // Called in the event of a critical system error which requires XAudio2 - // to be closed down and restarted. The error code is given in Error. - STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE; -}; - - -/************************************************************************** - * - * IXAudio2VoiceCallback: Client notification interface for voice events. - * - * REMARKS: Contains methods to notify the client when certain events happen - * in an XAudio2 voice. This interface should be implemented by the - * client. XAudio2 will call these methods via an interface pointer - * provided by the client in the IXAudio2::CreateSourceVoice call. - * - **************************************************************************/ - -#undef INTERFACE -#define INTERFACE IXAudio2VoiceCallback -DECLARE_INTERFACE(IXAudio2VoiceCallback) -{ - // Called just before this voice's processing pass begins. - STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE; - - // Called just after this voice's processing pass ends. - STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE; - - // Called when this voice has just finished playing a buffer stream - // (as marked with the XAUDIO2_END_OF_STREAM flag on the last buffer). - STDMETHOD_(void, OnStreamEnd) (THIS) PURE; - - // Called when this voice is about to start processing a new buffer. - STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE; - - // Called when this voice has just finished processing a buffer. - // The buffer can now be reused or destroyed. - STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE; - - // Called when this voice has just reached the end position of a loop. - STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE; - - // Called in the event of a critical error during voice processing, - // such as a failing xAPO or an error from the hardware XMA decoder. - // The voice may have to be destroyed and re-created to recover from - // the error. The callback arguments report which buffer was being - // processed when the error occurred, and its HRESULT code. - STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE; -}; - - -/************************************************************************** - * - * Macros to make it easier to use the XAudio2 COM interfaces in C code. - * - **************************************************************************/ - -#ifndef __cplusplus - -/* IXAudio2 */ -#define IXAudio2_QueryInterface(This,riid,ppvInterface) ((This)->lpVtbl->QueryInterface(This,riid,ppvInterface)) -#define IXAudio2_AddRef(This) ((This)->lpVtbl->AddRef(This)) -#define IXAudio2_Release(This) ((This)->lpVtbl->Release(This)) -#define IXAudio2_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) ((This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)) -#define IXAudio2_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) ((This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)) -#define IXAudio2_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory) ((This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory)) -#define IXAudio2_StartEngine(This) ((This)->lpVtbl->StartEngine(This)) -#define IXAudio2_StopEngine(This) ((This)->lpVtbl->StopEngine(This)) -#define IXAudio2_CommitChanges(This,OperationSet) ((This)->lpVtbl->CommitChanges(This,OperationSet)) -#define IXAudio2_GetPerformanceData(This,pPerfData) ((This)->lpVtbl->GetPerformanceData(This,pPerfData)) -#define IXAudio2_SetDebugConfiguration(This,pDebugConfiguration,pReserved) ((This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)) - -/* IXAudio2Voice */ -#define IXAudio2Voice_GetVoiceDetails(This,pVoiceDetails) ((This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)) -#define IXAudio2Voice_SetOutputVoices(This,pSendList) ((This)->lpVtbl->SetOutputVoices(This,pSendList)) -#define IXAudio2Voice_SetEffectChain(This,pEffectChain) ((This)->lpVtbl->SetEffectChain(This,pEffectChain)) -#define IXAudio2Voice_EnableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)) -#define IXAudio2Voice_DisableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)) -#define IXAudio2Voice_GetEffectState(This,EffectIndex,pEnabled) ((This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)) -#define IXAudio2Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize, OperationSet) ((This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)) -#define IXAudio2Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) ((This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)) -#define IXAudio2Voice_SetFilterParameters(This,pParameters,OperationSet) ((This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)) -#define IXAudio2Voice_GetFilterParameters(This,pParameters) ((This)->lpVtbl->GetFilterParameters(This,pParameters)) -#define IXAudio2Voice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) ((This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)) -#define IXAudio2Voice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) ((This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)) -#define IXAudio2Voice_SetVolume(This,Volume,OperationSet) ((This)->lpVtbl->SetVolume(This,Volume,OperationSet)) -#define IXAudio2Voice_GetVolume(This,pVolume) ((This)->lpVtbl->GetVolume(This,pVolume)) -#define IXAudio2Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) ((This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)) -#define IXAudio2Voice_GetChannelVolumes(This,Channels,pVolumes) ((This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)) -#define IXAudio2Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) ((This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)) -#define IXAudio2Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) ((This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)) -#define IXAudio2Voice_DestroyVoice(This) ((This)->lpVtbl->DestroyVoice(This)) - -/* IXAudio2SourceVoice */ -#define IXAudio2SourceVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails -#define IXAudio2SourceVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices -#define IXAudio2SourceVoice_SetEffectChain IXAudio2Voice_SetEffectChain -#define IXAudio2SourceVoice_EnableEffect IXAudio2Voice_EnableEffect -#define IXAudio2SourceVoice_DisableEffect IXAudio2Voice_DisableEffect -#define IXAudio2SourceVoice_GetEffectState IXAudio2Voice_GetEffectState -#define IXAudio2SourceVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters -#define IXAudio2SourceVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters -#define IXAudio2SourceVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters -#define IXAudio2SourceVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters -#define IXAudio2SourceVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters -#define IXAudio2SourceVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters -#define IXAudio2SourceVoice_SetVolume IXAudio2Voice_SetVolume -#define IXAudio2SourceVoice_GetVolume IXAudio2Voice_GetVolume -#define IXAudio2SourceVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes -#define IXAudio2SourceVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes -#define IXAudio2SourceVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix -#define IXAudio2SourceVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix -#define IXAudio2SourceVoice_DestroyVoice IXAudio2Voice_DestroyVoice -#define IXAudio2SourceVoice_Start(This,Flags,OperationSet) ((This)->lpVtbl->Start(This,Flags,OperationSet)) -#define IXAudio2SourceVoice_Stop(This,Flags,OperationSet) ((This)->lpVtbl->Stop(This,Flags,OperationSet)) -#define IXAudio2SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) ((This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)) -#define IXAudio2SourceVoice_FlushSourceBuffers(This) ((This)->lpVtbl->FlushSourceBuffers(This)) -#define IXAudio2SourceVoice_Discontinuity(This) ((This)->lpVtbl->Discontinuity(This)) -#define IXAudio2SourceVoice_ExitLoop(This,OperationSet) ((This)->lpVtbl->ExitLoop(This,OperationSet)) -#define IXAudio2SourceVoice_GetState(This,pVoiceState,Flags) ((This)->lpVtbl->GetState(This,pVoiceState,Flags)) -#define IXAudio2SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) ((This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)) -#define IXAudio2SourceVoice_GetFrequencyRatio(This,pRatio) ((This)->lpVtbl->GetFrequencyRatio(This,pRatio)) -#define IXAudio2SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) ((This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate)) - -/* IXAudio2SubmixVoice */ -#define IXAudio2SubmixVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails -#define IXAudio2SubmixVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices -#define IXAudio2SubmixVoice_SetEffectChain IXAudio2Voice_SetEffectChain -#define IXAudio2SubmixVoice_EnableEffect IXAudio2Voice_EnableEffect -#define IXAudio2SubmixVoice_DisableEffect IXAudio2Voice_DisableEffect -#define IXAudio2SubmixVoice_GetEffectState IXAudio2Voice_GetEffectState -#define IXAudio2SubmixVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters -#define IXAudio2SubmixVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters -#define IXAudio2SubmixVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters -#define IXAudio2SubmixVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters -#define IXAudio2SubmixVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters -#define IXAudio2SubmixVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters -#define IXAudio2SubmixVoice_SetVolume IXAudio2Voice_SetVolume -#define IXAudio2SubmixVoice_GetVolume IXAudio2Voice_GetVolume -#define IXAudio2SubmixVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes -#define IXAudio2SubmixVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes -#define IXAudio2SubmixVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix -#define IXAudio2SubmixVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix -#define IXAudio2SubmixVoice_DestroyVoice IXAudio2Voice_DestroyVoice - -/* IXAudio2MasteringVoice */ -#define IXAudio2MasteringVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails -#define IXAudio2MasteringVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices -#define IXAudio2MasteringVoice_SetEffectChain IXAudio2Voice_SetEffectChain -#define IXAudio2MasteringVoice_EnableEffect IXAudio2Voice_EnableEffect -#define IXAudio2MasteringVoice_DisableEffect IXAudio2Voice_DisableEffect -#define IXAudio2MasteringVoice_GetEffectState IXAudio2Voice_GetEffectState -#define IXAudio2MasteringVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters -#define IXAudio2MasteringVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters -#define IXAudio2MasteringVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters -#define IXAudio2MasteringVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters -#define IXAudio2MasteringVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters -#define IXAudio2MasteringVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters -#define IXAudio2MasteringVoice_SetVolume IXAudio2Voice_SetVolume -#define IXAudio2MasteringVoice_GetVolume IXAudio2Voice_GetVolume -#define IXAudio2MasteringVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes -#define IXAudio2MasteringVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes -#define IXAudio2MasteringVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix -#define IXAudio2MasteringVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix -#define IXAudio2MasteringVoice_DestroyVoice IXAudio2Voice_DestroyVoice -#define IXAudio2MasteringVoice_GetChannelMask(This,pChannelMask) ((This)->lpVtbl->GetChannelMask(This,pChannelMask)) - -#endif /* #ifndef __cplusplus */ - - -/************************************************************************** - * - * Utility functions used to convert from pitch in semitones and volume - * in decibels to the frequency and amplitude ratio units used by XAudio2. - * These are only defined if the client #defines XAUDIO2_HELPER_FUNCTIONS - * prior to #including xaudio2.h. - * - **************************************************************************/ - -#ifdef XAUDIO2_HELPER_FUNCTIONS - -#define _USE_MATH_DEFINES /* Make math.h define M_PI */ -#include /* For powf, log10f, sinf and asinf */ - -/* Calculate the argument to SetVolume from a decibel value */ -__inline float XAudio2DecibelsToAmplitudeRatio(float Decibels) -{ - return powf(10.0f, Decibels / 20.0f); -} - -/* Recover a volume in decibels from an amplitude factor */ -__inline float XAudio2AmplitudeRatioToDecibels(float Volume) -{ - if (Volume == 0) - return -3.402823466e+38f; /* Smallest float value (-FLT_MAX) */ - return 20.0f * log10f(Volume); -} - -/* Calculate the argument to SetFrequencyRatio from a semitone value */ -__inline float XAudio2SemitonesToFrequencyRatio(float Semitones) -{ - /* FrequencyRatio = 2 ^ Octaves - * = 2 ^ (Semitones / 12) - */ - return powf(2.0f, Semitones / 12.0f); -} - -/* Recover a pitch in semitones from a frequency ratio */ -__inline float XAudio2FrequencyRatioToSemitones(float FrequencyRatio) -{ - /* Semitones = 12 * log2(FrequencyRatio) - * = 12 * log2(10) * log10(FrequencyRatio) - */ - return 39.86313713864835f * log10f(FrequencyRatio); -} - -/* Convert from filter cutoff frequencies expressed in Hertz to the radian - * frequency values used in XAUDIO2_FILTER_PARAMETERS.Frequency, state-variable - * filter types only. Use XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. - * Note that the highest CutoffFrequency supported is SampleRate/6. +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Krzysztof Haładyn + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + + /************************************************************************** + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * + * File: xaudio2.h + * Content: Declarations for the XAudio2 game audio API. + * + **************************************************************************/ + + /* Modified slightly to build without requiring the WinRT compiler since that is only available in C++ sources */ + +#ifdef _MSC_VER +#pragma once +#endif + +#ifndef __XAUDIO2_INCLUDED__ +#define __XAUDIO2_INCLUDED__ + +#include + +#include + +#if(_WIN32_WINNT < _WIN32_WINNT_WIN8) +#error "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions." +#endif // (_WIN32_WINNT < _WIN32_WINNT_WIN8) + +#include + +#pragma region Application Family +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) + +// Current name of the DLL shipped in the same SDK as this header. +// The name reflects the current version +#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) +#define XAUDIO2_DLL_A "xaudio2_9.dll" +#define XAUDIO2_DLL_W L"xaudio2_9.dll" +#define XAUDIO2D_DLL_A "xaudio2_9d.dll" +#define XAUDIO2D_DLL_W L"xaudio2_9d.dll" +#else +#define XAUDIO2_DLL_A "xaudio2_8.dll" +#define XAUDIO2_DLL_W L"xaudio2_8.dll" +#define XAUDIO2D_DLL_A "xaudio2_8.dll" +#define XAUDIO2D_DLL_W L"xaudio2_8.dll" +#endif + +#ifdef UNICODE +#define XAUDIO2_DLL XAUDIO2_DLL_W +#define XAUDIO2D_DLL XAUDIO2D_DLL_W +#else +#define XAUDIO2_DLL XAUDIO2_DLL_A +#define XAUDIO2D_DLL XAUDIO2D_DLL_A +#endif + + +/************************************************************************** + * + * XAudio2 COM object class and interface IDs. + * + **************************************************************************/ + +#include + +#if defined(__cplusplus__) && defined(__WINRT__) + +#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) + // XAudio 2.9 +interface __declspec(uuid("2B02E3CF-2E0B-4ec3-BE45-1B2A3FE7210D")) IXAudio2; +#else + // XAudio 2.8 +interface __declspec(uuid("60d8dac8-5aa1-4e8e-b597-2f5e2883d484")) IXAudio2; +#endif + +#else + + /* Modified for C support */ +#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) + +#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10) +DEFINE_IID_X(IXAudio2, 2B02E3CF, 2E0B, 4ec3, BE, 45, 1B, 2A, 3F, E7, 21, 0D); +#else +DEFINE_IID_X(IXAudio2, 60d8dac8, 5aa1, 4e8e, b5, 97, 2f, 5e, 28, 83, d4, 84); +#endif + +#endif + + +// Ignore the rest of this header if only the GUID definitions were requested +#ifndef GUID_DEFS_ONLY + +#include // Windows COM declarations +#include // Markers for documenting API semantics +#include // Basic data types and constants for audio work +#include // For AUDIO_STREAM_CATEGORY + +// All structures defined in this file use tight field packing +#pragma pack(push, 1) + + +/************************************************************************** + * + * XAudio2 constants, flags and error codes. + * + **************************************************************************/ + + // Numeric boundary values +#define XAUDIO2_MAX_BUFFER_BYTES 0x80000000 // Maximum bytes allowed in a source buffer +#define XAUDIO2_MAX_QUEUED_BUFFERS 64 // Maximum buffers allowed in a voice queue +#define XAUDIO2_MAX_BUFFERS_SYSTEM 2 // Maximum buffers allowed for system threads (Xbox 360 only) +#define XAUDIO2_MAX_AUDIO_CHANNELS 64 // Maximum channels in an audio stream +#define XAUDIO2_MIN_SAMPLE_RATE 1000 // Minimum audio sample rate supported +#define XAUDIO2_MAX_SAMPLE_RATE 200000 // Maximum audio sample rate supported +#define XAUDIO2_MAX_VOLUME_LEVEL 16777216.0f // Maximum acceptable volume level (2^24) +#define XAUDIO2_MIN_FREQ_RATIO (1/1024.0f) // Minimum SetFrequencyRatio argument +#define XAUDIO2_MAX_FREQ_RATIO 1024.0f // Maximum MaxFrequencyRatio argument +#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f // Default MaxFrequencyRatio argument +#define XAUDIO2_MAX_FILTER_ONEOVERQ 1.5f // Maximum XAUDIO2_FILTER_PARAMETERS.OneOverQ +#define XAUDIO2_MAX_FILTER_FREQUENCY 1.0f // Maximum XAUDIO2_FILTER_PARAMETERS.Frequency +#define XAUDIO2_MAX_LOOP_COUNT 254 // Maximum non-infinite XAUDIO2_BUFFER.LoopCount +#define XAUDIO2_MAX_INSTANCES 8 // Maximum simultaneous XAudio2 objects on Xbox 360 + +// For XMA voices on Xbox 360 there is an additional restriction on the MaxFrequencyRatio +// argument and the voice's sample rate: the product of these numbers cannot exceed 600000 +// for one-channel voices or 300000 for voices with more than one channel. +#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MONO 600000 +#define XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL 300000 + +// Numeric values with special meanings +#define XAUDIO2_COMMIT_NOW 0 // Used as an OperationSet argument +#define XAUDIO2_COMMIT_ALL 0 // Used in IXAudio2::CommitChanges +#define XAUDIO2_INVALID_OPSET (UINT32)(-1) // Not allowed for OperationSet arguments +#define XAUDIO2_NO_LOOP_REGION 0 // Used in XAUDIO2_BUFFER.LoopCount +#define XAUDIO2_LOOP_INFINITE 255 // Used in XAUDIO2_BUFFER.LoopCount +#define XAUDIO2_DEFAULT_CHANNELS 0 // Used in CreateMasteringVoice +#define XAUDIO2_DEFAULT_SAMPLERATE 0 // Used in CreateMasteringVoice + +// Flags +#define XAUDIO2_DEBUG_ENGINE 0x0001 // Used in XAudio2Create +#define XAUDIO2_VOICE_NOPITCH 0x0002 // Used in IXAudio2::CreateSourceVoice +#define XAUDIO2_VOICE_NOSRC 0x0004 // Used in IXAudio2::CreateSourceVoice +#define XAUDIO2_VOICE_USEFILTER 0x0008 // Used in IXAudio2::CreateSource/SubmixVoice +#define XAUDIO2_PLAY_TAILS 0x0020 // Used in IXAudio2SourceVoice::Stop +#define XAUDIO2_END_OF_STREAM 0x0040 // Used in XAUDIO2_BUFFER.Flags +#define XAUDIO2_SEND_USEFILTER 0x0080 // Used in XAUDIO2_SEND_DESCRIPTOR.Flags +#define XAUDIO2_VOICE_NOSAMPLESPLAYED 0x0100 // Used in IXAudio2SourceVoice::GetState +#define XAUDIO2_STOP_ENGINE_WHEN_IDLE 0x2000 // Used in XAudio2Create to force the engine to Stop when no source voices are Started, and Start when a voice is Started +#define XAUDIO2_1024_QUANTUM 0x8000 // Used in XAudio2Create to specify nondefault processing quantum of 21.33 ms (1024 samples at 48KHz) +#define XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT 0x10000 // Used in CreateMasteringVoice to create a virtual audio client + +// Default parameters for the built-in filter +#define XAUDIO2_DEFAULT_FILTER_TYPE LowPassFilter +#define XAUDIO2_DEFAULT_FILTER_FREQUENCY XAUDIO2_MAX_FILTER_FREQUENCY +#define XAUDIO2_DEFAULT_FILTER_ONEOVERQ 1.0f + +// Internal XAudio2 constants +// The audio frame quantum can be calculated by reducing the fraction: +// SamplesPerAudioFrame / SamplesPerSecond +#define XAUDIO2_QUANTUM_NUMERATOR 1 // On Windows, XAudio2 processes audio +#define XAUDIO2_QUANTUM_DENOMINATOR 100 // in 10ms chunks (= 1/100 seconds) +#define XAUDIO2_QUANTUM_MS (1000.0f * XAUDIO2_QUANTUM_NUMERATOR / XAUDIO2_QUANTUM_DENOMINATOR) + +// XAudio2 error codes +#define FACILITY_XAUDIO2 0x896 +#define XAUDIO2_E_INVALID_CALL 0x88960001 // An API call or one of its arguments was illegal +#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 // The XMA hardware suffered an unrecoverable error +#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 // XAudio2 failed to initialize an XAPO effect +#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 // An audio device became unusable (unplugged, etc) + +/************************************************************************** + * + * Forward declarations for the XAudio2 interfaces. + * + **************************************************************************/ + +#ifdef __cplusplus +#define FWD_DECLARE(x) interface x +#else +#define FWD_DECLARE(x) typedef interface x x +#endif + +FWD_DECLARE(IXAudio2); +FWD_DECLARE(IXAudio2Voice); +FWD_DECLARE(IXAudio2SourceVoice); +FWD_DECLARE(IXAudio2SubmixVoice); +FWD_DECLARE(IXAudio2MasteringVoice); +FWD_DECLARE(IXAudio2EngineCallback); +FWD_DECLARE(IXAudio2VoiceCallback); + + +/************************************************************************** + * + * XAudio2 structures and enumerations. + * + **************************************************************************/ + + // Used in XAudio2Create, specifies which CPU(s) to use. +typedef UINT32 XAUDIO2_PROCESSOR; +#define Processor1 0x00000001 +#define Processor2 0x00000002 +#define Processor3 0x00000004 +#define Processor4 0x00000008 +#define Processor5 0x00000010 +#define Processor6 0x00000020 +#define Processor7 0x00000040 +#define Processor8 0x00000080 +#define Processor9 0x00000100 +#define Processor10 0x00000200 +#define Processor11 0x00000400 +#define Processor12 0x00000800 +#define Processor13 0x00001000 +#define Processor14 0x00002000 +#define Processor15 0x00004000 +#define Processor16 0x00008000 +#define Processor17 0x00010000 +#define Processor18 0x00020000 +#define Processor19 0x00040000 +#define Processor20 0x00080000 +#define Processor21 0x00100000 +#define Processor22 0x00200000 +#define Processor23 0x00400000 +#define Processor24 0x00800000 +#define Processor25 0x01000000 +#define Processor26 0x02000000 +#define Processor27 0x04000000 +#define Processor28 0x08000000 +#define Processor29 0x10000000 +#define Processor30 0x20000000 +#define Processor31 0x40000000 +#define Processor32 0x80000000 +#define XAUDIO2_ANY_PROCESSOR 0xffffffff +#define XAUDIO2_DEFAULT_PROCESSOR Processor1 + +// Returned by IXAudio2Voice::GetVoiceDetails +typedef struct XAUDIO2_VOICE_DETAILS +{ + UINT32 CreationFlags; // Flags the voice was created with. + UINT32 ActiveFlags; // Flags currently active. + UINT32 InputChannels; // Channels in the voice's input audio. + UINT32 InputSampleRate; // Sample rate of the voice's input audio. +} XAUDIO2_VOICE_DETAILS; + +// Used in XAUDIO2_VOICE_SENDS below +typedef struct XAUDIO2_SEND_DESCRIPTOR +{ + UINT32 Flags; // Either 0 or XAUDIO2_SEND_USEFILTER. + IXAudio2Voice* pOutputVoice; // This send's destination voice. +} XAUDIO2_SEND_DESCRIPTOR; + +// Used in the voice creation functions and in IXAudio2Voice::SetOutputVoices +typedef struct XAUDIO2_VOICE_SENDS +{ + UINT32 SendCount; // Number of sends from this voice. + XAUDIO2_SEND_DESCRIPTOR* pSends; // Array of SendCount send descriptors. +} XAUDIO2_VOICE_SENDS; + +// Used in XAUDIO2_EFFECT_CHAIN below +typedef struct XAUDIO2_EFFECT_DESCRIPTOR +{ + IUnknown* pEffect; // Pointer to the effect object's IUnknown interface. + BOOL InitialState; // TRUE if the effect should begin in the enabled state. + UINT32 OutputChannels; // How many output channels the effect should produce. +} XAUDIO2_EFFECT_DESCRIPTOR; + +// Used in the voice creation functions and in IXAudio2Voice::SetEffectChain +typedef struct XAUDIO2_EFFECT_CHAIN +{ + UINT32 EffectCount; // Number of effects in this voice's effect chain. + XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; // Array of effect descriptors. +} XAUDIO2_EFFECT_CHAIN; + +// Used in XAUDIO2_FILTER_PARAMETERS below +typedef enum XAUDIO2_FILTER_TYPE +{ + LowPassFilter, // Attenuates frequencies above the cutoff frequency (state-variable filter). + BandPassFilter, // Attenuates frequencies outside a given range (state-variable filter). + HighPassFilter, // Attenuates frequencies below the cutoff frequency (state-variable filter). + NotchFilter, // Attenuates frequencies inside a given range (state-variable filter). + LowPassOnePoleFilter, // Attenuates frequencies above the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) + HighPassOnePoleFilter // Attenuates frequencies below the cutoff frequency (one-pole filter, XAUDIO2_FILTER_PARAMETERS.OneOverQ has no effect) +} XAUDIO2_FILTER_TYPE; + +// Used in IXAudio2Voice::Set/GetFilterParameters and Set/GetOutputFilterParameters +typedef struct XAUDIO2_FILTER_PARAMETERS +{ + XAUDIO2_FILTER_TYPE Type; // Filter type. + float Frequency; // Filter coefficient. + // must be >= 0 and <= XAUDIO2_MAX_FILTER_FREQUENCY + // See XAudio2CutoffFrequencyToRadians() for state-variable filter types and + // XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. + float OneOverQ; // Reciprocal of the filter's quality factor Q; + // must be > 0 and <= XAUDIO2_MAX_FILTER_ONEOVERQ. + // Has no effect for one-pole filters. +} XAUDIO2_FILTER_PARAMETERS; + +// Used in IXAudio2SourceVoice::SubmitSourceBuffer +typedef struct XAUDIO2_BUFFER +{ + UINT32 Flags; // Either 0 or XAUDIO2_END_OF_STREAM. + UINT32 AudioBytes; // Size of the audio data buffer in bytes. + const BYTE* pAudioData; // Pointer to the audio data buffer. + UINT32 PlayBegin; // First sample in this buffer to be played. + UINT32 PlayLength; // Length of the region to be played in samples, + // or 0 to play the whole buffer. + UINT32 LoopBegin; // First sample of the region to be looped. + UINT32 LoopLength; // Length of the desired loop region in samples, + // or 0 to loop the entire buffer. + UINT32 LoopCount; // Number of times to repeat the loop region, + // or XAUDIO2_LOOP_INFINITE to loop forever. + void* pContext; // Context value to be passed back in callbacks. +} XAUDIO2_BUFFER; + +// Used in IXAudio2SourceVoice::SubmitSourceBuffer when submitting XWMA data. +// NOTE: If an XWMA sound is submitted in more than one buffer, each buffer's +// pDecodedPacketCumulativeBytes[PacketCount-1] value must be subtracted from +// all the entries in the next buffer's pDecodedPacketCumulativeBytes array. +// And whether a sound is submitted in more than one buffer or not, the final +// buffer of the sound should use the XAUDIO2_END_OF_STREAM flag, or else the +// client must call IXAudio2SourceVoice::Discontinuity after submitting it. +typedef struct XAUDIO2_BUFFER_WMA +{ + const UINT32* pDecodedPacketCumulativeBytes; // Decoded packet's cumulative size array. + // Each element is the number of bytes accumulated + // when the corresponding XWMA packet is decoded in + // order. The array must have PacketCount elements. + UINT32 PacketCount; // Number of XWMA packets submitted. Must be >= 1 and + // divide evenly into XAUDIO2_BUFFER.AudioBytes. +} XAUDIO2_BUFFER_WMA; + +// Returned by IXAudio2SourceVoice::GetState +typedef struct XAUDIO2_VOICE_STATE +{ + void* pCurrentBufferContext; // The pContext value provided in the XAUDIO2_BUFFER + // that is currently being processed, or NULL if + // there are no buffers in the queue. + UINT32 BuffersQueued; // Number of buffers currently queued on the voice + // (including the one that is being processed). + UINT64 SamplesPlayed; // Total number of samples produced by the voice since + // it began processing the current audio stream. + // If XAUDIO2_VOICE_NOSAMPLESPLAYED is specified + // in the call to IXAudio2SourceVoice::GetState, + // this member will not be calculated, saving CPU. +} XAUDIO2_VOICE_STATE; + +// Returned by IXAudio2::GetPerformanceData +typedef struct XAUDIO2_PERFORMANCE_DATA +{ + // CPU usage information + UINT64 AudioCyclesSinceLastQuery; // CPU cycles spent on audio processing since the + // last call to StartEngine or GetPerformanceData. + UINT64 TotalCyclesSinceLastQuery; // Total CPU cycles elapsed since the last call + // (only counts the CPU XAudio2 is running on). + UINT32 MinimumCyclesPerQuantum; // Fewest CPU cycles spent processing any one + // audio quantum since the last call. + UINT32 MaximumCyclesPerQuantum; // Most CPU cycles spent processing any one + // audio quantum since the last call. + + // Memory usage information + UINT32 MemoryUsageInBytes; // Total heap space currently in use. + + // Audio latency and glitching information + UINT32 CurrentLatencyInSamples; // Minimum delay from when a sample is read from a + // source buffer to when it reaches the speakers. + UINT32 GlitchesSinceEngineStarted; // Audio dropouts since the engine was started. + + // Data about XAudio2's current workload + UINT32 ActiveSourceVoiceCount; // Source voices currently playing. + UINT32 TotalSourceVoiceCount; // Source voices currently existing. + UINT32 ActiveSubmixVoiceCount; // Submix voices currently playing/existing. + + UINT32 ActiveResamplerCount; // Resample xAPOs currently active. + UINT32 ActiveMatrixMixCount; // MatrixMix xAPOs currently active. + + // Usage of the hardware XMA decoder (Xbox 360 only) + UINT32 ActiveXmaSourceVoices; // Number of source voices decoding XMA data. + UINT32 ActiveXmaStreams; // A voice can use more than one XMA stream. +} XAUDIO2_PERFORMANCE_DATA; + +// Used in IXAudio2::SetDebugConfiguration +typedef struct XAUDIO2_DEBUG_CONFIGURATION +{ + UINT32 TraceMask; // Bitmap of enabled debug message types. + UINT32 BreakMask; // Message types that will break into the debugger. + BOOL LogThreadID; // Whether to log the thread ID with each message. + BOOL LogFileline; // Whether to log the source file and line number. + BOOL LogFunctionName; // Whether to log the function name. + BOOL LogTiming; // Whether to log message timestamps. +} XAUDIO2_DEBUG_CONFIGURATION; + +// Values for the TraceMask and BreakMask bitmaps. Only ERRORS and WARNINGS +// are valid in BreakMask. WARNINGS implies ERRORS, DETAIL implies INFO, and +// FUNC_CALLS implies API_CALLS. By default, TraceMask is ERRORS and WARNINGS +// and all the other settings are zero. +#define XAUDIO2_LOG_ERRORS 0x0001 // For handled errors with serious effects. +#define XAUDIO2_LOG_WARNINGS 0x0002 // For handled errors that may be recoverable. +#define XAUDIO2_LOG_INFO 0x0004 // Informational chit-chat (e.g. state changes). +#define XAUDIO2_LOG_DETAIL 0x0008 // More detailed chit-chat. +#define XAUDIO2_LOG_API_CALLS 0x0010 // Public API function entries and exits. +#define XAUDIO2_LOG_FUNC_CALLS 0x0020 // Internal function entries and exits. +#define XAUDIO2_LOG_TIMING 0x0040 // Delays detected and other timing data. +#define XAUDIO2_LOG_LOCKS 0x0080 // Usage of critical sections and mutexes. +#define XAUDIO2_LOG_MEMORY 0x0100 // Memory heap usage information. +#define XAUDIO2_LOG_STREAMING 0x1000 // Audio streaming information. + + +/************************************************************************** + * + * IXAudio2: Top-level XAudio2 COM interface. + * + **************************************************************************/ + + // Use default arguments if compiling as C++ +#ifdef __cplusplus +#define X2DEFAULT(x) =x +#else +#define X2DEFAULT(x) +#endif + +#undef INTERFACE +#define INTERFACE IXAudio2 +DECLARE_INTERFACE_(IXAudio2, IUnknown) +{ + // NAME: IXAudio2::QueryInterface + // DESCRIPTION: Queries for a given COM interface on the XAudio2 object. + // Only IID_IUnknown and IID_IXAudio2 are supported. + // + // ARGUMENTS: + // riid - IID of the interface to be obtained. + // ppvInterface - Returns a pointer to the requested interface. + // + STDMETHOD(QueryInterface) (THIS_ REFIID riid, _Outptr_ void** ppvInterface) PURE; + + // NAME: IXAudio2::AddRef + // DESCRIPTION: Adds a reference to the XAudio2 object. + // + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + + // NAME: IXAudio2::Release + // DESCRIPTION: Releases a reference to the XAudio2 object. + // + STDMETHOD_(ULONG, Release) (THIS) PURE; + + // NAME: IXAudio2::RegisterForCallbacks + // DESCRIPTION: Adds a new client to receive XAudio2's engine callbacks. + // + // ARGUMENTS: + // pCallback - Callback interface to be called during each processing pass. + // + STDMETHOD(RegisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE; + + // NAME: IXAudio2::UnregisterForCallbacks + // DESCRIPTION: Removes an existing receiver of XAudio2 engine callbacks. + // + // ARGUMENTS: + // pCallback - Previously registered callback interface to be removed. + // + STDMETHOD_(void, UnregisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE; + + // NAME: IXAudio2::CreateSourceVoice + // DESCRIPTION: Creates and configures a source voice. + // + // ARGUMENTS: + // ppSourceVoice - Returns the new object's IXAudio2SourceVoice interface. + // pSourceFormat - Format of the audio that will be fed to the voice. + // Flags - XAUDIO2_VOICE flags specifying the source voice's behavior. + // MaxFrequencyRatio - Maximum SetFrequencyRatio argument to be allowed. + // pCallback - Optional pointer to a client-provided callback interface. + // pSendList - Optional list of voices this voice should send audio to. + // pEffectChain - Optional list of effects to apply to the audio data. + // + STDMETHOD(CreateSourceVoice) (THIS_ _Outptr_ IXAudio2SourceVoice** ppSourceVoice, + _In_ const WAVEFORMATEX* pSourceFormat, + UINT32 Flags X2DEFAULT(0), + float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO), + _In_opt_ IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + + // NAME: IXAudio2::CreateSubmixVoice + // DESCRIPTION: Creates and configures a submix voice. + // + // ARGUMENTS: + // ppSubmixVoice - Returns the new object's IXAudio2SubmixVoice interface. + // InputChannels - Number of channels in this voice's input audio data. + // InputSampleRate - Sample rate of this voice's input audio data. + // Flags - XAUDIO2_VOICE flags specifying the submix voice's behavior. + // ProcessingStage - Arbitrary number that determines the processing order. + // pSendList - Optional list of voices this voice should send audio to. + // pEffectChain - Optional list of effects to apply to the audio data. + // + STDMETHOD(CreateSubmixVoice) (THIS_ _Outptr_ IXAudio2SubmixVoice** ppSubmixVoice, + UINT32 InputChannels, UINT32 InputSampleRate, + UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0), + _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + + + // NAME: IXAudio2::CreateMasteringVoice + // DESCRIPTION: Creates and configures a mastering voice. + // + // ARGUMENTS: + // ppMasteringVoice - Returns the new object's IXAudio2MasteringVoice interface. + // InputChannels - Number of channels in this voice's input audio data. + // InputSampleRate - Sample rate of this voice's input audio data. + // Flags - XAUDIO2_VOICE flags specifying the mastering voice's behavior. + // szDeviceId - Identifier of the device to receive the output audio. + // pEffectChain - Optional list of effects to apply to the audio data. + // StreamCategory - The audio stream category to use for this mastering voice + // + STDMETHOD(CreateMasteringVoice) (THIS_ _Outptr_ IXAudio2MasteringVoice** ppMasteringVoice, + UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS), + UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE), + UINT32 Flags X2DEFAULT(0), _In_opt_z_ LPCWSTR szDeviceId X2DEFAULT(NULL), + _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL), + _In_ AUDIO_STREAM_CATEGORY StreamCategory X2DEFAULT(AudioCategory_GameEffects)) PURE; + + // NAME: IXAudio2::StartEngine + // DESCRIPTION: Creates and starts the audio processing thread. + // + STDMETHOD(StartEngine) (THIS) PURE; + + // NAME: IXAudio2::StopEngine + // DESCRIPTION: Stops and destroys the audio processing thread. + // + STDMETHOD_(void, StopEngine) (THIS) PURE; + + // NAME: IXAudio2::CommitChanges + // DESCRIPTION: Atomically applies a set of operations previously tagged + // with a given identifier. + // + // ARGUMENTS: + // OperationSet - Identifier of the set of operations to be applied. + // + STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE; + + // NAME: IXAudio2::GetPerformanceData + // DESCRIPTION: Returns current resource usage details: memory, CPU, etc. + // + // ARGUMENTS: + // pPerfData - Returns the performance data structure. + // + STDMETHOD_(void, GetPerformanceData) (THIS_ _Out_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE; + + // NAME: IXAudio2::SetDebugConfiguration + // DESCRIPTION: Configures XAudio2's debug output (in debug builds only). + // + // ARGUMENTS: + // pDebugConfiguration - Structure describing the debug output behavior. + // pReserved - Optional parameter; must be NULL. + // + STDMETHOD_(void, SetDebugConfiguration) (THIS_ _In_opt_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration, + _Reserved_ void* pReserved X2DEFAULT(NULL)) PURE; +}; + + +/************************************************************************** + * + * IXAudio2Voice: Base voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2Voice +DECLARE_INTERFACE(IXAudio2Voice) +{ + // These methods are declared in a macro so that the same declarations + // can be used in the derived voice types (IXAudio2SourceVoice, etc). + +#define Declare_IXAudio2Voice_Methods() \ + \ + /* NAME: IXAudio2Voice::GetVoiceDetails + // DESCRIPTION: Returns the basic characteristics of this voice. + // + // ARGUMENTS: + // pVoiceDetails - Returns the voice's details. + */\ + STDMETHOD_(void, GetVoiceDetails) (THIS_ _Out_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ + \ + /* NAME: IXAudio2Voice::SetOutputVoices + // DESCRIPTION: Replaces the set of submix/mastering voices that receive + // this voice's output. + // + // ARGUMENTS: + // pSendList - Optional list of voices this voice should send audio to. + */\ + STDMETHOD(SetOutputVoices) (THIS_ _In_opt_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \ + \ + /* NAME: IXAudio2Voice::SetEffectChain + // DESCRIPTION: Replaces this voice's current effect chain with a new one. + // + // ARGUMENTS: + // pEffectChain - Structure describing the new effect chain to be used. + */\ + STDMETHOD(SetEffectChain) (THIS_ _In_opt_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \ + \ + /* NAME: IXAudio2Voice::EnableEffect + // DESCRIPTION: Enables an effect in this voice's effect chain. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::DisableEffect + // DESCRIPTION: Disables an effect in this voice's effect chain. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetEffectState + // DESCRIPTION: Returns the running state of an effect. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // pEnabled - Returns the enabled/disabled state of the given effect. + */\ + STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, _Out_ BOOL* pEnabled) PURE; \ + \ + /* NAME: IXAudio2Voice::SetEffectParameters + // DESCRIPTION: Sets effect-specific parameters. + // + // REMARKS: Unlike IXAPOParameters::SetParameters, this method may + // be called from any thread. XAudio2 implements + // appropriate synchronization to copy the parameters to the + // realtime audio processing thread. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // pParameters - Pointer to an effect-specific parameters block. + // ParametersByteSize - Size of the pParameters array in bytes. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \ + _In_reads_bytes_(ParametersByteSize) const void* pParameters, \ + UINT32 ParametersByteSize, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetEffectParameters + // DESCRIPTION: Obtains the current effect-specific parameters. + // + // ARGUMENTS: + // EffectIndex - Index of an effect within this voice's effect chain. + // pParameters - Returns the current values of the effect-specific parameters. + // ParametersByteSize - Size of the pParameters array in bytes. + */\ + STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, \ + _Out_writes_bytes_(ParametersByteSize) void* pParameters, \ + UINT32 ParametersByteSize) PURE; \ + \ + /* NAME: IXAudio2Voice::SetFilterParameters + // DESCRIPTION: Sets this voice's filter parameters. + // + // ARGUMENTS: + // pParameters - Pointer to the filter's parameter structure. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetFilterParameters) (THIS_ _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetFilterParameters + // DESCRIPTION: Returns this voice's current filter parameters. + // + // ARGUMENTS: + // pParameters - Returns the filter parameters. + */\ + STDMETHOD_(void, GetFilterParameters) (THIS_ _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ + \ + /* NAME: IXAudio2Voice::SetOutputFilterParameters + // DESCRIPTION: Sets the filter parameters on one of this voice's sends. + // + // ARGUMENTS: + // pDestinationVoice - Destination voice of the send whose filter parameters will be set. + // pParameters - Pointer to the filter's parameter structure. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + _In_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetOutputFilterParameters + // DESCRIPTION: Returns the filter parameters from one of this voice's sends. + // + // ARGUMENTS: + // pDestinationVoice - Destination voice of the send whose filter parameters will be read. + // pParameters - Returns the filter parameters. + */\ + STDMETHOD_(void, GetOutputFilterParameters) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + _Out_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ + \ + /* NAME: IXAudio2Voice::SetVolume + // DESCRIPTION: Sets this voice's overall volume level. + // + // ARGUMENTS: + // Volume - New overall volume level to be used, as an amplitude factor. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetVolume) (THIS_ float Volume, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetVolume + // DESCRIPTION: Obtains this voice's current overall volume level. + // + // ARGUMENTS: + // pVolume: Returns the voice's current overall volume level. + */\ + STDMETHOD_(void, GetVolume) (THIS_ _Out_ float* pVolume) PURE; \ + \ + /* NAME: IXAudio2Voice::SetChannelVolumes + // DESCRIPTION: Sets this voice's per-channel volume levels. + // + // ARGUMENTS: + // Channels - Used to confirm the voice's channel count. + // pVolumes - Array of per-channel volume levels to be used. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, _In_reads_(Channels) const float* pVolumes, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetChannelVolumes + // DESCRIPTION: Returns this voice's current per-channel volume levels. + // + // ARGUMENTS: + // Channels - Used to confirm the voice's channel count. + // pVolumes - Returns an array of the current per-channel volume levels. + */\ + STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, _Out_writes_(Channels) float* pVolumes) PURE; \ + \ + /* NAME: IXAudio2Voice::SetOutputMatrix + // DESCRIPTION: Sets the volume levels used to mix from each channel of this + // voice's output audio to each channel of a given destination + // voice's input audio. + // + // ARGUMENTS: + // pDestinationVoice - The destination voice whose mix matrix to change. + // SourceChannels - Used to confirm this voice's output channel count + // (the number of channels produced by the last effect in the chain). + // DestinationChannels - Confirms the destination voice's input channels. + // pLevelMatrix - Array of [SourceChannels * DestinationChannels] send + // levels. The level used to send from source channel S to destination + // channel D should be in pLevelMatrix[S + SourceChannels * D]. + // OperationSet - Used to identify this call as part of a deferred batch. + */\ + STDMETHOD(SetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + _In_reads_(SourceChannels * DestinationChannels) const float* pLevelMatrix, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + \ + /* NAME: IXAudio2Voice::GetOutputMatrix + // DESCRIPTION: Obtains the volume levels used to send each channel of this + // voice's output audio to each channel of a given destination + // voice's input audio. + // + // ARGUMENTS: + // pDestinationVoice - The destination voice whose mix matrix to obtain. + // SourceChannels - Used to confirm this voice's output channel count + // (the number of channels produced by the last effect in the chain). + // DestinationChannels - Confirms the destination voice's input channels. + // pLevelMatrix - Array of send levels, as above. + */\ + STDMETHOD_(void, GetOutputMatrix) (THIS_ _In_opt_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + _Out_writes_(SourceChannels * DestinationChannels) float* pLevelMatrix) PURE; \ + \ + /* NAME: IXAudio2Voice::DestroyVoice + // DESCRIPTION: Destroys this voice, stopping it if necessary and removing + // it from the XAudio2 graph. + */\ + STDMETHOD_(void, DestroyVoice) (THIS) PURE + + Declare_IXAudio2Voice_Methods(); +}; + + +/************************************************************************** + * + * IXAudio2SourceVoice: Source voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2SourceVoice +DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) +{ + // Methods from IXAudio2Voice base interface + Declare_IXAudio2Voice_Methods(); + + // NAME: IXAudio2SourceVoice::Start + // DESCRIPTION: Makes this voice start consuming and processing audio. + // + // ARGUMENTS: + // Flags - Flags controlling how the voice should be started. + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(Start) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::Stop + // DESCRIPTION: Makes this voice stop consuming audio. + // + // ARGUMENTS: + // Flags - Flags controlling how the voice should be stopped. + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(Stop) (THIS_ UINT32 Flags X2DEFAULT(0), UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::SubmitSourceBuffer + // DESCRIPTION: Adds a new audio buffer to this voice's input queue. + // + // ARGUMENTS: + // pBuffer - Pointer to the buffer structure to be queued. + // pBufferWMA - Additional structure used only when submitting XWMA data. + // + STDMETHOD(SubmitSourceBuffer) (THIS_ _In_ const XAUDIO2_BUFFER* pBuffer, _In_opt_ const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE; + + // NAME: IXAudio2SourceVoice::FlushSourceBuffers + // DESCRIPTION: Removes all pending audio buffers from this voice's queue. + // + STDMETHOD(FlushSourceBuffers) (THIS) PURE; + + // NAME: IXAudio2SourceVoice::Discontinuity + // DESCRIPTION: Notifies the voice of an intentional break in the stream of + // audio buffers (e.g. the end of a sound), to prevent XAudio2 + // from interpreting an empty buffer queue as a glitch. + // + STDMETHOD(Discontinuity) (THIS) PURE; + + // NAME: IXAudio2SourceVoice::ExitLoop + // DESCRIPTION: Breaks out of the current loop when its end is reached. + // + // ARGUMENTS: + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::GetState + // DESCRIPTION: Returns the number of buffers currently queued on this voice, + // the pContext value associated with the currently processing + // buffer (if any), and other voice state information. + // + // ARGUMENTS: + // pVoiceState - Returns the state information. + // Flags - Flags controlling what voice state is returned. + // + STDMETHOD_(void, GetState) (THIS_ _Out_ XAUDIO2_VOICE_STATE* pVoiceState, UINT32 Flags X2DEFAULT(0)) PURE; + + // NAME: IXAudio2SourceVoice::SetFrequencyRatio + // DESCRIPTION: Sets this voice's frequency adjustment, i.e. its pitch. + // + // ARGUMENTS: + // Ratio - Frequency change, expressed as source frequency / target frequency. + // OperationSet - Used to identify this call as part of a deferred batch. + // + STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio, + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + + // NAME: IXAudio2SourceVoice::GetFrequencyRatio + // DESCRIPTION: Returns this voice's current frequency adjustment ratio. + // + // ARGUMENTS: + // pRatio - Returns the frequency adjustment. + // + STDMETHOD_(void, GetFrequencyRatio) (THIS_ _Out_ float* pRatio) PURE; + + // NAME: IXAudio2SourceVoice::SetSourceSampleRate + // DESCRIPTION: Reconfigures this voice to treat its source data as being + // at a different sample rate than the original one specified + // in CreateSourceVoice's pSourceFormat argument. + // + // ARGUMENTS: + // UINT32 - The intended sample rate of further submitted source data. + // + STDMETHOD(SetSourceSampleRate) (THIS_ UINT32 NewSourceSampleRate) PURE; +}; + + +/************************************************************************** + * + * IXAudio2SubmixVoice: Submixing voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2SubmixVoice +DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice) +{ + // Methods from IXAudio2Voice base interface + Declare_IXAudio2Voice_Methods(); + + // There are currently no methods specific to submix voices. +}; + + +/************************************************************************** + * + * IXAudio2MasteringVoice: Mastering voice management interface. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2MasteringVoice +DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) +{ + // Methods from IXAudio2Voice base interface + Declare_IXAudio2Voice_Methods(); + + // NAME: IXAudio2MasteringVoice::GetChannelMask + // DESCRIPTION: Returns the channel mask for this voice + // + // ARGUMENTS: + // pChannelMask - returns the channel mask for this voice. This corresponds + // to the dwChannelMask member of WAVEFORMATEXTENSIBLE. + // + STDMETHOD(GetChannelMask) (THIS_ _Out_ DWORD* pChannelmask) PURE; +}; + + +/************************************************************************** + * + * IXAudio2EngineCallback: Client notification interface for engine events. + * + * REMARKS: Contains methods to notify the client when certain events happen + * in the XAudio2 engine. This interface should be implemented by + * the client. XAudio2 will call these methods via the interface + * pointer provided by the client when it calls + * IXAudio2::RegisterForCallbacks. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2EngineCallback +DECLARE_INTERFACE(IXAudio2EngineCallback) +{ + // Called by XAudio2 just before an audio processing pass begins. + STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE; + + // Called just after an audio processing pass ends. + STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE; + + // Called in the event of a critical system error which requires XAudio2 + // to be closed down and restarted. The error code is given in Error. + STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE; +}; + + +/************************************************************************** + * + * IXAudio2VoiceCallback: Client notification interface for voice events. + * + * REMARKS: Contains methods to notify the client when certain events happen + * in an XAudio2 voice. This interface should be implemented by the + * client. XAudio2 will call these methods via an interface pointer + * provided by the client in the IXAudio2::CreateSourceVoice call. + * + **************************************************************************/ + +#undef INTERFACE +#define INTERFACE IXAudio2VoiceCallback +DECLARE_INTERFACE(IXAudio2VoiceCallback) +{ + // Called just before this voice's processing pass begins. + STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE; + + // Called just after this voice's processing pass ends. + STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE; + + // Called when this voice has just finished playing a buffer stream + // (as marked with the XAUDIO2_END_OF_STREAM flag on the last buffer). + STDMETHOD_(void, OnStreamEnd) (THIS) PURE; + + // Called when this voice is about to start processing a new buffer. + STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE; + + // Called when this voice has just finished processing a buffer. + // The buffer can now be reused or destroyed. + STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE; + + // Called when this voice has just reached the end position of a loop. + STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE; + + // Called in the event of a critical error during voice processing, + // such as a failing xAPO or an error from the hardware XMA decoder. + // The voice may have to be destroyed and re-created to recover from + // the error. The callback arguments report which buffer was being + // processed when the error occurred, and its HRESULT code. + STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE; +}; + + +/************************************************************************** + * + * Macros to make it easier to use the XAudio2 COM interfaces in C code. + * + **************************************************************************/ + +#ifndef __cplusplus + + // IXAudio2 +#define IXAudio2_QueryInterface(This,riid,ppvInterface) ((This)->lpVtbl->QueryInterface(This,riid,ppvInterface)) +#define IXAudio2_AddRef(This) ((This)->lpVtbl->AddRef(This)) +#define IXAudio2_Release(This) ((This)->lpVtbl->Release(This)) +#define IXAudio2_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) ((This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)) +#define IXAudio2_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) ((This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain)) +#define IXAudio2_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory) ((This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory)) +#define IXAudio2_StartEngine(This) ((This)->lpVtbl->StartEngine(This)) +#define IXAudio2_StopEngine(This) ((This)->lpVtbl->StopEngine(This)) +#define IXAudio2_CommitChanges(This,OperationSet) ((This)->lpVtbl->CommitChanges(This,OperationSet)) +#define IXAudio2_GetPerformanceData(This,pPerfData) ((This)->lpVtbl->GetPerformanceData(This,pPerfData)) +#define IXAudio2_SetDebugConfiguration(This,pDebugConfiguration,pReserved) ((This)->lpVtbl->SetDebugConfiguration(This,pDebugConfiguration,pReserved)) + +// IXAudio2Voice +#define IXAudio2Voice_GetVoiceDetails(This,pVoiceDetails) ((This)->lpVtbl->GetVoiceDetails(This,pVoiceDetails)) +#define IXAudio2Voice_SetOutputVoices(This,pSendList) ((This)->lpVtbl->SetOutputVoices(This,pSendList)) +#define IXAudio2Voice_SetEffectChain(This,pEffectChain) ((This)->lpVtbl->SetEffectChain(This,pEffectChain)) +#define IXAudio2Voice_EnableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->EnableEffect(This,EffectIndex,OperationSet)) +#define IXAudio2Voice_DisableEffect(This,EffectIndex,OperationSet) ((This)->lpVtbl->DisableEffect(This,EffectIndex,OperationSet)) +#define IXAudio2Voice_GetEffectState(This,EffectIndex,pEnabled) ((This)->lpVtbl->GetEffectState(This,EffectIndex,pEnabled)) +#define IXAudio2Voice_SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize, OperationSet) ((This)->lpVtbl->SetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize,OperationSet)) +#define IXAudio2Voice_GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize) ((This)->lpVtbl->GetEffectParameters(This,EffectIndex,pParameters,ParametersByteSize)) +#define IXAudio2Voice_SetFilterParameters(This,pParameters,OperationSet) ((This)->lpVtbl->SetFilterParameters(This,pParameters,OperationSet)) +#define IXAudio2Voice_GetFilterParameters(This,pParameters) ((This)->lpVtbl->GetFilterParameters(This,pParameters)) +#define IXAudio2Voice_SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet) ((This)->lpVtbl->SetOutputFilterParameters(This,pDestinationVoice,pParameters,OperationSet)) +#define IXAudio2Voice_GetOutputFilterParameters(This,pDestinationVoice,pParameters) ((This)->lpVtbl->GetOutputFilterParameters(This,pDestinationVoice,pParameters)) +#define IXAudio2Voice_SetVolume(This,Volume,OperationSet) ((This)->lpVtbl->SetVolume(This,Volume,OperationSet)) +#define IXAudio2Voice_GetVolume(This,pVolume) ((This)->lpVtbl->GetVolume(This,pVolume)) +#define IXAudio2Voice_SetChannelVolumes(This,Channels,pVolumes,OperationSet) ((This)->lpVtbl->SetChannelVolumes(This,Channels,pVolumes,OperationSet)) +#define IXAudio2Voice_GetChannelVolumes(This,Channels,pVolumes) ((This)->lpVtbl->GetChannelVolumes(This,Channels,pVolumes)) +#define IXAudio2Voice_SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet) ((This)->lpVtbl->SetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix,OperationSet)) +#define IXAudio2Voice_GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix) ((This)->lpVtbl->GetOutputMatrix(This,pDestinationVoice,SourceChannels,DestinationChannels,pLevelMatrix)) +#define IXAudio2Voice_DestroyVoice(This) ((This)->lpVtbl->DestroyVoice(This)) + +// IXAudio2SourceVoice +#define IXAudio2SourceVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails +#define IXAudio2SourceVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices +#define IXAudio2SourceVoice_SetEffectChain IXAudio2Voice_SetEffectChain +#define IXAudio2SourceVoice_EnableEffect IXAudio2Voice_EnableEffect +#define IXAudio2SourceVoice_DisableEffect IXAudio2Voice_DisableEffect +#define IXAudio2SourceVoice_GetEffectState IXAudio2Voice_GetEffectState +#define IXAudio2SourceVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters +#define IXAudio2SourceVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters +#define IXAudio2SourceVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters +#define IXAudio2SourceVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters +#define IXAudio2SourceVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters +#define IXAudio2SourceVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters +#define IXAudio2SourceVoice_SetVolume IXAudio2Voice_SetVolume +#define IXAudio2SourceVoice_GetVolume IXAudio2Voice_GetVolume +#define IXAudio2SourceVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes +#define IXAudio2SourceVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes +#define IXAudio2SourceVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix +#define IXAudio2SourceVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix +#define IXAudio2SourceVoice_DestroyVoice IXAudio2Voice_DestroyVoice +#define IXAudio2SourceVoice_Start(This,Flags,OperationSet) ((This)->lpVtbl->Start(This,Flags,OperationSet)) +#define IXAudio2SourceVoice_Stop(This,Flags,OperationSet) ((This)->lpVtbl->Stop(This,Flags,OperationSet)) +#define IXAudio2SourceVoice_SubmitSourceBuffer(This,pBuffer,pBufferWMA) ((This)->lpVtbl->SubmitSourceBuffer(This,pBuffer,pBufferWMA)) +#define IXAudio2SourceVoice_FlushSourceBuffers(This) ((This)->lpVtbl->FlushSourceBuffers(This)) +#define IXAudio2SourceVoice_Discontinuity(This) ((This)->lpVtbl->Discontinuity(This)) +#define IXAudio2SourceVoice_ExitLoop(This,OperationSet) ((This)->lpVtbl->ExitLoop(This,OperationSet)) +#define IXAudio2SourceVoice_GetState(This,pVoiceState,Flags) ((This)->lpVtbl->GetState(This,pVoiceState,Flags)) +#define IXAudio2SourceVoice_SetFrequencyRatio(This,Ratio,OperationSet) ((This)->lpVtbl->SetFrequencyRatio(This,Ratio,OperationSet)) +#define IXAudio2SourceVoice_GetFrequencyRatio(This,pRatio) ((This)->lpVtbl->GetFrequencyRatio(This,pRatio)) +#define IXAudio2SourceVoice_SetSourceSampleRate(This,NewSourceSampleRate) ((This)->lpVtbl->SetSourceSampleRate(This,NewSourceSampleRate)) + +// IXAudio2SubmixVoice +#define IXAudio2SubmixVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails +#define IXAudio2SubmixVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices +#define IXAudio2SubmixVoice_SetEffectChain IXAudio2Voice_SetEffectChain +#define IXAudio2SubmixVoice_EnableEffect IXAudio2Voice_EnableEffect +#define IXAudio2SubmixVoice_DisableEffect IXAudio2Voice_DisableEffect +#define IXAudio2SubmixVoice_GetEffectState IXAudio2Voice_GetEffectState +#define IXAudio2SubmixVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters +#define IXAudio2SubmixVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters +#define IXAudio2SubmixVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters +#define IXAudio2SubmixVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters +#define IXAudio2SubmixVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters +#define IXAudio2SubmixVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters +#define IXAudio2SubmixVoice_SetVolume IXAudio2Voice_SetVolume +#define IXAudio2SubmixVoice_GetVolume IXAudio2Voice_GetVolume +#define IXAudio2SubmixVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes +#define IXAudio2SubmixVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes +#define IXAudio2SubmixVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix +#define IXAudio2SubmixVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix +#define IXAudio2SubmixVoice_DestroyVoice IXAudio2Voice_DestroyVoice + +/* IXAudio2MasteringVoice */ +#define IXAudio2MasteringVoice_GetVoiceDetails IXAudio2Voice_GetVoiceDetails +#define IXAudio2MasteringVoice_SetOutputVoices IXAudio2Voice_SetOutputVoices +#define IXAudio2MasteringVoice_SetEffectChain IXAudio2Voice_SetEffectChain +#define IXAudio2MasteringVoice_EnableEffect IXAudio2Voice_EnableEffect +#define IXAudio2MasteringVoice_DisableEffect IXAudio2Voice_DisableEffect +#define IXAudio2MasteringVoice_GetEffectState IXAudio2Voice_GetEffectState +#define IXAudio2MasteringVoice_SetEffectParameters IXAudio2Voice_SetEffectParameters +#define IXAudio2MasteringVoice_GetEffectParameters IXAudio2Voice_GetEffectParameters +#define IXAudio2MasteringVoice_SetFilterParameters IXAudio2Voice_SetFilterParameters +#define IXAudio2MasteringVoice_GetFilterParameters IXAudio2Voice_GetFilterParameters +#define IXAudio2MasteringVoice_SetOutputFilterParameters IXAudio2Voice_SetOutputFilterParameters +#define IXAudio2MasteringVoice_GetOutputFilterParameters IXAudio2Voice_GetOutputFilterParameters +#define IXAudio2MasteringVoice_SetVolume IXAudio2Voice_SetVolume +#define IXAudio2MasteringVoice_GetVolume IXAudio2Voice_GetVolume +#define IXAudio2MasteringVoice_SetChannelVolumes IXAudio2Voice_SetChannelVolumes +#define IXAudio2MasteringVoice_GetChannelVolumes IXAudio2Voice_GetChannelVolumes +#define IXAudio2MasteringVoice_SetOutputMatrix IXAudio2Voice_SetOutputMatrix +#define IXAudio2MasteringVoice_GetOutputMatrix IXAudio2Voice_GetOutputMatrix +#define IXAudio2MasteringVoice_DestroyVoice IXAudio2Voice_DestroyVoice +#define IXAudio2MasteringVoice_GetChannelMask(This,pChannelMask) ((This)->lpVtbl->GetChannelMask(This,pChannelMask)) + +#endif /* #ifndef __cplusplus */ + + +/************************************************************************** + * + * Utility functions used to convert from pitch in semitones and volume + * in decibels to the frequency and amplitude ratio units used by XAudio2. + * These are only defined if the client #defines XAUDIO2_HELPER_FUNCTIONS + * prior to #including xaudio2.h. + * + **************************************************************************/ + +#ifdef XAUDIO2_HELPER_FUNCTIONS + +#define _USE_MATH_DEFINES /* Make math.h define M_PI */ +#include /* For powf, log10f, sinf and asinf */ + +/* Calculate the argument to SetVolume from a decibel value */ +static INLINE float XAudio2DecibelsToAmplitudeRatio(float Decibels) +{ + return powf(10.0f, Decibels / 20.0f); +} + +/* Recover a volume in decibels from an amplitude factor */ +static INLINE float XAudio2AmplitudeRatioToDecibels(float Volume) +{ + if (Volume == 0) + return -3.402823466e+38f; /* Smallest float value (-FLT_MAX) */ + return 20.0f * log10f(Volume); +} + +/* Calculate the argument to SetFrequencyRatio from a semitone value */ +static INLINE float XAudio2SemitonesToFrequencyRatio(float Semitones) +{ + /* FrequencyRatio = 2 ^ Octaves + * = 2 ^ (Semitones / 12) + */ + return powf(2.0f, Semitones / 12.0f); +} + +/* Recover a pitch in semitones from a frequency ratio */ +static INLINE float XAudio2FrequencyRatioToSemitones(float FrequencyRatio) +{ + /* Semitones = 12 * log2(FrequencyRatio) + * = 12 * log2(10) * log10(FrequencyRatio) + */ + return 39.86313713864835f * log10f(FrequencyRatio); +} + +/* Convert from filter cutoff frequencies expressed in Hertz to the radian + * frequency values used in XAUDIO2_FILTER_PARAMETERS.Frequency, state-variable + * filter types only. Use XAudio2CutoffFrequencyToOnePoleCoefficient() for one-pole filter types. + * Note that the highest CutoffFrequency supported is SampleRate/6. * Higher values of CutoffFrequency will return XAUDIO2_MAX_FILTER_FREQUENCY. - */ -__inline float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 SampleRate) -{ - if ((UINT32)(CutoffFrequency * 6.0f) >= SampleRate) - { - return XAUDIO2_MAX_FILTER_FREQUENCY; - } - return 2.0f * sinf((float)M_PI * CutoffFrequency / SampleRate); -} - -/* Convert from radian frequencies back to absolute frequencies in Hertz */ -__inline float XAudio2RadiansToCutoffFrequency(float Radians, float SampleRate) -{ - return SampleRate * asinf(Radians / 2.0f) / (float)M_PI; -} - -/* Convert from filter cutoff frequencies expressed in Hertz to the filter - * coefficients used with XAUDIO2_FILTER_PARAMETERS.Frequency, - * LowPassOnePoleFilter and HighPassOnePoleFilter filter types only. + */ +static INLINE float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 SampleRate) +{ + if ((UINT32)(CutoffFrequency * 6.0f) >= SampleRate) + return XAUDIO2_MAX_FILTER_FREQUENCY; + return 2.0f * sinf((float)M_PI * CutoffFrequency / SampleRate); +} + +/* Convert from radian frequencies back to absolute frequencies in Hertz */ +static INLINE float XAudio2RadiansToCutoffFrequency(float Radians, float SampleRate) +{ + return SampleRate * asinf(Radians / 2.0f) / (float)M_PI; +} + +/* Convert from filter cutoff frequencies expressed in Hertz to the filter + * coefficients used with XAUDIO2_FILTER_PARAMETERS.Frequency, + * LowPassOnePoleFilter and HighPassOnePoleFilter filter types only. * Use XAudio2CutoffFrequencyToRadians() for state-variable filter types. - */ -__inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, UINT32 SampleRate) -{ - if ((UINT32)CutoffFrequency >= SampleRate) - { - return XAUDIO2_MAX_FILTER_FREQUENCY; - } - return ( 1.0f - powf(1.0f - 2.0f * CutoffFrequency / SampleRate, 2.0f) ); -} - -#endif /* #ifdef XAUDIO2_HELPER_FUNCTIONS */ - - -/************************************************************************** - * - * XAudio2Create: Top-level function that creates an XAudio2 instance. - * - * ARGUMENTS: - * - * Flags - Flags specifying the XAudio2 object's behavior. - * - * XAudio2Processor - An XAUDIO2_PROCESSOR value that specifies the - * hardware threads (Xbox) or processors (Windows) that XAudio2 - * will use. Note that XAudio2 supports concurrent processing on - * multiple threads, using any combination of XAUDIO2_PROCESSOR - * flags. The values are platform-specific; platform-independent - * code can use XAUDIO2_DEFAULT_PROCESSOR to use the default on - * each platform. - * - **************************************************************************/ - -#ifdef __cplusplus__ - -#if (defined XAUDIO2_EXPORT) - /* We're building xaudio2.dll */ - #define XAUDIO2_STDAPI extern "C" __declspec(dllexport) HRESULT __stdcall -#else - /* We're an xaudio2 client */ - #define XAUDIO2_STDAPI extern "C" __declspec(dllimport) HRESULT __stdcall -#endif - -#else - -/* Modified for C support */ - -#if (defined XAUDIO2_EXPORT) - /* We're building xaudio2.dll */ - #define XAUDIO2_STDAPI __declspec(dllexport) HRESULT __stdcall -#else - /* We're an xaudio2 client */ - #define XAUDIO2_STDAPI __declspec(dllimport) HRESULT __stdcall -#endif - -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN10_RS5) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -XAUDIO2_STDAPI XAudio2CreateWithVersionInfo(_Outptr_ IXAudio2** ppXAudio2, - UINT32 Flags X2DEFAULT(0), - XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR), - DWORD ntddiVersion X2DEFAULT(NTDDI_VERSION)); - -static INLINE HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, - UINT32 Flags X2DEFAULT(0), - XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) -{ - /* When compiled for RS5 or later, try to invoke XAudio2CreateWithVersionInfo. - * Need to use LoadLibrary in case the app is running on an older OS. */ - typedef HRESULT(__stdcall *XAudio2CreateWithVersionInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR, DWORD); - typedef HRESULT(__stdcall *XAudio2CreateInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR); - - static HMODULE s_dllInstance = NULL; - static XAudio2CreateWithVersionInfoFunc s_pfnAudio2CreateWithVersion = NULL; - static XAudio2CreateInfoFunc s_pfnAudio2Create = NULL; - - if (s_dllInstance == NULL) - { - s_dllInstance = LoadLibraryEx(XAUDIO2_DLL, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); - if (s_dllInstance == NULL) - return HRESULT_FROM_WIN32(GetLastError()); - - s_pfnAudio2CreateWithVersion = (XAudio2CreateWithVersionInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2CreateWithVersionInfo"); - if (s_pfnAudio2CreateWithVersion == NULL) - { - s_pfnAudio2Create = (XAudio2CreateInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2Create"); - if (s_pfnAudio2Create == NULL) - return HRESULT_FROM_WIN32(GetLastError()); - } - } - - if (s_pfnAudio2CreateWithVersion != NULL) - return (*s_pfnAudio2CreateWithVersion)(ppXAudio2, Flags, XAudio2Processor, NTDDI_VERSION); - return (*s_pfnAudio2Create)(ppXAudio2, Flags, XAudio2Processor); -} -#else -/* RS4 or older, or not a desktop app */ -XAUDIO2_STDAPI XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), - XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)); -#endif - -/* Undo the #pragma pack(push, 1) directive at the top of this file */ -#pragma pack(pop) - -#endif /* #ifndef GUID_DEFS_ONLY */ - -#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) */ -#pragma endregion - + */ +static INLINE float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency, UINT32 SampleRate) +{ + if ((UINT32)CutoffFrequency >= SampleRate) + return XAUDIO2_MAX_FILTER_FREQUENCY; + return (1.0f - powf(1.0f - 2.0f * CutoffFrequency / SampleRate, 2.0f)); +} + + +#endif // #ifdef XAUDIO2_HELPER_FUNCTIONS + + +/************************************************************************** + * + * XAudio2Create: Top-level function that creates an XAudio2 instance. + * + * ARGUMENTS: + * + * Flags - Flags specifying the XAudio2 object's behavior. + * + * XAudio2Processor - An XAUDIO2_PROCESSOR value that specifies the + * hardware threads (Xbox) or processors (Windows) that XAudio2 + * will use. Note that XAudio2 supports concurrent processing on + * multiple threads, using any combination of XAUDIO2_PROCESSOR + * flags. The values are platform-specific; platform-independent + * code can use XAUDIO2_DEFAULT_PROCESSOR to use the default on + * each platform. + * + **************************************************************************/ + +#ifdef __cplusplus__ + +#if (defined XAUDIO2_EXPORT) + /* We're building xaudio2.dll */ +#define XAUDIO2_STDAPI extern "C" __declspec(dllexport) HRESULT __stdcall +#else + /* We're an xaudio2 client */ +#define XAUDIO2_STDAPI extern "C" __declspec(dllimport) HRESULT __stdcall +#endif + +#else + + /* Modified for C support */ + +#if (defined XAUDIO2_EXPORT) + /* We're building xaudio2.dll */ +#define XAUDIO2_STDAPI __declspec(dllexport) HRESULT __stdcall +#else + /* We're an xaudio2 client */ +#define XAUDIO2_STDAPI __declspec(dllimport) HRESULT __stdcall +#endif + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN10_RS5) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +XAUDIO2_STDAPI XAudio2CreateWithVersionInfo(_Outptr_ IXAudio2** ppXAudio2, + UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR), + DWORD ntddiVersion X2DEFAULT(NTDDI_VERSION)); + +static INLINE HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, + UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) +{ + /* When compiled for RS5 or later, try to invoke XAudio2CreateWithVersionInfo. + * Need to use LoadLibrary in case the app is running on an older OS. */ + typedef HRESULT(__stdcall *XAudio2CreateWithVersionInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR, DWORD); + typedef HRESULT(__stdcall *XAudio2CreateInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR); + + static HMODULE s_dllInstance = NULL; + static XAudio2CreateWithVersionInfoFunc s_pfnAudio2CreateWithVersion = NULL; + static XAudio2CreateInfoFunc s_pfnAudio2Create = NULL; + + if (s_dllInstance == NULL) + { + s_dllInstance = LoadLibraryEx(XAUDIO2_DLL, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + if (s_dllInstance == NULL) + return HRESULT_FROM_WIN32(GetLastError()); + + s_pfnAudio2CreateWithVersion = (XAudio2CreateWithVersionInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2CreateWithVersionInfo"); + if (s_pfnAudio2CreateWithVersion == NULL) + { + s_pfnAudio2Create = (XAudio2CreateInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2Create"); + if (s_pfnAudio2Create == NULL) + return HRESULT_FROM_WIN32(GetLastError()); + } + } + + if (s_pfnAudio2CreateWithVersion != NULL) + return (*s_pfnAudio2CreateWithVersion)(ppXAudio2, Flags, XAudio2Processor, NTDDI_VERSION); + return (*s_pfnAudio2Create)(ppXAudio2, Flags, XAudio2Processor); +} +#else +/* RS4 or older, or not a desktop app */ +XAUDIO2_STDAPI XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)); +#endif + +/* Undo the #pragma pack(push, 1) directive at the top of this file */ +#pragma pack(pop) + +#endif /* #ifndef GUID_DEFS_ONLY */ + +#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_TV_APP | WINAPI_PARTITION_TV_TITLE) */ +#pragma endregion + #endif /* #ifndef __XAUDIO2_INCLUDED__ */ - From fc8abd7baf17dcf0ec8dcfcd02864a76a0d0b3aa Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 07:53:09 +0100 Subject: [PATCH 061/116] Add header include for printf --- libretro-common/include/retro_assert.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libretro-common/include/retro_assert.h b/libretro-common/include/retro_assert.h index 9f3abdeafb..13db8cf8a5 100644 --- a/libretro-common/include/retro_assert.h +++ b/libretro-common/include/retro_assert.h @@ -26,6 +26,7 @@ #include #ifdef RARCH_INTERNAL +#include #define retro_assert(cond) do { \ if (!(cond)) { printf("Assertion failed at %s:%d.\n", __FILE__, __LINE__); abort(); } \ } while(0) From 0b13cba4eace866e87e9ccbefa0b673f922b5d93 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 10 Dec 2018 20:03:03 -0500 Subject: [PATCH 062/116] add drmingw's exchndl support --- Makefile | 5 +++++ qb/config.libs.sh | 3 +++ qb/config.params.sh | 1 + retroarch.c | 18 ++++++++++++++++-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 304bc4309f..fbc42d7c81 100644 --- a/Makefile +++ b/Makefile @@ -82,6 +82,11 @@ else OPTIMIZE_FLAG = -O3 -ffast-math endif +ifeq ($(HAVE_DRMINGW), 1) + CFLAGS += -DHAVE_DRMINGW + LDFLAGS += $(DRMINGW_LIBS) +endif + ifneq ($(findstring Win32,$(OS)),) LDFLAGS += -mwindows endif diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 6dbe6f41ef..1ae1e2bfc3 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -418,6 +418,9 @@ if [ "$HAVE_THREADS" = 'no' ] && [ "$HAVE_FFMPEG" != 'no' ]; then die : 'Notice: Threads are not available, FFmpeg will also be disabled.' fi +check_header DRMINGW exchndl.h +check_lib '' DRMINGW -lexchndl + if [ "$HAVE_FFMPEG" != 'no' ]; then check_pkgconf AVCODEC libavcodec 54 check_pkgconf AVFORMAT libavformat 54 diff --git a/qb/config.params.sh b/qb/config.params.sh index 0248eb8aa7..e73e273d39 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -134,3 +134,4 @@ HAVE_LANGEXTRA=yes # Multi-language support HAVE_OSMESA=no # Off-screen Mesa rendering HAVE_VIDEOPROCESSOR=auto # Enable video processor core HAVE_VIDEOCORE=auto # Broadcom Videocore 4 support +HAVE_DRMINGW=no # DrMingw exception handler diff --git a/retroarch.c b/retroarch.c index 3e0dc5cb1a..5e92fec952 100644 --- a/retroarch.c +++ b/retroarch.c @@ -23,6 +23,9 @@ #define WIN32_LEAN_AND_MEAN #include #endif +#if defined(DEBUG) && defined(HAVE_DRMINGW) +#include "exchndl.h" +#endif #endif #include @@ -1255,7 +1258,7 @@ static void retroarch_validate_cpu_features(void) static void retroarch_main_init_media(void) { - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); const char *fullpath = path_get(RARCH_PATH_CONTENT); bool builtin_imageviewer = false; bool builtin_mediaplayer = false; @@ -1316,6 +1319,10 @@ bool retroarch_main_init(int argc, char *argv[]) bool init_failed = false; global_t *global = global_get_ptr(); +#if defined(DEBUG) && defined(HAVE_DRMINGW) + char log_file_name[128]; +#endif + retroarch_init_state(); if (setjmp(error_sjlj_context) > 0) @@ -1334,7 +1341,6 @@ bool retroarch_main_init(int argc, char *argv[]) if (verbosity_is_enabled()) { char str[128]; - str[0] = '\0'; RARCH_LOG_OUTPUT("=== Build =======================================\n"); @@ -1348,6 +1354,14 @@ bool retroarch_main_init(int argc, char *argv[]) RARCH_LOG_OUTPUT("=================================================\n"); } +#if defined(DEBUG) && defined(HAVE_DRMINGW) + RARCH_LOG("Initializing Dr.MingW Exception handler\n"); + fill_str_dated_filename(log_file_name, "crash", + "log", sizeof(log_file_name)); + ExcHndlInit(); + ExcHndlSetLogFileNameA(log_file_name); +#endif + retroarch_validate_cpu_features(); rarch_ctl(RARCH_CTL_TASK_INIT, NULL); From 74f391de9bb67b7d62b7f9180d73c61e2e8e6bb6 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 19:55:37 +0100 Subject: [PATCH 063/116] This fixes all-non Xinput/Xbox pads - they were all non-working before --- input/drivers_joypad/xinput_joypad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/drivers_joypad/xinput_joypad.c b/input/drivers_joypad/xinput_joypad.c index 1961b64262..91f80273cf 100644 --- a/input/drivers_joypad/xinput_joypad.c +++ b/input/drivers_joypad/xinput_joypad.c @@ -288,7 +288,7 @@ static bool xinput_joypad_init(void *data) (!g_xinput_states[1].connected) && (!g_xinput_states[2].connected) && (!g_xinput_states[3].connected)) - return true; + return false; RARCH_LOG("[XInput]: Pads connected: %d\n", g_xinput_states[0].connected + g_xinput_states[1].connected + g_xinput_states[2].connected + g_xinput_states[3].connected); From aecd532dac2c5dbe3de5d4ce3c83c15a83c0bf19 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 20:03:14 +0100 Subject: [PATCH 064/116] UWP needs this to return true for some reason --- input/drivers_joypad/xinput_joypad.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/input/drivers_joypad/xinput_joypad.c b/input/drivers_joypad/xinput_joypad.c index 91f80273cf..8bf4d26594 100644 --- a/input/drivers_joypad/xinput_joypad.c +++ b/input/drivers_joypad/xinput_joypad.c @@ -288,7 +288,11 @@ static bool xinput_joypad_init(void *data) (!g_xinput_states[1].connected) && (!g_xinput_states[2].connected) && (!g_xinput_states[3].connected)) +#ifdef __WINRT__ + return true; +#else return false; +#endif RARCH_LOG("[XInput]: Pads connected: %d\n", g_xinput_states[0].connected + g_xinput_states[1].connected + g_xinput_states[2].connected + g_xinput_states[3].connected); From bcdcdbf2c37a8f2b3bd1f202943059b82c3360c9 Mon Sep 17 00:00:00 2001 From: Alfredo Monclus Date: Sun, 30 Dec 2018 15:34:28 -0300 Subject: [PATCH 065/116] Update Spanish --- intl/msg_hash_es.h | 160 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 146 insertions(+), 14 deletions(-) diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 5c6e193bd5..686d0662bb 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -7,7 +7,7 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE, "Acelera el procesador de video" ) - MSG_HASH( +MSG_HASH( MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, "Brillo de pantalla" ) @@ -673,6 +673,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LIST, "Cargar núcleo" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_LIST, + "Instalar or Restaurar un núcleo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_ERROR, + "Falló la instalación del núcleo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_SUCCESS, + "Núcleo instalado exitosamente" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, "Opciones" @@ -759,7 +771,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, - "Estado de la bandeja de discos" + "Abrir/Cerrar la bandeja de discos" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, @@ -845,6 +857,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_FPS_SHOW, "Mostrar FPS" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MEMORY_SHOW, + "Incluir detalles de memoria" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, "Limitar velocidad máxima de ejecución" @@ -1249,6 +1265,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, "Avanzar frame" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, + "Mostrar FPS" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, "Pantalla completa" @@ -1297,10 +1317,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, "Pausar" ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Reiniciar RetroArch" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, "Cerrar RetroArch" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, "Resetear juego" @@ -2049,10 +2076,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS, "MIDI" ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "Reiniciar RetroArch" + ) +#else MSG_HASH( MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, "Cerrar RetroArch" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, "Soporte de analógico" @@ -2920,10 +2954,58 @@ MSG_HASH( MENU_ENUM_SUBLABEL_TIMEDATE_STYLE, "Cambia la forma en que se muestra la fecha y hora" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HMS, + "YYYY-MM-DD HH:MM:SS" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HM, + "YYYY-MM-DD HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MDYYYY, + "MM-DD-YYYY HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HMS, + "HH:MM:SS" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HM, + "HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_DM_HM, + "DD/MM HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MD_HM, + "MM/DD HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_AM_PM, + "HH:MM:SS (AM/PM)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TITLE_COLOR, "Color de títulos del menú" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BG_DARK_COLOR, + "Color oscuro del fondo del menú" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BG_LIGHT_COLOR, + "Color claro del fondo del menú" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BORDER_DARK_COLOR, + "Color oscuro del borde del menú" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BORDER_LIGHT_COLOR, + "Color claro del borde del menú" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TRUE, "Activado" @@ -3176,6 +3258,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, "Escala en ventana" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_THREADS, + "Hilos de grabación (Threads)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, "Escalar usando enteros" @@ -3486,7 +3572,8 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Duplica puntos pero desactiva guardado rápido, trucos, rebobinar, y cámara lenta para todos los juegos" + "Duplica puntos pero desactiva guardado rápido, trucos, rebobinar, y cámara lenta." + "Cambiar esto reiniciará el juego." ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, @@ -3596,6 +3683,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_FPS_SHOW, "Muestra la velocidad de cuadros por segundo" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAMECOUNT_SHOW, + "Muestra el contador de frames" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MEMORY_SHOW, + "Muestra la cantidad de memoria usada/total" + ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, "Opciones de teclas rápidas (hotkeys)" @@ -4838,6 +4933,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LIST, "Seleccionar que núcleo usar" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DOWNLOAD_CORE, + "Instalar un núcleo desde el Actualizador en línea" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SIDELOAD_CORE_LIST, + "Instalr o restaurar un núcleo desde la carpeta de descargas" + ) MSG_HASH( MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, "Seleccionar que contenido iniciar" @@ -4850,10 +4953,17 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, "Mostrar información especifica del dispositivo" ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Reiniciar el programa" + ) +#else MSG_HASH( MENU_ENUM_SUBLABEL_QUIT_RETROARCH, "Salir del programa" ) +#endif MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, "Establece el ancho de la ventana. Al dejarlo en 0 hará que intente ser lo mas grande posible" @@ -4862,6 +4972,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, "Establece el alto de la ventana. Al dejarlo en 0 hará que intente ser lo mas grande posible" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SAVE_POSITION, + "Tomará precedencia sobre Escala en Ventana" + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, "Establece el ancho en pantalla completa. Al dejarlo en 0 se usará la resolución del escritorio" @@ -6037,14 +6151,25 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, "Mostrar/ocultar la opción de 'Ayuda'" ) +#ifdef HAVE_LAKKA MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Mostrar salir de RetroArch" + "Mostrar Reiniciar RetroArch" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Mostrar/ocultar la opción de 'Salir de RetroArch'" + "Mostrar/ocultar la opción de 'Reiniciar RetroArch'" ) +#else +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Mostrar Cerrar RetroArch" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Muestrar/Ocultar la opción de 'Cerrar RetroArch'" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, "Mostrar reiniciar" @@ -6103,27 +6228,27 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_RECORDING, - "Show Start Recording" + "Mostrar Comenzar grabación" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_RECORDING, - "Show/hide the 'Start Recording' option." + "Mostrar/ocultar la opción de 'Comenzar grabación'" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_STREAMING, - "Show Start Streaming" + "Mostrar Comenzar Streamingg" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_STREAMING, - "Show/hide the 'Start Streaming' option." + "Mostrar/ocultar la opción de 'Comenzar Streaming'" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, - "Show Reset Core Association" + "Mostrar Restablecer asociación de núcleo" ) MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, - "Show/hide the 'Reset Core Association' option." + "Mostrar/ocultar la opción de 'Restablecer asociación de núcleo'" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, @@ -7576,7 +7701,8 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ADAPTIVE_VSYNC, - "V-Sync está activado hasta que el rendimiento sea inferior al necesario para mantener el refresco de pantalla. Puede minimizar los tirones cuando hay caidas de fps y es més eficiente energeticamente." + "V-Sync está activado hasta que el rendimiento sea inferior al necesario para mantener el refresco de pantalla.\n" + "Puede minimizar los tirones cuando hay caidas de fps y es més eficiente energeticamente." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS, @@ -7774,5 +7900,11 @@ MSG_HASH( MSG_MISSING_ASSETS, "ADVERTENCIA: Faltan recursos, use el Actualizador si está disponible" ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, - "Remember Window Position and Size") +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, + "Recordar posición y tamaño de la ventana" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HOLD_START, + "Mantener Start (2 segundos)" + ) \ No newline at end of file From 428011693edb895981faf2c16375fc0befbb5ec2 Mon Sep 17 00:00:00 2001 From: Alfredo Monclus Date: Sun, 30 Dec 2018 16:12:03 -0300 Subject: [PATCH 066/116] Fix msg_hash_us styling --- intl/msg_hash_us.h | 54 ++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index f49615f723..1ca7dedc1d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3572,7 +3572,8 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Enables hardcore mode, this will enable or disable savestates, cheats, rewind, pause, and slow-motion.\nToggling this setting at runtime will restart your game." + "Enables hardcore mode, this will enable or disable savestates, cheats, rewind, pause, and slow-motion.\n" + "Toggling this setting at runtime will restart your game." ) MSG_HASH( MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, @@ -4953,11 +4954,15 @@ MSG_HASH( "Show information specific to the device." ) #ifdef HAVE_LAKKA -MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, - "Restart the program.") +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Restart the program." + ) #else -MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, - "Quit the program.") +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Quit the program." + ) #endif MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, @@ -6147,15 +6152,23 @@ MSG_HASH( "Show/hide the 'Help' option." ) #ifdef HAVE_LAKKA -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Show Restart RetroArch") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Show/hide the 'Restart RetroArch' option.") +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option." + ) #else -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Show Quit RetroArch") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Show/hide the 'Quit RetroArch' option.") +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Quit RetroArch" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Quit RetroArch' option." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, @@ -7688,7 +7701,8 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ADAPTIVE_VSYNC, - "V-Sync is enabled until performance falls below the target refresh rate. Can minimize stuttering when performance falls below realtime, and can be more energy efficient." + "V-Sync is enabled until performance falls below the target refresh rate.\n" + "This can minimize stuttering when performance falls below realtime, and can be more energy efficient." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS, @@ -7886,7 +7900,11 @@ MSG_HASH( MSG_MISSING_ASSETS, "Warning: Missing assets, use the Online Updater if available" ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, - "Remember Window Position and Size") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HOLD_START, - "Hold Start (2 seconds)") +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, + "Remember Window Position and Size" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HOLD_START, + "Hold Start (2 seconds)" + ) \ No newline at end of file From d7a7d8cb5996059531f74f2538f884bd8fdde26b Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 30 Dec 2018 16:01:09 -0500 Subject: [PATCH 067/116] update CHANGES.MD with my changes since last release --- CHANGES.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ac79af4e4d..5bf7e2d8f7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,23 +1,38 @@ # 1.7.6 (future) +- ANDROID: Fix Xperia Play input binding +- CHEEVOS: Reset when hardcore mode is toggled +- CORE UPDATER: Allow sideloading cores from the menu - CPU FILTERS: Add Normal2x filter. - DATE: Add Date / Time style options. -- MIDI: Add a Linux ALSA driver for MIDI. +- DEBUGGING: Add an integrated crash handler for debug builds (see https://docs.libretro.com/tech/debugging) +- DISCORD: Register the application name properly +- DISK CONTROL: Remember the last used folder / current active folder to make disk-swapping faster - LOCALIZATION: Add Greek translation. - LOCALIZATION: Update German translation. - LOCALIZATION: Update Italian translation. -- LOCALIZATION: Update Simplified Chinese translation. - LOCALIZATION: Update Japanese translation. +- LOCALIZATION: Update Simplified Chinese translation. - MENU: Only show CRT SwitchRes if video display server is implemented (Windows/Linux for now) - MENU: User Interface -> Appearance -> 'Menu Font Green/Blue Color' settings now work properly. +- MIDI: Add a Linux ALSA driver for MIDI. +- NETPLAY: Force fast-save-states when netlay is enabled +- RECORDING: Implement recording options in the menu complete with quality profiles, streaming, and proper file naming - SCANNER: Fix GDI disc scanning. +- SHADERS: Fix auto shader preset loading on D3D10, D3D11, D3D12 +- SUBSYSTEM: Allow more than 10 subsystems +- SUBSYSTEM: Cores that use subsystem for complex scenarios can now load content without starting a regular content first +- SUBSYSTEM: Remember the last used folder to make loading subsystem type content faster - SWITCH/LIBNX: Improve touch scaling calculation. - SWITCH: Proper button labels. - VULKAN: Fix RGUI crashing at startup. - VULKAN: Fix secondary screens in overlays not working. - WAYLAND: Implement idle-inhibit support (needed for screensaver suspend). -- WINDOWS/WSA: Network Information info is blank until first network operation. -- WINDOWS: SSL/TLS connections now work properly. - WIIU: Initial netplay peer-to-peer support. Network information working. +- WINDOWS/WSA: Network Information info is blank until first network operation. +- WINDOWS: Fix an ancient bug that caused wrong mappings for keyboard arrows +- WINDOWS: Remember window size and position if so desired +- WINDOWS: SSL/TLS connections now work properly. + # 1.7.5 - CAMERA: Fix Video4Linux2 driver that broke years ago. From 6b35e8d4f6bed00a9041cc18c89600bfe772ce0a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 30 Dec 2018 22:13:15 +0100 Subject: [PATCH 068/116] (UWP) Implement cpu_features_get_core_amount --- libretro-common/features/features_cpu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libretro-common/features/features_cpu.c b/libretro-common/features/features_cpu.c index 1a04ce07c5..6c056f08d8 100644 --- a/libretro-common/features/features_cpu.c +++ b/libretro-common/features/features_cpu.c @@ -482,10 +482,14 @@ static void cpulist_read_from(CpuList* list, const char* filename) **/ unsigned cpu_features_get_core_amount(void) { -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) +#if defined(_WIN32) && !defined(_XBOX) /* Win32 */ SYSTEM_INFO sysinfo; +#ifdef __WINRT__ + GetNativeSystemInfo(&sysinfo); +#else GetSystemInfo(&sysinfo); +#endif return sysinfo.dwNumberOfProcessors; #elif defined(GEKKO) return 1; From c6ba5d9ebc252ec6b4e6fbc8c8ce0c228a4b5039 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2018 01:38:45 +0100 Subject: [PATCH 069/116] (UWP) Start adding some Windows Phone 8.1 ifdefs --- libretro-common/include/retro_timers.h | 2 +- uwp/uwp_main.cpp | 16 +++++++++++++--- uwp/uwp_main.h | 4 ++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libretro-common/include/retro_timers.h b/libretro-common/include/retro_timers.h index d11e67e7c2..60bf221e36 100644 --- a/libretro-common/include/retro_timers.h +++ b/libretro-common/include/retro_timers.h @@ -95,7 +95,7 @@ static INLINE void retro_sleep(unsigned msec) SDL_Delay(msec); #elif defined(_3DS) svcSleepThread(1000000 * (s64)msec); -#elif defined(__WINRT__) +#elif defined(__WINRT__) || (_MSC_VER && _MSC_VER <= 1800) /* TODO/FIXME */ #elif defined(_WIN32) Sleep(msec); diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index 85fc437215..edfd27bfa2 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -36,7 +36,9 @@ using namespace Windows::UI::Input; using namespace Windows::UI::ViewManagement; using namespace Windows::Devices::Input; using namespace Windows::System; +#if _MSC_VER >= 1800 using namespace Windows::System::Profile; +#endif using namespace Windows::Foundation; using namespace Windows::Graphics::Display; @@ -257,19 +259,21 @@ void App::SetWindow(CoreWindow^ window) window->PointerWheelChanged += ref new TypedEventHandler(this, &App::OnPointer); +#if _MSC_VER >= 1800 DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); currentDisplayInformation->DpiChanged += ref new TypedEventHandler(this, &App::OnDpiChanged); - currentDisplayInformation->OrientationChanged += - ref new TypedEventHandler(this, &App::OnOrientationChanged); - DisplayInformation::DisplayContentsInvalidated += ref new TypedEventHandler(this, &App::OnDisplayContentsInvalidated); + currentDisplayInformation->OrientationChanged += + ref new TypedEventHandler(this, &App::OnOrientationChanged); + Windows::UI::Core::SystemNavigationManager::GetForCurrentView()->BackRequested += ref new EventHandler(this, &App::OnBackRequested); +#endif } // Initializes scene resources, or loads a previously saved app state. @@ -359,11 +363,13 @@ void App::OnResuming(Platform::Object^ sender, Platform::Object^ args) // does not occur if the app was previously terminated. } +#if _MSC_VER >= 1800 void App::OnBackRequested(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args) { /* Prevent the B controller button on Xbox One from quitting the app */ args->Handled = true; } +#endif // Window event handlers. @@ -443,6 +449,7 @@ void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args) // DisplayInformation event handlers. +#if _MSC_VER >= 1800 void App::OnDpiChanged(DisplayInformation^ sender, Object^ args) { m_windowResized = true; @@ -457,6 +464,7 @@ void App::OnDisplayContentsInvalidated(DisplayInformation^ sender, Object^ args) { // Probably can be ignored? } +#endif // Taken from DirectX UWP samples - on Xbox, everything is scaled 200% so getting the DPI calculation correct is crucial static inline float ConvertDipsToPixels(float dips, float dpi) @@ -477,6 +485,7 @@ extern "C" { { if (App::GetInstance()->IsInitialized()) { +#if _MSC_VER >= 1800 if (fullscreen != ApplicationView::GetForCurrentView()->IsFullScreenMode) { if (fullscreen) @@ -484,6 +493,7 @@ extern "C" { else ApplicationView::GetForCurrentView()->ExitFullScreenMode(); } +#endif ApplicationView::GetForCurrentView()->TryResizeView(Size(width, height)); } else diff --git a/uwp/uwp_main.h b/uwp/uwp_main.h index 623d922161..8f1f123561 100644 --- a/uwp/uwp_main.h +++ b/uwp/uwp_main.h @@ -38,7 +38,9 @@ namespace RetroArchUWP void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ args); void OnResuming(Platform::Object^ sender, Platform::Object^ args); +#if _MSC_VER >= 1800 void OnBackRequested(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args); +#endif // Window event handlers. void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args); @@ -49,9 +51,11 @@ namespace RetroArchUWP void OnPointer(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args); // DisplayInformation event handlers. +#if _MSC_VER >= 1800 void OnDpiChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); void OnOrientationChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); void OnDisplayContentsInvalidated(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); +#endif public: bool IsInitialized() { return m_initialized; } From 44ebcbd0441033fb7e416514288d2d77af8419e1 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2018 04:34:55 +0100 Subject: [PATCH 070/116] Some buildfixes for MSVC 2012 --- uwp/uwp_main.cpp | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index edfd27bfa2..5d1e2c4696 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -162,15 +162,22 @@ const struct rarch_key_map rarch_key_map_uwp[] = { }; struct uwp_input_state_t { - short mouse_screen_x = 0, mouse_screen_y = 0; - short mouse_rel_x = 0, mouse_rel_y = 0; - bool mouse_left = false, mouse_right = false, mouse_middle = false; - bool mouse_button4 = false, mouse_button5 = false; - short mouse_wheel_left = 0, mouse_wheel_up = 0; - - short touch_screen_x = 0, touch_screen_y = 0; - short touch_rel_x = 0, touch_rel_y = 0; - bool touch_touched = false; + short mouse_screen_x; + short mouse_screen_y; + short mouse_rel_x; + short mouse_rel_y; + bool mouse_left; + bool mouse_right; + bool mouse_middle; + bool mouse_button4; + bool mouse_button5; + short mouse_wheel_left; + short mouse_wheel_up; + short touch_screen_x; + short touch_screen_y; + short touch_rel_x; + short touch_rel_y; + bool touch_touched; }; struct uwp_input_state_t uwp_current_input, uwp_next_input; @@ -537,13 +544,13 @@ extern "C" { void uwp_input_next_frame(void) { - uwp_current_input = uwp_next_input; - uwp_next_input.mouse_rel_x = 0; - uwp_next_input.mouse_rel_y = 0; - uwp_next_input.mouse_wheel_up %= WHEEL_DELTA; + uwp_current_input = uwp_next_input; + uwp_next_input.mouse_rel_x = 0; + uwp_next_input.mouse_rel_y = 0; + uwp_next_input.mouse_wheel_up %= WHEEL_DELTA; uwp_next_input.mouse_wheel_left %= WHEEL_DELTA; - uwp_next_input.touch_rel_x = 0; - uwp_next_input.touch_rel_y = 0; + uwp_next_input.touch_rel_x = 0; + uwp_next_input.touch_rel_y = 0; } bool uwp_keyboard_pressed(unsigned key) From 99e5791ae4653520378af30ce9f2183f08b2200a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2018 04:40:10 +0100 Subject: [PATCH 071/116] Style nits --- uwp/uwp_main.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index 5d1e2c4696..496a3750e9 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -431,13 +431,9 @@ void App::OnPointer(CoreWindow^ sender, PointerEventArgs^ args) uwp_next_input.mouse_rel_x = uwp_next_input.mouse_screen_x - uwp_current_input.mouse_screen_x; uwp_next_input.mouse_rel_y = uwp_next_input.mouse_screen_y - uwp_current_input.mouse_screen_y; if (args->CurrentPoint->Properties->IsHorizontalMouseWheel) - { uwp_next_input.mouse_wheel_left += args->CurrentPoint->Properties->MouseWheelDelta; - } else - { uwp_next_input.mouse_wheel_up += args->CurrentPoint->Properties->MouseWheelDelta; - } } else { @@ -527,13 +523,13 @@ extern "C" { void win32_check_window(bool *quit, bool *resize, unsigned *width, unsigned *height) { - *quit = App::GetInstance()->IsWindowClosed(); + *quit = App::GetInstance()->IsWindowClosed(); *resize = App::GetInstance()->CheckWindowResized(); if (*resize) { float dpi = DisplayInformation::GetForCurrentView()->LogicalDpi; - *width = ConvertDipsToPixels(CoreWindow::GetForCurrentThread()->Bounds.Width, dpi); - *height = ConvertDipsToPixels(CoreWindow::GetForCurrentThread()->Bounds.Height, dpi); + *width = ConvertDipsToPixels(CoreWindow::GetForCurrentThread()->Bounds.Width, dpi); + *height = ConvertDipsToPixels(CoreWindow::GetForCurrentThread()->Bounds.Height, dpi); } } From a7f5fc94310ecb14f34bb75eac4020119399efd3 Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 30 Dec 2018 20:00:29 -0800 Subject: [PATCH 072/116] qb: Fix mpv check. This fixes the mpv configure check and disables it by default to avoid exposing other bugs. It can be enabled again when those isssues are fixed. --- qb/config.libs.sh | 5 ++--- qb/config.params.sh | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 1ae1e2bfc3..9d2312797d 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -409,9 +409,8 @@ else check_val '' ZLIB '-lz' fi -if [ "$HAVE_MPV" != 'no' ]; then - check_pkgconf MPV libmpv -fi +check_pkgconf MPV mpv +check_val '' MPV -lmpv if [ "$HAVE_THREADS" = 'no' ] && [ "$HAVE_FFMPEG" != 'no' ]; then HAVE_FFMPEG='no' diff --git a/qb/config.params.sh b/qb/config.params.sh index e73e273d39..0ed6fb676a 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -34,7 +34,7 @@ HAVE_THREADS=auto # Threading support HAVE_THREAD_STORAGE=auto # Thread Local Storage support HAVE_FFMPEG=auto # FFmpeg support C89_FFMPEG=no -HAVE_MPV=auto # MPV support +HAVE_MPV=no # MPV support HAVE_SSA=auto # SSA/ASS for FFmpeg subtitle support HAVE_DYLIB=auto # Dynamic loading support HAVE_NETWORKING=auto # Networking features (recommended) From 13517bc22646587afe4b55f49eedf0b1d3435400 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Mon, 31 Dec 2018 11:17:39 +0100 Subject: [PATCH 073/116] Fix the taskbar extension not initializing properly The COM interface is initialized a thousand times everywhere, but apparently not before the taskbar extension is loaded ;) Somehow this managed to work sometimes and even return a valid object, but that object was destroyed soon afterwards causing crashes --- gfx/display_servers/dispserv_win32.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 6563441bd5..097c05c563 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -82,6 +82,8 @@ static void* win32_display_server_init(void) return NULL; #ifdef HAS_TASKBAR_EXT + CoInitialize(NULL); + #ifdef __cplusplus /* When compiling in C++ mode, GUIDs are references instead of pointers */ hr = CoCreateInstance(CLSID_TaskbarList, NULL, From c9c604a37a53b82c0c9e6d7aa8c7f0cb581e6fe1 Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 30 Dec 2018 16:16:01 -0800 Subject: [PATCH 074/116] cli: Only print verbose output when '--verbose' is used. Fixes https://github.com/libretro/RetroArch/issues/7844 --- verbosity.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/verbosity.c b/verbosity.c index 7a9cfccbd5..e9b9d2269d 100644 --- a/verbosity.c +++ b/verbosity.c @@ -65,11 +65,7 @@ * will write to this file. */ static FILE *log_file_fp = NULL; static void* log_file_buf = NULL; -#if _DEBUG -static bool main_verbosity = true; -#else static bool main_verbosity = false; -#endif static bool log_file_initialized = false; #ifdef NXLINK From b5eedbaed7535e7b365287ee9194f5f9e607065c Mon Sep 17 00:00:00 2001 From: benoa Date: Mon, 31 Dec 2018 18:50:58 +0100 Subject: [PATCH 075/116] Fix .cfg not found with external loaders. --- frontend/drivers/platform_gx.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/frontend/drivers/platform_gx.c b/frontend/drivers/platform_gx.c index f7462e0966..ff0c1e77d5 100644 --- a/frontend/drivers/platform_gx.c +++ b/frontend/drivers/platform_gx.c @@ -209,7 +209,21 @@ static void frontend_gx_get_environment_settings( chdir("carda:/retroarch"); #endif getcwd(g_defaults.dirs[DEFAULT_DIR_CORE], PATH_MAX_LENGTH); - +#if defined(HW_RVL) && !defined(IS_SALAMANDER) + /* When using external loaders(Wiiflow etc.), getcwd doesn't return the path correctly and + * as a result the cfg file is not found. */ + if (*argc > 2 && argv[1] != NULL && argv[2] != NULL) + { + if(gx_devices[GX_DEVICE_SD].mounted) + { + chdir("sd:/"); + } + else if(gx_devices[GX_DEVICE_USB].mounted) + { + chdir("usb:/"); + } + } +#endif last_slash = strrchr(g_defaults.dirs[DEFAULT_DIR_CORE], '/'); if (last_slash) *last_slash = 0; From f7f602c1f7e1c54d1a895d130e8aa236f44c372c Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Mon, 31 Dec 2018 13:47:58 +0100 Subject: [PATCH 076/116] Dist-cores support PS2 platform --- Makefile.ps2 | 4 +++- dist-scripts/dist-cores.sh | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Makefile.ps2 b/Makefile.ps2 index 90c51cff3e..369a66198d 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -95,9 +95,11 @@ run: debug: clean prepare all run -release: clean all +package: ps2-packer $(EE_BIN) $(TARGET_RELEASE) +release: clean all package + #Specific file name and output per IRX Module $(EE_IRX_OBJ): $(EE_BIN2O) $(EE_GPVAL) $(IRX_DIR)/$(@:.o=.irx) $@ $(@:.o=_irx) diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh index bb0c8cb1c7..46bda5e8d8 100755 --- a/dist-scripts/dist-cores.sh +++ b/dist-scripts/dist-cores.sh @@ -18,6 +18,13 @@ cd .. LDFLAGS=-L. ./configure --disable-dynamic cd dist-scripts +elif [ $PLATFORM = "ps2" ] ; then +platform=ps2 +SALAMANDER=NO +EXT=a + +mkdir -p ../pkg/${platform}/cores/ + elif [ $PLATFORM = "psp1" ] ; then platform=psp1 SALAMANDER=yes @@ -230,7 +237,9 @@ for f in `ls -v *_${platform}.${EXT}`; do fi # Do manual executable step - if [ $PLATFORM = "dex-ps3" ] ; then + if [ $PLATFORM = "ps2" ] ; then + make -C ../ -f Makefile.${platform} package -j3 + elif [ $PLATFORM = "dex-ps3" ] ; then $MAKE_FSELF_NPDRM -c ../retroarch_${platform}.elf ../CORE.SELF elif [ $PLATFORM = "cex-ps3" ] ; then $SCETOOL_PATH $SCETOOL_FLAGS_CORE ../retroarch_${platform}.elf ../CORE.SELF @@ -253,6 +262,8 @@ for f in `ls -v *_${platform}.${EXT}`; do cp -fv ../../dist/info/"${name}_libretro.info" ../pkg/${platform}/SSNE10000/USRDIR/cores/info/"${name}_libretro.info" fi fi + elif [ $PLATFORM = "ps2" ] ; then + mv -f ../retroarchps2-release.elf ../pkg/${platform}/cores/retroarchps2_${name}.elf elif [ $PLATFORM = "psp1" ] ; then mv -f ../EBOOT.PBP ../pkg/${platform}/cores/${name}_libretro.PBP elif [ $PLATFORM = "vita" ] ; then @@ -288,6 +299,8 @@ for f in `ls -v *_${platform}.${EXT}`; do # Remove executable files if [ $platform = "ps3" ] ; then rm -f ../retroarch_${platform}.elf ../retroarch_${platform}.self ../CORE.SELF + elif [ $PLATFORM = "ps2" ] ; then + rm -f ../retroarchps2.elf elif [ $PLATFORM = "psp1" ] ; then rm -f ../retroarchpsp.elf elif [ $PLATFORM = "vita" ] ; then From d44ad6abd4470f89f8b297cf74806c4cf370c3e7 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Mon, 31 Dec 2018 18:48:15 +0100 Subject: [PATCH 077/116] PS2 TODOs --- menu/menu_driver.c | 3 ++- verbosity.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 4750fe1ec2..42c9c096c0 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -1743,9 +1743,10 @@ static bool menu_init(menu_handle_t *menu_data) configuration_set_bool(settings, settings->bools.menu_show_start_screen, false); - +#if !defined(PS2) // TODO: PS2 IMPROVEMENT if (settings->bools.config_save_on_exit) command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL); +#endif } if ( settings->bools.bundle_assets_extract_enable diff --git a/verbosity.c b/verbosity.c index 7a9cfccbd5..2d686c1ca3 100644 --- a/verbosity.c +++ b/verbosity.c @@ -127,7 +127,7 @@ void retro_main_log_file_init(const char *path) log_file_fp = (FILE*)fopen_utf8(path, "wb"); log_file_initialized = true; -#if !defined(PS2) +#if !defined(PS2) // TODO: PS2 IMPROVEMENT /* TODO: this is only useful for a few platforms, find which and add ifdef */ log_file_buf = calloc(1, 0x4000); setvbuf(log_file_fp, (char*)log_file_buf, _IOFBF, 0x4000); From d58c71cc3e66a0874b2c2d45a7854ac6bca7d220 Mon Sep 17 00:00:00 2001 From: benoa Date: Mon, 31 Dec 2018 19:01:14 +0100 Subject: [PATCH 078/116] Fix compiling with external libogc --- Makefile.griffin | 4 ++-- Makefile.wii.salamander | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile.griffin b/Makefile.griffin index 03d6d22d8d..4a099fa2b7 100644 --- a/Makefile.griffin +++ b/Makefile.griffin @@ -158,8 +158,6 @@ else ifeq ($(libogc_platform), 1) endif endif - LIBS += -logc - ifeq ($(EXTERNAL_LIBOGC), 1) LIBS += -lfat endif @@ -176,6 +174,8 @@ else ifeq ($(libogc_platform), 1) endif endif + LIBS += -logc + CFLAGS += -DGEKKO -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int HAVE_RUNAHEAD := 1 diff --git a/Makefile.wii.salamander b/Makefile.wii.salamander index e39c30bdc8..dc5249f832 100644 --- a/Makefile.wii.salamander +++ b/Makefile.wii.salamander @@ -42,12 +42,13 @@ endif MACHDEP := -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(INCLUDE) LDFLAGS := $(MACHDEP) -Wl,-Map,$(notdir $(ELF_TARGET)).map -LIBS := -lwiiuse -logc -lbte ifeq ($(EXTERNAL_LIBOGC), 1) -LIBS += -lfat +LIBS := -lfat endif +LIBS += -lwiiuse -logc -lbte + APP_BOOTER_DIR = wii/app_booter OBJ = frontend/frontend_salamander.o \ From bb5cd1dfeb55d94eb7ed84983227d8056997b55f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2018 21:08:25 +0100 Subject: [PATCH 079/116] Change C++ comments to c --- menu/menu_driver.c | 2 +- verbosity.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 42c9c096c0..29657d93ae 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -1743,7 +1743,7 @@ static bool menu_init(menu_handle_t *menu_data) configuration_set_bool(settings, settings->bools.menu_show_start_screen, false); -#if !defined(PS2) // TODO: PS2 IMPROVEMENT +#if !defined(PS2) /* TODO: PS2 IMPROVEMENT */ if (settings->bools.config_save_on_exit) command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL); #endif diff --git a/verbosity.c b/verbosity.c index fc0f713eef..7489d2202e 100644 --- a/verbosity.c +++ b/verbosity.c @@ -123,7 +123,7 @@ void retro_main_log_file_init(const char *path) log_file_fp = (FILE*)fopen_utf8(path, "wb"); log_file_initialized = true; -#if !defined(PS2) // TODO: PS2 IMPROVEMENT +#if !defined(PS2) /* TODO: PS2 IMPROVEMENT */ /* TODO: this is only useful for a few platforms, find which and add ifdef */ log_file_buf = calloc(1, 0x4000); setvbuf(log_file_fp, (char*)log_file_buf, _IOFBF, 0x4000); From c901866864ac67f372892e7810b220c2bcf75124 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 1 Jan 2019 02:23:39 +0300 Subject: [PATCH 080/116] Wayland: Fix window resizing on HiDPI monitors --- gfx/drivers_context/wayland_ctx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index 01a5e52133..e65569e967 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -870,8 +870,8 @@ static void gfx_ctx_wl_get_video_size(void *data, { gfx_ctx_wayland_data_t *wl = (gfx_ctx_wayland_data_t*)data; - *width = wl->width; - *height = wl->height; + *width = wl->width * wl->buffer_scale; + *height = wl->height * wl->buffer_scale; } static void gfx_ctx_wl_destroy_resources(gfx_ctx_wayland_data_t *wl) From a2eaa6a19d9b6718fad201294e12890cd97b6991 Mon Sep 17 00:00:00 2001 From: M4xw Date: Tue, 1 Jan 2019 00:25:54 +0100 Subject: [PATCH 081/116] [LIBNX] Native 1080p support --- gfx/drivers_context/switch_ctx.c | 38 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/gfx/drivers_context/switch_ctx.c b/gfx/drivers_context/switch_ctx.c index 6a8e075cd6..1bdfe71447 100644 --- a/gfx/drivers_context/switch_ctx.c +++ b/gfx/drivers_context/switch_ctx.c @@ -46,10 +46,20 @@ void switch_ctx_destroy(void *data) static void switch_ctx_get_video_size(void *data, unsigned *width, unsigned *height) { - switch_ctx_data_t *ctx_nx = (switch_ctx_data_t *)data; + switch_ctx_data_t *ctx_nx = (switch_ctx_data_t *)data; - *width = 1280; - *height = 720; + switch (appletGetOperationMode()) + { + default: + case AppletOperationMode_Handheld: + *width = 1280; + *height = 720; + break; + case AppletOperationMode_Docked: + *width = 1920; + *height = 1080; + break; + } } static void *switch_ctx_init(video_frame_info_t *video_info, void *video_driver) @@ -86,6 +96,10 @@ static void *switch_ctx_init(video_frame_info_t *video_info, void *video_driver) setenv("NV50_PROG_CHIPSET", "0x120", 1); #endif + // Needs to be here + gfxInitResolutionDefault(); // 1080p + gfxConfigureResolution(1920, 1080); + #ifdef HAVE_EGL if (!egl_init_context(&ctx_nx->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, &major, &minor, &n, attribs, NULL)) @@ -114,7 +128,18 @@ static void switch_ctx_check_window(void *data, bool *quit, { *width = new_width; *height = new_height; + switch_ctx_data_t *ctx_nx = (switch_ctx_data_t *)data; + + ctx_nx->width = *width; + ctx_nx->height = *height; + + ctx_nx->native_window.width = ctx_nx->width; + ctx_nx->native_window.height = ctx_nx->height; + ctx_nx->resize = true; + *resize = true; + printf("[NXGL]: Resizing to %dx%d\n", *width, *height); + gfxConfigureCrop(0, 1080 - ctx_nx->height, ctx_nx->width, 1080); } *quit = (bool)false; @@ -133,8 +158,7 @@ static bool switch_ctx_set_video_mode(void *data, switch_ctx_data_t *ctx_nx = (switch_ctx_data_t *)data; - ctx_nx->width = 1280; - ctx_nx->height = 720; + switch_ctx_get_video_size(data, &ctx_nx->width, &ctx_nx->height); ctx_nx->native_window.width = ctx_nx->width; ctx_nx->native_window.height = ctx_nx->height; @@ -154,10 +178,12 @@ static bool switch_ctx_set_video_mode(void *data, goto error; #endif + gfxConfigureCrop(0, 1080 - ctx_nx->height, ctx_nx->width, 1080); + return true; error: - printf("[ctx_nx]: EGL error: %d.\n", eglGetError()); + printf("[NXGL]: EGL error: %d.\n", eglGetError()); switch_ctx_destroy(data); return false; From 6d943e10a66cc9ecc8716d6ae30d4c0c3ad59c42 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 1 Jan 2019 02:38:00 +0300 Subject: [PATCH 082/116] Wayland: unbreak Vulkan after fixing HiDPI resizing --- gfx/drivers_context/wayland_ctx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index e65569e967..683c9a12bd 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -1058,8 +1058,8 @@ static bool gfx_ctx_wl_set_resize(void *data, unsigned width, unsigned height) break; case GFX_CTX_VULKAN_API: #ifdef HAVE_VULKAN - wl->width = width; - wl->height = height; + wl->width = width / wl->buffer_scale; + wl->height = height / wl->buffer_scale; if (vulkan_create_swapchain(&wl->vk, width, height, wl->swap_interval)) { From a9a53fdb646cb7755c3a1ebb11fb9ca9584450c3 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 1 Jan 2019 02:43:59 +0300 Subject: [PATCH 083/116] Wayland: create fullscreen Vulkan surface multiplied by the scale --- gfx/drivers_context/wayland_ctx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index 683c9a12bd..4037cc349e 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -1618,7 +1618,7 @@ static bool gfx_ctx_wl_set_video_mode(void *data, #ifdef HAVE_VULKAN if (!vulkan_surface_create(&wl->vk, VULKAN_WSI_WAYLAND, wl->input.dpy, wl->surface, - wl->width, wl->height, wl->swap_interval)) + wl->width * wl->buffer_scale, wl->height * wl->buffer_scale, wl->swap_interval)) goto error; #endif break; From f1e516bfaf51a24c121c102243a25871b8609f59 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 1 Jan 2019 02:53:29 +0300 Subject: [PATCH 084/116] keymaps: define 'x11' and 'linux' on any platform with Wayland Such as FreeBSD --- input/input_keymaps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 9ec77c755a..522f77ae32 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -44,7 +44,7 @@ #include "SDL.h" #endif -#ifdef __linux__ +#if defined(__linux__) || defined(HAVE_WAYLAND) #include #include #endif @@ -848,7 +848,7 @@ const struct rarch_key_map rarch_key_map_x11[] = { }; #endif -#ifdef __linux__ +#if defined(__linux__) || defined(HAVE_WAYLAND) const struct rarch_key_map rarch_key_map_linux[] = { { KEY_BACKSPACE, RETROK_BACKSPACE }, { KEY_TAB, RETROK_TAB }, From a1c15b5362d5808d82c9f43e21563bfb5f014574 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 1 Jan 2019 03:07:20 +0300 Subject: [PATCH 085/116] Wayland: try /usr/local for wayland-scanner/protocols Default prefix is /usr/local on FreeBSD --- gfx/common/wayland/generate_wayland_protos.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gfx/common/wayland/generate_wayland_protos.sh b/gfx/common/wayland/generate_wayland_protos.sh index 8c0cc7f155..0c50161ed3 100755 --- a/gfx/common/wayland/generate_wayland_protos.sh +++ b/gfx/common/wayland/generate_wayland_protos.sh @@ -3,6 +3,11 @@ WAYSCAN=/usr/bin/wayland-scanner WAYLAND_PROTOS=/usr/share/wayland-protocols OUTPUT=gfx/common/wayland +if [ ! -d $WAYLAND_PROTOS ]; then + WAYSCAN=/usr/local/bin/wayland-scanner + WAYLAND_PROTOS=/usr/local/share/wayland-protocols +fi + if [ ! -d $OUTPUT ]; then mkdir $OUTPUT fi From a838582b11420cb028dbe80ab73f8883bc99c0e7 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 1 Jan 2019 03:16:33 +0300 Subject: [PATCH 086/116] udev: support on FreeBSD via libepoll-shim/libudev-devd --- Makefile | 2 ++ input/drivers/udev_input.c | 11 ++++++++++- input/drivers_joypad/udev_joypad.c | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fbc42d7c81..5517dbb810 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,8 @@ DEFINES += -DGLOBAL_CONFIG_DIR='"$(GLOBAL_CONFIG_DIR)"' ifneq ($(findstring BSD,$(OS)),) CFLAGS += -DBSD LDFLAGS += -L/usr/local/lib + UDEV_CFLAGS += -I/usr/local/include/libepoll-shim + UDEV_LIBS += -lepoll-shim endif ifneq ($(findstring DOS,$(OS)),) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index f143a44a30..455c54a1b9 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -14,7 +14,8 @@ * If not, see . */ -/* TODO/FIXME - set this once the kqueue codepath is implemented and working properly */ +/* TODO/FIXME - set this once the kqueue codepath is implemented and working properly, + * also remove libepoll-shim from the Makefile when that happens. */ #if 1 #define HAVE_EPOLL #else @@ -46,7 +47,9 @@ #include #include +#ifdef __linux__ #include +#endif #include #include @@ -1204,7 +1207,9 @@ static void *udev_input_init(const char *joypad_driver) udev->joypad = input_joypad_init_driver(joypad_driver, udev); input_keymaps_init_keyboard_lut(rarch_key_map_linux); +#ifdef __linux__ linux_terminal_disable_input(); +#endif #ifndef HAVE_X11 RARCH_WARN("[udev]: Full-screen pointer won't be available.\n"); @@ -1299,7 +1304,11 @@ input_driver_t input_udev = { udev_input_get_capabilities, "udev", udev_input_grab_mouse, +#ifdef __linux__ linux_terminal_grab_stdin, +#else + NULL, +#endif udev_input_set_rumble, udev_input_get_joypad_driver, NULL, diff --git a/input/drivers_joypad/udev_joypad.c b/input/drivers_joypad/udev_joypad.c index 2841032dda..6146e1e552 100644 --- a/input/drivers_joypad/udev_joypad.c +++ b/input/drivers_joypad/udev_joypad.c @@ -25,7 +25,9 @@ #include #include #include +#ifdef __linux__ #include +#endif #include #include From ac32bff71a10b3ff997301cafe951f88b0664d3d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 1 Jan 2019 03:47:16 +0100 Subject: [PATCH 087/116] (MSVC 2017) Add Glslang --- .../RetroArch-msvc2017-UWP.vcxproj | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj index 4f10a9e7da..85cc79217b 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj +++ b/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj @@ -142,7 +142,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -157,7 +157,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -172,7 +172,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -187,7 +187,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -202,7 +202,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -218,7 +218,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -233,7 +233,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -249,7 +249,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -264,6 +264,7 @@ false + @@ -313,4 +314,4 @@ - \ No newline at end of file + From 556bcc18e41cd5694e62b575f16c0c4da88f7b36 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 1 Jan 2019 03:57:37 +0100 Subject: [PATCH 088/116] Find different ifdef for Windows Phone --- libretro-common/include/retro_timers.h | 2 +- uwp/uwp_main.cpp | 10 ---------- uwp/uwp_main.h | 4 ---- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/libretro-common/include/retro_timers.h b/libretro-common/include/retro_timers.h index 60bf221e36..d5526bc637 100644 --- a/libretro-common/include/retro_timers.h +++ b/libretro-common/include/retro_timers.h @@ -95,7 +95,7 @@ static INLINE void retro_sleep(unsigned msec) SDL_Delay(msec); #elif defined(_3DS) svcSleepThread(1000000 * (s64)msec); -#elif defined(__WINRT__) || (_MSC_VER && _MSC_VER <= 1800) +#elif defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* TODO/FIXME */ #elif defined(_WIN32) Sleep(msec); diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index 496a3750e9..674232172b 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -36,9 +36,7 @@ using namespace Windows::UI::Input; using namespace Windows::UI::ViewManagement; using namespace Windows::Devices::Input; using namespace Windows::System; -#if _MSC_VER >= 1800 using namespace Windows::System::Profile; -#endif using namespace Windows::Foundation; using namespace Windows::Graphics::Display; @@ -266,7 +264,6 @@ void App::SetWindow(CoreWindow^ window) window->PointerWheelChanged += ref new TypedEventHandler(this, &App::OnPointer); -#if _MSC_VER >= 1800 DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); currentDisplayInformation->DpiChanged += @@ -280,7 +277,6 @@ void App::SetWindow(CoreWindow^ window) Windows::UI::Core::SystemNavigationManager::GetForCurrentView()->BackRequested += ref new EventHandler(this, &App::OnBackRequested); -#endif } // Initializes scene resources, or loads a previously saved app state. @@ -370,13 +366,11 @@ void App::OnResuming(Platform::Object^ sender, Platform::Object^ args) // does not occur if the app was previously terminated. } -#if _MSC_VER >= 1800 void App::OnBackRequested(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args) { /* Prevent the B controller button on Xbox One from quitting the app */ args->Handled = true; } -#endif // Window event handlers. @@ -452,7 +446,6 @@ void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args) // DisplayInformation event handlers. -#if _MSC_VER >= 1800 void App::OnDpiChanged(DisplayInformation^ sender, Object^ args) { m_windowResized = true; @@ -467,7 +460,6 @@ void App::OnDisplayContentsInvalidated(DisplayInformation^ sender, Object^ args) { // Probably can be ignored? } -#endif // Taken from DirectX UWP samples - on Xbox, everything is scaled 200% so getting the DPI calculation correct is crucial static inline float ConvertDipsToPixels(float dips, float dpi) @@ -488,7 +480,6 @@ extern "C" { { if (App::GetInstance()->IsInitialized()) { -#if _MSC_VER >= 1800 if (fullscreen != ApplicationView::GetForCurrentView()->IsFullScreenMode) { if (fullscreen) @@ -496,7 +487,6 @@ extern "C" { else ApplicationView::GetForCurrentView()->ExitFullScreenMode(); } -#endif ApplicationView::GetForCurrentView()->TryResizeView(Size(width, height)); } else diff --git a/uwp/uwp_main.h b/uwp/uwp_main.h index 8f1f123561..623d922161 100644 --- a/uwp/uwp_main.h +++ b/uwp/uwp_main.h @@ -38,9 +38,7 @@ namespace RetroArchUWP void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ args); void OnResuming(Platform::Object^ sender, Platform::Object^ args); -#if _MSC_VER >= 1800 void OnBackRequested(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args); -#endif // Window event handlers. void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args); @@ -51,11 +49,9 @@ namespace RetroArchUWP void OnPointer(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args); // DisplayInformation event handlers. -#if _MSC_VER >= 1800 void OnDpiChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); void OnOrientationChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); void OnDisplayContentsInvalidated(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); -#endif public: bool IsInitialized() { return m_initialized; } From 48d82929ff2da7704fbfa626414762606e4af7c6 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 1 Jan 2019 14:47:41 +0100 Subject: [PATCH 089/116] (UWP) Add support for loading cores from optional packages --- core_info.c | 38 +- libretro-common/include/lists/dir_list.h | 17 + libretro-common/lists/dir_list.c | 46 +- menu/menu_displaylist.c | 23 +- pkg/msvc-uwp/.gitignore | 3 + .../Assets/LargeTile.scale-100.png | Bin .../Assets/LargeTile.scale-200.png | Bin .../Assets/LargeTile.scale-400.png | Bin .../Assets/SmallTile.scale-100.png | Bin .../Assets/SmallTile.scale-200.png | Bin .../Assets/SmallTile.scale-400.png | Bin .../Assets/Square150x150Logo.scale-100.png | Bin .../Assets/Square150x150Logo.scale-200.png | Bin .../Assets/Square150x150Logo.scale-400.png | Bin ...x44Logo.altform-unplated_targetsize-16.png | Bin ...44Logo.altform-unplated_targetsize-256.png | Bin ...x44Logo.altform-unplated_targetsize-48.png | Bin .../Assets/Square44x44Logo.scale-100.png | Bin .../Assets/Square44x44Logo.scale-200.png | Bin .../Assets/Square44x44Logo.scale-400.png | Bin .../Assets/Square44x44Logo.targetsize-16.png | Bin .../Assets/Square44x44Logo.targetsize-256.png | Bin .../Assets/Square44x44Logo.targetsize-48.png | Bin .../Assets/StoreLogo.scale-100.png | Bin .../Assets/StoreLogo.scale-200.png | Bin .../Assets/StoreLogo.scale-400.png | Bin .../Assets/Wide310x150Logo.scale-100.png | Bin .../Assets/Wide310x150Logo.scale-200.png | Bin .../Assets/Wide310x150Logo.scale-400.png | Bin .../Package.appxmanifest | 23 + .../RetroArch-UWP-cores-nonfree.vcxproj | 230 ++++++ ...etroArch-UWP-cores-nonfree.vcxproj.filters | 100 +++ .../cores/ARM/.empty | 0 .../cores/ARM/cores/.empty | 0 .../cores/ARM64/.empty | 0 .../cores/ARM64/cores/.empty | 0 .../cores/Win32/.empty | 0 .../cores/Win32/cores/.empty | 0 .../cores/x64/.empty | 0 .../cores/x64/cores/.empty | 0 .../RetroArch-UWP-cores-nonfree/dummy.cpp | 5 + .../RetroArch-UWP.sln} | 34 +- .../Assets/LargeTile.scale-100.png | Bin 0 -> 5183 bytes .../Assets/LargeTile.scale-200.png | Bin 0 -> 10373 bytes .../Assets/LargeTile.scale-400.png | Bin 0 -> 24747 bytes .../Assets/SmallTile.scale-100.png | Bin 0 -> 1425 bytes .../Assets/SmallTile.scale-200.png | Bin 0 -> 2535 bytes .../Assets/SmallTile.scale-400.png | Bin 0 -> 4838 bytes .../Assets/SplashScreen.scale-100.png | Bin .../Assets/SplashScreen.scale-200.png | Bin .../Assets/SplashScreen.scale-400.png | Bin .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 2631 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 4927 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 10016 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 398 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 4285 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 942 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1199 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 2350 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 4312 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 541 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 6051 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1320 bytes .../Assets/StoreLogo.scale-100.png | Bin 0 -> 1058 bytes .../Assets/StoreLogo.scale-200.png | Bin 0 -> 1886 bytes .../Assets/StoreLogo.scale-400.png | Bin 0 -> 3394 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 0 -> 4734 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 9276 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 0 -> 20707 bytes pkg/msvc-uwp/RetroArch-UWP/Bundle.Mapping.txt | 2 + .../RetroArch-UWP}/Package.appxmanifest | 6 +- .../RetroArch-UWP/RetroArch-UWP.vcxproj} | 654 +++++++++--------- .../RetroArch-UWP.vcxproj.filters} | 258 +++---- .../RetroArch-UWP_TemporaryKey.pfx} | Bin pkg/msvc-uwp/RetroArch-UWP/cores/ARM/.empty | 0 .../RetroArch-UWP/cores/ARM/cores/.empty | 0 pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/.empty | 0 .../RetroArch-UWP/cores/ARM64/cores/.empty | 0 pkg/msvc-uwp/RetroArch-UWP/cores/Win32/.empty | 0 .../RetroArch-UWP/cores/Win32/cores/.empty | 0 pkg/msvc-uwp/RetroArch-UWP/cores/x64/.empty | 0 .../RetroArch-UWP/cores/x64/cores/.empty | 0 uwp/uwp_func.h | 2 + uwp/uwp_main.cpp | 32 + uwp/uwp_main.h | 2 + 85 files changed, 1009 insertions(+), 466 deletions(-) create mode 100644 pkg/msvc-uwp/.gitignore rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/LargeTile.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/LargeTile.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/LargeTile.scale-400.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/SmallTile.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/SmallTile.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/SmallTile.scale-400.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square150x150Logo.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square150x150Logo.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square150x150Logo.scale-400.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.altform-unplated_targetsize-16.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.altform-unplated_targetsize-256.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.altform-unplated_targetsize-48.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.scale-400.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.targetsize-16.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.targetsize-256.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Square44x44Logo.targetsize-48.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/StoreLogo.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/StoreLogo.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/StoreLogo.scale-400.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Wide310x150Logo.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Wide310x150Logo.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP-cores-nonfree}/Assets/Wide310x150Logo.scale-400.png (100%) create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Package.appxmanifest create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/dummy.cpp rename pkg/{msvc/RetroArch-msvc2017-UWP.sln => msvc-uwp/RetroArch-UWP.sln} (50%) create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-100.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-200.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-400.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-100.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-200.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-400.png rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP}/Assets/SplashScreen.scale-100.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP}/Assets/SplashScreen.scale-200.png (100%) rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP}/Assets/SplashScreen.scale-400.png (100%) create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-100.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-200.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-400.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-100.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-200.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-400.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-16.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-256.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-48.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-100.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-200.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-400.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-100.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-200.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-400.png create mode 100644 pkg/msvc-uwp/RetroArch-UWP/Bundle.Mapping.txt rename pkg/{msvc/msvc-2017-UWP => msvc-uwp/RetroArch-UWP}/Package.appxmanifest (95%) rename pkg/{msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj => msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj} (96%) rename pkg/{msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters => msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj.filters} (89%) rename pkg/{msvc/msvc-2017-UWP/msvc-2017-UWP_TemporaryKey.pfx => msvc-uwp/RetroArch-UWP/RetroArch-UWP_TemporaryKey.pfx} (100%) create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/ARM/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/ARM/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/Win32/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/Win32/cores/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/x64/.empty create mode 100644 pkg/msvc-uwp/RetroArch-UWP/cores/x64/cores/.empty diff --git a/core_info.c b/core_info.c index d7ea70ed91..c356eb7a47 100644 --- a/core_info.c +++ b/core_info.c @@ -32,6 +32,10 @@ #include "core_info.h" #include "file_path_special.h" +#ifdef __WINRT__ +#include "uwp/uwp_func.h" +#endif + static const char *core_info_tmp_path = NULL; static const struct string_list *core_info_tmp_list = NULL; static core_info_t *core_info_current = NULL; @@ -232,11 +236,31 @@ static core_info_list_t *core_info_list_new(const char *path, core_info_t *core_info = NULL; core_info_list_t *core_info_list = NULL; const char *path_basedir = libretro_info_dir; - struct string_list *contents = dir_list_new( - path, exts, - false, - show_hidden_files, - false, false); + struct string_list *contents = string_list_new(); + bool ok; + + ok = dir_list_append(contents, path, exts, + false, show_hidden_files, false, false); + +#ifdef __WINRT__ + /* UWP: browse the optional packages for additional cores */ + struct string_list *core_packages = string_list_new(); + uwp_fill_installed_core_packages(core_packages); + for (i = 0; i < core_packages->size; i++) + { + dir_list_append(contents, core_packages->elems[i].data, exts, + false, show_hidden_files, false, false); + } + string_list_free(core_packages); +#else + /* Keep the old 'directory not found' behavior */ + if (!ok) + { + string_list_free(contents); + contents = NULL; + } +#endif + if (!contents) return NULL; @@ -430,12 +454,12 @@ static core_info_list_t *core_info_list_new(const char *path, core_info_list_resolve_all_firmware(core_info_list); } - dir_list_free(contents); + string_list_free(contents); return core_info_list; error: if (contents) - dir_list_free(contents); + string_list_free(contents); core_info_list_free(core_info_list); return NULL; } diff --git a/libretro-common/include/lists/dir_list.h b/libretro-common/include/lists/dir_list.h index 4babb02d39..d1d61d9be5 100644 --- a/libretro-common/include/lists/dir_list.h +++ b/libretro-common/include/lists/dir_list.h @@ -29,6 +29,23 @@ RETRO_BEGIN_DECLS +/** + * dir_list_append: + * @list : existing list to append to. + * @dir : directory path. + * @ext : allowed extensions of file directory entries to include. + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively + * + * Create a directory listing, appending to an existing list + * + * Returns: true success, false in case of error. + **/ +bool dir_list_append(struct string_list *list, const char *dir, const char *ext, + bool include_dirs, bool include_hidden, bool include_compressed, bool recursive); + /** * dir_list_new: * @dir : directory path. diff --git a/libretro-common/lists/dir_list.c b/libretro-common/lists/dir_list.c index fc360f748b..10d73a50d5 100644 --- a/libretro-common/lists/dir_list.c +++ b/libretro-common/lists/dir_list.c @@ -230,6 +230,42 @@ error: return -1; } +/** + * dir_list_append: + * @list : existing list to append to. + * @dir : directory path. + * @ext : allowed extensions of file directory entries to include. + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively + * + * Create a directory listing, appending to an existing list + * + * Returns: true success, false in case of error. + **/ +bool dir_list_append(struct string_list *list, + const char *dir, + const char *ext, bool include_dirs, + bool include_hidden, bool include_compressed, + bool recursive) +{ + struct string_list *ext_list = NULL; + + if (ext) + ext_list = string_split(ext, "|"); + + if(dir_list_read(dir, list, ext_list, include_dirs, + include_hidden, include_compressed, recursive) == -1) + { + string_list_free(ext_list); + return false; + } + + string_list_free(ext_list); + return true; +} + /** * dir_list_new: * @dir : directory path. @@ -249,24 +285,18 @@ struct string_list *dir_list_new(const char *dir, bool include_hidden, bool include_compressed, bool recursive) { - struct string_list *ext_list = NULL; struct string_list *list = NULL; if (!(list = string_list_new())) return NULL; - if (ext) - ext_list = string_split(ext, "|"); - - if(dir_list_read(dir, list, ext_list, include_dirs, - include_hidden, include_compressed, recursive) == -1) + if (!dir_list_append(list, dir, ext, include_dirs, + include_hidden, include_compressed, recursive)) { string_list_free(list); - string_list_free(ext_list); return NULL; } - string_list_free(ext_list); return list; } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index cc742f2ce6..19d752cdd4 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3609,6 +3609,7 @@ static unsigned menu_displaylist_parse_cores( unsigned items_found = 0; settings_t *settings = config_get_ptr(); const char *path = info->path; + bool ok; if (string_is_empty(path)) { @@ -3619,9 +3620,29 @@ static unsigned menu_displaylist_parse_cores( return items_found; } - str_list = dir_list_new(path, info->exts, + str_list = string_list_new(); + ok = dir_list_append(str_list, path, info->exts, true, settings->bools.show_hidden_files, true, false); +#ifdef __WINRT__ + /* UWP: browse the optional packages for additional cores */ + struct string_list *core_packages = string_list_new(); + uwp_fill_installed_core_packages(core_packages); + for (i = 0; i < core_packages->size; i++) + { + dir_list_append(str_list, core_packages->elems[i].data, info->exts, + true, settings->bools.show_hidden_files, true, false); + } + string_list_free(core_packages); +#else + /* Keep the old 'directory not found' behavior */ + if (!ok) + { + string_list_free(str_list); + str_list = NULL; + } +#endif + { char *out_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); diff --git a/pkg/msvc-uwp/.gitignore b/pkg/msvc-uwp/.gitignore new file mode 100644 index 0000000000..c7d7d6c4da --- /dev/null +++ b/pkg/msvc-uwp/.gitignore @@ -0,0 +1,3 @@ +AppPackages/ +*/BundleArtifacts/ +.vs/ diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/LargeTile.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-400.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/SmallTile.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-400.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square150x150Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-400.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-16.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-16.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-256.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-256.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-48.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-48.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-400.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-16.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-16.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-16.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-16.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-256.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-256.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-256.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-256.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-48.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-48.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Square44x44Logo.targetsize-48.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-48.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/StoreLogo.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-400.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/Wide310x150Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Package.appxmanifest b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Package.appxmanifest new file mode 100644 index 0000000000..c4a89d6664 --- /dev/null +++ b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Package.appxmanifest @@ -0,0 +1,23 @@ + + + + + + RetroArch: non-free cores + libretro + Assets\StoreLogo.png + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj new file mode 100644 index 0000000000..99539b2ed8 --- /dev/null +++ b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj @@ -0,0 +1,230 @@ + + + + {cc7b9a23-bd64-4eb9-9d8f-f5115fb8960f} + RetroArchUWP_cores_nonfree + en-US + 14.0 + true + Windows Store + 10.0.17763.0 + 10.0.15063.0 + 10.0 + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + Application + true + v141 + + + Application + true + v141 + + + Application + true + v141 + + + Application + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + + + + + + + + + + + + + + + + + + + + + + + ..\RetroArch-UWP\RetroArch-UWP_TemporaryKey.pfx + False + False + Always + x86|x64|arm + 1 + OnApplicationRun + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + /bigobj %(AdditionalOptions) + 4453;28204 + NotUsing + + + + + Designer + + + true + cores\%(Filename)%(Extension) + + + true + %(Filename)%(Extension) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters new file mode 100644 index 0000000000..9834a81c26 --- /dev/null +++ b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters @@ -0,0 +1,100 @@ + + + + + 56304c12-6031-4556-a470-2c69aecd5919 + bmp;fbx;gif;jpg;jpeg;tga;tiff;tif;png + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/dummy.cpp b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/dummy.cpp new file mode 100644 index 0000000000..935c25a93c --- /dev/null +++ b/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/dummy.cpp @@ -0,0 +1,5 @@ +[Platform::MTAThread] +int main(Platform::Array^) +{ + throw ref new Platform::NotImplementedException(); +} diff --git a/pkg/msvc/RetroArch-msvc2017-UWP.sln b/pkg/msvc-uwp/RetroArch-UWP.sln similarity index 50% rename from pkg/msvc/RetroArch-msvc2017-UWP.sln rename to pkg/msvc-uwp/RetroArch-UWP.sln index 30fad3eb7a..29d683556e 100644 --- a/pkg/msvc/RetroArch-msvc2017-UWP.sln +++ b/pkg/msvc-uwp/RetroArch-UWP.sln @@ -3,20 +3,25 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28307.168 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-msvc2017-UWP", "msvc-2017-UWP\RetroArch-msvc2017-UWP.vcxproj", "{F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-UWP", "RetroArch-UWP\RetroArch-UWP.vcxproj", "{F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-UWP-cores-nonfree", "RetroArch-UWP-cores-nonfree\RetroArch-UWP-cores-nonfree.vcxproj", "{CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|Any CPU.ActiveCfg = Debug|Win32 {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM.ActiveCfg = Debug|ARM {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM.Build.0 = Debug|ARM {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|ARM.Deploy.0 = Debug|ARM @@ -29,6 +34,7 @@ Global {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x86.ActiveCfg = Debug|Win32 {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x86.Build.0 = Debug|Win32 {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Debug|x86.Deploy.0 = Debug|Win32 + {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|Any CPU.ActiveCfg = Release|Win32 {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM.ActiveCfg = Release|ARM {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM.Build.0 = Release|ARM {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|ARM.Deploy.0 = Release|ARM @@ -41,6 +47,32 @@ Global {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x86.ActiveCfg = Release|Win32 {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x86.Build.0 = Release|Win32 {F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}.Release|x86.Deploy.0 = Release|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|ARM.ActiveCfg = Debug|ARM + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|ARM.Build.0 = Debug|ARM + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|ARM.Deploy.0 = Debug|ARM + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|ARM64.Build.0 = Debug|ARM64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|x64.ActiveCfg = Debug|x64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|x64.Build.0 = Debug|x64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|x64.Deploy.0 = Debug|x64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|x86.ActiveCfg = Debug|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|x86.Build.0 = Debug|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Debug|x86.Deploy.0 = Debug|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|Any CPU.ActiveCfg = Release|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|ARM.ActiveCfg = Release|ARM + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|ARM.Build.0 = Release|ARM + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|ARM.Deploy.0 = Release|ARM + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|ARM64.ActiveCfg = Release|ARM64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|ARM64.Build.0 = Release|ARM64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|ARM64.Deploy.0 = Release|ARM64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|x64.ActiveCfg = Release|x64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|x64.Build.0 = Release|x64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|x64.Deploy.0 = Release|x64 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|x86.ActiveCfg = Release|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|x86.Build.0 = Release|Win32 + {CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}.Release|x86.Deploy.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..f73146308640b5db3c360c1fc28195303821cd46 GIT binary patch literal 5183 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..80c1425605f951b417501dd89c5330028595dc5d GIT binary patch literal 10373 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..85140caac238ad74f1a97fccb245d4b30c054e5f GIT binary patch literal 24747 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1f5dc6a891b07f208b81f37478cf884905a2b0 GIT binary patch literal 1425 zcmV;C1#bF@P)pKLrFwIRCt{2n>k1{Nf?Gpr!&!wHQ7kbTpW!(Qbl1S1A|>qJfa`Z z&@&X3%|wJvJTnnARl!Uh`Nc$yOcb+Sk8HHJ-&(6F+n%qhrZ1IxV3?YjKB}Is`s(N& zix~=HrJaG#jFCfNlkwXwDr>?H<7t6B#EGa4ZHHi!*fo3zlmG^INZ)c;UqpZBVoLydC zvhD3{_WJtDN=r-Q$}%UhW;Hf8#@5!>SXEUOo1UKLS3Z}^1@2c}UG0jwy}e~aLqqKG z@zMP~PC<#uL4ig_M%c#22LC)iKhOI5`q=gLb-{fgW_fv;i^2YLb8}pf0JR6iC8#Jl zO-)U1`t0oN-IW9=6bdAe)2Kb&-QD~<6dX+qD|3E8p4j)~klBTW1vi6jZEYX6L7_w;RF4$|j#ucI$OlAtYtYoxlq(l;>;C>; z>0APBIra7RZW_Vy;o*T_dCU6$P{@o3yh(v`mX($98YBza-`{7Qot-?5-fn$;onPA0sjaPb)5pih{N1)~me1$8plmk#t{Fj~7X)Q_n;;NpyiFJT<2VA;s-2x3o)&`S z?jHF@K3`s5lm%(a>FDTi({jOuAjBJ))zwuu(*net@$qrxb7KFcrKNY@LB`_ZqWc-O z72C-{dUJD=_4oI?+lzdv3eu7zUoBio5hMjTanemnAjcyi2zkT{`4)LcEmRexB}a}o zqD%EQkF?| zVh-gMl*W9j5V}E^LVNn)C+M??5s0ZoSc+QD@e0B;qNk_FcRO6knVFe)BWcW&yi*Sf z)C3$ufaX0hG4WwCDoCYS$;g8I=2@VkqT+)Xbfex$qzdR|FkuBa9>zUgU0uayzu*F! zOsHkjLNN%48Y7QNA+Q)R06h={i6)Hn%E}7s?d>fp-ztP&LoOr;UArvCZ*g1~><=Mg ztO8M3w!rss5Xl0&EC^{-f6)X$P>fIo`$NRu-k$p%E&#??Q3PNwk==a|g0NQWod=;w z=mcO2)Ic;P)F6Qf)+&Njn-qxj){N+#<*lq`Z20>xOfLQO9e+EHei2Xr=v;>8% zH6W3vERq%!g&2_7BPdA;ib@Pf^qIi81w|uo;T!Nw&15$aKG-^R{hykfRY8#cH zxWoWbj&0jN<2-p-K@sHbhWe3|lh5b3Ez3H?pGCvwq7Z3~gPaS0?v!tl+J=;Ket!P1 z^OnWGXoLPN8iu#Epb{suA07z_y4hbOHxP4iaq$neky6Z2`Gfj*#QgVxz{nvmatMqZ f0wagO$RYR-pL!m0+cb6#00000NkvXXu0mjfHSwLy literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2057c7580188134ff05a155b82e37689e50715 GIT binary patch literal 2535 zcma)8c{JPEAEin#jipJoNF%7FmZ%CsGa3X*$ztnR+o3W=5vld7wpJ^WPVHezWmN4; zXOz}jZSADR*p6isA=IEqOBu{e`rq$&e&@{j{c+#tynEj}@7#CpAD2lX*@2~%q(wwT zzyv(bNjOu#LQ+DwE+3wg6b`9SynC34h)l;s`*;cV_>GCG@17_EF?TFdY`~u{&iMWzRFwf!n*ht*@r$xd_x0^omz9@PwQQHy z=Vl}ZznGQR*siZi+pDZ>Y2J@J!(D(!Z99?^wp}C0L|p_9TeWr?F?N?HCl6($6ryoQ zyHwS*W#ldCDUvK}90jI!=f9-t`$i@vI~~2fy)o1L<7QW1#mCLAM_!%O8)2cdva+tt zw#Du1$2J)pD1xs}Yv;HXjRlHBAdolx{ry+x2eZMhvK!Fc|EZ$C4kPRPoWRod{`Y89x7Gr__20>I4-40L_C4Y;#)$ zdfH)Ji!VPuGpMp_qX3Ox|7Zmym2w}d=Fj8VPg7E!vh;Sp8h{3{>9(FOOCp9 zq*r62tn^cl`1PshbAKJ~-&^aL?_eZ7u}gdE@z>g9-JB4+N2#j&^LZXjBU96pzqbNL z6OHt1vx3RV$+>s=rj}(R^yb5@t*yDy3gM`sN~j^I$JbYx;dF5Ei;8pw^&L?*4N1)yG5clV49`{mcM?A2}O+ ziPJ!v^_W>o1}oPOi{SDYvMM|JRY{oV5Ktk(Dl1}bqPC4+?xr!gJos}>&^Oe9w{NQh z;i5b9A7@&owkwfj{VvhoD9Xc@sEv=FsnisiluM;-iGa-Gg2VqpBPzJE%f@+yyn%uXWyBm++2)=Ui_A;b z4Y!1jrh=E)wvIM{G-SDx33++u{6LLo!_DpRUy(ZY4CL7dcMP+mM@4&YKN}}bagag} z`OzUI)>;Y!Hk{7W-=b&ST%9ZmeS z;>5A)B(N0HR4#tpzd(T3uVi`^v#=6g6!#1e?}GrwzU32nD_4L%2|B@n>dS>Jd{_*y zGAeo9+5)|`I<%H4r)U=~f)9&DCYV;}bcHbH10w9CWydEEa zW!lT8OBA_CN0Qzj*n(stxjFg|`e;y{L1s~wmhK?a*ArgGJC-;5;k6NxsGhfsV{)^! zgtW7e#tZV%7b4ewZL()0f<+8<$Wzgz)+VQk%$^GL@PXzfNH>k=cRI|4Q@sT{ovtBJ|TNVt0owOjIl1mTVw$X(FkLePQF`FG6OTJ9`Vl4TwH}>L(9$61cR1M`k1Y zs(ppaR4XUWwQsKT&hSl((ZhMV&X1VtFRdNc90_z*GjXUBrfuL3q)L&#UJ6QD4{zaZ zoOv#h3ef4bYcn4@sGJ2HY{~Sm#PTGv=R`LX{g!s{#?>1wueDNZ>x6kKfUWY%BiXyR zt1vyyU&Rg^&Nc5xc4=^NkSrXfvmnfA&Q2*Db}>G-a4?|D(A`vOm3Isb7B{%kDw&g$ zgIhJK9nbn=m|YZ_3A5&0uF}XXV@7q<;bSby93DM@+4BQP^zU|Aq7U1IHSfWo40``yJdi-!GOMCY@iSmWFvt%iPi*JR2VWNDtV| zcvwdMS;mEP1i()9*~BMaclKJ65>li%mFY-&N9{4`pWV(9IhLeA7bS;;%m^D^$IUGQ zEI6rjvHO8Cb3;9$W9U^Cql#6Wt=Qzy4UGONU4Q8Qo%!8xeQ+ZBCu(?1jQLi=rrs7p z#q$O6^Y0HSQ!XJ+KoKZaJBgq+664$0?D)_|l%N_m^%=u97kyp$gO!?$C}QqcSO zTJ>gLbZf+ogrr6^5yRy>yUZ<6U8cMRW3gz$@?eVnflM~>NDPonHX&We87)2bYlncf_=@f12cRt|* zeEX6y~#lp9KQdL;y<{B8-+1dtuw4X`^mb zO;EJuAx7`L8*AI-&ua2_ttK81f)i;MPo zg=2JIemLGkZ?ne*lCFV7n2P^b(-Ag-t&8>&5yKNu;()NHi4bf^xTjX%-+6LN`jm|L He=`37k9VlH literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..398721a4614d8cfb708b8b951b09af10501a95e0 GIT binary patch literal 4838 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-100.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-100.png rename to pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-100.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-200.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-200.png rename to pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-200.png diff --git a/pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-400.png similarity index 100% rename from pkg/msvc/msvc-2017-UWP/Assets/SplashScreen.scale-400.png rename to pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3b57758c64775b3927dd31489f14807d0484f5 GIT binary patch literal 2631 zcmb`J`#%% zIHYqd*AY=klFK56_~t(OuJ2!Pe)#_Iem_6&&*SrceBO`u<8yiCxVzcQN~uc$003D> z2V10og+EL}OyJFhqUHpUjCAn+1ptuy=Z6XPM$}#x%>St&(?s@SXbf&xGe z6?bD^ENBa94Num{g)35&MByF@Xi15sZpjlPwx<)afs({K*%(PNpK^cI<5hQs6|O** zWa73`@qHi7_uGpj;^MXrX>LKoi|lKQttK-m9ou24w%LFKulTe(k{k%c9SRZtcff)| z4)!+7Wn^TMI-8ol5>{9_$%Rnwjim7K@Y{lIzzIyA#h3rQd|O zm@C>oMt@H6_n*1E61SgDHhr9Z4i5j8%!dO9ztxeqvJ>%jm*)Q%O@OA}D=Fb~nk@pD zMxLC@0qdE_Bi7~@`I?kZ&7Xz>p|7%d6eNK|-dQhp6uE@gcE_Aml_Xvk7Z;SJ{dZ?QAQs|3^rm8@Lb7hxkXd zPL0wrjFPRumA5UWS$R{f5r`F%L56Aw_x`!j#w#7b&hH<&4}uqmONSSHT5fs8d>kqc z-dvs_rNj&T(sW1s=vcLLCjAt!0lPR-PI>j%7evm@<*#k38lY{9U{{E&&`F5py`2Uo z^Xy}kva<3hhXg`cJxx8dyui*-mDaSl-E5Me0F@L|k6xL1>K|&PJ&~h)3Ya77*Ohcs z%PgkWBvIdnW)RFYinPzu%n6@vZ&`|0i*#hmfh{%3d3m??MQ5qV(>7GW5&*s~d4J2U z$k5;K8=~)s&~PatDAp+c%bQW}Td~&q(9D~6AegWC^#1;SHvoB(t|7W}xy(Fg^&LAP z&`7&r^%p?K=Kl8DB1Bh!TrLmU44^=22!YifA^-LqWfc z-pq0Cxfn6ib!L3{eP`k$-e6Hk>K__!bng|%;AhtwacpF8-B^0UnUyDswLdSL#|T;I zDT_clD@6_&S@K}ut$)PaI2kD4*6=Ie%uJWo=X*W2jpIe|U&jhHJYTRHQ)`xxa)I5@ z{k_f4HqqDEuX)@iojeNVQCWwFKXDG#&@9`KN4-lJrb$2Xduff6U=yLFyW&B>_Ghf} z^71wQ7aLd*{+j8F6~_;P`oO8fG=r5A-@e-F4u>JaFO_D@@hy8jKou|gB${5}C)b5w z&`w}{QuMAZdw~U7n8n zJ6eL7){GnO86YuYVg|ihcl1~E4A=U+#983zYeXpf&$$L&YV<`#dT>&;&S{KaQta}0 z9VPMlvEDqbmwxB~WzD&H6*t95IMFsteHxz*XA_@$TRXu{;R|vYF?#Gsy=hcTkW89e zBP0r~B*`wx_A>1nV}?!|&nLN;j&eFC;}LV9pXK~D{C z4j;(DP{3BOcX_LDmzRA?(z?9cd*AA|EWAy?X*kniS0brE)ju$-Dx4KIb>k7D<>Z-R zr-uu-zaBpjt82etAh}>%+S0>uA~CFgm#q%Qf3MdVG8LE8bZ`yOeb$h<{RydYGpf+F zhcn>wGOF+LfDqFqN|8Y%PK>*-*A_V5rV6SC23?Q|Dk!KJqK`%=oe3)n4R$n}qyX_;D{EZXCGqAY?T1DIP6AWAJ5swys)U_b{q=W0i+$Lrhj)uOV<1|b| z6_!0Nr@opXb^!VExj1~9^ITbolQrX-osl#9!+zt9ECawBD^6p+@vqV!&g6Z<%y zr%3Z5C0>qpPtDox2J|9Rp*cB~i-QCFd7nts8(N<0i>!u-^YpF?cziGlt#9nyXgqTs z6(;0BNFPF!-pOsD^F-z>qukA)K1t)pcr^;?jsy|V9PqZ*_x>JRw$2JXntNR|D zgYZu{4Rjc&rs=OG;U}KmKDMOM({Gkc(6Tp^)s97|MsS3kVEG?CRQkOFr`!casYb(E(QAHY?G1p#iVF`tW^U1QWp1zf`bIZLG$oMen+XafI`oDf021 zj21zB00vhHw}7PGVTTenP-`|HB6wx#Pj4Ua0@YdT zaD-!NbT?%BbK;R@2xhuUm<*KOfnl_&g~_1*4JxtV3S8V-C4;h>L)L_%AUM2c#=3;( za=B!A8JTvMH$cpmW*;%W3@KgBB-t$RRx)cxyEE^db;s=iX zMppYgwR1MSQj1ZGY^zg(6MbTj$zZJ6zhou-teQ;P{_t)aeJ0Z` zrL?T1p-jk5!cKChIi?GFLHnDyk_dDc{!;qIY1&24}*O8e3xi>FMcl z;eVU>@ZrPadfE3_=%kZx7{>LlXY|z!wF`SB@JK-AjZjvI1!Yrv$wZ3paBwXnKiis_ gEuljCw>T6&YQuMvAS{mwlp(;;&ds*b=4!@&0VfINCIA2c literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..22ebaab85605ef29271f142d9a8d8a21feabadb0 GIT binary patch literal 4927 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 Xa`akhB4G}E@&>zTY=J2{M~M7C5;-IJ literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b34622f9b3af1587b655a5b3dbc74498fba5e9 GIT binary patch literal 398 zcmV;90df9`P)pGKuJVFRCt`FlCg?|KoEwdo0T$FieEN zha+H6*L5N?41=z_u1n{q(`o()X_}Hu2*J#^o6*OkpdSPQG))7m)#|YVyrd*ah`_dO zA{sB%_kEH8*BFLb?!x(eCLI|1OxI9^oj|)4&jQ9ux~`i*=ERGDImn!t0`N_5x7*MA s;CNB@Hoz`z+a4zs3=imQshYp+7hz0^jHaH33;+NC07*qoM6N<$f)~fK-T(jq literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..22c0960e8ddfa8c9136bd4f6463edd84dfd7cd1c GIT binary patch literal 4285 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∨riwqg4xA*Z^HAELBRcN7O9%_;A+NEEd@<{UXh1GZECL}Q?649}IS-x9}(D08-DGHwWT52GHWr@4qKE8ccZ2<22P8C=%zWKgqH{KFD;fP@i_-ejE{xYgG-uDfK9?}luK4mN z85uH^j~J?bs40H6`)%56?1t!@L0|TcMu~TL^sro+0=`mn8tg;F_uh6_kaq&9ixyq% z9f+8VxX=}>8XLSZd-e%^OX5u&U2_bMC7zZxnUK(VQ)(B-c{_Qf*QW6+C+h}s>Vh$F zF@^UO^Up<{FWdI6Bgc}r&M$PHsLI)I%OBgcddGTh9#KZ(|ZGXQAK#s3K;9bdq{R} zC45i!#Zc$ZdnW24v$`$e`_V!;?Df;OEQ+J&b1$Bul(l|8yJXX{!Nxm%K8pf(58Fan zn6eAbNAXedl+3wNOQgy8_}|fwwr$u7+c&+USG=i7wO9GB=qRYl*g`FmoaTvy2OO%u z`UdBMdAB~-iws+AU!x(?=Qn4}vk?z+QOS&a{`(s!yCeas>Bw?CNZPMXwJ7E*g$}vr zWRw;C(1a^~u!NV%OK4@#CGWhT_2ws9!666nm=iY4b5jD;Z#eKYa;mUEul;1aO~Z8) zx1!qJpT;cVh3f0^z=1U@D3{iZq<34cHV1uiPQF=q?d-}BI_p)us99?dnzS8keoWn7fLE3tSscL&H!>sHXPrE&>XYr9m+-ezq@A21C2mD-oG)gQLejkZw?*Jix#z zZUYWy9C=7{(;pj)C8r0w^C~aG7Zy0jHz$8Kq98E8&aBBLr9 ztRSE@ruBhZeJM2_6}G6zolH@aRi(tJ&be5jBQ3-u$ti=CMISH|U%8!R$DozY>Bx6i zq|nUDOU#_h3l0DlwhxY1Uyc_BESB{4_R4OrRuLL=e-3ZW&CTS_jt;AB(Sv7+JK-8y z!hj!$Z(XdxE2CBv;oq-!$x{r7)0ceLw)Lt|4dk0lzggcGf3to_t|*&13#S)CqRC8B z1KEIV%;;^ga(Bgn5LPy!VEu~vitNi_nT*be;o+Ll@mmWE3%7oVV=R0_N<;22TUrtp zGJ);d>ZA)nH0h-|GHO`A{I$+hkk9v|mOMgFvs>T3eXGInp6y(@zwn?+@ce_xGnG$Y zM#Wa8@X@&d;O%F QpIU`a$lRCt{2nZ0WwK^Vrz#8&?RtGffER>u*0wH9q7S{;a{4QMN< zoffvDLbyV~bP=pYuJoh0PAslV`lR*a_8BtEx;L}mW=-&cMR#U)=Ka0%&eyJ&d~kW) zHo&gV0B-AZ0z{+H@4MaZ-sAE7cyEJvl5Ck=TwGKai^Wu(#|7AKw=L;`lQ15VY)MEz zU!?1sI*$wR_Q0v>D=+bLj)9M)Gl1JV1Gud-0F+E7Nh*~h(n?9X-L7WYOeRC(@i-X_ z24p&&5^1%!)wUx59qSu;P=;%S&4jj)hRUTqgZ~ zpH!<=^8EZvmdoWqelQr60q^ea$m{DXO}7i73xI|@oeuR{p-{j!gQho|O>FwO&!9Xr zP${3!N3Y>mfFlBd0Bvu*UfTn>zP_f70s!8E01*m>Xu3#d@)C&zsZ=U* zPhc#e{#YzV+htC(3;-c!AwXPRT~QA~@Ydtwqg?*s;X$*$d_FJtPA-=t>2#U`p+1Bc zAOMifW+{ZUm8NAy5V`;?OyCJ7gcZ}v%gaHYo=}znD4#FujWp|H^FD-WQ!Tw|(=-6YAW(6m z(U8;qe!n~@k%!e(4X76Kd%Yh0j{%B>&5jIj=G5VYd*$5SZnt%fhcGE1&ReY(4H^6z ziF?sz&(v;|L14ASHUJldP~e4wNB~8sA)Md@<;{fSZ|1B*IQ?4XFA;nZF(R`N zMvRy0`ol{X0sNG%d-9GDT9WGcEkXX`<#7Stz6SpHLG2WEemm{9&H!%fAEMHD^b5`o QUH||907*qoM6N<$f}z~7)Bpeg literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7216b8d86dd82df8996b911bc32178a5fe3902 GIT binary patch literal 1199 zcmV;g1W@~lP)pIaY;l$RCt{2nL8{jQ5eTR>~`c{CG~nWlC`vgl7w3d#jQL_61G%m zMb_;Q%}o#`5;f6!B(__Mo7)hbOQP}EJHHcWGQ0EGnb}#c%Rkx7_~tx*=R4nb&Y2OD zcc$1|0|eD4aHZu4+}_^)B^HZ)duYB^@bIv@Zf$Luwt;~G1)_C)d@O^5gR-)+BAc6=1@(J+dejV1rnk4(v@@{7 z!$Z%00s}WRG|0@%jO21TSzljg+gA38i3tT!ENql_QfFtU`f1(W-AQ+Mx9MpH#`FFC zeYw8A4hKx^A-t2%=fyaTNLyQ*2}>w2#b{_~$Z-&e*xlXTHUB1zm?7hUBPS;(3i|x~ zTmb{lEV+e@Coq-K(b18*0-a1I&F6R>7}VO@>I%#ZEiW&tdq4q30OE|NrzZtY4q(F( z*s80mg8}O)?Ca~3uCA^ETNEPhbuQ?uZXf43$rYIR)gGf^Cy_+j!`37$7VYSSvzEg? zIyzcVmgm@YyS{;&o10w$w9@Hx$ug*=rA0ECjIXkY!4Vctas{rftu06t-7&u?MSSz~ zD_7vXy*=64*(r#nrKP3FftmWbxjEnEJ(G@gm!(WYM-7XDCUMD~4rrE`=jUgcnwm20 zY_GGkv#LWj0k&PPP9l+rVXiD=3kwUj=WcZa10%hN>sSMp?AG34N&)c_16o^KQ*~H% zilP0=_u)rF6CS|gUBrgKc3Mgdh=I+|&#U?jzBs9^!YO3|Yv@EGVeV9PsCO_wqP+Gn z;3S;W%(%e@21cBD`}_NYRx^c{!-fM249w^`fRl(}<&|Jw-bJAf@cIB=4zydlr4;&& zBWh?ru&At8q)K_(OJ%>)MFH*CyC{;^{IJkLK(%bZMk6OV1OzsE4j3dj*fCJII|gY3Ruc` z>>aRZ!1Ykf)@}`LF_D>>8D2o(0VN@z3b16BZz1n(En!k6L4u+^+B&=4{1C9DG}LmW z7~0yZ(@IUX{V+_4o1NXv%Y6xb-`}q$xmnJOsx4SNLzF;=r9u|4C^_eFy}i;SK}ZSp zURztR=p*9$#L+9h65w$$;FC}lc}y85tQ` zvD&HnsY<-LXvFF#`!j-~q!Zwu@qNOs{h!|@KGWR5t~NKYtL@7H{{}}2`J%xL?^yr< N002ovPDHLkV1oIFON0Ob literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..6fec1f0113eee30d077617b9e2b91a329ada95d1 GIT binary patch literal 2350 zcma)8Yd8}O8=kjGBSLbRvyCk+IZv5HEG7$WMp90rG1ivIA&0G%L(2J3y^ax)Q%+k< zOF4x1qt|IpwJR$xolKZhUhl8($NS^^uIs*^`+0so*YiBr{Up0!&qzyxB>@0{w4;Na z+pc>2!+m>qBQ?j+bXP!E9XziA05V^m|@P*m;QVkG9Yu^}xVkM4<~sCSDN)u|Vaqf|S{@f;TgneI zpsb>V`2pPx%WrP4KuWZ$U;A6HZ}E}`&7)-89-Jk7DEkOJ_-{atwmpBooM&6|Bj(2< zg>|u(S&toatHN;v%j*;YEeg8|KFr57irbAe|RDkot`{-VqXyQ7zm-o zN3c+`UpIeUwt>cz!fVMXBK&i#<~=R%*xcjiFjuekocs&-38G^u!}0_gVGaK`(BeoW za$L4jB2?>#k?_{%u-QC^U{q*Vba^1StwVp}9oQ$+|)Y{rw)d*g^ zjIQky7dJb_>0CX zW@e@&Umy_J2?hoSqZkavsQ+~3t}HAqFF%*->lSB}l|d*JN}c|`A{Y!d`|B5HWTmUC zYj%GA%8D{c!dgcU>ZPr$<(H8v$Ni!_vn3L>eY?KBy*)cJf?H9JQX5u1GnU!h3Cehd z4%?@qqOv4h-+H*L2ZMDaCMNb8zs@LX;BYPtmQX)j_!T`zRa~c@tvw# zK8&8c$f3HzPG=ftEE?6P99P*>dqV?QW~HCm416vIDyFvkyo9#4wsx{2Vq;Ni>2^am z3GVLM3k>ej;MIgHhk~GI4L|6Xsf&D(OiEcw0Fmq0sw5ER2yb3q3F-AY0NsB{$mjc- zIsf!MkC@d z?+P}Sh-U^}z$H)%{T)4fwKsnz&|V&sB?g7}ZyH588LX12jxy|aN334ZdE!hnaGhIXPg zc~aR{@vsB!+`0R-^2XbZt)vd;)GYGi<{gW04Jf#zBR~NbMWq_8#wMWoM)*e=#nn$g zou0G@`;w=&c#H5oR>JXcc zgJW*tFS8eG>(iys;+mS8A;Ja_E-Vn-PbeUp+y(z6!=5#B2Ue*ZSRcutJ&pLq6(yyU7^08?5{_2cBV?ZaZt8ZQ&YbiD?!0?nOomC?`e8iri$Pe z+}HocmV{hB)4fFQUFoiS037YHcD1%Xbm@Re9rOt9Wu*3JOK{*4U|?~)Zt+5$+*ReD zZ*z`Z2O>{Ie98YZ)q0G~Yfe_7eHu`i;Z%8tf1SjSmm(>%H8&f@q83I@!}Uzy;`~s_>BJKEj$7)T zqzj?OfI+9pHZeEzik9_zuVTZ(YHMHOl>{O3oQET+A)aXk_z$J_sZ9^H%u;I)_F#-= zewuojdrZ&uWnFiCH~0IwLR7}@mXQmlb=oZWfm^6t^VRR~kIlS@9Iy4AVP9v{BR77M zwzd2^ax|B{iCg+FR7PYRK2IF!da(9|2gy5jIoCXN(zGq~qNJ`vaF?n%d8mjgO)iw5 z7S&cn9(^!U5fu6=WkRAWdhm~9uQqy3o5oBHMsAaqn__*|1sQxnOPJ7WE$t~!V{U|%WD?L~?lfeacq3 zq+Q7gy@?i!^JUvP5sQ1;g8y6&_Vna!v*W#6YXAla#1_)T!~~`wDR_Ec!G8)~-SU8f z?-(B|CaKmZV5bBNt%T8zF-0Y%&amE&QsU9xUAq(P8u(6Dc6N3}O)-=1yS<~y7cy;P zYa6E}i7eg7Z_`o4YVT@KJ6G3X%j<7jd4cB%7b{4eSty?#VS;-9o(RN&iH859sM!HP R*y|s}wLkCvI{#hazX2yUXd(ar literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2a9c1e200184502e2b63287cdadd61f96066c3 GIT binary patch literal 4312 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-16.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..979d24169f4e974fd71ec56ee3458e0232d638a1 GIT binary patch literal 541 zcmV+&0^pGKuJVFRCt`FlCg?|KoEwdo0T$FieEN zha+H6*L5N?41=z_u1n{q(`o()X_}Hu2*J#^o6*OkpdSPQG))7m)#|YVyrd*ah`_dO zA{sB%_kEH8*BFLb?!x(eCLI|1OxI9^oj|)4&jQ9ux~`i*=ERGDImn!t0`N_5x7*MA z;CNB@Hoz`z+a4zs3=imQshYp+7hz0^jHaH33;+NC07*qoM6N<$f_j_HCR(i)=JWYa zc^sOi!Dh4R+WYGuIa&YVaNu^qV0KA6Q>-7$Ahd1r- fgC76UgTIa+#x~A75G<*P00000NkvXXu0mjfVxRfx literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-256.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..1f953b2fc8a39c3d261addb866954062a592ddb0 GIT binary patch literal 6051 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 OfTz1JvK8^K{Qm+Mb7ay0 literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..bc17a33e34062cb476eb1f46c135c52d492ff927 GIT binary patch literal 3394 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 literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..7053ee0bbf3031f8f88d0bbc0e2c167a0fb36b0c GIT binary patch literal 9276 zcmeHt_g9lm6lMZ~hz3LfHB`ky5l~4&?_CMf1f(M>38DGXq!+0w&4vV|2qg5Ngx;}W zLrO@1&=i#(Kq2(9limGg|AXCgmUG}8CYd`kcV_PM+-Ke-GgCttH=G*+fxwK7^ei9{ zHctoydXbA0)I^+H8UT+&zD76wAP}B+tY2uCPw{OCL}JlcPuuE#He>8ingF$>>o2>4 z1RqDNHa{PS9>2h)O9vibz7hY-z%shjYT!!i`-CFnl9$s@>cu_IB&teo9eY}QQNHM2 zlC{Z~GdHB3KD&14Oj&dl7o3A%Zw;;Gw4YLYs;j|o+kgF)M&0&yNh3$fC}DcMb=Bwl zX6}9o5{zlt&Wm;dJfmLl4S|Q6p$j{x6pn^LAnkq!P@t;k|MCy6o>cO6A+qx*<+<+f z?Giasy*n~^ctr!e=;YyCW&@New_(B|R)lJL(Dm`h`qDw?kl>yib<#zLdS5@HfePHivLl!uYP~| zN7jShHDB8FfsL4U&al^L-v{+F8`yo~R%-b6+MRF>t)G}@=u~lX0I8y4*K0Xb`2O0k z`+iUCq2njV4Sw~d!FvLtK%FkQbQRPR6%rM$!O{JhuUqL}gL_e=Z$29rt;#kuS=a2x} zH2dwi_V~`ZLDED=hx~;5ZP@Y%5$QFtG|{%daqij+&u?2{Q5S&`TM^a39lPbPeFGKH z2#PzIK$xmpV~peq?o9jL%;invU=!k&*(li^Xlzv3Du?E5BdTTxNpMj6us!~a>c#ov zkfV;vx-`Cy0UN8;cDc-8$j#GL`JY;!F%Lm}Ei%Ag*8f#>GWOjv z+{|&~+v_SWa1tRo5>-$L$onyB2JztM(`mPEJaTHWX$hqov`GGWHg%OQndTHU7BE#@kn(U< zn4>9Gb8n~>C1X?hje%nqR|nzej#OH?UCoz^_O;&}{QLC3_q1(JWib+;7|j0DlfZF% zx^<->r(Xr-Q2fNgSIw)#HvikEvuP=BZVevS(#Pl-xz6W=E?#CbnRf?@&C_$YTb9Cm z%I)jEk4EnAPUSt|dD|h&i_jsYzq{=AQ7NG&Q^6hIwAeUb4JmW`^Ctjmb_$Fk9V2a( zI^x~bZJNphM@atjlW$tMQXR1yqTu%Nh~KBv30C3xEri%QuaUdoHTT2(J_y(-sR#AF z)}MM|@BOBY7q`tn6x++0#}B;nsdcqTKC{BU4u9|0$4o=f;P?LXG}(WCKFxm(s`b}lJ)0aMfI4Bn8LcFf%Ipm_^KeOCmrxl0Vt<$*-LFl`%AI)To zBOv#gq{!i_f9>qNLq|`<5%v*p$$<>Jm92TwNUwFW%vk|iJdcRS$5gQ;vaJ@=yYx@! zuVh6NqUkIA?l==!QGSjL#XM~1Y|mutn%G-Yw9g<=)6Jy{$3mA{rVKT=(t}sJ727U- z`K^Hd6UUiX!Ksf>}W$ZWrb*xc?&nF61XrlnR}RMlqt&5domiPb&=biLO?5k zNQj!w3HAOx&7A3bXM#t3ek`g^H%<3=|9!oeP(|S2bZiQ&sZe@dyTqlwy-+r^nXbXlD{PYQUY|cR82O~@V5MWA9d)pm5GAl? z*TkgRcN<@L^?P*(L}&V}W%A301D6cw5QG76RF+3Q7^CZn(-<TF=zuBS; z6-{T-hl%~Ybv;*EJq){+3ws)OTrDvtMbOrvvAdH1DwO+kSN{xA8aPT0H@XV?MgH&p#$k@v>SB_IWQF&OlQ&QW>Eq8eAbTdApL+5No#Fumv)q1gSL1-!E;-Q*x)5Dz?1uQqPDg|LY?qe zao#HE$jFkmx&c4`2i}YGu1{^z@^VhiLq~*A-)6I^u{KP%9<`OnFo}xGPYTUc|NCt; z?Sy;XaznsFzIj<^J7hk<+k{lnYAub(*lNtN^zP~7)!gY_3%%y|(5hwHpHXU)bIo?J zlh5(p;~nTMKr*SrxW`s{6C`I%;`Chn{!--rNJ+-cYn@Sq#?sTe@k3c8c`t=8=J)#x z;24Gb>UNeJP96%uj*3`sIO&xLId13yug1)3^K%&+yx(`_1lU3}w>Yp$>8|vdXkCk+ zo@CTbpsr=e)hITSW1bs$r>OliQtg(c9;2B#Z8(WW?)+V|qr@aAHAx{1W!wT}OJ_-f zE_&3K&>;J5;Snhm~@yO_Oa*e$t;xD+m5g2s!Afzn!Z z{gNOWmvRgM)?gm(h$}hzRUK%238zn z9p6~_Z@|dFwvA>r+DkwQlsaE4J1Vkg!N40>)Z9Xp+nB(g`L|#n$#KYMv=inl?uppL zr`e*~ISa2wU$xY!bP8qE^iWC2qF%zRoWRSbSQJ6`kwm!&uDMgm*sTBZ>W)%?C;oN# zWYPr-)f12dC~;)t=?^8&l$lKYSA&LheVCWZi3$s9^6?LO>vj@N=+L}#hpwumSj*$c z)&=*?vH6cY<`9$Fv<8SiI2RVjXe1F3OiX($lhZ;l`Yopo4tX`2mx{gke(*zHqcJrF zSx3Ij1?nQuBZnInI&9_0SUtS}J%qe0 z5494jieS3oDwmwH^9nV~!p#Mm9p;CuG)q)!r;gGgL15_TN(Ynd+XQRfe9fiFaRItN z7da()&|R9$0n2kiUwmO#e~K29+V&bZ*Xr6B{&IN18zS~nv8Z-fG|WibR$&VM#9v`R zy18Dx8gH)-r}e``)s$$L^(6ozSNPF4nuJBJRh%J*n~P#(-Y`b$Mh4r8*5wzHtmV=Y zA_?|&-loi3$t5Z1rIyNQi|NAs>3$+wlOMxBRFi`K`KCdomN0!L7L}*QCX~iTC1DTe zYJ_hosrxYJsI^m)i?GH9YJuxMGDE7IU|nH%Cjx}otXHZ*bT^`QSAT1U!rgDa9`EPM z-nez)Z&u$OmRkNVT6S*E$?;&@&L4Tkz+K@|SBk_!7p-4ee=N^&x)A=g2EZ`$gcYnv z)Q;TS@2{B;ON<9QL)?28?|qkEeRG^9d=M;n2{3)wWAB*~saq0}b`6B)y-N9x*5_qN-_5EBG_WjKO&pDV4 zPd-dC74)H{*rsHe26$ktqDKbD!6L-?C8ucF&!UAPl`(jO&VFuB*Wz!7TfT=Bz8MZN zA_YBJM-PN9%@T9vZg$aZpXC+0&9r1`Mz(H#4{H78FIPHiUsh!BEm^+=YuRgEaVJ})*7TK1jcpfg z)d8SR7#~<}$#Q4PJAK=>7yc^b%VQ@~l_t5SoqW+)y>rdMuNz}SgBu;}|9H?lBRrQ{ z)^jK|0U}x<+vKRqOCX2`z_E} zt+iewsA`uEHe$Qrnj58|UYrbd)&ouZyU&^K;zR7ET#AsL1ffcA-+MME&u9*?Gk7C6 zbPH8#KVC(r&YgrCTT6_lOBkxWdNem=HwTurfh!-jaR7{6i((|A;_qAOOexMLB=ukH z989*Rn8IMN5|QIn(b4q{Cc<{S`?&&d%ms{H6zOPJ5EaxHH;NvXmLhlc(&H@}9Do$96mEnSj=JGB&Fe#Gzy)kC#fk!99UygJk$0 zf8lV0$$>XW!qNk41<5OHLPwv@4U*xO1qbE)DV8pjZejz^#y#)K#y1{~Qs1XmK3(8I zp&M|n*G8QpUA4Hg4tyPL@MCzxJr@4&)9E#be*mjpXb@+ASU^ zFpJb+#G$m(mp?;qu{Hw{*%UB;mw?V%i%UoB)^*}j=2gBBre_HzyKtRSw=A{bw`07t zfaiCH&KUeG{foGLKUp+nCf~G+V&t41;R)G$(9Ze3P{<}*%7{ZPqc7>AnanfZ1d%{n z8gV(ZDn-^9En;>Xgt+*s2w9T;-cJArw&^eScDF6NIM22dITKHV4gJCj^2M@(sG)Fg z`wdjT3)E^yqmjzkHFNfVCdolh*WB12J_h~dsR%O$U)s1%$cm!}-a!8X24`66O!4^E zOd}=HlV{?;OtKdysi4F)G%iO;2>dSVx{)(K$bXgUb8UBQZfvE9cdH&Rc=o-i9I~>Pp6Te`geYs)igCgO>o1I(6PShd~@!EOuj`{7GR`;sWcp&dafU2pkdxvj40Fo6wJ_>xX}6 zF>&miM|{UM`P(m8b)o!c%;tcj4xrkjJ-jCu#JGQGl9#n83}BnJsS^Rl3xsuvMTXIc zY*t8FwPF%Uaiq@2-Htyo@jCa>^xA^{Ipev(sM}WWXn+=Ny@B#<6him_Bl1sf6cRrb zM~;u@REXRQ)3~ms2bMafigtc!cQA_f-{`%raGKgnmH&wyN2B3gr4fw6r>0-FtfCxx zul9X^rJ4njroJWKL;(DHd3(50=XuaG7{~8UK0{$w-0+KwH+5Xt&j8o)70Yb5N3)mI zK`matIup+;<~`M&)iuq{YWgf6E<~kcZj1n;?-iO_-eV}sN3ZkAoej=YDS7@e9wu~U zqS~s!gZ{b{^atk62PoYYe+hG?ke$C>-GFm$zZJ^2dD8jXn`}ui$&Z%56}-);>wbCJ z?aIVg%fUBSVME9REDX{kgLHO;F7cHQHFi66Z2=pyzW8cbIj@lkvKVh(khl5V(GV!< zH4sCI!!@L|^zfaB>L`7mv;@f+B_6Yg=Lg>BrxE&w1!Sy;RIWg%(e0c{{rn{c9B;Y2 z;A50p4XtC1@j3S=lgh8NN3ny@p?i|fpNE*F!8=<_W;qfH$(xNKdD!S@amW?@X z0qu+*i;F`g&y++YcTcB33p_Q`SCDYCHB31gR(veXBKm-x0vX$(3lv3$q)=L{pa`Zg z@bBb@OnEiPQ5JzHuF=U#i3DWPW?@58(D7QSTfsrNnFxrL+?~DFC2?HbIG}pnUI{KV z01VQrJl(!Fo^6N4nJhk23sk1e4Mpxe`Vfs+ogeI3{L|n$3?iNx2aD!P3((2CP-#A0Ys$Q&ptwTqAsASN-?(FeA%) zT)csArXa@-$or(vR!lVlysBA+^cRNfQ&W>wQ0&vc&_AGVM0IWWvsIim#ZdePB7SDN=Ui5B|4uH`e@A*=pn3exdp!vmppSa3z1)ga z4P3Z1u|=!%oTw}$2mKM--{>-$UQ$42i75YfTbh(K*R?wC@ujI@{n}FSGn_#WHJ94( zeA{nJTdQkeTU1V|cL}=j2#n?o$o#X4_Z9|9EE(NH`q^Mfx!dsph6gb`g$)Nx;WWSmGg!3xaKtt%pky`Eop-7nmgoB>lHYLil z%1Ecdp^k%MCNAtOP2BEgHnrgS_;O1_*3JuAdr#X?(AXqH&heOtbNoqJf zs5N{WAG+9Z;hyc&&rdI8u_#^xw*0Ag%3=JK=<}u5`e% zhrAe!yKc(`4Fh`e?X&Z}*3#uAchMAopr~bxwINE}bHiynQ;Ka;Hw$ib^OqwWD||!8 zgQw4_Sg$XRbr%{x{dO+H;g-hEvhH?>fI1o3>hv#=0jUIgF#avKSCMyww3dxeWzz8r zg#N3y*A|BFcE%nG>TQGP`*Gh5D*bIjsee=r?dTz ziTQx}1g3Xn`Ltr^Y5(9fy@@Qg+0q+j3uj_|w-l4i3k)(@sE@^>o8HD8heX4c^>DGZ zQwDPUO5{&J4r*>hH|+fTYPlI|rA3O_QIoxbNpjMa6~6!X!-;N?2YVZSdeToWw#zRz zFeOP8m}1*^DEy~m-t&}%UXkEReGg|b9Wcq?|yuIDk-Q`>E9=b z?%nkXAGy|zTh*@bI77%#4#0KQUfd2L56s}LeM{RiwhCavN|$D(=;rOtJCi4-s5Z_u zmVp~*$=Lk%oz0bQ*}BnN5AOAcv>rEA>M&Jw4jjG{x75eU57_#$Lv}CCf`nA(KhwI| z?L+u4B312QVlarchpW#F#5o;jtmc(WBdmW!FmTS*+V&Db!Hhm@a-6i5)#f&tUHSJh z`qi=J0UX*g!^Sy0VAAWEj>p*LJ74(i-9IF+JzB-j)b!yBpBK2l3b3AZOA%J?ZwBY8 zHsI=b2>BiiS_IHt+FXvcx|D%T>)5^J1Wkn7$H&Hh!obPDoAt}1FaclMμl1gu+y zFk_-Ea?;Ji&WfQS3PfmC*sFxRrwL2Y;I3J>231?yQf5+A{t~sl&R4eWg;aZw zsaVUt$RC^nnk^YRkH=NMd33Zfkb&Q*2a^X@B z3@%%|7|%i~iUM?V0X5xR$=&~U=E2ET(QnzxluCHZ8Xb3B>^k#a(0DMhVdnLt1t-Ge zK(iKp#f!5h}J(-a~>Z-DK$$TxU4cM=Mb9*o4nBzxY#g#UV{)q9t)ZX zuQkjf7?l-aFAwtm0Kjkc#)8!xb#GEn0n?jjwI_#;9uJwX$ffq37Hx5+!?c&sES1DR zzygds9VIK-7n=JK<@Q|9mVNXuNzUvKJ|0DVIlDergSz!T(P}SceIjx~u)$}%ITKsQ zk7+aaf)V0`SW2^c=$c8`H;SohH>U>^V_C-Qtc!GoC3f{(M?fyPVk{rQ&~Z)y)EgyC zJ4#~m8kb|Ee@TVCMEN=5pqXVxsVW6mCS{SFcpm97AXy#4^iYLWx-cwR>yUON8ulrv z%9{~$Sk9I<0tI)|mq)7xcwae> zPbfJSYvr}G@wY@|9V8$MmPFHAXi{p) z>|YYVi>aavrz`V=q`D^A+i_J~g&@=T9mV}EXmJ#4XbtXU3anB}%vHx`kUF|!c6X%s zac>gG+X`U;x{c>o_xNa0VSqI%=XZ|G#V!Kkv*yl zlrIttq3zBkjI>3zg+n0Htj6hhJY4n5McLkKJd;Q2)Aj{I$3RCC78gQMk4v$nz6{dM$n7Z zf&6YUP~KvdkL1gS#v;YVz`Ud%_P!A5gr|vtaSIq?aE=F%;*p@<J?{itik{xA-d{bErN%qif86I@<>mm4|xc|lnb814nS7&i{k>m!!;6MN$Y zmoxQU`G(AHhgNGq5vjfLQvgTfdoFT60yoUudw(Ny?ZhMb=)EsB$~tPQPS3AE-s-sM zriZ6759Qs7MIi)ZYis`Z?J&0t7rXr8NL|m~Z_~PP&}eyf1}`e_9xkV4&E+XsKGqb} zW@m5TL;%;&Tx?krTweR;1K6D(2{Orv$H8Uw0Te&2Gw!e=uc+F_e#|9b5$*QK*xJc> zWXrm?%l5k%j>D2}TCA~RYHDhD7si^_pZtjLE&8OLXUDHh7Emkq;%VJ)s@6CmehrwS zFAP`PC?XIJVxvbQbY<-WB<(OV9%jeGmvS|{vlV^DvsgFa=YTVOzGo}9i2!Bm5U^|G z!N->09m(w#lKXGZNkF}vIxz4OggCWkmyVeIZg8<)4q&SNCcrS}N{^=V@z`1!ezu2K zLM*%e754rAxX_3(&!p01s-()jM(h9nEAKhD42_0ynY_HDt&7w=rFMUL^2go3kHqT( zB#vyzXNz`k8`+!B><+kra6JE@XPj~Pgj{wuc&DHh9F*j5td|Gk7Xbw9I?!-nq z`L4_uOD@|h^}iTgCvs6J?0z=Gcg3y<6e_J^Mz7yrvM! zbLhQz{i|c6My9;plFW`l9`Hck%oW3D47R`U3;lLMHKqLUc-t_Tzx;vRHr{FtsdkWn y=fwg6)ayt@@E+wL1d<6}xcGnd9=~D#;N#%+pKo$CD!>~F5MzB)y-FRInEwG}-+;pa literal 0 HcmV?d00001 diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..a0661bc4aaf25d01d0be69592ec8e0eacc42464f GIT binary patch literal 20707 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

ODFl(mlLT>jXv8_y@8P_bZl?G%h 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 + @@ -8,7 +8,7 @@ Assets\StoreLogo.png - + @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj similarity index 96% rename from pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj rename to pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj index 85cc79217b..89b53d3da9 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj +++ b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj @@ -1,317 +1,337 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - Debug - ARM - - - Release - ARM - - - Debug - ARM64 - - - Release - ARM64 - - - - {f5e937b6-1ba0-4446-b94b-f3bbdef908f4} - DirectXApp - RetroArchUWP - en-US - 14.0 - true - Windows Store - 10.0.17763.0 - 10.0.15063.0 - 10.0 - - - - Application - true - v141 - - - Application - true - v141 - - - Application - true - v141 - true - - - Application - true - v141 - - - Application - false - true - v141 - true - - - Application - false - true - v141 - true - - - Application - false - true - v141 - true - - - Application - false - true - v141 - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - msvc-2017-UWP_TemporaryKey.pfx - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - ProgramDatabase - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 - /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - ProgramDatabase - - - - - d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) - %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 - /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) - - - - - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) - 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS - - - - - false - false - false - false - false - false - false - false - - - - - - - - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + + {f5e937b6-1ba0-4446-b94b-f3bbdef908f4} + DirectXApp + RetroArchUWP + en-US + 14.0 + true + Windows Store + 10.0 + 10.0.17763.0 + 10.0.15063.0 + true + + + + Application + true + v141 + + + Application + true + v141 + + + Application + true + v141 + true + + + Application + true + v141 + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + Application + false + true + v141 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RetroArch-UWP_TemporaryKey.pfx + False + False + x86|x64 + 1 + OnApplicationRun + Always + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm; $(VCInstallDir)\lib\arm + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\arm64; $(VCInstallDir)\lib\arm64 + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + ProgramDatabase + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + ProgramDatabase + + + + + d2d1.lib; d3d11.lib; dxgi.lib; windowscodecs.lib; dwrite.lib; dxguid.lib; %(AdditionalDependencies) + %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store\amd64; $(VCInstallDir)\lib\amd64 + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib %(AdditionalOptions) + + + + + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + 4453;28204 + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + + + + + false + false + false + false + false + false + false + false + + + + + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + cores\%(Filename)%(Extension) + + + true + %(Filename)%(Extension) + + + + + + + + + + + + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj.filters similarity index 89% rename from pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters rename to pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj.filters index 4c212ae9e5..3fcb574ea4 100644 --- a/pkg/msvc/msvc-2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters +++ b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj.filters @@ -1,130 +1,130 @@ - - - - - {1246fa09-e114-4a52-88c2-657b2f13d9fb} - - - {32de9679-6494-4933-afa2-430fd975e506} - - - {73676219-cf54-454f-b6fa-9b192c1454f8} - - - - - {bf1e643d-c518-4a77-a355-ae8a93efc18b} - - - {c3155604-6d38-494a-bfe0-861cef871cb2} - - - - - - - - - - - uwp - - - uwp - - - - - griffin - - - griffin - - - uwp - - - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - + + + + + {1246fa09-e114-4a52-88c2-657b2f13d9fb} + + + {32de9679-6494-4933-afa2-430fd975e506} + + + {c3155604-6d38-494a-bfe0-861cef871cb2} + + + + + + + + + + + + + uwp + + + uwp + + + + + griffin + + + griffin + + + uwp + + + griffin + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + + + \ No newline at end of file diff --git a/pkg/msvc/msvc-2017-UWP/msvc-2017-UWP_TemporaryKey.pfx b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP_TemporaryKey.pfx similarity index 100% rename from pkg/msvc/msvc-2017-UWP/msvc-2017-UWP_TemporaryKey.pfx rename to pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP_TemporaryKey.pfx diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/ARM/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/ARM/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/Win32/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/Win32/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/Win32/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/Win32/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/x64/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/x64/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/x64/cores/.empty b/pkg/msvc-uwp/RetroArch-UWP/cores/x64/cores/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/uwp/uwp_func.h b/uwp/uwp_func.h index 4b92bc489b..ecab3b8a03 100644 --- a/uwp/uwp_func.h +++ b/uwp/uwp_func.h @@ -33,6 +33,8 @@ bool uwp_keyboard_pressed(unsigned key); int16_t uwp_mouse_state(unsigned port, unsigned id, bool screen); int16_t uwp_pointer_state(unsigned idx, unsigned id, bool screen); +void uwp_fill_installed_core_packages(struct string_list *list); + extern const struct rarch_key_map rarch_key_map_uwp[]; #ifdef __cplusplus diff --git a/uwp/uwp_main.cpp b/uwp/uwp_main.cpp index 674232172b..bc1c9b5e13 100644 --- a/uwp/uwp_main.cpp +++ b/uwp/uwp_main.cpp @@ -21,9 +21,12 @@ #include "../input/input_keymaps.h" #include "../input/input_driver.h" #include "../verbosity.h" +#include "../libretro-common/include/encodings/utf.h" +#include "../libretro-common/include/lists/string_list.h" #include "uwp_func.h" #include +#include using namespace RetroArchUWP; @@ -38,6 +41,7 @@ using namespace Windows::Devices::Input; using namespace Windows::System; using namespace Windows::System::Profile; using namespace Windows::Foundation; +using namespace Windows::Foundation::Collections; using namespace Windows::Graphics::Display; char uwp_dir_install[PATH_MAX_LENGTH]; @@ -290,6 +294,11 @@ void App::Load(Platform::String^ entryPoint) return; } m_initialized = true; + + auto catalog = Windows::ApplicationModel::PackageCatalog::OpenForCurrentPackage(); + + catalog->PackageInstalling += + ref new TypedEventHandler(this, &App::OnPackageInstalling); } // This method is called after the window becomes active. @@ -461,6 +470,17 @@ void App::OnDisplayContentsInvalidated(DisplayInformation^ sender, Object^ args) // Probably can be ignored? } +void App::OnPackageInstalling(PackageCatalog^ sender, PackageInstallingEventArgs^ args) +{ + /* TODO: This doesn't seem to work even though it's exactly the same as in sample app and it works there */ + if (args->IsComplete) + { + char msg[512]; + snprintf(msg, sizeof(msg), "Package \"%ls\" installed, a restart may be necessary", args->Package->DisplayName->Data()); + runloop_msg_queue_push(msg, 1, 5 * 60, false); + } +} + // Taken from DirectX UWP samples - on Xbox, everything is scaled 200% so getting the DPI calculation correct is crucial static inline float ConvertDipsToPixels(float dips, float dpi) { @@ -528,6 +548,18 @@ extern "C" { return (void*)CoreWindow::GetForCurrentThread(); } + void uwp_fill_installed_core_packages(struct string_list *list) + { + for (auto package : Windows::ApplicationModel::Package::Current->Dependencies) + { + if (package->IsOptional) + { + string_list_elem_attr attr{}; + string_list_append(list, utf16_to_utf8_string_alloc((package->InstalledLocation->Path + L"\\cores")->Data()), attr); + } + } + } + void uwp_input_next_frame(void) { uwp_current_input = uwp_next_input; diff --git a/uwp/uwp_main.h b/uwp/uwp_main.h index 623d922161..a2f2595d45 100644 --- a/uwp/uwp_main.h +++ b/uwp/uwp_main.h @@ -53,6 +53,8 @@ namespace RetroArchUWP void OnOrientationChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); void OnDisplayContentsInvalidated(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args); + void OnPackageInstalling(Windows::ApplicationModel::PackageCatalog^ sender, Windows::ApplicationModel::PackageInstallingEventArgs^ args); + public: bool IsInitialized() { return m_initialized; } bool IsWindowClosed() { return m_windowClosed; } From 2c4d2418d6640cd411a07917f5cfef72e583c3ba Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 1 Jan 2019 15:30:21 +0100 Subject: [PATCH 090/116] (UWP) Fix ARM builds --- config.def.h | 18 +++++++++++++++++- libretro-common/features/features_cpu.c | 4 ++-- libretro-common/include/retro_environment.h | 8 ++++++++ libretro-common/memmap/memalign.c | 4 ++-- managers/state_manager.c | 2 +- .../RetroArch-UWP/RetroArch-UWP.vcxproj | 18 +++++++++--------- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/config.def.h b/config.def.h index b12a717149..7ab919da62 100644 --- a/config.def.h +++ b/config.def.h @@ -804,7 +804,23 @@ static char buildbot_server_url[] = "http://bot.libretro.com/nightly/apple/osx/x static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/"; #endif #elif defined(_WIN32) && !defined(_XBOX) -#if _MSC_VER == 1600 +#if _MSC_VER >= 1910 +#ifndef __WINRT__ +#if defined(__x86_64__) || defined(_M_X64) +static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86_64/latest/"; +#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64) +static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86/latest/"; +#endif +#else +#if defined(__x86_64__) || defined(_M_X64) +static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86_64/latest/"; +#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64) +static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/"; +#elif defined(__arm__) || defined(_M_ARM) +static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/"; +#endif +#endif +#elif _MSC_VER == 1600 #if defined(__x86_64__) || defined(_M_X64) static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/"; #elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64) diff --git a/libretro-common/features/features_cpu.c b/libretro-common/features/features_cpu.c index 6c056f08d8..046e880adf 100644 --- a/libretro-common/features/features_cpu.c +++ b/libretro-common/features/features_cpu.c @@ -174,9 +174,9 @@ retro_perf_tick_t cpu_features_get_perf_counter(void) time_ticks = (retro_perf_tick_t)tv.tv_sec * 1000000000 + (retro_perf_tick_t)tv.tv_nsec; -#elif defined(__GNUC__) && defined(__i386__) || defined(__i486__) || defined(__i686__) +#elif defined(__GNUC__) && defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_X64) || defined(_M_AMD64) __asm__ volatile ("rdtsc" : "=A" (time_ticks)); -#elif defined(__GNUC__) && defined(__x86_64__) +#elif defined(__GNUC__) && defined(__x86_64__) || defined(_M_IX86) unsigned a, d; __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); time_ticks = (retro_perf_tick_t)a | ((retro_perf_tick_t)d << 32); diff --git a/libretro-common/include/retro_environment.h b/libretro-common/include/retro_environment.h index e220c1529b..4a68046b51 100644 --- a/libretro-common/include/retro_environment.h +++ b/libretro-common/include/retro_environment.h @@ -101,6 +101,14 @@ printf("This is C++, version %d.\n", __cplusplus); #define __WINRT__ 1 #endif +/* MSVC obviously has to have some non-standard constants... */ +#if _M_IX86_FP == 1 +#define __SSE__ 1 +#elif _M_IX86_FP == 2 || (defined(_M_AMD64) || defined(_M_X64)) +#define __SSE__ 1 +#define __SSE2__ 1 +#endif + #endif #endif diff --git a/libretro-common/memmap/memalign.c b/libretro-common/memmap/memalign.c index 449d8471b8..6171e21783 100644 --- a/libretro-common/memmap/memalign.c +++ b/libretro-common/memmap/memalign.c @@ -54,9 +54,9 @@ void memalign_free(void *ptr) void *memalign_alloc_aligned(size_t size) { -#if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) +#if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_M_X64) || defined(_WIN64) return memalign_alloc(64, size); -#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(GEKKO) +#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(GEKKO) || defined(_M_IX86) return memalign_alloc(32, size); #else return memalign_alloc(32, size); diff --git a/managers/state_manager.c b/managers/state_manager.c index 26425e3ded..9b8f5515d0 100644 --- a/managers/state_manager.c +++ b/managers/state_manager.c @@ -50,7 +50,7 @@ #define UINT32_MAX 0xffffffffu #endif -#if defined(__x86_64__) || defined(__i386__) || defined(__i486__) || defined(__i686__) +#if defined(__x86_64__) || defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) #define CPU_X86 #endif diff --git a/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj index 89b53d3da9..1f21ca7a6c 100644 --- a/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj +++ b/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj @@ -132,7 +132,7 @@ RetroArch-UWP_TemporaryKey.pfx False False - x86|x64 + x86|x64|arm 1 OnApplicationRun Always @@ -149,7 +149,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -164,7 +164,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -179,7 +179,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -194,7 +194,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -209,7 +209,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -225,7 +225,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -240,7 +240,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -256,7 +256,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) /bigobj %(AdditionalOptions) 4453;28204 - WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS + WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS From 0a6df1743c92eae885fc3b71533ad88f08b4f7fa Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 1 Jan 2019 11:21:21 -0500 Subject: [PATCH 091/116] [netplay] print upnp failed messages [cheevos] fix warning --- cheevos/cheevos.c | 2 +- intl/msg_hash_us.h | 6 +++++- msg_hash.h | 1 + network/netplay/netplay_io.c | 38 +++++++++++++++++++++--------------- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 18535b4232..916606adcc 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -3395,7 +3395,7 @@ found: *coro->settings->arrays.cheevos_password = '\0'; strncpy( coro->settings->arrays.cheevos_token, - cheevos_locals.token, sizeof(cheevos_locals.token) + cheevos_locals.token, sizeof(coro->settings->arrays.cheevos_token) ); CORO_RET(); } diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 1ca7dedc1d..e6f2fae375 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -59,7 +59,11 @@ MSG_HASH( ) MSG_HASH( MSG_PUBLIC_ADDRESS, - "Public address" + "UPNP Port Mapping Successful" + ) +MSG_HASH( + MSG_UPNP_FAILED, + "UPNP Port Mapping Failed" ) MSG_HASH( MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, diff --git a/msg_hash.h b/msg_hash.h index 643bca75db..012f8138f3 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -228,6 +228,7 @@ enum msg_hash_enums MSG_GOT_CONNECTION_FROM_NAME, MSG_CONNECTION_SLOT, MSG_PUBLIC_ADDRESS, + MSG_UPNP_FAILED, MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, MSG_CANNOT_INFER_NEW_CONFIG_PATH, MSG_UNDID_LOAD_STATE, diff --git a/network/netplay/netplay_io.c b/network/netplay/netplay_io.c index 33506e1430..c513a26519 100644 --- a/network/netplay/netplay_io.c +++ b/network/netplay/netplay_io.c @@ -54,7 +54,7 @@ static void print_state(netplay_t *netplay) } msg[sizeof(msg)-1] = '\0'; - RARCH_LOG("%s\n", msg); + RARCH_LOG("[netplay] %s\n", msg); #undef APPEND #undef M @@ -117,7 +117,7 @@ void netplay_hangup(netplay_t *netplay, struct netplay_connection *connection) dmsg = msg_hash_to_str(MSG_NETPLAY_CLIENT_HANGUP); netplay->is_connected = false; } - RARCH_LOG("%s\n", dmsg); + RARCH_LOG("[netplay] %s\n", dmsg); runloop_msg_queue_push(dmsg, 1, 180, false); socket_close(connection->fd); @@ -246,7 +246,7 @@ static bool send_input_frame(netplay_t *netplay, struct delta_frame *dframe, buffer[1] = htonl((bufused-2) * sizeof(uint32_t)); #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Sending input for client %u\n", (unsigned) client_num); + RARCH_LOG("[netplay] Sending input for client %u\n", (unsigned) client_num); print_state(netplay); #endif @@ -635,7 +635,7 @@ static void announce_play_spectate(netplay_t *netplay, if (msg[0]) { - RARCH_LOG("%s\n", msg); + RARCH_LOG("[netplay] %s\n", msg); runloop_msg_queue_push(msg, 1, 180, false); } } @@ -915,7 +915,7 @@ static bool netplay_get_cmd(netplay_t *netplay, cmd_size = ntohl(cmd_size); #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received netplay command %X (%u) from %u\n", cmd, cmd_size, + RARCH_LOG("[netplay] Received netplay command %X (%u) from %u\n", cmd, cmd_size, (unsigned) (connection - netplay->connections)); #endif @@ -1063,7 +1063,7 @@ static bool netplay_get_cmd(netplay_t *netplay, } #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received input from %u\n", client_num); + RARCH_LOG("[netplay] Received input from %u\n", client_num); print_state(netplay); #endif break; @@ -1102,7 +1102,7 @@ static bool netplay_get_cmd(netplay_t *netplay, netplay->server_ptr = NEXT_PTR(netplay->server_ptr); netplay->server_frame_count++; #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received server noinput\n"); + RARCH_LOG("[netplay] Received server noinput\n"); print_state(netplay); #endif break; @@ -1339,7 +1339,7 @@ static bool netplay_get_cmd(netplay_t *netplay, announce_play_spectate(netplay, NULL, NETPLAY_CONNECTION_PLAYING, devices); #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received mode change self->%X\n", devices); + RARCH_LOG("[netplay] Received mode change self->%X\n", devices); print_state(netplay); #endif @@ -1363,7 +1363,7 @@ static bool netplay_get_cmd(netplay_t *netplay, announce_play_spectate(netplay, NULL, NETPLAY_CONNECTION_SPECTATING, 0); #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received mode change self->spectating\n"); + RARCH_LOG("[netplay] Received mode change self->spectating\n"); print_state(netplay); #endif @@ -1394,7 +1394,7 @@ static bool netplay_get_cmd(netplay_t *netplay, announce_play_spectate(netplay, nick, NETPLAY_CONNECTION_PLAYING, devices); #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received mode change %u->%u\n", client_num, devices); + RARCH_LOG("[netplay] Received mode change %u->%u\n", client_num, devices); print_state(netplay); #endif @@ -1410,7 +1410,7 @@ static bool netplay_get_cmd(netplay_t *netplay, announce_play_spectate(netplay, nick, NETPLAY_CONNECTION_SPECTATING, 0); #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Received mode change %u->spectator\n", client_num); + RARCH_LOG("[netplay] Received mode change %u->spectator\n", client_num); print_state(netplay); #endif @@ -1468,7 +1468,7 @@ static bool netplay_get_cmd(netplay_t *netplay, if (dmsg) { - RARCH_LOG("%s\n", dmsg); + RARCH_LOG("[netplay] %s\n", dmsg); runloop_msg_queue_push(dmsg, 1, 180, false); } break; @@ -1728,7 +1728,7 @@ static bool netplay_get_cmd(netplay_t *netplay, netplay->other_frame_count = load_frame_count; #ifdef DEBUG_NETPLAY_STEPS - RARCH_LOG("Loading state at %u\n", load_frame_count); + RARCH_LOG("[netplay] Loading state at %u\n", load_frame_count); print_state(netplay); #endif @@ -1774,7 +1774,7 @@ static bool netplay_get_cmd(netplay_t *netplay, { snprintf(msg, sizeof(msg)-1, msg_hash_to_str(MSG_NETPLAY_PEER_PAUSED), nick); } - RARCH_LOG("%s\n", msg); + RARCH_LOG("[netplay] %s\n", msg); runloop_msg_queue_push(msg, 1, 180, false); break; } @@ -1901,7 +1901,7 @@ int netplay_poll_net_input(netplay_t *netplay, bool block) if (socket_select(max_fd, &fds, NULL, NULL, &tv) < 0) return -1; - RARCH_LOG("Network is stalling at frame %u, count %u of %d ...\n", + RARCH_LOG("[netplay] Network is stalling at frame %u, count %u of %d ...\n", netplay->run_frame_count, netplay->timeout_cnt, MAX_RETRIES); if (netplay->timeout_cnt >= MAX_RETRIES && !netplay->remote_paused) @@ -2011,13 +2011,19 @@ void netplay_announce_nat_traversal(netplay_t *netplay) } #endif else + { + snprintf(msg, sizeof(msg), "%s\n", + msg_hash_to_str(MSG_UPNP_FAILED)); + runloop_msg_queue_push(msg, 1, 180, false); + RARCH_LOG("[netplay] %s\n", msg); return; + } snprintf(msg, sizeof(msg), "%s: %s:%s\n", msg_hash_to_str(MSG_PUBLIC_ADDRESS), host, port); runloop_msg_queue_push(msg, 1, 180, false); - RARCH_LOG("%s\n", msg); + RARCH_LOG("[netplay] %s\n", msg); #endif } From 9c75b9cb7f3710579e7f62dc36ca967ac12c73b6 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 1 Jan 2019 17:30:35 +0100 Subject: [PATCH 092/116] Add missing CoUninitialize calls, fix COM initialization problems It turns out, some of the CoInitialize calls were failing because they specified conflicting threading models --- audio/drivers/xaudio.c | 12 +++++++++++- gfx/display_servers/dispserv_win32.c | 8 +++++++- input/drivers/dinput.c | 9 ++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/audio/drivers/xaudio.c b/audio/drivers/xaudio.c index b8f2c73ad7..da57ee9f2b 100644 --- a/audio/drivers/xaudio.c +++ b/audio/drivers/xaudio.c @@ -201,9 +201,12 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, { xaudio2_t *handle = NULL; WAVEFORMATEX wfx = {0}; + HRESULT hr; #ifndef _XBOX - CoInitializeEx(0, COINIT_MULTITHREADED); + hr = CoInitialize(NULL); + if (FAILED(hr)) + return NULL; #endif #if defined(__cplusplus) && !defined(CINTERFACE) @@ -255,6 +258,9 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, error: xaudio2_free(handle); +#ifndef _XBOX + CoUninitialize(); +#endif return NULL; } @@ -404,6 +410,10 @@ static void xa_free(void *data) if (xa->xa) xaudio2_free(xa->xa); free(xa); + +#ifndef _XBOX + CoUninitialize(); +#endif } static size_t xa_write_avail(void *data) diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 097c05c563..0a1a4513b0 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -82,7 +82,11 @@ static void* win32_display_server_init(void) return NULL; #ifdef HAS_TASKBAR_EXT - CoInitialize(NULL); + if (FAILED(CoInitialize(NULL))) + { + RARCH_ERR("COM initialization failed, ITaskbarList3 disabled\n"); + return dispserv; + } #ifdef __cplusplus /* When compiling in C++ mode, GUIDs are references instead of pointers */ @@ -98,6 +102,7 @@ static void* win32_display_server_init(void) { g_taskbarList = NULL; RARCH_ERR("[dispserv]: CoCreateInstance of ITaskbarList3 failed.\n"); + CoUninitialize(); } #endif @@ -117,6 +122,7 @@ static void win32_display_server_destroy(void *data) { ITaskbarList3_Release(g_taskbarList); g_taskbarList = NULL; + CoUninitialize(); } #endif diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 4d3b7cace7..2d97f02495 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -98,6 +98,8 @@ void dinput_destroy_context(void) IDirectInput8_Release(g_dinput_ctx); g_dinput_ctx = NULL; + + CoUninitialize(); } bool dinput_init_context(void) @@ -105,7 +107,11 @@ bool dinput_init_context(void) if (g_dinput_ctx) return true; - CoInitialize(NULL); + if (FAILED(CoInitialize(NULL))) + { + RARCH_ERR("[DINPUT]: Failed to initialize the COM interface\n"); + return false; + } /* Who said we shouldn't have same call signature in a COM API? <_< */ #ifdef __cplusplus @@ -125,6 +131,7 @@ bool dinput_init_context(void) error: RARCH_ERR("[DINPUT]: Failed to initialize DirectInput.\n"); + CoUninitialize(); return false; } From 54ac14e20563ad28e14cfbe2892b56f1e0a7493d Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 1 Jan 2019 17:47:19 +0100 Subject: [PATCH 093/116] Fix path problems after b201d669b5ea1470bb239036aa944342a0591a95, again My previous patch sometimes generated double slashes. All of these problems are because the original version of this function assumed that the app path always ends with a slash and the home path never does, which is not true on UWP (they both have a slash) --- libretro-common/file/file_path.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 408a242e27..a69f49decb 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -1028,7 +1028,16 @@ void fill_pathname_expand_special(char *out_path, out_path += src_size; size -= src_size; - in_path++; + if (!path_char_is_slash(out_path[-1])) + { + src_size = strlcpy(out_path, path_default_slash(), size); + retro_assert(src_size < size); + + out_path += src_size; + size -= src_size; + } + + in_path += 2; } free(home_dir); @@ -1050,7 +1059,16 @@ void fill_pathname_expand_special(char *out_path, out_path += src_size; size -= src_size; - in_path++; + if (!path_char_is_slash(out_path[-1])) + { + src_size = strlcpy(out_path, path_default_slash(), size); + retro_assert(src_size < size); + + out_path += src_size; + size -= src_size; + } + + in_path += 2; } free(application_dir); From 88b4ec61e73f26c18f16e2341eb102474c117915 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 1 Jan 2019 12:27:02 -0500 Subject: [PATCH 094/116] [info] use sublabels for controller information --- menu/cbs/menu_cbs_sublabel.c | 35 +++++++++++++++++++++ menu/menu_displaylist.c | 60 ++++++++++++++++++------------------ msg_hash.h | 1 + 3 files changed, 66 insertions(+), 30 deletions(-) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 7b4c258f89..0e3fe0c676 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -43,6 +43,8 @@ #include "../../dynamic.h" #include "../../configuration.h" #include "../../managers/cheat_manager.h" +#include "../input/input_driver.h" +#include "../tasks/tasks_internal.h" #define default_sublabel_macro(func_name, lbl) \ static int (func_name)(file_list_t *list, unsigned type, unsigned i, const char *label, const char *path, char *s, size_t len) \ @@ -499,6 +501,36 @@ default_sublabel_macro(action_bind_sublabel_switch_gpu_profile, MENU default_sublabel_macro(action_bind_sublabel_switch_backlight_control, MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL) #endif +static int action_bind_sublabel_systeminfo_controller_entry( + file_list_t *list, + unsigned type, unsigned i, + const char *label, const char *path, + char *s, size_t len) +{ + char tmp[len]; + unsigned controller; + + for(controller = 0; controller < MAX_USERS; controller++) + { + if (input_is_autoconfigured(controller)) + { + snprintf(tmp, sizeof(tmp), "Port #%d device name: %s (#%d)", + controller, + input_config_get_device_name(controller), + input_autoconfigure_get_device_name_index(controller)); + + if (string_is_equal(path, tmp)) + break; + } + } + snprintf(tmp, sizeof(tmp), "Device display name: %s\nDevice config name: %s\nDevice identifiers: %d/%d", + input_config_get_device_display_name(controller) ? input_config_get_device_display_name(controller) : "N/A", + input_config_get_device_display_name(controller) ? input_config_get_device_config_name(controller) : "N/A", + input_config_get_vid(controller), input_config_get_pid(controller)); + strlcpy(s, tmp, len); + + return 0; +} static int action_bind_sublabel_cheevos_entry( file_list_t *list, unsigned type, unsigned i, @@ -1859,6 +1891,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CPU_CORES: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_systeminfo_cpu_cores); break; + case MENU_ENUM_LABEL_SYSTEM_INFO_CONTROLLER_ENTRY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_systeminfo_controller_entry); + break; case MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_black_frame_insertion); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index cc742f2ce6..86ec3a3aba 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -387,6 +387,7 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) #endif const char *tmp_string = NULL; const frontend_ctx_driver_t *frontend = frontend_get_ptr(); + settings_t *settings = config_get_ptr(); tmp[0] = feat_str[0] = '\0'; @@ -504,40 +505,39 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) MENU_ENUM_LABEL_CPU_CORES, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); } - for(controller = 0; controller < MAX_USERS; controller++) { - if (input_is_autoconfigured(controller)) - { + if (input_is_autoconfigured(controller)) + { snprintf(tmp, sizeof(tmp), "Port #%d device name: %s (#%d)", - controller, - input_config_get_device_name(controller), - input_autoconfigure_get_device_name_index(controller)); + controller, + input_config_get_device_name(controller), + input_autoconfigure_get_device_name_index(controller)); menu_entries_append_enum(info->list, tmp, "", - MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, - MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(tmp, sizeof(tmp), "Port #%d device display name: %s", - controller, - input_config_get_device_display_name(controller) ? - input_config_get_device_display_name(controller) : "N/A"); - menu_entries_append_enum(info->list, tmp, "", - MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, - MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(tmp, sizeof(tmp), "Port #%d device config name: %s", - controller, - input_config_get_device_display_name(controller) ? - input_config_get_device_config_name(controller) : "N/A"); - menu_entries_append_enum(info->list, tmp, "", - MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, - MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(tmp, sizeof(tmp), "Port #%d device VID/PID: %d/%d", - controller, - input_config_get_vid(controller), - input_config_get_pid(controller)); - menu_entries_append_enum(info->list, tmp, "", - MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, - MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - } + MENU_ENUM_LABEL_SYSTEM_INFO_CONTROLLER_ENTRY, + MENU_SETTINGS_CORE_INFO_NONE, 0, 0); + if (string_is_equal(settings->arrays.menu_driver, "rgui")) + { + snprintf(tmp, sizeof(tmp), " Device display name: %s", + input_config_get_device_display_name(controller) ? + input_config_get_device_display_name(controller) : "N/A"); + menu_entries_append_enum(info->list, tmp, "", + MENU_ENUM_LABEL_SYSTEM_INFO_CONTROLLER_ENTRY, + MENU_SETTINGS_CORE_INFO_NONE, 0, 0); + snprintf(tmp, sizeof(tmp), " Device config name: %s", + input_config_get_device_display_name(controller) ? + input_config_get_device_config_name(controller) : "N/A"); + menu_entries_append_enum(info->list, tmp, "", + MENU_ENUM_LABEL_SYSTEM_INFO_CONTROLLER_ENTRY, + MENU_SETTINGS_CORE_INFO_NONE, 0, 0); + snprintf(tmp, sizeof(tmp), " Device VID/PID: %d/%d", + input_config_get_vid(controller), + input_config_get_pid(controller)); + menu_entries_append_enum(info->list, tmp, "", + MENU_ENUM_LABEL_SYSTEM_INFO_CONTROLLER_ENTRY, + MENU_SETTINGS_CORE_INFO_NONE, 0, 0); + } + } } if (frontend) diff --git a/msg_hash.h b/msg_hash.h index 012f8138f3..f61866d90f 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -540,6 +540,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_CORE_OPTION_ENTRY, MENU_ENUM_LABEL_NETWORK_INFO_ENTRY, MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, + MENU_ENUM_LABEL_SYSTEM_INFO_CONTROLLER_ENTRY, MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_ENUM_LABEL_PLAYLIST_ENTRY, From 051e5bd26253600bb3465afbafbc9807c9d22e6b Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 1 Jan 2019 12:35:29 -0500 Subject: [PATCH 095/116] [gui] add sublabel for start core --- intl/msg_hash_us.h | 4 ++++ menu/cbs/menu_cbs_sublabel.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index e6f2fae375..7a54b6445c 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4937,6 +4937,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_LIST, "Select which core to use." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_START_CORE, + "Start core without content." + ) MSG_HASH( MENU_ENUM_SUBLABEL_DOWNLOAD_CORE, "Install a core from the online updater." diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 0e3fe0c676..1ab2d9a050 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -189,6 +189,7 @@ default_sublabel_macro(action_bind_sublabel_netplay_nickname, MENU_ default_sublabel_macro(action_bind_sublabel_cheevos_username, MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME) default_sublabel_macro(action_bind_sublabel_cheevos_password, MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD) default_sublabel_macro(action_bind_sublabel_video_post_filter_record, MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD) +default_sublabel_macro(action_bind_sublabel_start_core, MENU_ENUM_SUBLABEL_START_CORE) default_sublabel_macro(action_bind_sublabel_core_list, MENU_ENUM_SUBLABEL_CORE_LIST) default_sublabel_macro(action_bind_sublabel_download_core, MENU_ENUM_SUBLABEL_DOWNLOAD_CORE) default_sublabel_macro(action_bind_sublabel_sideload_core_list, MENU_ENUM_SUBLABEL_SIDELOAD_CORE_LIST) @@ -1704,6 +1705,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_LOAD_CONTENT_SPECIAL: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_content_special); break; + case MENU_ENUM_LABEL_START_CORE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_start_core); + break; case MENU_ENUM_LABEL_CORE_LIST: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_list); break; From b8129a1381686644d8feff478f61997ce111c98d Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 1 Jan 2019 14:34:10 -0500 Subject: [PATCH 096/116] cleanup --- intl/msg_hash_us.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 7a54b6445c..666954acb2 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -59,11 +59,11 @@ MSG_HASH( ) MSG_HASH( MSG_PUBLIC_ADDRESS, - "UPNP Port Mapping Successful" + "Port Mapping Successful" ) MSG_HASH( MSG_UPNP_FAILED, - "UPNP Port Mapping Failed" + "Port Mapping Failed" ) MSG_HASH( MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, From 541dc13d64f6d12697431196e00760a52edd141b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 2 Jan 2019 01:15:30 +0100 Subject: [PATCH 097/116] We cannot have VLAs --- menu/cbs/menu_cbs_sublabel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 1ab2d9a050..20bdea1fed 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -508,7 +508,7 @@ static int action_bind_sublabel_systeminfo_controller_entry( const char *label, const char *path, char *s, size_t len) { - char tmp[len]; + char tmp[4096]; unsigned controller; for(controller = 0; controller < MAX_USERS; controller++) From 7ac080ea50d89507419cb26dad571c8c59846e50 Mon Sep 17 00:00:00 2001 From: orbea Date: Tue, 1 Jan 2019 17:11:16 -0800 Subject: [PATCH 098/116] sdl: Flush the joypad events. Bastien found a fix to the issue "The lag after 10-15 minutes issue appears to be a bug in the sdl2 input driver in RetroArch. RetroArch never clears the SDL event queue. After a while it is so large it takes a significant time to traverse." Fixes https://github.com/libretro/RetroArch/issues/7868 Solution thanks to Bastien. --- input/drivers_joypad/sdl_joypad.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/input/drivers_joypad/sdl_joypad.c b/input/drivers_joypad/sdl_joypad.c index 05ccfad1a5..8a3c224ab6 100644 --- a/input/drivers_joypad/sdl_joypad.c +++ b/input/drivers_joypad/sdl_joypad.c @@ -399,6 +399,8 @@ static void sdl_joypad_poll(void) break; } } + + SDL_FlushEvents(SDL_JOYAXISMOTION, SDL_CONTROLLERDEVICEREMAPPED); #else SDL_JoystickUpdate(); #endif From aa75ae5f04ce44fefcba569d1c4fff46034be840 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Wed, 2 Jan 2019 02:26:17 +0100 Subject: [PATCH 099/116] Update CHANGES.md --- CHANGES.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5bf7e2d8f7..d0e3a4c545 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,8 +5,9 @@ - CPU FILTERS: Add Normal2x filter. - DATE: Add Date / Time style options. - DEBUGGING: Add an integrated crash handler for debug builds (see https://docs.libretro.com/tech/debugging) -- DISCORD: Register the application name properly -- DISK CONTROL: Remember the last used folder / current active folder to make disk-swapping faster +- DISCORD: Register the application name properly. +- DISK CONTROL: Remember the last used folder / current active folder to make disk-swapping faster. +- INPUT/SDL: Flush the joypad events. Decreases cpu usage over time with the SDL joypad driver. - LOCALIZATION: Add Greek translation. - LOCALIZATION: Update German translation. - LOCALIZATION: Update Italian translation. From ff1ca997488765f9bd83d63ccca637c29d770b55 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 2 Jan 2019 07:27:47 +0100 Subject: [PATCH 100/116] (MSVC 2017 UWP) Buildfix (MSVC 2017 UWP) Renaming --- audio/drivers/xaudio.c | 10 ++++------ .../Assets/LargeTile.scale-100.png | Bin .../Assets/LargeTile.scale-200.png | Bin .../Assets/LargeTile.scale-400.png | Bin .../Assets/SmallTile.scale-100.png | Bin .../Assets/SmallTile.scale-200.png | Bin .../Assets/SmallTile.scale-400.png | Bin .../Assets/Square150x150Logo.scale-100.png | Bin .../Assets/Square150x150Logo.scale-200.png | Bin .../Assets/Square150x150Logo.scale-400.png | Bin ...uare44x44Logo.altform-unplated_targetsize-16.png | Bin ...are44x44Logo.altform-unplated_targetsize-256.png | Bin ...uare44x44Logo.altform-unplated_targetsize-48.png | Bin .../Assets/Square44x44Logo.scale-100.png | Bin .../Assets/Square44x44Logo.scale-200.png | Bin .../Assets/Square44x44Logo.scale-400.png | Bin .../Assets/Square44x44Logo.targetsize-16.png | Bin .../Assets/Square44x44Logo.targetsize-256.png | Bin .../Assets/Square44x44Logo.targetsize-48.png | Bin .../Assets/StoreLogo.scale-100.png | Bin .../Assets/StoreLogo.scale-200.png | Bin .../Assets/StoreLogo.scale-400.png | Bin .../Assets/Wide310x150Logo.scale-100.png | Bin .../Assets/Wide310x150Logo.scale-200.png | Bin .../Assets/Wide310x150Logo.scale-400.png | Bin .../Package.appxmanifest | 0 .../RetroArch-msvc2017-UWP-cores-nonfree.vcxproj} | 6 +++--- ...Arch-msvc2017-UWP-cores-nonfree.vcxproj.filters} | 0 .../cores/ARM/.empty | 0 .../cores/ARM/cores/.empty | 0 .../cores/ARM64/.empty | 0 .../cores/ARM64/cores/.empty | 0 .../cores/Win32/.empty | 0 .../cores/Win32/cores/.empty | 0 .../cores/x64/.empty | 0 .../cores/x64/cores/.empty | 0 .../dummy.cpp | 0 ...RetroArch-UWP.sln => RetroArch-msvc2017-UWP.sln} | 4 ++-- .../Assets/LargeTile.scale-100.png | Bin .../Assets/LargeTile.scale-200.png | Bin .../Assets/LargeTile.scale-400.png | Bin .../Assets/SmallTile.scale-100.png | Bin .../Assets/SmallTile.scale-200.png | Bin .../Assets/SmallTile.scale-400.png | Bin .../Assets/SplashScreen.scale-100.png | Bin .../Assets/SplashScreen.scale-200.png | Bin .../Assets/SplashScreen.scale-400.png | Bin .../Assets/Square150x150Logo.scale-100.png | Bin .../Assets/Square150x150Logo.scale-200.png | Bin .../Assets/Square150x150Logo.scale-400.png | Bin ...uare44x44Logo.altform-unplated_targetsize-16.png | Bin ...are44x44Logo.altform-unplated_targetsize-256.png | Bin ...uare44x44Logo.altform-unplated_targetsize-48.png | Bin .../Assets/Square44x44Logo.scale-100.png | Bin .../Assets/Square44x44Logo.scale-200.png | Bin .../Assets/Square44x44Logo.scale-400.png | Bin .../Assets/Square44x44Logo.targetsize-16.png | Bin .../Assets/Square44x44Logo.targetsize-256.png | Bin .../Assets/Square44x44Logo.targetsize-48.png | Bin .../Assets/StoreLogo.scale-100.png | Bin .../Assets/StoreLogo.scale-200.png | Bin .../Assets/StoreLogo.scale-400.png | Bin .../Assets/Wide310x150Logo.scale-100.png | Bin .../Assets/Wide310x150Logo.scale-200.png | Bin .../Assets/Wide310x150Logo.scale-400.png | Bin .../Bundle.Mapping.txt | 0 .../Package.appxmanifest | 0 .../RetroArch-msvc2017-UWP.vcxproj} | 0 .../RetroArch-msvc2017-UWP.vcxproj.filters} | 0 .../RetroArch-msvc2017-UWP_TemporaryKey.pfx} | Bin .../cores/ARM/.empty | 0 .../cores/ARM/cores/.empty | 0 .../cores/ARM64/.empty | 0 .../cores/ARM64/cores/.empty | 0 .../cores/Win32/.empty | 0 .../cores/Win32/cores/.empty | 0 .../cores/x64/.empty | 0 .../cores/x64/cores/.empty | 0 78 files changed, 9 insertions(+), 11 deletions(-) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/LargeTile.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/LargeTile.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/LargeTile.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/SmallTile.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/SmallTile.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/SmallTile.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square150x150Logo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square150x150Logo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square150x150Logo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.altform-unplated_targetsize-16.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.altform-unplated_targetsize-256.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.altform-unplated_targetsize-48.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.targetsize-16.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.targetsize-256.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Square44x44Logo.targetsize-48.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/StoreLogo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/StoreLogo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/StoreLogo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Wide310x150Logo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Wide310x150Logo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Assets/Wide310x150Logo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/Package.appxmanifest (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj => RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj} (98%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters => RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj.filters} (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/ARM/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/ARM/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/ARM64/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/ARM64/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/Win32/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/Win32/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/x64/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/cores/x64/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP-cores-nonfree => RetroArch-msvc2017-UWP-cores-nonfree}/dummy.cpp (100%) rename pkg/msvc-uwp/{RetroArch-UWP.sln => RetroArch-msvc2017-UWP.sln} (92%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/LargeTile.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/LargeTile.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/LargeTile.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/SmallTile.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/SmallTile.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/SmallTile.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/SplashScreen.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/SplashScreen.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/SplashScreen.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square150x150Logo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square150x150Logo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square150x150Logo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.altform-unplated_targetsize-16.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.altform-unplated_targetsize-256.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.altform-unplated_targetsize-48.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.targetsize-16.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.targetsize-256.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Square44x44Logo.targetsize-48.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/StoreLogo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/StoreLogo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/StoreLogo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Wide310x150Logo.scale-100.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Wide310x150Logo.scale-200.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Assets/Wide310x150Logo.scale-400.png (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Bundle.Mapping.txt (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/Package.appxmanifest (100%) rename pkg/msvc-uwp/{RetroArch-UWP/RetroArch-UWP.vcxproj => RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj} (100%) rename pkg/msvc-uwp/{RetroArch-UWP/RetroArch-UWP.vcxproj.filters => RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters} (100%) rename pkg/msvc-uwp/{RetroArch-UWP/RetroArch-UWP_TemporaryKey.pfx => RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx} (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/ARM/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/ARM/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/ARM64/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/ARM64/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/Win32/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/Win32/cores/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/x64/.empty (100%) rename pkg/msvc-uwp/{RetroArch-UWP => RetroArch-msvc2017-UWP}/cores/x64/cores/.empty (100%) diff --git a/audio/drivers/xaudio.c b/audio/drivers/xaudio.c index da57ee9f2b..594d3124d4 100644 --- a/audio/drivers/xaudio.c +++ b/audio/drivers/xaudio.c @@ -201,10 +201,8 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, { xaudio2_t *handle = NULL; WAVEFORMATEX wfx = {0}; - HRESULT hr; - -#ifndef _XBOX - hr = CoInitialize(NULL); +#if !defined(_XBOX) && !defined(__WINRT__) + HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) return NULL; #endif @@ -258,7 +256,7 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, error: xaudio2_free(handle); -#ifndef _XBOX +#if !defined(_XBOX) && !defined(__WINRT__) CoUninitialize(); #endif return NULL; @@ -411,7 +409,7 @@ static void xa_free(void *data) xaudio2_free(xa->xa); free(xa); -#ifndef _XBOX +#if !defined(_XBOX) && !defined(__WINRT__) CoUninitialize(); #endif } diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/LargeTile.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/LargeTile.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/LargeTile.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/LargeTile.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/LargeTile.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/LargeTile.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/LargeTile.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/SmallTile.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/SmallTile.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/SmallTile.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/SmallTile.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/SmallTile.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/SmallTile.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/SmallTile.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square150x150Logo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square150x150Logo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square150x150Logo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square150x150Logo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square150x150Logo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square150x150Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square150x150Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-16.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-16.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-16.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-256.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-256.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-256.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-48.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-48.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.altform-unplated_targetsize-48.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-16.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-16.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-16.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-16.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-256.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-256.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-256.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-256.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-48.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-48.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-48.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Square44x44Logo.targetsize-48.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/StoreLogo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/StoreLogo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/StoreLogo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/StoreLogo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/StoreLogo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/StoreLogo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/StoreLogo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Assets/Wide310x150Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Package.appxmanifest b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Package.appxmanifest similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/Package.appxmanifest rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/Package.appxmanifest diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj similarity index 98% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj index 99539b2ed8..07b6a388d8 100644 --- a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj +++ b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj @@ -2,7 +2,7 @@ {cc7b9a23-bd64-4eb9-9d8f-f5115fb8960f} - RetroArchUWP_cores_nonfree + RetroArch_msvc2017_UWP_cores_nonfree en-US 14.0 true @@ -118,7 +118,7 @@ - ..\RetroArch-UWP\RetroArch-UWP_TemporaryKey.pfx + ..\msvc2017-UWP\RetroArch-msvc2017-UWP_TemporaryKey.pfx False False Always @@ -227,4 +227,4 @@ - \ No newline at end of file + diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj.filters similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/RetroArch-UWP-cores-nonfree.vcxproj.filters rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/RetroArch-msvc2017-UWP-cores-nonfree.vcxproj.filters diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM64/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM64/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM64/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/ARM64/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/ARM64/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/Win32/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/Win32/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/Win32/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/Win32/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/Win32/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/x64/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/x64/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/x64/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/cores/x64/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/cores/x64/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/dummy.cpp b/pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/dummy.cpp similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP-cores-nonfree/dummy.cpp rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP-cores-nonfree/dummy.cpp diff --git a/pkg/msvc-uwp/RetroArch-UWP.sln b/pkg/msvc-uwp/RetroArch-msvc2017-UWP.sln similarity index 92% rename from pkg/msvc-uwp/RetroArch-UWP.sln rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP.sln index 29d683556e..7cd6c43dd7 100644 --- a/pkg/msvc-uwp/RetroArch-UWP.sln +++ b/pkg/msvc-uwp/RetroArch-msvc2017-UWP.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28307.168 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-UWP", "RetroArch-UWP\RetroArch-UWP.vcxproj", "{F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-msvc2017-UWP", "RetroArch-msvc2017-UWP\RetroArch-msvc2017-UWP.vcxproj", "{F5E937B6-1BA0-4446-B94B-F3BBDEF908F4}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-UWP-cores-nonfree", "RetroArch-UWP-cores-nonfree\RetroArch-UWP-cores-nonfree.vcxproj", "{CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-msvc2017-UWP-cores-nonfree", "RetroArch-msvc2017-UWP-cores-nonfree\RetroArch-msvc2017-UWP-cores-nonfree.vcxproj", "{CC7B9A23-BD64-4EB9-9D8F-F5115FB8960F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/LargeTile.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/LargeTile.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/LargeTile.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/LargeTile.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/LargeTile.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/LargeTile.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/LargeTile.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SmallTile.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SmallTile.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SmallTile.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SmallTile.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SmallTile.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/SmallTile.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SmallTile.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SplashScreen.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SplashScreen.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SplashScreen.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SplashScreen.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SplashScreen.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/SplashScreen.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/SplashScreen.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square150x150Logo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square150x150Logo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square150x150Logo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square150x150Logo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square150x150Logo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square150x150Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square150x150Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-16.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.targetsize-16.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-16.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.targetsize-16.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-256.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.targetsize-256.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-256.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.targetsize-256.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-48.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.targetsize-48.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Square44x44Logo.targetsize-48.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Square44x44Logo.targetsize-48.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/StoreLogo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/StoreLogo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/StoreLogo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/StoreLogo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/StoreLogo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/StoreLogo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/StoreLogo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-100.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Wide310x150Logo.scale-100.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-100.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Wide310x150Logo.scale-100.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-200.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Wide310x150Logo.scale-200.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-200.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Wide310x150Logo.scale-200.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-400.png b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Wide310x150Logo.scale-400.png similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Assets/Wide310x150Logo.scale-400.png rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Assets/Wide310x150Logo.scale-400.png diff --git a/pkg/msvc-uwp/RetroArch-UWP/Bundle.Mapping.txt b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Bundle.Mapping.txt similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Bundle.Mapping.txt rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Bundle.Mapping.txt diff --git a/pkg/msvc-uwp/RetroArch-UWP/Package.appxmanifest b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/Package.appxmanifest rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest diff --git a/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj diff --git a/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj.filters b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP.vcxproj.filters rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters diff --git a/pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP_TemporaryKey.pfx b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/RetroArch-UWP_TemporaryKey.pfx rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/ARM/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/ARM/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM64/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM64/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM64/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/ARM64/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/ARM64/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/Win32/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/Win32/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/Win32/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/Win32/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/Win32/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/Win32/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/Win32/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/Win32/cores/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/x64/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/x64/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/x64/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/x64/.empty diff --git a/pkg/msvc-uwp/RetroArch-UWP/cores/x64/cores/.empty b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/x64/cores/.empty similarity index 100% rename from pkg/msvc-uwp/RetroArch-UWP/cores/x64/cores/.empty rename to pkg/msvc-uwp/RetroArch-msvc2017-UWP/cores/x64/cores/.empty From 9c5c0aea58aea6d8178edeb891d46fe41a3a7e5e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 2 Jan 2019 13:30:58 +0100 Subject: [PATCH 101/116] Start replacing WinRT ifdefs so that Windows Phone 8 can be detected too --- configuration.c | 6 +- core_info.c | 4 +- dynamic.c | 4 +- frontend/drivers/platform_win32.c | 169 ++++++++++++------------ libretro-common/features/features_cpu.c | 2 +- menu/menu_displaylist.c | 13 +- 6 files changed, 104 insertions(+), 94 deletions(-) diff --git a/configuration.c b/configuration.c index aef1d7db2a..d159e75c29 100644 --- a/configuration.c +++ b/configuration.c @@ -56,7 +56,7 @@ #include "record/record_driver.h" -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP #include "uwp/uwp_func.h" #endif @@ -439,7 +439,7 @@ static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_ALSA; static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_NULL; #endif -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_UWP; #elif defined(XENON) static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XENON360; @@ -2238,7 +2238,7 @@ static config_file_t *open_default_config_file(void) (void)path_size; #if defined(_WIN32) && !defined(_XBOX) -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* On UWP, the app install directory is not writable so use the writable LocalState dir instead */ fill_pathname_home_dir(app_path, path_size); #else diff --git a/core_info.c b/core_info.c index c356eb7a47..5a33e9f107 100644 --- a/core_info.c +++ b/core_info.c @@ -32,7 +32,7 @@ #include "core_info.h" #include "file_path_special.h" -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP #include "uwp/uwp_func.h" #endif @@ -242,7 +242,7 @@ static core_info_list_t *core_info_list_new(const char *path, ok = dir_list_append(contents, path, exts, false, show_hidden_files, false, false); -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* UWP: browse the optional packages for additional cores */ struct string_list *core_packages = string_list_new(); uwp_fill_installed_core_packages(core_packages); diff --git a/dynamic.c b/dynamic.c index 4f102e03a4..cbe706c79a 100644 --- a/dynamic.c +++ b/dynamic.c @@ -306,7 +306,9 @@ static void libretro_get_environment_info(void (*func)(retro_environment_t), static bool load_dynamic_core(void) { -#ifndef __WINRT__ /* Can't lookup symbols in itself on UWP */ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP + /* Can't lookup symbols in itself on UWP */ +#else function_t sym = dylib_proc(NULL, "retro_init"); if (sym) diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index c655a594c5..c66cb3835f 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -43,11 +43,12 @@ #include "../../verbosity.h" #include "../../ui/drivers/ui_win32.h" -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP #include "../../uwp/uwp_func.h" #endif -#ifndef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else /* We only load this library once, so we let it be * unloaded at application shutdown, since unloading * it early seems to cause issues on some systems. @@ -157,7 +158,6 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) char buildStr[11] = {0}; bool server = false; const char *arch = ""; - bool serverR2 = false; #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 /* Windows 2000 and later */ @@ -171,9 +171,6 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) GetVersionEx((OSVERSIONINFO*)&vi); server = vi.wProductType != VER_NT_WORKSTATION; -#ifndef __WINRT__ - serverR2 = GetSystemMetrics(SM_SERVERR2); -#endif switch (si.wProcessorArchitecture) { @@ -253,10 +250,14 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) { case 2: if (server) - if (serverR2) - strlcpy(s, "Windows Server 2003 R2", len); - else - strlcpy(s, "Windows Server 2003", len); + { + strlcpy(s, "Windows Server 2003", len); +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else + if (GetSystemMetrics(SM_SERVERR2)) + strlcat(s, " R2", len); +#endif + } else { /* Yes, XP Pro x64 is a higher version number than XP x86 */ @@ -311,7 +312,7 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) strlcat(s, vi.szCSDVersion, len); } -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP if (!string_is_empty(uwp_device_family)) { strlcat(s, " ", len); @@ -322,7 +323,8 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) static void frontend_win32_init(void *data) { -#ifndef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else typedef BOOL (WINAPI *isProcessDPIAwareProc)(); typedef BOOL (WINAPI *setProcessDPIAwareProc)(); #ifdef HAVE_DYNAMIC @@ -407,22 +409,7 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) enum msg_hash_enums enum_idx = load_content ? MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : MSG_UNKNOWN; -#ifndef __WINRT__ - size_t i = 0; - unsigned drives = GetLogicalDrives(); - char drive[] = " :\\"; - - for (i = 0; i < 32; i++) - { - drive[0] = 'A' + i; - if (drives & (1 << i)) - menu_entries_append_enum(list, - drive, - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - } -#else +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* TODO (krzys_h): UWP storage sandboxing */ char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); @@ -437,6 +424,21 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) FILE_TYPE_DIRECTORY, 0, 0); free(home_dir); +#else + size_t i = 0; + unsigned drives = GetLogicalDrives(); + char drive[] = " :\\"; + + for (i = 0; i < 32; i++) + { + drive[0] = 'A' + i; + if (drives & (1 << i)) + menu_entries_append_enum(list, + drive, + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + } #endif #endif @@ -446,56 +448,7 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) static void frontend_win32_environment_get(int *argc, char *argv[], void *args, void *params_data) { -#ifndef __WINRT__ - gfx_set_dwm(); - - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], - ":\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER], - ":\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], - ":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS], - ":\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE], - ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR], - ":\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], - ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], - ":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], - ":\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], - ":\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP], - ":\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], - ":\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], - ":\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY], - ":\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE], - ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], - ":\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], - ":\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER], - ":\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], - ":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], - ":\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM], - ":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], - ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], - ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); -#else +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* On UWP, we have to use the writable directory instead of the install directory */ fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], "~\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); @@ -545,6 +498,55 @@ static void frontend_win32_environment_get(int *argc, char *argv[], "~\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], "~\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); +#else + gfx_set_dwm(); + + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], + ":\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER], + ":\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], + ":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS], + ":\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE], + ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR], + ":\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], + ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], + ":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], + ":\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], + ":\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP], + ":\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], + ":\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], + ":\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY], + ":\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE], + ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], + ":\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], + ":\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER], + ":\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + ":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], + ":\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM], + ":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], + ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], + ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); #endif #ifdef HAVE_MENU @@ -589,7 +591,8 @@ static uint64_t frontend_win32_get_mem_used(void) #endif } -#ifndef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else static void frontend_win32_attach_console(void) { #ifdef _WIN32 @@ -672,12 +675,12 @@ frontend_ctx_driver_t frontend_ctx_win32 = { NULL, /* get_sighandler_state */ NULL, /* set_sighandler_state */ NULL, /* destroy_sighandler_state */ -#ifndef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP + NULL, + NULL, +#else frontend_win32_attach_console, /* attach_console */ frontend_win32_detach_console, /* detach_console */ -#else - NULL, - NULL, #endif NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ diff --git a/libretro-common/features/features_cpu.c b/libretro-common/features/features_cpu.c index 046e880adf..51234c1878 100644 --- a/libretro-common/features/features_cpu.c +++ b/libretro-common/features/features_cpu.c @@ -485,7 +485,7 @@ unsigned cpu_features_get_core_amount(void) #if defined(_WIN32) && !defined(_XBOX) /* Win32 */ SYSTEM_INFO sysinfo; -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP GetNativeSystemInfo(&sysinfo); #else GetSystemInfo(&sysinfo); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index f3f6816416..8e2f2e8c16 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -359,7 +359,8 @@ static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) } } -#ifndef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else if (settings->bools.menu_show_core_updater) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_DELETE), @@ -3104,7 +3105,8 @@ static unsigned menu_displaylist_parse_options( MENU_SETTING_ACTION, 0, 0); count++; #elif defined(HAVE_NETWORKING) -#ifndef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else if (settings->bools.menu_show_core_updater) { menu_entries_append_enum(info->list, @@ -3624,7 +3626,7 @@ static unsigned menu_displaylist_parse_cores( ok = dir_list_append(str_list, path, info->exts, true, settings->bools.show_hidden_files, true, false); -#ifdef __WINRT__ +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* UWP: browse the optional packages for additional cores */ struct string_list *core_packages = string_list_new(); uwp_fill_installed_core_packages(core_packages); @@ -4175,7 +4177,9 @@ bool menu_displaylist_process(menu_displaylist_info_t *info) if (info->need_sort) file_list_sort_on_alt(info->list); -#if defined(HAVE_NETWORKING) && !defined(__WINRT__) +#if defined(HAVE_NETWORKING) +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#else if (settings->bools.menu_show_core_updater && !settings->bools.kiosk_mode_enable) { if (info->download_core) @@ -4193,6 +4197,7 @@ bool menu_displaylist_process(menu_displaylist_info_t *info) MENU_SETTING_ACTION, 0, 0); } } +#endif #endif if (info->push_builtin_cores) From 5fcec0f5612a17d1f16c01dd3bd4bcd337cc908f Mon Sep 17 00:00:00 2001 From: orbea Date: Wed, 2 Jan 2019 20:28:54 -0800 Subject: [PATCH 102/116] menu: Add sublabel for 'menu_horizontal_animation'. Fixes https://github.com/libretro/RetroArch/issues/5271. --- config.def.h | 1 + intl/msg_hash_ar.h | 9 +++++++-- intl/msg_hash_chs.h | 9 +++++++-- intl/msg_hash_cht.h | 11 +++++++++-- intl/msg_hash_de.h | 9 +++++++-- intl/msg_hash_el.h | 4 ++++ intl/msg_hash_eo.h | 9 +++++++-- intl/msg_hash_es.h | 6 +++++- intl/msg_hash_fr.h | 11 +++++++++-- intl/msg_hash_it.h | 9 +++++++-- intl/msg_hash_ja.h | 9 +++++++-- intl/msg_hash_ko.h | 11 +++++++++-- intl/msg_hash_nl.h | 11 +++++++++-- intl/msg_hash_pl.h | 9 +++++++-- intl/msg_hash_pt_br.h | 4 ++++ intl/msg_hash_pt_pt.h | 11 +++++++++-- intl/msg_hash_ru.h | 11 +++++++++-- intl/msg_hash_us.h | 6 +++++- intl/msg_hash_vn.h | 11 +++++++++-- menu/cbs/menu_cbs_sublabel.c | 4 ++++ 20 files changed, 135 insertions(+), 30 deletions(-) diff --git a/config.def.h b/config.def.h index 7ab919da62..b5a3a63b47 100644 --- a/config.def.h +++ b/config.def.h @@ -302,6 +302,7 @@ static bool quick_menu_show_save_content_dir_overrides = true; static bool kiosk_mode_enable = false; +static bool menu_horizontal_animation = true; static bool menu_show_online_updater = true; static bool menu_show_load_core = true; static bool menu_show_load_content = true; diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 8fa2330b82..ef0fd5921a 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -7,8 +7,9 @@ MSG_HASH( "Unknown compiler" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Device disconnected from port" @@ -145,6 +146,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Adjusts menu screen appearance settings." diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 66a7eca707..97e543affc 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -35,8 +35,9 @@ MSG_HASH( "未知的编译器" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "设备已从端口上断开" @@ -133,6 +134,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "调整菜单屏幕相关的设置。" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index b314f009b8..05ff2c10f7 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -7,8 +7,9 @@ MSG_HASH( "未知的編譯器" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "設備已從連接口上移開" @@ -105,6 +106,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "使用模擬器硬體渲染私人內容時可避免硬體在各frames時的狀態改變." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "調整選單顯示的相關設定。" @@ -985,6 +990,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, /* TODO/FIXME - updat "選單文件瀏覽器") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "選單線性過濾") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "選單") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 214f52dbf3..f690ec327d 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -35,8 +35,9 @@ MSG_HASH( "Unbekannter Compiler" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Gerät von Anschluss getrennt" @@ -133,6 +134,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Gibt Hardware-gerenderten Cores einen eigenen privaten Kontext. Vermeidet, dass der Hardware-Status zwischen den Frames geschätzt werden muss." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Legt die Einstellungen für das Aussehen des Menübildschirms fest." diff --git a/intl/msg_hash_el.h b/intl/msg_hash_el.h index a6c9cbb4e7..fae4ab9b95 100644 --- a/intl/msg_hash_el.h +++ b/intl/msg_hash_el.h @@ -146,6 +146,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Προσαρμόζει τις εμφανισιακές ρυθμίσεις της οθόνης του μενού." diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 9fe65dfbe6..f26d9f4c96 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -7,8 +7,9 @@ MSG_HASH( "Unknown compiler" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Device disconnected from port" @@ -45,6 +46,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Adjusts settings related to the appearance of the menu screen." diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 686d0662bb..cbbb73f97e 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -173,6 +173,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Dar a los núcleos renderizados por hardware un contexto privado. Evita tener que asumir cambios en el estado del hardware entre cuadros" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Ajusta la apariencia del menú" @@ -7907,4 +7911,4 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_HOLD_START, "Mantener Start (2 segundos)" - ) \ No newline at end of file + ) diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 37ac633783..ec9d2803c9 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -7,8 +7,9 @@ MSG_HASH( "Compilateur inconnu" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Périphérique déconnecté du port" @@ -105,6 +106,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Donne aux cœurs bénéficiant de l'accélération graphique leur propre contexte. Évite d'avoir à supposer des changements d'état matériel entre deux images." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Ajuster les réglages et l'apparence du menu." @@ -989,6 +994,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Réglages") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Filtre linéaire pour le menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Appearance") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index e7668d494b..6ab4cbd73c 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -7,8 +7,9 @@ MSG_HASH( "Compilatore sconosciuto" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Dispositivo disconnesso dalla porta" @@ -105,6 +106,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Fornisce i core hardware nel proprio contesto privato. Evita di assumere cambiamenti di stato hardware tra i fotogrammi." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Regola le impostazioni relative all'aspetto della schermata del menu." diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 109939b0f0..5b1f980024 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -12,8 +12,9 @@ MSG_HASH( "不明なコンパイラ" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "デバイスがポートから切断されました" @@ -150,6 +151,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "メニューの外観に関係する設定を変更します。" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index b94ce77dc2..4d6d3cc5f6 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -7,8 +7,9 @@ MSG_HASH( "알 수 없는 컴파일러" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "장치가 포트에서 연결 해제 되었습니다" @@ -105,6 +106,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "하드웨어 렌더링된 코어에 고유의 컨텍스트를 부여. 프레임간 하드웨어 상태가 변경된 것으로 가정하지 않도록 함." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "화면 표시 설정을 조정합니다." @@ -970,6 +975,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "설정") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "메뉴 선형 필터") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "메뉴") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 1426e3b5f9..17677a9825 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -7,8 +7,9 @@ MSG_HASH( "Onbekende compiler" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Apparaat ontkoppeld van port" @@ -45,6 +46,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Adjusts settings related to the appearance of the menu screen." @@ -905,6 +910,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Instellingen") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Menu Linear Filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Uiterlijk") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 86d03816a9..59853c16d0 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -7,8 +7,9 @@ MSG_HASH( "Nieznany kompilator" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Urządzenie zostało odłączone od portu" @@ -145,6 +146,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Nadaj rdzeniom sprzętowym własny prywatny kontekst. Unikaj konieczności przejmowania zmian stanu sprzętu pomiędzy klatkami." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Dostosuj ustawienia wyglądu ekranu menu." diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 3bb3c1a358..7c23ba87bf 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -173,6 +173,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Dar aos núcleos renderizados por hardware seu próprio contexto privado. Evita ter que assumir mudanças de estado de hardware entre quadros." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Ajusta as configurações de aparência da tela de menu." diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 84b8e21efc..929abe53d6 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -7,8 +7,9 @@ MSG_HASH( "Compilador desconhecido" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Dispositivo desconectado da porta" @@ -105,6 +106,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Dê aos núcleos renderizados por hardware o seu próprio contexto privado. Evita ter que assumir mudanças de estado de hardware entre frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "ajusta as definições de aparência no ecrã do menu." @@ -970,6 +975,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Definições") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Filtro linear do menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Aparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 7fdb5e26d8..e531e1964e 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -12,8 +12,9 @@ MSG_HASH( "Неизвестный компилятор" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Устройство отключено от порта" @@ -110,6 +111,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Предоставьте аппаратно-рендерированным ядрам собственный контекст. Избегайте принятия изменений состояния оборудования между кадрами." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Настройка параметров, относящихся к внешнему виду экрана меню." @@ -993,6 +998,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Линейный фильтр меню") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 666954acb2..12f37dd898 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -177,6 +177,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Adjusts menu screen appearance settings." @@ -7915,4 +7919,4 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_HOLD_START, "Hold Start (2 seconds)" - ) \ No newline at end of file + ) diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 33f84b7482..a7bb34ce4c 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -7,8 +7,9 @@ MSG_HASH( "Unknown compiler" ) MSG_HASH( - MSG_NATIVE, - "Native") + MSG_NATIVE, + "Native" + ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, "Device disconnected from port" @@ -105,6 +106,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Enable horizontal animation for the menu. This will have a performance hit." + ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, "Điều chỉnh thiết lập related to the appearance of the menu screen." @@ -991,6 +996,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Settings") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Menu Linear Filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Appearance") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 20bdea1fed..207f325afb 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -387,6 +387,7 @@ default_sublabel_macro(action_bind_sublabel_ozone_menu_color_theme, default_sublabel_macro(action_bind_sublabel_menu_use_preferred_system_color_theme, MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME) default_sublabel_macro(action_bind_sublabel_menu_wallpaper_opacity, MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY) default_sublabel_macro(action_bind_sublabel_menu_framebuffer_opacity, MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY) +default_sublabel_macro(action_bind_sublabel_menu_horizontal_animation, MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION) default_sublabel_macro(action_bind_sublabel_menu_ribbon_enable, MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_font, MENU_ENUM_SUBLABEL_XMB_FONT) default_sublabel_macro(action_bind_sublabel_quick_menu_show_take_screenshot, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT) @@ -1137,6 +1138,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_FRAMEBUFFER_OPACITY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_framebuffer_opacity); break; + case MENU_ENUM_LABEL_MENU_HORIZONTAL_ANIMATION: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_horizontal_animation); + break; case MENU_ENUM_LABEL_MENU_WALLPAPER_OPACITY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_wallpaper_opacity); break; From f1fc622e993a5d856cba6c22cd19983bb7bf8bf7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 11:40:21 +0100 Subject: [PATCH 103/116] (UWP) - Implement retro_sleep with SleepEx (untested) --- libretro-common/include/retro_timers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/include/retro_timers.h b/libretro-common/include/retro_timers.h index d5526bc637..884c078942 100644 --- a/libretro-common/include/retro_timers.h +++ b/libretro-common/include/retro_timers.h @@ -96,7 +96,7 @@ static INLINE void retro_sleep(unsigned msec) #elif defined(_3DS) svcSleepThread(1000000 * (s64)msec); #elif defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - /* TODO/FIXME */ + SleepEx(msec, FALSE); #elif defined(_WIN32) Sleep(msec); #elif defined(XENON) From 8b0f7051acbc016d744d1f706bb485af8f8ce230 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 11:45:24 +0100 Subject: [PATCH 104/116] (MSVC 2003) Buildfix --- frontend/drivers/platform_win32.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index c66cb3835f..d82bf5907a 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -43,6 +43,10 @@ #include "../../verbosity.h" #include "../../ui/drivers/ui_win32.h" +#ifndef SM_SERVERR2 +#define SM_SERVERR2 89 +#endif + #if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP #include "../../uwp/uwp_func.h" #endif From 1591bc2db21b5b4c5148b3352750532f557a5048 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Wed, 26 Dec 2018 23:40:57 +0100 Subject: [PATCH 105/116] Create Audio Driver from PS2 --- Makefile.ps2 | 10 +- audio/audio_driver.c | 3 + audio/drivers/ps2_audio.c | 275 +++++++++++++++++++++++ frontend/drivers/platform_ps2.c | 15 +- griffin/griffin.c | 2 +- libretro-common/vfs/vfs_implementation.c | 2 +- 6 files changed, 294 insertions(+), 13 deletions(-) create mode 100644 audio/drivers/ps2_audio.c diff --git a/Makefile.ps2 b/Makefile.ps2 index 369a66198d..7f11a362ba 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -1,12 +1,12 @@ BUILD_PRX = 0 -DEBUG = 0 +DEBUG = 1 HAVE_KERNEL_PRX = 0 HAVE_LOGGER = 0 HAVE_FILE_LOGGER = 1 HAVE_THREADS = 0 BIG_STACK = 0 WHOLE_ARCHIVE_LINK = 0 -PS2_IP = 192.168.2.150 +PS2_IP = 192.168.1.150 #Configuration for IRX EE_BIN2O = bin2o @@ -31,16 +31,16 @@ INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include INCDIR += -Ips2 -Ips2/include -Ilibretro-common/include INCDIR += -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ideps/pthreads -Ideps/pthreads/platform/ps2 -Ideps/pthreads/platform/helper GPVAL = -G0 -CFLAGS = $(OPTIMIZE_LV) -ffast-math -fsingle-precision-constant +CFLAGS = $(OPTIMIZE_LV) -ffast-math -fsingle-precision-constant ASFLAGS = $(CFLAGS) RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DWANT_ZLIB -RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_IMAGEVIEWER -DHAVE_7ZIP -DHAVE_CC_RESAMPLER +RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER LIBDIR = LDFLAGS = -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. -s LIBS += $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -LIBS += -lgskit -ldmakit -lpad -lmc -lhdd -lsdl -lc -lfileXio -lpatches -lpoweroff -ldebug -lc +LIBS += -lgskit -ldmakit -laudsrv -lpad -lmc -lhdd -lsdl -lc -lfileXio -lpatches -lpoweroff -lc #IRX modules # IRX modules - modules have to be in IRX_DIR diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 4baaf7b753..abe89485af 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -122,6 +122,9 @@ static const audio_driver_t *audio_drivers[] = { #if defined(PSP) || defined(VITA) &audio_psp, #endif +#if defined(PS2) + &audio_ps2, +#endif #ifdef _3DS &audio_ctr_csnd, &audio_ctr_dsp, diff --git a/audio/drivers/ps2_audio.c b/audio/drivers/ps2_audio.c new file mode 100644 index 0000000000..5874e1fa1b --- /dev/null +++ b/audio/drivers/ps2_audio.c @@ -0,0 +1,275 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2014-2017 - Francisco Javier Trujillo Mata + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "../audio_driver.h" + +typedef struct ps2_audio +{ + bool nonblocking; + + fifo_buffer_t* buffer; + + volatile bool running; + + int worker_thread; + + int lock; + int cond_lock; + +} ps2_audio_t; + +static ps2_audio_t *backup_ps2; +static u8 audioThreadStack[512 * 16] __attribute__ ((aligned(16))); + +#define AUDIO_OUT_BUFFER 2 * 1024 +#define AUDIO_BUFFER 64 * 1024 + + +static void audioMainLoop(void *data) +{ + ps2_audio_t* ps2 = backup_ps2; + + char out_tmp[AUDIO_OUT_BUFFER]; + + while (ps2->running) + { + WaitSema(ps2->lock); + if (fifo_read_avail(ps2->buffer) >= sizeof(out_tmp)) { + fifo_read(ps2->buffer, out_tmp, sizeof(out_tmp)); + } else { + memset(out_tmp, 0, sizeof(out_tmp)); + } + iSignalSema(ps2->lock); + iSignalSema(ps2->cond_lock); + + int ret; + audsrv_wait_audio(sizeof(out_tmp)); + ret = audsrv_play_audio(out_tmp, sizeof(out_tmp)); + } + + audsrv_stop_audio(); + ExitDeleteThread(); +} + + +static void audioCreateThread(ps2_audio_t *ps2) { + int ret; + ee_thread_t thread; + + thread.func=&audioMainLoop; + thread.stack=audioThreadStack; + thread.stack_size=sizeof(audioThreadStack); + thread.gp_reg=&_gp; + thread.initial_priority=0x50; + thread.attr=thread.option=0; + + /*Backup the PS2 content to be used in the thread */ + backup_ps2 = ps2; + + ps2->running = true; + ps2->worker_thread = CreateThread(&thread); + if (ps2->worker_thread >= 0) { + ret = StartThread(ps2->worker_thread, NULL); + if (ret < 0) { + printf("sound_init: StartThread returned %d\n", ret); + } + } else { + printf("CreateThread failed: %d\n", ps2->worker_thread); + } +} + +static void audioStopNDeleteThread(ps2_audio_t *ps2) { + ps2->running = false; + if (ps2->worker_thread) { + ps2->worker_thread = 0; + } +} + + +static void audioConfigure(ps2_audio_t *ps2, unsigned rate) { + int err; + struct audsrv_fmt_t format; + format.bits = 16; + format.freq = rate; + format.channels = 2; + + err = audsrv_set_format(&format); + if (err) { + printf("set format returned %d\n", err); + printf("audsrv returned error string: %s\n", audsrv_get_error_string()); + } + + audsrv_set_volume(MAX_VOLUME); +} + +static void audioCreateSemas(ps2_audio_t *ps2) { + ee_sema_t lock_info; + lock_info.max_count = 1; + lock_info.init_count = 1; + lock_info.option = 0; + ps2->lock = CreateSema(&lock_info); + + ee_sema_t cond_lock_info; + cond_lock_info.init_count = 1; + cond_lock_info.max_count = 1; + cond_lock_info.option = 0; + ps2->cond_lock = CreateSema(&cond_lock_info); +} + +static void *ps2_audio_init(const char *device, + unsigned rate, unsigned latency, + unsigned block_frames, + unsigned *new_rate) +{ + ps2_audio_t *ps2 = (ps2_audio_t*)calloc(1, sizeof(ps2_audio_t)); + + if (!ps2) + return NULL; + + ps2->buffer = fifo_new(AUDIO_BUFFER); + audioConfigure(ps2, rate); + audioCreateSemas(ps2); + audioCreateThread(ps2); + + return ps2; +} + +static void ps2_audio_free(void *data) +{ + ps2_audio_t* ps2 = (ps2_audio_t*)data; + if(!ps2) + return; + + if(ps2->running){ + audioStopNDeleteThread(ps2); + + if (ps2->lock) { + iDeleteSema(ps2->lock); + ps2->lock = 0; + } + + if (ps2->cond_lock) { + iDeleteSema(ps2->cond_lock); + ps2->cond_lock = 0; + } + + } + fifo_free(ps2->buffer); + free(ps2); +} + +static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) +{ + ps2_audio_t* ps2 = (ps2_audio_t*)data; + + if (!ps2->running) + return -1; + + if (ps2->nonblocking) + { + if (fifo_write_avail(ps2->buffer) < size) + return 0; + } + + while (fifo_write_avail(ps2->buffer) < size) { + WaitSema(ps2->cond_lock); + } + + WaitSema(ps2->lock); + fifo_write(ps2->buffer, buf, size); + iSignalSema(ps2->lock); + + return size; +} + +static bool ps2_audio_alive(void *data) +{ + bool alive = false; + + ps2_audio_t* ps2 = (ps2_audio_t*)data; + if (ps2) { + alive = ps2->running; + } + + return alive; +} + +static bool ps2_audio_stop(void *data) +{ + bool stop = true; + ps2_audio_t* ps2 = (ps2_audio_t*)data; + + if (ps2) { + audioStopNDeleteThread(ps2); + audsrv_stop_audio(); + } + + return stop; +} + +static bool ps2_audio_start(void *data, bool is_shutdown) +{ + bool start = true; + ps2_audio_t* ps2 = (ps2_audio_t*)data; + + if(ps2) { + if (!ps2->running && !ps2->worker_thread) { + audioCreateThread(ps2); + } + } + + return start; +} + +static void ps2_audio_set_nonblock_state(void *data, bool toggle) +{ + ps2_audio_t* ps2 = (ps2_audio_t*)data; + if (ps2) { + ps2->nonblocking = toggle; + } +} + +static bool ps2_audio_use_float(void *data) +{ + (void)data; + return false; +} + +audio_driver_t audio_ps2 = { + ps2_audio_init, + ps2_audio_write, + ps2_audio_stop, + ps2_audio_start, + ps2_audio_alive, + ps2_audio_set_nonblock_state, + ps2_audio_free, + ps2_audio_use_float, + "ps2", + NULL, + NULL, + NULL, + NULL +}; diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index ca7411bb45..fe3355bc21 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -20,12 +20,11 @@ #include #include #include -#include -#include #include #include #include #include +#include enum BootDeviceIDs{ @@ -306,6 +305,7 @@ static void frontend_ps2_init(void *data) SifInitRpc(0); sbv_patch_enable_lmb(); + // I/O Files SifExecModuleBuffer(iomanX_irx_start, iomanX_irx_size, 0, NULL, NULL); SifExecModuleBuffer(fileXio_irx_start, fileXio_irx_size, 0, NULL, NULL); @@ -314,18 +314,21 @@ static void frontend_ps2_init(void *data) SifLoadModule("rom0:MCSERV", 0, NULL); SifLoadModule("rom0:PADMAN", 0, NULL); + // USB SifExecModuleBuffer(usbd_irx_start, usbd_irx_size, 0, NULL, NULL); SifExecModuleBuffer(usbhdfsd_irx_start, usbhdfsd_irx_size, 0, NULL, NULL); + + // Audio SifExecModuleBuffer(freesd_irx_start, freesd_irx_size, 0, NULL, NULL); SifExecModuleBuffer(audsrv_irx_start, audsrv_irx_size, 0, NULL, NULL); - fileXioInit(); - audsrv_init(); - SDL_Init(SDL_INIT_TIMER); + //Initializes audsrv library + if(audsrv_init()) { + RARCH_ERR("audsrv library not initalizated\n"); + } -retro_sleep(100); #if defined(HAVE_FILE_LOGGER) retro_main_log_file_init("retroarch.log"); diff --git a/griffin/griffin.c b/griffin/griffin.c index b101226120..0b264e5952 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -773,7 +773,7 @@ AUDIO #elif defined(PSP) || defined(VITA) #include "../audio/drivers/psp_audio.c" #elif defined(PS2) -// #include "../audio/drivers/ps2_audio.c" +#include "../audio/drivers/ps2_audio.c" #elif defined(_3DS) #include "../audio/drivers/ctr_csnd_audio.c" #include "../audio/drivers/ctr_dsp_audio.c" diff --git a/libretro-common/vfs/vfs_implementation.c b/libretro-common/vfs/vfs_implementation.c index 4721e7259e..9c2caef54f 100644 --- a/libretro-common/vfs/vfs_implementation.c +++ b/libretro-common/vfs/vfs_implementation.c @@ -294,7 +294,7 @@ libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, uns */ /* TODO: this is only useful for a few platforms, find which and add ifdef */ stream->fp = fp; -#if !defined(PS2) +#if !defined(PS2) // TODO: PS2 IMPROVEMENT stream->buf = (char*)calloc(1, 0x4000); setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); #endif From e2ca8aa1b5df78396eb5755f07f0f34f9339a3f7 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Thu, 3 Jan 2019 11:50:24 +0100 Subject: [PATCH 106/116] Apply NTCS mode --- Makefile.ps2 | 4 ++-- audio/drivers/ps2_audio.c | 35 +++++++++++++++++++++++++++-------- gfx/drivers/ps2_gfx.c | 10 ++++++++-- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Makefile.ps2 b/Makefile.ps2 index 7f11a362ba..f4a4f0a8a0 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -1,8 +1,8 @@ BUILD_PRX = 0 -DEBUG = 1 +DEBUG = 0 HAVE_KERNEL_PRX = 0 HAVE_LOGGER = 0 -HAVE_FILE_LOGGER = 1 +HAVE_FILE_LOGGER = 0 HAVE_THREADS = 0 BIG_STACK = 0 WHOLE_ARCHIVE_LINK = 0 diff --git a/audio/drivers/ps2_audio.c b/audio/drivers/ps2_audio.c index 5874e1fa1b..7a515a4942 100644 --- a/audio/drivers/ps2_audio.c +++ b/audio/drivers/ps2_audio.c @@ -57,17 +57,15 @@ static void audioMainLoop(void *data) while (ps2->running) { WaitSema(ps2->lock); - if (fifo_read_avail(ps2->buffer) >= sizeof(out_tmp)) { - fifo_read(ps2->buffer, out_tmp, sizeof(out_tmp)); - } else { - memset(out_tmp, 0, sizeof(out_tmp)); - } + size_t size = MIN(fifo_read_avail(ps2->buffer), sizeof(out_tmp)); + fifo_read(ps2->buffer, out_tmp, size); + iSignalSema(ps2->lock); iSignalSema(ps2->cond_lock); int ret; - audsrv_wait_audio(sizeof(out_tmp)); - ret = audsrv_play_audio(out_tmp, sizeof(out_tmp)); + audsrv_wait_audio(size); + ret = audsrv_play_audio(out_tmp, size); } audsrv_stop_audio(); @@ -83,7 +81,7 @@ static void audioCreateThread(ps2_audio_t *ps2) { thread.stack=audioThreadStack; thread.stack_size=sizeof(audioThreadStack); thread.gp_reg=&_gp; - thread.initial_priority=0x50; + thread.initial_priority=0x40; thread.attr=thread.option=0; /*Backup the PS2 content to be used in the thread */ @@ -258,6 +256,27 @@ static bool ps2_audio_use_float(void *data) return false; } +static size_t psp_write_avail(void *data) +{ + size_t val; + ps2_audio_t* ps2 = (ps2_audio_t*)data; + + if (!ps2||!ps2->running) + return 0; + + WaitSema(ps2->lock); + size_t size = AUDIO_BUFFER - fifo_read_avail(ps2->buffer); + iSignalSema(ps2->lock); + + + return size; +} + +static size_t psp_buffer_size(void *data) +{ + return AUDIO_BUFFER ; +} + audio_driver_t audio_ps2 = { ps2_audio_init, ps2_audio_write, diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index 39a9053793..dd58af5cdd 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -44,11 +44,17 @@ typedef struct ps2_video static GSGLOBAL *init_GSGlobal(void) { GSGLOBAL *gsGlobal = gsKit_init_global(); - gsGlobal->PSM = GS_PSM_CT16; + gsGlobal->Mode = GS_MODE_NTSC; + gsGlobal->Interlace = GS_INTERLACED; + gsGlobal->Field = GS_FIELD; + gsGlobal->Width = 640; + gsGlobal->Height = 448; + + gsGlobal->PSM = GS_PSM_CT16; gsGlobal->PSMZ = GS_PSMZ_16; gsGlobal->DoubleBuffering = GS_SETTING_OFF; gsGlobal->ZBuffering = GS_SETTING_OFF; - gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; + gsGlobal->PrimAlphaEnable = GS_SETTING_OFF; dmaKit_init(D_CTRL_RELE_OFF,D_CTRL_MFD_OFF, D_CTRL_STS_UNSPEC, D_CTRL_STD_OFF, D_CTRL_RCYC_8, 1 << DMA_CHANNEL_GIF); From 56207bd08eb168e6ee6670851e667589120df5f8 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Thu, 3 Jan 2019 12:41:29 +0100 Subject: [PATCH 107/116] Improvement in: * Makefile.ps2 * ps2_gfx * ps2_platform * ps2_audio --- Makefile.ps2 | 16 +----- audio/drivers/ps2_audio.c | 99 ++++++++++++--------------------- frontend/drivers/platform_ps2.c | 19 +++++-- gfx/drivers/ps2_gfx.c | 7 ++- 4 files changed, 59 insertions(+), 82 deletions(-) diff --git a/Makefile.ps2 b/Makefile.ps2 index f4a4f0a8a0..db8ca28523 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -5,7 +5,6 @@ HAVE_LOGGER = 0 HAVE_FILE_LOGGER = 0 HAVE_THREADS = 0 BIG_STACK = 0 -WHOLE_ARCHIVE_LINK = 0 PS2_IP = 192.168.1.150 #Configuration for IRX @@ -22,11 +21,6 @@ else OPTIMIZE_LV := -O2 endif -ifeq ($(WHOLE_ARCHIVE_LINK), 1) - WHOLE_START := -Wl,--whole-archive - WHOLE_END := -Wl,--no-whole-archive -endif - INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include INCDIR += -Ips2 -Ips2/include -Ilibretro-common/include INCDIR += -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ideps/pthreads -Ideps/pthreads/platform/ps2 -Ideps/pthreads/platform/helper @@ -39,12 +33,11 @@ RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU - LIBDIR = LDFLAGS = -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. -s -LIBS += $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -LIBS += -lgskit -ldmakit -laudsrv -lpad -lmc -lhdd -lsdl -lc -lfileXio -lpatches -lpoweroff -lc +LIBS += -lretro_ps2 -lgskit -ldmakit -laudsrv -lpad -lmc -lhdd -lsdl -lfileXio -lpatches -lpoweroff #IRX modules # IRX modules - modules have to be in IRX_DIR -IRX = iomanX.irx fileXio.irx usbd.irx usbhdfsd.irx freesd.irx audsrv.irx poweroff.irx ps2dev9.irx ps2atad.irx ps2hdd.irx ps2fs.irx +IRX = iomanX.irx fileXio.irx mcman.irx mcserv.irx usbd.irx usbhdfsd.irx freesd.irx audsrv.irx poweroff.irx ps2dev9.irx ps2atad.irx ps2hdd.irx ps2fs.irx IRX_OBJ = $(IRX:.irx=.o) EE_OBJS += $(IRX_OBJ) @@ -108,10 +101,7 @@ $(EE_IRX_OBJ): include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal - +#Linking with C++ $(EE_BIN): $(EE_OBJS) $(PS2SDK)/ee/startup/crt0.o $(EE_CXX) $(EE_NO_CRT) -T$(PS2SDK)/ee/startup/linkfile $(EE_CXXFLAGS) \ -o $(EE_BIN) $(PS2SDK)/ee/startup/crt0.o $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(EE_OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) $(EE_LDFLAGS) $(EE_LIBS) - - - \ No newline at end of file diff --git a/audio/drivers/ps2_audio.c b/audio/drivers/ps2_audio.c index 7a515a4942..1c90a6bdf8 100644 --- a/audio/drivers/ps2_audio.c +++ b/audio/drivers/ps2_audio.c @@ -18,54 +18,44 @@ #include #include -#include -#include - #include #include #include "../audio_driver.h" -typedef struct ps2_audio -{ - bool nonblocking; - +typedef struct ps2_audio { fifo_buffer_t* buffer; - + bool nonblocking; volatile bool running; - int worker_thread; - int lock; int cond_lock; } ps2_audio_t; static ps2_audio_t *backup_ps2; -static u8 audioThreadStack[512 * 16] __attribute__ ((aligned(16))); +static u8 audioThreadStack[4 * 1024] __attribute__ ((aligned(16))); #define AUDIO_OUT_BUFFER 2 * 1024 #define AUDIO_BUFFER 64 * 1024 +#define AUDIO_CHANNELS 2 +#define AUDIO_BITS 16 +#define AUDIO_PRIORITY 0x7F /* LOWER VALUE GRATHER PRIORITY*/ -static void audioMainLoop(void *data) -{ +static void audioMainLoop(void *data) { + char out_tmp[AUDIO_OUT_BUFFER]; ps2_audio_t* ps2 = backup_ps2; - char out_tmp[AUDIO_OUT_BUFFER]; - - while (ps2->running) - { + while (ps2->running) { WaitSema(ps2->lock); size_t size = MIN(fifo_read_avail(ps2->buffer), sizeof(out_tmp)); fifo_read(ps2->buffer, out_tmp, size); - iSignalSema(ps2->lock); iSignalSema(ps2->cond_lock); - int ret; audsrv_wait_audio(size); - ret = audsrv_play_audio(out_tmp, size); + audsrv_play_audio(out_tmp, size); } audsrv_stop_audio(); @@ -81,7 +71,7 @@ static void audioCreateThread(ps2_audio_t *ps2) { thread.stack=audioThreadStack; thread.stack_size=sizeof(audioThreadStack); thread.gp_reg=&_gp; - thread.initial_priority=0x40; + thread.initial_priority=AUDIO_PRIORITY; thread.attr=thread.option=0; /*Backup the PS2 content to be used in the thread */ @@ -106,13 +96,12 @@ static void audioStopNDeleteThread(ps2_audio_t *ps2) { } } - static void audioConfigure(ps2_audio_t *ps2, unsigned rate) { int err; struct audsrv_fmt_t format; - format.bits = 16; + format.bits = AUDIO_BITS; format.freq = rate; - format.channels = 2; + format.channels = AUDIO_CHANNELS; err = audsrv_set_format(&format); if (err) { @@ -144,19 +133,17 @@ static void *ps2_audio_init(const char *device, { ps2_audio_t *ps2 = (ps2_audio_t*)calloc(1, sizeof(ps2_audio_t)); - if (!ps2) - return NULL; - - ps2->buffer = fifo_new(AUDIO_BUFFER); - audioConfigure(ps2, rate); - audioCreateSemas(ps2); - audioCreateThread(ps2); + if (ps2) { + ps2->buffer = fifo_new(AUDIO_BUFFER); + audioConfigure(ps2, rate); + audioCreateSemas(ps2); + audioCreateThread(ps2); + } return ps2; } -static void ps2_audio_free(void *data) -{ +static void ps2_audio_free(void *data) { ps2_audio_t* ps2 = (ps2_audio_t*)data; if(!ps2) return; @@ -179,15 +166,13 @@ static void ps2_audio_free(void *data) free(ps2); } -static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) -{ +static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) { ps2_audio_t* ps2 = (ps2_audio_t*)data; if (!ps2->running) return -1; - if (ps2->nonblocking) - { + if (ps2->nonblocking) { if (fifo_write_avail(ps2->buffer) < size) return 0; } @@ -203,8 +188,7 @@ static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) return size; } -static bool ps2_audio_alive(void *data) -{ +static bool ps2_audio_alive(void *data) { bool alive = false; ps2_audio_t* ps2 = (ps2_audio_t*)data; @@ -215,8 +199,7 @@ static bool ps2_audio_alive(void *data) return alive; } -static bool ps2_audio_stop(void *data) -{ +static bool ps2_audio_stop(void *data) { bool stop = true; ps2_audio_t* ps2 = (ps2_audio_t*)data; @@ -228,8 +211,7 @@ static bool ps2_audio_stop(void *data) return stop; } -static bool ps2_audio_start(void *data, bool is_shutdown) -{ +static bool ps2_audio_start(void *data, bool is_shutdown) { bool start = true; ps2_audio_t* ps2 = (ps2_audio_t*)data; @@ -242,38 +224,31 @@ static bool ps2_audio_start(void *data, bool is_shutdown) return start; } -static void ps2_audio_set_nonblock_state(void *data, bool toggle) -{ +static void ps2_audio_set_nonblock_state(void *data, bool toggle) { ps2_audio_t* ps2 = (ps2_audio_t*)data; if (ps2) { ps2->nonblocking = toggle; } } -static bool ps2_audio_use_float(void *data) -{ - (void)data; +static bool ps2_audio_use_float(void *data) { return false; } -static size_t psp_write_avail(void *data) -{ - size_t val; +static size_t ps2_audio_write_avail(void *data) { + size_t size = 0; ps2_audio_t* ps2 = (ps2_audio_t*)data; - if (!ps2||!ps2->running) - return 0; - - WaitSema(ps2->lock); - size_t size = AUDIO_BUFFER - fifo_read_avail(ps2->buffer); - iSignalSema(ps2->lock); - + if (ps2 && ps2->running) { + WaitSema(ps2->lock); + size_t size = AUDIO_BUFFER - fifo_read_avail(ps2->buffer); + iSignalSema(ps2->lock); + } return size; } -static size_t psp_buffer_size(void *data) -{ +static size_t ps2_audio_buffer_size(void *data) { return AUDIO_BUFFER ; } @@ -289,6 +264,6 @@ audio_driver_t audio_ps2 = { "ps2", NULL, NULL, - NULL, - NULL + ps2_audio_write_avail, + ps2_audio_buffer_size }; diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index fe3355bc21..d9d041f6b7 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -72,6 +72,12 @@ extern unsigned int usbd_irx_size; extern unsigned char usbhdfsd_irx_start[]; extern unsigned int usbhdfsd_irx_size; +extern unsigned char mcman_irx_start[]; +extern unsigned int mcman_irx_size; + +extern unsigned char mcserv_irx_start[]; +extern unsigned int mcserv_irx_size; + static unsigned char HDDModulesLoaded=0; char eboot_path[512]; @@ -305,14 +311,17 @@ static void frontend_ps2_init(void *data) SifInitRpc(0); sbv_patch_enable_lmb(); + // Controllers + SifLoadModule("rom0:SIO2MAN", 0, NULL); + SifLoadModule("rom0:PADMAN", 0, NULL); + // I/O Files SifExecModuleBuffer(iomanX_irx_start, iomanX_irx_size, 0, NULL, NULL); SifExecModuleBuffer(fileXio_irx_start, fileXio_irx_size, 0, NULL, NULL); - - SifLoadModule("rom0:SIO2MAN", 0, NULL); - SifLoadModule("rom0:MCMAN", 0, NULL); - SifLoadModule("rom0:MCSERV", 0, NULL); - SifLoadModule("rom0:PADMAN", 0, NULL); + + // Memory Card + SifExecModuleBuffer(mcman_irx_start, mcman_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(mcserv_irx_start, mcserv_irx_size, 0, NULL, NULL); // USB SifExecModuleBuffer(usbd_irx_start, usbd_irx_size, 0, NULL, NULL); diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index dd58af5cdd..7ee0803c95 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -25,6 +25,9 @@ #define GS_TEXT GS_SETREG_RGBAQ(0x80,0x80,0x80,0x80,0x00) // turn white GS Screen #define GS_BLACK GS_SETREG_RGBAQ(0x00,0x00,0x00,0x00,0x00) // turn white GS Screen +#define NTSC_WIDTH 640 +#define NTSC_HEIGHT 448 + typedef struct ps2_video { GSGLOBAL *gsGlobal; @@ -47,8 +50,8 @@ static GSGLOBAL *init_GSGlobal(void) { gsGlobal->Mode = GS_MODE_NTSC; gsGlobal->Interlace = GS_INTERLACED; gsGlobal->Field = GS_FIELD; - gsGlobal->Width = 640; - gsGlobal->Height = 448; + gsGlobal->Width = NTSC_WIDTH; + gsGlobal->Height = NTSC_HEIGHT; gsGlobal->PSM = GS_PSM_CT16; gsGlobal->PSMZ = GS_PSMZ_16; From 24ef966ca345952b9bfdaf9d40d61e1219840da0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 13:26:45 +0100 Subject: [PATCH 108/116] (PS2 audio) Style nit changes --- audio/drivers/ps2_audio.c | 192 ++++++++++++++++++++++---------------- 1 file changed, 110 insertions(+), 82 deletions(-) diff --git a/audio/drivers/ps2_audio.c b/audio/drivers/ps2_audio.c index 1c90a6bdf8..f47ef9fc9d 100644 --- a/audio/drivers/ps2_audio.c +++ b/audio/drivers/ps2_audio.c @@ -23,7 +23,8 @@ #include "../audio_driver.h" -typedef struct ps2_audio { +typedef struct ps2_audio +{ fifo_buffer_t* buffer; bool nonblocking; volatile bool running; @@ -43,13 +44,17 @@ static u8 audioThreadStack[4 * 1024] __attribute__ ((aligned(16))); #define AUDIO_PRIORITY 0x7F /* LOWER VALUE GRATHER PRIORITY*/ -static void audioMainLoop(void *data) { +static void audioMainLoop(void *data) +{ char out_tmp[AUDIO_OUT_BUFFER]; ps2_audio_t* ps2 = backup_ps2; - while (ps2->running) { + while (ps2->running) + { + size_t size; + WaitSema(ps2->lock); - size_t size = MIN(fifo_read_avail(ps2->buffer), sizeof(out_tmp)); + size = MIN(fifo_read_avail(ps2->buffer), sizeof(out_tmp)); fifo_read(ps2->buffer, out_tmp, size); iSignalSema(ps2->lock); iSignalSema(ps2->cond_lock); @@ -63,67 +68,76 @@ static void audioMainLoop(void *data) { } -static void audioCreateThread(ps2_audio_t *ps2) { - int ret; - ee_thread_t thread; +static void audioCreateThread(ps2_audio_t *ps2) +{ + int ret; + ee_thread_t thread; - thread.func=&audioMainLoop; - thread.stack=audioThreadStack; - thread.stack_size=sizeof(audioThreadStack); - thread.gp_reg=&_gp; - thread.initial_priority=AUDIO_PRIORITY; - thread.attr=thread.option=0; + thread.func=&audioMainLoop; + thread.stack=audioThreadStack; + thread.stack_size=sizeof(audioThreadStack); + thread.gp_reg=&_gp; + thread.initial_priority=AUDIO_PRIORITY; + thread.attr=thread.option=0; /*Backup the PS2 content to be used in the thread */ - backup_ps2 = ps2; + backup_ps2 = ps2; - ps2->running = true; - ps2->worker_thread = CreateThread(&thread); - if (ps2->worker_thread >= 0) { - ret = StartThread(ps2->worker_thread, NULL); - if (ret < 0) { + ps2->running = true; + ps2->worker_thread = CreateThread(&thread); + + if (ps2->worker_thread >= 0) + { + ret = StartThread(ps2->worker_thread, NULL); + if (ret < 0) printf("sound_init: StartThread returned %d\n", ret); - } - } else { - printf("CreateThread failed: %d\n", ps2->worker_thread); } + else + printf("CreateThread failed: %d\n", ps2->worker_thread); } -static void audioStopNDeleteThread(ps2_audio_t *ps2) { +static void audioStopNDeleteThread(ps2_audio_t *ps2) +{ ps2->running = false; - if (ps2->worker_thread) { + if (ps2->worker_thread) ps2->worker_thread = 0; - } } -static void audioConfigure(ps2_audio_t *ps2, unsigned rate) { +static void audioConfigure(ps2_audio_t *ps2, unsigned rate) +{ int err; struct audsrv_fmt_t format; - format.bits = AUDIO_BITS; - format.freq = rate; - format.channels = AUDIO_CHANNELS; - err = audsrv_set_format(&format); - if (err) { + format.bits = AUDIO_BITS; + format.freq = rate; + format.channels = AUDIO_CHANNELS; + + err = audsrv_set_format(&format); + + if (err) + { printf("set format returned %d\n", err); - printf("audsrv returned error string: %s\n", audsrv_get_error_string()); + printf("audsrv returned error string: %s\n", audsrv_get_error_string()); } - - audsrv_set_volume(MAX_VOLUME); + + audsrv_set_volume(MAX_VOLUME); } -static void audioCreateSemas(ps2_audio_t *ps2) { +static void audioCreateSemas(ps2_audio_t *ps2) +{ ee_sema_t lock_info; - lock_info.max_count = 1; - lock_info.init_count = 1; - lock_info.option = 0; - ps2->lock = CreateSema(&lock_info); - ee_sema_t cond_lock_info; + + lock_info.max_count = 1; + lock_info.init_count = 1; + lock_info.option = 0; + ps2->lock = CreateSema(&lock_info); + cond_lock_info.init_count = 1; - cond_lock_info.max_count = 1; - cond_lock_info.option = 0; - ps2->cond_lock = CreateSema(&cond_lock_info); + cond_lock_info.max_count = 1; + cond_lock_info.option = 0; + + ps2->cond_lock = CreateSema(&cond_lock_info); } static void *ps2_audio_init(const char *device, @@ -133,30 +147,35 @@ static void *ps2_audio_init(const char *device, { ps2_audio_t *ps2 = (ps2_audio_t*)calloc(1, sizeof(ps2_audio_t)); - if (ps2) { - ps2->buffer = fifo_new(AUDIO_BUFFER); - audioConfigure(ps2, rate); - audioCreateSemas(ps2); - audioCreateThread(ps2); - } + if (!ps2) + return NULL; + + ps2->buffer = fifo_new(AUDIO_BUFFER); + audioConfigure(ps2, rate); + audioCreateSemas(ps2); + audioCreateThread(ps2); return ps2; } -static void ps2_audio_free(void *data) { +static void ps2_audio_free(void *data) +{ ps2_audio_t* ps2 = (ps2_audio_t*)data; if(!ps2) return; - if(ps2->running){ + if(ps2->running) + { audioStopNDeleteThread(ps2); - - if (ps2->lock) { + + if (ps2->lock) + { iDeleteSema(ps2->lock); ps2->lock = 0; } - if (ps2->cond_lock) { + if (ps2->cond_lock) + { iDeleteSema(ps2->cond_lock); ps2->cond_lock = 0; } @@ -166,20 +185,21 @@ static void ps2_audio_free(void *data) { free(ps2); } -static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) { +static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) +{ ps2_audio_t* ps2 = (ps2_audio_t*)data; - + if (!ps2->running) return -1; - if (ps2->nonblocking) { + if (ps2->nonblocking) + { if (fifo_write_avail(ps2->buffer) < size) return 0; } - while (fifo_write_avail(ps2->buffer) < size) { + while (fifo_write_avail(ps2->buffer) < size) WaitSema(ps2->cond_lock); - } WaitSema(ps2->lock); fifo_write(ps2->buffer, buf, size); @@ -188,22 +208,24 @@ static ssize_t ps2_audio_write(void *data, const void *buf, size_t size) { return size; } -static bool ps2_audio_alive(void *data) { +static bool ps2_audio_alive(void *data) +{ bool alive = false; ps2_audio_t* ps2 = (ps2_audio_t*)data; - if (ps2) { + if (ps2) alive = ps2->running; - } - + return alive; } -static bool ps2_audio_stop(void *data) { +static bool ps2_audio_stop(void *data) +{ bool stop = true; ps2_audio_t* ps2 = (ps2_audio_t*)data; - if (ps2) { + if (ps2) + { audioStopNDeleteThread(ps2); audsrv_stop_audio(); } @@ -211,45 +233,51 @@ static bool ps2_audio_stop(void *data) { return stop; } -static bool ps2_audio_start(void *data, bool is_shutdown) { - bool start = true; +static bool ps2_audio_start(void *data, bool is_shutdown) +{ + bool start = true; ps2_audio_t* ps2 = (ps2_audio_t*)data; - if(ps2) { - if (!ps2->running && !ps2->worker_thread) { + if(ps2) + { + if (!ps2->running && !ps2->worker_thread) audioCreateThread(ps2); - } } return start; } -static void ps2_audio_set_nonblock_state(void *data, bool toggle) { +static void ps2_audio_set_nonblock_state(void *data, bool toggle) +{ ps2_audio_t* ps2 = (ps2_audio_t*)data; - if (ps2) { + if (ps2) ps2->nonblocking = toggle; - } } -static bool ps2_audio_use_float(void *data) { +static bool ps2_audio_use_float(void *data) +{ return false; } -static size_t ps2_audio_write_avail(void *data) { - size_t size = 0; +static size_t ps2_audio_write_avail(void *data) +{ ps2_audio_t* ps2 = (ps2_audio_t*)data; - if (ps2 && ps2->running) { + if (ps2 && ps2->running) + { + size_t size; WaitSema(ps2->lock); - size_t size = AUDIO_BUFFER - fifo_read_avail(ps2->buffer); + size = AUDIO_BUFFER - fifo_read_avail(ps2->buffer); iSignalSema(ps2->lock); + return size; } - - return size; + + return 0; } -static size_t ps2_audio_buffer_size(void *data) { - return AUDIO_BUFFER ; +static size_t ps2_audio_buffer_size(void *data) +{ + return AUDIO_BUFFER; } audio_driver_t audio_ps2 = { From e53ac5b38b1b7619965a26a54095df15554f2807 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 13:34:12 +0100 Subject: [PATCH 109/116] (PS2) platform_ps2.c - style nits --- frontend/drivers/platform_ps2.c | 213 +++++++++++++---------- libretro-common/vfs/vfs_implementation.c | 2 +- 2 files changed, 124 insertions(+), 91 deletions(-) diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index d9d041f6b7..68fddc12bb 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -85,30 +85,47 @@ char user_path[512]; static enum frontend_fork ps2_fork_mode = FRONTEND_FORK_NONE; -//Only paths residing on "basic" devices (devices that don't require mounting) -//can be specified here, since this system doesn't perform mounting based on the path. +/* Only paths residing on "basic" devices + * (devices that don't require mounting) + * can be specified here, since this system + * doesn't perform mounting based on the path. + */ #define DEFAULT_PATH "mass:" -static int getBootDeviceID(char *path) { - int result = BOOT_DEVICE_HOST; +static int getBootDeviceID(char *path) +{ + if (!strncmp(path, "mc0:", 4)) + return BOOT_DEVICE_MC0; + else if (!strncmp(path, "mc1:", 4)) + return BOOT_DEVICE_MC1; + else if (!strncmp(path, "cdrom0:", 7)) + return BOOT_DEVICE_CDROM; + else if (!strncmp(path, "mass:", 5) || !strncmp(path, "mass0:", 6)) + return BOOT_DEVICE_MASS; + else if (!strncmp(path, "hdd:", 4) || !strncmp(path, "hdd0:", 5)) + return BOOT_DEVICE_HDD; + else if (!strncmp(path, "host", 4) && ((path[4]>='0' && path[4]<='9') || path[4]==':')) + return BOOT_DEVICE_HOST; + else + return BOOT_DEVICE_UNKNOWN; - if(!strncmp(path, "mc0:", 4)) result=BOOT_DEVICE_MC0; - else if(!strncmp(path, "mc1:", 4)) result=BOOT_DEVICE_MC1; - else if(!strncmp(path, "cdrom0:", 7)) result=BOOT_DEVICE_CDROM; - else if(!strncmp(path, "mass:", 5) || !strncmp(path, "mass0:", 6)) result=BOOT_DEVICE_MASS; - else if(!strncmp(path, "hdd:", 4) || !strncmp(path, "hdd0:", 5)) result=BOOT_DEVICE_HDD; - else if(!strncmp(path, "host", 4) && ((path[4]>='0' && path[4]<='9') || path[4]==':')) result=BOOT_DEVICE_HOST; - else result=BOOT_DEVICE_UNKNOWN; - - return result; + return BOOT_DEVICE_HOST; } -//HACK! If booting from a USB device, keep trying to open this program again until it succeeds. This will ensure that the emulator will be able to load its files. -static void waitUntilDeviceIsReady(const char *path) { +/* HACK! If booting from a USB device, keep trying to + * open this program again until it succeeds. + * + * This will ensure that the emulator will be able to load its files. + */ + +static void waitUntilDeviceIsReady(const char *path) +{ FILE *file; - while((file=fopen(path, "rb"))==NULL){ - //Wait for a while first, or the IOP will get swamped by requests from the EE. + while((file=fopen(path, "rb"))==NULL) + { + /* Wait for a while first, or the IOP + * will get swamped by requests from the EE. */ nopdelay(); nopdelay(); nopdelay(); @@ -122,47 +139,54 @@ static void waitUntilDeviceIsReady(const char *path) { fclose(file); } -void setPWDOnPFS(const char *FullCWD_path) { - int i; - char *path; - - path=NULL; - for(i=strlen(FullCWD_path); i>=0; i--){ /* Try to seperate the CWD from the path to this ELF. */ - if(FullCWD_path[i]==':'){ - if((path=malloc(i+6+2))!=NULL){ - strcpy(path, "pfs0:/"); - strncat(path, FullCWD_path, i+1); - path[i+1+6]='\0'; - } - break; - } - else if((FullCWD_path[i]=='\\')||(FullCWD_path[i]=='/')){ - if((path=malloc(i+6+1))!=NULL){ - strcpy(path, "pfs0:/"); - strncat(path, FullCWD_path, i); - path[i+6]='\0'; - } - break; - } - } - - if(path!=NULL){ - chdir(path); - free(path); - } +void setPWDOnPFS(const char *FullCWD_path) +{ + int i; + char *path=NULL; + for (i=strlen(FullCWD_path); i>=0; i--) + { + /* Try to seperate the CWD from the path to this ELF. */ + if (FullCWD_path[i]==':') + { + if ((path=malloc(i+6+2))!=NULL) + { + strcpy(path, "pfs0:/"); + strncat(path, FullCWD_path, i+1); + path[i+1+6]='\0'; + } + break; + } + else if ((FullCWD_path[i]=='\\')||(FullCWD_path[i]=='/')) + { + if ((path=malloc(i+6+1))!=NULL) + { + strcpy(path, "pfs0:/"); + strncat(path, FullCWD_path, i); + path[i+6]='\0'; + } + break; + } + } + + if (path!=NULL) + { + chdir(path); + free(path); + } } -static const char *getMountParams(const char *command, char *BlockDevice) { - const char *MountPath; +static const char *getMountParams(const char *command, char *BlockDevice) +{ int BlockDeviceNameLen; + const char *MountPath=NULL; - MountPath=NULL; - if(strlen(command)>6 && (MountPath=strchr(&command[5], ':'))!=NULL){ + if (strlen(command)>6 && (MountPath=strchr(&command[5], ':'))!=NULL) + { BlockDeviceNameLen=(unsigned int)MountPath-(unsigned int)command; strncpy(BlockDevice, command, BlockDeviceNameLen); BlockDevice[BlockDeviceNameLen]='\0'; - - MountPath++; //This is the location of the mount path; + + MountPath++; /* This is the location of the mount path; */ } return MountPath; @@ -209,14 +233,16 @@ static void create_path_names(void) static void poweroffCallback(void *arg) { - //Close all files and unmount all partitions. - //close(fd); +#if 0 + /* Close all files and unmount all partitions. */ + close(fd); - //If you use PFS, close all files and unmount all partitions. - //fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0) + /* If you use PFS, close all files and unmount all partitions. */ + fileXioDevctl("pfs:", PDIOC_CLOSEALL, NULL, 0, NULL, 0) - //Shut down DEV9, if you used it. - //while(fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0) < 0){}; + /* Shut down DEV9, if you used it. */ + while(fileXioDevctl("dev9x:", DDIOC_OFF, NULL, 0, NULL, 0) < 0){}; +#endif printf("Shutdown!"); poweroffShutdown(); @@ -231,34 +257,37 @@ static void frontend_ps2_get_environment_settings(int *argc, char *argv[], getcwd(cwd, sizeof(cwd)); bootDeviceID=getBootDeviceID(cwd); - //Mount the HDD partition, if required. - if(bootDeviceID==BOOT_DEVICE_HDD){ - /* Try not to adjust this unless you know what you are doing. The tricky part i keeping the NULL character in the middle of that argument list separated from the number 4. */ - static const char PS2HDD_args[]="-o\0""2"; - static const char PS2FS_args[]="-o\0""8"; - if(!HDDModulesLoaded){ - SifExecModuleBuffer(poweroff_irx_start, poweroff_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(ps2dev9_irx_start, ps2dev9_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(ps2atad_irx_start, ps2atad_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(ps2hdd_irx_start, ps2hdd_irx_size, sizeof(PS2HDD_args), PS2HDD_args, NULL); - SifExecModuleBuffer(ps2fs_irx_start, ps2fs_irx_size, sizeof(PS2FS_args), PS2FS_args, NULL); - HDDModulesLoaded=1; - } - - //Attempt to mount the partition. - if((mountPoint=getMountParams(cwd, blockDevice))!=NULL && !strncmp(mountPoint, "pfs:", 4)){ + /* Mount the HDD partition, if required. */ + if (bootDeviceID==BOOT_DEVICE_HDD) + { + /* Try not to adjust this unless you know what you are doing. The tricky part i keeping the NULL character in the middle of that argument list separated from the number 4. */ + static const char PS2HDD_args[]="-o\0""2"; + static const char PS2FS_args[]="-o\0""8"; + + if (!HDDModulesLoaded) + { + SifExecModuleBuffer(poweroff_irx_start, poweroff_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(ps2dev9_irx_start, ps2dev9_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(ps2atad_irx_start, ps2atad_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(ps2hdd_irx_start, ps2hdd_irx_size, sizeof(PS2HDD_args), PS2HDD_args, NULL); + SifExecModuleBuffer(ps2fs_irx_start, ps2fs_irx_size, sizeof(PS2FS_args), PS2FS_args, NULL); + HDDModulesLoaded=1; + } + + /* Attempt to mount the partition. */ + if ((mountPoint=getMountParams(cwd, blockDevice))!=NULL && !strncmp(mountPoint, "pfs:", 4)) + { fileXioMount("pfs0:", blockDevice, FIO_MT_RDWR); - + setPWDOnPFS(&mountPoint[4]); } - } else if(bootDeviceID==BOOT_DEVICE_CDROM){ - chdir(DEFAULT_PATH); - } else if(bootDeviceID==BOOT_DEVICE_MASS){ - waitUntilDeviceIsReady(argv[0]); - } else if (bootDeviceID==BOOT_DEVICE_UNKNOWN) { - } + else if (bootDeviceID==BOOT_DEVICE_CDROM) + chdir(DEFAULT_PATH); + else if (bootDeviceID==BOOT_DEVICE_MASS) + waitUntilDeviceIsReady(argv[0]); + else if (bootDeviceID==BOOT_DEVICE_UNKNOWN) { } create_path_names(); @@ -304,37 +333,39 @@ static void frontend_ps2_init(void *data) { SifInitRpc(0); #if !defined(DEBUG) - while(!SifIopReset(NULL, 0)){}; // Comment this line if you don't wanna debug the output + /* Comment this line if you don't wanna debug the output */ + while(!SifIopReset(NULL, 0)){}; #endif while(!SifIopSync()){}; SifInitRpc(0); sbv_patch_enable_lmb(); - // Controllers + /* Controllers */ SifLoadModule("rom0:SIO2MAN", 0, NULL); SifLoadModule("rom0:PADMAN", 0, NULL); - // I/O Files + /* I/O Files */ SifExecModuleBuffer(iomanX_irx_start, iomanX_irx_size, 0, NULL, NULL); SifExecModuleBuffer(fileXio_irx_start, fileXio_irx_size, 0, NULL, NULL); - // Memory Card + /* Memory Card */ SifExecModuleBuffer(mcman_irx_start, mcman_irx_size, 0, NULL, NULL); SifExecModuleBuffer(mcserv_irx_start, mcserv_irx_size, 0, NULL, NULL); - // USB + /* USB */ SifExecModuleBuffer(usbd_irx_start, usbd_irx_size, 0, NULL, NULL); SifExecModuleBuffer(usbhdfsd_irx_start, usbhdfsd_irx_size, 0, NULL, NULL); - // Audio + /* Audio */ SifExecModuleBuffer(freesd_irx_start, freesd_irx_size, 0, NULL, NULL); SifExecModuleBuffer(audsrv_irx_start, audsrv_irx_size, 0, NULL, NULL); SDL_Init(SDL_INIT_TIMER); - //Initializes audsrv library - if(audsrv_init()) { + /* Initializes audsrv library */ + if (audsrv_init()) + { RARCH_ERR("audsrv library not initalizated\n"); } @@ -380,7 +411,9 @@ static void frontend_ps2_exec(const char *path, bool should_load_game) #endif RARCH_LOG("Attempt to load executable: [%s].\n", path); - // exitspawn_kernel(path, args, argp); // I don't know what this is doing +#if 0 + exitspawn_kernel(path, args, argp); /* I don't know what this is doing */ +#endif #endif } @@ -435,7 +468,7 @@ static void frontend_ps2_exitspawn(char *core_path, size_t core_path_size) static void frontend_ps2_shutdown(bool unused) { poweroffInit(); - //Set callback function + /* Set callback function */ poweroffSetCallback(&poweroffCallback, NULL); } diff --git a/libretro-common/vfs/vfs_implementation.c b/libretro-common/vfs/vfs_implementation.c index 9c2caef54f..d97e89fbea 100644 --- a/libretro-common/vfs/vfs_implementation.c +++ b/libretro-common/vfs/vfs_implementation.c @@ -294,7 +294,7 @@ libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, uns */ /* TODO: this is only useful for a few platforms, find which and add ifdef */ stream->fp = fp; -#if !defined(PS2) // TODO: PS2 IMPROVEMENT +#if !defined(PS2) /* TODO: PS2 IMPROVEMENT */ stream->buf = (char*)calloc(1, 0x4000); setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); #endif From 42d5c0037eb782ca60191cb5b9d5fd5d7f6878eb Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 13:55:43 +0100 Subject: [PATCH 110/116] Create separate platform_uwp.c --- frontend/drivers/platform_uwp.c | 419 ++++++++++++++++++++++++++++++ frontend/drivers/platform_win32.c | 100 ------- frontend/frontend_driver.c | 11 +- griffin/griffin.c | 6 +- 4 files changed, 434 insertions(+), 102 deletions(-) create mode 100644 frontend/drivers/platform_uwp.c diff --git a/frontend/drivers/platform_uwp.c b/frontend/drivers/platform_uwp.c new file mode 100644 index 0000000000..5d09858726 --- /dev/null +++ b/frontend/drivers/platform_uwp.c @@ -0,0 +1,419 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2017 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#ifdef HAVE_MENU +#include "../../menu/menu_driver.h" +#endif + +#include "../frontend_driver.h" +#include "../../configuration.h" +#include "../../defaults.h" +#include "../../retroarch.h" +#include "../../verbosity.h" +#include "../../ui/drivers/ui_win32.h" + +#include "../../uwp/uwp_func.h" + +static void frontend_uwp_get_os(char *s, size_t len, int *major, int *minor) +{ + char buildStr[11] = {0}; + bool server = false; + const char *arch = ""; + +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + /* Windows 2000 and later */ + SYSTEM_INFO si = {{0}}; + OSVERSIONINFOEX vi = {0}; + vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + + GetSystemInfo(&si); + + /* Available from NT 3.5 and Win95 */ + GetVersionEx((OSVERSIONINFO*)&vi); + + server = vi.wProductType != VER_NT_WORKSTATION; + + switch (si.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: + arch = "x64"; + break; + case PROCESSOR_ARCHITECTURE_INTEL: + arch = "x86"; + break; + case PROCESSOR_ARCHITECTURE_ARM: + arch = "ARM"; + break; + default: + break; + } +#else + OSVERSIONINFO vi = {0}; + vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + /* Available from NT 3.5 and Win95 */ + GetVersionEx(&vi); +#endif + + + if (major) + *major = vi.dwMajorVersion; + + if (minor) + *minor = vi.dwMinorVersion; + + if (vi.dwMajorVersion == 4 && vi.dwMinorVersion == 0) + snprintf(buildStr, sizeof(buildStr), "%lu", (DWORD)(LOWORD(vi.dwBuildNumber))); /* Windows 95 build number is in the low-order word only */ + else + snprintf(buildStr, sizeof(buildStr), "%lu", vi.dwBuildNumber); + + switch (vi.dwMajorVersion) + { + case 10: + if (server) + strlcpy(s, "Windows Server 2016", len); + else + strlcpy(s, "Windows 10", len); + break; + case 6: + switch (vi.dwMinorVersion) + { + case 3: + if (server) + strlcpy(s, "Windows Server 2012 R2", len); + else + strlcpy(s, "Windows 8.1", len); + break; + case 2: + if (server) + strlcpy(s, "Windows Server 2012", len); + else + strlcpy(s, "Windows 8", len); + break; + case 1: + if (server) + strlcpy(s, "Windows Server 2008 R2", len); + else + strlcpy(s, "Windows 7", len); + break; + case 0: + if (server) + strlcpy(s, "Windows Server 2008", len); + else + strlcpy(s, "Windows Vista", len); + break; + default: + break; + } + break; + case 5: + switch (vi.dwMinorVersion) + { + case 2: + if (server) + strlcpy(s, "Windows Server 2003", len); + else + { + /* Yes, XP Pro x64 is a higher version number than XP x86 */ + if (string_is_equal(arch, "x64")) + strlcpy(s, "Windows XP", len); + } + break; + case 1: + strlcpy(s, "Windows XP", len); + break; + case 0: + strlcpy(s, "Windows 2000", len); + break; + } + break; + case 4: + switch (vi.dwMinorVersion) + { + case 0: + if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + strlcpy(s, "Windows 95", len); + else if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) + strlcpy(s, "Windows NT 4.0", len); + else + strlcpy(s, "Unknown", len); + break; + case 90: + strlcpy(s, "Windows ME", len); + break; + case 10: + strlcpy(s, "Windows 98", len); + break; + } + break; + default: + snprintf(s, len, "Windows %i.%i", *major, *minor); + break; + } + + if (!string_is_empty(arch)) + { + strlcat(s, " ", len); + strlcat(s, arch, len); + } + + strlcat(s, " Build ", len); + strlcat(s, buildStr, len); + + if (!string_is_empty(vi.szCSDVersion)) + { + strlcat(s, " ", len); + strlcat(s, vi.szCSDVersion, len); + } + + if (!string_is_empty(uwp_device_family)) + { + strlcat(s, " ", len); + strlcat(s, uwp_device_family, len); + } +} + +static void frontend_uwp_init(void *data) +{ +} + +enum frontend_powerstate frontend_uwp_get_powerstate( + int *seconds, int *percent) +{ + SYSTEM_POWER_STATUS status; + enum frontend_powerstate ret = FRONTEND_POWERSTATE_NONE; + + if (!GetSystemPowerStatus(&status)) + return ret; + + if (status.BatteryFlag == 0xFF) + ret = FRONTEND_POWERSTATE_NONE; + if (status.BatteryFlag & (1 << 7)) + ret = FRONTEND_POWERSTATE_NO_SOURCE; + else if (status.BatteryFlag & (1 << 3)) + ret = FRONTEND_POWERSTATE_CHARGING; + else if (status.ACLineStatus == 1) + ret = FRONTEND_POWERSTATE_CHARGED; + else + ret = FRONTEND_POWERSTATE_ON_POWER_SOURCE; + + *percent = (int)status.BatteryLifePercent; + *seconds = (int)status.BatteryLifeTime; + +#ifdef _WIN32 + if (*percent == 255) + *percent = 0; +#endif + return ret; +} + +enum frontend_architecture frontend_uwp_get_architecture(void) +{ +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + /* Windows 2000 and later */ + SYSTEM_INFO si = {{0}}; + + GetSystemInfo(&si); + + switch (si.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: + return FRONTEND_ARCH_X86_64; + break; + case PROCESSOR_ARCHITECTURE_INTEL: + return FRONTEND_ARCH_X86; + break; + case PROCESSOR_ARCHITECTURE_ARM: + return FRONTEND_ARCH_ARM; + break; + default: + break; + } +#endif + + return FRONTEND_ARCH_NONE; +} + +static int frontend_uwp_parse_drive_list(void *data, bool load_content) +{ +#ifdef HAVE_MENU + file_list_t *list = (file_list_t*)data; + enum msg_hash_enums enum_idx = load_content ? + MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : + MSG_UNKNOWN; + /* TODO (krzys_h): UWP storage sandboxing */ + char *home_dir = (char*)malloc( + PATH_MAX_LENGTH * sizeof(char)); + + fill_pathname_home_dir(home_dir, + PATH_MAX_LENGTH * sizeof(char)); + + menu_entries_append_enum(list, + home_dir, + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); + + free(home_dir); +#endif + + return 0; +} + +static void frontend_uwp_environment_get(int *argc, char *argv[], + void *args, void *params_data) +{ + /* On UWP, we have to use the writable directory + * instead of the install directory. */ + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], + "~\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER], + "~\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], + "~\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS], + "~\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE], + "~\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR], + "~\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], + "~\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], + "~\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], + "~\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], + "~\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP], + "~\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], + "~\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], + "~\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY], + "~\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); + /* This one is an exception: cores have to be loaded from + * the install directory, + * since this is the only place UWP apps can take .dlls from */ + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE], + ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], + "~\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], + "~\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER], + "~\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + "~\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], + "~\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM], + "~\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], + "~\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], + "~\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + +#ifdef HAVE_MENU +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + snprintf(g_defaults.settings.menu, + sizeof(g_defaults.settings.menu), "xmb"); +#endif +#endif +} + +static uint64_t frontend_uwp_get_mem_total(void) +{ + /* OSes below 2000 don't have the Ex version, + * and non-Ex cannot work with >4GB RAM */ +#if _WIN32_WINNT >= 0x0500 + MEMORYSTATUSEX mem_info; + mem_info.dwLength = sizeof(MEMORYSTATUSEX); + GlobalMemoryStatusEx(&mem_info); + return mem_info.ullTotalPhys; +#else + MEMORYSTATUS mem_info; + mem_info.dwLength = sizeof(MEMORYSTATUS); + GlobalMemoryStatus(&mem_info); + return mem_info.dwTotalPhys; +#endif +} + +static uint64_t frontend_uwp_get_mem_used(void) +{ + /* OSes below 2000 don't have the Ex version, + * and non-Ex cannot work with >4GB RAM */ +#if _WIN32_WINNT >= 0x0500 + MEMORYSTATUSEX mem_info; + mem_info.dwLength = sizeof(MEMORYSTATUSEX); + GlobalMemoryStatusEx(&mem_info); + return ((frontend_uwp_get_mem_total() - mem_info.ullAvailPhys)); +#else + MEMORYSTATUS mem_info; + mem_info.dwLength = sizeof(MEMORYSTATUS); + GlobalMemoryStatus(&mem_info); + return ((frontend_uwp_get_mem_total() - mem_info.dwAvailPhys)); +#endif +} + +frontend_ctx_driver_t frontend_ctx_uwp = { + frontend_uwp_environment_get, + frontend_uwp_init, + NULL, /* deinit */ + NULL, /* exitspawn */ + NULL, /* process_args */ + NULL, /* exec */ + NULL, /* set_fork */ + NULL, /* shutdown */ + NULL, /* get_name */ + frontend_uwp_get_os, + NULL, /* get_rating */ + NULL, /* load_content */ + frontend_uwp_get_architecture, + frontend_uwp_get_powerstate, + frontend_uwp_parse_drive_list, + frontend_uwp_get_mem_total, + frontend_uwp_get_mem_used, + NULL, /* install_signal_handler */ + NULL, /* get_sighandler_state */ + NULL, /* set_sighandler_state */ + NULL, /* destroy_sighandler_state */ + NULL, /* attach_console */ + NULL, /* detach_console */ + NULL, /* watch_path_for_changes */ + NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ + "uwp" +}; diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index d82bf5907a..9b24ca39c5 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -47,12 +47,6 @@ #define SM_SERVERR2 89 #endif -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP -#include "../../uwp/uwp_func.h" -#endif - -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP -#else /* We only load this library once, so we let it be * unloaded at application shutdown, since unloading * it early seems to cause issues on some systems. @@ -155,7 +149,6 @@ static void gfx_set_dwm(void) RARCH_ERR("Failed to set composition state ...\n"); dwm_composition_disabled = settings->bools.video_disable_composition; } -#endif static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) { @@ -256,11 +249,8 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) if (server) { strlcpy(s, "Windows Server 2003", len); -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP -#else if (GetSystemMetrics(SM_SERVERR2)) strlcat(s, " R2", len); -#endif } else { @@ -316,19 +306,10 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) strlcat(s, vi.szCSDVersion, len); } -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - if (!string_is_empty(uwp_device_family)) - { - strlcat(s, " ", len); - strlcat(s, uwp_device_family, len); - } -#endif } static void frontend_win32_init(void *data) { -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP -#else typedef BOOL (WINAPI *isProcessDPIAwareProc)(); typedef BOOL (WINAPI *setProcessDPIAwareProc)(); #ifdef HAVE_DYNAMIC @@ -347,7 +328,6 @@ static void frontend_win32_init(void *data) if (!isDPIAwareProc()) if (setDPIAwareProc) setDPIAwareProc(); -#endif } enum frontend_powerstate frontend_win32_get_powerstate(int *seconds, int *percent) @@ -413,22 +393,6 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) enum msg_hash_enums enum_idx = load_content ? MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR : MSG_UNKNOWN; -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - /* TODO (krzys_h): UWP storage sandboxing */ - - char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - - fill_pathname_home_dir(home_dir, - PATH_MAX_LENGTH * sizeof(char)); - - menu_entries_append_enum(list, - home_dir, - msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), - enum_idx, - FILE_TYPE_DIRECTORY, 0, 0); - - free(home_dir); -#else size_t i = 0; unsigned drives = GetLogicalDrives(); char drive[] = " :\\"; @@ -443,7 +407,6 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) enum_idx, FILE_TYPE_DIRECTORY, 0, 0); } -#endif #endif return 0; @@ -452,57 +415,6 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content) static void frontend_win32_environment_get(int *argc, char *argv[], void *args, void *params_data) { -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - /* On UWP, we have to use the writable directory instead of the install directory */ - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], - "~\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER], - "~\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], - "~\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS], - "~\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE], - "~\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR], - "~\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], - "~\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], - "~\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], - "~\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], - "~\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP], - "~\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], - "~\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], - "~\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY], - "~\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); - /* This one is an exception: cores have to be loaded from the install directory, - * since this is the only place UWP apps can take .dlls from */ - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE], - ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], - "~\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], - "~\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER], - "~\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], - "~\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], - "~\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM], - "~\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], - "~\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); - fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], - "~\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); -#else gfx_set_dwm(); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], @@ -551,7 +463,6 @@ static void frontend_win32_environment_get(int *argc, char *argv[], ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); -#endif #ifdef HAVE_MENU #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) @@ -595,13 +506,10 @@ static uint64_t frontend_win32_get_mem_used(void) #endif } -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP -#else static void frontend_win32_attach_console(void) { #ifdef _WIN32 #ifdef _WIN32_WINNT_WINXP - /* msys will start the process with FILE_TYPE_PIPE connected. * cmd will start the process with FILE_TYPE_UNKNOWN connected * (since this is subsystem windows application @@ -642,7 +550,6 @@ static void frontend_win32_detach_console(void) { #if defined(_WIN32) && !defined(_XBOX) #ifdef _WIN32_WINNT_WINXP - if(console_needs_free) { /* we don't reconnect stdout/stderr to anything here, @@ -651,11 +558,9 @@ static void frontend_win32_detach_console(void) FreeConsole(); console_needs_free = false; } - #endif #endif } -#endif frontend_ctx_driver_t frontend_ctx_win32 = { frontend_win32_environment_get, @@ -679,13 +584,8 @@ frontend_ctx_driver_t frontend_ctx_win32 = { NULL, /* get_sighandler_state */ NULL, /* set_sighandler_state */ NULL, /* destroy_sighandler_state */ -#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - NULL, - NULL, -#else frontend_win32_attach_console, /* attach_console */ frontend_win32_detach_console, /* detach_console */ -#endif NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c index b8ff69a442..9a6881cf6c 100644 --- a/frontend/frontend_driver.c +++ b/frontend/frontend_driver.c @@ -29,6 +29,12 @@ #include "frontend_driver.h" +#ifndef __WINRT__ +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#define __WINRT__ +#endif +#endif + static frontend_ctx_driver_t *frontend_ctx_drivers[] = { #if defined(EMSCRIPTEN) &frontend_ctx_emscripten, @@ -65,9 +71,12 @@ static frontend_ctx_driver_t *frontend_ctx_drivers[] = { #if defined(SWITCH) && defined(HAVE_LIBNX) &frontend_ctx_switch, #endif -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) &frontend_ctx_win32, #endif +#if defined(__WINRT__) + &frontend_ctx_uwp, +#endif #ifdef XENON &frontend_ctx_xenon, #endif diff --git a/griffin/griffin.c b/griffin/griffin.c index 0b264e5952..6318513754 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -950,10 +950,14 @@ FRONTEND #include "../frontend/frontend_driver.c" -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) #include "../frontend/drivers/platform_win32.c" #endif +#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#include "../frontend/drivers/platform_uwp.c" +#endif + #ifdef _XBOX #include "../frontend/drivers/platform_xdk.c" #endif From 3c36a275058a3c679ba434ad52ad948520931fbf Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 13:56:41 +0100 Subject: [PATCH 111/116] Add this --- frontend/frontend_driver.h | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h index f5de976563..dc25214a31 100644 --- a/frontend/frontend_driver.h +++ b/frontend/frontend_driver.h @@ -124,6 +124,7 @@ extern frontend_ctx_driver_t frontend_ctx_ps2; extern frontend_ctx_driver_t frontend_ctx_ctr; extern frontend_ctx_driver_t frontend_ctx_switch; extern frontend_ctx_driver_t frontend_ctx_win32; +extern frontend_ctx_driver_t frontend_ctx_uwp; extern frontend_ctx_driver_t frontend_ctx_xenon; extern frontend_ctx_driver_t frontend_ctx_emscripten; extern frontend_ctx_driver_t frontend_ctx_dos; From 6f093e84743e5182700ce4dc2f2a0b0264ed978c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 3 Jan 2019 14:02:31 +0100 Subject: [PATCH 112/116] Turn C++ comment to C --- ps2/include/stdint.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ps2/include/stdint.h b/ps2/include/stdint.h index e9f805b7d3..e1db22e6da 100644 --- a/ps2/include/stdint.h +++ b/ps2/include/stdint.h @@ -41,4 +41,4 @@ typedef unsigned long uint64_t; #define UINT32_C(val) val##ui #define UINT64_C(val) val##ul -#endif //STDINT_H +#endif /* STDINT_H */ From d5c524c53ee089a150c0bfdd9d671cabf709f28c Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Thu, 3 Jan 2019 14:11:55 +0100 Subject: [PATCH 113/116] Update CHANGES.md --- CHANGES.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index d0e3a4c545..0b8b6376f8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -17,6 +17,8 @@ - MENU: User Interface -> Appearance -> 'Menu Font Green/Blue Color' settings now work properly. - MIDI: Add a Linux ALSA driver for MIDI. - NETPLAY: Force fast-save-states when netlay is enabled +- PS2: Initial PlayStation2 port. +- PS4: Initial PlayStation2 port. - RECORDING: Implement recording options in the menu complete with quality profiles, streaming, and proper file naming - SCANNER: Fix GDI disc scanning. - SHADERS: Fix auto shader preset loading on D3D10, D3D11, D3D12 @@ -33,7 +35,8 @@ - WINDOWS: Fix an ancient bug that caused wrong mappings for keyboard arrows - WINDOWS: Remember window size and position if so desired - WINDOWS: SSL/TLS connections now work properly. - +- UWP: Initial UWP port. +- XBONE: Initial Xbox One port. # 1.7.5 - CAMERA: Fix Video4Linux2 driver that broke years ago. From ab2010c4940db91278ae2f0ca88c13e55e3f2065 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Thu, 3 Jan 2019 14:12:10 +0100 Subject: [PATCH 114/116] Update CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 0b8b6376f8..ec4fea28e4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -18,7 +18,7 @@ - MIDI: Add a Linux ALSA driver for MIDI. - NETPLAY: Force fast-save-states when netlay is enabled - PS2: Initial PlayStation2 port. -- PS4: Initial PlayStation2 port. +- PS4: Initial PlayStation4 port. - RECORDING: Implement recording options in the menu complete with quality profiles, streaming, and proper file naming - SCANNER: Fix GDI disc scanning. - SHADERS: Fix auto shader preset loading on D3D10, D3D11, D3D12 From b5cf8e90c9e881ee94820b4043bd759e017a00ac Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Thu, 3 Jan 2019 18:51:00 +0100 Subject: [PATCH 115/116] Improve aspect_ratio detection in PS2 GFX (#7879) --- gfx/drivers/ps2_gfx.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index 7ee0803c95..6770afcc40 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -153,16 +153,9 @@ static void vram_alloc(GSGLOBAL *gsGlobal, GSTEXTURE *texture) { static void prim_texture(GSGLOBAL *gsGlobal, GSTEXTURE *texture, int zPosition, bool force_aspect) { float x1, y1, x2, y2; if (force_aspect) { - float delta = 1.0f; - float texture_aspect_ratio = texture->Width / texture->Height; - float gsGlobal_aspect_ratio = gsGlobal->Width / gsGlobal->Height; - if (texture_aspect_ratio < gsGlobal_aspect_ratio) { - //height - delta = gsGlobal->Height / texture->Height; - } else { - //width - delta = gsGlobal->Width / texture->Width; - } + float width_proportion = (float)gsGlobal->Width / (float)texture->Width; + float height_proportion = (float)gsGlobal->Height / (float)texture->Height; + float delta = MIN(width_proportion, height_proportion); float newWidth = texture->Width * delta; float newHeight = texture->Height * delta; From 88d61ddaf3bdce937b368363f6aedb0b2f306744 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 3 Jan 2019 18:57:00 -0500 Subject: [PATCH 116/116] griffin: vc2005 buildfix --- Makefile.griffin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.griffin b/Makefile.griffin index 4a099fa2b7..98ec4f48ca 100644 --- a/Makefile.griffin +++ b/Makefile.griffin @@ -431,7 +431,7 @@ else ifeq ($(platform), windows_msvc2005_x86) LD = link.exe PLATCFLAGS += -D_WIN32 -D_WIN32_WINNT=0x0410 -D__STDC_CONSTANT_MACROS -D_MBCS - LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib + LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib msimg32.lib PATH := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin"):$(PATH) PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../IDE")