Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.
Find a file
Nikhil Narayana 85da59460a
chore: upstream merge to 2412 (#44)
* DolphinQt: Remove unneeded Win32 code

Dolphin already uses QStyleHints::colorScheme to detect dark mode,
so this code is now redundant.

* VideoBackendBase: Only populate backend info when uninitialized

Prevent potential issues when creating the Graphics window (and thus
calling PopulateBackendInfo) while the core state is Stopping, like we
already do while it's Starting or Running.

* linux: Use D-Bus to inhibit screensaver

* Android: Add 16 KiB page size support

So far, Dolphin hasn't been able to run on Android devices that use a
16 KiB page size. 16 KiB page sizes are a very new Android feature that
no phones have shipped with so far, so we're still compatible with the
phones that exist out there, but let's get this fixed before phones
start shipping with 16 KiB page sizes.

Because I couldn't get Android Studio's emulator to work, I haven't been
able to confirm that this change actually makes Dolphin fully compatible
with devices that use a 16 KiB page size. But I have confirmed that this
doesn't break anything on a regular 4 KiB page size device.

* Android: Use enableEdgeToEdge

Dolphin has been using edge-to-edge rendering for a little while now,
but it has required a bit of manual work. Now that edge-to-edge is
becoming something expected of apps in Android 15, there's a nicer API
we can use.

Tested on Android 8, 11 and 13, with no changes in behavior noted.

* GameINI: Fix Cheats for Conduit 2

These codes are actually Gecko codes so setting that correctly.

There were errors which pop up when running this game as the comments for AR codes need to be set with hash(#) instead of asterisk(*). I replaced those anyways.

Removed the url in the comment since it's inaccessible and not on wayback machine either.

Also corrected the GameID, the wrong one is listed.

* GameINI: Remove Obsolete Settings in Super Metroid Demo (Brawl VC)

Both UseXFB and UseRealXFB are obsolete since Hybrid XFB.

* GameINI: Remove Obsolete Setting in FaceBreaker K.O. Party

Hack is not a valid setting.

Also updated the GameID.

* GameINI: Rename INI for Naruto Collection (Demo)

The wrong filename was used so the settings weren't being applied.

(All it does is reset the Texture Cache Accuracy to the default setting.)

* GameINI: Disable AA in Sonic Heroes

The use of any anti-aliasing will cause graphical corruption, which occurs on the ground.

MaxAnisotropy is supposed to be for [Video_Enhancements], but also it doesn't cause any of the issues in game so it is being removed rather than set under the correct heading.

Added a comment on why these values are set.

* GameINI: Set Texture Cache Accuracy to "Safe" for UFC Personal Trainer: The Ultimate Fitness System

SafeTextureCacheColorSamples is supposed to be for [Video_Settings], but also the medium setting isn't enough to display the missing text.

* Boot: write Apploader version into memory

When HLE-ing the apploader, this is necessary to avoid "Error #002"
errors. Homebrew doesn't care.

* VolumeVerifier: Promote `DEBUG_ASSERT` to `static_assert`

This runtime assertion was added before `std::is_sorted` became constexpr in the codebase.

* VideoBackends:Metal: Use ios_use_simdgroup_functions with SPIRV-Cross

It defaults to trying to emulate simdgroup functions on iOS

* VideoCommon: Dirty pixel shader manager on efb scale changes

* WII_IPC: rewrite multiply as 100_tbticks literal (NFC)

* GameSettings: safe texture cache for "Winter Sports 3: The Great Tournament"

This is required to avoid glitches during Downhill Skiing.

* VideoBackends:Metal: subgroup_ops requires Apple7, not Apple6

SIMD-scoped permute operations are Apple6, but reduction operations are Apple7

* Revert "Allow shared zlib-ng"

This reverts commit 6dad8f8372.

Our bundled zlib-ng uses zlib compat mode, making it override system zlib.
System zlib-ng will not, and all its functions will be prefixed with zng_.
Therefore the two aren't actually compatible.

* Properly Notify when Achievements Login Fails

* Bluetooth: show vid:pid in error message

* VideoBackends:Vulkan: Don't try to present if swapchain acquire failed

* VideoBackends:Vulkan: Wait until we've confirmed a successful AcquireNextImage before marking semaphores used

* Migrate Hardcore Toggle Code to Achievement Manager

AchievementManager::SetHardcoreMode now handles the (non-Qt) settings disabled by hardcore mode, instead of doing this on the Qt layer. Also ensured Init/Enable Achievements paths run this code, fixing the bug wherein the player can manipulate things when achievements are disabled that persist when turned back on.

* Add Confirm Popups for Achievements Logout and Hardcore Off

* Turn off debug mode if hardcore is active on emulator start

Found this bug while testing; if I manually edit the config files while Dolphin is closed I was able to get debug and hardcore on at the same time, this resolves that.

* GameINI: Add Skylanders: Spyro's Adventure
`EFBEmulateFormatChanges = True` properly emulates the blur in the pause screen.
`ImmediateXFBEnable = False` to prevent epilepsy-inducing FMVs and main menu.

* GameINI: Add Skylanders: Giants
`EFBEmulateFormatChanges = True` properly emulates the blur in the pause screen.
`ImmediateXFBEnable = False` to prevent epilepsy-inducing FMVs and main menu.

* GameINI: Add Skylanders: Trap Team
`EFBEmulateFormatChanges = True` properly emulates the blur in the backgrounds.
`ImmediateXFBEnable = False` to prevent epilepsy-inducing FMVs.

* Partially revert "Revert "Audit uses of IsRunning and GetState""

This reverts the revert commit bc67fc97c3,
except for the changes in BaseConfigLoader.cpp, which caused the bug
that made us revert 72cf2bdb87. PR 12917
contains an improved change to BaseConfigLoader.cpp, which can be merged
(or rejected) independently.

A few changes have also been made based on review comments.

* Core: Include partition when calling GetGameTDBID for non-game partition

This problem was introduced in 8842a0f402
and is likely a copy-paste error.

Fixes the problem mentioned in the issue comment
https://bugs.dolphin-emu.org/issues/13640#note-2.

* VideoBackends:Vulkan: Increase VMA Vulkan Version to 1.2

We now use Vulkan 1.2 if available

* Skylanders: Fix Head Rush (Nitro)

* VideoBackends:Metal: Log file on failed pipeline compile

* VideoBackends:Metal: Use standardized C++ features over clang builtins

* Readme: specify  which windows 10 version is minimum

* FifoPlayer: Set up additional BATs in Wii mode

The light LIT fifolog from https://bugs.dolphin-emu.org/issues/13635 has position data at physical address 11ae3180. This works fine when using the memory viewer in physical mode, but the corresponding virtual address (91ae3180) previously didn't show anything in effective mode. It works fine now though.

This shouldn't affect playback of fifologs as everything in there uses physical addresses; this only impacts the memory viewer.

This logic was copied from CBoot::SetupBAT.

* Fifo analyzer: Fix indexed XF loads showing "bytes" instead of "words"

Indexed XF loads specify the number of 32-bit words (generally floats, but light data has some integers) to load, not the number of bytes. This was only a mistake in the fifo analyzer text; the actual implementation already loaded words.

* Simplify `std::copy` with `std::copy_n`

+ a surprise `std::memcpy` in VolumeVerifier.cpp.

* Simplify `std::fill` with `std::fill_n`

* IOS: log cIOS device checks as warnings, not errors

Some games do this to detect piracy.

* Simplify `std::fill` with `std::array::fill`

* Simplify `std::transform` with `std::ranges::transform_view`

* Simplify `std::stable_sort` with `std::ranges::stable_partition`

* VideoCommon: fix common opcode decoding errors

Many games call GXSetGPFifo() without first waiting for the GP to finish
consuming outstanding commands in the previous GP fifo. Normally,
Dolphin runs OpcodeDecoding in 1000-cycle time slices. In that time
frame, GXSetGPFifo() has probably completed and the GP read pointer now
points to entirely new memory. If the last GP fifo copy ended in an
incomplete command, the new GP fifo would most likely desync for a
while. To avoid all this, give the GP a time slice right now to copy the
remaining data from the previous GP fifo.

* Modernize `std::for_each` with ranges

* Modernize `std::count` with ranges

* Modernize `std::count_if` with ranges

* Modernize `std::equal` with ranges

* Modernize `std::copy` with ranges

* Modernize `std::transform` with ranges

In StringUtil.h, the lambdas wrapping `Common::ToLower(char)` and `Common::ToUpper(char)` were only necessary due to the function names being overloaded.

* Modernize `std::replace` with ranges

* Modernize `std::replace_if` with ranges

* Modernize `std::fill` with ranges

In DSPCore.cpp, there were two `std::fill` uses that could be simplified using `std::fill_n`. Due to their proximity with other `std::fill` algorithms being modernized with ranges, I chose to make these examples into the rare `std::ranges::fill_n`.

* Modernize `std::reverse` with ranges

* Modernize `std::reverse_copy` with ranges

* Modernize `std::sort` with ranges

* Modernize `std::is_sorted` with ranges

In OGLConfig.cpp, `std::views::reverse` is used rather than sorting using `std::ranges::greater` in order to parallel other instances of reverse iteration in the function.

* Modernize `std::binary_search` with ranges

In VolumeVerifier.cpp, constructing a `std::string_view` of the volume's GameID is unnecessary, as `std::`(`ranges::`)`binary_search` supports heterogeneous lookup. The usage in GameFile.cpp is a perfect example.

* Modernize `std::set_intersection` with ranges

* Modernize `std::max_element` with ranges

* Modernize `std::min_element` with ranges

* Update Contributing.md

fix typos

* Remove Bloom Definitions for Skylanders Trap Team

* JitArm64_RegCache: Add IsImm helper

Because checking if a register is a specific immediate is a rather
common operation.

* JitArm64_SystemRegisters: Optimize mtspr

No need to materialize the immediate if it is zero, we can just use WZR.

Before:
mov    w27, #0x0                 ; =0
str    w27, [x29, #0x1178]

After:
str    wzr, [x29, #0x1178]

* JitArm64_Integer: Use IsImm helper more

* Modernize `std::find` with ranges

* Modernize `std::find_if` with ranges

In BTEmu.cpp, `std::mem_fn` was not necessary for the predicate to compile.

* Modernize `std::adjacent_find` with ranges

* C++20: Synthesize `operator!=` From `operator==`

The inequality operator is automatically generated by the compiler if `operator==` is defined.

* CoreTiming: Simplify algorithms using ranges and three-way comparison

* GraphicsMod: Simplify `std::sort` using ranges and projections

* JitArm64_RegCache: Simplify `std::find` using ranges and projections

* DolphinQt/MappingIndicator: Use Settings::IsThemeDark instead of reimplementing it.

* ControllerEmu: Change trigger threshold check to >= instead of > and set minimum threshold in UI to 1% to prevent user error.

* DolphinQt: Auto hide the mapping window tab bar.

* DolphinQt: Restrict size of banner image in game properties info tab.

* Boot: don't error for NTSC IPL v1.2 of DOL-001 consoles

Checksum and descriptions from Redump.

* Cache normals in addition to binormals and tangents

Fixes LIT (https://bugs.dolphin-emu.org/issues/13635). The text does not include normals, but has lighting enabled. With the previous default of (0, 0, 0), lighting was always black (as dot(X, (0, 0, 0)) is always 0). It seems like the normal from the map in the background (0, 0, 1) is re-used.

LIT also has the vertex color enabled while vertex color is not specified, the same as SMS's debug cubes; the default MissingColorValue GameINI value of solid white seems to work correctly in this case.

* Create STZ.ini

* Create S7E.ini

* Android: Add vsync setting

Recently we have been getting some requests to make the existing vsync
setting available in the Android GUI:

https://bugs.dolphin-emu.org/issues/13650
https://forums.dolphin-emu.org/Thread-vsync-toggle-for-android

I don't quite understand why enabling the vsync setting is helpful when
Android already enforces vsync, but I guess having the option available
doesn't hurt. I'm putting the setting under Advanced, unlike in
DolphinQt, since there's no clear reason why the typical user would want
to use this setting.

* Audio: Add option to AudioPane to temporarily mute audio when emulation speed limit is disabled.

* IOS/Net: implement ioctlv that retrieves the network routing table that libogc now uses on network init

* DSPHLE/AXWii: fix wiimote audio in multiple games

Three bugs specific to older Wii games:
- The size difference between high-pass and biquad filter was not
  accounted for, causing wiimote related fields to be corrupted.
- Wiimote sample buffer pointers were advanced by 32 samples per
  millisecond instead of 6 samples. Usually hidden by the first bug.
- PB updates on Wii were being byte-swapped twice, but I've not actually
  found any Wii games that make use of PB updates.

This fixes wiimote audio in at least the following games:
- Excite Truck
- Ice Age 2: The Meltdown
- Kororinpa: Marble Mania
- Rapala Tournament Fishing
- Shrek the Third
- Super Monkey Ball: Banana Blitz
- Tiger Woods PGA Tour 07
- WarioWare: Smooth Moves (issue 11725)
- Wing Island

* Core: apply Dolphin OnFrame patches right after boot

* VideoCommon: fix -Wshadow-uncaptured-local warning and simplify

* GameINI: Remove trailing space for 1080° Snowboarding

* GameINI: Remove OnLoad sections

These haven't worked since 2008 (0b5fed62c1).

* JitCache: Add WipeBlockProfilingData Function

Accessible from DolphinQt and Android.

* Externals: Update rangeset

I added a new `get_stats` member function to the upstream for use in the JIT Widget Refresh.

* CachedInterpreter: Callback Disassembler

* JITs: Outline FreeRanges Function

As I have done for Cached Interpreter 2.0

* JITs: Add EraseSingleBlock Function

* JITs: Add GetMemoryStats Function

Using the updated rangeset library

* Move UICommon/Disassembler to Common/HostDisassembler

A preliminary commit for a cleaner diff and an easier review

* DolphinQt: JIT Widget Refresh

Fulfilling a certain six-year-old todo.

* JITs: Revamp LogGeneratedX86

Debug logging of recompiled code is now a feature of all three JITs.

* Simplify `std::copy` with `fmt::join`

* Simplify `std::copy` with `fmt::format_to`

Plus a few other memory allocation optimizations.

* Jit64: Make Furthest Exit Micro-Optimization More Correct

* GameINI: Shadow the Hedgehog texture cache default

Adjusts the Texture Cache settings/slider to 512 samples which equates
to the 'middle' option in the UI.

If using the 'Safe' Texture Cache Accuracy mode, the left screen will only render bloom in 2P modes.
If using the 'Fast' Texture Cache Accuracy mode, the Intro Movie will
drop frames near the end when the "Shadow the Hedgehog" game title
letters appear. This mode also can result in artifacts/bleed from bloom
effects in some situations.

* JitArm64: Add ScopedARM64Reg

* JitArm64_Integer: Use ScopedARM64Reg

* JitArm64: Use ScopedARM64Reg

* JitArm64_Branch: Use ScopedARM64Reg

* JitArm64_FloatingPoint: Use ScopedARM64Reg

* JitArm64_LoadStore: Use ScopedARM64Reg

* JitArm64_LoadStoreFloating: Use ScopedARM64Reg

* JitArm64_LoadStorePaired: Use ScopedARM64Reg

* JitArm64_Paired: Use ScopedARM64Reg

* JitArm64_SystemRegisters: Use ScopedARM64Reg

* JitArm64: Allow ppcState STP optimization for imm

* JitArm64: Use WZR for ppcState STP optimization with imm == 0

* Split `SettingsHandler` into separate reader and writer classes

* GraphicsSettings: EFBAccessEnable=false by default

Makes Graphics -> Hacks -> Skip EFB Access from CPU enabled by default. Some GPU drivers stall when EFB access occurs in games where EFB is not used. Most games that require this setting set to 'true' already have this defined in their game inis.

* Add missing algorithm header in SettingsHandlerTest.cpp

* Migrate /dev/dolphin documentation to the repository

* GameINI: Remove EFBAccessEnable=false overrides

Removes the EFBAccessEnable=false explicit game overrides for:
  GT6 (Terminator 3: The Redemption)
  GXB (SSX3) [deleted - no other configuration]
  RTH (Tony Hawk's Downhill Jam)
  SNC (SONIC COLOURS) [deleted - no other configuration]

* Host: Rename `JitCacheInvalidation`

There are two hard problems in computer science...

* DolphinQt: Signal `Host::JitCacheInvalidation` in more places

* DolphinQt: Remove a stray period from the Audio tab

* JitBlockTableModel: Update For Symbols Too

Flushing efficiency down the drain because I wrote unsafe code to achieve it... I hope I can recover this.

* MainWindow: Avoid Global System Accessor

* Translation resources sync with Transifex

* VideoCommon: Implement primitive breaking for primitive lists

* GameSettings: add patch to fix Eternal Darkness startup hang

The game calls GXSetDrawDone and then switches the GP fifo without first
waiting for the draw done interrupt to arrive. Before
e96960e2a6, Dolphin would not execute the
draw done command and potentially also skip other commands in the old GP
fifo. Since that commit, Dolphin executes the remaining commands on the
old GP fifo just before disabling reads for switching, but because
PixelEngineManager::RaiseEvent() enforces a minimum delay of 500 cycles
for the draw done interrupt, it arrives after the game has switched to
the new GP fifo which seems to trigger the deadlock.

This patch replaces the call to GXSetDrawDone by a call to GXDrawDone
which does the same but also waits for the interrupt.

* ControllerInterface/SDL: Disable SDL's Windows.Gaming.Input controller handling.

* DolphinQt: Ensure skylanders QDateTimeEdit shows a four digit year without forcing dd-mm-yyyy format.

* ControllerInterface/SDL: Fix device removal event processing.

* Translation resources sync with Transifex

* Add include guard to QtUtils.h

* Config/IsSettingSaveable: Use class template argument deduction.

* Config/IsSettingSaveable: Remove unused includes.

* InputCommon: Disable DualSense Player LED

* VideoBackendBase: Clarify function name

Rename GetDefaultBackendName to GetDefaultBackendConfigName to
distinguish it from the display name.

* GeneralWidget: Recommend default video backend in tooltip

Recommend the platform's default video backend in the Backend tooltip
instead of always recommending OpenGL.

* InputCommon: Rename AddAnalogInputs to AddFullAnalogSurfaceInputs.

* InputCommon: Move FullAnalogSurface class definition out of header file.

* IOS/USB: Reconnect HIDv4 Devices after shutdown

* DSPHLE/AXWii: fix Elebits sound

Regressed in 37ebb13ece.

* WiimoteEmu: Remove disabled and no-longer-compiling wav dumping code.

* ProcessorInterface: sync GPU just before PI_FIFO_RESET

GXAbortFrame() is problematic for Dolphin because it first writes
PI_FIFO_RESET (for which we discard our internal fifo), then disables CP
reads (for which we execute pending commands in the GP fifo in emulated
memory). I don't know whether there is a race condition on hardware, but
there is one for us. Avoid this by also doing a GPU sync here.

* Add Approved Patches - Eternal Darkness, Monster Hunter Tri

The primary focus of this PR is the Eternal Darkness patch which fixes hanging at startup, which prior to this fix makes Eternal Darkness unplayable in hardcore. The MHTri patch was added as well simply because it could be.

* Flatpak: Upgrade kde runtime to 6.8

this version bundles SDL2-2.30.6, the temporary measure of building the
vendored version from exports is no longer necessary.

* Translation resources sync with Transifex

* Add Config Changed Callback for Hardcore Mode

* docs: Clarify wia_except_list_t padding in uncompressed groups

https://bugs.dolphin-emu.org/issues/13671

* Force NetPlay Clients to Host Hardcore Status

If the host is in hardcore mode, all joining players will be set to hardcore mode; if not, all joining players will be set to softcore. This ensures all players have the same settings and remain synchroized.

* Sys: Sync wiitdb files with GameTDB

* GDBStub: Signal Breakpoint Changes To Host

* Externals: Update SDL to 2.30.9

* fix SUKP01 metafortress bypass

* GameINI: Use Safe Texture Cache for Cabela's Dangerous Hunts 2011

This fixes text on the menu and in-game.

* Translation resources sync with Transifex

* Android/GCAdapter: Don't join current thread

The read thread could call Reset, which in turn tried to join the read
thread, leading to a SIGABRT. This manifested as Dolphin consistently
crashing when disconnecting a GC adapter and having a chance of crashing
a few seconds after connecting a GC adapter.

* ScmRevGen: Bump major version to 2412

---------

Co-authored-by: robxnano <89391914+robxnano@users.noreply.github.com>
Co-authored-by: Dentomologist <dentomologist@gmail.com>
Co-authored-by: JosJuice <josjuice@gmail.com>
Co-authored-by: Patrick Ferry <8967997+PatrickFerry@users.noreply.github.com>
Co-authored-by: Tillmann Karras <tilkax@gmail.com>
Co-authored-by: mitaclaw <140017135+mitaclaw@users.noreply.github.com>
Co-authored-by: TellowKrinkle <tellowkrinkle@gmail.com>
Co-authored-by: JMC47 <JMC4789@gmail.com>
Co-authored-by: LillyJadeKatrin <lilly.kitty.1988@gmail.com>
Co-authored-by: Martino Fontana <tinozzo123@gmail.com>
Co-authored-by: OatmealDome <OatmealDome@users.noreply.github.com>
Co-authored-by: Jules Blok <jules.blok@gmail.com>
Co-authored-by: lycheefox <lycheefox@inventati.org>
Co-authored-by: Mrlinkwii <Mrlinkwii@users.noreply.github.com>
Co-authored-by: Pokechu22 <Pokechu022@gmail.com>
Co-authored-by: Bob Conan <sufssl03@gmail.com>
Co-authored-by: Sintendo <3380580+Sintendo@users.noreply.github.com>
Co-authored-by: Jordan Woyak <jordan.woyak@gmail.com>
Co-authored-by: AGuy27 <91433739+AGuy27@users.noreply.github.com>
Co-authored-by: TryTwo <taolas@gmail.com>
Co-authored-by: DacoTaco <daco_65@hotmail.com>
Co-authored-by: dreamsyntax <dreamsyntax@gmail.com>
Co-authored-by: Niel Lebeck <niel.lebeck@gmail.com>
Co-authored-by: Admiral H. Curtiss <pikachu025@gmail.com>
Co-authored-by: Mateus B. Cassiano <mbc07@live.com>
Co-authored-by: Joshua de Reeper <joshua@dereeper.co.nz>
Co-authored-by: Carles Pastor <cpbadosa@gmail.com>
Co-authored-by: vaguerant <vaguerant@users.noreply.github.com>
Co-authored-by: OatmealDome <julian@oatmealdome.me>
2025-08-09 17:28:36 -07:00
.github/workflows ci: one more tiny fix 2025-05-16 15:10:19 -07:00
.tx Update Transifex organization name 2024-07-02 14:57:09 +02:00
CMake ScmRevGen: Bump major version to 2412 2024-12-01 18:00:52 -05:00
Data Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00
docs Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00
Externals Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00
Flatpak Externals: Update SDL to 2.30.9 2024-11-16 21:34:30 -07:00
Installer Logo refresh for android, windows, and linux 2024-07-01 06:29:57 -07:00
Languages Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00
LICENSES Revert "licenses: add vc++ redist license" 2022-09-16 10:33:47 +02:00
Source Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00
Tools Merge commit '3c4d4fcd09' into upstream-merge-2409 2024-11-05 09:31:58 -08:00
.editorconfig Merge pull request #6152 from bb010g/patch-1 2020-01-08 15:52:26 +01:00
.git-blame-ignore-revs Add more line-ending commits to .git-blame-ignore-revs 2022-05-26 18:32:39 -07:00
.gitattributes gitattributes: set eol=clrf on *.sln 2023-01-23 06:12:42 -08:00
.gitignore chore: ignore AppDir 2025-02-20 16:39:48 -08:00
.gitmodules Merge commit '3c4d4fcd09' into upstream-merge-2409 2024-11-05 09:31:58 -08:00
.mailmap
AndroidSetup.md Bring Android documentation up-to-date 2022-12-20 20:29:48 -05:00
build-appimage.sh fix(build-appimage): don't fail if qt6 is already selected 2025-02-20 16:39:48 -08:00
build-linux.sh ci: specify dolphin-emu target 2023-08-19 10:43:10 -07:00
build-mac.sh fix(build): set correct codesigning target (#21) 2024-06-01 13:27:32 -07:00
BuildMacOSUniversalBinary.py BuildMacOSUniversalBinary: Remove flag for creating a Steam build 2024-08-15 12:42:16 -04:00
CMakeLists.txt Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00
CMakeSettings.json Cmake/MSVC: Fix Qt6 discover for IDEs other than Visual Studio 2023-01-31 23:19:46 +13:00
CODE_OF_CONDUCT.md Adopt a Code of Conduct for Dolphin. 2022-12-29 06:41:51 +01:00
Contributing.md Update Contributing.md 2024-10-10 14:03:49 -05:00
COPYING licensing: remove non-standard license.txt in favor of COPYING 2021-07-05 04:43:55 +02:00
Readme.md Merge commit '992b4ea930' into upstream-merge-2412 2025-08-09 16:13:43 -07:00

Slippi Mainline

This is a WIP effort to port the functionality of https://github.com/project-slippi/Ishiiruka to mainline Dolphin. Currently, we are close enough to upstream main and close to on par with project-slippi/Ishii main. Netplay functionality works everywhere except teams, playback is busted, rust code is hooked up Last updated 2023-09-01

How can I contribute?

The project board is visible here: https://github.com/r2dliu/dolphin/projects/1

Read through the list of issues, and comment on one to claim it. You can also create a new issue if one does not exist already. Create a pull request and then submit it for approval.

Other questions

Ping or message nikki (metonym) in the Slippi Discord. https://slippi.gg/discord

Dolphin - A GameCube and Wii Emulator

Homepage | Project Site | Buildbot | Forums | Wiki | GitHub Wiki | Issue Tracker | Coding Style | Transifex Page

Dolphin is an emulator for running GameCube and Wii games on Windows, Linux, macOS, and recent Android devices. It's licensed under the terms of the GNU General Public License, version 2 or later (GPLv2+).

Please read the FAQ before using Dolphin.

System Requirements

Desktop

  • OS
    • Windows (10 1703 or higher).
    • Linux.
    • macOS (10.15 Catalina or higher).
    • Unix-like systems other than Linux are not officially supported but might work.
  • Processor
    • A CPU with SSE2 support.
    • A modern CPU (3 GHz and Dual Core, not older than 2008) is highly recommended.
  • Graphics
    • A reasonably modern graphics card (Direct3D 11.1 / OpenGL 3.3).
    • A graphics card that supports Direct3D 11.1 / OpenGL 4.4 is recommended.

Android

  • OS
    • Android (5.0 Lollipop or higher).
  • Processor
    • A processor with support for 64-bit applications (either ARMv8 or x86-64).
  • Graphics
    • A graphics processor that supports OpenGL ES 3.0 or higher. Performance varies heavily with driver quality.
    • A graphics processor that supports standard desktop OpenGL features is recommended for best performance.

Dolphin can only be installed on devices that satisfy the above requirements. Attempting to install on an unsupported device will fail and display an error message.

Build Process

Dolphin requires CMake for all systems. Many libraries are bundled with Dolphin and used if they're not installed on your system. CMake will inform you if a bundled library is used or if you need to install any missing packages yourself.

Rust

This fork includes a Rust submodule that needs to be built and linked to the final executable. This means that you will need to install a Rust compiler for your current system; to do this, simply visit rustup.rs. Once installed, CMake should be able to automatically handle the rest for you.

Windows

Visual Studio 2019 16.3 or later is a hard requirement. Open the folder that contains the base CMakeLists.txt file to build Dolphin on Windows. Other compilers might able to build Dolphin on Windows but have not been tested and are not recommended to be used. Git and Windows 11 SDK must be installed when building.

Make sure to pull submodules before building:

git submodule update --init --recursive

The "Release" solution configuration includes performance optimizations for the best user experience but complicates debugging Dolphin. The "Debug" solution configuration is significantly slower, more verbose and less permissive but makes debugging Dolphin easier.

Building for Linux and macOS

Dolphin requires CMake for systems other than Windows. You need a recent version of GCC or Clang with decent c++20 support. CMake will inform you if your compiler is too old. Many libraries are bundled with Dolphin and used if they're not installed on your system. CMake will inform you if a bundled library is used or if you need to install any missing packages yourself. You may refer to the wiki for more information.

Make sure to pull submodules before building:

git submodule update --init --recursive

macOS Build Steps:

A binary supporting a single architecture can be built using the following steps:

  1. mkdir build
  2. cd build
  3. cmake ..
  4. make -j $(sysctl -n hw.logicalcpu)

An application bundle will be created in ./Binaries.

A script is also provided to build universal binaries supporting both x64 and ARM in the same application bundle using the following steps:

  1. mkdir build
  2. cd build
  3. python ../BuildMacOSUniversalBinary.py
  4. Universal binaries will be available in the universal folder

Doing this is more complex as it requires installation of library dependencies for both x64 and ARM (or universal library equivalents) and may require specifying additional arguments to point to relevant library locations. Execute BuildMacOSUniversalBinary.py --help for more details.

Linux Global Build Steps:

To install to your system.

  1. mkdir build
  2. cd build
  3. cmake ..
  4. make -j $(nproc)
  5. sudo make install

Linux Local Build Steps:

Useful for development as root access is not required.

  1. mkdir Build
  2. cd Build
  3. cmake .. -DLINUX_LOCAL_DEV=true
  4. make
  5. ln -s ../../Overwrite/{Sys,User} Binaries/

Linux Portable Build Steps:

Can be stored on external storage and used on different Linux systems. Or useful for having multiple distinct Dolphin setups for testing/development/TAS.

  1. mkdir Build
  2. cd Build
  3. cmake .. -DLINUX_LOCAL_DEV=true
  4. make
  5. cp -r ../Overwrite/{Sys,User} Binaries/
  6. touch Binaries/portable.txt

Building for Android

These instructions assume familiarity with Android development. If you do not have an Android dev environment set up, see AndroidSetup.md.

Make sure to pull submodules before building:

git submodule update --init --recursive

If using Android Studio, import the Gradle project located in ./Source/Android.

Android apps are compiled using a build system called Gradle. Dolphin's native component, however, is compiled using CMake. The Gradle script will attempt to run a CMake build automatically while building the Java code.

Uninstalling

On Windows, simply remove the extracted directory, unless it was installed with the NSIS installer, in which case you can uninstall Dolphin like any other Windows application.

Linux users can run cat install_manifest.txt | xargs -d '\n' rm as root from the build directory to uninstall Dolphin from their system.

macOS users can simply delete Dolphin.app to uninstall it.

Additionally, you'll want to remove the global user directory if you don't plan on reinstalling Dolphin.

Command Line Usage

Usage: Dolphin.exe [options]... [FILE]...

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -u USER, --user=USER  User folder path
  -m MOVIE, --movie=MOVIE
                        Play a movie file
  -e <file>, --exec=<file>
                        Load the specified file
  -n <16-character ASCII title ID>, --nand_title=<16-character ASCII title ID>
                        Launch a NAND title
  -C <System>.<Section>.<Key>=<Value>, --config=<System>.<Section>.<Key>=<Value>
                        Set a configuration option
  -s <file>, --save_state=<file>
                        Load the initial save state
  -i <file>, --slippi_input=<file>
                        Load replay
  -d, --debugger        Show the debugger pane and additional View menu options
  -l, --logger          Open the logger
  -b, --batch           Run Dolphin without the user interface (Requires
                        --exec or --nand-title)
  -c, --confirm         Set Confirm on Stop
  -v VIDEO_BACKEND, --video_backend=VIDEO_BACKEND
                        Specify a video backend
  -a AUDIO_EMULATION, --audio_emulation=AUDIO_EMULATION
                        Choose audio emulation from [HLE|LLE]

Available DSP emulation engines are HLE (High Level Emulation) and LLE (Low Level Emulation). HLE is faster but less accurate whereas LLE is slower but close to perfect. Note that LLE has two submodes (Interpreter and Recompiler) but they cannot be selected from the command line.

Available video backends are "D3D" and "D3D12" (they are only available on Windows), "OGL", and "Vulkan". There's also "Null", which will not render anything, and "Software Renderer", which uses the CPU for rendering and is intended for debugging purposes only.

DolphinTool Usage

usage: dolphin-tool COMMAND -h

commands supported: [convert, verify, header, extract]
Usage: convert [options]... [FILE]...

Options:
  -h, --help            show this help message and exit
  -u USER, --user=USER  User folder path, required for temporary processing
                        files.Will be automatically created if this option is
                        not set.
  -i FILE, --input=FILE
                        Path to disc image FILE.
  -o FILE, --output=FILE
                        Path to the destination FILE.
  -f FORMAT, --format=FORMAT
                        Container format to use. Default is RVZ. [iso|gcz|wia|rvz]
  -s, --scrub           Scrub junk data as part of conversion.
  -b BLOCK_SIZE, --block_size=BLOCK_SIZE
                        Block size for GCZ/WIA/RVZ formats, as an integer.
                        Suggested value for RVZ: 131072 (128 KiB)
  -c COMPRESSION, --compression=COMPRESSION
                        Compression method to use when converting to WIA/RVZ.
                        Suggested value for RVZ: zstd [none|zstd|bzip|lzma|lzma2]
  -l COMPRESSION_LEVEL, --compression_level=COMPRESSION_LEVEL
                        Level of compression for the selected method. Ignored
                        if 'none'. Suggested value for zstd: 5
Usage: verify [options]...

Options:
  -h, --help            show this help message and exit
  -u USER, --user=USER  User folder path, required for temporary processing
                        files.Will be automatically created if this option is
                        not set.
  -i FILE, --input=FILE
                        Path to disc image FILE.
  -a ALGORITHM, --algorithm=ALGORITHM
                        Optional. Compute and print the digest using the
                        selected algorithm, then exit. [crc32|md5|sha1|rchash]
Usage: header [options]...

Options:
  -h, --help            show this help message and exit
  -i FILE, --input=FILE
                        Path to disc image FILE.
  -b, --block_size      Optional. Print the block size of GCZ/WIA/RVZ formats,
then exit.
  -c, --compression     Optional. Print the compression method of GCZ/WIA/RVZ
                        formats, then exit.
  -l, --compression_level
                        Optional. Print the level of compression for WIA/RVZ
                        formats, then exit.
Usage: extract [options]...

Options:
  -h, --help            show this help message and exit
  -i FILE, --input=FILE
                        Path to disc image FILE.
  -o FOLDER, --output=FOLDER
                        Path to the destination FOLDER.
  -p PARTITION, --partition=PARTITION
                        Which specific partition you want to extract.
  -s SINGLE, --single=SINGLE
                        Which specific file/directory you want to extract.
  -l, --list            List all files in volume/partition. Will print the
                        directory/file specified with --single if defined.
  -q, --quiet           Mute all messages except for errors.
  -g, --gameonly        Only extracts the DATA partition.