From ebf72eb126e8cf3db654622e2572b10e91be3f6f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 18 Feb 2023 10:05:56 +0100 Subject: [PATCH] overlays: add internal lock for progress bar texts --- .../RSX/Overlays/overlay_message_dialog.cpp | 25 ++++++++++++---- .../Emu/RSX/Overlays/overlay_message_dialog.h | 29 +++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp index 9a822b5962..b7d8f49c2b 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp @@ -71,6 +71,23 @@ namespace rsx return {}; } + if (const auto [dirty, text] = text_guard.get_text(); dirty) + { + u16 text_w, text_h; + text_display.set_pos(90, 364); + text_display.set_text(text); + text_display.measure_text(text_w, text_h); + text_display.translate(0, -(text_h - 16)); + } + + for (u32 i = 0; i < progress_bars.size(); i++) + { + if (const auto [dirty, text] = ::at32(bar_text_guard, i).get_text(); dirty) + { + ::at32(progress_bars, i).set_text(text); + } + } + compiled_resource result; update_custom_background(); @@ -339,11 +356,7 @@ namespace rsx void message_dialog::set_text(const std::string& text) { - u16 text_w, text_h; - text_display.set_pos(90, 364); - text_display.set_text(text); - text_display.measure_text(text_w, text_h); - text_display.translate(0, -(text_h - 16)); + text_guard.set_text(text); } void message_dialog::update_custom_background() @@ -415,7 +428,7 @@ namespace rsx if (index >= num_progress_bars) return CELL_MSGDIALOG_ERROR_PARAM; - ::at32(progress_bars, index).set_text(msg); + ::at32(bar_text_guard, index).set_text(msg); return CELL_OK; } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h index 99eef4fe0e..e45aeedb00 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h @@ -32,6 +32,35 @@ namespace rsx animation_color_interpolate fade_animation; + struct text_guard_t + { + std::mutex mutex; + std::string text; + bool dirty{false}; + + void set_text(std::string t) + { + std::lock_guard lock(mutex); + text = std::move(t); + dirty = true; + } + + std::pair get_text() + { + if (dirty) + { + std::lock_guard lock(mutex); + dirty = false; + return { true, std::move(text) }; + } + + return { false, {} }; + } + }; + + text_guard_t text_guard{}; + std::array bar_text_guard{}; + public: message_dialog(bool allow_custom_background = false);