From 44771150b79e6caffcbb1311c62912d7e2b895c4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 14 Jan 2023 00:07:07 +0100 Subject: [PATCH] overlays: add simple home menu --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/Cell/Modules/cellSysutil.cpp | 21 ++ rpcs3/Emu/RSX/GL/GLPresent.cpp | 6 +- rpcs3/Emu/RSX/GSFrameBase.h | 1 - rpcs3/Emu/RSX/Overlays/overlay_home_menu.cpp | 268 +++++++++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_home_menu.h | 42 +++ rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp | 20 +- rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp | 3 +- rpcs3/Emu/RSX/Overlays/overlays.cpp | 2 +- rpcs3/Emu/RSX/Overlays/overlays.h | 1 + rpcs3/Emu/RSX/RSXThread.cpp | 2 + rpcs3/Emu/RSX/VK/VKPresent.cpp | 6 +- rpcs3/Emu/System.cpp | 6 +- rpcs3/Emu/System.h | 2 +- rpcs3/Emu/localized_string_id.h | 6 + rpcs3/Emu/system_config.h | 1 + rpcs3/Input/pad_thread.cpp | 79 +++++- rpcs3/Input/pad_thread.h | 5 +- rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + rpcs3/rpcs3qt/emu_settings_type.h | 2 + rpcs3/rpcs3qt/gs_frame.cpp | 14 +- rpcs3/rpcs3qt/localized_emu.h | 5 + rpcs3/rpcs3qt/main_window.cpp | 3 - rpcs3/rpcs3qt/settings_dialog.cpp | 3 + rpcs3/rpcs3qt/settings_dialog.ui | 7 + rpcs3/rpcs3qt/tooltips.h | 1 + 27 files changed, 482 insertions(+), 33 deletions(-) create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_home_menu.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_home_menu.h 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