From 667f4efa8bac1b0ca3b58384ada384a5707abcf4 Mon Sep 17 00:00:00 2001 From: ScoochAside <26647325+miguedevel@users.noreply.github.com> Date: Wed, 27 Nov 2024 01:14:22 -0500 Subject: [PATCH 1/5] Preliminary work on disabling shaders when taking a GPU screenhot. Might be useful to have as an option? --- tasks/task_screenshot.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 43890fbc6d36..310526f05954 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -464,6 +464,8 @@ static bool take_screenshot_viewport( vp.full_width = 0; vp.full_height = 0; + settings_t* settings = config_get_ptr(); + video_driver_get_viewport_info(&vp); if (!vp.width || !vp.height) @@ -471,10 +473,25 @@ static bool take_screenshot_viewport( if (!(buffer = (uint8_t*)malloc(vp.width * vp.height * 3))) return false; + /*Disable Shaders. TODO: Add an option*/ + if (video_st->menu_driver_shader->passes) + { + video_st->current_video->set_shader(video_st->data, RARCH_SHADER_NONE, NULL); + video_driver_cached_frame(); + } if (!( video_st->current_video->read_viewport && video_st->current_video->read_viewport( video_st->data, buffer, runloop_flags & RUNLOOP_FLAG_IDLE))) goto error; + if (video_st->menu_driver_shader->passes) + { + menu_shader_manager_apply_changes(menu_shader_get(), + settings->paths.directory_video_shader, + settings->paths.directory_menu_config + ); + } + + /* Limit image to screen size */ if (vp.width > video_st->width) From 409f9289c9c5eaa9878a35149cfd5e1aefbb0f88 Mon Sep 17 00:00:00 2001 From: ScoochAside <26647325+miguedevel@users.noreply.github.com> Date: Fri, 3 Jan 2025 00:52:21 -0500 Subject: [PATCH 2/5] Implement a menu optino toggle for this. Fixed bug where shader option was forcibly set to on. --- config.def.h | 1 + configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 4 ++++ intl/msg_hash_us.h | 10 +++++++++- menu/cbs/menu_cbs_sublabel.c | 4 ++++ menu/menu_displaylist.c | 14 ++++++++++---- menu/menu_setting.c | 15 +++++++++++++++ msg_hash.h | 1 + tasks/task_screenshot.c | 29 ++++++++++++++++------------- 10 files changed, 62 insertions(+), 18 deletions(-) diff --git a/config.def.h b/config.def.h index 0eea764ee304..80bdf75499c6 100644 --- a/config.def.h +++ b/config.def.h @@ -992,6 +992,7 @@ /* Screenshots post-shaded GPU output if available. */ #define DEFAULT_GPU_SCREENSHOT true +#define DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS true /* Watch shader files for changes and auto-apply as necessary. */ #define DEFAULT_VIDEO_SHADER_WATCH_FILES false diff --git a/configuration.c b/configuration.c index 2e8afffc8f0e..11c634dda915 100644 --- a/configuration.c +++ b/configuration.c @@ -1886,6 +1886,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("video_waitable_swapchains", &settings->bools.video_waitable_swapchains, true, DEFAULT_WAITABLE_SWAPCHAINS, false); SETTING_BOOL("video_disable_composition", &settings->bools.video_disable_composition, true, DEFAULT_DISABLE_COMPOSITION, false); SETTING_BOOL("video_gpu_screenshot", &settings->bools.video_gpu_screenshot, true, DEFAULT_GPU_SCREENSHOT, false); + SETTING_BOOL("video_gpu_screenshot_include_shaders", &settings->bools.video_gpu_screenshot_include_shaders, true, DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS, 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); SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, DEFAULT_MESSAGE_BGCOLOR_ENABLE, false); diff --git a/configuration.h b/configuration.h index 17748e956e86..f7529132c85d 100644 --- a/configuration.h +++ b/configuration.h @@ -630,6 +630,7 @@ typedef struct settings bool video_post_filter_record; bool video_gpu_record; bool video_gpu_screenshot; + bool video_gpu_screenshot_include_shaders; bool video_allow_rotate; bool video_shared_context; bool video_force_srgb_disable; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index e73ba3027be4..b62097fa4db6 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -4418,6 +4418,10 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, "video_gpu_screenshot" ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + "video_gpu_screenshot_include_shaders" + ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_HARD_SYNC, "video_hard_sync" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c2f8cbb748bb..268590f7abe8 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2126,6 +2126,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "GPU Screenshot" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + "GPU Screenshot Shaders" + ) + MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + "Include shaders when capturing GPU screenshots" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCAN_SUBFRAMES, "Rolling scanline simulation" @@ -2140,7 +2148,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, - "Screenshots capture GPU shaded material if available." + "Screenshots capture GPU material if available." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9a465b1e37d0..3bae4b795d5a 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -723,6 +723,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_axis, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_AXIS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_scaling, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_SCALING) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_gpu_screenshot, MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_gpu_screenshot_include_shaders, MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_rotation, MENU_ENUM_SUBLABEL_VIDEO_ROTATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_screen_orientation, MENU_ENUM_SUBLABEL_SCREEN_ORIENTATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_force_srgb_enable, MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE) @@ -4241,6 +4242,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_gpu_screenshot); break; + case MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_gpu_screenshot_include_shaders); + break; case MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_scale_integer); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 352c60d4310e..595e89ff7a28 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7756,12 +7756,18 @@ unsigned menu_displaylist_build_list( #ifdef HAVE_SCREENSHOTS { video_driver_state_t *video_st = video_state_get_ptr(); - if ( video_st->current_video->read_viewport - && video_st->current_video->viewport_info) + if (video_st->current_video->read_viewport + && video_st->current_video->viewport_info) + { if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, - MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, - PARSE_ONLY_BOOL, false) == 0) + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, + PARSE_ONLY_BOOL, false) == 0) count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + PARSE_ONLY_BOOL, false) == 0) + count++; + } } #endif if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index f520bdd98ed1..0f0eb71cb364 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -14382,6 +14382,21 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE ); + CONFIG_BOOL( + list, list_info, + &settings->bools.video_gpu_screenshot_include_shaders, + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS, + 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 + ); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED); CONFIG_BOOL( diff --git a/msg_hash.h b/msg_hash.h index 9e492fec8681..a09fb48cfff4 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1405,6 +1405,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_WAITABLE_SWAPCHAINS), MENU_LABEL(VIDEO_MAX_FRAME_LATENCY), MENU_LABEL(VIDEO_GPU_SCREENSHOT), + MENU_LABEL(VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS), MENU_LBL_H(VIDEO_BLACK_FRAME_INSERTION), MENU_LBL_H(VIDEO_BFI_DARK_FRAMES), MENU_LBL_H(VIDEO_SHADER_SUBFRAMES), diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 310526f05954..b31c66a6daab 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -473,23 +473,26 @@ static bool take_screenshot_viewport( if (!(buffer = (uint8_t*)malloc(vp.width * vp.height * 3))) return false; - /*Disable Shaders. TODO: Add an option*/ - if (video_st->menu_driver_shader->passes) - { - video_st->current_video->set_shader(video_st->data, RARCH_SHADER_NONE, NULL); - video_driver_cached_frame(); - } + if(!settings->bools.video_gpu_screenshot_include_shaders) + /*Disable shaders*/ + if (settings->bools.video_shader_enable && video_st->menu_driver_shader->passes) + { + video_st->current_video->set_shader(video_st->data, RARCH_SHADER_NONE, NULL); + video_driver_cached_frame(); + } if (!( video_st->current_video->read_viewport && video_st->current_video->read_viewport( video_st->data, buffer, runloop_flags & RUNLOOP_FLAG_IDLE))) goto error; - if (video_st->menu_driver_shader->passes) - { - menu_shader_manager_apply_changes(menu_shader_get(), - settings->paths.directory_video_shader, - settings->paths.directory_menu_config - ); - } + if (!settings->bools.video_gpu_screenshot_include_shaders) + /*Re-enable shaders*/ + if (settings->bools.video_shader_enable && video_st->menu_driver_shader->passes) + { + menu_shader_manager_apply_changes(menu_shader_get(), + settings->paths.directory_video_shader, + settings->paths.directory_menu_config + ); + } From cb42fe5873351b0fce3acc8529753ce65bc3d842 Mon Sep 17 00:00:00 2001 From: ScoochAside <26647325+miguedevel@users.noreply.github.com> Date: Sat, 4 Jan 2025 00:11:14 -0500 Subject: [PATCH 3/5] Added a similar option for overlays Changed method of disabling shaders Fixed shaders/overlay not being re-enabled if screenshot failed Made the new options Advanced options --- config.def.h | 1 + configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 4 +++ intl/msg_hash_us.h | 10 +++++++- menu/cbs/menu_cbs_sublabel.c | 4 +++ menu/menu_displaylist.c | 4 +++ menu/menu_setting.c | 45 ++++++++++++++++++++++----------- msg_hash.h | 1 + tasks/task_screenshot.c | 48 +++++++++++++++++++++--------------- 10 files changed, 84 insertions(+), 35 deletions(-) diff --git a/config.def.h b/config.def.h index 80bdf75499c6..b38343807050 100644 --- a/config.def.h +++ b/config.def.h @@ -993,6 +993,7 @@ /* Screenshots post-shaded GPU output if available. */ #define DEFAULT_GPU_SCREENSHOT true #define DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS true +#define DEFAULT_GPU_SCREENSHOT_INCLUDE_OVERLAY true /* Watch shader files for changes and auto-apply as necessary. */ #define DEFAULT_VIDEO_SHADER_WATCH_FILES false diff --git a/configuration.c b/configuration.c index 11c634dda915..b688143f414e 100644 --- a/configuration.c +++ b/configuration.c @@ -1887,6 +1887,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("video_disable_composition", &settings->bools.video_disable_composition, true, DEFAULT_DISABLE_COMPOSITION, false); SETTING_BOOL("video_gpu_screenshot", &settings->bools.video_gpu_screenshot, true, DEFAULT_GPU_SCREENSHOT, false); SETTING_BOOL("video_gpu_screenshot_include_shaders", &settings->bools.video_gpu_screenshot_include_shaders, true, DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS, false); + SETTING_BOOL("video_gpu_screenshot_include_overlay", &settings->bools.video_gpu_screenshot_include_overlay, true, DEFAULT_GPU_SCREENSHOT_INCLUDE_OVERLAY, 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); SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, DEFAULT_MESSAGE_BGCOLOR_ENABLE, false); diff --git a/configuration.h b/configuration.h index f7529132c85d..c50839f924fc 100644 --- a/configuration.h +++ b/configuration.h @@ -631,6 +631,7 @@ typedef struct settings bool video_gpu_record; bool video_gpu_screenshot; bool video_gpu_screenshot_include_shaders; + bool video_gpu_screenshot_include_overlay; bool video_allow_rotate; bool video_shared_context; bool video_force_srgb_disable; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index b62097fa4db6..b7b38f70a874 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -4422,6 +4422,10 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, "video_gpu_screenshot_include_shaders" ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, + "video_gpu_screenshot_include_overlay" + ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_HARD_SYNC, "video_hard_sync" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 268590f7abe8..f0c115398283 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2130,10 +2130,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, "GPU Screenshot Shaders" ) - MSG_HASH( +MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, "Include shaders when capturing GPU screenshots" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, + "GPU Screenshot Overlay" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, + "Include overlay when capturing GPU screenshots" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SCAN_SUBFRAMES, "Rolling scanline simulation" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 3bae4b795d5a..54174416754d 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -724,6 +724,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_axis, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_scaling, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_SCALING) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_gpu_screenshot, MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_gpu_screenshot_include_shaders, MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_gpu_screenshot_include_overlay, MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_rotation, MENU_ENUM_SUBLABEL_VIDEO_ROTATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_screen_orientation, MENU_ENUM_SUBLABEL_SCREEN_ORIENTATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_force_srgb_enable, MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE) @@ -4245,6 +4246,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_gpu_screenshot_include_shaders); break; + case MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_gpu_screenshot_include_overlay); + break; case MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_scale_integer); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 595e89ff7a28..c0ae621f1381 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7767,6 +7767,10 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, PARSE_ONLY_BOOL, false) == 0) count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, + PARSE_ONLY_BOOL, false) == 0) + count++; } } #endif diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 0f0eb71cb364..915c051a6fe1 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -14382,22 +14382,39 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE ); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED); + CONFIG_BOOL( - list, list_info, - &settings->bools.video_gpu_screenshot_include_shaders, - MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, - MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, - DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS, - 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 + list, list_info, + &settings->bools.video_gpu_screenshot_include_shaders, + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, + DEFAULT_GPU_SCREENSHOT_INCLUDE_SHADERS, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_ADVANCED + ); + + CONFIG_BOOL( + list, list_info, + &settings->bools.video_gpu_screenshot_include_overlay, + MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, + DEFAULT_GPU_SCREENSHOT_INCLUDE_OVERLAY, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_ADVANCED ); - SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED); CONFIG_BOOL( list, list_info, diff --git a/msg_hash.h b/msg_hash.h index a09fb48cfff4..d792021d8c07 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1406,6 +1406,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_MAX_FRAME_LATENCY), MENU_LABEL(VIDEO_GPU_SCREENSHOT), MENU_LABEL(VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS), + MENU_LABEL(VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY), MENU_LBL_H(VIDEO_BLACK_FRAME_INSERTION), MENU_LBL_H(VIDEO_BFI_DARK_FRAMES), MENU_LBL_H(VIDEO_SHADER_SUBFRAMES), diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index b31c66a6daab..f724d88d1951 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -454,6 +454,8 @@ static bool take_screenshot_viewport( unsigned pixel_format_type) { struct video_viewport vp; + bool success; + bool shaders_used; video_driver_state_t *video_st = video_state_get_ptr(); uint8_t *buffer = NULL; @@ -473,27 +475,33 @@ static bool take_screenshot_viewport( if (!(buffer = (uint8_t*)malloc(vp.width * vp.height * 3))) return false; - if(!settings->bools.video_gpu_screenshot_include_shaders) - /*Disable shaders*/ - if (settings->bools.video_shader_enable && video_st->menu_driver_shader->passes) - { - video_st->current_video->set_shader(video_st->data, RARCH_SHADER_NONE, NULL); - video_driver_cached_frame(); - } - if (!( video_st->current_video->read_viewport - && video_st->current_video->read_viewport( - video_st->data, buffer, runloop_flags & RUNLOOP_FLAG_IDLE))) - goto error; - if (!settings->bools.video_gpu_screenshot_include_shaders) - /*Re-enable shaders*/ - if (settings->bools.video_shader_enable && video_st->menu_driver_shader->passes) - { - menu_shader_manager_apply_changes(menu_shader_get(), - settings->paths.directory_video_shader, - settings->paths.directory_menu_config - ); - } + shaders_used = settings->bools.video_shader_enable; + if (!settings->bools.video_gpu_screenshot_include_shaders && + shaders_used) + { + command_event(CMD_EVENT_SHADER_TOGGLE, NULL); + video_driver_cached_frame(); + } + if (!settings->bools.video_gpu_screenshot_include_overlay && + settings->bools.input_overlay_enable) + { + command_event(CMD_EVENT_OVERLAY_UNLOAD, NULL); + video_driver_cached_frame(); + } + success = (video_st->current_video->read_viewport + && video_st->current_video->read_viewport( + video_st->data, buffer, runloop_flags & RUNLOOP_FLAG_IDLE)); + + if (!settings->bools.video_gpu_screenshot_include_shaders && + shaders_used) + command_event(CMD_EVENT_SHADER_TOGGLE, NULL); + if (!settings->bools.video_gpu_screenshot_include_overlay && + settings->bools.input_overlay_enable) + command_event(CMD_EVENT_OVERLAY_INIT, NULL); + + if (!success) + goto error; /* Limit image to screen size */ From 2225580899cbb046de4779d9ff68dbe7b55f1a43 Mon Sep 17 00:00:00 2001 From: ScoochAside <26647325+miguedevel@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:17:19 -0500 Subject: [PATCH 4/5] Omit displaying new menu options if RetroArch is built without shader and/or overlay support --- menu/menu_displaylist.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index a60cfd3ca8a3..0b4e67debf6f 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7832,14 +7832,18 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, PARSE_ONLY_BOOL, false) == 0) count++; +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_SHADERS, PARSE_ONLY_BOOL, false) == 0) count++; +#endif +#ifdef HAVE_OVERLAY if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT_INCLUDE_OVERLAY, PARSE_ONLY_BOOL, false) == 0) count++; +#endif } } #endif From 57ce04fc09e72cf1e807f4f71b598e8b2dfbb67c Mon Sep 17 00:00:00 2001 From: ScoochAside <26647325+miguedevel@users.noreply.github.com> Date: Sat, 4 Jan 2025 20:20:55 -0500 Subject: [PATCH 5/5] Fix C89 compiler complaint --- tasks/task_screenshot.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index b952967de901..19a282349929 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -457,6 +457,7 @@ static bool take_screenshot_viewport( struct video_viewport vp; bool success; bool shaders_used; + settings_t* settings; video_driver_state_t *video_st = video_state_get_ptr(); uint8_t *buffer = NULL; @@ -467,7 +468,7 @@ static bool take_screenshot_viewport( vp.full_width = 0; vp.full_height = 0; - settings_t* settings = config_get_ptr(); + settings = config_get_ptr(); video_driver_get_viewport_info(&vp);