diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index a77bd9d0ab..13e6669a3c 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -442,6 +442,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/overlay_cursor.cpp RSX/Overlays/overlay_edit_text.cpp RSX/Overlays/overlay_fonts.cpp + RSX/Overlays/overlay_home_menu.cpp RSX/Overlays/overlay_list_view.cpp RSX/Overlays/overlay_media_list_dialog.cpp RSX/Overlays/overlay_message.cpp diff --git a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp index 3cf79ca6b5..b2d5eda902 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp @@ -161,6 +161,27 @@ extern u64 get_sysutil_cb_manager_read_count() return 0; } +extern bool send_open_home_menu_cmds() +{ + // TODO: handle CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE + if (sysutil_send_system_cmd(CELL_SYSUTIL_DRAWING_BEGIN, 0) < 0 || + sysutil_send_system_cmd(CELL_SYSUTIL_SYSTEM_MENU_OPEN, 0) < 0 || + sysutil_send_system_cmd(CELL_SYSUTIL_BGMPLAYBACK_PLAY, 0) < 0) + { + return false; + } + + return true; +} + +extern void send_close_home_menu_cmds() +{ + // TODO: handle CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE + sysutil_send_system_cmd(CELL_SYSUTIL_BGMPLAYBACK_STOP, 0); + sysutil_send_system_cmd(CELL_SYSUTIL_SYSTEM_MENU_CLOSE, 0); + sysutil_send_system_cmd(CELL_SYSUTIL_DRAWING_END, 0); +} + template <> void fmt_class_string::format(std::string& out, u64 arg) { diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index bec6b4ed96..1d93256456 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -5,6 +5,7 @@ LOG_CHANNEL(screenshot_log, "SCREENSHOT"); +extern atomic_t g_user_asked_for_screenshot; extern atomic_t g_recording_mode; namespace gl @@ -235,7 +236,7 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) if (image_to_flip) { - if (m_frame->screenshot_toggle || (g_recording_mode != recording_mode::stopped && m_frame->can_consume_frame())) + if (g_user_asked_for_screenshot || (g_recording_mode != recording_mode::stopped && m_frame->can_consume_frame())) { std::vector sshot_frame(buffer_height * buffer_width * 4); @@ -251,9 +252,8 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) { screenshot_log.error("Failed to capture image: 0x%x", err); } - else if (m_frame->screenshot_toggle) + else if (g_user_asked_for_screenshot.exchange(false)) { - m_frame->screenshot_toggle = false; m_frame->take_screenshot(std::move(sshot_frame), buffer_width, buffer_height, false); } else diff --git a/rpcs3/Emu/RSX/GSFrameBase.h b/rpcs3/Emu/RSX/GSFrameBase.h index 721a1a0358..680445dd6b 100644 --- a/rpcs3/Emu/RSX/GSFrameBase.h +++ b/rpcs3/Emu/RSX/GSFrameBase.h @@ -29,7 +29,6 @@ public: virtual display_handle_t handle() const = 0; - atomic_t screenshot_toggle = false; virtual bool can_consume_frame() const = 0; virtual void present_frame(std::vector& data, const u32 width, const u32 height, bool is_bgra) const = 0; virtual void take_screenshot(const std::vector sshot_data, const u32 sshot_width, const u32 sshot_height, bool is_bgra) = 0; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_home_menu.cpp b/rpcs3/Emu/RSX/Overlays/overlay_home_menu.cpp new file mode 100644 index 0000000000..b52537ec9a --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_home_menu.cpp @@ -0,0 +1,268 @@ +#include "stdafx.h" +#include "overlay_home_menu.h" +#include "Emu/RSX/RSXThread.h" + +extern atomic_t g_user_asked_for_recording; +extern atomic_t g_user_asked_for_screenshot; + +namespace rsx +{ + namespace overlays + { + home_menu_dialog::home_menu_entry::home_menu_entry(const std::string& text) + { + std::unique_ptr text_stack = std::make_unique(); + std::unique_ptr padding = std::make_unique(); + std::unique_ptr header_text = std::make_unique