Commit Graph

32997 Commits

Author SHA1 Message Date
JosJuice
9883235c0c Common: Treat DirectIOFile as unable to create SAF files
In 405baed805, we made the assumption that whether OpenAndroidContent
is able to create a new file depends on the open mode, the document
provider, and the positions of the celestial bodies. However, I'm
fairly sure that it can't create files at all as currently implemented.

First, ContentResolver.openFileDescriptor is documented as throwing
FileNotFoundException if the file doesn't exist. Now, the SAF
documentation is notoriously unreliable on matters like these, and
document providers can do whatever they want anyway, so we can't
actually trust this to mean that FileNotFoundException will always
be thrown if the file doesn't exist. But second, the Dolphin function
ContentHandler.unmangle is also unable to handle files that don't
already exist (unless the passed-in URI isn't mangled to begin with,
but to the best of my knowledge, there's no way to get a non-mangled URI
for a file that doesn't exist (unless you make assumptions about how the
document provider's URI scheme works, which we don't do in Dolphin)).
Summed up, it looks a lot like OpenAndroidContent can't create files,
or at the very least can't do so reliably.

Therefore I'm making DirectIOFile throw an assertion and return false
in situations where it's being asked to create a file under SAF. For
reference, there's no code in Dolphin that actually tries to create a
file under SAF. In all instances where we use SAF to write to files, the
file is created by the system file picker before it returns the URI of
the file to us.

What does this change gain us? First, if someone in the future tries to
use DirectIOFile to create a file under SAF, they'll be immediately
informed that this isn't supported rather than discovering it doesn't
work and chalking it up to SAF being bad for unpredictable reasons.
Second, we get rid of a call to File::Exists, which is a notable
performance improvement for game list scanning due to SAF and Dolphin's
"unmangling" being bad for reasons that unfortunately are entirely
predictable to those of us who have stared into the SAF void.

I've tested that game list scanning and game conversion still works.
2025-11-18 23:17:03 +01:00
Jordan Woyak
5a6fce31b2 DolphinQt/QtUtils: Simplify RunOnObject and eliminate Common::Event race. 2025-11-18 14:19:21 -06:00
Jordan Woyak
d25742fe8b Common: Introduce a OneShotEvent class. Unlike Common::Event, OneShotEvent is safe in situations when being immediately destructed. 2025-11-18 14:19:21 -06:00
Jordan Woyak
605cc579a4 Common/Functional: Add InvokerOf template which can convert function pointers to functor types. 2025-11-18 14:19:21 -06:00
Jordan Woyak
1b63776f2d Common/ScopeGuard: Fix move constructor. 2025-11-18 14:19:21 -06:00
JosJuice
9cc4d1b835
Merge pull request #13748 from Dentomologist/autoupdatechecker_delete_old_updater_log_file
AutoUpdateChecker: Delete old Updater.log file
2025-11-18 18:12:47 +01:00
Jordan Woyak
1514c0f256 Bluetooth/RealtekFirmwareLoader: Add Mercusys MA530 to list. 2025-11-17 19:31:59 -06:00
JosJuice
49e9cd42d4 JitArm64: Call GetImm before BindToRegister in subfcx
When BindToRegister is called, the register cache marks the relevant
guest register as no longer containing an immediate. However, subfcx was
calling GetImm after BindToRegister. This led to a lot of panic alerts
after 2995aa5be4 added an assert to GetImm to check that the passed-in
register is an immediate.

Both before and after 2995aa5be4, the actual value of the immediate
wasn't overwritten by BindForRegister, only the fact that the register
is an immediate. Because of this, the emitted code happened to work
correctly.
2025-11-17 20:00:36 +01:00
Jordan Woyak
6380ad6abb Movie: Replace a blocking RunOnCPUThread call with a CPUThreadGuard. 2025-11-17 11:57:43 -06:00
LillyJadeKatrin
98678e9a8b AchievementManager - Add Android to user agent
If the build is an Android build, identify it as such in the AchievementManager user agent so that android builds can be tracked separately for debug purposes.
2025-11-16 22:05:53 -05:00
JosJuice
b6e062f2e3
Merge pull request #13689 from JosJuice/lock-core-any-thread
Core: Let any thread call previously host-thread-only functions
2025-11-16 18:35:17 +01:00
JosJuice
3ff4985120
Merge pull request #12134 from JosJuice/jit-constprop
Jit: Extract immediate handling to separate ConstantPropagation class
2025-11-16 18:34:49 +01:00
JosJuice
91c3a58889
Merge pull request #13922 from TryTwo/imgui_add_default_font
OSD/Imgui: Add a better default font
2025-11-16 13:58:18 +01:00
JosJuice
b9d9f36ce5 JitArm64: Replace dirty flag and partially replace RegType enum
Like Jit64, JitArm64 now keeps track of the location of a guest register
using three booleans: Whether it is in ppcState, whether it is in a host
register, and whether it is a known immediate. The RegType enum remains
only for the purpose of keeping track of what format FPRs are stored in
in host registers.
2025-11-16 09:52:09 +01:00
JosJuice
2995aa5be4 JitArm64: Don't store immediate values in register cache
Like the previous commit did for Jit64, JitArm64 can now handle the
combination of a value simultaneously being in a host register and being
a known immediate.

