From a8075aa35fdd3babbbe77016711cc13e2fe0264c Mon Sep 17 00:00:00 2001 From: Eric Warmenhoven Date: Sun, 22 Jun 2025 11:41:02 -0400 Subject: [PATCH] apple: provide option to disable metal argument buffers --- config.def.h | 4 ++++ configuration.c | 3 +++ configuration.h | 1 + gfx/common/vulkan_common.c | 7 +++++++ intl/msg_hash_lbl.h | 4 ++++ intl/msg_hash_us.h | 8 ++++++++ menu/cbs/menu_cbs_sublabel.c | 4 ++++ menu/menu_displaylist.c | 5 +++++ menu/menu_setting.c | 17 +++++++++++++++++ msg_hash.h | 1 + 10 files changed, 54 insertions(+) diff --git a/config.def.h b/config.def.h index 1cfed1cc69..c7710481e8 100644 --- a/config.def.h +++ b/config.def.h @@ -489,6 +489,10 @@ /* Choose if the screen will be able to write around the notch or not */ #define DEFAULT_NOTCH_WRITE_OVER_ENABLE false +#ifdef __APPLE__ +#define DEFAULT_USE_METAL_ARG_BUFFERS (!!__builtin_available(macOS 12, iOS 13, tvOS 12, *)) +#endif + /* Enable use of shaders. */ #ifdef RARCH_CONSOLE #define DEFAULT_SHADER_ENABLE true diff --git a/configuration.c b/configuration.c index 2de2b1ddf9..2dfa1fd731 100644 --- a/configuration.c +++ b/configuration.c @@ -1920,6 +1920,9 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("video_gpu_screenshot", &settings->bools.video_gpu_screenshot, true, DEFAULT_GPU_SCREENSHOT, false); SETTING_BOOL("video_post_filter_record", &settings->bools.video_post_filter_record, true, DEFAULT_POST_FILTER_RECORD, false); SETTING_BOOL("video_notch_write_over_enable", &settings->bools.video_notch_write_over_enable, true, DEFAULT_NOTCH_WRITE_OVER_ENABLE, false); +#if defined(__APPLE__) && defined(HAVE_VULKAN) + SETTING_BOOL("video_use_metal_arg_buffers", &settings->bools.video_use_metal_arg_buffers, true, DEFAULT_USE_METAL_ARG_BUFFERS, false); +#endif SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, DEFAULT_MESSAGE_BGCOLOR_ENABLE, false); SETTING_BOOL("video_window_show_decorations", &settings->bools.video_window_show_decorations, true, DEFAULT_WINDOW_DECORATIONS, false); SETTING_BOOL("video_window_save_positions", &settings->bools.video_window_save_positions, true, DEFAULT_WINDOW_SAVE_POSITIONS, false); diff --git a/configuration.h b/configuration.h index 26505970e0..535cee1763 100644 --- a/configuration.h +++ b/configuration.h @@ -660,6 +660,7 @@ typedef struct settings bool video_notch_write_over_enable; bool video_hdr_enable; bool video_hdr_expand_gamut; + bool video_use_metal_arg_buffers; /* Accessibility */ bool accessibility_enable; diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index c1b3fe3dab..88ad0e5afa 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -2370,6 +2370,13 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, #ifdef _WIN32 vulkan_library = dylib_load("vulkan-1.dll"); #elif __APPLE__ + /* allow overriding by environment variable; this means restart is required to change */ + if (!getenv("MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS")) + { + settings_t *settings = config_get_ptr(); + int use_mab = settings->bools.video_use_metal_arg_buffers; + setenv("MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", use_mab ? "1" : "0", 1); + } if (__builtin_available(macOS 10.15, iOS 13, tvOS 12, *)) vulkan_library = dylib_load("MoltenVK"); if (!vulkan_library) diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 7590b40ae5..b83177539e 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -4576,6 +4576,10 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_NOTCH_WRITE_OVER, "video_notch_write_over" ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_USE_METAL_ARG_BUFFERS, + "video_use_metal_arg_buffers" +) MSG_HASH( MENU_ENUM_LABEL_VIDEO_OUTPUT_SETTINGS, "video_output_settings" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index a0d66f5fd3..8fd00974cb 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2174,6 +2174,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_NOTCH_WRITE_OVER, "Enable fullscreen over notch in Android and iOS devices" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_USE_METAL_ARG_BUFFERS, + "Use Metal Argument Buffers (Restart required)" +) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_USE_METAL_ARG_BUFFERS, + "Try to improve performance by using Metal argument buffers. Some cores may require this. This may break some shaders, particularly on old hardware or OS versions." +) /* Settings > Video > CRT SwitchRes */ diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 3545c8cc8b..29b36c6cd0 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1284,6 +1284,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_rs90_softfilter_type, #endif #endif DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_screen_resolution, MENU_ENUM_SUBLABEL_SCREEN_RESOLUTION) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_use_metal_arg_buffers, MENU_ENUM_SUBLABEL_VIDEO_USE_METAL_ARG_BUFFERS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_gpu_index, MENU_ENUM_SUBLABEL_VIDEO_GPU_INDEX) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_vp_custom_height, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_vp_custom_width, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH) @@ -2621,6 +2622,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SCREEN_RESOLUTION: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_screen_resolution); break; + case MENU_ENUM_LABEL_VIDEO_USE_METAL_ARG_BUFFERS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_use_metal_arg_buffers); + break; case MENU_ENUM_LABEL_VIDEO_GPU_INDEX: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_gpu_index); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index bbb6f11fbc..1019c944b1 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -8082,6 +8082,11 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_VIDEO_NOTCH_WRITE_OVER, PARSE_ONLY_BOOL, false) == 0) count++; + + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_USE_METAL_ARG_BUFFERS, + PARSE_ONLY_BOOL, false) == 0) + count++; } break; case DISPLAYLIST_OPTIONS_REMAPPINGS: diff --git a/menu/menu_setting.c b/menu/menu_setting.c index f8987ddb41..8ac12c90bf 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -12540,6 +12540,23 @@ static bool setting_append_list( #ifdef HAVE_VULKAN if (string_is_equal(video_driver_get_ident(), "vulkan")) { +#ifdef __APPLE__ + CONFIG_BOOL( + list, list_info, + &settings->bools.video_use_metal_arg_buffers, + MENU_ENUM_LABEL_VIDEO_USE_METAL_ARG_BUFFERS, + MENU_ENUM_LABEL_VALUE_VIDEO_USE_METAL_ARG_BUFFERS, + DEFAULT_USE_METAL_ARG_BUFFERS, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); +#endif + CONFIG_INT( list, list_info, &settings->ints.vulkan_gpu_index, diff --git a/msg_hash.h b/msg_hash.h index c09e980813..11a8ade127 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1466,6 +1466,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_CROP_OVERSCAN), MENU_LABEL(VIDEO_NOTCH_WRITE_OVER), + MENU_LABEL(VIDEO_USE_METAL_ARG_BUFFERS), MENU_LABEL(VIDEO_SCALE_INTEGER), MENU_LABEL(VIDEO_SCALE_INTEGER_AXIS),