Compare commits

...

8 Commits

Author SHA1 Message Date
Jordan Woyak
ea83359957
Merge bc40d943bb into 033a0540f7 2025-08-31 08:48:38 +02:00
Tilka
033a0540f7
Merge pull request #13899 from SuperSamus/patch-cheats-osd
PatchEngine: OSD message showing number of enabled patches and cheats
2025-08-31 00:27:23 +01:00
Martino Fontana
64a20c74fc PatchEngine: OSD message showing number of enabled patches and cheats 2025-08-30 16:51:51 +02:00
Tilka
76c114a02b
Merge pull request #13910 from Tilka/ub
Fix some undefined behavior
2025-08-30 06:17:45 +01:00
Tillmann Karras
c248f1afa4 IOS/WD: fix wrong BitSet ctor being called
We don't want list initialization here.

Thank you, UB-san.
2025-08-30 03:05:35 +01:00
Tillmann Karras
63257d1ee9 CoreTiming: set default overclock factors to 1.0
I'm not aware of any issue here but let's set meaningful defaults
anyway.
2025-08-30 03:05:35 +01:00
Tillmann Karras
18f0bd1d4b VI: set default overclock factor to 1.0
GetTicksPerHalfLine() gets called via Preset() before RefreshConfig()
has a chance to replace the dummy value 0.0.

Thank you, UB-san.
2025-08-30 03:03:21 +01:00
Jordan Woyak
bc40d943bb WiimoteReal: Send reports with proper timing for theoretically better speaker data. 2025-08-17 16:11:39 -05:00
10 changed files with 59 additions and 7 deletions

View File

@ -174,6 +174,15 @@ void AddCode(ARCode code)
}
}
size_t CountEnabledCodes()
{
if (!Config::AreCheatsEnabled())
return 0;
std::lock_guard guard(s_lock);
return s_active_codes.size();
}
void LoadAndApplyCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini,
const std::string& game_id, u16 revision)
{

View File

@ -50,6 +50,7 @@ void SetSyncedCodesAsActive();
void UpdateSyncedCodes(std::span<const ARCode> codes);
std::vector<ARCode> ApplyAndReturnCodes(std::span<const ARCode> codes);
void AddCode(ARCode new_code);
size_t CountEnabledCodes();
void LoadAndApplyCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini,
const std::string& game_id, u16 revision);

View File

@ -203,8 +203,8 @@ private:
EventType* m_ev_lost = nullptr;
CPUThreadConfigCallback::ConfigChangedCallbackID m_registered_config_callback_id;
float m_config_oc_factor = 0.0f;
float m_config_oc_inv_factor = 0.0f;
float m_config_oc_factor = 1.0f;
float m_config_oc_inv_factor = 1.0f;
bool m_config_sync_on_skip_idle = false;
s64 m_throttle_reference_cycle = 0;

View File