Unlike with Jit64, I've put the codegen-affecting changes in this commit
and the move away from the RegType enum in a follow-up commit. This is
in part because the design of JitArm64 made it easy to implement the
codegen-affecting changes without combining it with a big bang
refactorization, and in part because we need to keep RegType around for
keeping track of different float formats in Arm64FPRCache, complicating
the refactorization a bit.
2025-11-16 09:52:09 +01:00
JosJuice
817bb9d94c Jit64: Don't store immediate values in register cache
They're now stored in ConstantPropagation instead.

I've also removed the LocationType enum. The location of each guest
register is now tracked using three booleans: Whether it is in ppcState,
whether it is in a host register, and whether it is a known immediate.
The first two of these booleans are stored in the register cache, and
the last one is stored in ConstantPropagation. This new model allows us
to handle the combination of a value simultaneously being in a host
register and being a known immediate. It also keeps track of which
registers are dirty, which was previously kept track of in X64CachedReg.

The old model maps to the new model as follows:

                                default    host_reg    immediate

Default                         true       false       false
Discarded                       false      false       false
Bound                           (!dirty)   true        false
Immediate                       false      false       true
SpeculativeImmediate            true       false       true
[previously unrepresentable]    (!dirty)   true        true
2025-11-16 09:52:09 +01:00
JosJuice
4114a0b506 Jit: Update constant propagation during instruction
This commit makes the JIT set/clear the individual registers of
ConstantPropagation immediately instead of at the end of the
instruction. This is needed to prevent Jit64::ComputeRC, which reads
from a register written to earlier during the same instruction, from
reading back stale register values from ConstantPropagation in the next
commit.
2025-11-16 09:52:07 +01:00
JosJuice
502b48a690 JitArm64: Make FlushRegisters unlock condition more robust
To find out whether a host register needs to be unlocked, FlushRegisters
checks if the guest register is known to be a zero immediate. This works
right now, but it will stop working correctly once we gain the ability
to have a guest register be a known immediate and be in a host register
at the same time, because a register that's known to be a zero immediate
may have had a host register allocated prior to the call to
FlushRegisters. Instead, we should check whether the register is
RegType::Register after we're done calling BindForRead.
2025-11-16 09:50:31 +01:00
JosJuice
7065b93ba5 JitArm64: Pass index to more Arm64GPRCache functions
This refactorization is needed for upcoming commits.
2025-11-16 09:50:31 +01:00
JosJuice
502317a485 Jit: Move rlwimix to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
bac911aac4 Jit: Move srawx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
c136fd9807 Jit: Move srwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
bb645e6cbb Jit: Move slwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
45760841b2 Jit: Move divwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
fc6c278007 Jit: Move divwux to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
c7d8a0b276 Jit: Move subfic to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
204a8fbd53 Jit: Move subfx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
2134991be8 Jit: Move multiplication by 0 optimization to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
7456ba3d3d Jit: Move mullwx, mulhwx, mulhwux to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
b469981c72 Jit: Move mulli to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
1eea610375 Jit: Move addicx to ConstantPropagation
Note: Jit64 didn't support immediate handling for addic before.
2025-11-16 09:50:31 +01:00
JosJuice
a3797778ff Jit: Move srawix to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
1a22bda0a7 Jit: Move rlwinmx and rlwnmx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
4c8995fae5 Jit: Move negx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
92a5a46b2c Jit: Move cntlzwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
b506cb2ad8 Jit: Move extsXx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
f04417eb5a Jit: Move addx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
77b46c30ad Jit: Move boolX to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
3a6eea74dd Jit: Move addix to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
20332f441b Jit: Move reg_imm to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice
f9601dc38c Jit: Extract immediate handling to separate ConstantPropagation class
Restructuring things in this way brings two immediate benefits:

