diff --git a/.github/ISSUE_TEMPLATE/rfc.yaml b/.github/ISSUE_TEMPLATE/rfc.yaml
new file mode 100644
index 000000000..7ad453101
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/rfc.yaml
@@ -0,0 +1,77 @@
+# SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Docs - https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema
+name: Request For Comments (RFC)
+description: Ask for feedback on major architectural changes or design choices
+title: "[RFC]: "
+labels: ["RFC"]
+
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ## Important: Read First
+
+ RFCs are for major architectural changes, design direction, or changes that benefit from structured discussion before merge.
+
+ Please make an effort to search for an existing RFC or issue before opening a new one.
+
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: I have searched for a similar RFC or issue in this repository and did not find one.
+ required: true
+
+ - type: textarea
+ id: motivation
+ attributes:
+ label: Motivation
+ description: |
+ Explain the problem this RFC is trying to solve.
+
+ Describe why the current design is insufficient and why this change is worth discussing now.
+ validations:
+ required: true
+
+ - type: textarea
+ id: proposed_change
+ attributes:
+ label: Proposed Change
+ description: |
+ Describe the proposed change in enough detail for maintainers and contributors to evaluate it.
+
+ Include the high-level design, affected areas, and any important constraints.
+ validations:
+ required: true
+
+ - type: textarea
+ id: feedback_period
+ attributes:
+ label: Feedback Period
+ description: |
+ State the intended review window for this RFC.
+
+ Example: one week, two weeks, or until specific maintainers have reviewed it.
+ placeholder: "Example: 1 week"
+ validations:
+ required: false
+
+ - type: textarea
+ id: cc_list
+ attributes:
+ label: CC List
+ description: |
+ List any maintainers or contributors you want to explicitly notify for feedback.
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional_context
+ attributes:
+ label: Any Other Things
+ description: |
+ Add any other relevant context, tradeoffs, diagrams, migration notes, or links to related work.
+ validations:
+ required: false
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ffe7c22fb..96f5e33d7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -14,6 +14,8 @@ on:
- "documents/**"
- "**/*.md"
+ workflow_dispatch:
+
concurrency:
group: ci-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'push' }}
@@ -26,14 +28,14 @@ jobs:
runs-on: ubuntu-24.04
continue-on-error: true
steps:
- - uses: actions/checkout@v5
- - uses: fsfe/reuse-action@v5
+ - uses: actions/checkout@v6
+ - uses: fsfe/reuse-action@v6
clang-format:
runs-on: ubuntu-24.04
continue-on-error: true
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install
@@ -46,7 +48,7 @@ jobs:
env:
COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}
run: ./.ci/clang-format.sh
-
+
get-info:
runs-on: ubuntu-24.04
outputs:
@@ -54,7 +56,7 @@ jobs:
shorthash: ${{ steps.vars.outputs.shorthash }}
fullhash: ${{ steps.vars.outputs.fullhash }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Get date and git hash
id: vars
run: |
@@ -65,27 +67,102 @@ jobs:
echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "fullhash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
+ test:
+ name: Run C++ Tests on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [windows-latest, ubuntu-latest, macos-latest]
+ include:
+ - os: windows-latest
+ compiler_cxx: clang-cl
+ compiler_c: clang-cl
+ - os: ubuntu-latest
+ compiler_cxx: clang++
+ compiler_c: clang
+ - os: macos-latest
+ compiler_cxx: clang++
+ compiler_c: clang
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Setup CMake
+ uses: lukka/get-cmake@latest
+
+ - name: Setup Visual Studio shell (Windows only)
+ if: runner.os == 'Windows'
+ uses: egor-tensin/vs-shell@v2
+ with:
+ arch: x64
+
+ - name: Install dependencies (Linux)
+ if: runner.os == 'Linux'
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y ninja-build libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libxcursor-dev libxi-dev libxss-dev libxtst-dev libxrandr-dev libxfixes-dev libudev-dev uuid-dev uuid-dev
+
+ - name: Install dependencies (macOS)
+ if: runner.os == 'macOS'
+ run: |
+ brew install ninja
+
+ - name: Configure CMake
+ run: |
+ cmake -B build -G Ninja \
+ -DCMAKE_CXX_COMPILER="${{ matrix.compiler_cxx }}" \
+ -DCMAKE_C_COMPILER="${{ matrix.compiler_c }}" \
+ -DCMAKE_BUILD_TYPE=Debug \
+ -DENABLE_TESTS=ON \
+ ${{ runner.os == 'macOS' && '-DCMAKE_OSX_ARCHITECTURES=x86_64' || '' }}
+ shell: bash
+
+ - name: Create shadPS4 user data directory (Linux)
+ if: runner.os == 'Linux'
+ run: mkdir -p ~/.local/share/shadPS4
+
+ - name: Create shadPS4 user data directory (macOS)
+ if: runner.os == 'macOS'
+ run: mkdir -p ~/Library/Application\ Support/shadPS4
+
+ - name: Create shadPS4 user data directory (Windows)
+ if: runner.os == 'Windows'
+ run: mkdir -p "$APPDATA/shadPS4"
+ shell: bash
+
+ - name: Build all tests
+ run: cmake --build build
+ shell: bash
+
+ - name: Run tests with CTest
+ run: ctest --test-dir build --output-on-failure --progress
+ shell: bash
+
windows-sdl:
runs-on: windows-2025
needs: get-info
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
submodules: recursive
- name: Cache CMake Configuration
- uses: actions/cache@v4
+ uses: actions/cache@v5
env:
cache-name: ${{ runner.os }}-sdl-ninja-cache-cmake-configuration
with:
- path: |
+ path: |
${{github.workspace}}/build
key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
restore-keys: |
${{ env.cache-name }}-
- name: Cache CMake Build
- uses: hendrikmuhs/ccache-action@v1.2.19
+ uses: hendrikmuhs/ccache-action@v1.2.21
env:
cache-name: ${{ runner.os }}-sdl-cache-cmake-build
with:
@@ -99,7 +176,7 @@ jobs:
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $env:NUMBER_OF_PROCESSORS
- name: Upload Windows SDL artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v7
with:
name: shadps4-win64-sdl-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}
path: ${{github.workspace}}/build/shadPS4.exe
@@ -108,7 +185,7 @@ jobs:
runs-on: macos-15
needs: get-info
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
submodules: recursive
@@ -118,18 +195,18 @@ jobs:
xcode-version: latest
- name: Cache CMake Configuration
- uses: actions/cache@v4
- env:
+ uses: actions/cache@v5
+ env:
cache-name: ${{ runner.os }}-sdl-cache-cmake-configuration
- with:
- path: |
- ${{github.workspace}}/build
- key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
- restore-keys: |
- ${{ env.cache-name }}-
+ with:
+ path: |
+ ${{github.workspace}}/build
+ key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
+ restore-keys: |
+ ${{ env.cache-name }}-
- name: Cache CMake Build
- uses: hendrikmuhs/ccache-action@v1.2.19
+ uses: hendrikmuhs/ccache-action@v1.2.21
env:
cache-name: ${{runner.os}}-sdl-cache-cmake-build
with:
@@ -150,7 +227,7 @@ jobs:
mv ${{github.workspace}}/build/shadps4 upload
mv ${{github.workspace}}/build/MoltenVK_icd.json upload
mv ${{github.workspace}}/build/libMoltenVK.dylib upload
- - uses: actions/upload-artifact@v4
+ - uses: actions/upload-artifact@v7
with:
name: shadps4-macos-sdl-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}
path: upload/
@@ -159,7 +236,7 @@ jobs:
runs-on: ubuntu-24.04
needs: get-info
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
submodules: recursive
@@ -172,18 +249,18 @@ jobs:
run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 clang-19 mold build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev libxcursor-dev libxi-dev libxss-dev libxtst-dev
- name: Cache CMake Configuration
- uses: actions/cache@v4
- env:
+ uses: actions/cache@v5
+ env:
cache-name: ${{ runner.os }}-sdl-cache-cmake-configuration
- with:
- path: |
- ${{github.workspace}}/build
- key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
- restore-keys: |
- ${{ env.cache-name }}-
+ with:
+ path: |
+ ${{github.workspace}}/build
+ key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
+ restore-keys: |
+ ${{ env.cache-name }}-
- name: Cache CMake Build
- uses: hendrikmuhs/ccache-action@v1.2.19
+ uses: hendrikmuhs/ccache-action@v1.2.21
env:
cache-name: ${{ runner.os }}-sdl-cache-cmake-build
with:
@@ -195,23 +272,23 @@ jobs:
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(nproc)
-
- - name: Package and Upload Linux(ubuntu64) SDL artifact
+
+ - name: Package and Upload Linux(ubuntu64) SDL artifact
run: |
ls -la ${{ github.workspace }}/build/shadps4
-
- - uses: actions/upload-artifact@v4
+
+ - uses: actions/upload-artifact@v7
with:
name: shadps4-ubuntu64-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}
path: ${{ github.workspace }}/build/shadps4
- name: Run AppImage packaging script
run: ./.github/linux-appimage-sdl.sh
-
+
- name: Package and Upload Linux SDL artifact
run: |
tar cf shadps4-linux-sdl.tar.gz -C ${{github.workspace}}/build shadps4
- - uses: actions/upload-artifact@v4
+ - uses: actions/upload-artifact@v7
with:
name: shadps4-linux-sdl-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}
path: Shadps4-sdl.AppImage
@@ -220,7 +297,7 @@ jobs:
runs-on: ubuntu-24.04
needs: get-info
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
submodules: recursive
@@ -228,18 +305,18 @@ jobs:
run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 mold build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev libxcursor-dev libxi-dev libxss-dev libxtst-dev
- name: Cache CMake Configuration
- uses: actions/cache@v4
- env:
+ uses: actions/cache@v5
+ env:
cache-name: ${{ runner.os }}-sdl-gcc-cache-cmake-configuration
- with:
- path: |
- ${{github.workspace}}/build
- key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
- restore-keys: |
- ${{ env.cache-name }}-
+ with:
+ path: |
+ ${{github.workspace}}/build
+ key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }}
+ restore-keys: |
+ ${{ env.cache-name }}-
- name: Cache CMake Build
- uses: hendrikmuhs/ccache-action@v1.2.19
+ uses: hendrikmuhs/ccache-action@v1.2.21
env:
cache-name: ${{ runner.os }}-sdl-gcc-cache-cmake-build
with:
@@ -258,7 +335,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v8
with:
path: ./artifacts
@@ -266,7 +343,7 @@ jobs:
run: |
chmod -R a+x ./artifacts/shadps4-linux-sdl-*
chmod -R a+x ./artifacts/shadps4-macos-sdl-*
-
+
- name: Compress individual directories (without parent directory)
run: |
cd ./artifacts
@@ -277,7 +354,7 @@ jobs:
(cd "$dir_name" && zip -r "../${dir_name}.zip" .)
fi
done
-
+
- name: Get latest release information
id: get_latest_release
env:
@@ -351,52 +428,52 @@ jobs:
upload_url="https://uploads.github.com/repos/$REPO/releases/$release_id/assets?name=$filename"
curl -X POST -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/octet-stream" --data-binary @"$file" "$upload_url"
done
-
+
- name: Get current pre-release information
env:
GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }}
run: |
api_url="https://api.github.com/repos/${{ github.repository }}/releases"
-
+
# Get all releases (sorted by date)
releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url")
-
+
# Capture the most recent pre-release (assuming the first one is the latest)
current_release=$(echo "$releases" | jq -c '.[] | select(.prerelease == true) | .published_at' | sort -r | head -n 1)
-
+
# Remove extra quotes from captured date
current_release=$(echo $current_release | tr -d '"')
-
+
# Export the current published_at to be available for the next step
echo "CURRENT_PUBLISHED_AT=$current_release" >> $GITHUB_ENV
-
+
- name: Delete old pre-releases and tags
env:
GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }}
run: |
api_url="https://api.github.com/repos/${{ github.repository }}/releases"
-
+
# Get current pre-releases
releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url")
-
+
# Remove extra quotes from captured date
CURRENT_PUBLISHED_AT=$(echo $CURRENT_PUBLISHED_AT | tr -d '"')
-
+
# Convert CURRENT_PUBLISHED_AT para timestamp Unix
current_published_ts=$(date -d "$CURRENT_PUBLISHED_AT" +%s)
-
+
# Identify pre-releases
echo "$releases" | jq -c '.[] | select(.prerelease == true)' | while read -r release; do
release_date=$(echo "$release" | jq -r '.published_at')
release_id=$(echo "$release" | jq -r '.id')
release_tag=$(echo "$release" | jq -r '.tag_name')
-
+
# Remove extra quotes from captured date
release_date=$(echo $release_date | tr -d '"')
-
+
# Convert release_date para timestamp Unix
release_date_ts=$(date -d "$release_date" +%s)
-
+
# Compare timestamps and delete old pre-releases
if [[ "$release_date_ts" -lt "$current_published_ts" ]]; then
echo "Deleting old pre-release: $release_id from $release_date with tag: $release_tag"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6d5225602..6bb22db33 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,7 @@ endif()
option(ENABLE_DISCORD_RPC "Enable the Discord RPC integration" ON)
option(ENABLE_UPDATER "Enables the options to updater" ON)
+option(ENABLE_TESTS "Build unit tests (requires GTest)" OFF)
# First, determine whether to use CMAKE_OSX_ARCHITECTURES or CMAKE_SYSTEM_PROCESSOR.
if (APPLE AND CMAKE_OSX_ARCHITECTURES)
@@ -202,7 +203,7 @@ execute_process(
# Set Version
set(EMULATOR_VERSION_MAJOR "0")
-set(EMULATOR_VERSION_MINOR "14")
+set(EMULATOR_VERSION_MINOR "15")
set(EMULATOR_VERSION_PATCH "1")
set_source_files_properties(src/shadps4.rc PROPERTIES COMPILE_DEFINITIONS "EMULATOR_VERSION_MAJOR=${EMULATOR_VERSION_MAJOR};EMULATOR_VERSION_MINOR=${EMULATOR_VERSION_MINOR};EMULATOR_VERSION_PATCH=${EMULATOR_VERSION_PATCH}")
@@ -295,8 +296,15 @@ set(AUDIO_LIB src/core/libraries/audio/audioin.cpp
src/core/libraries/audio/audioout_backend.h
src/core/libraries/audio/audioout_error.h
src/core/libraries/audio/sdl_audio_out.cpp
+ src/core/libraries/audio/openal_audio_out.cpp
+ src/core/libraries/audio/openal_manager.h
src/core/libraries/ngs2/ngs2.cpp
src/core/libraries/ngs2/ngs2.h
+ src/core/libraries/audio3d/audio3d.cpp
+ src/core/libraries/audio3d/audio3d_openal.cpp
+ src/core/libraries/audio3d/audio3d_openal.h
+ src/core/libraries/audio3d/audio3d.h
+ src/core/libraries/audio3d/audio3d_error.h
)
set(GNM_LIB src/core/libraries/gnmdriver/gnmdriver.cpp
@@ -414,9 +422,12 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp
src/core/libraries/save_data/dialog/savedatadialog.h
src/core/libraries/save_data/dialog/savedatadialog_ui.cpp
src/core/libraries/save_data/dialog/savedatadialog_ui.h
- src/core/libraries/system/sysmodule.cpp
- src/core/libraries/system/sysmodule.h
- src/core/libraries/system/system_error.h
+ src/core/libraries/sysmodule/sysmodule.cpp
+ src/core/libraries/sysmodule/sysmodule.h
+ src/core/libraries/sysmodule/sysmodule_internal.cpp
+ src/core/libraries/sysmodule/sysmodule_internal.h
+ src/core/libraries/sysmodule/sysmodule_error.h
+ src/core/libraries/sysmodule/sysmodule_table.h
src/core/libraries/system/systemservice.cpp
src/core/libraries/system/systemservice.h
src/core/libraries/system/systemservice_error.h
@@ -868,6 +879,12 @@ set(CORE src/core/aerolib/stubs.cpp
src/core/tls.h
src/core/emulator_state.cpp
src/core/emulator_state.h
+ src/core/emulator_settings.cpp
+ src/core/emulator_settings.h
+ src/core/user_manager.cpp
+ src/core/user_manager.h
+ src/core/user_settings.cpp
+ src/core/user_settings.h
)
if (ARCHITECTURE STREQUAL "x86_64")
@@ -1099,6 +1116,8 @@ set(EMULATOR src/emulator.cpp
src/sdl_window.cpp
)
+if(NOT ENABLE_TESTS)
+
add_executable(shadps4
${AUDIO_CORE}
${IMGUI}
@@ -1252,3 +1271,8 @@ endif()
# Install rules
install(TARGETS shadps4 BUNDLE DESTINATION .)
+
+else()
+ enable_testing()
+ add_subdirectory(tests)
+endif()
\ No newline at end of file
diff --git a/dist/net.shadps4.shadPS4.metainfo.xml b/dist/net.shadps4.shadPS4.metainfo.xml
index 210ca1c5e..8a7fa852b 100644
--- a/dist/net.shadps4.shadPS4.metainfo.xml
+++ b/dist/net.shadps4.shadPS4.metainfo.xml
@@ -38,7 +38,10 @@
Game
-
+
+ https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.15.0
+
+
https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.14.0
diff --git a/src/common/elf_info.h b/src/common/elf_info.h
index 0f2311cb0..8f79c9e69 100644
--- a/src/common/elf_info.h
+++ b/src/common/elf_info.h
@@ -6,6 +6,7 @@
#include
#include
#include
+#include
#include "assert.h"
#include "bit_field.h"
@@ -73,6 +74,7 @@ class ElfInfo {
std::filesystem::path splash_path{};
std::filesystem::path game_folder{};
+ std::vector npCommIds{};
public:
static constexpr u32 FW_10 = 0x1000000;
@@ -88,7 +90,10 @@ public:
static constexpr u32 FW_50 = 0x5000000;
static constexpr u32 FW_55 = 0x5500000;
static constexpr u32 FW_60 = 0x6000000;
+ static constexpr u32 FW_70 = 0x7000000;
+ static constexpr u32 FW_75 = 0x7500000;
static constexpr u32 FW_80 = 0x8000000;
+ static constexpr u32 FW_115 = 0x11500000;
static ElfInfo& Instance() {
return *Singleton::Instance();
@@ -136,6 +141,10 @@ public:
[[nodiscard]] const std::filesystem::path& GetGameFolder() const {
return game_folder;
}
+
+ [[nodiscard]] const std::vector GetNpCommIds() const {
+ return npCommIds;
+ }
};
} // namespace Common
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 930b1ac30..5de4f64a0 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -14,7 +14,6 @@
#endif
#include "common/bounded_threadsafe_queue.h"
-#include "common/config.h"
#include "common/debug.h"
#include "common/io_file.h"
#include "common/logging/backend.h"
@@ -24,6 +23,7 @@
#include "common/path_util.h"
#include "common/string_util.h"
#include "common/thread.h"
+#include "core/emulator_settings.h"
namespace Common::Log {
@@ -141,7 +141,7 @@ public:
const auto& log_dir = GetUserPath(PathType::LogDir);
std::filesystem::create_directory(log_dir);
Filter filter;
- filter.ParseFilterString(Config::getLogFilter());
+ filter.ParseFilterString(EmulatorSettings.GetLogFilter());
const auto& log_file_path = log_file.empty() ? LOG_FILE : log_file;
instance = std::unique_ptr(
new Impl(log_dir / log_file_path, filter), Deleter);
@@ -185,7 +185,7 @@ public:
void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num,
const char* function, const char* format, const fmt::format_args& args) {
- if (!filter.CheckMessage(log_class, log_level) || !Config::getLoggingEnabled()) {
+ if (!filter.CheckMessage(log_class, log_level) || !EmulatorSettings.IsLogEnabled()) {
return;
}
@@ -213,7 +213,7 @@ public:
using std::chrono::microseconds;
using std::chrono::steady_clock;
- if (Config::groupIdenticalLogs()) {
+ if (EmulatorSettings.IsIdenticalLogGrouped()) {
std::unique_lock entry_loc(_mutex);
if (_last_entry.message == message) {
@@ -226,7 +226,7 @@ public:
}
if (_last_entry.counter >= 1) {
- if (Config::getLogType() == "async") {
+ if (EmulatorSettings.GetLogType() == "async") {
message_queue.EmplaceWait(_last_entry);
} else {
ForEachBackend([this](auto& backend) { backend.Write(this->_last_entry); });
@@ -258,7 +258,7 @@ public:
.counter = 1,
};
- if (Config::getLogType() == "async") {
+ if (EmulatorSettings.GetLogType() == "async") {
message_queue.EmplaceWait(entry);
} else {
ForEachBackend([&entry](auto& backend) { backend.Write(entry); });
@@ -296,14 +296,14 @@ private:
}
void StopBackendThread() {
- if (Config::groupIdenticalLogs()) {
+ if (EmulatorSettings.IsIdenticalLogGrouped()) {
// log last message
if (_last_entry.counter >= 2) {
_last_entry.message += " x" + std::to_string(_last_entry.counter);
}
if (_last_entry.counter >= 1) {
- if (Config::getLogType() == "async") {
+ if (EmulatorSettings.GetLogType() == "async") {
message_queue.EmplaceWait(_last_entry);
} else {
ForEachBackend([this](auto& backend) { backend.Write(this->_last_entry); });
diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp
index 9a3fe0aa1..fd48faf72 100644
--- a/src/common/logging/filter.cpp
+++ b/src/common/logging/filter.cpp
@@ -68,6 +68,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
CLS(Common) \
SUB(Common, Filesystem) \
SUB(Common, Memory) \
+ CLS(KeyManager) \
CLS(Core) \
SUB(Core, Linker) \
SUB(Core, Devices) \
@@ -80,7 +81,6 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
SUB(Kernel, Event) \
SUB(Kernel, Sce) \
CLS(Lib) \
- SUB(Lib, LibC) \
SUB(Lib, LibcInternal) \
SUB(Lib, Kernel) \
SUB(Lib, Pad) \
@@ -117,7 +117,6 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
SUB(Lib, NpSnsFacebookDialog) \
SUB(Lib, NpPartner) \
SUB(Lib, Screenshot) \
- SUB(Lib, LibCInternal) \
SUB(Lib, AppContent) \
SUB(Lib, Rtc) \
SUB(Lib, Rudp) \
@@ -163,7 +162,6 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
CLS(ImGui) \
CLS(Input) \
CLS(Tty) \
- CLS(KeyManager) \
CLS(Loader)
// GetClassName is a macro defined by Windows.h, grrr...
diff --git a/src/common/logging/types.h b/src/common/logging/types.h
index 9e176c698..2c6edef3b 100644
--- a/src/common/logging/types.h
+++ b/src/common/logging/types.h
@@ -34,6 +34,7 @@ enum class Class : u8 {
Common, ///< Library routines
Common_Filesystem, ///< Filesystem interface library
Common_Memory, ///< Memory mapping and management functions
+ KeyManager, ///< Key management system
Core, ///< LLE emulation core
Core_Linker, ///< The module linker
Core_Devices, ///< Devices emulation
@@ -44,10 +45,9 @@ enum class Class : u8 {
Kernel_Fs, ///< The filesystem implementation of the kernel.
Kernel_Vmm, ///< The virtual memory implementation of the kernel.
Kernel_Event, ///< The event management implementation of the kernel.
- Kernel_Sce, ///< The sony specific interfaces provided by the kernel.
+ Kernel_Sce, ///< The Sony-specific interfaces provided by the kernel.
Lib, ///< HLE implementation of system library. Each major library
///< should have its own subclass.
- Lib_LibC, ///< The LibC implementation.
Lib_LibcInternal, ///< The LibcInternal implementation.
Lib_Kernel, ///< The LibKernel implementation.
Lib_Pad, ///< The LibScePad implementation.
@@ -83,7 +83,6 @@ enum class Class : u8 {
Lib_NpProfileDialog, ///< The LibSceNpProfileDialog implementation
Lib_NpSnsFacebookDialog, ///< The LibSceNpSnsFacebookDialog implementation
Lib_Screenshot, ///< The LibSceScreenshot implementation
- Lib_LibCInternal, ///< The LibCInternal implementation.
Lib_AppContent, ///< The LibSceAppContent implementation.
Lib_Rtc, ///< The LibSceRtc implementation.
Lib_Rudp, ///< The LibSceRudp implementation.
@@ -131,7 +130,6 @@ enum class Class : u8 {
Loader, ///< ROM loader
Input, ///< Input emulation
Tty, ///< Debug output from emu
- KeyManager, ///< Key management system
Count ///< Total number of logging classes
};
diff --git a/src/common/memory_patcher.cpp b/src/common/memory_patcher.cpp
index a7c020246..2517e3f22 100644
--- a/src/common/memory_patcher.cpp
+++ b/src/common/memory_patcher.cpp
@@ -8,7 +8,6 @@
#include
#include
#include
-#include "common/config.h"
#include "common/elf_info.h"
#include "common/logging/log.h"
#include "common/path_util.h"
diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp
index 5d37990ff..103f17d29 100644
--- a/src/common/path_util.cpp
+++ b/src/common/path_util.cpp
@@ -129,6 +129,7 @@ static auto UserPaths = [] {
create_path(PathType::CustomConfigs, user_dir / CUSTOM_CONFIGS);
create_path(PathType::CacheDir, user_dir / CACHE_DIR);
create_path(PathType::FontsDir, user_dir / FONTS_DIR);
+ create_path(PathType::HomeDir, user_dir / HOME_DIR);
std::ofstream notice_file(user_dir / CUSTOM_TROPHY / "Notice.txt");
if (notice_file.is_open()) {
diff --git a/src/common/path_util.h b/src/common/path_util.h
index 434f77b0d..485c72270 100644
--- a/src/common/path_util.h
+++ b/src/common/path_util.h
@@ -26,6 +26,7 @@ enum class PathType {
CustomConfigs, // Where custom files for different games are stored.
CacheDir, // Where pipeline and shader cache is stored.
FontsDir, // Where dumped system fonts are stored.
+ HomeDir, // PS4 home directory
};
constexpr auto PORTABLE_DIR = "user";
@@ -46,6 +47,7 @@ constexpr auto CUSTOM_TROPHY = "custom_trophy";
constexpr auto CUSTOM_CONFIGS = "custom_configs";
constexpr auto CACHE_DIR = "cache";
constexpr auto FONTS_DIR = "fonts";
+constexpr auto HOME_DIR = "home";
// Filenames
constexpr auto LOG_FILE = "shad_log.txt";
diff --git a/src/common/serdes.h b/src/common/serdes.h
index a36fed4d3..f91a0ace8 100644
--- a/src/common/serdes.h
+++ b/src/common/serdes.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
+// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
@@ -7,6 +7,7 @@
#include "common/types.h"
#include
+#include
namespace Serialization {
diff --git a/src/core/address_space.cpp b/src/core/address_space.cpp
index 758c7240c..ca3d52042 100644
--- a/src/core/address_space.cpp
+++ b/src/core/address_space.cpp
@@ -1,14 +1,14 @@
-// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
+// SPDX-FileCopyrightText: Copyright 2024-2026 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include