@ -50,6 +50,15 @@ static std::vector<GeckoCode> s_active_codes;
static std::vector<GeckoCode> s_synced_codes;
static std::mutex s_active_codes_lock;
size_t CountEnabledCodes()
{
if (!Config::AreCheatsEnabled())
return 0;
std::lock_guard guard(s_active_codes_lock);
return s_active_codes.size();
}
void SetActiveCodes(std::span<const GeckoCode> gcodes, const std::string& game_id, u16 revision)
{
std::lock_guard lk(s_active_codes_lock);

View File

@ -60,6 +60,7 @@ constexpr u32 HLE_TRAMPOLINE_ADDRESS = INSTALLER_END_ADDRESS - 4;
// preserve the emulation performance.
constexpr u32 MAGIC_GAMEID = 0xD01F1BAD;
size_t CountEnabledCodes();
void SetActiveCodes(std::span<const GeckoCode> gcodes, const std::string& game_id, u16 revision);
void SetSyncedCodesAsActive();
void UpdateSyncedCodes(std::span<const GeckoCode> gcodes);

View File

@ -454,7 +454,7 @@ private:
u32 m_even_field_last_hl = 0; // index last halfline of the even field
u32 m_odd_field_last_hl = 0; // index last halfline of the odd field
float m_config_vi_oc_factor = 0.0f;
float m_config_vi_oc_factor = 1.0f;
Config::ConfigChangedCallbackID m_config_changed_callback_id;
Core::System& m_system;

View File

@ -20,6 +20,7 @@
#include "Core/Config/MainSettings.h"
#include "Core/Config/WiimoteSettings.h"
#include "Core/Core.h"
#include "Core/CoreTiming.h"
#include "Core/HW/Wiimote.h"
#include "Core/HW/WiimoteCommon/DataReport.h"
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
@ -207,7 +208,14 @@ void Wiimote::WriteReport(Report rpt)
m_rumble_state = new_rumble_state;
}
m_write_reports.Push(std::move(rpt));
auto& core_timing = Core::System::GetInstance().GetCoreTiming();
// When invoked from the CPU thread, send the report at the proper time.
// From other threads (e.g. on construction/destruction) send the report immediately.
const auto report_time =
Core::IsCPUThread() ? core_timing.GetTargetHostTime(core_timing.GetTicks()) : Clock::now();
m_write_reports.Emplace(report_time, std::move(rpt));
IOWakeup();
}
@ -334,7 +342,8 @@ bool Wiimote::Write()
if (m_write_reports.Empty())
return true;
Report const& rpt = m_write_reports.Front();
auto const& timed_report = m_write_reports.Front();
auto const& rpt = timed_report.report;
if (m_balance_board_dump_port > 0 && m_index == WIIMOTE_BALANCE_BOARD)
{
@ -342,6 +351,9 @@ bool Wiimote::Write()
(void)Socket.send((char*)rpt.data(), rpt.size(), sf::IpAddress::LocalHost,
m_balance_board_dump_port);
}
// Write the report at the proper time, mainly for speaker data, not that it will help much.
std::this_thread::sleep_until(timed_report.time);
int ret = IOWrite(rpt.data(), rpt.size());
m_write_reports.Pop();

View File

@ -154,7 +154,14 @@ private:
Common::Event m_thread_ready_event;
Common::SPSCQueue<Report> m_read_reports;
Common::SPSCQueue<Report> m_write_reports;
struct TimedReport
{
TimePoint time;
Report report;
};
Common::SPSCQueue<TimedReport> m_write_reports;
bool m_speaker_enabled_in_dolphin_config = false;
int m_balance_board_dump_port = 0;

View File

@ -28,7 +28,7 @@ constexpr u16 LegalNitroChannelMask = 0b0011'1111'1111'1110u;
u16 SelectWifiChannel(u16 enabled_channels_mask, u16 current_channel)
{
const Common::BitSet<u16> enabled_channels{enabled_channels_mask & LegalChannelMask};
const Common::BitSet<u16> enabled_channels(enabled_channels_mask & LegalChannelMask);
u16 next_channel = current_channel;
for (int i = 0; i < 16; ++i)
{

View File

@ -35,6 +35,7 @@
#include "Core/PowerPC/MMU.h"
#include "Core/PowerPC/PowerPC.h"
#include "Core/System.h"
#include "VideoCommon/OnScreenDisplay.h"
namespace PatchEngine
{
@ -200,6 +201,18 @@ void LoadPatches()
ActionReplay::LoadAndApplyCodes(globalIni, localIni, sconfig.GetGameID(),
sconfig.GetRevision());
}
const size_t enabled_patch_count =
std::ranges::count_if(s_on_frame, [](Patch patch) { return patch.enabled; });
if (enabled_patch_count > 0)
{
OSD::AddMessage(fmt::format("{} game patch(es) enabled", enabled_patch_count),
OSD::Duration::NORMAL);
}
const size_t enabled_cheat_count = ActionReplay::CountEnabledCodes() + Gecko::CountEnabledCodes();
if (enabled_cheat_count > 0)
OSD::AddMessage(fmt::format("{} cheat(s) enabled", enabled_cheat_count), OSD::Duration::NORMAL);
}
static void ApplyPatches(const Core::CPUThreadGuard& guard, const std::vector<Patch>& patches)