* Code is deduplicated between Jit64 and JitArm64.
* Materializing an immediate value in a register no longer results in us
  forgetting what the immediate value was.

As a more long-term benefit, this lets us also run constant propagation
as part of PPCAnalyst, which could let us do cool stuff in the future
like statically determining whether a conditional branch will be taken.
But I have nothing concrete planned for that right now.
2025-11-16 09:50:31 +01:00
JosJuice
e8060bd169 JitArm64: Add function for setting constant overflow 2025-11-16 09:50:30 +01:00
JosJuice
2dead5009b Jit64: Extract handling of immediate Rc 2025-11-16 09:50:30 +01:00
Jordan Woyak
9dea0859eb Common/BitField: Silence two warnings:
warning: definition of implicit copy constructor for 'BitField<2, 2, ColorChannel>' is deprecated because it has a user-declared copy assignment operator [-Wdeprecated-copy]
Redundant access specifier has the same accessibility as the previous access specifier.
2025-11-15 20:32:14 -06:00
Jordan Woyak
e630b0692e VideoCommon/FramebufferManager: Silence warning:
warning: virtual method '~FramebufferManager' is inside a 'final' class and can never be overridden [-Wunnecessary-virtual-specifier]
2025-11-15 20:32:10 -06:00
Jordan Woyak
a3b1445e04 HW/SI: Adjust logging verbosity in RunSIBuffer and minor cleanups. 2025-11-15 16:09:29 -06:00
Jordan Woyak
cd45dcea94 HW/SI: Fix CMD_STATUS response lengths. They are supposed to be 3, not 4. 2025-11-15 16:09:29 -06:00
JosJuice
999e13b3b3
Merge pull request #14109 from OatmealDome/analytics-deadlock
DolphinAnalytics: Only call ReloadConfig in config changed callback when analytics enabled value changes
2025-11-15 14:44:54 +01:00
JosJuice
f823a06814
Merge pull request #14105 from cscd98/achievement-bugfix
Fix cheats always enabled without USE_RETRO_ACHIEVEMENTS
2025-11-15 14:44:16 +01:00
cristian64
71e15c2875 DolphinQt: Add Fusion-based styles.
Fusion is one of the built-in styles that Qt ships with, and that is
generally supported in all platforms and handles custom color palettes
properly.

The color palettes have been borrowed from the Dolphin Memory Engine
buddy application.

The new styles are:

- **Fusion Light**
- **Fusion Dark Gray**
- **Fusion Dark**

A demo of each style on Windows:

| System | Light | Dark | Fusion Light | Fusion Dark Gray | Fusion Dark |
| ------ | ----- | ---- | ------------ | ---------------- | ----------- |
| <img width="1920" height="1080" alt="Dolphin Emulator  System style" src="https://github.com/user-attachments/assets/7f55a19d-d9a1-43d1-a435-1e1d5b29abe2" /> | <img width="1920" height="1080" alt="Dolphin Emulator  Light style" src="https://github.com/user-attachments/assets/4c70f2f9-16b8-4777-b72b-55b2dffcd1e4" /> | <img width="1920" height="1080" alt="Dolphin Emulator  Dark style" src="https://github.com/user-attachments/assets/5e669477-d2a5-4d19-b2c5-a2ed9bb1e6fe" /> | <img width="1920" height="1080" alt="Dolphin Emulator  Light Fusion style" src="https://github.com/user-attachments/assets/b1f95c47-0691-4809-bd74-99e913c17684" /> | <img width="1920" height="1080" alt="Dolphin Emulator  Dark Gray Fusion style" src="https://github.com/user-attachments/assets/c9d30aa3-f941-4fc5-806f-d3fbd2cae0cc" /> | <img width="1920" height="1080" alt="Dolphin Emulator  Dark Fusion style" src="https://github.com/user-attachments/assets/123d2125-e126-4e8c-aa42-793ded8ffacc" /> |

> [!NOTE]
> Notice that the **Light** and **Dark** styles remain available only on
> Windows due to limitations on how styles in the various platforms
> handle (or mishandle) custom color palettes.

