DuckStation

Émulateur v0.1-8773

DuckStation est un émulateur PlayStation 1 (PS1) open-source, conçu pour privilégier la jouabilité et les performances sur des machines variées, y compris les appareils à faible puissance. Développé avec une approche axée sur la précision technique tout en évitant les optimisations "hackées", il intègre un frontend complet basé sur Qt et un mode plein écran inspiré de Dear ImGui, offrant une interface moderne et configurable.

Sur macOS, notamment les versions récentes et les modèles Apple Silicon, DuckStation propose un support expérimental via des bibliothèques comme SDL et Qt, mais reste moins optimisé que sur Windows ou Linux. Les fonctionnalités clés incluent un récompilateur CPU/JIT multiplateforme, un rendu matériel (Metal, Vulkan, etc.), des filtres d’upscaling, un système de remplacements de textures, et un support étendu des formats de jeux (CD, ISO, PBP). La prise en charge des save states, du netplay (via un fork dédié) et des contrôles avancés (lightguns, NeGcon) complète son offre, bien que certains bugs ou ralentissements puissent persister. La compilation manuelle via CMake est nécessaire pour macOS.

Dernière mise à jour :

Plateformes

Architecture

Mac OS X - macOS Mac OS X - macOS Intel x86 Intel x86 Apple Silicon Apple Silicon 64 bits 64 bits Metal Metal SDL Library SDL Library

Téléchargement et liens

Historique des versions