> [!IMPORTANT]
> Due to [`KDE-511547`](https://bugs.kde.org/show_bug.cgi?id=511547),
> after having used Breeze (default style in Plasma systems), top tool
> bars in tools areas will lose their correct background color; a
> restart will be required in order to get the updated color in the main
> window.
>
> UPDATE: The issue has been fixed upstream and should be available in
> KDE Plama 6.5.3 and newer.
2025-11-14 19:21:58 +00:00
cristian64
ff9b8c4b9c DolphinQt: Define tool tip padding as factor of font size. 2025-11-14 19:12:02 +00:00
Jordan Woyak
6d5e8b9ed8 Externals: Update mGBA to latest master.
Co-authored-by: Joshua Vandaële <joshua@vandaele.software>
2025-11-13 17:03:31 -06:00
Jordan Woyak
c08fda96ca
Merge pull request #14100 from AndrewGDX/master
Improved stereoscopic 3D settings
2025-11-12 16:43:21 -06:00
AndrewGDX
113c86f1b4 Improved stereoscopic 3D settings 2025-11-12 12:29:03 +03:00
Craig Carnell
f1fb550bf1 Fix cheats always enabled without USE_RETRO_ACHIEVEMENTS 2025-11-12 08:33:49 +00:00
OatmealDome
df5f351add
DolphinAnalytics: Only call ReloadConfig in config changed callback when analytics enabled value changes
Co-authored-by: Simonx22 <simon@oatmealdome.me>
2025-11-12 00:09:41 -05:00
Jordan Woyak
bf61c890ca VideoCommon/PerformanceMetrics: Display current offset between the latest frame presentation time and the intended presentation time in the "Show Frame Times" box. 2025-11-11 20:01:52 -06:00
Jordan Woyak
c2a1dce246 VideoCommon: Add "Smooth Early Presentation" setting to improve frame pacing with ImmediateXFB and/or RushFramePresentation. 2025-11-11 20:01:52 -06:00
Jordan Woyak
cc331feb02 VideoCommon: Make Presenter aware of the next swap time to eliminate unsafe usage of GetTicks() with ImmediateXFB + DualCore. 2025-11-11 20:01:52 -06:00
Jordan Woyak
d4f68cb164 HW/VideoInterface: Selectively throttle on "VBlank" based on "Immediate XFB" being enabled. 2025-11-11 20:01:52 -06:00
Jordan Woyak
16260040e0 CoreTiming: Add "Rush Frame Presentation" setting to throttle only once after each presentation for lower input latency. 2025-11-11 20:01:52 -06:00
JMC47
8495e01668
Merge pull request #14096 from jordan-woyak/state-changed-hookable-event
Core: Make AddOnStateChangedCallback use HookableEvent.
2025-11-11 20:58:45 -05:00
JMC47
f63796c480
Merge pull request #14071 from iwubcode/avoid_config_framebuffer_manager
VideoCommon: pass the EFB buffer scale into the FramebufferManager
2025-11-11 20:58:35 -05:00
JMC47
b8236d4662
Merge pull request #14070 from VampireFlower/master
Debugger: Ignore bctr when stepping out
2025-11-11 20:57:45 -05:00
JMC47
c44ea1389a
Merge pull request #13236 from JosJuice/jit-set-msr-on-fallback
Call JitInterface::UpdateMembase from PowerPC::MSRUpdated
2025-11-11 20:55:24 -05:00
Jordan Woyak
f51eaf3282
Merge pull request #14052 from jordan-woyak/DirectIOFile
Common and DiscIO: Introduce a thread safe DirectIOFile and make BlobReader implementations use it.
2025-11-10 17:29:43 -06:00
JosJuice
068947e2b6 Core: Remove IsHostThread
The core no longer cares which thread is the host thread.

Cleaning up Android's HostThreadLock is left for another PR, in part
because the HostThreadLock in NativeConfig.cpp still serves a purpose,
and in part to make any issues easier to bisect.
2025-11-10 21:14:56 +01:00
JosJuice
1bba42de45 RetroAchievements: Remove MemoryPeeker/MemoryPoker's copying approach
This makes the code simpler, and saves us from the slow operation of
copying the all of RAM on every frame when RAIntegration is enabled.
2025-11-10 21:14:20 +01:00
JosJuice
458bb05af9 Core: Let any thread call previously host-thread-only functions
By letting threads other than the host thread use things like
CPUThreadGuard, we can do a significant cleanup in AchievementsManager
in a later commit of this pull request.

Note: Some functions still can't be called from the CPU thread (or
threads the CPU thread might block on, like the GPU thread), but can
be called from any other thread.
2025-11-10 21:14:17 +01:00
JosJuice
cd4902f0ed
Merge pull request #13875 from JosJuice/jitarm64-orr-base-without-mirror
JitArm64: Add missing ORR pattern in MOVI2RImpl
2025-11-10 20:16:21 +01:00
Jordan Woyak
a97627e736 Core: Make AddOnStateChangedCallback use HookableEvent. 2025-11-09 16:43:19 -06:00
Admiral H. Curtiss
31ca3bca47
Merge pull request #13956 from jordan-woyak/SA_RESTART
Main: Add SA_RESTART to sigaction sa_flags.
2025-11-09 15:30:27 +01:00
Admiral H. Curtiss
02b4b1ece3
Merge pull request #14010 from jordan-woyak/wmreal-iolinux-reopen-on-unplug
WiimoteReal/IOLinux: Reopen Bluetooth device if it was unplugged between scans.
2025-11-09 15:03:12 +01:00
Admiral H. Curtiss
c97d2af814
Merge pull request #14022 from TryTwo/fix_balloontip_width
Settings BalloonTip: Have wordwrap use max width.
2025-11-09 15:00:19 +01:00
Admiral H. Curtiss
ab2ceb10ae
Merge pull request #14073 from jordan-woyak/convert-dialog-min-size
DolphinQt: Make disc ConvertDialog have a better minimum size and use QFormLayout.
2025-11-09 14:57:46 +01:00
Admiral H. Curtiss
6435ee1d20
Merge pull request #14026 from jordan-woyak/move-only-function-fix
Common/Functional: Fix MoveOnlyFunction from inadvertently creating references from lvalues.
2025-11-09 14:49:20 +01:00
Admiral H. Curtiss
29e2b0ff01
Merge pull request #14068 from iTrooz/open_folder
feat(profiles): add "open profiles folder" button + add dropdown button for profile actions
2025-11-09 14:29:18 +01:00
Admiral H. Curtiss
e197163e9e
Merge pull request #14094 from OatmealDome/mac-nav-list
SettingsWindow: Set navigation list stylesheet in constructor
2025-11-09 14:10:39 +01:00
Jordan Woyak
9e2fc7f4dd Common/IOFile: Remove the Duplicate function. The duplicate handles shared a read/write position making them effectively not thread-safe. 2025-11-09 03:08:14 -06:00
Jordan Woyak
239330017c DiscIO: Make all BlobReader implementations use DirectIOFile to make CopyReader functionality thread safe. 2025-11-09 03:08:14 -06:00
Jordan Woyak
b98acb9a37 Common/BitUtils: Add overloads of AsU8Span/AsWritableU8Span that handle conversions from contiguous ranges. 2025-11-09 03:08:14 -06:00
Jordan Woyak
405baed805 Common: Add a DirectIOFile class that allows for copies which are entirely thread safe. 2025-11-09 03:08:14 -06:00
OatmealDome
448329e821
SettingsWindow: Set navigation list stylesheet in constructor 2025-11-09 01:55:52 -05:00
Simonx22
bd93c09e38 CPUThreadConfigCallback: Use maximum value of size_t instead of -1 as default value ConfigChangedCallbackID
Co-Authored-By: OatmealDome <OatmealDome@users.noreply.github.com>
2025-11-08 23:23:33 -05:00
OatmealDome
02ad041866
Merge pull request #14086 from Simonx22/android/use-native-analytics
Android: Use the shared HTTP analytics backend
2025-11-08 14:03:06 -05:00
OatmealDome
a459dc0d25
Merge pull request #14082 from Simonx22/analytics/reload-on-setting-change
DolphinAnalytics: Reload backend when config changes
2025-11-08 14:00:03 -05:00
Simonx22
82f658a28f Android: Use the shared HTTP analytics backend
We can now route Android analytics through Common::HttpAnalyticsBackend, drop the Volley sender, and keep the JNI layer limited to only transfer metadata since https://bugs.dolphin-emu.org/issues/11772 has been fixed.
2025-11-08 12:14:40 -05:00
JosJuice
958db7c78c
Merge pull request #14020 from jordan-woyak/string-util-cleanups
StringUtil: Cleanups and add some character encoding conversion unit tests.
2025-11-08 17:36:54 +01:00
Simonx22
f67691d564 Config: Use maximum value of size_t instead of -1 as default value in ConfigChangedCallbackID
Co-authored-by: OatmealDome <julian@oatmealdome.me>
2025-11-08 11:35:31 -05:00
Simonx22
f9b167d8c6 DolphinAnalytics: Reload backend when config changes
Co-Authored-By: OatmealDome <julian@oatmealdome.me>
2025-11-08 11:35:30 -05:00
JosJuice
ba14222a2b
Merge pull request #13939 from Dentomologist/logging_avoid_overwriting_debug_verbosity_in_release_builds
Logging: Don't overwrite LDEBUG level in Release builds
2025-11-08 14:47:27 +01:00
Jordan Woyak
5af9bd5e46
Merge pull request #14074 from jordan-woyak/HookableEvent-no-strings
Common: Remove the string parameters from the HookableEvent interface.
2025-11-07 16:32:06 -06:00
Jordan Woyak
51cd0a676a
Merge pull request #14079 from Dentomologist/use_asyncworkthread_pushblocking_instead_of_sync_event
CubebStream: Use WorkQueueThread::PushBlocking instead of sync_event
2025-11-07 16:31:46 -06:00
Dentomologist
3b97a7bded CubebStream: Use WorkQueueThread::PushBlocking instead of sync_event
Push and wait on WorkQueueThread items using PushBlocking. Previously we
created a Common::Event sync_event on the caller's stack, called Wait on
it, then had the WorkQueueThread call Set on the sync_event once the
thread was done.

In addition to being simpler the new way avoids a use-after-free that
could happen in convoluted and unlikely yet possible thread scheduling
sequences.

One such case can be triggered as follows:

* Set your audio backend to Cubeb
* In CubebStream::SetVolume set a breakpoint at the call to Wait and at
  the call to cubeb_stream_set_volume.
* Start a game.
* Continue until the Cubeb Worker thread hits the
  cubeb_stream_set_volume breakpoint and Emuthread hits the Wait
  breakpoint, freezing each thread when it hits its breakpoint.
* Unfreeze Cubeb Worker.
* In Event::Set set a breakpoint at the end of the scope containing the
  lock_guard such that the guard has been constructed but not destructed
  when the breakpoint is hit.
* Continue until that breakpoint is hit by Cubeb Worker. If other
  threads hit it first keep going.
* Freeze Cubeb Worker.
* For convenience remove the breakpoint in Event::Set so other threads
  don't trigger it.
* In CubebStream::SetRunning set a breakpoint at the call to Wait.
* Unfreeze Emuthread and continue until the breakpoint is hit.
* In Cubeb Worker go to Event::Set and examine the values of m_mutex's
  member variables. In Visual Studio Debug these are locking_thread_id
  == 0xcccccc01 and ownership_levels == 0xcccccccc. This is the result
  of Visual Studio overwriting the memory used on the stack by
  sync_event in CubebStream::SetVolume with cc bytes to represent
  uninitialized memory on the stack (since that function already
  returned), and then allocating enough memory on the stack when calling
  AudioCommon::SetSoundStreamRunning and then CubebStream::SetRunning
  that it overwrote one byte of the memory formerly occupied by
  locking_thread_id.