v0.1-11826
  • Améliorations spécifiques à macOS (Apple Silicon et optimisations système) :

    • Correction du comportement des gestionnaires de page (PageFaultHandler) sur macOS ARM64 (M1/M2/M3) :
      • Activation de SA_NODEFER pour une meilleure gestion des interruptions.
      • Détermination correcte du flag write via le registre ESR (Exception Status Register).
      • Suppression du mutex dans le gestionnaire d’exceptions pour réduire la latence.
    • Stabilité accrue : Réservation explicite de la mémoire pour le cache de textures lors de la sauvegarde de l’état (réduction des plantages liés à la mémoire).
  • Corrections critiques (performance et fiabilité) :

    • GPU/TextureCache :
      • Correction d’un lecture croisée thread (CPU thread lisant sur le GPU thread), source potentielle de crash ou de corruption graphique.
      • Sérialisation fixe des champs last_vram_write et num_splits pour les sauvegardes d’état.
      • Limitation du nombre d’uploads de textures sauvegardées par état (optimisation mémoire).
    • Système :
      • Correction du mode de capture initiale au démarrage (évitait les comportements inattendus).
      • Amélioration du workflow de rechargement des paramètres (plus fluide, sans perte de données).
    • CD-ROM :
      • Réduction du délai de pause pendant les pauses (meilleure réactivité pour les jeux utilisant des CD).
  • Interface utilisateur et accessibilité :

    • Ajout d’un clavier virtuel à l’écran dans le mode plein écran (FullscreenUI), utile pour les jeux sans périphérique de saisie.
    • Correction des icônes manquantes dans les popups d’import de cheats (Qt).
    • Amélioration de la sélecteur de sauvegarde (ImGuiOverlays) :
      • Animation d’ouverture/fermeture.
      • Fermeture automatique lors d’un changement de périphérique.
      • Nettoyage de la liste à la fermeture.
  • Corrections mineures mais impactantes :

    • Fix des traductions machine dans l’interface Qt (
Changelog complet
## Commits - 6336c532a Cheats: Fix importing semi-broken files - c475fd699 Qt: Fix some machine translation errors - e8473a1e0 Qt: Fix incorrect highlight in memory viewer - 5e1aee1e2 Qt: Add missing icons to cheat import popup - 856905864 FullscreenUI: Add on-screen keyboard - ec212bfd1 FullscreenUI: Fix initial input not activating on some popup dialogs - 3c4f2bf25 FullscreenUI: Add missing PS icon for D-Pad - 527b402c6 ImGuiManager: Remove Host::BeginTextInput() - 943db2376 Achivements: Add rich presence monitor debug setting - e7157e366 FullscreenUI: Increase padding on value backgrounds - 24deeeef8 System: Fix initial capture mode on start - 56226045d FullscreenUI: Render loading screen with separate draw list - b984cb7ac System: Improve game setting reload workflow - 88df5c983 System: Persist settings interface objects - 8013df929 Qt: Fix window title when editing game specific controller config - 49d39aad7 PageFaultHandler: Set SA_NODEFER on MacOS as well - 4cf3404a1 PageFaultHandler: Determine write flag from ESR on MacOS ARM64 - 7304bfe25 CPU: Ensure RAM code pages are invalidated on core thread - 83a03fe95 CPU/CodeCache: Assert that handlers execute on core thread - b0c0a8ab7 PageFaultHandler: Remove the exception handler mutex - f4a828303 FullscreenUI: Fix compiler warning - 1c3948c97 Qt: Update machine translations - 400c269b4 GameDB: Sentou Kokka - Air Land Battle - d8d8a0816 CDROM: Reduce pause-while-paused delay - eb938ce10 dep/rcheevos: Bump to f1417fb - d954b7a3d ImGuiOverlays: Clear list on save state selector close - b25e2358b GPUDevice: Don't immediately trim textures queued in same frame - 0bf64996c ImGuiOverlays: Add animation to save state selector - 25783d844 ImGuiOverlays: Close save state selector on device switch - 8de6b0ac7 GameDB: Add HASH for Beyond the Beyond (#3782) - 48719b86b Bus: Fix CPE parsing when dev logging is disabled - 96e0c4d38 LRUCache: Fix m_manual_evict not respected when adding - 824a1072e LRUCache: Add custom deleter override - 0b28c198f FullscreenUI: Remove shared_ptr usage - 5422093cd Misc: Use relative time when displaying timestamps - a444b1265 GameDB: Add hashes for multiple games (#3784) - 5f3db8ed0 Qt: Improve Italian translation (#3783) - 12e575260 dep/rcheevos: Replace usage of sscanf() in rc_json_get_datetime() - 8bc6dc8d4 Qt: Update Italian translation again (#3785) - 7940507f0 Achievements: Use title format in submit time tooltip - ad2a8a637 System: Ensure achievements game is identified before loading state - c992e1c6b Atualização Português do Brasil (#3787) - fc741c826 GPU/TextureCache: Fix CPU thread read on GPU thread - 889a0fd2d GPU/TextureCache: Fix last_vram_write and num_splits not being serialized - ee211591b GPU/TextureCache: Limit the amount of uploads saved to state - 8e8e13de3 System: Reserve state memory for texture cache when enabled - e2823b429 GameDB: Felony 11-79/Runabout - 535154dcb MediaCapture: Show file size in OSD - 9d05a8756 Host: Fix broken relative time plurals - 3f9453fda Host: Merge FullscreenUI relative time variant with Host - 392e19b2a Qt: Add translation update and cleanup scripts - 764a06bc2 CI: Ensure translations are cleaned on pull request - f40cd5155 dep/rcheevos: Add rc_client_set_unofficial_achievement_unlock_state() - 4beec807d SQLiteHelpers: Add BindInt64()/ColumnInt64() - a679377ce FullscreenUI: Permit empty footer array component - 2743bb25e Achievements: Track unlocks of unofficial achievements locally - 240b19932 PageFaultHandler: Read ESR on Linux ARM64 as well - 06e6d4c2c Data: Update SDL game controller database - 614faf7d3 Qt: Clarify RetroAchievements login message - 04187ba0c Qt: Use variadic arg() instead of chaining multiple invocations - 939918806 Qt: Group toolbar-related menu items into a submenu (#3789) - 6f7fc33fe Qt: Update machine translations - fe899efd1 Update duckstation-qt_es.ts (#3786) - 78ff46ad1 Tests: Fix util-tests building - bf5a6162d MemoryCardImage: Replace full-width characters with ASCII - c4e99c4ae CDImageMDS: Fix games not detecting due to empty path - dbf928ff6 FullscreenUI: Fix inverted parameters - c776dee9e CDImage: Replace filename identifier with path - aea63ce41 Spanish (Spain) translation update 2026/08/25 (#3790) - a736f4492 Update Italian translation (#3791) - f18017eeb Qt: Fix localised disc regions in game list - f5e22bc71 FullscreenUI: Fix cheats menu hotkey in batch mode - 88e4ca533 Qt: Enable verification for unscanned files - fe2306b1f ImGuiManager: Tweak OSD fade in time
v0.1-11752
  • Améliorations majeures de l'émulation :

    • Correction des problèmes de synchronisation des accès GPU (Vulkan/D3D12) avec des fixes ciblés sur les pipelines compute, les textures et les barrières de synchronisation (ex. : VulkanDevice, D3D12Device), améliorant la stabilité et les performances sur les jeux exigeants.
    • Précision des timers et optimisation de l'émulation via Timers pour réduire les décalages temporels.
    • Ajout d’une option pour installer automatiquement les BIOS manquants lors du lancement, simplifiant la configuration initiale.
  • Corrections critiques de sécurité et de stabilité :

    • Prévention des dépassements de buffer dans les chargeurs de médias (CDImagePBP, CDImageMDS, ISOReader, PSFLoader) avec des vérifications de taille et de validité des entrées.
    • Correction des fuites mémoire dans MetalDevice et optimisation des allocations GPU.
    • Fix des lectures hors limites dans les callbacks d’achievements et les cheats, ainsi que des troncatures implicites dans les tailles de screenshot et les conversions Shift-JIS/UTF-8.
  • Interface utilisateur et workflow :

    • Réorganisation du BIOS Installer dans l’interface Qt avec une page de setup simplifiée et une meilleure gestion des traductions (mise à jour des traductions espagnoles et portugaises).
    • Ajout d’un widget collapsible et d’une liste rafraîchissable pour les overlays bordure, ainsi que d’un système de suffixes pour les entrées textuelles en plein écran.
    • Correction des crashes lors de l’ouverture des paramètres de jeu et des problèmes de langue dans le setup wizard.
  • Optimisations techniques sous-jacentes :

    • Amélioration de la gestion mémoire dans StateWrapper (évitement des allocations heap, clamps d’enum, zérisation des FIFOQueue) et optimisation des conversions de données (ex. : sjis2utf8).
    • Mise à jour des dépendances (FFmpeg headers à 9.0) et corrections
Changelog complet
## Commits - 381ac7d1e MediaCapture: Fix incorrect samples on buffer wrap-around - b3d594a9a MediaCapture: Remove Flush() method - 4f72f4034 MediaCapture: Fix possible corruption in audio-only capture - 049437e42 MediaCapture: Resample audio when encoder doesn't support 44.1KHz - 8b9aaf787 MediaCapture: Display OSD warning when resampling - d33d3b82c Qt: Rework media capture menu - 6e0fb1e14 FullscreenUI: Add InputTextWithSuffix() - e2e4bae61 Settings: Ensure overlays directory exists in user resources - 56fa9dc61 Qt: Add refresh button to border overlay list - 12f012caa Spanish (Spain) translation update 2026/07/27 (#3777) - dc75335a7 Scripts: Translation tools experiments - 551aaa439 RegTest: Fix compile error - 8747aa183 Atualização Português do Brasil (#3778) - 4a04d3143 SPU: Fix volume sweep termination conditions - f6c4fe987 Achievements: Rename softcore to casual (#3779) - 2246697be BIOS: Add version information and filenames to list - 145474389 Qt: Allow empty recommended value in settings help - 30d351e4e Qt: Add CollapsibleWidget - 8dbc47606 Qt: Add BIOS Installer and improve BIOS setup page - 351778e44 Qt: Update machine translations - 406f325b2 Qt: Fix BIOS summary not updating on language change - 9c7c23f48 Qt: Fix main window language not updating after setup wizard - 57b952ab2 Timers: Improve emulation accuracy - 7c93a61ee Qt: Further simplify BIOS setup wizard page - 07401690b Qt: Fix crash opening game settings - 202923da5 Qt: Correct some clearly awful translations - 7111f4c12 Update duckstation-qt_es.ts (#3780) - b5a990bbd MemoryCard: Use constants for address and offset mask - c42082c4b StateWrapper: Avoid heap allocation in FIFOQueue read - f3d0e84b0 StateWrapper: Avoid possible integer overflow on 32-bit systems - 865fd9e57 StateWrapper: Save contiguous FIFOQueue bytes in one memcpy() - 97400d2d0 StateWrapper: Clamp enum values to max - b147f1ffd FIFOQueue: Zero out head/tail when size reaches zero - e95e5a0d2 FullscreenUI: Right-align achievement type badges - 18147a175 GPUBackend: Fix possible unflushed draws with runahead enabled - 4d700e468 MDEC: Ensure direct FIFO writes don't overflow - 26fa2ee4a MetalDevice: Fix a few leaky object retains - c07bf47d6 CDImageCue: Validate bits-per-sample for wave files - ecbe3c3b7 MemoryCardImage: Don't over-enumerate directory frames - 76f01d8c9 Misc: Fix under-allocation in sjis2utf8() - d6d8a7be1 CDImageCue: Fix implicit truncation warning - e86af51c8 Deps: Update bundled ffmpeg headers to 9.0 - 6d0feff2f Deps: Update to 20260805 - 3fed119df MediaCapture: Default to H264 on all platforms - 12a4a2648 Util: Avoid intermediate memory allocation in Shift-JIS conversion - 8a2c05ce5 Image: Avoid integer overflow for dimensions - 99fc655fa Updater: Fix possible path traversal during preprocessing - ebd090340 Updater: Fix possible infinite loop - 1fbfbb57d System: Fix implicit 32-bit truncation of screenshot size - 2c8e998da Spanish (Spain) editing pass - 2026/08/05 (#3781) - 6e242f5cb Bus: Flush line buffer after 512 characters - ca5cc7374 GPU: Add missing serialization of polyline buffer - f92b1a81d GPU: Add some simple checks to the polyline buffer - cd5e48af9 StateWrapper: Add max size checks to vector/string data - 2688a1dfc Achievements: Fix possible read past end of memory in callback - e48b3e302 Cheats: Fix possible OOB reads in malformed instructions - d3ff0b364 PSFLoader: Add missing header size checks when loading - a8a098a0a Common: Valid BCD functions should return boolean - b9cf3bbf0 CDImagePBP: Add missing validation of BCD digits - 467d0971b CDImagePBP: Check SFO index table count before reading - e0734381a CDImageMDS: Fix a bunch of possible buffer overreads - 6651f4d19 ISOReader: Fix possible integer overflow in GetSizeInSectors() - f1029b2df AnimatedImage: Fix possible integer overflow of dimensions - f11b43227 System: Add option to install BIOS when missing - 8778034bf RegTest: Fix compiling again - e175c8422 Bus: Pack state in struct - 5245a58b0 Settings: Fix invalid memory card values after install - 213c5b450 VideoPresenter: Use transfer pitch for screenshots - b3b57a2a0 VulkanDevice: Bind initial compute pipelines correctly - bbac943b5 VulkanDevice: Expose shared UBO binding to compute shaders - fc3e117f8 VulkanDevice: Synchronize compute image accesses - 4b5edbb85 VulkanDevice: Preserve mapped texture upload pitch - 6584adde9 VulkanDevice: Fix download buffer barrier ranges - 037ee47f7 VulkanDevice: Validate imported host buffer memory - 668f39fab VulkanDevice: Wait for presentation before swapchain teardown - 846236538 VulkanDevice: Address texture array subresources - 5f40f0ac1 VulkanDevice: Select advertised surface format pairs - 40e178787 VulkanDevice: Fix legacy render pass attachments - d1720c040 VulkanDevice: Respect fixed surface extents - a8de757b9 VulkanDevice: Store compute specialization values - 7b690ec1f VulkanDevice: Reset descriptor builder storage - 69c5051a8 D3D12Device: Restore state after mipmap rendering - a8c9324f4 D3D12Device: Transition cleared compute targets to UAV - 6e2f06a55 D3D12Device: Bound persistent descriptor allocation - 227389010 D3D12Device: Create texture arrays with all layers - b5f821bf4 D3D12Device: Transition all uploaded subresources - 402f9207f D3D12Device: Set render-pass clear formats - a4a03c476 D3D12Device: Assert alignment of download texture footprints - 685cf83c8 D3D12Device: Order dependent compute UAV accesses - 7b1596120 D3D12Device: Fix incorrect push constant root parameter index - 41ee40215 D3D12Device: Track readback source usage - 48a1a06f5 Qt: Don't try to load HTTP URLs as animated images in game list - 2f9c58762 FullscreenUI: Fix shared memory card selection - 4431915b4 FullscreenUI: Expose multitap memory cards - 6f704d405 FullscreenUI: Fix shared card name not disabling if unused - ee21478ad GPU/HW: Don't miss updating read texture for recursive draws - f7797b57e Controller: Add 'Disable Simultaneous Opposing Cardinal Directions' option - 0697597c5 Controller: Make mandatory functions pure virtual - d92fe3dac Data: Move all PromptFont glyphs to unallocated range - f04e08b24 GDBServer: Fix stop reply acknowledgements - 1a9379bd6 GDBServer: Support continue addresses - a36b75716 GDBServer: Support single-step addresses - c7324e333 GDBServer: Preserve unchanged resume state - 05166d1a7 GDBServer: Track the last stop signal - 3885778a2 GDBServer: Reply to invalid command arguments - aea374641 GDBServer: Validate complete packet fields - 4e0940500 GDBServer: Apply register writes atomically - 7c279dc96 GDBServer: Invalidate code after memory writes - 8d7046a89 GDBServer: Bound remote packet sizes - 60a4ec363 GDBServer: Queue complete protocol packets - 54d074fb6 GDBServer: Retransmit rejected replies - cba85882a GDBServer: Reject oversized incoming packets - d176e31aa GDBServer: Support signal resume packets - fe32554cc GDBServer: Restore run state after disconnect - c2418520e GDBServer: Notify host when first/last client connects/disconnects - 0a00cbc3c GDBServer: Send invalid instead of zero values for extra registers - ac6d89919 GDBServer: Disable nagle buffering on connect - 71c88506e GDBServer: Track breakpoint ownership - e3bea1978 GDBServer: Expand watchpoint ranges - b147ed63d CPU: Enumerate actions for callback breakpoints - 86360211b GDBServer: Report watchpoint stop details - fa5e11116 GDBServer: Use indexing instead of range-based for - 30fa5b4c4 Qt: Rename background controller poll to idle update - c7f282f18 Core: Use multiplexer to idle sleep for GDB server - 3bb39f4e3 ELFFile: Skip embedded PS-X EXE header segments - 2cf108618 GDBServer: Fix unused capture warning - cf2495759 Qt: Implement mouse capture using CoreGraphics - e2b78d4ca Qt: Tie relative mouse state to the active window - 8c1a2022e GDBServer: Expose target memory map and registers - c8abcf4b2 GDBServer: Expose GTE registers - 8a96948a8 GPUDevice: Use same buffer sizes across backends - 89fb3ad33 DMA: Hardwire reverse direction for OTC - d59fcfb9d ImGuiManager: Support rendering Hebrew text - 8ec85e305 Qt: Update machine translations - 232c9ad9f Achievements: Make password login asynchronous - 2c3261209 Qt: Simplify logout callback - 9f9009d64 Achievements: Ensure callbacks run on core thread for RAIntegration - 04f4f1ba2 Achievements: Respond to RAIntegration reset request - 1f925f86e Misc: Add a couple of missing fmt/format.h includes - b2f9c8fba Misc: Fix deprecated implicit conversion of fstring->string_view - c130fc12c dep/fmt: Update to v12.2.0 - 5ee1d2569 GameDB: Disable PGXP/WS in Vanark - 5fd366809 Achievements: Don't double-free login callback on request failure
v0.1-11609
  • Améliorations majeures pour les performances et la compatibilité :

    • Prise en charge de la lecture des secteurs non-Mode2/bruts sur les images CD, améliorant la compatibilité avec certains jeux.
    • Optimisation de la gestion de la mémoire pour les images CD (préchargement) et réduction de la taille de la structure de sauvegarde système pour économiser de la RAM.
  • Corrections critiques :

    • Correction d’un bug lié aux pixels transparents dans le mode MMPX Enhanced/Advanced (fixe des artefacts visuels).
    • Correction d’un problème de condition inversée dans le système d’achievements, évitant des erreurs lors de l’ajout de nouveaux jeux.
    • Correction d’une assertion de débogage dans le mode plein écran en mode mono-thread, ainsi que d’un bug de fermeture prématurée lors de la reprise après suspension.
  • Améliorations du système de capture vidéo :

    • Suppression des options AV1/VP9 dans la liste des codecs disponibles pour MediaCapture (simplification et stabilité).
    • Amélioration de la robustesse de la configuration Media Foundation (MF) et optimisation de l’encodage matériel via FFmpeg (nécessite désormais FFmpeg ≥ 7.x).
  • Interface utilisateur et expérience utilisateur :

    • Ajout d’une option de transition "None" pour les changements d’affichage en plein écran et optimisation du recyclage des textures pour réduire les lag.
    • Animation de la barre de progression des achievements lors du déverrouillage.
    • Extraction et intégration d’icônes dans l’éditeur de cartes mémoire (interface Qt).
  • Corrections mineures et nettoyage :

    • Suppression de scripts Qt inutilisés et d’un fichier inexistant dans le système de build MSBuild.
    • Correction d’un bug de bordure en plein écran sous Qt (contournement d’un problème connu).
    • Mise à jour de la base de données des manettes SDL pour une meilleure détection des périphériques.
Changelog complet
## Commits - 9c79341cf CueParser: Handle rarely-used commands - b89e1bfeb CDImage: Support reading non-mode2/raw sectors - 94f11f9ba CDImage: Rewrite memory image (preloading) - 2880f88d8 MMPX Enhanced/Advanced clamp-to-transparent out-of-bounds mapping (#3774) - 31ab18b25 SPU: Wraparound is unlikely in ReadADPCMBlock() - 2cdf99d8a MediaCapture: Improve MF setup robustness - f383c3fa1 MediaCapture: Remove AV1/VP9 options from MF list - e04d89065 MediaCapture: Improve ffmpeg hardware encoding - 8612996ea MediaCapture: Drop ffmpeg pre-7.x fallback - 0275d6df9 MediaCapture: Clear state before deleting output file - d4844036c Qt: Capture dialog improvements - 35bcff152 Achievements: Animate unlock progress bar - 31c682943 FullscreenUI: Fix another debug assertion in single-threaded mode - 8a98ed820 FullscreenUI: Relax condition for closing immediately on resume - a421b5b11 FullscreenUI: Add 'None' transition effect - ad7519d72 FullscreenUI: Add queued texture recyling - 8a1dbb169 CDROM: Refactor invalid command handling - f8c9301f4 MSBuild: Remove non-existant file - e39033c44 Qt: Remove unused scripts - 9c35fdc94 MMPX :fix a transparent pixel bug & Adjusted floating-point tolerance (#3776) - 39fe70c84 CI: Bump actions/checkout to v7 (#3775) - b42e1c9f2 System: Slightly reduce memory save state struct size - 09467d50e Qt: Add icon extraction to memory card editor - 4730d795b Qt: Add icons to memory card editor buttons - 4069271eb Qt: Make SetWindowRoundedCornerState() take an optional boolean - 5f9e7f69b Qt: Work around Qt fullscreen border bug - 42bf523e8 Data: Update SDL Game Controller DB - eb4b87cfa Achievements: Fix inverted condition for new game additions - a233ec1fb Qt: Fix deprecation warning

Captures d'écran

Metal Gear Solid dans DuckStation