* If you unfreeze Cubeb Worker at this point it will trigger the lock
  guard's destructor which will then try to unlock m_mutex. Since
  m_mutex is no longer in scope this is a use-after-free, and in VS
  debug triggers a debug assert due to locking_thread_id not matching
  the current thread id.
2025-11-07 13:19:18 -08:00
JosJuice
5ed4823ebc
Merge pull request #13858 from LillyJadeKatrin/retroachievements-message-adjustments
Retroachievements message adjustments
2025-11-07 16:50:48 +01:00
Jordan Woyak
da6c65bf3b Common: Remove the string parameters from the HookableEvent interface. 2025-11-06 22:34:40 -06:00
Jordan Woyak
5650be6842
Merge pull request #14069 from jordan-woyak/ciface-hookable-event
InputCommon: Make ControllerInterface RegisterDevicesChangedCallback use Common::HookableEvent.
2025-11-06 20:06:53 -06:00
LillyJadeKatrin
dd941bed70 Improve Achievements Window message
Special message on the Achievements window if the token is invalid/expired.
2025-11-06 20:44:08 -05:00
OatmealDome
852b7d85b2
Merge pull request #14062 from Simonx22/macos-design-fixes
macOS: UI fixes for dark mode
2025-11-06 20:20:05 -05:00
LillyJadeKatrin
1ad0a771d9 Delete Invalid RetroAchievements Tokens 2025-11-06 19:42:14 -05:00