diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index ffb5d5f8b..45f233dff 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -22,7 +22,7 @@ body:
id: log
attributes:
label: Log file
- description: A log file will help our developers to better diagnose and fix the issue.
+ description: "A log file will help our developers to better diagnose and fix the issue. UPLOAD THE FILE. DO NOT COPY AND PASTE THE FILE'S CONTENT."
placeholder: Logs files can be found under "Logs" folder in Ryujinx program folder. They can also be accessed by opening Ryujinx, then going to File > Open Logs Folder. You can drag and drop the log on to the text area (do not copy paste).
validations:
required: true
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 871f9945f..ac3c77288 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -32,7 +32,7 @@ kernel:
infra:
- changed-files:
- - any-glob-to-any-file: ['.github/**', 'distribution/**', 'Directory.Packages.props']
+ - any-glob-to-any-file: ['.github/**', 'distribution/**', 'Directory.Packages.props', 'src/Ryujinx.BuildValidationTasks/**']
documentation:
- changed-files:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 21dc3eb0b..0472fd5f7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -64,14 +64,9 @@ jobs:
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
- - name: Publish Ryujinx.Headless.SDL2
- run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained
- if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
-
- name: Set executable bit
run: |
chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh
- chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
- name: Build AppImage
@@ -119,13 +114,6 @@ jobs:
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage
path: publish_appimage
- - name: Upload Ryujinx.Headless.SDL2 artifact
- uses: actions/upload-artifact@v4
- with:
- name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
- path: publish_sdl2_headless
- if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
-
build_macos:
name: macOS Universal (${{ matrix.configuration }})
runs-on: ubuntu-latest
@@ -141,11 +129,11 @@ jobs:
with:
global-json-file: global.json
- - name: Setup LLVM 14
+ - name: Setup LLVM 17
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 14
+ sudo ./llvm.sh 17
- name: Install rcodesign
run: |
@@ -171,20 +159,9 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER"
- - name: Publish macOS Ryujinx.Headless.SDL2
- run: |
- ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER"
-
- name: Upload Ryujinx artifact
uses: actions/upload-artifact@v4
with:
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
path: "publish/*.tar.gz"
if: github.event_name == 'pull_request'
-
- - name: Upload Ryujinx.Headless.SDL2 artifact
- uses: actions/upload-artifact@v4
- with:
- name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
- path: "publish_headless/*.tar.gz"
- if: github.event_name == 'pull_request'
diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml
index b352e82d7..433e65cb2 100644
--- a/.github/workflows/canary.yml
+++ b/.github/workflows/canary.yml
@@ -21,9 +21,9 @@ env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
RYUJINX_BASE_VERSION: "1.2"
RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "canary"
- RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev"
+ RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Ryubing"
RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO: "Ryujinx"
- RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx-Canary"
+ RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Canary-Releases"
RELEASE: 1
jobs:
@@ -43,8 +43,8 @@ jobs:
with:
script: |
github.rest.git.createRef({
- owner: context.repo.owner,
- repo: context.repo.repo,
+ owner: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}",
+ repo: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}",
ref: 'refs/tags/Canary-${{ steps.version_info.outputs.build_version }}',
sha: context.sha
})
@@ -61,10 +61,10 @@ jobs:
| Platform | Artifact |
|--|--|
- | Windows 64 bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
- | Linux 64 bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
- | Linux arm 64 bit | [Canary Linux arm Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
- | macOS | [Canary macOS artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
+ | Windows 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
+ | Linux 64-bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
+ | Linux ARM 64-bit | [Canary Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
+ | macOS | [Canary macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
**Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}
omitBodyDuringUpdate: true
@@ -108,6 +108,7 @@ jobs:
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
+ sed -r --in-place '/^Name=Ryujinx$/s/Name=Ryujinx/Name=Ryujinx-Canary/' distribution/linux/Ryujinx.desktop
shell: bash
- name: Create output dir
@@ -115,97 +116,83 @@ jobs:
- name: Publish
run: |
- dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
- dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained
+ dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
- name: Packing Windows builds
if: matrix.platform.os == 'windows-latest'
run: |
- pushd publish_ava
- rm publish/libarmeilleure-jitsupport.dylib
- 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
- popd
-
- pushd publish_sdl2_headless
- rm publish/libarmeilleure-jitsupport.dylib
- 7z a ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
+ pushd publish
+ rm libarmeilleure-jitsupport.dylib
+ 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
popd
shell: bash
- name: Packing Linux builds
if: matrix.platform.os == 'ubuntu-latest'
run: |
- pushd publish_ava
- rm publish/libarmeilleure-jitsupport.dylib
- chmod +x publish/Ryujinx.sh publish/Ryujinx
- tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
- popd
-
- pushd publish_sdl2_headless
- rm publish/libarmeilleure-jitsupport.dylib
- chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2
- tar -czvf ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
+ pushd publish
+ rm libarmeilleure-jitsupport.dylib
+ chmod +x Ryujinx.sh Ryujinx
+ tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
popd
shell: bash
- #- name: Build AppImage (Linux)
- # if: matrix.platform.os == 'ubuntu-latest'
- # run: |
- # BUILD_VERSION="${{ steps.version_info.outputs.build_version }}"
- # PLATFORM_NAME="${{ matrix.platform.name }}"
+ - name: Build AppImage (Linux)
+ if: matrix.platform.os == 'ubuntu-latest'
+ run: |
+ BUILD_VERSION="${{ steps.version_info.outputs.build_version }}"
+ PLATFORM_NAME="${{ matrix.platform.name }}"
- # sudo apt install -y zsync desktop-file-utils appstream
+ sudo apt install -y zsync desktop-file-utils appstream
- # mkdir -p tools
- # export PATH="$PATH:$(readlink -f tools)"
+ mkdir -p tools
+ export PATH="$PATH:$(readlink -f tools)"
# Setup appimagetool
- # wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
- # chmod +x tools/appimagetool
- # chmod +x distribution/linux/appimage/build-appimage.sh
+ wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
+ chmod +x tools/appimagetool
+ chmod +x distribution/linux/appimage/build-appimage.sh
# Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
- # if [ "$PLATFORM_NAME" = "linux-x64" ]; then
- # ARCH_NAME=x64
- # export ARCH=x86_64
- # elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
- # ARCH_NAME=arm64
- # export ARCH=aarch64
- # else
- # echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
- # exit 1
- # fi
+ if [ "$PLATFORM_NAME" = "linux-x64" ]; then
+ ARCH_NAME=x64
+ export ARCH=x86_64
+ elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
+ ARCH_NAME=arm64
+ export ARCH=aarch64
+ else
+ echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
+ exit 1
+ fi
- # export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
- # BUILDDIR=publish_ava OUTDIR=publish_ava_appimage distribution/linux/appimage/build-appimage.sh
+ export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|Canary-Releases|latest|*-$ARCH_NAME.AppImage.zsync"
+ BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh
- # Add to release output
- # pushd publish_ava_appimage
- # mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage
- # mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync
- # popd
- # shell: bash
+ pushd publish_appimage
+ mv Ryujinx.AppImage ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage
+ mv Ryujinx.AppImage.zsync ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync
+ popd
+ shell: bash
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
- artifacts: "release_output/*.tar.gz,release_output/*.zip"
- #artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*"
+ artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*"
tag: ${{ steps.version_info.outputs.build_version }}
body: |
# Canary builds:
- These builds are experimental and may sometimes not work, use [regular builds](https://github.com/GreemDev/Ryujinx/releases/latest) instead if that sounds like something you don't want to deal with.
-
+ These builds are experimental and may sometimes not work, use [regular builds](https://github.com/${{ github.repository }}/releases/latest) instead if that sounds like something you don't want to deal with.
+
| Platform | Artifact |
|--|--|
- | Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
- | Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
- | Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
- | Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
+ | Windows 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
+ | Linux 64-bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
+ | Linux ARM 64-bit | [Canary Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
+ | macOS | [Canary macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
- "**Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
+ **Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
@@ -223,11 +210,11 @@ jobs:
with:
global-json-file: global.json
- - name: Setup LLVM 15
+ - name: Setup LLVM 17
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 15
+ sudo ./llvm.sh 17
- name: Install rcodesign
run: |
@@ -262,29 +249,13 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1
- - name: Publish macOS Ryujinx.Headless.SDL2
- run: |
- ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1
-
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: "Canary ${{ steps.version_info.outputs.build_version }}"
- artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz"
+ artifacts: "publish_ava/*.tar.gz"
tag: ${{ steps.version_info.outputs.build_version }}
- body: |
- # Canary builds:
-
- These builds are experimental and may sometimes not work, use [regular builds](https://github.com/GreemDev/Ryujinx/releases/latest) instead if that sounds like something you don't want to deal with.
-
- | Platform | Artifact |
- |--|--|
- | Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
- | Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
- | Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
- | Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
-
- "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
+ body: ""
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml
index 85a6e2de4..24d23d98b 100644
--- a/.github/workflows/nightly_pr_comment.yml
+++ b/.github/workflows/nightly_pr_comment.yml
@@ -38,20 +38,16 @@ jobs:
return core.error(`No artifacts found`);
}
let body = `Download the artifacts for this pull request:\n`;
- let hidden_headless_artifacts = `\n\n GUI-less
\n`;
let hidden_debug_artifacts = `\n\n Only for Developers
\n`;
for (const art of artifacts) {
- if(art.name.includes('Debug')) {
- hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
- } else if(art.name.includes('nogui-ryujinx')) {
- hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
+ const url = `https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip`;
+ if (art.name.includes('Debug')) {
+ hidden_debug_artifacts += `\n* [${art.name}](${url})`;
} else {
- body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
+ body += `\n* [${art.name}](${url})`;
}
}
- hidden_headless_artifacts += `\n `;
hidden_debug_artifacts += `\n `;
- body += hidden_headless_artifacts;
body += hidden_debug_artifacts;
const {data: comments} = await github.rest.issues.listComments({repo, owner, issue_number});
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 815321dfe..7e11f6edf 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -3,16 +3,6 @@ name: Release job
on:
workflow_dispatch:
inputs: {}
- push:
- branches: [ release ]
- paths-ignore:
- - '.github/**'
- - 'docs/**'
- - 'assets/**'
- - '*.yml'
- - '*.json'
- - '*.config'
- - '*.md'
concurrency: release
@@ -21,7 +11,7 @@ env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
RYUJINX_BASE_VERSION: "1.2"
RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release"
- RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev"
+ RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Ryubing"
RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx"
RELEASE: 1
@@ -42,8 +32,8 @@ jobs:
with:
script: |
github.rest.git.createRef({
- owner: context.repo.owner,
- repo: context.repo.repo,
+ owner: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}",
+ repo: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}",
ref: 'refs/tags/${{ steps.version_info.outputs.build_version }}',
sha: context.sha
})
@@ -54,13 +44,13 @@ jobs:
name: ${{ steps.version_info.outputs.build_version }}
tag: ${{ steps.version_info.outputs.build_version }}
body: |
- # Regular builds:
+ # Stable builds:
| Platform | Artifact |
|--|--|
- | Windows 64 bit | [Release Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
- | Linux 64 bit | [Release Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
- | Linux arm 64 bit | [Release Linux arm Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
- | macOS | [Release macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
+ | Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
+ | Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
+ | Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
+ | macOS | [Stable macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
**Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}
omitBodyDuringUpdate: true
@@ -112,7 +102,6 @@ jobs:
- name: Publish
run: |
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
- dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained
- name: Packing Windows builds
if: matrix.platform.os == 'windows-latest'
@@ -121,10 +110,14 @@ jobs:
rm libarmeilleure-jitsupport.dylib
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
popd
+ shell: bash
- pushd publish_sdl2_headless
- rm libarmeilleure-jitsupport.dylib
- 7z a ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
+ - name: Packing Linux builds
+ if: matrix.platform.os == 'ubuntu-latest'
+ run: |
+ pushd publish
+ chmod +x Ryujinx.sh Ryujinx
+ tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
popd
shell: bash
@@ -163,20 +156,6 @@ jobs:
mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage
mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync
popd
- shell: bash
-
- - name: Packing Linux builds
- if: matrix.platform.os == 'ubuntu-latest'
- run: |
- pushd publish
- chmod +x Ryujinx.sh Ryujinx
- tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
- popd
-
- pushd publish_sdl2_headless
- chmod +x Ryujinx.sh Ryujinx.Headless.SDL2
- tar -czvf ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
- popd
shell: bash
- name: Pushing new release
@@ -186,15 +165,15 @@ jobs:
artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*"
tag: ${{ steps.version_info.outputs.build_version }}
body: |
- # Regular builds:
+ # Stable builds:
| Platform | Artifact |
|--|--|
- | Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
- | Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
- | Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
- | Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
-
- "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
+ | Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
+ | Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
+ | Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
+ | macOS | [Stable macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
+
+ **Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
@@ -212,11 +191,11 @@ jobs:
with:
global-json-file: global.json
- - name: Setup LLVM 15
+ - name: Setup LLVM 17
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
- sudo ./llvm.sh 15
+ sudo ./llvm.sh 17
- name: Install rcodesign
run: |
@@ -251,26 +230,13 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
- - name: Publish macOS Ryujinx.Headless.SDL2
- run: |
- ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
-
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
- artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz"
+ artifacts: "publish/*.tar.gz"
tag: ${{ steps.version_info.outputs.build_version }}
- body: |
- # Regular builds:
- | Platform | Artifact |
- |--|--|
- | Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
- | Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
- | Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
- | Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
-
- "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
+ body: ""
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 93d212b07..c2ac358ed 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -3,18 +3,22 @@
true
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
+
@@ -22,7 +26,7 @@
-
+
@@ -38,15 +42,17 @@
-
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/Ryujinx.sln b/Ryujinx.sln
index d661b903c..9e197e85f 100644
--- a/Ryujinx.sln
+++ b/Ryujinx.sln
@@ -57,14 +57,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "src\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "src\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{D99A395A-8569-4DB0-B336-900647890052}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "src\Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "src\Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.UI.Common", "src\Ryujinx.UI.Common\Ryujinx.UI.Common.csproj", "{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Generators", "src\Ryujinx.Horizon.Generators\Ryujinx.Horizon.Generators.csproj", "{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Vulkan", "src\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj", "{D4D09B08-D580-4D69-B886-C35D2853F6C8}"
@@ -81,13 +77,22 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Gene
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Metal", "src\Ryujinx.Graphics.Metal\Ryujinx.Graphics.Metal.csproj", "{C08931FA-1191-417A-864F-3882D93E683B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {A602AE97-91A5-4608-8DF1-EBF4ED7A0B9E} = {A602AE97-91A5-4608-8DF1-EBF4ED7A0B9E}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Metal.SharpMetalExtensions", "src/Ryujinx.Graphics.Metal.SharpMetalExtensions\Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj", "{81EA598C-DBA1-40B0-8DA4-4796B78F2037}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
+ .github\workflows\build.yml = .github\workflows\build.yml
+ .github\workflows\canary.yml = .github\workflows\canary.yml
Directory.Packages.props = Directory.Packages.props
- .github/workflows/release.yml = .github/workflows/release.yml
- .github/workflows/canary.yml = .github/workflows/canary.yml
- .github/workflows/build.yml = .github/workflows/build.yml
+ .github\workflows\release.yml = .github\workflows\release.yml
EndProjectSection
EndProject
Global
@@ -204,10 +209,6 @@ Global
{D99A395A-8569-4DB0-B336-900647890052}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.Build.0 = Release|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.Build.0 = Release|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -216,10 +217,6 @@ Global
{7C1B2721-13DA-4B62-B046-C626605ECCE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C1B2721-13DA-4B62-B046-C626605ECCE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C1B2721-13DA-4B62-B046-C626605ECCE6}.Release|Any CPU.Build.0 = Release|Any CPU
- {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Release|Any CPU.Build.0 = Release|Any CPU
{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -252,6 +249,16 @@ Global
{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C08931FA-1191-417A-864F-3882D93E683B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C08931FA-1191-417A-864F-3882D93E683B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C08931FA-1191-417A-864F-3882D93E683B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C08931FA-1191-417A-864F-3882D93E683B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/distribution/linux/appimage/build-appimage.sh b/distribution/linux/appimage/build-appimage.sh
index 5c32d78a8..a9de4866b 100755
--- a/distribution/linux/appimage/build-appimage.sh
+++ b/distribution/linux/appimage/build-appimage.sh
@@ -6,14 +6,14 @@ cd "$ROOTDIR"
BUILDDIR=${BUILDDIR:-publish}
OUTDIR=${OUTDIR:-publish_appimage}
-UFLAG=${UFLAG:-"gh-releases-zsync|GreemDev|ryujinx|latest|*-x64.AppImage.zsync"}
+UFLAG=${UFLAG:-"gh-releases-zsync|Ryubing|ryujinx|latest|*-x64.AppImage.zsync"}
rm -rf AppDir
mkdir -p AppDir/usr/bin
cp distribution/linux/Ryujinx.desktop AppDir/Ryujinx.desktop
cp distribution/linux/appimage/AppRun AppDir/AppRun
-cp src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png AppDir/Ryujinx.svg
+cp distribution/misc/Logo.svg AppDir/Ryujinx.svg
cp -r "$BUILDDIR"/* AppDir/usr/bin/
diff --git a/distribution/macos/bundle_fix_up.py b/distribution/macos/bundle_fix_up.py
index a8e3ac760..273d7455d 100644
--- a/distribution/macos/bundle_fix_up.py
+++ b/distribution/macos/bundle_fix_up.py
@@ -19,7 +19,7 @@ if platform.system() == "Darwin":
else:
OTOOL = shutil.which("llvm-otool")
if OTOOL is None:
- for llvm_ver in [15, 14, 13]:
+ for llvm_ver in [17, 16, 15, 14, 13]:
otool_path = shutil.which(f"llvm-otool-{llvm_ver}")
if otool_path is not None:
OTOOL = otool_path
diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py
index b6c3770c6..5d9321860 100644
--- a/distribution/macos/construct_universal_dylib.py
+++ b/distribution/macos/construct_universal_dylib.py
@@ -26,7 +26,7 @@ else:
LIPO = shutil.which("llvm-lipo")
if LIPO is None:
- for llvm_ver in [15, 14, 13]:
+ for llvm_ver in [17, 16, 15, 14, 13]:
lipo_path = shutil.which(f"llvm-lipo-{llvm_ver}")
if lipo_path is not None:
LIPO = lipo_path
diff --git a/distribution/macos/create_macos_build_ava.sh b/distribution/macos/create_macos_build_ava.sh
index b19fa4863..de6fab358 100755
--- a/distribution/macos/create_macos_build_ava.sh
+++ b/distribution/macos/create_macos_build_ava.sh
@@ -67,11 +67,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_APP_
if ! [ -x "$(command -v lipo)" ];
then
- if ! [ -x "$(command -v llvm-lipo-14)" ];
+ if ! [ -x "$(command -v llvm-lipo-17)" ];
then
LIPO=llvm-lipo
else
- LIPO=llvm-lipo-14
+ LIPO=llvm-lipo-17
fi
else
LIPO=lipo
diff --git a/distribution/macos/create_macos_build_headless.sh b/distribution/macos/create_macos_build_headless.sh
index 01951d878..5de862a2f 100755
--- a/distribution/macos/create_macos_build_headless.sh
+++ b/distribution/macos/create_macos_build_headless.sh
@@ -62,11 +62,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_OUTP
if ! [ -x "$(command -v lipo)" ];
then
- if ! [ -x "$(command -v llvm-lipo-14)" ];
+ if ! [ -x "$(command -v llvm-lipo-17)" ];
then
LIPO=llvm-lipo
else
- LIPO=llvm-lipo-14
+ LIPO=llvm-lipo-17
fi
else
LIPO=lipo
diff --git a/distribution/misc/macOS.svg b/distribution/misc/macOS.svg
deleted file mode 100644
index 4bdd453a8..000000000
--- a/distribution/misc/macOS.svg
+++ /dev/null
@@ -1,61 +0,0 @@
-
diff --git a/docs/compatibility.csv b/docs/compatibility.csv
new file mode 100644
index 000000000..44a8188a1
--- /dev/null
+++ b/docs/compatibility.csv
@@ -0,0 +1,3424 @@
+"title_id","game_name","labels","status","last_updated"
+010099F00EF3E000,"-KLAUS-",nvdec,playable,2020-06-27 13:27:30
+0100BA9014A02000,".hack//G.U. Last Recode",deadlock,boots,2022-03-12 19:15:47
+010098800C4B0000,"'n Verlore Verstand",slow,ingame,2020-12-10 18:00:28
+01009A500E3DA000,"'n Verlore Verstand - Demo",,playable,2021-02-09 00:13:32
+0100A5D01174C000,"/Connection Haunted ",slow,playable,2020-12-10 18:57:14
+01001E500F7FC000,"#Funtime",,playable,2020-12-10 16:54:35
+01000E50134A4000,"#Halloween, Super Puzzles Dream",nvdec,playable,2020-12-10 20:43:58
+01004D100C510000,"#KILLALLZOMBIES",slow,playable,2020-12-16 01:50:25
+0100325012C12000,"#NoLimitFantasy, Super Puzzles Dream",nvdec,playable,2020-12-12 17:21:32
+01005D400E5C8000,"#RaceDieRun",,playable,2020-07-04 20:23:16
+01003DB011AE8000,"#womenUp, Super Puzzles Dream",,playable,2020-12-12 16:57:25
+0100D87012A14000,"#womenUp, Super Puzzles Dream Demo",nvdec,playable,2021-02-09 00:03:31
+01000320000CC000,"1-2-Switch™",services,playable,2022-02-18 14:44:03
+01004D1007926000,"10 Second Run RETURNS",gpu,ingame,2022-07-17 13:06:18
+0100DC000A472000,"10 Second Run RETURNS Demo",gpu,ingame,2021-02-09 00:17:18
+0100D82015774000,"112 Operator",nvdec,playable,2022-11-13 22:42:50
+010051E012302000,"112th Seed",,playable,2020-10-03 10:32:38
+01007F600D1B8000,"12 is Better Than 6",,playable,2021-02-22 16:10:12
+0100B1A010014000,"12 Labours of Hercules II: The Cretan Bull",cpu;32-bit;crash,nothing,2022-12-07 13:43:10
+0100A840047C2000,"12 orbits",,playable,2020-05-28 16:13:26
+01003FC01670C000,"13 Sentinels: Aegis Rim",slow,ingame,2024-06-10 20:33:38
+0100C54015002000,"13 Sentinels: Aegis Rim Demo",demo,playable,2022-04-13 14:15:48
+01007E600EEE6000,"140",,playable,2020-08-05 20:01:33
+0100B94013D28000,"16-Bit Soccer Demo",,playable,2021-02-09 00:23:07
+01005CA0099AA000,"1917 - The Alien Invasion DX",,playable,2021-01-08 22:11:16
+0100829010F4A000,"1971 Project Helios",,playable,2021-04-14 13:50:19
+0100D1000B18C000,"1979 Revolution: Black Friday",nvdec,playable,2021-02-21 21:03:43
+01007BB00FC8A000,"198X",,playable,2020-08-07 13:24:38
+010075601150A000,"1993 Shenandoah",,playable,2020-10-24 13:55:42
+0100148012550000,"1993 Shenandoah Demo",,playable,2021-02-09 00:43:43
+010096500EA94000,"2048 Battles",,playable,2020-12-12 14:21:25
+010024C0067C4000,"2064: Read Only Memories INTEGRAL",deadlock,menus,2020-05-28 16:53:58
+0100749009844000,"20XX",gpu,ingame,2023-08-14 09:41:44
+01007550131EE000,"2URVIVE",,playable,2022-11-17 13:49:37
+0100E20012886000,"2weistein – The Curse of the Red Dragon",nvdec;UE4,playable,2022-11-18 14:47:07
+0100DAC013D0A000,"30 in 1 game collection vol. 2",online-broken,playable,2022-10-15 17:22:27
+010056D00E234000,"30-in-1 Game Collection",online-broken,playable,2022-10-15 17:47:09
+0100FB5010D2E000,"3000th Duel",,playable,2022-09-21 17:12:08
+01003670066DE000,"36 Fragments of Midnight",,playable,2020-05-28 15:12:59
+0100AF400C4CE000,"39 Days to Mars",,playable,2021-02-21 22:12:46
+010010C013F2A000,"3D Arcade Fishing",,playable,2022-10-25 21:50:51
+01006DA00707C000,"3D MiniGolf",,playable,2021-01-06 09:22:11
+01006890126E4000,"4x4 Dirt Track",,playable,2020-12-12 21:41:42
+010010100FF14000,"60 Parsecs!",,playable,2022-09-17 11:01:17
+0100969005E98000,"60 Seconds!",services,ingame,2021-11-30 01:04:14
+0100ECF008474000,"6180 the moon",,playable,2020-05-28 15:39:24
+0100EFE00E964000,"64.0",,playable,2020-12-12 21:31:58
+0100DA900B67A000,"7 Billion Humans",32-bit,playable,2020-12-17 21:04:58
+01004B200DF76000,"7th Sector",nvdec,playable,2020-08-10 14:22:14
+0100E9F00B882000,"8-BIT ADV STEINS;GATE",audio,ingame,2020-01-12 15:05:06
+0100B0700E944000,"80 DAYS",,playable,2020-06-22 21:43:01
+01006B1011B9E000,"80's OVERDRIVE",,playable,2020-10-16 14:33:32
+010006A0042F0000,"88 Heroes - 98 Heroes Edition",,playable,2020-05-28 14:13:02
+010005E00E2BC000,"9 Monkeys of Shaolin",UE4;gpu;slow,ingame,2020-11-17 11:58:43
+0100C5F012E3E000,"9 Monkeys of Shaolin Demo",UE4;gpu;nvdec,ingame,2021-02-09 01:03:30
+01000360107BC000,"911 Operator Deluxe Edition",,playable,2020-07-14 13:57:44
+0100B2C00682E000,"99Vidas - Definitive Edition",online,playable,2020-10-29 13:00:40
+010023500C2F0000,"99Vidas Demo",,playable,2021-02-09 12:51:31
+0100DB00117BA000,"9th Dawn III",,playable,2020-12-12 22:27:27
+010096A00CC80000,"A Ch'ti Bundle",nvdec,playable,2022-10-04 12:48:44
+010021D00D53E000,"A Dark Room",gpu,ingame,2020-12-14 16:14:28
+010026B006802000,"A Duel Hand Disaster: Trackher",nvdec;online-working,playable,2022-09-04 14:24:55
+0100582012B90000,"A Duel Hand Disaster: Trackher DEMO",crash;demo;nvdec,ingame,2021-03-24 18:45:27
+01006CE0134E6000,"A Frog Game",,playable,2020-12-14 16:09:53
+010056E00853A000,"A Hat in Time",,playable,2024-06-25 19:52:44
+01009E1011EC4000,"A HERO AND A GARDEN",,playable,2022-12-05 16:37:47
+01005EF00CFDA000,"A Knight's Quest",UE4,playable,2022-09-12 20:44:20
+01008DD006C52000,"A Magical High School Girl",,playable,2022-07-19 14:40:50
+01004890117B2000,"A Short Hike",,playable,2020-10-15 00:19:58
+0100F0901006C000,"A Sound Plan",crash,boots,2020-12-14 16:46:21
+01007DD011C4A000,"A Summer with the Shiba Inu",,playable,2021-06-10 20:51:16
+0100A3E010E56000,"A-Train: All Aboard! Tourism",nvdec,playable,2021-04-06 17:48:19
+010097A00CC0A000,"Aaero: Complete Edition",nvdec,playable,2022-07-19 14:49:55
+0100EFC010398000,"Aborigenus",,playable,2020-08-05 19:47:24
+0100A5B010A66000,"Absolute Drift",,playable,2020-12-10 14:02:44
+0100C1300BBC6000,"ABZÛ",UE4,playable,2022-07-19 15:02:52
+01003C400871E000,"ACA NEOGEO 2020 SUPER BASEBALL",online,playable,2021-04-12 13:23:51
+0100FC000AFC6000,"ACA NEOGEO 3 COUNT BOUT",online,playable,2021-04-12 13:16:42
+0100AC40038F4000,"ACA NEOGEO AERO FIGHTERS 2",online,playable,2021-04-08 15:44:09
+0100B91008780000,"ACA NEOGEO AERO FIGHTERS 3",online,playable,2021-04-12 13:11:17
+0100B4800AFBA000,"ACA NEOGEO AGGRESSORS OF DARK KOMBAT",online,playable,2021-04-01 22:48:01
+01003FE00A2F6000,"ACA NEOGEO BASEBALL STARS PROFESSIONAL",online,playable,2021-04-01 21:23:05
+0100DFC003398000,"ACA NEOGEO BLAZING STAR",crash;services,menus,2020-05-26 17:29:02
+0100D2400AFB0000,"ACA NEOGEO CROSSED SWORDS",online,playable,2021-04-01 20:42:59
+0100EE6002B48000,"ACA NEOGEO FATAL FURY",online,playable,2021-04-01 20:36:23
+0100EEA00AFB2000,"ACA NEOGEO FOOTBALL FRENZY",,playable,2021-03-29 20:12:12
+0100CB2001DB8000,"ACA NEOGEO GAROU: MARK OF THE WOLVES",online,playable,2021-04-01 20:31:10
+01005D700A2F8000,"ACA NEOGEO GHOST PILOTS",online,playable,2021-04-01 20:26:45
+01000D10038E6000,"ACA NEOGEO LAST RESORT",online,playable,2021-04-01 19:51:22
+0100A2900AFA4000,"ACA NEOGEO LEAGUE BOWLING",crash;services,menus,2020-05-26 17:11:04
+0100A050038F2000,"ACA NEOGEO MAGICAL DROP II",crash;services,menus,2020-05-26 16:48:24
+01007920038F6000,"ACA NEOGEO MAGICIAN LORD",online,playable,2021-04-01 19:33:26
+0100EBE002B3E000,"ACA NEOGEO METAL SLUG",,playable,2021-02-21 13:56:48
+010086300486E000,"ACA NEOGEO METAL SLUG 2",online,playable,2021-04-01 19:25:52
+0100BA8001DC6000,"ACA NEOGEO METAL SLUG 3",crash;services,menus,2020-05-26 16:32:45
+01009CE00AFAE000,"ACA NEOGEO METAL SLUG 4",online,playable,2021-04-01 18:12:18
+01008FD004DB6000,"ACA NEOGEO METAL SLUG X",crash;services,menus,2020-05-26 14:07:20
+010038F00AFA0000,"ACA NEOGEO Money Puzzle Exchanger",online,playable,2021-04-01 17:59:56
+01002E70032E8000,"ACA NEOGEO NEO TURF MASTERS",,playable,2021-02-21 15:12:01
+010052A00A306000,"ACA NEOGEO NINJA COMBAT",,playable,2021-03-29 21:17:28
+01007E800AFB6000,"ACA NEOGEO NINJA COMMANDO",online,playable,2021-04-01 17:28:18
+01003A5001DBA000,"ACA NEOGEO OVER TOP",,playable,2021-02-21 13:16:25
+010088500878C000,"ACA NEOGEO REAL BOUT FATAL FURY SPECIAL",online,playable,2021-04-01 17:18:27
+01005C9002B42000,"ACA NEOGEO SAMURAI SHODOWN",online,playable,2021-04-01 17:11:35
+010047F001DBC000,"ACA NEOGEO SAMURAI SHODOWN IV",online,playable,2021-04-12 12:58:54
+010049F00AFE8000,"ACA NEOGEO SAMURAI SHODOWN V SPECIAL",online,playable,2021-04-10 18:07:13
+01009B300872A000,"ACA NEOGEO SENGOKU 2",online,playable,2021-04-10 17:36:44
+01008D000877C000,"ACA NEOGEO SENGOKU 3",online,playable,2021-04-10 16:11:53
+01008A9001DC2000,"ACA NEOGEO SHOCK TROOPERS",crash;services,menus,2020-05-26 15:29:34
+01007D1004DBA000,"ACA NEOGEO SPIN MASTER",online,playable,2021-04-10 15:50:19
+010055A00A300000,"ACA NEOGEO SUPER SIDEKICKS 2",online,playable,2021-04-10 16:05:58
+0100A4D00A308000,"ACA NEOGEO SUPER SIDEKICKS 3 : THE NEXT GLORY",online,playable,2021-04-10 15:39:22
+0100EB2001DCC000,"ACA NEOGEO THE KING OF FIGHTERS '94",crash;services,menus,2020-05-26 15:03:44
+01009DC001DB6000,"ACA NEOGEO THE KING OF FIGHTERS '95",,playable,2021-03-29 20:27:35
+01006F0004FB4000,"ACA NEOGEO THE KING OF FIGHTERS '96",online,playable,2021-04-10 14:49:10
+0100170008728000,"ACA NEOGEO THE KING OF FIGHTERS '97",online,playable,2021-04-10 14:43:27
+0100B42001DB4000,"ACA NEOGEO THE KING OF FIGHTERS '98",crash;services,menus,2020-05-26 14:54:20
+0100583001DCA000,"ACA NEOGEO THE KING OF FIGHTERS '99",online,playable,2021-04-10 14:36:56
+0100B97002B44000,"ACA NEOGEO THE KING OF FIGHTERS 2000",online,playable,2021-04-10 15:24:35
+010048200AFC2000,"ACA NEOGEO THE KING OF FIGHTERS 2001",online,playable,2021-04-10 15:16:23
+0100CFD00AFDE000,"ACA NEOGEO THE KING OF FIGHTERS 2002",online,playable,2021-04-10 15:01:55
+0100EF100AFE6000,"ACA NEOGEO THE KING OF FIGHTERS 2003",online,playable,2021-04-10 14:54:31
+0100699008792000,"ACA NEOGEO THE LAST BLADE 2",online,playable,2021-04-10 14:31:54
+0100F7F00AFA2000,"ACA NEOGEO THE SUPER SPY",online,playable,2021-04-10 14:26:33
+0100CEF001DC0000,"ACA NEOGEO WAKU WAKU 7",online,playable,2021-04-10 14:20:52
+01009D4001DC4000,"ACA NEOGEO WORLD HEROES PERFECT",crash;services,menus,2020-05-26 14:14:36
+01002E700AFC4000,"ACA NEOGEO ZUPAPA!",online,playable,2021-03-25 20:07:33
+0100A9900CB5C000,"Access Denied",,playable,2022-07-19 15:25:10
+01007C50132C8000,"Ace Angler: Fishing Spirits",crash,menus,2023-03-03 03:21:39
+010005501E68C000,"Ace Attorney Investigations Collection",,playable,2024-09-19 16:38:05
+010033401E68E000,"Ace Attorney Investigations Collection DEMO",,playable,2024-09-07 06:16:42
+010039301B7E0000,"Ace Combat 7 - Skies Unknown Deluxe Edition",gpu;UE4,ingame,2024-09-27 14:31:43
+0100FF1004D56000,"Ace of Seafood",,playable,2022-07-19 15:32:25
+0100B28003440000,"Aces of the Luftwaffe - Squadron",nvdec;slow,playable,2020-05-27 12:29:42
+010054300D822000,"Aces of the Luftwaffe - Squadron Demo",nvdec,playable,2021-02-09 13:12:28
+010079B00B3F4000,"Achtung! Cthulhu Tactics",,playable,2020-12-14 18:40:27
+0100DBC0081A4000,"ACORN Tactics",,playable,2021-02-22 12:57:40
+010043C010AEA000,"Across the Grooves",,playable,2020-06-27 12:29:51
+010039A010DA0000,"Active Neurons - Puzzle game",,playable,2021-01-27 21:31:21
+01000D1011EF0000,"Active Neurons 2",,playable,2022-10-07 16:21:42
+010031C0122B0000,"Active Neurons 2 Demo",,playable,2021-02-09 13:40:21
+0100EE1013E12000,"Active Neurons 3 - Wonders Of The World",,playable,2021-03-24 12:20:20
+0100CD40104DE000,"Actual Sunlight",gpu,ingame,2020-12-14 17:18:41
+0100C0C0040E4000,"Adam's Venture™: Origins",,playable,2021-03-04 18:43:57
+010029700EB76000,"Adrenaline Rush - Miami Drive",,playable,2020-12-12 22:49:50
+0100300012F2A000,"Advance Wars™ 1+2: Re-Boot Camp",,playable,2024-01-30 18:19:44
+010014B0130F2000,"Adventure Llama",,playable,2020-12-14 19:32:24
+0100C990102A0000,"Adventure Pinball Bundle",slow,playable,2020-12-14 20:31:53
+0100C4E004406000,"Adventure Time: Pirates of the Enchiridion",nvdec,playable,2022-07-21 21:49:01
+010021F00C1C0000,"Adventures of Bertram Fiddle Episode 2: A Bleaker Predicklement",nvdec,playable,2021-02-22 14:56:37
+010072601233C000,"Adventures of Chris",,playable,2020-12-12 23:00:02
+0100A0A0136E8000,"Adventures of Chris Demo",,playable,2021-02-09 13:49:21
+01002B5012004000,"Adventures of Pip",nvdec,playable,2020-12-12 22:11:55
+01008C901266E000,"ADVERSE",UE4,playable,2021-04-26 14:32:51
+01008E6006502000,"Aegis Defenders",,playable,2021-02-22 13:29:33
+010064500AF72000,"Aegis Defenders demo",,playable,2021-02-09 14:04:17
+010001C011354000,"Aeolis Tournament",online,playable,2020-12-12 22:02:14
+01006710122CE000,"Aeolis Tournament Demo",nvdec,playable,2021-02-09 14:22:30
+0100A0400DDE0000,"AER Memories of Old",nvdec,playable,2021-03-05 18:43:43
+0100E9B013D4A000,"Aerial_Knight's Never Yield",,playable,2022-10-25 22:05:00
+0100087012810000,"Aery - Broken Memories",,playable,2022-10-04 13:11:52
+01000A8015390000,"Aery - Calm Mind",,playable,2022-11-14 14:26:58
+0100875011D0C000,"Aery - Little Bird Adventure",,playable,2021-03-07 15:25:51
+010018E012914000,"Aery - Sky Castle",,playable,2022-10-21 17:58:49
+0100DF8014056000,"Aery – A Journey Beyond Time",,playable,2021-04-05 15:52:25
+01006C40086EA000,"AeternoBlade",nvdec,playable,2020-12-14 20:06:48
+0100B1C00949A000,"AeternoBlade Demo",nvdec,playable,2021-02-09 14:39:26
+01009D100EA28000,"AeternoBlade II",online-broken;UE4;vulkan-backend-bug,playable,2022-09-12 21:11:18
+,"AeternoBlade II Demo Version",gpu;nvdec,ingame,2021-02-09 15:10:19
+01001B400D334000,"AFL Evolution 2",slow;online-broken;UE4,playable,2022-12-07 12:45:56
+0100DB100BBCE000,"Afterparty",,playable,2022-09-22 12:23:19
+010087C011C4E000,"Agatha Christie - The ABC Murders",,playable,2020-10-27 17:08:23
+010093600A60C000,"Agatha Knife",,playable,2020-05-28 12:37:58
+010005400A45E000,"Agent A: A puzzle in disguise",,playable,2020-11-16 22:53:27
+01008E8012C02000,"Agent A: A puzzle in disguise (Demo)",,playable,2021-02-09 18:30:41
+0100E4700E040000,"Ages of Mages: The last keeper",vulkan-backend-bug,playable,2022-10-04 11:44:05
+010004D00A9C0000,"Aggelos",gpu,ingame,2023-02-19 13:24:23
+010072600D21C000,"Agony",UE4;crash,boots,2020-07-10 16:21:18
+010089B00D09C000,"AI: THE SOMNIUM FILES",nvdec,playable,2022-09-04 14:45:06
+0100C1700FB34000,"AI: THE SOMNIUM FILES Demo",nvdec,playable,2021-02-10 12:52:33
+01006E8011C1E000,"Ailment",,playable,2020-12-12 22:30:41
+0100C7600C7D6000,"Air Conflicts: Pacific Carriers",,playable,2021-01-04 10:52:50
+010005A00A4F4000,"Air Hockey",,playable,2020-05-28 16:44:37
+0100C9E00F54C000,"Air Missions: HIND",,playable,2020-12-13 10:16:45
+0100E95011FDC000,"Aircraft Evolution",nvdec,playable,2021-06-14 13:30:18
+010010A00DB72000,"Airfield Mania Demo",services;demo,boots,2022-04-10 03:43:02
+01003DD00BFEE000,"Airheart - Tales of broken Wings",,playable,2021-02-26 15:20:27
+01007F100DE52000,"Akane",nvdec,playable,2022-07-21 00:12:18
+01009A800F0C8000,"Akash: Path of the Five",gpu;nvdec,ingame,2020-12-14 22:33:12
+010053100B0EA000,"Akihabara - Feel the Rhythm Remixed",,playable,2021-02-22 14:39:35
+0100D4C00EE0C000,"Akuarium",slow,playable,2020-12-12 23:43:36
+010026E00FEBE000,"Akuto: Showdown",,playable,2020-08-04 19:43:27
+0100F5400AB6C000,"Alchemic Jousts",gpu,ingame,2022-12-08 15:06:28
+010001E00F75A000,"Alchemist's Castle",,playable,2020-12-12 23:54:08
+01004510110C4000,"Alder's Blood Prologue",crash,ingame,2021-02-09 19:03:03
+0100D740110C0000,"Alder's Blood: Definitive Edition",,playable,2020-08-28 15:15:23
+01000E000EEF8000,"Aldred Knight",services,playable,2021-11-30 01:49:17
+010025D01221A000,"Alex Kidd in Miracle World DX",,playable,2022-11-14 15:01:34
+0100A2E00D0E0000,"Alien Cruise",,playable,2020-08-12 13:56:05
+0100C1500DBDE000,"Alien Escape",,playable,2020-06-03 23:43:18
+010075D00E8BA000,"Alien: Isolation",nvdec;vulkan-backend-bug,playable,2022-09-17 11:48:41
+0100CBD012FB6000,"All Walls Must Fall",UE4,playable,2022-10-15 19:16:30
+0100C1F00A9B8000,"All-Star Fruit Racing",nvdec;UE4,playable,2022-07-21 00:35:37
+0100AC501122A000,"Alluris",gpu;UE4,ingame,2023-08-02 23:13:50
+010063000C3CE000,"Almightree: The Last Dreamer",slow,playable,2020-12-15 13:59:03
+010083E010AE8000,"Along the Edge",,playable,2020-11-18 15:00:07
+010083E013188000,"Alpaca Ball: Allstars",nvdec,playable,2020-12-11 12:26:29
+01000A800B998000,"ALPHA",,playable,2020-12-13 12:17:45
+010053B0123DC000,"Alphaset by POWGI",,playable,2020-12-15 15:15:15
+01003E700FD66000,"Alt-Frequencies",,playable,2020-12-15 19:01:33
+01004DB00935A000,"Alteric",,playable,2020-11-08 13:53:22
+0100C3D00D1D4000,"Alternate Jake Hunter: DAEDALUS The Awakening of Golden Jazz",,playable,2020-08-31 14:17:42
+0100A8A00D27E000,"Alternate Jake Hunter: DAEDALUS The Awakening of Golden Jazz Trial version",,playable,2021-02-10 13:33:59
+010045201487C000,"Aluna: Sentinel of the Shards",nvdec,playable,2022-10-25 22:17:03
+01004C200B0B4000,"Alwa's Awakening",,playable,2020-10-13 11:52:01
+01001B7012214000,"Alwa's Legacy",,playable,2020-12-13 13:00:57
+010002B00C534000,"American Fugitive",nvdec,playable,2021-01-04 20:45:11
+010089D00A3FA000,"American Ninja Warrior: Challenge",nvdec,playable,2021-06-09 13:11:17
+01003CC00D0BE000,"Amnesia: Collection",,playable,2022-10-04 13:36:15
+010041D00DEB2000,"Amoeba Battle - Microscopic RTS Action",,playable,2021-05-06 13:33:41
+010046500C8D2000,"Among the Sleep - Enhanced Edition",nvdec,playable,2021-06-03 15:06:25
+0100B0C013912000,"Among Us",online;ldn-broken,menus,2021-09-22 15:20:17
+010050900E1C6000,"Anarcute",,playable,2021-02-22 13:17:59
+01009EE0111CC000,"Ancestors Legacy",nvdec;UE4,playable,2022-10-01 12:25:36
+010021700BC56000,"Ancient Rush 2",UE4;crash,menus,2020-07-14 14:58:47
+0100AE000AEBC000,"Angels of Death",nvdec,playable,2021-02-22 14:17:15
+010001E00A5F6000,"AngerForce: Reloaded for Nintendo Switch",,playable,2022-07-21 10:37:17
+0100F3500D05E000,"Angry Bunnies: Colossal Carrot Crusade",online-broken,playable,2022-09-04 14:53:26
+010084500C7DC000,"Angry Video Game Nerd I & II Deluxe",crash,ingame,2020-12-12 23:59:54
+0100706005B6A000,"Anima: Gate of Memories",nvdec,playable,2021-06-16 18:13:18
+010033F00B3FA000,"Anima: Gate of Memories - Arcane Edition",nvdec,playable,2021-01-26 16:55:51
+01007A400B3F8000,"Anima: Gate of Memories - The Nameless Chronicles",,playable,2021-06-14 14:33:06
+0100F38011CFE000,"Animal Crossing: New Horizons Island Transfer Tool",services;Needs Update;Incomplete,ingame,2022-12-07 13:51:19
+01006F8002326000,"Animal Crossing™: New Horizons",gpu;crash;nvdec;online-broken;ldn-works;mac-bug,ingame,2024-09-23 13:31:49
+010019500E642000,"Animal Fight Club",gpu,ingame,2020-12-13 13:13:33
+01002F4011A8E000,"Animal Fun for Toddlers and Kids",services,boots,2020-12-15 16:45:29
+010035500CA0E000,"Animal Hunter Z",,playable,2020-12-13 12:50:35
+010033C0121DC000,"Animal Pairs - Matching & Concentration Game for Toddlers & Kids",services,boots,2021-11-29 23:43:14
+010065B009B3A000,"Animal Rivals: Nintendo Switch Edition",,playable,2021-02-22 14:02:42
+0100EFE009424000,"Animal Super Squad",UE4,playable,2021-04-23 20:50:50
+0100A16010966000,"Animal Up!",,playable,2020-12-13 15:39:02
+010020D01AD24000,"ANIMAL WELL",,playable,2024-05-22 18:01:49
+0100451012492000,"Animals for Toddlers",services,boots,2020-12-15 17:27:27
+010098600CF06000,"Animated Jigsaws Collection",nvdec,playable,2020-12-15 15:58:34
+0100A1900B5B8000,"Animated Jigsaws: Beautiful Japanese Scenery Demo",nvdec,playable,2021-02-10 13:49:56
+010062500EB84000,"Anime Studio Story",,playable,2020-12-15 18:14:05
+01002B300EB86000,"Anime Studio Story Demo",,playable,2021-02-10 14:50:39
+010097600C322000,"ANIMUS",,playable,2020-12-13 15:11:47
+0100E5A00FD38000,"ANIMUS: Harbinger",,playable,2022-09-13 22:09:20
+010055500CCD2000,"Ankh Guardian - Treasure of the Demon's Temple",,playable,2020-12-13 15:55:49
+01009E600D78C000,"Anode",,playable,2020-12-15 17:18:58
+0100CB9018F5A000,"Another Code™: Recollection",gpu;crash,ingame,2024-09-06 05:58:52
+01001A900D312000,"Another Sight",UE4;gpu;nvdec,ingame,2020-12-03 16:49:59
+01003C300AAAE000,"Another World",slow,playable,2022-07-21 10:42:38
+01000FD00DF78000,"AnShi",nvdec;UE4,playable,2022-10-21 19:37:01
+010054C00D842000,"Anthill",services;nvdec,menus,2021-11-18 09:25:25
+0100596011E20000,"Anti Hero Bundle",nvdec,playable,2022-10-21 20:10:30
+0100016007154000,"Antiquia Lost",,playable,2020-05-28 11:57:32
+0100FE1011400000,"AntVentor",nvdec,playable,2020-12-15 20:09:27
+0100FA100620C000,"Ao no Kanata no Four Rhythm",,playable,2022-07-21 10:50:42
+010047000E9AA000,"AO Tennis 2",online-broken,playable,2022-09-17 12:05:07
+0100990011866000,"Aokana - Four Rhythms Across the Blue",,playable,2022-10-04 13:50:26
+01005B100C268000,"Ape Out",,playable,2022-09-26 19:04:47
+010054500E6D4000,"Ape Out DEMO",,playable,2021-02-10 14:33:06
+010051C003A08000,"Aperion Cyberstorm",,playable,2020-12-14 00:40:16
+01008CA00D71C000,"Aperion Cyberstorm [DEMO]",,playable,2021-02-10 15:53:21
+01008FC00C5BC000,"Apocalipsis Wormwood Edition",deadlock,menus,2020-05-27 12:56:37
+010045D009EFC000,"Apocryph: an old-school shooter",gpu,ingame,2020-12-13 23:24:10
+010020D01B890000,"Apollo Justice: Ace Attorney Trilogy",,playable,2024-06-21 21:54:27
+01005F20116A0000,"Apparition",nvdec;slow,ingame,2020-12-13 23:57:04
+0100AC10085CE000,"AQUA KITTY UDX",online,playable,2021-04-12 15:34:11
+0100FE0010886000,"Aqua Lungers",crash,ingame,2020-12-14 11:25:57
+0100D0D00516A000,"Aqua Moto Racing Utopia",,playable,2021-02-21 21:21:00
+010071800BA74000,"Aragami: Shadow Edition",nvdec,playable,2021-02-21 20:33:23
+0100C7D00E6A0000,"Arc of Alchemist",nvdec,playable,2022-10-07 19:15:54
+0100BE80097FA000,"Arcade Archives 10-Yard Fight",online,playable,2021-03-25 21:26:41
+01005DD00BE08000,"Arcade Archives ALPHA MISSION",online,playable,2021-04-15 09:20:43
+010083800DC70000,"Arcade Archives ALPINE SKI",online,playable,2021-04-15 09:28:46
+0100A5700AF32000,"Arcade Archives ARGUS",online,playable,2021-04-16 06:51:25
+010014F001DE2000,"Arcade Archives Armed F",online,playable,2021-04-16 07:00:17
+0100BEC00C7A2000,"Arcade Archives ATHENA",online,playable,2021-04-16 07:10:12
+0100426001DE4000,"Arcade Archives Atomic Robo-Kid",online,playable,2021-04-16 07:20:29
+0100192009824000,"Arcade Archives BOMB JACK",online,playable,2021-04-16 09:48:26
+010007A00980C000,"Arcade Archives City CONNECTION",online,playable,2021-03-25 22:16:15
+0100EDC00E35A000,"Arcade Archives CLU CLU LAND",online,playable,2021-04-16 10:00:42
+0100BB1001DD6000,"Arcade Archives CRAZY CLIMBER",online,playable,2021-03-25 22:24:15
+0100E9E00B052000,"Arcade Archives DONKEY KONG",Needs Update;crash;services,menus,2021-03-24 18:18:43
+0100F25001DD0000,"Arcade Archives DOUBLE DRAGON",online,playable,2021-03-25 22:44:34
+01009E3001DDE000,"Arcade Archives DOUBLE DRAGON II The Revenge",online,playable,2021-04-12 16:05:29
+0100496006EC8000,"Arcade Archives FRONT LINE",online,playable,2021-05-05 14:10:49
+01009A4008A30000,"Arcade Archives HEROIC EPISODE",online,playable,2021-03-25 23:01:26
+01007D200D3FC000,"Arcade Archives ICE CLIMBER",online,playable,2021-05-05 14:18:34
+010049400C7A8000,"Arcade Archives IKARI WARRIORS",online,playable,2021-05-05 14:24:46
+01000DB00980A000,"Arcade Archives Ikki",online,playable,2021-03-25 23:11:28
+010008300C978000,"Arcade Archives IMAGE FIGHT",online,playable,2021-05-05 14:31:21
+010010B008A36000,"Arcade Archives Kid Niki Radical Ninja",audio;online,ingame,2022-07-21 11:02:04
+0100E7C001DE0000,"Arcade Archives Kid's Horehore Daisakusen",online,playable,2021-04-12 16:21:29
+0100F380105A4000,"Arcade Archives LIFE FORCE",,playable,2020-09-04 13:26:25
+0100755004608000,"Arcade Archives Mario Bros.",online,playable,2021-03-26 11:31:32
+01000BE001DD8000,"Arcade Archives MOON CRESTA",online,playable,2021-05-05 14:39:29
+01003000097FE000,"Arcade Archives MOON PATROL",online,playable,2021-03-26 11:42:04
+01003EF00D3B4000,"Arcade Archives NINJA GAIDEN",audio;online,ingame,2021-04-12 16:27:53
+01002F300D2C6000,"Arcade Archives Ninja Spirit",online,playable,2021-05-05 14:45:31
+0100369001DDC000,"Arcade Archives Ninja-Kid",online,playable,2021-03-26 20:55:07
+01004A200BB48000,"Arcade Archives OMEGA FIGHTER",crash;services,menus,2020-08-18 20:50:54
+01007F8010C66000,"Arcade Archives PLUS ALPHA",audio,ingame,2020-07-04 20:47:55
+0100A6E00D3F8000,"Arcade Archives POOYAN",online,playable,2021-05-05 17:58:19
+01000D200C7A4000,"Arcade Archives PSYCHO SOLDIER",online,playable,2021-05-05 18:02:19
+01001530097F8000,"Arcade Archives PUNCH-OUT!!",online,playable,2021-03-25 22:10:55
+010081E001DD2000,"Arcade Archives Renegade",online,playable,2022-07-21 11:45:40
+0100FBA00E35C000,"Arcade Archives ROAD FIGHTER",online,playable,2021-05-05 18:09:17
+010060000BF7C000,"Arcade Archives ROUTE 16",online,playable,2021-05-05 18:40:41
+0100C2D00981E000,"Arcade Archives RYGAR",online,playable,2021-04-15 08:48:30
+01007A4009834000,"Arcade Archives Shusse Ozumo",online,playable,2021-05-05 17:52:25
+010008F00B054000,"Arcade Archives Sky Skipper",online,playable,2021-04-15 08:58:09
+01008C900982E000,"Arcade Archives Solomon's Key",online,playable,2021-04-19 16:27:18
+010069F008A38000,"Arcade Archives STAR FORCE",online,playable,2021-04-15 08:39:09
+0100422001DDA000,"Arcade Archives TERRA CRESTA",crash;services,menus,2020-08-18 20:20:55
+0100348001DE6000,"Arcade Archives TERRA FORCE",online,playable,2021-04-16 20:03:27
+0100DFD016B7A000,"Arcade Archives TETRIS® THE GRAND MASTER",,playable,2024-06-23 01:50:29
+0100DC000983A000,"Arcade Archives THE NINJA WARRIORS",online;slow,ingame,2021-04-16 19:54:56
+0100AF300D2E8000,"Arcade Archives TIME PILOT",online,playable,2021-04-16 19:22:31
+010029D006ED8000,"Arcade Archives Traverse USA",online,playable,2021-04-15 08:11:06
+010042200BE0C000,"Arcade Archives URBAN CHAMPION",online,playable,2021-04-16 10:20:03
+01004EC00E634000,"Arcade Archives VS. GRADIUS",online,playable,2021-04-12 14:53:58
+010021D00812A000,"Arcade Archives VS. SUPER MARIO BROS.",online,playable,2021-04-08 14:48:11
+01001B000D8B6000,"Arcade Archives WILD WESTERN",online,playable,2021-04-16 10:11:36
+010050000D6C4000,"Arcade Classics Anniversary Collection",,playable,2021-06-03 13:55:10
+01005A8010C7E000,"ARCADE FUZZ",,playable,2020-08-15 12:37:36
+010077000F620000,"Arcade Spirits",,playable,2020-06-21 11:45:03
+0100E680149DC000,"Arcaea",,playable,2023-03-16 19:31:21
+01003C2010C78000,"Archaica: The Path Of Light",crash,nothing,2020-10-16 13:22:26
+01004DA012976000,"Area 86",,playable,2020-12-16 16:45:52
+0100691013C46000,"ARIA CHRONICLE",,playable,2022-11-16 13:50:55
+0100D4A00B284000,"ARK: Survival Evolved",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2024-04-16 00:53:56
+0100C56012C96000,"Arkanoid vs. Space Invaders",services,ingame,2021-01-21 12:50:30
+010069A010606000,"Arkham Horror: Mother's Embrace",nvdec,playable,2021-04-19 15:40:55
+0100C5B0113A0000,"Armed 7 DX",,playable,2020-12-14 11:49:56
+010070A00A5F4000,"Armello",nvdec,playable,2021-01-07 11:43:26
+0100A5400AC86000,"ARMS Demo",,playable,2021-02-10 16:30:13
+01009B500007C000,"ARMS™",ldn-works;LAN,playable,2024-08-28 07:49:24
+0100184011B32000,"Arrest of a stone Buddha",crash,nothing,2022-12-07 16:55:00
+01007AB012102000,"Arrog",,playable,2020-12-16 17:20:50
+01008EC006BE2000,"Art of Balance",gpu;ldn-works,ingame,2022-07-21 17:13:57
+010062F00CAE2000,"Art of Balance DEMO",gpu;slow,ingame,2021-02-10 17:17:12
+01006AA013086000,"Art Sqool",nvdec,playable,2022-10-16 20:42:37
+0100CDD00DA70000,"Artifact Adventure Gaiden DX",,playable,2020-12-16 17:49:25
+0100C2500CAB6000,"Ary and the Secret of Seasons",,playable,2022-10-07 20:45:09
+0100C9F00AAEE000,"ASCENDANCE",,playable,2021-01-05 10:54:40
+0100D5800DECA000,"Asemblance",UE4;gpu,ingame,2020-12-16 18:01:23
+0100E4C00DE30000,"Ash of Gods: Redemption",deadlock,nothing,2020-08-10 18:08:32
+010027B00E40E000,"Ashen",nvdec;online-broken;UE4,playable,2022-09-17 12:19:14
+01007B000C834000,"Asphalt Legends Unite",services;crash;online-broken,menus,2022-12-07 13:28:29
+01007F600B134000,"Assassin's Creed® III: Remastered",nvdec,boots,2024-06-25 20:12:11
+010044700DEB0000,"Assassin’s Creed®: The Rebel Collection",gpu,ingame,2024-05-19 07:58:56
+0100DF200B24C000,"Assault Android Cactus+",,playable,2021-06-03 13:23:55
+0100BF8012A30000,"Assault ChaingunS KM",crash;gpu,ingame,2020-12-14 12:48:34
+0100C5E00E540000,"Assault on Metaltron Demo",,playable,2021-02-10 19:48:06
+010057A00C1F6000,"Astebreed",,playable,2022-07-21 17:33:54
+010081500EA1E000,"Asterix & Obelix XXL 3 - The Crystal Menhir",gpu;nvdec;regression,ingame,2022-11-28 14:19:23
+0100F46011B50000,"Asterix & Obelix XXL: Romastered",gpu;nvdec;opengl,ingame,2023-08-16 21:22:06
+01007300020FA000,"ASTRAL CHAIN",,playable,2024-07-17 18:02:19
+0100E5F00643C000,"Astro Bears Party",,playable,2020-05-28 11:21:58
+0100F0400351C000,"Astro Duel Deluxe",32-bit,playable,2021-06-03 11:21:48
+0100B80010C48000,"Astrologaster",cpu;32-bit;crash,nothing,2023-06-28 15:39:31
+0100DF401249C000,"AstroWings: Space War",,playable,2020-12-14 13:10:44
+010099801870E000,"Atari 50: The Anniversary Celebration",slow,playable,2022-11-14 19:42:10
+010088600C66E000,"Atelier Arland series Deluxe Pack",nvdec,playable,2021-04-08 15:33:15
+0100D9D00EE8C000,"Atelier Ayesha: The Alchemist of Dusk DX",crash;nvdec;Needs Update,menus,2021-11-24 07:29:54
+0100E5600EE8E000,"Atelier Escha & Logy: Alchemists of the Dusk Sky DX",nvdec,playable,2022-11-20 16:01:41
+010023201421E000,"Atelier Firis: The Alchemist and the Mysterious Journey DX",gpu;nvdec,ingame,2022-10-25 22:46:19
+0100B1400CD50000,"Atelier Lulua ~The Scion of Arland~",nvdec,playable,2020-12-16 14:29:19
+010009900947A000,"Atelier Lydie & Suelle ~The Alchemists and the Mysterious Paintings~",nvdec,playable,2021-06-03 18:37:01
+01001A5014220000,"Atelier Lydie & Suelle: The Alchemists and the Mysterious Paintings DX",,playable,2022-10-25 23:06:20
+0100ADD00C6FA000,"Atelier Meruru ~The Apprentice of Arland~ DX",nvdec,playable,2020-06-12 00:50:48
+01002D700B906000,"Atelier Rorona Arland no Renkinjutsushi DX (JP)",nvdec,playable,2022-12-02 17:26:54
+01009A9012022000,"Atelier Ryza 2: Lost Legends & the Secret Fairy",,playable,2022-10-16 21:06:06
+0100D1900EC80000,"Atelier Ryza: Ever Darkness & the Secret Hideout",,playable,2023-10-15 16:36:50
+010005C00EE90000,"Atelier Shallie: Alchemists of the Dusk Sea DX",nvdec,playable,2020-11-25 20:54:12
+010082A01538E000,"Atelier Sophie 2: The Alchemist of the Mysterious Dream",crash,ingame,2022-12-01 04:34:03
+01009BC00C6F6000,"Atelier Totori ~The Adventurer of Arland~ DX",nvdec,playable,2020-06-12 01:04:56
+0100B9400FA38000,"ATOM RPG",nvdec,playable,2022-10-22 10:11:48
+01005FE00EC4E000,"Atomic Heist",,playable,2022-10-16 21:24:32
+0100AD30095A4000,"Atomicrops",,playable,2022-08-06 10:05:07
+01000D1006CEC000,"ATOMIK: RunGunJumpGun",,playable,2020-12-14 13:19:24
+0100FB500631E000,"ATOMINE",gpu;nvdec;slow,playable,2020-12-14 18:56:50
+010039600E7AC000,"Attack of the Toy Tanks",slow,ingame,2020-12-14 12:59:12
+010034500641A000,"Attack on Titan 2",,playable,2021-01-04 11:40:01
+01000F600B01E000,"ATV Drift & Tricks",UE4;online,playable,2021-04-08 17:29:17
+0100AA800DA42000,"Automachef",,playable,2020-12-16 19:51:25
+01006B700EA6A000,"Automachef Demo",,playable,2021-02-10 20:35:37
+0100B280106A0000,"Aviary Attorney: Definitive Edition",,playable,2020-08-09 20:32:12
+010064600F982000,"AVICII Invector",,playable,2020-10-25 12:12:56
+0100E100128BA000,"AVICII Invector Demo",,playable,2021-02-10 21:04:58
+01008FB011248000,"AvoCuddle",,playable,2020-09-02 14:50:13
+0100085012D64000,"Awakening of Cthulhu",UE4,playable,2021-04-26 13:03:07
+01002F1005F3C000,"Away: Journey To The Unexpected",nvdec;vulkan-backend-bug,playable,2022-11-06 15:31:04
+0100B8C00CFCE000,"Awesome Pea",,playable,2020-10-11 12:39:23
+010023800D3F2000,"Awesome Pea (Demo)",,playable,2021-02-10 21:48:21
+0100B7D01147E000,"Awesome Pea 2",,playable,2022-10-01 12:34:19
+0100D2011E28000,"Awesome Pea 2 (Demo)",crash,nothing,2021-02-10 22:08:27
+0100DA3011174000,"AXES",,playable,2021-04-08 13:01:58
+0100052004384000,"Axiom Verge",,playable,2020-10-20 01:07:18
+010075400DEC6000,"Ayakashi Koi Gikyoku《Trial version》",,playable,2021-02-10 22:22:11
+01006AF012FC8000,"Azur Lane: Crosswave",UE4;nvdec,playable,2021-04-05 15:15:25
+0100C7D00DE24000,"Azuran Tales: TRIALS",,playable,2020-08-12 15:23:07
+01006FB00990E000,"Azure Reflections",nvdec;online,playable,2021-04-08 13:18:25
+01004E90149AA000,"Azure Striker GUNVOLT 3",,playable,2022-08-10 13:46:49
+0100192003FA4000,"Azure Striker GUNVOLT: STRIKER PACK",32-bit,playable,2024-02-10 23:51:21
+010031D012BA4000,"Azurebreak Heroes",,playable,2020-12-16 21:26:17
+01009B901145C000,"B.ARK",nvdec,playable,2022-11-17 13:35:02
+01002CD00A51C000,"Baba Is You",,playable,2022-07-17 05:36:54
+0100F4100AF16000,"Back to Bed",nvdec,playable,2020-12-16 20:52:04
+0100FEA014316000,"Backworlds",,playable,2022-10-25 23:20:34
+0100EAF00E32E000,"Bacon Man: An Adventure",crash;nvdec,menus,2021-11-20 02:36:21
+01000CB00D094000,"Bad Dream: Coma",deadlock,boots,2023-08-03 00:54:18
+0100B3B00D81C000,"Bad Dream: Fever",,playable,2021-06-04 18:33:12
+0100E98006F22000,"Bad North",,playable,2022-07-17 13:44:25
+010075000D092000,"Bad North Demo",,playable,2021-02-10 22:48:38
+01004C70086EC000,"BAFL - Brakes Are For Losers",,playable,2021-01-13 08:32:51
+010076B011EC8000,"Baila Latino",,playable,2021-04-14 16:40:24
+0100730011BDC000,"Bakugan: Champions of Vestroia",,playable,2020-11-06 19:07:39
+01008260138C4000,"Bakumatsu Renka SHINSENGUMI",,playable,2022-10-25 23:37:31
+0100438012EC8000,"BALAN WONDERWORLD",nvdec;UE4,playable,2022-10-22 13:08:43
+0100E48013A34000,"Balan Wonderworld Demo",gpu;services;UE4;demo,ingame,2023-02-16 20:05:07
+0100CD801CE5E000,"Balatro",,ingame,2024-04-21 02:01:53
+010010A00DA48000,"Baldur's Gate and Baldur's Gate II: Enhanced Editions",32-bit,playable,2022-09-12 23:52:15
+0100BC400FB64000,"Balthazar's Dream",,playable,2022-09-13 00:13:22
+01008D30128E0000,"Bamerang",,playable,2022-10-26 00:29:39
+010013C010C5C000,"Banner of the Maid",,playable,2021-06-14 15:23:37
+0100388008758000,"Banner Saga 2",crash,boots,2021-01-13 08:56:09
+010071E00875A000,"Banner Saga 3",slow,boots,2021-01-11 16:53:57
+0100CE800B94A000,"Banner Saga Trilogy",slow,playable,2024-03-06 11:25:20
+0100425009FB2000,"Baobabs Mausoleum Ep.1: Ovnifagos Don't Eat Flamingos",,playable,2020-07-15 05:06:29
+010079300E976000,"Baobabs Mausoleum Ep.2: 1313 Barnabas Dead End Drive",,playable,2020-12-17 11:22:50
+01006D300FFA6000,"Baobabs Mausoleum Ep.3: Un Pato en Muertoburgo",nvdec,playable,2020-12-17 11:43:10
+0100D3000AEC2000,"Baobabs Mausoleum: DEMO",,playable,2021-02-10 22:59:25
+01003350102E2000,"Barbarous: Tavern of Emyr",,playable,2022-10-16 21:50:24
+0100F7E01308C000,"Barbearian",Needs Update;gpu,ingame,2021-06-28 16:27:50
+010039C0106C6000,"Baron: Fur Is Gonna Fly",crash,boots,2022-02-06 02:05:43
+0100FB000EB96000,"Barry Bradford's Putt Panic Party",nvdec,playable,2020-06-17 01:08:34
+01004860080A0000,"Baseball Riot",,playable,2021-06-04 18:07:27
+010038600B27E000,"Bastion",,playable,2022-02-15 14:15:24
+01005F3012748000,"Batbarian: Testament of the Primordials",,playable,2020-12-17 12:00:59
+0100C07018CA6000,"Baten Kaitos I & II HD Remaster (Europe/USA)",services;Needs Update,boots,2023-10-01 00:44:32
+0100F28018CA4000,"Baten Kaitos I & II HD Remaster (Japan)",services;Needs Update,boots,2023-10-24 23:11:54
+0100011005D92000,"Batman - The Telltale Series",nvdec;slow,playable,2021-01-11 18:19:35
+01003F00163CE000,"Batman: Arkham City",,playable,2024-09-11 00:30:19
+0100ACD0163D0000,"Batman: Arkham Knight",gpu;mac-bug,ingame,2024-06-25 20:24:42
+0100E6300AA3A000,"Batman: The Enemy Within",crash,nothing,2020-10-16 05:49:27
+0100747011890000,"Battle Axe",,playable,2022-10-26 00:38:01
+0100551001D88000,"Battle Chasers: Nightwar",nvdec;slow,playable,2021-01-12 12:27:34
+0100CC2001C6C000,"Battle Chef Brigade Deluxe",,playable,2021-01-11 14:16:28
+0100DBB00CAEE000,"Battle Chef Brigade Demo",,playable,2021-02-10 23:15:07
+0100A3B011EDE000,"Battle Hunters",gpu,ingame,2022-11-12 09:19:17
+010035E00C1AE000,"Battle of Kings",slow,playable,2020-12-17 12:45:23
+0100D2800EB40000,"Battle Planet - Judgement Day",,playable,2020-12-17 14:06:20
+0100C4D0093EA000,"Battle Princess Madelyn",,playable,2021-01-11 13:47:23
+0100A7500DF64000,"Battle Princess Madelyn Royal Edition",,playable,2022-09-26 19:14:49
+010099B00E898000,"Battle Supremacy - Evolution",gpu;nvdec,boots,2022-02-17 09:02:50
+0100DEB00D5A8000,"Battle Worlds: Kronos",nvdec,playable,2021-06-04 17:48:02
+0100650010DD4000,"Battleground",crash,ingame,2021-09-06 11:53:23
+010044E00D97C000,"BATTLESLOTHS",,playable,2020-10-03 08:32:22
+010059C00E39C000,"Battlestar Galactica Deadlock",nvdec,playable,2020-06-27 17:35:44
+01006D800A988000,"Battlezone Gold Edition",gpu;ldn-untested;online,boots,2021-06-04 18:36:05
+010048300D5C2000,"BATTLLOON",,playable,2020-12-17 15:48:23
+0100194010422000,"bayala - the game",,playable,2022-10-04 14:09:25
+0100CF5010FEC000,"Bayonetta Origins: Cereza and the Lost Demon™",gpu,ingame,2024-02-27 01:39:49
+010002801A3FA000,"Bayonetta Origins: Cereza and the Lost Demon™ Demo",gpu;demo,ingame,2024-02-17 06:06:28
+010076F0049A2000,"Bayonetta™",audout,playable,2022-11-20 15:51:59
+01007960049A0000,"Bayonetta™ 2",nvdec;ldn-works;LAN,playable,2022-11-26 03:46:09
+01004A4010FEA000,"Bayonetta™ 3",gpu;crash;nvdec;vulkan-backend-bug;opengl-backend-bug;amd-vendor-bug;ASTC,ingame,2024-09-28 14:34:33
+01002FA00DE72000,"BDSM: Big Drunk Satanic Massacre",,playable,2021-03-04 21:28:22
+01003A1010E3C000,"BE-A Walker",slow,ingame,2020-09-02 15:00:31
+010095C00406C000,"Beach Buggy Racing",online,playable,2021-04-13 23:16:50
+010020700DE04000,"Bear With Me: The Lost Robots",nvdec,playable,2021-02-27 14:20:10
+010024200E97E800,"Bear With Me: The Lost Robots Demo",nvdec,playable,2021-02-12 22:38:12
+0100C0E014A4E000,"Bear's Restaurant",,playable,2024-08-11 21:26:59
+,"BEAST Darling! ~Kemomimi Danshi to Himitsu no Ryou~",crash,menus,2020-10-04 06:12:08
+01009C300BB4C000,"Beat Cop",,playable,2021-01-06 19:26:48
+01002D20129FC000,"Beat Me!",online-broken,playable,2022-10-16 21:59:26
+01006B0014590000,"BEAUTIFUL DESOLATION",gpu;nvdec,ingame,2022-10-26 10:34:38
+01009E700DB2E000,"Bee Simulator",UE4;crash,boots,2020-07-15 12:13:13
+010018F007786000,"BeeFense BeeMastered",,playable,2022-11-17 15:38:12
+0100558010B26000,"Behold the Kickmen",,playable,2020-06-27 12:49:45
+0100D1300C1EA000,"Beholder: Complete Edition",,playable,2020-10-16 12:48:58
+01006E1004404000,"Ben 10",nvdec,playable,2021-02-26 14:08:35
+01009CD00E3AA000,"Ben 10: Power Trip!",nvdec,playable,2022-10-09 10:52:12
+010074500BBC4000,"Bendy and the Ink Machine",,playable,2023-05-06 20:35:39
+010068600AD16000,"Beyblade Burst Battle Zero",services;crash;Needs Update,menus,2022-11-20 15:48:32
+010056500CAD8000,"Beyond Enemy Lines: Covert Operations",UE4,playable,2022-10-01 13:11:50
+0100B8F00DACA000,"Beyond Enemy Lines: Essentials",nvdec;UE4,playable,2022-09-26 19:48:16
+0100BF400AF38000,"Bibi & Tina – Adventures with Horses",nvdec;slow,playable,2021-01-13 08:58:09
+010062400E69C000,"Bibi & Tina at the horse farm",,playable,2021-04-06 16:31:39
+01005FF00AF36000,"Bibi Blocksberg – Big Broom Race 3",,playable,2021-01-11 19:07:16
+010062B00A874000,"Big Buck Hunter Arcade",nvdec,playable,2021-01-12 20:31:39
+010088100C35E000,"Big Crown: Showdown",nvdec;online;ldn-untested,menus,2022-07-17 18:25:32
+0100A42011B28000,"Big Dipper",,playable,2021-06-14 15:08:19
+010077E00F30E000,"Big Pharma",,playable,2020-07-14 15:27:30
+010007401287E000,"BIG-Bobby-Car - The Big Race",slow,playable,2020-12-10 14:25:06
+010057700FF7C000,"Billion Road",,playable,2022-11-19 15:57:43
+010087D008D64000,"BINGO for Nintendo Switch",,playable,2020-07-23 16:17:36
+01004BA017CD6000,"Biomutant",crash,ingame,2024-05-16 15:46:36
+01002620102C6000,"BioShock 2 Remastered",services,nothing,2022-10-29 14:39:22
+0100D560102C8000,"BioShock Infinite: The Complete Edition",services-horizon;crash,nothing,2024-08-11 21:35:01
+0100AD10102B2000,"BioShock Remastered",services-horizon;crash;Needs Update,boots,2024-06-06 01:08:52
+010053B0117F8000,"Biped",nvdec,playable,2022-10-01 13:32:58
+01001B700B278000,"Bird Game +",online,playable,2022-07-17 18:41:57
+0100B6B012FF4000,"Birds and Blocks Demo",services;demo,boots,2022-04-10 04:53:03
+0100E62012D3C000,"BIT.TRIP RUNNER",,playable,2022-10-17 14:23:24
+01000AD012D3A000,"BIT.TRIP VOID",,playable,2022-10-17 14:31:23
+0100A0800EA9C000,"Bite the Bullet",,playable,2020-10-14 23:10:11
+010026E0141C8000,"Bitmaster",,playable,2022-12-13 14:05:51
+010061D00FD26000,"Biz Builder Delux",slow,playable,2020-12-15 21:36:25
+0100DD1014AB8000,"Black Book",nvdec,playable,2022-12-13 16:38:53
+010049000B69E000,"Black Future '88",nvdec,playable,2022-09-13 11:24:37
+01004BE00A682000,"Black Hole Demo",,playable,2021-02-12 23:02:17
+0100C3200E7E6000,"Black Legend",gpu;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-10-22 12:54:48
+010043A012A32000,"Blackjack Hands",,playable,2020-11-30 14:04:51
+0100A0A00E660000,"Blackmoor 2",online-broken,playable,2022-09-26 20:26:34
+010032000EA2C000,"Blacksad: Under the Skin",,playable,2022-09-13 11:38:04
+01006B400C178000,"Blacksea Odyssey",nvdec,playable,2022-10-16 22:14:34
+010068E013450000,"Blacksmith of the Sand Kingdom",,playable,2022-10-16 22:37:44
+0100C4400CB7C000,"BLADE ARCUS Rebellion From Shining",,playable,2022-07-17 18:52:28
+0100EA1018A2E000,"Blade Assault",audio,nothing,2024-04-29 14:32:50
+01009CC00E224000,"Blade II - The Return Of Evil",audio;crash;UE4,ingame,2021-11-14 02:49:59
+01005950022EC000,"Blade Strangers",nvdec,playable,2022-07-17 19:02:43
+0100DF0011A6A000,"Bladed Fury",,playable,2022-10-26 11:36:26
+0100CFA00CC74000,"Blades of Time",deadlock;online,boots,2022-07-17 19:19:58
+01006CC01182C000,"Blair Witch",nvdec;UE4,playable,2022-10-01 14:06:16
+010039501405E000,"Blanc",gpu;slow,ingame,2023-02-22 14:00:13
+0100698009C6E000,"Blasphemous",nvdec,playable,2021-03-01 12:15:31
+0100302010338000,"Blasphemous Demo",,playable,2021-02-12 23:49:56
+0100225000FEE000,"Blaster Master Zero",32-bit,playable,2021-03-05 13:22:33
+01005AA00D676000,"Blaster Master Zero 2",,playable,2021-04-08 15:22:59
+010025B002E92000,"Blaster Master Zero Demo",,playable,2021-02-12 23:59:06
+0100E53013E1C000,"Blastoid Breakout",,playable,2021-01-25 23:28:02
+0100EE800C93E000,"BLAZBLUE CENTRALFICTION Special Edition",nvdec,playable,2020-12-15 23:50:04
+0100B61008208000,"BLAZBLUE CROSS TAG BATTLE",nvdec;online,playable,2021-01-05 20:29:37
+010021A00DE54000,"Blazing Beaks",,playable,2020-06-04 20:37:06
+0100C2700C252000,"Blazing Chrome",,playable,2020-11-16 04:56:54
+010091700EA2A000,"Bleep Bloop DEMO",nvdec,playable,2021-02-13 00:20:53
+010089D011310000,"Blind Men",audout,playable,2021-02-20 14:15:38
+0100743013D56000,"Blizzard® Arcade Collection",nvdec,playable,2022-08-03 19:37:26
+0100F3500A20C000,"BlobCat",,playable,2021-04-23 17:09:30
+0100E1C00DB6C000,"Block-a-Pix Deluxe Demo",,playable,2021-02-13 00:37:39
+0100C6A01AD56000,"Bloo Kid",,playable,2024-05-01 17:18:04
+010055900FADA000,"Bloo Kid 2",,playable,2024-05-01 17:16:57
+0100EE5011DB6000,"Blood and Guts Bundle",,playable,2020-06-27 12:57:35
+01007E700D17E000,"Blood Waves",gpu,ingame,2022-07-18 13:04:46
+0100E060102AA000,"Blood will be Spilled",nvdec,playable,2020-12-17 03:02:03
+01004B800AF5A000,"Bloodstained: Curse of the Moon",,playable,2020-09-04 10:42:17
+01004680124E6000,"Bloodstained: Curse of the Moon 2",,playable,2020-09-04 10:56:27
+010025A00DF2A000,"Bloodstained: Ritual of the Night",nvdec;UE4,playable,2022-07-18 14:27:35
+0100E510143EC000,"Bloody Bunny, The Game",nvdec;UE4,playable,2022-10-22 13:18:55
+0100B8400A1C6000,"Bloons TD 5",Needs Update;audio;gpu;services,boots,2021-04-18 23:02:46
+01000EB01023E000,"Blossom Tales Demo",,playable,2021-02-13 14:22:53
+0100C1000706C000,"Blossom Tales: The Sleeping King",,playable,2022-07-18 16:43:07
+010073B010F6E000,"Blue Fire",UE4,playable,2022-10-22 14:46:11
+0100721013510000,"Body of Evidence",,playable,2021-04-25 22:22:11
+0100AD1010CCE000,"Bohemian Killing",vulkan-backend-bug,playable,2022-09-26 22:41:37
+010093700ECEC000,"Boku to Nurse no Kenshuu Nisshi",,playable,2022-11-21 20:38:34
+01001D900D9AC000,"Bokujou Monogatari Saikai no Mineraru Taun (Story of Seasons: Friends of Mineral Town)",slow;crash;Needs Update,ingame,2022-04-24 22:46:04
+0100317014B7C000,"Bomb Rush Cyberfunk",,playable,2023-09-28 19:51:57
+01007900080B6000,"Bomber Crew",,playable,2021-06-03 14:21:28
+0100A1F012948000,"Bomber Fox",nvdec,playable,2021-04-19 17:58:13
+010087300445A000,"Bombslinger",services,menus,2022-07-19 12:53:15
+01007A200F452000,"Book of Demons",,playable,2022-09-29 12:03:43
+010054500F564000,"Bookbound Brigade",,playable,2020-10-09 14:30:29
+01002E6013ED8000,"Boom Blaster",,playable,2021-03-24 10:55:56
+010081A00EE62000,"Boomerang Fu",,playable,2024-07-28 01:12:41
+010069F0135C4000,"Boomerang Fu Demo Version",demo,playable,2021-02-13 14:38:13
+01009970122E4000,"Borderlands 3 Ultimate Edition",gpu,ingame,2024-07-15 04:38:14
+010064800F66A000,"Borderlands: Game of the Year Edition",slow;online-broken;ldn-untested,ingame,2023-07-23 21:10:36
+010096F00FF22000,"Borderlands: The Handsome Collection",,playable,2022-04-22 18:35:07
+010007400FF24000,"Borderlands: The Pre-Sequel",nvdec,playable,2021-06-09 20:17:10
+01008E500AFF6000,"Boreal Blade",gpu;ldn-untested;online,ingame,2021-06-11 15:37:14
+010092C013FB8000,"BORIS THE ROCKET",,playable,2022-10-26 13:23:09
+010076F00EBE4000,"BOSSGARD",online-broken,playable,2022-10-04 14:21:13
+010069B00EAC8000,"Bot Vice Demo",crash;demo,ingame,2021-02-13 14:52:42
+010081100FE08000,"Bouncy Bob 2",,playable,2020-07-14 16:51:53
+0100E1200DC1A000,"Bounty Battle",nvdec,playable,2022-10-04 14:40:51
+0100B4700C57E000,"Bow to Blood: Last Captain Standing",slow,playable,2020-10-23 10:51:21
+010040800BA8A000,"Box Align",crash;services,nothing,2020-04-03 17:26:56
+010018300D006000,"BOXBOY! + BOXGIRL!™",,playable,2020-11-08 01:11:54
+0100B7200E02E000,"BOXBOY! + BOXGIRL!™ Demo",demo,playable,2021-02-13 14:59:08
+0100CA400B6D0000,"BQM -BlockQuest Maker-",online,playable,2020-07-31 20:56:50
+0100E87017D0E000,"Bramble: The Mountain King",services-horizon,playable,2024-03-06 09:32:17
+01000F5003068000,"Brave Dungeon + Dark Witch Story:COMBAT",,playable,2021-01-12 21:06:34
+01006DC010326000,"BRAVELY DEFAULT™ II",gpu;crash;Needs Update;UE4,ingame,2024-04-26 06:11:26
+0100B6801137E000,"Bravely Default™ II Demo",gpu;crash;UE4;demo,ingame,2022-09-27 05:39:47
+010081501371E000,"BraveMatch",UE4,playable,2022-10-26 13:32:15
+0100F60017D4E000,"Bravery and Greed",gpu;deadlock,boots,2022-12-04 02:23:47
+0100A42004718000,"BRAWL",nvdec;slow,playable,2020-06-04 14:23:18
+010068F00F444000,"Brawl Chess",nvdec,playable,2022-10-26 13:59:17
+0100C6800B934000,"Brawlhalla",online;opengl,playable,2021-06-03 18:26:09
+010060200A4BE000,"Brawlout",ldn-untested;online,playable,2021-06-04 17:35:35
+0100C1B00E1CA000,"Brawlout Demo",demo,playable,2021-02-13 22:46:53
+010022C016DC8000,"Breakout: Recharged",slow,ingame,2022-11-06 15:32:57
+01000AA013A5E000,"Breathedge",UE4;nvdec,playable,2021-05-06 15:44:28
+01003D50100F4000,"Breathing Fear",,playable,2020-07-14 15:12:29
+010026800BB06000,"Brick Breaker",nvdec;online,playable,2020-12-15 18:26:23
+01002AD0126AE000,"Bridge Constructor: The Walking Dead",gpu;slow,ingame,2020-12-11 17:31:32
+01000B1010D8E000,"Bridge! 3",,playable,2020-10-08 20:47:24
+010011000EA7A000,"BRIGANDINE The Legend of Runersia",,playable,2021-06-20 06:52:25
+0100703011258000,"BRIGANDINE The Legend of Runersia Demo",,playable,2021-02-14 14:44:10
+01000BF00BE40000,"Bring Them Home",UE4,playable,2021-04-12 14:14:43
+010060A00B53C000,"Broforce",ldn-untested;online,playable,2021-05-28 12:23:38
+0100EDD0068A6000,"Broken Age",,playable,2021-06-04 17:40:32
+0100A5800F6AC000,"Broken Lines",,playable,2020-10-16 00:01:37
+01001E60085E6000,"Broken Sword 5 - the Serpent's Curse",,playable,2021-06-04 17:28:59
+0100F19011226000,"Brotherhood United Demo",demo,playable,2021-02-14 21:10:57
+01000D500D08A000,"Brothers: A Tale of Two Sons",nvdec;UE4,playable,2022-07-19 14:02:22
+0100B2700E90E000,"Brunch Club",,playable,2020-06-24 13:54:07
+010010900F7B4000,"Bubble Bobble 4 Friends: The Baron is Back!",nvdec,playable,2021-06-04 15:27:55
+0100DBE00C554000,"Bubsy: Paws on Fire!",slow,ingame,2023-08-24 02:44:51
+0100089010A92000,"Bucket Knight",crash,ingame,2020-09-04 13:11:24
+0100F1B010A90000,"Bucket Knight demo",demo,playable,2021-02-14 21:23:09
+01000D200AC0C000,"Bud Spencer & Terence Hill - Slaps And Beans",,playable,2022-07-17 12:37:00
+010051A00E99E000,"Bug Fables: The Everlasting Sapling",,playable,2020-06-09 11:27:00
+01003DD00D658000,"Bulletstorm: Duke of Switch Edition",nvdec,playable,2022-03-03 08:30:24
+01006BB00E8FA000,"BurgerTime Party!",slow,playable,2020-11-21 14:11:53
+01005780106E8000,"BurgerTime Party! Demo",demo,playable,2021-02-14 21:34:16
+010078C00DB40000,"Buried Stars",,playable,2020-09-07 14:11:58
+0100DBF01000A000,"Burnout™ Paradise Remastered",nvdec;online,playable,2021-06-13 02:54:46
+010066F00C76A000,"Bury me, my Love",,playable,2020-11-07 12:47:37
+010030D012FF6000,"Bus Driver Simulator",,playable,2022-10-17 13:55:27
+0100A9101418C000,"BUSTAFELLOWS",nvdec,playable,2020-10-17 20:04:41
+0100177005C8A000,"BUTCHER",,playable,2021-01-11 18:50:17
+01000B900D8B0000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda",slow;nvdec,playable,2024-04-01 22:43:40
+010065700EE06000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda Demo",demo;gpu;nvdec,ingame,2021-02-14 21:48:15
+01005C00117A8000,"Café Enchanté",,playable,2020-11-13 14:54:25
+010060400D21C000,"Cafeteria Nipponica Demo",demo,playable,2021-02-14 22:11:35
+0100699012F82000,"Cake Bash Demo",crash;demo,ingame,2021-02-14 22:21:15
+01004FD00D66A000,"Caladrius Blaze",deadlock;nvdec,nothing,2022-12-07 16:44:37
+01004B500AB88000,"Calculation Castle : Greco's Ghostly Challenge Addition",32-bit,playable,2020-11-01 23:40:11
+010045500B212000,"Calculation Castle : Greco's Ghostly Challenge Division",32-bit,playable,2020-11-01 23:54:55
+0100ECE00B210000,"Calculation Castle : Greco's Ghostly Challenge Multiplication",32-bit,playable,2020-11-02 00:04:33
+0100A6500B176000,"Calculation Castle : Greco's Ghostly Challenge Subtraction",32-bit,playable,2020-11-01 23:47:42
+010004701504A000,"Calculator",,playable,2021-06-11 13:27:20
+010013A00E750000,"Calico",,playable,2022-10-17 14:44:28
+010046000EE40000,"Call of Cthulhu",nvdec;UE4,playable,2022-12-18 03:08:30
+0100B4700BFC6000,"Call of Juarez: Gunslinger",gpu;nvdec,ingame,2022-09-17 16:49:46
+0100593008BDC000,"Can't Drive This",,playable,2022-10-22 14:55:17
+0100E4600B166000,"Candle: The Power of the Flame",nvdec,playable,2020-05-26 12:10:20
+01001E0013208000,"Capcom Arcade Stadium",,playable,2021-03-17 05:45:14
+010094E00B52E000,"Capcom Beat 'Em Up Bundle",,playable,2020-03-23 18:31:24
+0100F6400A77E000,"CAPCOM BELT ACTION COLLECTION",online;ldn-untested,playable,2022-07-21 20:51:23
+01009BF0072D4000,"Captain Toad™: Treasure Tracker",32-bit,playable,2024-04-25 00:50:16
+01002C400B6B6000,"Captain Toad™: Treasure Tracker Demo",32-bit;demo,playable,2021-02-14 22:36:09
+0100EAE010560000,"Captain Tsubasa: Rise of New Champions",online-broken;vulkan-backend-bug,playable,2022-10-09 11:20:50
+01002320137CC000,"CAPTAIN TSUBASA: RISE OF NEW CHAMPIONS DEMO VERSION",slow,playable,2021-02-14 22:45:35
+010048800D95C000,"Car Mechanic Manager",,playable,2020-07-23 18:50:17
+01007BD00AE70000,"Car Quest",deadlock,menus,2021-11-18 08:59:18
+0100DA70115E6000,"Caretaker",,playable,2022-10-04 14:52:24
+0100DD6014870000,"Cargo Crew Driver",,playable,2021-04-19 12:54:22
+010088C0092FE000,"Carnival Games®",nvdec,playable,2022-07-21 21:01:22
+01005F5011AC4000,"Carnivores: Dinosaur Hunt",,playable,2022-12-14 18:46:06
+0100B1600E9AE000,"CARRION",crash,nothing,2020-08-13 17:15:12
+01008D1001512000,"Cars 3: Driven to Win",gpu,ingame,2022-07-21 21:21:05
+0100810012A1A000,"Carto",,playable,2022-09-04 15:37:06
+0100085003A2A000,"Cartoon Network Battle Crashers",,playable,2022-07-21 21:55:40
+0100C4C0132F8000,"CASE 2: Animatronics Survival",nvdec;UE4;vulkan-backend-bug,playable,2022-10-09 11:45:03
+010066F01A0E0000,"Cassette Beasts",,playable,2024-07-22 20:38:43
+010001300D14A000,"Castle Crashers Remastered",gpu,boots,2024-08-10 09:21:20
+0100F6D01060E000,"Castle Crashers Remastered Demo",gpu;demo,boots,2022-04-10 10:57:10
+01003C100445C000,"Castle of Heart",nvdec,playable,2022-07-21 23:10:45
+0100F5500FA0E000,"Castle of no Escape 2",,playable,2022-09-13 13:51:42
+0100DA2011F18000,"Castle Pals",,playable,2021-03-04 21:00:33
+010097C00AB66000,"CastleStorm",nvdec,playable,2022-07-21 22:49:14
+010007400EB64000,"CastleStorm II",UE4;crash;nvdec,boots,2020-10-25 11:22:44
+01001A800D6BC000,"Castlevania Anniversary Collection",audio,playable,2020-05-23 11:40:29
+010076000C86E000,"Cat Girl Without Salad: Amuse-Bouche",,playable,2022-09-03 13:01:47
+0100A2F006FBE000,"Cat Quest",,playable,2020-04-02 23:09:32
+01008BE00E968000,"Cat Quest II",,playable,2020-07-06 23:52:09
+0100E86010220000,"Cat Quest II Demo",demo,playable,2021-02-15 14:11:57
+0100BAE0077E4000,"Catherine Full Body for Nintendo Switch (JP)",Needs Update;gpu,ingame,2021-02-21 18:06:11
+0100BF00112C0000,"Catherine: Full Body",nvdec,playable,2023-04-02 11:00:37
+010004400B28A000,"Cattails",,playable,2021-06-03 14:36:57
+0100B7D0022EE000,"Cave Story+",,playable,2020-05-22 09:57:25
+01001A100C0E8000,"Caveblazers",slow,ingame,2021-06-09 17:57:28
+01006DB004566000,"Caveman Warriors",,playable,2020-05-22 11:44:20
+010078700B2CC000,"Caveman Warriors Demo",demo,playable,2021-02-15 14:44:08
+01002B30028F6000,"Celeste",,playable,2020-06-17 10:14:40
+01006B000A666000,"Cendrillon palikA",gpu;nvdec,ingame,2022-07-21 22:52:24
+01007600115CE000,"CHAOS CODE -NEW SIGN OF CATASTROPHE-",crash;nvdec,boots,2022-04-04 12:24:21
+0100957016B90000,"CHAOS;HEAD NOAH",,playable,2022-06-02 22:57:19
+0100F52013A66000,"Charge Kid",gpu;audout,boots,2024-02-11 01:17:47
+0100DE200C350000,"Chasm",,playable,2020-10-23 11:03:43
+010034301A556000,"Chasm: The Rift",gpu,ingame,2024-04-29 19:02:48
+0100A5900472E000,"Chess Ultra",UE4,playable,2023-08-30 23:06:31
+0100E3C00A118000,"Chicken Assassin: Reloaded",,playable,2021-02-20 13:29:01
+0100713010E7A000,"Chicken Police – Paint it RED!",nvdec,playable,2020-12-10 15:10:11
+0100F6C00A016000,"Chicken Range",,playable,2021-04-23 12:14:23
+01002E500E3EE000,"Chicken Rider",,playable,2020-05-22 11:31:17
+0100CAC011C3A000,"Chickens Madness DEMO",UE4;demo;gpu;nvdec,ingame,2021-02-15 15:02:10
+01007D000AD8A000,"Child of Light® Ultimate Edition",nvdec,playable,2020-12-16 10:23:10
+01002DE00C250000,"Children of Morta",gpu;nvdec,ingame,2022-09-13 17:48:47
+0100C1A00AC3E000,"Children of Zodiarcs",,playable,2020-10-04 14:23:33
+010046F012A04000,"Chinese Parents",,playable,2021-04-08 12:56:41
+01005A001489A000,"Chiptune Arrange Sound(DoDonPachi Resurrection)",32-bit;crash,ingame,2024-01-25 14:37:32
+01006A30124CA000,"Chocobo GP",gpu;crash,ingame,2022-06-04 14:52:18
+0100BF600BF26000,"Chocobo's Mystery Dungeon EVERY BUDDY!",slow,playable,2020-05-26 13:53:13
+01000BA0132EA000,"Choices That Matter: And The Sun Went Out",,playable,2020-12-17 15:44:08
+,"Chou no Doku Hana no Kusari: Taishou Irokoi Ibun",gpu;nvdec,ingame,2020-09-28 17:58:04
+010039A008E76000,"ChromaGun",,playable,2020-05-26 12:56:42
+010006800E13A000,"Chronos: Before the Ashes",UE4;gpu;nvdec,ingame,2020-12-11 22:16:35
+010039700BA7E000,"Circle of Sumo",,playable,2020-05-22 12:45:21
+01008FA00D686000,"Circuits",,playable,2022-09-19 11:52:50
+0100D8800B87C000,"Cities: Skylines - Nintendo Switch™ Edition",,playable,2020-12-16 10:34:57
+0100E4200D84E000,"Citizens of Space",gpu,boots,2023-10-22 06:45:44
+0100D9C012900000,"Citizens Unite!: Earth x Space",gpu,ingame,2023-10-22 06:44:19
+01005E501284E000,"City Bus Driving Simulator",,playable,2021-06-15 21:25:59
+0100A3A00CC7E000,"CLANNAD",,playable,2021-06-03 17:01:02
+01007B501372C000,"CLANNAD Side Stories",,playable,2022-10-26 15:03:04
+01005ED0107F4000,"Clash Force",,playable,2022-10-01 23:45:48
+010009300AA6C000,"Claybook",slow;nvdec;online;UE4,playable,2022-07-22 11:11:34
+010058900F52E000,"Clea",crash,ingame,2020-12-15 16:22:56
+010045E0142A4000,"Clea 2",,playable,2021-04-18 14:25:18
+01008C100C572000,"Clock Zero ~Shuuen no Ichibyou~ Devote",nvdec,playable,2022-12-04 22:19:14
+0100DF9013AD4000,"Clocker",,playable,2021-04-05 15:05:13
+0100B7200DAC6000,"Close to the Sun",crash;nvdec;UE4,boots,2021-11-04 09:19:41
+010047700D540000,"Clubhouse Games™: 51 Worldwide Classics",ldn-works,playable,2024-05-21 16:12:57
+0100C1401CEDC000,"Clue",crash;online,menus,2020-11-10 09:23:48
+010085A00821A000,"ClusterPuck 99",,playable,2021-01-06 00:28:12
+010096900A4D2000,"Clustertruck",slow,ingame,2021-02-19 21:07:09
+01005790110F0000,"Cobra Kai: The Karate Kid Saga Continues",,playable,2021-06-17 15:59:13
+01002E700C366000,"COCOON",gpu,ingame,2024-03-06 11:33:08
+010034E005C9C000,"Code of Princess EX",nvdec;online,playable,2021-06-03 10:50:13
+010086100CDCA000,"CODE SHIFTER",,playable,2020-08-09 15:20:55
+010002400F408000,"Code: Realize ~Future Blessings~",nvdec,playable,2023-03-31 16:57:47
+0100CF800C810000,"Coffee Crisis",,playable,2021-02-20 12:34:52
+010066200E1E6000,"Coffee Talk",,playable,2020-08-10 09:48:44
+0100178009648000,"Coffin Dodgers",,playable,2021-02-20 14:57:41
+010035B01706E000,"Cold Silence",cpu;crash,nothing,2024-07-11 17:06:14
+010083E00F40E000,"Collar X Malice",nvdec,playable,2022-10-02 11:51:56
+0100E3B00F412000,"Collar X Malice -Unlimited-",nvdec,playable,2022-10-04 15:30:40
+01002A600D7FC000,"Collection of Mana",,playable,2020-10-19 19:29:45
+0100B77012266000,"COLLECTION of SaGa FINAL FANTASY LEGEND",,playable,2020-12-30 19:11:16
+010030800BC36000,"Collidalot",nvdec,playable,2022-09-13 14:09:27
+0100CA100C0BA000,"Color Zen",,playable,2020-05-22 10:56:17
+010039B011312000,"Colorgrid",,playable,2020-10-04 01:50:52
+0100A7000BD28000,"Coloring Book",,playable,2022-07-22 11:17:05
+010020500BD86000,"Colors Live",gpu;services;crash,boots,2023-02-26 02:51:07
+0100E2F0128B4000,"Colossus Down",,playable,2021-02-04 20:49:50
+0100C4D00D16A000,"Commander Keen in Keen Dreams",gpu,ingame,2022-08-04 20:34:20
+0100E400129EC000,"Commander Keen in Keen Dreams: Definitive Edition",,playable,2021-05-11 19:33:54
+010065A01158E000,"Commandos 2 - HD Remaster",gpu;nvdec,ingame,2022-08-10 21:52:27
+010015801308E000,"Conarium",UE4;nvdec,playable,2021-04-26 17:57:53
+0100971011224000,"Concept Destruction",,playable,2022-09-29 12:28:56
+010043700C9B0000,"Conduct TOGETHER!",nvdec,playable,2021-02-20 12:59:00
+01007EF00399C000,"Conga Master Party!",,playable,2020-05-22 13:22:24
+0100A5600FAC0000,"Construction Simulator 3 - Console Edition",,playable,2023-02-06 09:31:23
+0100A330022C2000,"Constructor Plus",,playable,2020-05-26 12:37:40
+0100DCA00DA7E000,"Contra Anniversary Collection",,playable,2022-07-22 11:30:12
+0100F2600D710000,"CONTRA: ROGUE CORPS",crash;nvdec;regression,menus,2021-01-07 13:23:35
+0100B8200ECA6000,"CONTRA: ROGUE CORPS Demo",gpu,ingame,2022-09-04 16:46:52
+01007D701298A000,"Contraptions",,playable,2021-02-08 18:40:50
+0100041013360000,"Control Ultimate Edition - Cloud Version",Needs Update;crash;services,nothing,2021-04-18 22:34:06
+010058800E90A000,"Convoy: A Tactical Roguelike",,playable,2020-10-15 14:43:50
+0100B82010B6C000,"Cook, Serve, Delicious! 3?!",,playable,2022-10-09 12:09:34
+010060700EFBA000,"Cooking Mama: Cookstar",crash;loader-allocator,menus,2021-11-20 03:19:35
+01001E400FD58000,"Cooking Simulator",,playable,2021-04-18 13:25:23
+0100DF9010206000,"Cooking Tycoons - 3 in 1 Bundle",,playable,2020-11-16 22:44:26
+01005350126E0000,"Cooking Tycoons 2 - 3 in 1 Bundle",,playable,2020-11-16 22:19:33
+0100C5A0115C4000,"CopperBell",,playable,2020-10-04 15:54:36
+010016400B1FE000,"Corpse Party: Blood Drive",nvdec,playable,2021-03-01 12:44:23
+0100CCB01B1A0000,"COSMIC FANTASY COLLECTION",,ingame,2024-05-21 17:56:37
+010067C00A776000,"Cosmic Star Heroine",,playable,2021-02-20 14:30:47
+01003DD00F94A000,"COTTOn Reboot! [ コットン リブート! ]",,playable,2022-05-24 16:29:24
+,"Cotton/Guardian Saturn Tribute Games",gpu,boots,2022-11-27 21:00:51
+01000E301107A000,"Couch Co-Op Bundle Vol. 2",nvdec,playable,2022-10-02 12:04:21
+0100C1E012A42000,"Country Tales",,playable,2021-06-17 16:45:39
+01003370136EA000,"Cozy Grove",gpu,ingame,2023-07-30 22:22:19
+010073401175E000,"Crash Bandicoot™ 4: It’s About Time",nvdec;UE4,playable,2024-03-17 07:13:45
+0100D1B006744000,"Crash Bandicoot™ N. Sane Trilogy",,playable,2024-02-11 11:38:14
+010007900FCE2000,"Crash Drive 2",online,playable,2020-12-17 02:45:46
+010046600BD0E000,"Crash Dummy",nvdec,playable,2020-05-23 11:12:43
+0100BF200CD74000,"Crashbots",,playable,2022-07-22 13:50:52
+010027100BD16000,"Crashlands",,playable,2021-05-27 20:30:06
+0100F9F00C696000,"Crash™ Team Racing Nitro-Fueled",gpu;nvdec;online-broken,ingame,2023-06-25 02:40:17
+0100BF7006BCA000,"Crawl",,playable,2020-05-22 10:16:05
+0100C66007E96000,"Crayola Scoot",nvdec,playable,2022-07-22 14:01:55
+01005BA00F486000,"Crayon Shin-chan Ora to Hakase no Natsuyasumi Owaranai Nanokakan no Tabi",,playable,2021-07-21 10:41:33
+0100D470106DC000,"CRAYON SHINCHAN The Storm Called FLAMING KASUKABE RUNNER!!",services,menus,2020-03-20 14:00:57
+01006BC00C27A000,"Crazy Strike Bowling EX",UE4;gpu;nvdec,ingame,2020-08-07 18:15:59
+0100F9900D8C8000,"Crazy Zen Mini Golf",,playable,2020-08-05 14:00:00
+0100B0E010CF8000,"Creaks",,playable,2020-08-15 12:20:52
+01007C600D778000,"Creature in the Well",UE4;gpu,ingame,2020-11-16 12:52:40
+0100A19011EEE000,"Creepy Tale",,playable,2020-12-15 21:58:03
+01005C2013B00000,"Cresteaju",gpu,ingame,2021-03-24 10:46:06
+010022D00D4F0000,"Cricket 19",gpu,ingame,2021-06-14 14:56:07
+0100387017100000,"Cricket 22 The Official Game Of The Ashes",crash,boots,2023-10-18 08:01:57
+01005640080B0000,"Crimsonland",,playable,2021-05-27 20:50:54
+0100B0400EBC4000,"Cris Tales",crash,ingame,2021-07-29 15:10:53
+01004BC0166CC000,"CRISIS CORE –FINAL FANTASY VII– REUNION",,playable,2022-12-19 15:53:59
+01004F800C4DA000,"Croc's World",,playable,2020-05-22 11:21:09
+01009DB00DE12000,"Croc's World 2",,playable,2020-12-16 20:01:40
+010025200FC54000,"Croc's World 3",,playable,2020-12-30 18:53:26
+01000F0007D92000,"Croixleur Sigma",online,playable,2022-07-22 14:26:54
+01003D90058FC000,"CrossCode",,playable,2024-02-17 10:23:19
+0100B1E00AA56000,"Crossing Souls",nvdec,playable,2021-02-20 15:42:54
+0100059012BAE000,"Crown Trick",,playable,2021-06-16 19:36:29
+0100B41013C82000,"Cruis'n Blast",gpu,ingame,2023-07-30 10:33:47
+01000CC01C108000,"Crymachina Trial Edition ( Demo ) [ クライマキナ ]",demo,playable,2023-08-06 05:33:21
+0100CEA007D08000,"Crypt of the NecroDancer: Nintendo Switch Edition",nvdec,playable,2022-11-01 09:52:06
+0100582010AE0000,"Crysis 2 Remastered",deadlock,menus,2023-09-21 10:46:17
+0100CD3010AE2000,"Crysis 3 Remastered",deadlock,menus,2023-09-10 16:03:50
+0100E66010ADE000,"Crysis Remastered",nvdec,menus,2024-08-13 05:23:24
+0100972008234000,"Crystal Crisis",nvdec,playable,2021-02-20 13:52:44
+01006FA012FE0000,"Cthulhu Saves Christmas",,playable,2020-12-14 00:58:55
+010001600D1E8000,"Cube Creator X",crash,menus,2021-11-25 08:53:28
+010082E00F1CE000,"Cubers: Arena",nvdec;UE4,playable,2022-10-04 16:05:40
+010040D011D04000,"Cubicity",,playable,2021-06-14 14:19:51
+0100A5C00D162000,"Cuphead",,playable,2022-02-01 22:45:55
+0100F7E00DFC8000,"Cupid Parasite",gpu,ingame,2023-08-21 05:52:36
+010054501075C000,"Curious Cases",,playable,2020-08-10 09:30:48
+0100D4A0118EA000,"Curse of the Dead Gods",,playable,2022-08-30 12:25:38
+0100CE5014026000,"Curved Space",,playable,2023-01-14 22:03:50
+0100C1300DE74000,"Cyber Protocol",nvdec,playable,2020-09-28 14:47:40
+0100C1F0141AA000,"Cyber Shadow",,playable,2022-07-17 05:37:41
+01006B9013672000,"Cybxus Hearts",gpu;slow,ingame,2022-01-15 05:00:49
+010063100B2C2000,"Cytus α",nvdec,playable,2021-02-20 13:40:46
+0100B6400CA56000,"DAEMON X MACHINA™",UE4;audout;ldn-untested;nvdec,playable,2021-06-09 19:22:29
+010061300DF48000,"Dairoku: Ayakashimori",Needs Update;loader-allocator,nothing,2021-11-30 05:09:38
+0100BD2009A1C000,"Damsel",,playable,2022-09-06 11:54:39
+0100BFC002B4E000,"Dandara: Trials of Fear Edition",,playable,2020-05-26 12:42:33
+0100DFB00D808000,"Dandy Dungeon - Legend of Brave Yamada -",,playable,2021-01-06 09:48:47
+01003ED0099B0000,"Danger Mouse: The Danger Games",crash;online,boots,2022-07-22 15:49:45
+0100EFA013E7C000,"Danger Scavenger",nvdec,playable,2021-04-17 15:53:04
+0100417007F78000,"Danmaku Unlimited 3",,playable,2020-11-15 00:48:35
+,"Darius Cozmic Collection",,playable,2021-02-19 20:59:06
+010059C00BED4000,"Darius Cozmic Collection Special Edition",,playable,2022-07-22 16:26:50
+010015800F93C000,"Dariusburst - Another Chronicle EX+",online,playable,2021-04-05 14:21:43
+01003D301357A000,"Dark Arcana: The Carnival",gpu;slow,ingame,2022-02-19 08:52:28
+010083A00BF6C000,"Dark Devotion",nvdec,playable,2022-08-09 09:41:18
+0100BFF00D5AE000,"Dark Quest 2",,playable,2020-11-16 21:34:52
+01004AB00A260000,"DARK SOULS™: REMASTERED",gpu;nvdec;online-broken,ingame,2024-04-09 19:47:58
+01001FA0034E2000,"Dark Witch Music Episode: Rudymical",,playable,2020-05-22 09:44:44
+01008F1008DA6000,"Darkest Dungeon",nvdec,playable,2022-07-22 18:49:18
+0100F2300D4BA000,"Darksiders Genesis",nvdec;online-broken;UE4;ldn-broken,playable,2022-09-21 18:06:25
+010071800BA98000,"Darksiders II Deathinitive Edition",gpu;nvdec;online-broken,ingame,2024-06-26 00:37:25
+0100E1400BA96000,"Darksiders Warmastered Edition",nvdec,playable,2023-03-02 18:08:09
+010033500B7B6000,"Darkwood",,playable,2021-01-08 21:24:06
+0100440012FFA000,"DARQ Complete Edition",audout,playable,2021-04-07 15:26:21
+0100BA500B660000,"Darts Up",,playable,2021-04-14 17:22:22
+0100F0B0081DA000,"Dawn of the Breakers",online-broken;vulkan-backend-bug,menus,2022-12-08 14:40:03
+0100FCF00F6CC000,"Day and Night",,playable,2020-12-17 12:30:51
+0100D0A009310000,"de Blob",nvdec,playable,2021-01-06 17:34:46
+010034E00A114000,"de Blob 2",nvdec,playable,2021-01-06 13:00:16
+01008E900471E000,"De Mambo",,playable,2021-04-10 12:39:40
+01004C400CF96000,"Dead by Daylight",nvdec;online-broken;UE4,boots,2022-09-13 14:32:13
+0100646009FBE000,"Dead Cells",,playable,2021-09-22 22:18:49
+01004C500BD40000,"Dead End Job",nvdec,playable,2022-09-19 12:48:44
+01009CC00C97C000,"DEAD OR ALIVE Xtreme 3 Scarlet",,playable,2022-07-23 17:05:06
+0100A5000F7AA000,"DEAD OR SCHOOL",nvdec,playable,2022-09-06 12:04:09
+0100A24011F52000,"Dead Z Meat",UE4;services,ingame,2021-04-14 16:50:16
+010095A011A14000,"Deadly Days",,playable,2020-11-27 13:38:55
+0100BAC011928000,"Deadly Premonition 2: A Blessing In Disguise",,playable,2021-06-15 14:12:36
+0100EBE00F22E000,"Deadly Premonition Origins",32-bit;nvdec,playable,2024-03-25 12:47:46
+,"Dear Magi - Mahou Shounen Gakka -",,playable,2020-11-22 16:45:16
+01000D60126B6000,"Death and Taxes",,playable,2020-12-15 20:27:49
+010012B011AB2000,"Death Come True",nvdec,playable,2021-06-10 22:30:49
+0100F3B00CF32000,"Death Coming",crash,nothing,2022-02-06 07:43:03
+0100AEC013DDA000,"Death end re;Quest",,playable,2023-07-09 12:19:54
+0100423009358000,"Death Road to Canada",gpu;audio;32-bit;crash,nothing,2023-06-28 15:39:26
+010085900337E000,"Death Squared",,playable,2020-12-04 13:00:15
+0100A51013550000,"Death Tales",,playable,2020-12-17 10:55:52
+0100492011A8A000,"Death's Hangover",gpu,boots,2023-08-01 22:38:06
+01009120119B4000,"Deathsmiles I・II",,playable,2024-04-08 19:29:00
+010034F00BFC8000,"Debris Infinity",nvdec;online,playable,2021-05-28 12:14:39
+010027700FD2E000,"Decay of Logos",nvdec,playable,2022-09-13 14:42:13
+01002CC0062B8000,"DEEMO",,playable,2022-07-24 11:34:33
+01008B10132A2000,"DEEMO -Reborn-",nvdec;online-broken,playable,2022-10-17 15:18:11
+010026800FA88000,"Deep Diving Adventures",,playable,2022-09-22 16:43:37
+0100FAF009562000,"Deep Ones",services,nothing,2020-04-03 02:54:19
+0100C3E00D68E000,"Deep Sky Derelicts: Definitive Edition",,playable,2022-09-27 11:21:08
+01000A700F956000,"Deep Space Rush",,playable,2020-07-07 23:30:33
+0100961011BE6000,"DeepOne",services-horizon;Needs Update,nothing,2024-01-18 15:01:05
+01008BB00F824000,"Defenders of Ekron: Definitive Edition",,playable,2021-06-11 16:31:03
+0100CDE0136E6000,"Defentron",,playable,2022-10-17 15:47:56
+010039300BDB2000,"Defunct",,playable,2021-01-08 21:33:46
+010067900B9C4000,"Degrees of Separation",,playable,2021-01-10 13:40:04
+010071C00CBA4000,"Dei Gratia no Rashinban",crash,nothing,2021-07-13 02:25:32
+010092E00E7F4000,"Deleveled",slow,playable,2020-12-15 21:02:29
+010023800D64A000,"DELTARUNE Chapter 1&2",,playable,2023-01-22 04:47:44
+010038B01D2CA000,"Dementium: The Ward",crash,boots,2024-09-02 08:28:14
+0100AB600ACB4000,"Demetrios - The BIG Cynical Adventure",,playable,2021-06-04 12:01:01
+010099D00D1A4000,"Demolish & Build 2018",,playable,2021-06-13 15:27:26
+010084600F51C000,"Demon Pit",nvdec,playable,2022-09-19 13:35:15
+0100309016E7A000,"Demon Slayer -Kimetsu no Yaiba- The Hinokami Chronicles",UE4,playable,2024-08-08 04:51:49
+0100A2B00BD88000,"Demon's Crystals",crash;regression,nothing,2022-12-07 16:33:17
+0100E29013818000,"Demon's Rise - Lords of Chaos",,playable,2021-04-06 16:20:06
+0100C3501094E000,"Demon's Rise - War for the Deep",,playable,2020-07-29 12:26:27
+0100161011458000,"Demon's Tier+",,playable,2021-06-09 17:25:36
+0100BE800E6D8000,"DEMON'S TILT",,playable,2022-09-19 13:22:46
+010000401313A000,"Demong Hunter",,playable,2020-12-12 15:27:08
+0100BC501355A000,"Densha de go!! Hashirou Yamanote Sen",nvdec;UE4,playable,2023-11-09 07:47:58
+0100C9100FAE2000,"Depixtion",,playable,2020-10-10 18:52:37
+01000BF00B6BC000,"Deployment",slow;online-broken,playable,2022-10-17 16:23:59
+010023600C704000,"Deponia",nvdec,playable,2021-01-26 17:17:19
+0100ED700469A000,"Deru - The Art of Cooperation",,playable,2021-01-07 16:59:59
+0100D4600D0E4000,"Descenders",gpu,ingame,2020-12-10 15:22:36
+,"Desire remaster ver.",crash,boots,2021-01-17 02:34:37
+010069500DD86000,"Destiny Connect: Tick-Tock Travelers",UE4;gpu;nvdec,ingame,2020-12-16 12:20:36
+01008BB011ED6000,"Destrobots",,playable,2021-03-06 14:37:05
+01009E701356A000,"Destroy All Humans!",gpu;nvdec;UE4,ingame,2023-01-14 22:23:53
+010030600E65A000,"Detective Dolittle",,playable,2021-03-02 14:03:59
+01009C0009842000,"Detective Gallo",nvdec,playable,2022-07-24 11:51:04
+,"Detective Jinguji Saburo Prism of Eyes",,playable,2020-10-02 21:54:41
+010007500F27C000,"Detective Pikachu™ Returns",,playable,2023-10-07 10:24:59
+010031B00CF66000,"Devil Engine",,playable,2021-06-04 11:54:30
+01002F000E8F2000,"Devil Kingdom",,playable,2023-01-31 08:58:44
+0100E8000D5B8000,"Devil May Cry",nvdec,playable,2021-01-04 19:43:08
+01007CF00D5BA000,"Devil May Cry 2",nvdec,playable,2023-01-24 23:03:20
+01007B600D5BC000,"Devil May Cry 3 Special Edition",nvdec,playable,2024-07-08 12:33:23
+01003C900EFF6000,"Devil Slayer Raksasi",,playable,2022-10-26 19:42:32
+01009EA00A320000,"Devious Dungeon",,playable,2021-03-04 13:03:06
+01003F601025E000,"Dex",nvdec,playable,2020-08-12 16:48:12
+010044000CBCA000,"Dexteritrip",,playable,2021-01-06 12:51:12
+0100AFC00E06A000,"Dezatopia",online,playable,2021-06-15 21:06:11
+01001B300B9BE000,"Diablo III: Eternal Collection",online-broken;ldn-works,playable,2023-08-21 23:48:03
+0100726014352000,"Diablo® II: Resurrected™",gpu;nvdec,ingame,2023-08-18 18:42:47
+0100F73011456000,"Diabolic",,playable,2021-06-11 14:45:08
+010027400BD24000,"DIABOLIK LOVERS CHAOS LINEAGE",gpu;Needs Update,ingame,2023-06-08 02:20:44
+0100BBF011394000,"Dicey Dungeons",gpu;audio;slow,ingame,2023-08-02 20:30:12
+0100D98005E8C000,"Die for Valhalla!",,playable,2021-01-06 16:09:14
+0100BB900B5B4000,"Dies irae Amantes amentes For Nintendo Switch",32-bit;crash,nothing,2022-02-16 07:09:05
+0100A5A00DBB0000,"Dig Dog",gpu,ingame,2021-06-02 17:17:51
+01004DE011076000,"Digerati Indie Darling Bundle Vol. 3",,playable,2022-10-02 13:01:57
+010035D0121EC000,"Digerati Presents: The Dungeon Crawl Vol. 1",slow,ingame,2021-04-18 14:04:55
+010014E00DB56000,"Digimon Story Cyber Sleuth: Complete Edition",nvdec;opengl,playable,2022-09-13 15:02:37
+0100F00014254000,"Digimon World: Next Order",,playable,2023-05-09 20:41:06
+0100B6D00DA6E000,"Ding Dong XL",,playable,2020-07-14 16:13:19
+01002E4011924000,"Dininho Adventures",,playable,2020-10-03 17:25:51
+010027E0158A6000,"Dininho Space Adventure",,playable,2023-01-14 22:43:04
+0100A8A013DA4000,"Dirt Bike Insanity",,playable,2021-01-31 13:27:38
+01004CB01378A000,"Dirt Trackin Sprint Cars",nvdec;online-broken,playable,2022-10-17 16:34:56
+0100918014B02000,"Disagaea 6: Defiance of Destiny Demo",demo,playable,2022-10-26 20:02:04
+010020700E2A2000,"Disaster Report 4: Summer Memories",nvdec;UE4,playable,2022-09-27 19:41:31
+0100510004D2C000,"Disc Jam",UE4;ldn-untested;nvdec;online,playable,2021-04-08 16:40:35
+0100C81004780000,"Disco Dodgeball - REMIX",online,playable,2020-09-28 23:24:49
+01004B100AF18000,"Disgaea 1 Complete",,playable,2023-01-30 21:45:23
+0100A9800E9B4000,"Disgaea 4 Complete+",gpu;slow,playable,2020-02-18 10:54:28
+010068C00F324000,"Disgaea 4 Complete+ Demo",nvdec,playable,2022-09-13 15:21:59
+01005700031AE000,"Disgaea 5 Complete",nvdec,playable,2021-03-04 15:32:54
+0100ABC013136000,"Disgaea 6: Defiance of Destiny",deadlock,ingame,2023-04-15 00:50:32
+0100307011D80000,"Disgaea 6: Defiance of Destiny [ FG ] [ 魔界戦記ディスガイア6 ]",,playable,2021-06-08 13:20:33
+01005EE013888000,"Disgaea 6: Defiance of Destiny Demo [ 魔界戦記ディスガイア6 ]",gpu;demo,ingame,2022-12-06 15:27:59
+01000B70122A2000,"Disjunction",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2024-04-28 23:55:24
+0100A2F00EEFC000,"Disney Classic Games Collection",online-broken,playable,2022-09-13 15:44:17
+0100DA201EBF8000,"Disney Epic Mickey: Rebrushed",crash,ingame,2024-09-26 22:11:51
+0100F0401435E000,"Disney Speedstorm",services,boots,2023-11-27 02:15:32
+010012800EBAE000,"Disney TSUM TSUM FESTIVAL",crash,menus,2020-07-14 14:05:28
+01009740120FE000,"DISTRAINT 2",,playable,2020-09-03 16:08:12
+010075B004DD2000,"DISTRAINT: Deluxe Edition",,playable,2020-06-15 23:42:24
+010027400CDC6000,"Divinity: Original Sin 2 - Definitive Edition",services;crash;online-broken;regression,menus,2023-08-13 17:20:03
+01001770115C8000,"Dodo Peak",nvdec;UE4,playable,2022-10-04 16:13:05
+010077B0100DA000,"Dogurai",,playable,2020-10-04 02:40:16
+010048100D51A000,"Dokapon Up! Mugen no Roulette",gpu;Needs Update,menus,2022-12-08 19:39:10
+01005EE00BC78000,"Dokuro (ドクロ)",nvdec,playable,2020-12-17 14:47:09
+010007200AC0E000,"Don't Die, Mr Robot!",nvdec,playable,2022-09-02 18:34:38
+0100E470067A8000,"Don't Knock Twice",,playable,2024-05-08 22:37:58
+0100C4D00B608000,"Don't Sink",gpu,ingame,2021-02-26 15:41:11
+0100751007ADA000,"Don't Starve: Nintendo Switch Edition",nvdec,playable,2022-02-05 20:43:34
+010088B010DD2000,"Dongo Adventure",,playable,2022-10-04 16:22:26
+0100C1F0051B6000,"Donkey Kong Country™: Tropical Freeze",,playable,2024-08-05 16:46:10
+0100F2C00F060000,"Doodle Derby",,boots,2020-12-04 22:51:48
+0100416004C00000,"DOOM",gpu;slow;nvdec;online-broken,ingame,2024-09-23 15:40:07
+010018900DD00000,"DOOM (1993)",nvdec;online-broken,menus,2022-09-06 13:32:19
+01008CB01E52E000,"DOOM + DOOM II",opengl;ldn-untested;LAN,playable,2024-09-12 07:06:01
+010029D00E740000,"DOOM 3",crash,menus,2024-08-03 05:25:47
+01005D700E742000,"DOOM 64",nvdec;vulkan,playable,2020-10-13 23:47:28
+0100D4F00DD02000,"DOOM II (Classic)",nvdec;online,playable,2021-06-03 20:10:01
+0100B1A00D8CE000,"DOOM® Eternal",gpu;slow;nvdec;online-broken,ingame,2024-08-28 15:57:17
+01005ED00CD70000,"Door Kickers: Action Squad",online-broken;ldn-broken,playable,2022-09-13 16:28:53
+010073700E412000,"DORAEMON STORY OF SEASONS",nvdec,playable,2020-07-13 20:28:11
+0100F7300BD8E000,"Double Cross",,playable,2021-01-07 15:34:22
+0100B1500E9F2000,"Double Dragon & Kunio-kun: Retro Brawler Bundle",,playable,2020-09-01 12:48:46
+01001AD00E49A000,"DOUBLE DRAGON Ⅲ: The Sacred Stones",online,playable,2021-06-11 15:41:44
+01005B10132B2000,"Double Dragon Neon",gpu;audio;32-bit,ingame,2022-09-20 18:00:20
+01000F400C1A4000,"Double Kick Heroes",gpu,ingame,2020-10-03 14:33:59
+0100A5D00C7C0000,"Double Pug Switch",nvdec,playable,2022-10-10 10:59:35
+0100FC000EE10000,"Double Switch - 25th Anniversary Edition",nvdec,playable,2022-09-19 13:41:50
+0100B6600FE06000,"Down to Hell",gpu;nvdec,ingame,2022-09-19 14:01:26
+010093D00C726000,"Downwell",,playable,2021-04-25 20:05:24
+0100ED000D390000,"Dr Kawashima's Brain Training",services,ingame,2023-06-04 00:06:46
+01001B80099F6000,"Dracula's Legacy",nvdec,playable,2020-12-10 13:24:25
+0100566009238000,"DragoDino",gpu;nvdec,ingame,2020-08-03 20:49:16
+0100DBC00BD5A000,"Dragon Audit",crash,ingame,2021-05-16 14:24:46
+0100A250097F0000,"DRAGON BALL FighterZ",UE4;ldn-broken;nvdec;online,playable,2021-06-11 16:19:04
+010078D000F88000,"DRAGON BALL XENOVERSE 2 for Nintendo Switch",gpu;nvdec;online;ldn-untested,ingame,2022-07-24 12:31:01
+010051C0134F8000,"DRAGON BALL Z: KAKAROT + A NEW POWER AWAKENS SET",vulkan-backend-bug,playable,2024-08-28 00:03:50
+010099B00A2DC000,"Dragon Blaze for Nintendo Switch",32-bit,playable,2020-10-14 11:11:28
+010089700150E000,"Dragon Marked for Death: Advanced Attackers",ldn-untested;audout,playable,2022-03-10 06:44:34
+0100EFC00EFB2000,"DRAGON QUEST",gpu,boots,2021-11-09 03:31:32
+010008900705C000,"Dragon Quest Builders™",gpu;nvdec,ingame,2023-08-14 09:54:36
+010042000A986000,"DRAGON QUEST BUILDERS™ 2",,playable,2024-04-19 16:36:38
+0100CD3000BDC000,"Dragon Quest Heroes I + II (JP)",nvdec,playable,2021-04-08 14:27:16
+010062200EFB4000,"DRAGON QUEST II: Luminaries of the Legendary Line",,playable,2022-09-13 16:44:11
+01003E601E324000,"DRAGON QUEST III HD-2D Remake",vulkan-backend-bug;UE4;audout;mac-bug,ingame,2025-01-07 04:10:27
+010015600EFB6000,"DRAGON QUEST III: The Seeds of Salvation",gpu,boots,2021-11-09 03:38:34
+0100A77018EA0000,"DRAGON QUEST MONSTERS: The Dark Prince",,playable,2023-12-29 16:10:05
+0100217014266000,"Dragon Quest Treasures",gpu;UE4,ingame,2023-05-09 11:16:52
+0100E2E0152E4000,"Dragon Quest X Awakening Five Races Offline",nvdec;UE4,playable,2024-08-20 10:04:24
+01006C300E9F0000,"DRAGON QUEST® XI S: Echoes of an Elusive Age – Definitive Edition",UE4,playable,2021-11-27 12:27:11
+010032C00AC58000,"Dragon's Dogma: Dark Arisen",,playable,2022-07-24 12:58:33
+010027100C544000,"Dragon's Lair Trilogy",nvdec,playable,2021-01-13 22:12:07
+0100DA0006F50000,"DragonFangZ - The Rose & Dungeon of Time",,playable,2020-09-28 21:35:18
+0100F7800A434000,"Drawful 2",,ingame,2022-07-24 13:50:21
+0100B7E0102E4000,"Drawngeon: Dungeons of Ink and Paper",gpu,ingame,2022-09-19 15:41:25
+01008B20129F2000,"Dream",,playable,2020-12-15 19:55:07
+01000AA0093DC000,"Dream Alone",nvdec,playable,2021-01-27 19:41:50
+010034D00F330000,"DreamBall",UE4;crash;gpu,ingame,2020-08-05 14:45:25
+010058B00F3C0000,"Dreaming Canvas",UE4;gpu,ingame,2021-06-13 22:50:07
+0100D24013466000,"DREAMO",UE4,playable,2022-10-17 18:25:28
+0100ED200B6FC000,"DreamWorks Dragons Dawn of New Riders",nvdec,playable,2021-01-27 20:05:26
+0100236011B4C000,"DreamWorks Spirit Lucky’s Big Adventure",,playable,2022-10-27 13:30:52
+010058C00A916000,"Drone Fight",,playable,2022-07-24 14:31:56
+010052000A574000,"Drowning",,playable,2022-07-25 14:28:26
+0100652012F58000,"Drums",,playable,2020-12-17 17:21:51
+01005BC012C66000,"Duck Life Adventure",,playable,2022-10-10 11:27:03
+01007EF00CB88000,"Duke Nukem 3D: 20th Anniversary World Tour",32-bit;ldn-untested,playable,2022-08-19 22:22:40
+010068D0141F2000,"Dull Grey",,playable,2022-10-27 13:40:38
+0100926013600000,"Dungeon Nightmares 1 + 2 Collection",,playable,2022-10-17 18:54:22
+010034300F0E2000,"Dungeon of the Endless",nvdec,playable,2021-05-27 19:16:26
+0100E79009A94000,"Dungeon Stars",,playable,2021-01-18 14:28:37
+0100BE801360E000,"Dungeons & Bombs",,playable,2021-04-06 12:46:22
+0100EC30140B6000,"Dunk Lords",,playable,2024-06-26 00:07:26
+010011C00E636000,"Dusk Diver",crash;UE4,boots,2021-11-06 09:01:30
+0100B6E00A420000,"Dust: An Elysian Tail",,playable,2022-07-25 15:28:12
+0100D7E012F2E000,"Dustoff Z",,playable,2020-12-04 23:22:29
+01008C8012920000,"Dying Light: Definitive Edition",services-horizon,boots,2024-03-11 10:43:32
+01007DD00DFDE000,"Dyna Bomb",,playable,2020-06-07 13:26:55
+0100E9A00CB30000,"DYNASTY WARRIORS 8: Xtreme Legends Definitive Edition",nvdec,playable,2024-06-26 00:16:30
+010008900BC5A000,"DYSMANTLE",gpu,ingame,2024-07-15 16:24:12
+010054E01D878000,"EA SPORTS FC 25",crash,ingame,2024-09-25 21:07:50
+0100BDB01A0E6000,"EA SPORTS FC™ 24",,boots,2023-10-04 18:32:59
+01001C8016B4E000,"EA SPORTS FIFA 23 Nintendo Switch™ Legacy Edition",gpu;crash,ingame,2024-06-10 23:33:05
+01005DE00D05C000,"EA SPORTS™ FIFA 20 Nintendo Switch™ Legacy Edition",gpu;nvdec;online-broken;ldn-untested,ingame,2022-09-13 17:57:20
+010037400C7DA000,"Eagle Island Twist",,playable,2021-04-10 13:15:42
+0100B9E012992000,"Earth Defense Force World Brothers ( ま~るい地球が四角くなった!? デジボク地球防衛軍 )",UE4,playable,2022-12-07 12:59:16
+0100298014030000,"Earth Defense Force: World Brothers",UE4,playable,2022-10-27 14:13:31
+01009B7006C88000,"EARTH WARS",,playable,2021-06-05 11:18:33
+0100DFC00E472000,"Earthfall: Alien Horde",nvdec;UE4;ldn-untested,playable,2022-09-13 17:32:37
+01006E50042EA000,"EARTHLOCK",,playable,2021-06-05 11:51:02
+0100A2E00BB0C000,"EarthNight",,playable,2022-09-19 21:02:20
+0100DCE00B756000,"Earthworms",,playable,2022-07-25 16:28:55
+0100E3500BD84000,"Earthworms Demo",,playable,2021-01-05 16:57:11
+0100ECF01800C000,"Easy Come Easy Golf",online-broken;regression,playable,2024-04-04 16:15:00
+0100A9B009678000,"EAT BEAT DEADSPIKE-san",audio;Needs Update,playable,2022-12-02 19:25:29
+0100BCA016636000,"eBaseball Powerful Pro Yakyuu 2022",gpu;services-horizon;crash,nothing,2024-05-26 23:07:19
+01001F20100B8000,"Eclipse: Edge of Light",,playable,2020-08-11 23:06:29
+0100E0A0110F4000,"eCrossminton",,playable,2020-07-11 18:24:27
+0100ABE00DB4E000,"Edna & Harvey: Harvey's New Eyes",nvdec,playable,2021-01-26 14:36:08
+01004F000B716000,"Edna & Harvey: The Breakout – Anniversary Edition",crash;nvdec,ingame,2022-08-01 16:59:56
+01002550129F0000,"Effie",,playable,2022-10-27 14:36:39
+0100CC0010A46000,"Ego Protocol: Remastered",nvdec,playable,2020-12-16 20:16:35
+,"Eiga Sumikko Gurashi Tobidasu Ehon to Himitsu no Ko Game de Asobo Ehon no Sekai",,playable,2020-11-12 00:11:50
+01003AD013BD2000,"Eight Dragons",nvdec,playable,2022-10-27 14:47:28
+010020A01209C000,"El Hijo - A Wild West Tale",nvdec,playable,2021-04-19 17:44:08
+0100B5B00EF38000,"Elden: Path of the Forgotten",,playable,2020-12-15 00:33:19
+010068F012880000,"Eldrador® Creatures",slow,playable,2020-12-12 12:35:35
+010008E010012000,"ELEA: Paradigm Shift",UE4;crash,nothing,2020-10-04 19:07:43
+0100A6700AF10000,"Element",,playable,2022-07-25 17:17:16
+0100128003A24000,"Elliot Quest",,playable,2022-07-25 17:46:14
+010041A00FEC6000,"Ember",nvdec,playable,2022-09-19 21:16:11
+010071B012940000,"Embracelet",,playable,2020-12-04 23:45:00
+010017B0102A8000,"Emma: Lost in Memories",nvdec,playable,2021-01-28 16:19:10
+010068300E08E000,"Enchanted in the Moonlight - Kiryu, Chikage & Yukinojo -",gpu;nvdec,ingame,2022-11-20 16:18:45
+01007A4008486000,"Enchanting Mahjong Match",gpu,ingame,2020-04-17 22:01:31
+01004F3011F92000,"Endless Fables: Dark Moor",gpu;nvdec,ingame,2021-03-07 15:31:03
+010067B017588000,"Endless Ocean™ Luminous",services-horizon;crash,ingame,2024-05-30 02:05:57
+0100B8700BD14000,"Energy Cycle Edge",services,ingame,2021-11-30 05:02:31
+0100A8E0090B0000,"Energy Invasion",,playable,2021-01-14 21:32:26
+0100C6200A0AA000,"Enigmatis 2: The Mists of Ravenwood",crash;regression,boots,2021-06-06 15:15:30
+01009D60076F6000,"Enter the Gungeon",,playable,2022-07-25 20:28:33
+0100262009626000,"Epic Loon",nvdec,playable,2022-07-25 22:06:13
+01000FA0149B6000,"EQI",nvdec;UE4,playable,2022-10-27 16:42:32
+0100E95010058000,"EQQO",UE4;nvdec,playable,2021-06-13 23:10:51
+01000E8010A98000,"Escape First",,playable,2020-10-20 22:46:53
+010021201296A000,"Escape First 2",,playable,2021-03-24 11:59:41
+0100FEF00F0AA000,"Escape from Chernobyl",crash,boots,2022-09-19 21:36:58
+010023E013244000,"Escape from Life Inc",,playable,2021-04-19 17:34:09
+010092901203A000,"Escape From Tethys",,playable,2020-10-14 22:38:25
+0100B0F011A84000,"Escape Game Fort Boyard",,playable,2020-07-12 12:45:43
+0100F9600E746000,"ESP Ra.De. Psi",audio;slow,ingame,2024-03-07 15:05:08
+010073000FE18000,"Esports powerful pro yakyuu 2020",gpu;crash;Needs More Attention,ingame,2024-04-29 05:34:14
+01004F9012FD8000,"Estranged: The Departure",nvdec;UE4,playable,2022-10-24 10:37:58
+0100CB900B498000,"Eternum Ex",,playable,2021-01-13 20:28:32
+010092501EB2C000,"Europa (Demo)",gpu;crash;UE4,ingame,2024-04-23 10:47:12
+01007BE0160D6000,"EVE ghost enemies",gpu,ingame,2023-01-14 03:13:30
+010095E01581C000,"even if TEMPEST",gpu,ingame,2023-06-22 23:50:25
+010072C010002000,"Event Horizon: Space Defense",,playable,2020-07-31 20:31:24
+0100DCF0093EC000,"Everspace™ - Stellar Edition",UE4,playable,2022-08-14 01:16:24
+01006F900BF8E000,"Everybody 1-2-Switch!™",services;deadlock,nothing,2023-07-01 05:52:55
+010080600B53E000,"Evil Defenders",nvdec,playable,2020-09-28 17:11:00
+01006A800FA22000,"Evolution Board Game",online,playable,2021-01-20 22:37:56
+0100F2D00C7DE000,"Exception",online-broken,playable,2022-09-20 12:47:10
+0100DD30110CC000,"Exit the Gungeon",,playable,2022-09-22 17:04:43
+0100A82013976000,"Exodemon",,playable,2022-10-27 20:17:52
+0100FA800A1F4000,"EXORDER",nvdec,playable,2021-04-15 14:17:20
+01009B7010B42000,"Explosive Jake",crash,boots,2021-11-03 07:48:32
+0100EFE00A3C2000,"Eyes: The Horror Game",,playable,2021-01-20 21:59:46
+0100E3D0103CE000,"Fable of Fairy Stones",,playable,2021-05-05 21:04:54
+01004200189F4000,"Factorio",deadlock,boots,2024-06-11 19:26:16
+010073F0189B6000,"Fae Farm",,playable,2024-08-25 15:12:12
+010069100DB08000,"Faeria",nvdec;online-broken,menus,2022-10-04 16:44:41
+01008A6009758000,"Fairune Collection",,playable,2021-06-06 15:29:56
+0100F6D00B8F2000,"Fairy Fencer F™: Advent Dark Force",32-bit;crash;nvdec,ingame,2023-04-16 03:53:48
+0100CF900FA3E000,"FAIRY TAIL",nvdec,playable,2022-10-04 23:00:32
+01005A600BE60000,"Fall of Light: Darkest Edition",slow;nvdec,ingame,2024-07-24 04:19:26
+0100AA801258C000,"Fallen Legion Revenants",crash,menus,2021-11-25 08:53:20
+0100D670126F6000,"Famicom Detective Club™: The Girl Who Stands Behind",nvdec,playable,2022-10-27 20:41:40
+010033F0126F4000,"Famicom Detective Club™: The Missing Heir",nvdec,playable,2022-10-27 20:56:23
+010060200FC44000,"Family Feud®",online-broken,playable,2022-10-10 11:42:21
+0100034012606000,"Family Mysteries: Poisonous Promises",audio;crash,menus,2021-11-26 12:35:06
+010017C012726000,"Fantasy Friends",,playable,2022-10-17 19:42:39
+0100767008502000,"FANTASY HERO ~unsigned legacy~",,playable,2022-07-26 12:28:52
+0100944003820000,"Fantasy Strike",online,playable,2021-02-27 01:59:18
+01000E2012F6E000,"Fantasy Tavern Sextet -Vol.1 New World Days-",gpu;crash;Needs Update,ingame,2022-12-05 16:48:00
+01005C10136CA000,"Fantasy Tavern Sextet -Vol.2 Adventurer's Days-",gpu;slow;crash,ingame,2021-11-06 02:57:29
+010022700E7D6000,"FAR: Lone Sails",,playable,2022-09-06 16:33:05
+0100C9E00FD62000,"Farabel",,playable,2020-08-03 17:47:28
+,"Farm Expert 2019 for Nintendo Switch",,playable,2020-07-09 21:42:57
+01000E400ED98000,"Farm Mystery",nvdec,playable,2022-09-06 16:46:47
+010086B00BB50000,"Farm Together",,playable,2021-01-19 20:01:19
+0100EB600E914000,"Farming Simulator 20",nvdec,playable,2021-06-13 10:52:44
+0100D04004176000,"Farming Simulator Nintendo Switch Edition",nvdec,playable,2021-01-19 14:46:44
+0100E99019B3A000,"Fashion Dreamer",,playable,2023-11-12 06:42:52
+01009510001CA000,"FAST RMX",slow;crash;ldn-partial,ingame,2024-06-22 20:48:58
+0100BEB015604000,"FATAL FRAME: Maiden of Black Water",,playable,2023-07-05 16:01:40
+0100DAE019110000,"FATAL FRAME: Mask of the Lunar Eclipse",Incomplete,playable,2024-04-11 06:01:30
+010051400B17A000,"Fate/EXTELLA LINK",ldn-untested;nvdec,playable,2021-01-27 00:45:50
+010053E002EA2000,"Fate/EXTELLA: The Umbral Star",gpu;nvdec;online-broken;vulkan-backend-bug;opengl-backend-bug,ingame,2023-04-24 23:37:55
+0100F6200B7D4000,"fault - milestone one",nvdec,playable,2021-03-24 10:41:49
+01005AC0068F6000,"Fear Effect Sedna",nvdec,playable,2021-01-19 13:10:33
+0100F5501CE12000,"Fearmonium",crash,boots,2024-03-06 11:26:11
+0100E4300CB3E000,"Feather",,playable,2021-06-03 14:11:27
+010003B00D3A2000,"Felix The Reaper",nvdec,playable,2020-10-20 23:43:03
+0100AA3009738000,"Feudal Alloy",,playable,2021-01-14 08:48:14
+01008D900B984000,"FEZ",gpu,ingame,2021-04-18 17:10:16
+01007510040E8000,"FIA European Truck Racing Championship",nvdec,playable,2022-09-06 17:51:59
+0100F7B002340000,"FIFA 18",gpu;online-broken;ldn-untested,ingame,2022-07-26 12:43:59
+0100FFA0093E8000,"FIFA 19",gpu;nvdec;online-broken;ldn-untested,ingame,2022-07-26 13:07:07
+01000A001171A000,"FIFA 21 Nintendo Switch™ Legacy Edition",gpu;online-broken,ingame,2023-12-11 22:10:19
+0100216014472000,"FIFA 22 Nintendo Switch™ Legacy Edition",gpu,ingame,2024-03-02 14:13:48
+01006980127F0000,"Fight Crab",online-broken;ldn-untested,playable,2022-10-05 10:24:04
+010047E010B3E000,"Fight of Animals",online,playable,2020-10-15 15:08:28
+0100C7D00E730000,"Fight'N Rage",,playable,2020-06-16 23:35:19
+0100D02014048000,"FIGHTING EX LAYER ANOTHER DASH",online-broken;UE4,playable,2024-04-07 10:22:33
+0100118009C68000,"Figment",nvdec,playable,2021-01-27 19:36:05
+010095600AA36000,"Fill-a-Pix: Phil's Epic Adventure",,playable,2020-12-22 13:48:22
+0100C3A00BB76000,"Fimbul",nvdec,playable,2022-07-26 13:31:47
+0100C8200E942000,"Fin and the Ancient Mystery",nvdec,playable,2020-12-17 16:40:39
+01000EA014150000,"FINAL FANTASY",crash,nothing,2024-09-05 20:55:30
+01006B7014156000,"FINAL FANTASY II",crash,nothing,2024-04-13 19:18:04
+01006F000B056000,"FINAL FANTASY IX",audout;nvdec,playable,2021-06-05 11:35:00
+0100AA201415C000,"FINAL FANTASY V",,playable,2023-04-26 01:11:55
+0100A5B00BDC6000,"FINAL FANTASY VII",,playable,2022-12-09 17:03:30
+01008B900DC0A000,"FINAL FANTASY VIII Remastered",nvdec,playable,2023-02-15 10:57:48
+0100BC300CB48000,"FINAL FANTASY X/X-2 HD Remaster",gpu,ingame,2022-08-16 20:29:26
+0100EB100AB42000,"FINAL FANTASY XII THE ZODIAC AGE",opengl;vulkan-backend-bug,playable,2024-08-11 07:01:54
+010068F00AA78000,"FINAL FANTASY XV POCKET EDITION HD",,playable,2021-01-05 17:52:08
+0100CE4010AAC000,"FINAL FANTASY® CRYSTAL CHRONICLES™ Remastered Edition",,playable,2023-04-02 23:39:12
+01001BA00AE4E000,"Final Light, The Prison",,playable,2020-07-31 21:48:44
+0100FF100FB68000,"Finding Teddy 2 : Definitive Edition",gpu,ingame,2024-04-19 16:51:33
+0100F4E013AAE000,"Fire & Water",,playable,2020-12-15 15:43:20
+0100F15003E64000,"Fire Emblem Warriors",nvdec,playable,2023-05-10 01:53:10
+010071F0143EA000,"Fire Emblem Warriors: Three Hopes",gpu;nvdec,ingame,2024-05-01 07:07:42
+0100A6301214E000,"Fire Emblem™ Engage",amd-vendor-bug;mac-bug,playable,2024-09-01 23:37:26
+0100A12011CC8000,"Fire Emblem™: Shadow Dragon & the Blade of Light",,playable,2022-10-17 19:49:14
+010055D009F78000,"Fire Emblem™: Three Houses",online-broken,playable,2024-09-14 23:53:50
+010025C014798000,"Fire: Ungh’s Quest",nvdec,playable,2022-10-27 21:41:26
+0100434003C58000,"Firefighters – The Simulation",,playable,2021-02-19 13:32:05
+0100BB1009E50000,"Firefighters: Airport Fire Department",,playable,2021-02-15 19:17:00
+0100AC300919A000,"Firewatch",,playable,2021-06-03 10:56:38
+0100BA9012B36000,"Firework",,playable,2020-12-04 20:20:09
+0100DEB00ACE2000,"Fishing Star World Tour",,playable,2022-09-13 19:08:51
+010069800D292000,"Fishing Universe Simulator",,playable,2021-04-15 14:00:43
+0100807008868000,"Fit Boxing",,playable,2022-07-26 19:24:55
+0100E7300AAD4000,"Fitness Boxing",,playable,2021-04-14 20:33:33
+0100073011382000,"Fitness Boxing 2: Rhythm & Exercise",crash,ingame,2021-04-14 20:40:48
+0100C7E0134BE000,"Five Dates",nvdec,playable,2020-12-11 15:17:11
+0100B6200D8D2000,"Five Nights at Freddy's",,playable,2022-09-13 19:26:36
+01004EB00E43A000,"Five Nights at Freddy's 2",,playable,2023-02-08 15:48:24
+010056100E43C000,"Five Nights at Freddy's 3",,playable,2022-09-13 20:58:07
+010083800E43E000,"Five Nights at Freddy's 4",,playable,2023-08-19 07:28:03
+0100F7901118C000,"Five Nights at Freddy's: Help Wanted",UE4,playable,2022-09-29 12:40:09
+01009060193C4000,"Five Nights at Freddy's: Security Breach",gpu;crash;mac-bug,ingame,2023-04-23 22:33:28
+01003B200E440000,"Five Nights at Freddy's: Sister Location",,playable,2023-10-06 09:00:58
+010038200E088000,"Flan",crash;regression,ingame,2021-11-17 07:39:28
+01000A0004C50000,"FLASHBACK™",nvdec,playable,2020-05-14 13:57:29
+0100C53004C52000,"Flat Heroes",gpu,ingame,2022-07-26 19:37:37
+0100B54012798000,"Flatland: Prologue",,playable,2020-12-11 20:41:12
+0100307004B4C000,"Flinthook",online,playable,2021-03-25 20:42:29
+010095A004040000,"Flip Wars",services;ldn-untested,ingame,2022-05-02 15:39:18
+01009FB002B2E000,"Flipping Death",,playable,2021-02-17 16:12:30
+0100D1700ACFC000,"Flood of Light",,playable,2020-05-15 14:15:25
+0100DF9005E7A000,"Floor Kids",nvdec,playable,2024-08-18 19:38:49
+010040700E8FC000,"Florence",,playable,2020-09-05 01:22:30
+0100F5D00CD58000,"Flowlines VS",,playable,2020-12-17 17:01:53
+010039C00E2CE000,"Flux8",nvdec,playable,2020-06-19 20:55:11
+0100EDA00BBBE000,"Fly O'Clock",,playable,2020-05-17 13:39:52
+0100FC300F4A4000,"Fly Punch Boom!",online,playable,2020-06-21 12:06:11
+0100419013A8A000,"Flying Hero X",crash,menus,2021-11-17 07:46:58
+010056000BA1C000,"Fobia",,playable,2020-12-14 21:05:23
+0100F3900D0F0000,"Food Truck Tycoon",,playable,2022-10-17 20:15:55
+01007CF013152000,"Football Manager 2021 Touch",gpu,ingame,2022-10-17 20:08:23
+0100EDC01990E000,"Football Manager 2023 Touch",gpu,ingame,2023-08-01 03:40:53
+010097F0099B4000,"Football Manager Touch 2018",,playable,2022-07-26 20:17:56
+010069400B6BE000,"For The King",nvdec,playable,2021-02-15 18:51:44
+01001D200BCC4000,"Forager",crash,menus,2021-11-24 07:10:17
+0100AE001256E000,"FORECLOSED",crash;Needs More Attention;nvdec,ingame,2022-12-06 14:41:12
+010044B00E70A000,"Foregone",deadlock,ingame,2020-12-17 15:26:53
+010059E00B93C000,"Forgotton Anne",nvdec,playable,2021-02-15 18:28:07
+01008EA00405C000,"forma.8",nvdec,playable,2020-11-15 01:04:32
+010025400AECE000,"Fortnite",services-horizon,nothing,2024-04-06 18:23:25
+0100AAE01E39C000,"Fortress Challenge - Fort Boyard",nvdec;slow,playable,2020-05-15 13:22:53
+0100CA500756C000,"Fossil Hunters",nvdec,playable,2022-07-27 11:37:20
+01008A100A028000,"FOX n FORESTS",,playable,2021-02-16 14:27:49
+0100D2501001A000,"FoxyLand",,playable,2020-07-29 20:55:20
+01000AC010024000,"FoxyLand 2",,playable,2020-08-06 14:41:30
+01004200099F2000,"Fractured Minds",,playable,2022-09-13 21:21:40
+0100F1A00A5DC000,"FRAMED Collection",nvdec,playable,2022-07-27 11:48:15
+0100AC40108D8000,"Fred3ric",,playable,2021-04-15 13:30:31
+01000490067AE000,"Frederic 2: Evil Strikes Back",,playable,2020-07-23 16:44:37
+01005B1006988000,"Frederic: Resurrection of Music",nvdec,playable,2020-07-23 16:59:53
+010082B00EE50000,"Freedom Finger",nvdec,playable,2021-06-09 19:31:30
+0100EB800B614000,"Freedom Planet",,playable,2020-05-14 12:23:06
+010003F00BD48000,"Friday the 13th: Killer Puzzle",,playable,2021-01-28 01:33:38
+010092A00C4B6000,"Friday the 13th: The Game Ultimate Slasher Edition",nvdec;online-broken;UE4,playable,2022-09-06 17:33:27
+0100F200178F4000,"FRONT MISSION 1st: Remake",,playable,2023-06-09 07:44:24
+0100861012474000,"Frontline Zed",,playable,2020-10-03 12:55:59
+0100B5300B49A000,"Frost",,playable,2022-07-27 12:00:36
+010038A007AA4000,"FruitFall Crush",,playable,2020-10-20 11:33:33
+01008D800AE4A000,"FullBlast",,playable,2020-05-19 10:34:13
+010002F00CC20000,"FUN! FUN! Animal Park",,playable,2021-04-14 17:08:52
+0100A8F00B3D0000,"FunBox Party",,playable,2020-05-15 12:07:02
+0100E7B00BF24000,"Funghi Explosion",,playable,2020-11-23 14:17:41
+01008E10130F8000,"Funimation",gpu,boots,2021-04-08 13:08:17
+0100EA501033C000,"Funny Bunny Adventures",,playable,2020-08-05 13:46:56
+01000EC00AF98000,"Furi",,playable,2022-07-27 12:21:20
+0100A6B00D4EC000,"Furwind",,playable,2021-02-19 19:44:08
+0100ECE00C0C4000,"Fury Unleashed",crash;services,ingame,2020-10-18 11:52:40
+010070000ED9E000,"Fury Unleashed Demo",,playable,2020-10-08 20:09:21
+0100E1F013674000,"FUSER™",nvdec;UE4,playable,2022-10-17 20:58:32
+,"Fushigi no Gensokyo Lotus Labyrinth",Needs Update;audio;gpu;nvdec,ingame,2021-01-20 15:30:02
+01003C300B274000,"Futari de! Nyanko Daisensou",,playable,2024-01-05 22:26:52
+010055801134E000,"FUZE Player",online-broken;vulkan-backend-bug,ingame,2022-10-18 12:23:53
+0100EAD007E98000,"FUZE4 Nintendo Switch",vulkan-backend-bug,playable,2022-09-06 19:25:01
+010067600F1A0000,"FuzzBall",crash,nothing,2021-03-29 20:13:21
+,"G-MODE Archives 06 The strongest ever Julia Miyamoto",,playable,2020-10-15 13:06:26
+0100EB10108EA000,"G.I. Joe: Operation Blackout",UE4;crash,boots,2020-11-21 12:37:44
+010048600B14E000,"Gal Metal",,playable,2022-07-27 20:57:48
+010024700901A000,"Gal*Gun 2",nvdec;UE4,playable,2022-07-27 12:45:37
+0100047013378000,"Gal*Gun Returns [ ぎゃる☆がん りたーんず ]",nvdec,playable,2022-10-17 23:50:46
+0100C9800A454000,"GALAK-Z: Variant S",online-broken,boots,2022-07-29 11:59:12
+0100C62011050000,"Game Boy™ – Nintendo Switch Online",,playable,2023-03-21 12:43:48
+010012F017576000,"Game Boy™ Advance – Nintendo Switch Online",,playable,2023-02-16 20:38:15
+0100FA5010788000,"Game Builder Garage™",,ingame,2024-04-20 21:46:22
+0100AF700BCD2000,"Game Dev Story",,playable,2020-05-20 00:00:38
+01006BD00F8C0000,"Game Doraemon Nobita no Shin Kyoryu",gpu,ingame,2023-02-27 02:03:28
+01000FA00A4E4000,"Garage",,playable,2020-05-19 20:59:53
+010061E00E8BE000,"Garfield Kart Furious Racing",ldn-works;loader-allocator,playable,2022-09-13 21:40:25
+0100EA001069E000,"Gates Of Hell",slow,playable,2020-10-22 12:44:26
+010025500C098000,"Gato Roboto",,playable,2023-01-20 15:04:11
+010065E003FD8000,"Gear.Club Unlimited",,playable,2021-06-08 13:03:19
+010072900AFF0000,"Gear.Club Unlimited 2",nvdec;online-broken,playable,2022-07-29 12:52:16
+01000F000D9F0000,"Geki Yaba Runner Anniversary Edition",,playable,2021-02-19 18:59:07
+010052A00942A000,"Gekido Kintaro's Revenge",,playable,2020-10-27 12:44:05
+01009D000AF3A000,"Gelly Break Deluxe",UE4,playable,2021-03-03 16:04:02
+01001A4008192000,"Gem Smashers",nvdec,playable,2021-06-08 13:40:51
+010014901144C000,"Genetic Disaster",,playable,2020-06-19 21:41:12
+0100D7E0110B2000,"Genkai Tokki Moero Crystal H- 極限凸起 萌情水晶 H - 한계돌파 모에로크리스탈 H",32-bit,playable,2022-06-06 00:42:09
+010000300C79C000,"GensokyoDefenders",online-broken;UE4,playable,2022-07-29 13:48:12
+0100AC600EB4C000,"Gensou Rougoku no Kaleidscope",crash,menus,2021-11-24 08:45:07
+01007FC012FD4000,"Georifters",UE4;crash;nvdec,menus,2020-12-04 22:30:50
+010058F010296000,"GERRRMS",,playable,2020-08-15 11:32:52
+01006F30129F8000,"Get 10 quest",,playable,2020-08-03 12:48:39
+0100B5B00E77C000,"Get Over Here",,playable,2022-10-28 11:53:52
+0100EEB005ACC000,"Ghost 1.0",,playable,2021-02-19 20:48:47
+010063200C588000,"Ghost Blade HD",online-broken,playable,2022-09-13 21:51:21
+010057500E744000,"Ghost Grab 3000",,playable,2020-07-11 18:09:52
+010094C00E180000,"Ghost Parade",,playable,2020-07-14 00:43:54
+01004B301108C000,"Ghost Sweeper",,playable,2022-10-10 12:45:36
+010029B018432000,"Ghost Trick: Phantom Detective",,playable,2023-08-23 14:50:12
+010008A00F632000,"Ghostbusters: The Video Game Remastered",nvdec,playable,2021-09-17 07:26:57
+010090F012916000,"Ghostrunner",UE4;crash;gpu;nvdec,ingame,2020-12-17 13:01:59
+0100D6200F2BA000,"Ghosts 'n Goblins Resurrection",,playable,2023-05-09 12:40:41
+01003830092B8000,"Giana Sisters: Twisted Dreams - Owltimate Edition",,playable,2022-07-29 14:06:12
+0100D95012C0A000,"Gibbous - A Cthulhu Adventure",nvdec,playable,2022-10-10 12:57:17
+010045F00BFC2000,"GIGA WRECKER ALT.",,playable,2022-07-29 14:13:54
+01002C400E526000,"Gigantosaurus The Game",UE4,playable,2022-09-27 21:20:00
+0100C50007070000,"Ginger: Beyond the Crystal",,playable,2021-02-17 16:27:00
+01006BA013990000,"Girabox",,playable,2020-12-12 13:55:05
+01007E90116CE000,"Giraffe and Annika",UE4;crash,ingame,2020-12-04 22:41:57
+01006DD00CC96000,"Girls und Panzer Dream Tank Match DX",ldn-untested,playable,2022-09-12 16:07:11
+01005CB009E20000,"Glaive: Brick Breaker",,playable,2020-05-20 12:15:59
+0100B6F01227C000,"Glitch's Trip",,playable,2020-12-17 16:00:57
+0100EB501130E000,"Glyph",,playable,2021-02-08 19:56:51
+0100EB8011B0C000,"Gnome More War",,playable,2020-12-17 16:33:07
+010008D00CCEC000,"Gnomes Garden 2",,playable,2021-02-19 20:08:13
+010036C00D0D6000,"Gnomes Garden: Lost King",deadlock,menus,2021-11-18 11:14:03
+01008EF013A7C000,"Gnosia",,playable,2021-04-05 17:20:30
+01000C800FADC000,"Go All Out!",online-broken,playable,2022-09-21 19:16:34
+010055A0161F4000,"Go Rally",gpu,ingame,2023-08-16 21:18:23
+0100C1800A9B6000,"Go Vacation™",nvdec;ldn-works,playable,2024-05-13 19:28:53
+0100E6300F854000,"Go! Fish Go!",,playable,2020-07-27 13:52:28
+010032600C8CE000,"Goat Simulator: The GOATY",32-bit,playable,2022-07-29 21:02:33
+01001C700873E000,"GOD EATER 3",gpu;nvdec,ingame,2022-07-29 21:33:21
+0100F3D00B032000,"GOD WARS The Complete Legend",nvdec,playable,2020-05-19 14:37:50
+0100CFA0111C8000,"Gods Will Fall",,playable,2021-02-08 16:49:59
+0100D82009024000,"Goetia",,playable,2020-05-19 12:55:39
+01004D501113C000,"Going Under",deadlock;nvdec,ingame,2020-12-11 22:29:46
+0100126006EF0000,"GOKEN",,playable,2020-08-05 20:22:38
+010013800F0A4000,"Golazo!",,playable,2022-09-13 21:58:37
+01003C000D84C000,"Golem Gates",crash;nvdec;online-broken;UE4,ingame,2022-07-30 11:35:11
+0100779004172000,"Golf Story",,playable,2020-05-14 14:56:17
+01006FB00EBE0000,"Golf With Your Friends",online-broken,playable,2022-09-29 12:55:11
+0100EEC00AA6E000,"Gone Home",,playable,2022-08-01 11:14:20
+01007C2002B3C000,"GoNNER",,playable,2020-05-19 12:05:02
+0100B0500FE4E000,"Good Job!™",,playable,2021-03-02 13:15:55
+01003AD0123A2000,"Good Night, Knight",crash,nothing,2023-07-30 23:38:13
+0100F610122F6000,"Good Pizza, Great Pizza",,playable,2020-12-04 22:59:18
+010014C0100C6000,"Goosebumps Dead of Night",gpu;nvdec,ingame,2020-12-10 20:02:16
+0100B8000B190000,"Goosebumps The Game",,playable,2020-05-19 11:56:52
+0100F2A005C98000,"Gorogoa",,playable,2022-08-01 11:55:08
+01000C7003FE8000,"GORSD",,playable,2020-12-04 22:15:21
+0100E8D007E16000,"Gotcha Racing 2nd",,playable,2020-07-23 17:14:04
+01001010121DE000,"Gothic Murder: Adventure That Changes Destiny",deadlock;crash,ingame,2022-09-30 23:16:53
+01003FF009E60000,"Grab the Bottle",,playable,2020-07-14 17:06:41
+01004D10020F2000,"Graceful Explosion Machine",,playable,2020-05-19 20:36:55
+010038D00EC88000,"Grand Brix Shooter",slow,playable,2020-06-24 13:23:54
+010038100D436000,"Grand Guilds",UE4;nvdec,playable,2021-04-26 12:49:05
+0100BE600D07A000,"Grand Prix Story",,playable,2022-08-01 12:42:23
+05B1D2ABD3D30000,"Grand Theft Auto 3",services;crash;homebrew,nothing,2023-05-01 22:01:58
+0100E0600BBC8000,"GRANDIA HD Collection",crash,boots,2024-08-19 04:29:48
+010028200E132000,"Grass Cutter - Mutated Lawns",slow,ingame,2020-05-19 18:27:42
+010074E0099FA000,"Grave Danger",,playable,2020-05-18 17:41:28
+010054A013E0C000,"GraviFire",,playable,2021-04-05 17:13:32
+01002C2011828000,"Gravity Rider Zero",gpu;vulkan-backend-bug,ingame,2022-09-29 13:56:13
+0100BD800DFA6000,"Greedroid",,playable,2020-12-14 11:14:32
+010068D00AE68000,"GREEN",,playable,2022-08-01 12:54:15
+0100CBB0070EE000,"Green Game: TimeSwapper",nvdec,playable,2021-02-19 18:51:55
+0100DFE00F002000,"GREEN The Life Algorithm",,playable,2022-09-27 21:37:13
+0100DA7013792000,"Grey Skies: A War of the Worlds Story",UE4,playable,2022-10-24 11:13:59
+010031200981C000,"Grid Mania",,playable,2020-05-19 14:11:05
+0100197008B52000,"GRIDD: Retroenhanced",,playable,2020-05-20 11:32:40
+0100DC800A602000,"GRID™ Autosport",nvdec;online-broken;ldn-untested,playable,2023-03-02 20:14:45
+0100B7900B024000,"Grim Fandango Remastered",nvdec,playable,2022-08-01 13:55:58
+010078E012D80000,"Grim Legends 2: Song of the Dark Swan",nvdec,playable,2022-10-18 12:58:45
+010009F011F90000,"Grim Legends: The Forsaken Bride",nvdec,playable,2022-10-18 13:14:06
+01001E200F2F8000,"Grimshade",,playable,2022-10-02 12:44:20
+0100538012496000,"Grindstone",,playable,2023-02-08 15:54:06
+0100459009A2A000,"GRIP",nvdec;online-broken;UE4,playable,2022-08-01 15:00:22
+0100E1700C31C000,"GRIS",nvdec,playable,2021-06-03 13:33:44
+01009D7011B02000,"GRISAIA PHANTOM TRIGGER 01&02",nvdec,playable,2022-12-04 21:16:06
+01005250123B8000,"GRISAIA PHANTOM TRIGGER 03",audout,playable,2021-01-31 12:30:47
+0100D970123BA000,"GRISAIA PHANTOM TRIGGER 04",audout,playable,2021-01-31 12:40:37
+01002330123BC000,"GRISAIA PHANTOM TRIGGER 05",audout;nvdec,playable,2021-01-31 12:49:59
+0100CAF013AE6000,"GRISAIA PHANTOM TRIGGER 5.5",audout;nvdec,playable,2021-01-31 12:59:44
+010091300FFA0000,"Grizzland",gpu,ingame,2024-07-11 16:28:34
+0100EB500D92E000,"GROOVE COASTER WAI WAI PARTY!!!!",nvdec;ldn-broken,playable,2021-11-06 14:54:27
+01007E100456C000,"Guacamelee! 2",,playable,2020-05-15 14:56:59
+0100BAE00B470000,"Guacamelee! Super Turbo Championship Edition",,playable,2020-05-13 23:44:18
+010089900C9FA000,"Guess the Character",,playable,2020-05-20 13:14:19
+01005DC00D80C000,"Guess the word",,playable,2020-07-26 21:34:25
+01006F80082E4000,"GUILTY GEAR XX ACCENT CORE PLUS R",nvdec,playable,2021-01-13 09:28:33
+01003C6008940000,"GUNBIRD for Nintendo Switch",32-bit,playable,2021-06-04 19:16:01
+0100BCB00AE98000,"GUNBIRD2 for Nintendo Switch",,playable,2020-10-10 14:41:16
+,"Gunka o haita neko",gpu;nvdec,ingame,2020-08-25 12:37:56
+010061000D318000,"Gunman Clive HD Collection",,playable,2020-10-09 12:17:35
+01006D4003BCE000,"Guns, Gore and Cannoli 2",online,playable,2021-01-06 18:43:59
+01008C800E654000,"Gunvolt Chronicles Luminous Avenger iX - Retail Version",,playable,2020-06-16 22:47:07
+0100763015C2E000,"Gunvolt Chronicles: Luminous Avenger iX 2",crash;Needs Update,nothing,2022-04-29 15:34:34
+01002C8018554000,"Gurimugurimoa OnceMore Demo",,playable,2022-07-29 22:07:31
+0100AC601DCA8000,"GYLT",crash,ingame,2024-03-18 20:16:51
+0100822012D76000,"HAAK",gpu,ingame,2023-02-19 14:31:05
+01007E100EFA8000,"Habroxia",,playable,2020-06-16 23:04:42
+0100535012974000,"Hades",vulkan,playable,2022-10-05 10:45:21
+0100618010D76000,"Hakoniwa Explorer Plus",slow,ingame,2021-02-19 16:56:19
+0100E0D00C336000,"Halloween Pinball",,playable,2021-01-12 16:00:46
+01006FF014152000,"Hamidashi Creative",gpu,ingame,2021-12-19 15:30:51
+01003B9007E86000,"Hammerwatch",online-broken;ldn-broken,playable,2022-08-01 16:28:46
+01003620068EA000,"Hand of Fate 2",,playable,2022-08-01 15:44:16
+0100973011358000,"Hang The Kings",,playable,2020-07-28 22:56:59
+010066C018E50000,"Happy Animals Mini Golf",gpu,ingame,2022-12-04 19:24:28
+0100ECE00D13E000,"Hard West",regression,nothing,2022-02-09 07:45:56
+0100D55011D60000,"Hardcore Maze Cube",,playable,2020-12-04 20:01:24
+01002F0011DD4000,"HARDCORE MECHA",slow,playable,2020-11-01 15:06:33
+01000C90117FA000,"HardCube",,playable,2021-05-05 18:33:03
+0100BB600C096000,"Hardway Party",,playable,2020-07-26 12:35:07
+0100D0500AD30000,"Harvest Life",,playable,2022-08-01 16:51:45
+010016B010FDE000,"Harvest Moon®: One World",,playable,2023-05-26 09:17:19
+0100A280187BC000,"Harvestella",UE4;vulkan-backend-bug;mac-bug,playable,2024-02-13 07:04:11
+0100E29001298000,"Has-Been Heroes",,playable,2021-01-13 13:31:48
+01001CC00FA1A000,"Hatsune Miku: Project DIVA Mega Mix",audio;online-broken,playable,2024-01-07 23:12:57
+01009E6014F18000,"Haunted Dawn: The Zombie Apocalypse",,playable,2022-10-28 12:31:51
+010023F008204000,"Haunted Dungeons:Hyakki Castle",,playable,2020-08-12 14:21:48
+0100E2600DBAA000,"Haven",,playable,2021-03-24 11:52:41
+0100EA900FB2C000,"Hayfever",loader-allocator,playable,2022-09-22 17:35:41
+0100EFE00E1DC000,"Headliner: NoviNews",online,playable,2021-03-01 11:36:00
+0100A8200C372000,"Headsnatchers",UE4;crash,menus,2020-07-14 13:29:14
+010067400EA5C000,"Headspun",,playable,2020-07-31 19:46:47
+0100D12008EE4000,"Heart&Slash",,playable,2021-01-13 20:56:32
+010059100D928000,"Heaven Dust",,playable,2020-05-17 14:02:41
+0100FD901000C000,"Heaven's Vault",crash,ingame,2021-02-08 18:22:01
+0100B9C012B66000,"Helheim Hassle",,playable,2020-10-14 11:38:36
+0100E4300C278000,"Hell is Other Demons",,playable,2021-01-13 13:23:02
+01000938017E5C00,"Hell Pie0",nvdec;UE4,playable,2022-11-03 16:48:46
+0100A4600E27A000,"Hell Warders",online,playable,2021-02-27 02:31:03
+010044500CF8E000,"Hellblade: Senua's Sacrifice",gpu;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-01 19:36:50
+010087D0084A8000,"Hello Kitty Kruisers With Sanrio Friends",nvdec,playable,2021-06-04 19:08:46
+0100FAA00B168000,"Hello Neighbor",UE4,playable,2022-08-01 21:32:23
+010092B00C4F0000,"Hello Neighbor Hide and Seek",UE4;gpu;slow,ingame,2020-10-24 10:59:57
+010024600C794000,"Hellpoint",,menus,2021-11-26 13:24:20
+0100BEA00E63A000,"Hero Express",nvdec,playable,2020-08-06 13:23:43
+010077D01094C000,"Hero-U: Rogue to Redemption",nvdec,playable,2021-03-24 11:40:01
+0100D2B00BC54000,"Heroes of Hammerwatch - Ultimate Edition",,playable,2022-08-01 18:30:21
+01001B70080F0000,"HEROINE ANTHEM ZERO episode 1",vulkan-backend-bug,playable,2022-08-01 22:02:36
+010057300B0DC000,"Heroki",gpu,ingame,2023-07-30 19:30:01
+0100C2700E338000,"Heroland",,playable,2020-08-05 15:35:39
+01007AC00E012000,"HexaGravity",,playable,2021-05-28 13:47:48
+01004E800F03C000,"Hidden",slow,ingame,2022-10-05 10:56:53
+0100F6A00A684000,"Higurashi no Naku Koro ni Hō",audio,ingame,2021-09-18 14:40:28
+0100F8D0129F4000,"Himehibi 1 gakki - Princess Days",crash,nothing,2021-11-03 08:34:19
+0100F3D008436000,"Hiragana Pixel Party",,playable,2021-01-14 08:36:50
+01004990132AC000,"HITMAN 3 - Cloud Version",Needs Update;crash;services,nothing,2021-04-18 22:35:07
+010083A018262000,"Hitman: Blood Money — Reprisal",deadlock,ingame,2024-09-28 16:28:50
+01004B100A5CC000,"Hob: The Definitive Edition",,playable,2021-01-13 09:39:19
+0100F7300ED2C000,"Hoggy2",,playable,2022-10-10 13:53:35
+0100F7E00C70E000,"Hogwarts Legacy",slow,ingame,2024-09-03 19:53:58
+0100633007D48000,"Hollow Knight",nvdec,playable,2023-01-16 15:44:56
+0100F2100061E800,"Hollow0",UE4;gpu,ingame,2021-03-03 23:42:56
+0100342009E16000,"Holy Potatoes! What The Hell?!",,playable,2020-07-03 10:48:56
+010071B00C904000,"HoPiKo",,playable,2021-01-13 20:12:38
+010087800EE5A000,"Hopping girl KOHANE Jumping Kingdom: Princess of the Black Rabbit",crash,boots,2023-02-19 00:51:21
+010086D011EB8000,"Horace",,playable,2022-10-10 14:03:50
+0100001019F6E000,"Horizon Chase 2",deadlock;slow;crash;UE4,ingame,2024-08-19 04:24:06
+01009EA00B714000,"Horizon Chase Turbo",,playable,2021-02-19 19:40:56
+0100E4200FA82000,"Horror Pinball Bundle",crash,menus,2022-09-13 22:15:34
+0100017007980000,"Hotel Transylvania 3 Monsters Overboard",nvdec,playable,2021-01-27 18:55:31
+0100D0E00E51E000,"Hotline Miami Collection",nvdec,playable,2022-09-09 16:41:19
+0100BDE008218000,"Hotshot Racing",gpu;nvdec;online-broken;ldn-untested;vulkan-backend-bug,ingame,2024-02-04 21:31:17
+0100CAE00EB02000,"House Flipper",,playable,2021-06-16 18:28:32
+0100F6800910A000,"Hover",online-broken,playable,2022-09-20 12:54:46
+0100A66003384000,"Hulu",online-broken,boots,2022-12-09 10:05:00
+0100701001D92000,"Human Resource Machine",32-bit,playable,2020-12-17 21:47:09
+01000CA004DCA000,"Human: Fall Flat",,playable,2021-01-13 18:36:05
+0100E1A00AF40000,"Hungry Shark® World",,playable,2021-01-13 18:26:08
+0100EBA004726000,"Huntdown",,playable,2021-04-05 16:59:54
+010068000CAC0000,"Hunter's Legacy: Purrfect Edition",,playable,2022-08-02 10:33:31
+0100C460040EA000,"Hunting Simulator",UE4,playable,2022-08-02 10:54:08
+010061F010C3A000,"Hunting Simulator 2",UE4,playable,2022-10-10 14:25:51
+0100B3300B4AA000,"Hyper Jam",UE4;crash,boots,2020-12-15 22:52:11
+01003B200B372000,"Hyper Light Drifter - Special Edition",vulkan-backend-bug,playable,2023-01-13 15:44:48
+01006C500A29C000,"HyperBrawl Tournament",crash;services,boots,2020-12-04 23:03:27
+0100A8B00F0B4000,"HYPERCHARGE Unboxed",nvdec;online-broken;UE4;ldn-untested,playable,2022-09-27 21:52:39
+010061400ED90000,"HyperParasite",nvdec;UE4,playable,2022-09-27 22:05:44
+0100959010466000,"Hypnospace Outlaw",nvdec,ingame,2023-08-02 22:46:49
+01002B00111A2000,"Hyrule Warriors: Age of Calamity",gpu;deadlock;slow;crash;nvdec;amd-vendor-bug,ingame,2024-02-28 00:47:00
+0100A2C01320E000,"Hyrule Warriors: Age of Calamity - Demo Version",slow,playable,2022-10-10 17:37:41
+0100AE00096EA000,"Hyrule Warriors: Definitive Edition",services-horizon;nvdec,ingame,2024-06-16 10:34:05
+0100849000BDA000,"I Am Setsuna",,playable,2021-11-28 11:06:11
+01001860140B0000,"I Saw Black Clouds",nvdec,playable,2021-04-19 17:22:16
+0100429006A06000,"I, Zombie",,playable,2021-01-13 14:53:44
+01004E5007E92000,"Ice Age Scrat's Nutty Adventure!",nvdec,playable,2022-09-13 22:22:29
+010053700A25A000,"Ice Cream Surfer",,playable,2020-07-29 12:04:07
+0100954014718000,"Ice Station Z",crash,menus,2021-11-21 20:02:15
+0100BE9007E7E000,"ICEY",,playable,2021-01-14 16:16:04
+0100BC60099FE000,"Iconoclasts",,playable,2021-08-30 21:11:04
+01001E700EB28000,"Idle Champions of the Forgotten Realms",online,boots,2020-12-17 18:24:57
+01002EC014BCA000,"IdolDays",gpu;crash,ingame,2021-12-19 15:31:28
+01006550129C6000,"If Found...",,playable,2020-12-11 13:43:14
+01001AC00ED72000,"If My Heart Had Wings",,playable,2022-09-29 14:54:57
+01009F20086A0000,"Ikaruga",,playable,2023-04-06 15:00:02
+010040900AF46000,"Ikenfell",,playable,2021-06-16 17:18:44
+01007BC00E55A000,"Immortal Planet",,playable,2022-09-20 13:40:43
+010079501025C000,"Immortal Realms: Vampire Wars",nvdec,playable,2021-06-17 17:41:46
+01000F400435A000,"Immortal Redneck",nvdec,playable,2021-01-27 18:36:28
+01004A600EC0A000,"Immortals Fenyx Rising™",gpu;crash,menus,2023-02-24 16:19:55
+0100737003190000,"IMPLOSION",nvdec,playable,2021-12-12 03:52:13
+0100A760129A0000,"In rays of the Light",,playable,2021-04-07 15:18:07
+0100A2101107C000,"Indie Puzzle Bundle Vol 1",,playable,2022-09-27 22:23:21
+010002A00CD68000,"Indiecalypse",nvdec,playable,2020-06-11 20:19:09
+01001D3003FDE000,"Indivisible",nvdec,playable,2022-09-29 15:20:57
+01002BD00F626000,"Inertial Drift",online-broken,playable,2022-10-11 12:22:19
+0100D4300A4CA000,"Infernium",UE4;regression,nothing,2021-01-13 16:36:07
+010039C001296000,"Infinite Minigolf",online,playable,2020-09-29 12:26:25
+01001CB00EFD6000,"Infliction: Extended Cut",nvdec;UE4,playable,2022-10-02 13:15:55
+0100F1401161E000,"INMOST",,playable,2022-10-05 11:27:40
+0100F200049C8000,"InnerSpace",,playable,2021-01-13 19:36:14
+0100D2D009028000,"INSIDE",,playable,2021-12-25 20:24:56
+0100EC7012D34000,"Inside Grass: A little adventure",,playable,2020-10-15 15:26:27
+010099700D750000,"Instant Sports",,playable,2022-09-09 12:59:40
+010099A011A46000,"Instant Sports Summer Games",gpu,menus,2020-09-02 13:39:28
+010031B0145B8000,"INSTANT SPORTS TENNIS",,playable,2022-10-28 16:42:17
+010041501005E000,"Interrogation: You will be deceived",,playable,2022-10-05 11:40:10
+01000F700DECE000,"Into the Dead 2",nvdec,playable,2022-09-14 12:36:14
+01001D0003B96000,"INVERSUS Deluxe",online-broken,playable,2022-08-02 14:35:36
+0100C5B00FADE000,"Invisible Fist",,playable,2020-08-08 13:25:52
+010031B00C48C000,"Invisible, Inc. Nintendo Switch Edition",crash,nothing,2021-01-29 16:28:13
+01005F400E644000,"Invisigun Reloaded",gpu;online,ingame,2021-06-10 12:13:24
+010041C00D086000,"Ion Fury",vulkan-backend-bug,ingame,2022-08-07 08:27:51
+010095C016C14000,"Iridium",,playable,2022-08-05 23:19:53
+0100AD300B786000,"Iris School of Wizardry -Vinculum Hearts-",,playable,2022-12-05 13:11:15
+0100945012168000,"Iris.Fall",nvdec,playable,2022-10-18 13:40:22
+01005270118D6000,"Iron Wings",slow,ingame,2022-08-07 08:32:57
+01004DB003E6A000,"IRONCAST",,playable,2021-01-13 13:54:29
+0100E5700CD56000,"Irony Curtain: From Matryoshka with Love",,playable,2021-06-04 20:12:37
+010063E0104BE000,"Is It Wrong to Try to Pick Up Girls in a Dungeon? Familia Myth Infinite Combate",,playable,2020-08-31 13:52:21
+0100F06013710000,"ISLAND",,playable,2021-05-06 15:11:47
+010077900440A000,"Island Flight Simulator",,playable,2021-06-04 19:42:46
+0100A2600FCA0000,"Island Saver",nvdec,playable,2020-10-23 22:07:02
+010065200D192000,"Isoland",,playable,2020-07-26 13:48:16
+0100F5600D194000,"Isoland 2 - Ashes of Time",,playable,2020-07-26 14:29:05
+010001F0145A8000,"Isolomus",services,boots,2021-11-03 07:48:21
+010068700C70A000,"ITTA",,playable,2021-06-07 03:15:52
+01004070022F0000,"Ittle Dew 2+",,playable,2020-11-17 11:44:32
+0100DEB00F12A000,"IxSHE Tell",nvdec,playable,2022-12-02 18:00:42
+0100D8E00C874000,"izneo",online-broken,menus,2022-08-06 15:56:23
+0100CD5008D9E000,"James Pond Codename Robocod",,playable,2021-01-13 09:48:45
+01005F4010AF0000,"Japanese Rail Sim: Journey to Kyoto",nvdec,playable,2020-07-29 17:14:21
+010002D00EDD0000,"JDM Racing",,playable,2020-08-03 17:02:37
+0100C2700AEB8000,"Jenny LeClue - Detectivu",crash,nothing,2020-12-15 21:07:07
+01006E400AE2A000,"Jeopardy!®",audout;nvdec;online,playable,2021-02-22 13:53:46
+0100E4900D266000,"Jet Kave Adventure",nvdec,playable,2022-09-09 14:50:39
+0100F3500C70C000,"Jet Lancer",gpu,ingame,2021-02-15 18:15:47
+0100A5A00AF26000,"Jettomero: Hero of the Universe",,playable,2022-08-02 14:46:43
+01008330134DA000,"Jiffy",gpu;opengl,ingame,2024-02-03 23:11:24
+01001F5006DF6000,"Jim is Moving Out!",deadlock,ingame,2020-06-03 22:05:19
+0100F4D00D8BE000,"Jinrui no Ninasama he",crash,ingame,2023-03-07 02:04:17
+010038D011F08000,"Jisei: The First Case HD",audio,playable,2022-10-05 11:43:33
+01007CE00C960000,"Job the Leprechaun",,playable,2020-06-05 12:10:06
+01007090104EC000,"John Wick Hex",,playable,2022-08-07 08:29:12
+01006E4003832000,"Johnny Turbo's Arcade: Bad Dudes",,playable,2020-12-10 12:30:56
+010069B002CDE000,"Johnny Turbo's Arcade: Gate Of Doom",,playable,2022-07-29 12:17:50
+010080D002CC6000,"Johnny Turbo's Arcade: Two Crude Dudes",,playable,2022-08-02 20:29:50
+0100D230069CC000,"Johnny Turbo's Arcade: Wizard Fire",,playable,2022-08-02 20:39:15
+01008120128C2000,"JoJos Bizarre Adventure All-Star Battle R",,playable,2022-12-03 10:45:10
+01008B60117EC000,"Journey to the Savage Planet",nvdec;UE4;ldn-untested,playable,2022-10-02 18:48:12
+0100C7600F654000,"Juicy Realm",,playable,2023-02-21 19:16:20
+0100B4D00C76E000,"JUMANJI: The Video Game",UE4;crash,boots,2020-07-12 13:52:25
+0100183010F12000,"JUMP FORCE - Deluxe Edition",nvdec;online-broken;UE4,playable,2023-10-01 15:56:05
+01003D601014A000,"Jump King",,playable,2020-06-09 10:12:39
+0100B9C012706000,"Jump Rope Challenge",services;crash;Needs Update,boots,2023-02-27 01:24:28
+0100D87009954000,"Jumping Joe & Friends",,playable,2021-01-13 17:09:42
+010069800D2B4000,"JUNK PLANET",,playable,2020-11-09 12:38:33
+0100CE100A826000,"Jurassic Pinball",,playable,2021-06-04 19:02:37
+010050A011344000,"Jurassic World Evolution: Complete Edition",cpu;crash,menus,2023-08-04 18:06:54
+0100BCE000598000,"Just Dance 2017®",online,playable,2021-03-05 09:46:01
+0100BEE017FC0000,"Just Dance 2023",,nothing,2023-06-05 16:44:54
+010075600AE96000,"Just Dance® 2019",gpu;online,ingame,2021-02-27 17:21:27
+0100DDB00DB38000,"Just Dance® 2020",,playable,2022-01-24 13:31:57
+0100EA6014BB8000,"Just Dance® 2022",gpu;services;crash;Needs Update,ingame,2022-10-28 11:01:53
+0100AC600CF0A000,"Just Die Already",UE4,playable,2022-12-13 13:37:50
+01002C301033E000,"Just Glide",,playable,2020-08-07 17:38:10
+0100830008426000,"Just Shapes & Beats",ldn-untested;nvdec,playable,2021-02-09 12:18:36
+010035A0044E8000,"JYDGE",,playable,2022-08-02 21:20:13
+0100D58012FC2000,"Kagamihara/Justice",crash,nothing,2021-06-21 16:41:29
+0100D5F00EC52000,"Kairobotica",,playable,2021-05-06 12:17:56
+0100BDC00A664000,"KAMEN RIDER CLIMAX SCRAMBLE",nvdec;ldn-untested,playable,2024-07-03 08:51:11
+0100A9801180E000,"KAMEN RIDER memory of heroez / Premium Sound Edition",,playable,2022-12-06 03:14:26
+010085300314E000,"KAMIKO",,playable,2020-05-13 12:48:57
+,"Kangokuto Mary Skelter Finale",audio;crash,ingame,2021-01-09 22:39:28
+01007FD00DB20000,"Katakoi Contrast - collection of branch -",nvdec,playable,2022-12-09 09:41:26
+0100D7000C2C6000,"Katamari Damacy REROLL",,playable,2022-08-02 21:35:05
+0100F9800EDFA000,"KATANA KAMI: A Way of the Samurai Story",slow,playable,2022-04-09 10:40:16
+010029600D56A000,"Katana ZERO",,playable,2022-08-26 08:09:09
+010038B00F142000,"Kaze and the Wild Masks",,playable,2021-04-19 17:11:03
+0100D7C01115E000,"Keen: One Girl Army",,playable,2020-12-14 23:19:52
+01008D400A584000,"Keep Talking and Nobody Explodes",,playable,2021-02-15 18:05:21
+01004B100BDA2000,"KEMONO FRIENDS PICROSS",,playable,2023-02-08 15:54:34
+0100A8200B15C000,"Kentucky Robo Chicken",,playable,2020-05-12 20:54:17
+0100327005C94000,"Kentucky Route Zero: TV Edition",,playable,2024-04-09 23:22:46
+0100DA200A09A000,"Kero Blaster",,playable,2020-05-12 20:42:52
+0100F680116A2000,"Kholat",UE4;nvdec,playable,2021-06-17 11:52:48
+0100C0A004C2C000,"Kid Tripp",crash,nothing,2020-10-15 07:41:23
+0100FB400D832000,"KILL la KILL -IF",,playable,2020-06-09 14:47:08
+010011B00910C000,"Kill The Bad Guy",,playable,2020-05-12 22:16:10
+0100F2900B3E2000,"Killer Queen Black",ldn-untested;online,playable,2021-04-08 12:46:18
+,"Kin'iro no Corda Octave",,playable,2020-09-22 13:23:12
+010089000F0E8000,"Kine",UE4,playable,2022-09-14 14:28:37
+0100E6B00FFBA000,"King Lucas",,playable,2022-09-21 19:43:23
+0100B1300783E000,"King Oddball",,playable,2020-05-13 13:47:57
+01008D80148C8000,"King of Seas",nvdec;UE4,playable,2022-10-28 18:29:41
+0100515014A94000,"King of Seas Demo",nvdec;UE4,playable,2022-10-28 18:09:31
+01005D2011EA8000,"KINGDOM HEARTS Melody of Memory",crash;nvdec,ingame,2021-03-03 17:34:12
+0100A280121F6000,"Kingdom Rush",32-bit;crash;Needs More Attention,nothing,2022-10-05 12:34:00
+01005EF003FF2000,"Kingdom Two Crowns",,playable,2020-05-16 19:36:21
+0100BD9004AB6000,"Kingdom: New Lands",,playable,2022-08-02 21:48:50
+0100EF50132BE000,"Kingdoms of Amalur: Re-Reckoning",,playable,2023-08-10 13:05:08
+010091201605A000,"Kirby and the Forgotten Land (Demo version)",demo,playable,2022-08-21 21:03:01
+0100227010460000,"Kirby Fighters™ 2",ldn-works;online,playable,2021-06-17 13:06:39
+0100A8E016236000,"Kirby’s Dream Buffet™",crash;online-broken;Needs Update;ldn-works,ingame,2024-03-03 17:04:44
+010091D01A57E000,"Kirby’s Return to Dream Land Deluxe - Demo",demo,playable,2023-02-18 17:21:55
+01006B601380E000,"Kirby’s Return to Dream Land™ Deluxe",,playable,2024-05-16 19:58:04
+01004D300C5AE000,"Kirby™ and the Forgotten Land",gpu,ingame,2024-03-11 17:11:21
+01007E3006DDA000,"Kirby™ Star Allies",nvdec,playable,2023-11-15 17:06:19
+0100F3A00F4CA000,"Kissed by the Baddest Bidder",gpu;nvdec,ingame,2022-12-04 20:57:11
+01000C900A136000,"Kitten Squad",nvdec,playable,2022-08-03 12:01:59
+010079D00C8AE000,"Klondike Solitaire",,playable,2020-12-13 16:17:27
+0100A6800DE70000,"Knight Squad",,playable,2020-08-09 16:54:51
+010024B00E1D6000,"Knight Squad 2",nvdec;online-broken,playable,2022-10-28 18:38:09
+0100D51006AAC000,"Knight Terrors",,playable,2020-05-13 13:09:22
+01005F8010D98000,"Knightin'+",,playable,2020-08-31 18:18:21
+010004400B22A000,"Knights of Pen & Paper 2 Deluxiest Edition",,playable,2020-05-13 14:07:00
+0100D3F008746000,"Knights of Pen and Paper +1 Deluxier Edition",,playable,2020-05-11 21:46:32
+010001A00A1F6000,"Knock-Knock",nvdec,playable,2021-02-01 20:03:19
+01009EF00DDB4000,"Knockout City™",services;online-broken,boots,2022-12-09 09:48:58
+0100C57019BA2000,"Koa and the Five Pirates of Mara",gpu,ingame,2024-07-11 16:14:44
+01001E500401C000,"Koi DX",,playable,2020-05-11 21:37:51
+,"Koi no Hanasaku Hyakkaen",32-bit;gpu;nvdec,ingame,2020-10-03 14:17:10
+01005D200C9AA000,"Koloro",,playable,2022-08-03 12:34:02
+0100464009294000,"Kona",,playable,2022-08-03 12:48:19
+010016C011AAA000,"Kono Subarashii Sekai ni Shukufuku o Kono Yokubo no Isho ni Choai o",,playable,2023-04-26 09:51:08
+010088500D5EE000,"KORAL",UE4;crash;gpu,menus,2020-11-16 12:41:26
+0100EC8004762000,"KORG Gadget for Nintendo Switch",,playable,2020-05-13 13:57:24
+010046600CCA4000,"Kotodama: The 7 Mysteries of Fujisawa",audout,playable,2021-02-01 20:28:37
+010022801242C000,"KukkoroDays",crash,menus,2021-11-25 08:52:56
+010035A00DF62000,"KUNAI",nvdec,playable,2022-09-20 13:48:34
+010060400ADD2000,"Kunio-Kun: The World Classics Collection",online,playable,2021-01-29 20:21:46
+010037500F282000,"KUUKIYOMI 2: Consider It More! - New Era",crash;Needs Update,nothing,2021-11-02 09:34:40
+0100894011F62000,"Kwaidan ~Azuma manor story~",,playable,2022-10-05 12:50:44
+0100830004FB6000,"L.A. Noire",,playable,2022-08-03 16:49:35
+0100732009CAE000,"L.F.O. -Lost Future Omega-",UE4;deadlock,boots,2020-10-16 12:16:44
+0100F2B0123AE000,"L.O.L. Surprise! Remix: We Rule The World",,playable,2022-10-11 22:48:03
+010026000F662800,"LA-MULANA",gpu,ingame,2022-08-12 01:06:21
+0100E5D00F4AE000,"LA-MULANA 1 & 2",,playable,2022-09-22 17:56:36
+010038000F644000,"LA-MULANA 2",,playable,2022-09-03 13:45:57
+010058500B3E0000,"Labyrinth of Refrain: Coven of Dusk",,playable,2021-02-15 17:38:48
+010022D0089AE000,"Labyrinth of the Witch",,playable,2020-11-01 14:42:37
+0100BAB00E8C0000,"Langrisser I & II",,playable,2021-02-19 15:46:10
+0100E7200B272000,"Lanota",,playable,2019-09-04 01:58:14
+01005E000D3D8000,"Lapis x Labyrinth",,playable,2021-02-01 18:58:08
+0100AFE00E882000,"Laraan",,playable,2020-12-16 12:45:48
+0100DA700879C000,"Last Day of June",nvdec,playable,2021-06-08 11:35:32
+01009E100BDD6000,"LASTFIGHT",,playable,2022-09-20 13:54:55
+0100055007B86000,"Late Shift",nvdec,playable,2021-02-01 18:43:58
+01004EB00DACE000,"Later Daters Part One",,playable,2020-07-29 16:35:45
+01001730144DA000,"Layers of Fear 2",nvdec;UE4,playable,2022-10-28 18:49:52
+0100BF5006A7C000,"Layers of Fear: Legacy",nvdec,playable,2021-02-15 16:30:41
+0100CE500D226000,"Layton's Mystery Journey: Katrielle and the Millionaires' Conspiracy - Deluxe Edition",nvdec;opengl,playable,2022-09-14 15:01:57
+0100FDB00AA80000,"Layton's Mystery Journey: Katrielle and the Millionaires' Conspiracy DX+0",gpu;nvdec;opengl,ingame,2022-09-14 15:15:55
+01009C100390E000,"League of Evil",online,playable,2021-06-08 11:23:27
+01002E900CD6E000,"Left-Right : The Mansion",,playable,2020-05-13 13:02:12
+010079901C898000,"Legacy of Kain™ Soul Reaver 1&2 Remastered",,playable,2025-01-07 05:50:01
+01002DB007A96000,"Legend of Kay Anniversary",nvdec,playable,2021-01-29 18:38:29
+0100ECC00EF3C000,"Legend of the Skyfish",,playable,2020-06-24 13:04:22
+01007E900DFB6000,"Legend of the Tetrarchs",deadlock,ingame,2020-07-10 07:54:03
+0100A73006E74000,"Legendary Eleven",,playable,2021-06-08 12:09:03
+0100A7700B46C000,"Legendary Fishing",online,playable,2021-04-14 15:08:46
+0100739018020000,"LEGO® 2K Drive",gpu;ldn-works,ingame,2024-04-09 02:05:12
+01003A30012C0000,"LEGO® CITY Undercover",nvdec,playable,2024-09-30 08:44:27
+010070D009FEC000,"LEGO® DC Super-Villains",,playable,2021-05-27 18:10:37
+010052A00B5D2000,"LEGO® Harry Potter™ Collection",crash,ingame,2024-01-31 10:28:07
+010073C01AF34000,"LEGO® Horizon Adventures™",vulkan-backend-bug;opengl-backend-bug;UE4,ingame,2025-01-07 04:24:56
+01001C100E772000,"LEGO® Jurassic World",,playable,2021-05-27 17:00:20
+0100D3A00409E000,"LEGO® Marvel Super Heroes 2",crash,nothing,2023-03-02 17:12:33
+01006F600FFC8000,"LEGO® Marvel™ Super Heroes",,playable,2024-09-10 19:02:19
+01007FC00206E000,"LEGO® NINJAGO® Movie Video Game",crash,nothing,2022-08-22 19:12:53
+010042D00D900000,"LEGO® Star Wars™: The Skywalker Saga",gpu;slow,ingame,2024-04-13 20:08:46
+0100A01006E00000,"LEGO® The Incredibles",crash,nothing,2022-08-03 18:36:59
+0100838002AEA000,"LEGO® Worlds",crash;slow,ingame,2020-07-17 13:35:39
+0100E7500BF84000,"LEGRAND LEGACY: Tale of the Fatebounds",nvdec,playable,2020-07-26 12:27:36
+0100A8E00CAA0000,"Leisure Suit Larry - Wet Dreams Don't Dry",,playable,2022-08-03 19:51:44
+010031A0135CA000,"Leisure Suit Larry - Wet Dreams Dry Twice",,playable,2022-10-28 19:00:57
+01003AB00983C000,"Lethal League Blaze",online,playable,2021-01-29 20:13:31
+01008C300648E000,"Letter Quest Remastered",,playable,2020-05-11 21:30:34
+0100CE301678E800,"Letters - a written adventure",gpu,ingame,2023-02-21 20:12:38
+01009A200BE42000,"Levelhead",online,ingame,2020-10-18 11:44:51
+0100C960041DC000,"Levels+ : Addictive Puzzle Game",,playable,2020-05-12 13:51:39
+0100C8000F146000,"Liberated",gpu;nvdec,ingame,2024-07-04 04:58:24
+01003A90133A6000,"Liberated: Enhanced Edition",gpu;nvdec,ingame,2024-07-04 04:48:48
+01004360045C8000,"Lichtspeer: Double Speer Edition",,playable,2020-05-12 16:43:09
+010041F0128AE000,"Liege Dragon",,playable,2022-10-12 10:27:03
+010006300AFFE000,"Life Goes On",,playable,2021-01-29 19:01:20
+0100FD101186C000,"Life is Strange 2",UE4,playable,2024-07-04 05:05:58
+0100DC301186A000,"Life is Strange Remastered",UE4,playable,2022-10-03 16:54:44
+010008501186E000,"Life is Strange: Before the Storm Remastered",,playable,2023-09-28 17:15:44
+0100500012AB4000,"Life is Strange: True Colors™",gpu;UE4,ingame,2024-04-08 16:11:52
+01003AB012F00000,"Life of Boris: Super Slav",,ingame,2020-12-17 11:40:05
+0100B3A0135D6000,"Life of Fly",,playable,2021-01-25 23:41:07
+010069A01506E000,"Life of Fly 2",slow,playable,2022-10-28 19:26:52
+01005B6008132000,"Lifeless Planet: Premiere Edition",,playable,2022-08-03 21:25:13
+010030A006F6E000,"Light Fall",nvdec,playable,2021-01-18 14:55:36
+010087700D07C000,"Light Tracer",nvdec,playable,2021-05-05 19:15:43
+01009C8009026000,"LIMBO",cpu;32-bit,boots,2023-06-28 15:39:19
+0100EDE012B58000,"Linelight",,playable,2020-12-17 12:18:07
+0100FAD00E65E000,"Lines X",,playable,2020-05-11 15:28:30
+010032F01096C000,"Lines XL",,playable,2020-08-31 17:48:23
+0100943010310000,"Little Busters! Converted Edition",nvdec,playable,2022-09-29 15:34:56
+0100A3F009142000,"Little Dragons Café",,playable,2020-05-12 00:00:52
+010079A00D9E8000,"Little Friends: Dogs & Cats",,playable,2020-11-12 12:45:51
+0100B18001D8E000,"Little Inferno",32-bit;gpu;nvdec,ingame,2020-12-17 21:43:56
+0100E7000E826000,"Little Misfortune",nvdec,playable,2021-02-23 20:39:44
+0100FE0014200000,"Little Mouse's Encyclopedia",,playable,2022-10-28 19:38:58
+01002FC00412C000,"Little Nightmares Complete Edition",nvdec;UE4,playable,2022-08-03 21:45:35
+010097100EDD6000,"Little Nightmares II",UE4,playable,2023-02-10 18:24:44
+010093A0135D6000,"Little Nightmares II DEMO",UE4;demo;vulkan-backend-bug,playable,2024-05-16 18:47:20
+0100535014D76000,"Little Noah: Scion of Paradise",opengl-backend-bug,playable,2022-09-14 04:17:13
+0100E6D00E81C000,"Little Racer",,playable,2022-10-18 16:41:13
+0100DD700D95E000,"Little Shopping",,playable,2020-10-03 16:34:35
+01000FB00AA90000,"Little Town Hero",,playable,2020-10-15 23:28:48
+01000690085BE000,"Little Triangle",,playable,2020-06-17 14:46:26
+0100CF801776C000,"LIVE A LIVE",UE4;amd-vendor-bug,playable,2023-02-05 15:12:07
+0100BA000FC9C000,"LocO-SportS",,playable,2022-09-20 14:09:30
+010016C009374000,"Lode Runner Legacy",,playable,2021-01-10 14:10:28
+0100D2C013288000,"Lofi Ping Pong",crash,ingame,2020-12-15 20:09:22
+0100B6D016EE6000,"Lone Ruin",crash;nvdec,ingame,2023-01-17 06:41:19
+0100A0C00E0DE000,"Lonely Mountains: Downhill",online-broken,playable,2024-07-04 05:08:11
+010062A0178A8000,"LOOPERS",gpu;slow;crash,ingame,2022-06-17 19:21:45
+010064200F7D8000,"Lost Horizon",,playable,2020-09-01 13:41:22
+01005ED010642000,"Lost Horizon 2",nvdec,playable,2020-06-16 12:02:12
+01005FE01291A000,"Lost in Random™",gpu,ingame,2022-12-18 07:09:28
+0100133014510000,"Lost Lands 2: The Four Horsemen",nvdec,playable,2022-10-24 16:41:00
+0100156014C6A000,"Lost Lands 3: The Golden Curse",nvdec,playable,2022-10-24 16:30:00
+0100BDD010AC8000,"Lost Lands: Dark Overlord",,playable,2022-10-03 11:52:58
+010054600AC74000,"LOST ORBIT: Terminal Velocity",,playable,2021-06-14 12:21:12
+010046600B76A000,"Lost Phone Stories",services,ingame,2020-04-05 23:17:33
+01008AD013A86800,"Lost Ruins",gpu,ingame,2023-02-19 14:09:00
+010077B0038B2000,"LOST SPHEAR",,playable,2021-01-10 06:01:21
+0100018013124000,"Lost Words: Beyond the Page",,playable,2022-10-24 17:03:21
+0100D36011AD4000,"Love Letter from Thief X",gpu;nvdec,ingame,2023-11-14 03:55:31
+0100F0300B7BE000,"Ludomania",crash;services,nothing,2020-04-03 00:33:47
+010048701995E000,"Luigi's Mansion™ 2 HD",ldn-broken;amd-vendor-bug,ingame,2024-09-05 23:47:27
+0100DCA0064A6000,"Luigi’s Mansion™ 3",gpu;slow;Needs Update;ldn-works,ingame,2024-09-27 22:17:36
+010052B00B194000,"Lumini",,playable,2020-08-09 20:45:09
+0100FF00042EE000,"Lumo",nvdec,playable,2022-02-11 18:20:30
+0100F3100EB44000,"Lust for Darkness",nvdec,playable,2020-07-26 12:09:15
+0100F0B00F68E000,"Lust for Darkness: Dawn Edition",nvdec,playable,2021-06-16 13:47:46
+0100EC2011A80000,"Luxar",,playable,2021-03-04 21:11:57
+0100F2400D434000,"MachiKnights -Blood bagos-",nvdec;UE4,playable,2022-09-14 15:08:04
+010024A009428000,"Mad Carnage",,playable,2021-01-10 13:00:07
+01005E7013476000,"Mad Father",,playable,2020-11-12 13:22:10
+010061E00EB1E000,"Mad Games Tycoon",,playable,2022-09-20 14:23:14
+01004A200E722000,"Magazine Mogul",loader-allocator,playable,2022-10-03 12:05:34
+01008E500BF62000,"MagiCat",,playable,2020-12-11 15:22:07
+010032C011356000,"Magicolors",,playable,2020-08-12 18:39:11
+01008C300B624000,"Mahjong Solitaire Refresh",crash,boots,2022-12-09 12:02:55
+010099A0145E8000,"Mahluk dark demon",,playable,2021-04-15 13:14:24
+01001C100D80E000,"Mainlining",,playable,2020-06-05 01:02:00
+0100D9900F220000,"Maitetsu:Pure Station",,playable,2022-09-20 15:12:49
+0100A78017BD6000,"Makai Senki Disgaea 7",,playable,2023-10-05 00:22:18
+01005A700CC3C000,"Mana Spark",,playable,2020-12-10 13:41:01
+010093D00CB22000,"Maneater",nvdec;UE4,playable,2024-05-21 16:11:57
+0100361009B1A000,"Manifold Garden",,playable,2020-10-13 20:27:13
+0100C9A00952A000,"Manticore - Galaxy on Fire",crash;nvdec,boots,2024-02-04 04:37:24
+0100E98002F6E000,"Mantis Burn Racing",online-broken;ldn-broken,playable,2024-09-02 02:13:04
+01008E800D1FE000,"Marble Power Blast",,playable,2021-06-04 16:00:02
+01001B2012D5E000,"Märchen Forest",,playable,2021-02-04 21:33:34
+0100DA7017C9E000,"Marco & The Galaxy Dragon Demo",gpu;demo,ingame,2023-06-03 13:05:33
+01006D0017F7A000,"Mario & Luigi: Brothership",crash;slow;UE4;mac-bug,ingame,2025-01-07 04:00:00
+010002C00C270000,"MARIO & SONIC AT THE OLYMPIC GAMES TOKYO 2020",crash;online-broken;ldn-works,ingame,2024-08-23 16:12:55
+0100317013770000,"MARIO + RABBIDS SPARKS OF HOPE",gpu;Needs Update,ingame,2024-06-20 19:56:19
+010067300059A000,"Mario + Rabbids® Kingdom Battle",slow;opengl-backend-bug,playable,2024-05-06 10:16:54
+0100C9C00E25C000,"Mario Golf™: Super Rush",gpu,ingame,2024-08-18 21:31:48
+0100ED100BA3A000,"Mario Kart Live: Home Circuit™",services;crash;Needs More Attention,nothing,2022-12-07 22:36:52
+0100152000022000,"Mario Kart™ 8 Deluxe",32-bit;ldn-works;LAN;amd-vendor-bug,playable,2024-09-19 11:55:17
+01006FE013472000,"Mario Party™ Superstars",gpu;ldn-works;mac-bug,ingame,2024-05-16 11:23:34
+010019401051C000,"Mario Strikers™: Battle League",crash;nvdec,boots,2024-05-07 06:23:56
+0100BDE00862A000,"Mario Tennis™ Aces",gpu;nvdec;ldn-works;LAN,ingame,2024-09-28 15:54:40
+0100B99019412000,"Mario vs. Donkey Kong™",,playable,2024-05-04 21:22:39
+0100D9E01DBB0000,"Mario vs. Donkey Kong™ Demo",,playable,2024-02-18 10:40:06
+01009A700A538000,"Mark of the Ninja: Remastered",,playable,2022-08-04 15:48:30
+010044600FDF0000,"Marooners",nvdec;online-broken,playable,2022-10-18 21:35:26
+010060700AC50000,"MARVEL ULTIMATE ALLIANCE 3: The Black Order",nvdec;ldn-untested,playable,2024-02-14 19:51:51
+01003DE00C95E000,"Mary Skelter 2",crash;regression,ingame,2023-09-12 07:37:28
+0100113008262000,"Masquerada: Songs and Shadows",,playable,2022-09-20 15:18:54
+01004800197F0000,"Master Detective Archives: Rain Code",gpu,ingame,2024-04-19 20:11:09
+0100CC7009196000,"Masters of Anima",nvdec,playable,2022-08-04 16:00:09
+01004B100A1C4000,"MathLand",,playable,2020-09-01 15:40:06
+0100A8C011F26000,"Max and the book of chaos",,playable,2020-09-02 12:24:43
+01001C9007614000,"Max: The Curse of Brotherhood",nvdec,playable,2022-08-04 16:33:04
+0100E8B012FBC000,"Maze",,playable,2020-12-17 16:13:58
+0100EEF00CBC0000,"MEANDERS",UE4;gpu,ingame,2021-06-11 19:19:33
+0100EC000CE24000,"Mech Rage",,playable,2020-11-18 12:30:16
+0100C4F005EB4000,"Mecho Tales",,playable,2022-08-04 17:03:19
+0100E4600D31A000,"Mechstermination Force",,playable,2024-07-04 05:39:15
+,"Medarot Classics Plus Kabuto Ver",,playable,2020-11-21 11:31:18
+,"Medarot Classics Plus Kuwagata Ver",,playable,2020-11-21 11:30:40
+0100BBC00CB9A000,"Mega Mall Story",slow,playable,2022-08-04 17:10:58
+0100B0C0086B0000,"Mega Man 11",,playable,2021-04-26 12:07:53
+010038E016264000,"Mega Man Battle Network Legacy Collection Vol. 1",,playable,2023-04-25 03:55:57
+0100734016266000,"Mega Man Battle Network Legacy Collection Vol. 2",,playable,2023-08-03 18:04:32
+01002D4007AE0000,"Mega Man Legacy Collection",gpu,ingame,2021-06-03 18:17:17
+0100842008EC4000,"Mega Man Legacy Collection 2",,playable,2021-01-06 08:47:59
+01005C60086BE000,"Mega Man X Legacy Collection",audio;crash;services,menus,2020-12-04 04:30:17
+010025C00D410000,"Mega Man Zero/ZX Legacy Collection",,playable,2021-06-14 16:17:32
+0100FC700F942000,"Megabyte Punch",,playable,2020-10-16 14:07:18
+010006F011220000,"Megadimension Neptunia VII",32-bit;nvdec,playable,2020-12-17 20:56:03
+010082B00E8B8000,"Megaquarium",,playable,2022-09-14 16:50:00
+010005A00B312000,"Megaton Rainfall",gpu;opengl,boots,2022-08-04 18:29:43
+0100EA100DF92000,"Meiji Katsugeki Haikara Ryuuseigumi - Seibai Shimaseu, Yonaoshi Kagyou",32-bit;nvdec,playable,2022-12-05 13:19:12
+0100B360068B2000,"Mekorama",gpu,boots,2021-06-17 16:37:21
+01000FA010340000,"Melbits World",nvdec;online,menus,2021-11-26 13:51:22
+0100F68019636000,"Melon Journey",,playable,2023-04-23 21:20:01
+,"Memories Off -Innocent Fille- for Dearest",,playable,2020-08-04 07:31:22
+010062F011E7C000,"Memory Lane",UE4,playable,2022-10-05 14:31:03
+0100EBE00D5B0000,"Meow Motors",UE4;gpu,ingame,2020-12-18 00:24:01
+0100273008FBC000,"Mercenaries Saga Chronicles",,playable,2021-01-10 12:48:19
+010094500C216000,"Mercenaries Wings: The False Phoenix",crash;services,nothing,2020-05-08 22:42:12
+0100F900046C4000,"Mercenary Kings: Reloaded Edition",online,playable,2020-10-16 13:05:58
+0100E5000D3CA000,"Merchants of Kaidan",,playable,2021-04-15 11:44:28
+01009A500D4A8000,"METAGAL",,playable,2020-06-05 00:05:48
+010047F01AA10000,"METAL GEAR SOLID 3: Snake Eater - Master Collection Version",services-horizon,menus,2024-07-24 06:34:06
+0100E8F00F6BE000,"METAL MAX Xeno Reborn",,playable,2022-12-05 15:33:53
+01002DE00E5D0000,"Metaloid: Origin",,playable,2020-06-04 20:26:35
+010055200E87E000,"Metamorphosis",UE4;audout;gpu;nvdec,ingame,2021-06-16 16:18:11
+0100D4900E82C000,"Metro 2033 Redux",gpu,ingame,2022-11-09 10:53:13
+0100F0400E850000,"Metro: Last Light Redux",slow;nvdec;vulkan-backend-bug,ingame,2023-11-01 11:53:52
+010012101468C000,"Metroid Prime™ Remastered",gpu;Needs Update;vulkan-backend-bug;opengl-backend-bug,ingame,2024-05-07 22:48:15
+010093801237C000,"Metroid™ Dread",,playable,2023-11-13 04:02:36
+0100A1200F20C000,"Midnight Evil",,playable,2022-10-18 22:55:19
+0100C1E0135E0000,"Mighty Fight Federation",online,playable,2021-04-06 18:39:56
+0100AD701344C000,"Mighty Goose",nvdec,playable,2022-10-28 20:25:38
+01000E2003FA0000,"MIGHTY GUNVOLT BURST",,playable,2020-10-19 16:05:49
+010060D00AE36000,"Mighty Switch Force! Collection",,playable,2022-10-28 20:40:32
+01003DA010E8A000,"Miitopia™",gpu;services-horizon,ingame,2024-09-06 10:39:13
+01007DA0140E8000,"Miitopia™ Demo",services;crash;demo,menus,2023-02-24 11:50:58
+01004B7009F00000,"Miles & Kilo",,playable,2020-10-22 11:39:49
+0100976008FBE000,"Millie",,playable,2021-01-26 20:47:19
+0100F5700C9A8000,"MIND: Path to Thalamus",UE4,playable,2021-06-16 17:37:25
+0100D71004694000,"Minecraft",crash;ldn-broken,ingame,2024-09-29 12:08:59
+01006C100EC08000,"Minecraft Dungeons",nvdec;online-broken;UE4,playable,2024-06-26 22:10:43
+01007C6012CC8000,"Minecraft Legends",gpu;crash,ingame,2024-03-04 00:32:24
+01006BD001E06000,"Minecraft: Nintendo Switch Edition",ldn-broken,playable,2023-10-15 01:47:08
+01003EF007ABA000,"Minecraft: Story Mode - Season Two",online-broken,playable,2023-03-04 00:30:50
+010059C002AC2000,"Minecraft: Story Mode - The Complete Adventure",crash;online-broken,boots,2022-08-04 18:56:58
+0100B7500F756000,"Minefield",,playable,2022-10-05 15:03:29
+01003560119A6000,"Mini Motor Racing X",,playable,2021-04-13 17:54:49
+0100FB700DE1A000,"Mini Trains",,playable,2020-07-29 23:06:20
+010039200EC66000,"Miniature - The Story Puzzle",UE4,playable,2022-09-14 17:18:50
+010069200EB80000,"Ministry of Broadcast",,playable,2022-08-10 00:31:16
+0100C3F000BD8000,"Minna de Wai Wai! Spelunker",crash,nothing,2021-11-03 07:17:11
+0100FAE010864000,"Minoria",,playable,2022-08-06 18:50:50
+01005AB015994000,"Miss Kobayashi's Dragonmaid Burst Forth!! Choro-gon☆Breath",gpu,playable,2022-03-28 02:22:24
+0100CFA0138C8000,"Missile Dancer",,playable,2021-01-31 12:22:03
+0100E3601495C000,"Missing Features: 2D",,playable,2022-10-28 20:52:54
+010059200CC40000,"Mist Hunter",,playable,2021-06-16 13:58:58
+0100F65011E52000,"Mittelborg: City of Mages",,playable,2020-08-12 19:58:06
+0100876015D74000,"MLB® The Show™ 22",gpu;slow,ingame,2023-04-25 06:28:43
+0100A9F01776A000,"MLB® The Show™ 22 Tech Test",services;crash;Needs Update;demo,nothing,2022-12-09 10:28:34
+0100913019170000,"MLB® The Show™ 23",gpu,ingame,2024-07-26 00:56:50
+0100E2E01C32E000,"MLB® The Show™ 24",services-horizon,nothing,2024-03-31 04:54:11
+010011300F74C000,"MO:Astray",crash,ingame,2020-12-11 21:45:44
+010020400BDD2000,"Moai VI: Unexpected Guests",slow,playable,2020-10-27 16:40:20
+0100D8700B712000,"Modern Combat Blackout",crash,nothing,2021-03-29 19:47:15
+010004900D772000,"Modern Tales: Age of Invention",slow,playable,2022-10-12 11:20:19
+0100B8500D570000,"Moero Chronicle™ Hyper",32-bit,playable,2022-08-11 07:21:56
+01004EB0119AC000,"Moero Crystal H",32-bit;nvdec;vulkan-backend-bug,playable,2023-07-05 12:04:22
+0100B46017500000,"MOFUMOFUSENSEN",gpu,menus,2024-09-21 21:51:08
+01004A400C320000,"Momodora: Reverie Under the Moonlight",deadlock,nothing,2022-02-06 03:47:43
+01002CC00BC4C000,"Momonga Pinball Adventures",,playable,2022-09-20 16:00:40
+010093100DA04000,"Momotaro Dentetsu Showa, Heisei, Reiwa mo Teiban!",gpu,ingame,2023-09-22 10:21:46
+0100FBD00ED24000,"MONKEY BARRELS",,playable,2022-09-14 17:28:52
+01004C500B8E0000,"Monkey King: Master of the Clouds",,playable,2020-09-28 22:35:48
+01003030161DC000,"Monomals",gpu,ingame,2024-08-06 22:02:51
+0100F3A00FB78000,"Mononoke Slashdown",crash,menus,2022-05-04 20:55:47
+01007430037F6000,"MONOPOLY® for Nintendo Switch™",nvdec;online-broken,playable,2024-02-06 23:13:01
+01005FF013DC2000,"MONOPOLY® Madness",,playable,2022-01-29 21:13:52
+0100E2D0128E6000,"Monster Blast",gpu,ingame,2023-09-02 20:02:32
+01006F7001D10000,"Monster Boy and the Cursed Kingdom",nvdec,playable,2022-08-04 20:06:32
+01005FC01000E000,"Monster Bugs Eat People",,playable,2020-07-26 02:05:34
+0100742007266000,"Monster Energy Supercross - The Official Videogame",nvdec;UE4,playable,2022-08-04 20:25:00
+0100F8100B982000,"Monster Energy Supercross - The Official Videogame 2",nvdec;UE4;ldn-untested,playable,2022-08-04 21:21:24
+010097800EA20000,"Monster Energy Supercross - The Official Videogame 3",UE4;audout;nvdec;online,playable,2021-06-14 12:37:54
+0100E9900ED74000,"Monster Farm",32-bit;nvdec,playable,2021-05-05 19:29:13
+0100770008DD8000,"Monster Hunter Generations Ultimate™",32-bit;online-broken;ldn-works,playable,2024-03-18 14:35:36
+0100B04011742000,"Monster Hunter Rise",gpu;slow;crash;nvdec;online-broken;Needs Update;ldn-works,ingame,2024-08-24 11:04:59
+010093A01305C000,"Monster Hunter Rise Demo",online-broken;ldn-works;demo,playable,2022-10-18 23:04:17
+0100E21011446000,"Monster Hunter Stories 2: Wings of Ruin",services,ingame,2022-07-10 19:27:30
+010042501329E000,"MONSTER HUNTER STORIES 2: WINGS OF RUIN Trial Version",demo,playable,2022-11-13 22:20:26
+,"Monster Hunter XX Demo",32-bit;cpu,nothing,2020-03-22 10:12:28
+0100C3800049C000,"Monster Hunter XX Nintendo Switch Ver ( Double Cross )",,playable,2024-07-21 14:08:09
+010088400366E000,"Monster Jam Crush It!",UE4;nvdec;online,playable,2021-04-08 19:29:27
+010095C00F354000,"Monster Jam Steel Titans",crash;nvdec;UE4,menus,2021-11-14 09:45:38
+010051B0131F0000,"Monster Jam Steel Titans 2",nvdec;UE4,playable,2022-10-24 17:17:59
+01004DE00DD44000,"Monster Puzzle",,playable,2020-09-28 22:23:10
+0100A0F00DA68000,"Monster Sanctuary",crash,ingame,2021-04-04 05:06:41
+0100D30010C42000,"Monster Truck Championship",slow;nvdec;online-broken;UE4,playable,2022-10-18 23:16:51
+01004E10142FE000,"Monster wo taoshite tsuyoi ken ya yoroi wo te ni shinasai. Shinde mo akiramezu ni tsuyoku nari nasai. Yuushatai ga maoh wo taosu sono hi wo shinzite imasu. - モンスターを倒して強い剣や鎧を手にしなさい。死んでも諦めずに強くなりなさい。勇者隊が魔王を倒すその日を信じています。",crash,ingame,2021-07-23 10:56:44
+010039F00EF70000,"Monstrum",,playable,2021-01-31 11:07:26
+0100C2E00B494000,"Moonfall Ultimate",nvdec,playable,2021-01-17 14:01:25
+0100E3D014ABC000,"Moorhuhn Jump and Run 'Traps and Treasures'",,playable,2024-03-08 15:10:02
+010045C00F274000,"Moorhuhn Kart 2",online-broken,playable,2022-10-28 21:10:35
+010040E00F642000,"Morbid: The Seven Acolytes",,playable,2022-08-09 17:21:58
+01004230123E0000,"More Dark",,playable,2020-12-15 16:01:06
+01005DA003E6E000,"Morphies Law",UE4;crash;ldn-untested;nvdec;online,menus,2020-11-22 17:05:29
+0100776003F0C000,"Morphite",,playable,2021-01-05 19:40:55
+0100F2200C984000,"Mortal Kombat 11",slow;nvdec;online-broken;ldn-broken,ingame,2024-06-19 02:22:17
+01006560184E6000,"Mortal Kombat™ 1",gpu,ingame,2024-09-04 15:45:47
+010032800D740000,"Mosaic",,playable,2020-08-11 13:07:35
+01002ED00B01C000,"Moto Racer 4",UE4;nvdec;online,playable,2021-04-08 19:09:11
+01003F200D0F2000,"Moto Rush GT",,playable,2022-08-05 11:23:55
+0100361007268000,"MotoGP™18",nvdec;UE4;ldn-untested,playable,2022-08-05 11:41:45
+01004B800D0E8000,"MotoGP™19",nvdec;online-broken;UE4,playable,2022-08-05 11:54:14
+01001FA00FBBC000,"MotoGP™20",ldn-untested,playable,2022-09-29 17:58:01
+01000F5013820000,"MotoGP™21",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2022-10-28 21:35:08
+010040401D564000,"MotoGP™24",gpu,ingame,2024-05-10 23:41:00
+01002A900D6D6000,"Motorsport Manager for Nintendo Switch™",nvdec,playable,2022-08-05 12:48:14
+01009DB00D6E0000,"Mountain Rescue Simulator",,playable,2022-09-20 16:36:48
+0100C4C00E73E000,"Moving Out",nvdec,playable,2021-06-07 21:17:24
+0100D3300F110000,"Mr Blaster",,playable,2022-09-14 17:56:24
+0100DCA011262000,"Mr. DRILLER DrillLand",nvdec,playable,2020-07-24 13:56:48
+010031F002B66000,"Mr. Shifty",slow,playable,2020-05-08 15:28:16
+01005EF00B4BC000,"Ms. Splosion Man",online,playable,2020-05-09 20:45:43
+010087C009246000,"Muddledash",services,ingame,2020-05-08 16:46:14
+01009D200952E000,"MudRunner - American Wilds",gpu;ldn-untested;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-16 11:40:52
+010073E008E6E000,"Mugsters",,playable,2021-01-28 17:57:17
+0100A8400471A000,"MUJO",,playable,2020-05-08 16:31:04
+0100211005E94000,"Mulaka",,playable,2021-01-28 18:07:20
+010038B00B9AE000,"Mummy Pinball",,playable,2022-08-05 16:08:11
+01008E200C5C2000,"Muse Dash",,playable,2020-06-06 14:41:29
+010035901046C000,"Mushroom Quest",,playable,2020-05-17 13:07:08
+0100700006EF6000,"Mushroom Wars 2",nvdec,playable,2020-09-28 15:26:08
+010046400F310000,"Music Racer",,playable,2020-08-10 08:51:23
+,"Musou Orochi 2 Ultimate",crash;nvdec,boots,2021-04-09 19:39:16
+0100F6000EAA8000,"Must Dash Amigos",,playable,2022-09-20 16:45:56
+01007B6006092000,"MUSYNX",,playable,2020-05-08 14:24:43
+0100C3E00ACAA000,"Mutant Football League: Dynasty Edition",online-broken,playable,2022-08-05 17:01:51
+01004BE004A86000,"Mutant Mudds Collection",,playable,2022-08-05 17:11:38
+0100E6B00DEA4000,"Mutant Year Zero: Road to Eden - Deluxe Edition",nvdec;UE4,playable,2022-09-10 13:31:10
+0100161009E5C000,"MX Nitro: Unleashed",,playable,2022-09-27 22:34:33
+0100218011E7E000,"MX vs ATV All Out",nvdec;UE4;vulkan-backend-bug,playable,2022-10-25 19:51:46
+0100D940063A0000,"MXGP3 - The Official Motocross Videogame",UE4;gpu;nvdec,ingame,2020-12-16 14:00:20
+01002C6012334000,"My Aunt is a Witch",,playable,2022-10-19 09:21:17
+0100F6F0118B8000,"My Butler",,playable,2020-06-27 13:46:23
+010031200B94C000,"My Friend Pedro",nvdec,playable,2021-05-28 11:19:17
+01000D700BE88000,"My Girlfriend is a Mermaid!?",nvdec,playable,2020-05-08 13:32:55
+010039000B68E000,"MY HERO ONE'S JUSTICE",UE4;crash;gpu;online,menus,2020-12-10 13:11:04
+01007E700DBF6000,"MY HERO ONE'S JUSTICE 2",UE4;gpu;nvdec,ingame,2020-12-18 14:08:47
+0100E4701373E000,"My Hidden Things",,playable,2021-04-15 11:26:06
+0100872012B34000,"My Little Dog Adventure",gpu,ingame,2020-12-10 17:47:37
+01008C600395A000,"My Little Riding Champion",slow,playable,2020-05-08 17:00:53
+010086B00C784000,"My Lovely Daughter: ReBorn",,playable,2022-11-24 17:25:32
+0100E7700C284000,"My Memory of Us",,playable,2022-08-20 11:03:14
+010028F00ABAE000,"My Riding Stables - Life with Horses",,playable,2022-08-05 21:39:07
+010042A00FBF0000,"My Riding Stables 2: A New Adventure",,playable,2021-05-16 14:14:59
+0100E25008E68000,"My Time at Portia",,playable,2021-05-28 12:42:55
+0100158011A08000,"My Universe - Cooking Star Restaurant",,playable,2022-10-19 10:00:44
+0100F71011A0A000,"My Universe - Fashion Boutique",nvdec,playable,2022-10-12 14:54:19
+0100CD5011A02000,"My Universe - PET CLINIC CATS & DOGS",crash;nvdec,boots,2022-02-06 02:05:53
+01006C301199C000,"My Universe - School Teacher",nvdec,playable,2021-01-21 16:02:52
+01000D5005974000,"N++ (NPLUSPLUS)",,playable,2022-08-05 21:54:58
+0100A6F00AC70000,"NAIRI: Tower of Shirin",nvdec,playable,2020-08-09 19:49:12
+010002F001220000,"NAMCO MUSEUM",ldn-untested,playable,2024-08-13 07:52:21
+0100DAA00AEE6000,"NAMCO MUSEUM™ ARCADE PAC™",,playable,2021-06-07 21:44:50
+,"NAMCOT COLLECTION",audio,playable,2020-06-25 13:35:22
+010072B00BDDE000,"Narcos: Rise of the Cartels",UE4;crash;nvdec,boots,2021-03-22 13:18:47
+01006BB00800A000,"NARUTO SHIPPUDEN: Ultimate Ninja STORM 3 Full Burst",nvdec,playable,2024-06-16 14:58:05
+010084D00CF5E000,"NARUTO SHIPPUDEN™: Ultimate Ninja® STORM 4 ROAD TO BORUTO",,playable,2024-06-29 13:04:22
+0100D2D0190A4000,"NARUTO X BORUTO Ultimate Ninja STORM CONNECTIONS",services-horizon,nothing,2024-07-25 05:16:48
+0100715007354000,"NARUTO: Ultimate Ninja STORM",nvdec,playable,2022-08-06 14:10:31
+0100545016D5E000,"NASCAR Rivals",crash;Incomplete,ingame,2023-04-21 01:17:47
+0100103011894000,"Naught",UE4,playable,2021-04-26 13:31:45
+01001AE00C1B2000,"NBA 2K Playgrounds 2",nvdec;online-broken;UE4;vulkan-backend-bug,playable,2022-08-06 14:40:38
+0100760002048000,"NBA 2K18",gpu;ldn-untested,ingame,2022-08-06 14:17:51
+01001FF00B544000,"NBA 2K19",crash;ldn-untested;services,nothing,2021-04-16 13:07:21
+0100E24011D1E000,"NBA 2K21",gpu,boots,2022-10-05 15:31:51
+0100ACA017E4E800,"NBA 2K23",,boots,2023-10-10 23:07:14
+010006501A8D8000,"NBA 2K24 Kobe Bryant Edition",cpu;gpu,boots,2024-08-11 18:23:08
+010002900294A000,"NBA Playgrounds",nvdec;online-broken;UE4,playable,2022-08-06 17:06:59
+0100F5A008126000,"NBA Playgrounds - Enhanced Edition",nvdec;online-broken;UE4,playable,2022-08-06 16:13:44
+0100BBC00E4F8000,"Need a packet?",,playable,2020-08-12 16:09:01
+010029B0118E8000,"Need for Speed™ Hot Pursuit Remastered",online-broken,playable,2024-03-20 21:58:02
+010023500B0BA000,"Nefarious",,playable,2020-12-17 03:20:33
+01008390136FC000,"Negative: The Way of Shinobi",nvdec,playable,2021-03-24 11:29:41
+010065F00F55A000,"Neighbours back From Hell",nvdec,playable,2022-10-12 15:36:48
+0100B4900AD3E000,"NEKOPARA Vol.1",nvdec,playable,2022-08-06 18:25:54
+010012900C782000,"NEKOPARA Vol.2",,playable,2020-12-16 11:04:47
+010045000E418000,"NEKOPARA Vol.3",,playable,2022-10-03 12:49:04
+010049F013656000,"NEKOPARA Vol.4",crash,ingame,2021-01-17 01:47:18
+01006ED00BC76000,"Nelke & the Legendary Alchemists ~Ateliers of the New World~",,playable,2021-01-28 19:39:42
+01005F000B784000,"Nelly Cootalot: The Fowl Fleet",,playable,2020-06-11 20:55:42
+01001AB0141A8000,"Neo : The World Ends with You (DEMO)- 新すばらしきこのせかい (体験版)",crash,ingame,2021-07-18 07:29:18
+0100EBB00D2F4000,"Neo Cab",,playable,2021-04-24 00:27:58
+010040000DB98000,"Neo Cab Demo",crash,boots,2020-06-16 00:14:00
+010006D0128B4000,"NEOGEO POCKET COLOR SELECTION Vol.1",,playable,2023-07-08 20:55:36
+0100BAB01113A000,"Neon Abyss",,playable,2022-10-05 15:59:44
+010075E0047F8000,"Neon Chrome",,playable,2022-08-06 18:38:34
+010032000EAC6000,"Neon Drive",,playable,2022-09-10 13:45:48
+0100B9201406A000,"Neon White",crash,ingame,2023-02-02 22:25:06
+0100743008694000,"Neonwall",nvdec,playable,2022-08-06 18:49:52
+01001A201331E000,"Neoverse Trinity Edition",,playable,2022-10-19 10:28:03
+01000B2011352000,"Nerdook Bundle Vol. 1",gpu;slow,ingame,2020-10-07 14:27:10
+01008B0010160000,"Nerved",UE4,playable,2022-09-20 17:14:03
+0100BA0004F38000,"NeuroVoider",,playable,2020-06-04 18:20:05
+0100C20012A54000,"Nevaeh",gpu;nvdec,ingame,2021-06-16 17:29:03
+010039801093A000,"Never Breakup",,playable,2022-10-05 16:12:12
+0100F79012600000,"Neverending Nightmares",crash;gpu,boots,2021-04-24 01:43:35
+0100A9600EDF8000,"Neverlast",slow,ingame,2020-07-13 23:55:19
+010013700DA4A000,"Neverwinter Nights: Enhanced Edition",gpu;nvdec,menus,2024-09-30 02:59:19
+01004C200100E000,"New Frontier Days ~Founding Pioneers~",,playable,2020-12-10 12:45:07
+0100F4300BF2C000,"New Pokémon Snap™",,playable,2023-01-15 23:26:57
+010017700B6C2000,"New Super Lucky's Tale",,playable,2024-03-11 14:14:10
+0100EA80032EA000,"New Super Mario Bros.™ U Deluxe",32-bit,playable,2023-10-08 02:06:37
+0100B9500E886000,"Newt One",,playable,2020-10-17 21:21:48
+01005A5011A44000,"Nexomon: Extinction",,playable,2020-11-30 15:02:22
+0100B69012EC6000,"Nexoria: Dungeon Rogue Heroes",gpu,ingame,2021-10-04 18:41:29
+0100271004570000,"Next Up Hero",online,playable,2021-01-04 22:39:36
+0100E5600D446000,"Ni no Kuni: Wrath of the White Witch",32-bit;nvdec,boots,2024-07-12 04:52:59
+0100EDD00D530000,"Nice Slice",nvdec,playable,2020-06-17 15:13:27
+01000EC010BF4000,"Niche - a genetics survival game",nvdec,playable,2020-11-27 14:01:11
+010010701AFB2000,"Nickelodeon All-Star Brawl 2",,playable,2024-06-03 14:15:01
+0100D6200933C000,"Nickelodeon Kart Racers",,playable,2021-01-07 12:16:49
+010058800F860000,"Nicky - The Home Alone Golf Ball",,playable,2020-08-08 13:45:39
+0100A95012668000,"Nicole",audout,playable,2022-10-05 16:41:44
+0100B8E016F76000,"NieR:Automata The End of YoRHa Edition",slow;crash,ingame,2024-05-17 01:06:34
+0100F3A0095A6000,"Night Call",nvdec,playable,2022-10-03 12:57:00
+0100921006A04000,"Night in the Woods",,playable,2022-12-03 20:17:54
+0100D8500A692000,"Night Trap - 25th Anniversary Edition",nvdec,playable,2022-08-08 13:16:14
+01005F4009112000,"Nightmare Boy: The New Horizons of Reigns of Dreams, a Metroidvania journey with little rusty nightmares, the empire of knight final boss",,playable,2021-01-05 15:52:29
+01006E700B702000,"Nightmares from the Deep 2: The Siren`s Call",nvdec,playable,2022-10-19 10:58:53
+0100628004BCE000,"Nights of Azure 2: Bride of the New Moon",crash;nvdec;regression,menus,2022-11-24 16:00:39
+010042300C4F6000,"Nightshade/百花百狼",nvdec,playable,2020-05-10 19:43:31
+0100AA0008736000,"Nihilumbra",,playable,2020-05-10 16:00:12
+0100D03003F0E000,"Nine Parchments",ldn-untested,playable,2022-08-07 12:32:08
+0100E2F014F46000,"NINJA GAIDEN Σ",nvdec,playable,2022-11-13 16:27:02
+0100696014F4A000,"NINJA GAIDEN Σ2",nvdec,playable,2024-07-31 21:53:48
+01002AF014F4C000,"NINJA GAIDEN: Master Collection",nvdec,playable,2023-08-11 08:25:31
+010088E003A76000,"Ninja Shodown",,playable,2020-05-11 12:31:21
+010081D00A480000,"Ninja Striker!",,playable,2020-12-08 19:33:29
+0100CCD0073EA000,"Ninjala",online-broken;UE4,boots,2024-07-03 20:04:49
+010003C00B868000,"Ninjin: Clash of Carrots",online-broken,playable,2024-07-10 05:12:26
+0100746010E4C000,"NinNinDays",,playable,2022-11-20 15:17:29
+0100C9A00ECE6000,"Nintendo 64™ – Nintendo Switch Online",gpu;vulkan,ingame,2024-04-23 20:21:07
+0100D870045B6000,"Nintendo Entertainment System™ - Nintendo Switch Online",online,playable,2022-07-01 15:45:06
+0100C4B0034B2000,"Nintendo Labo Toy-Con 01 Variety Kit",gpu,ingame,2022-08-07 12:56:07
+01001E9003502000,"Nintendo Labo Toy-Con 03 Vehicle Kit",services;crash,menus,2022-08-03 17:20:11
+0100165003504000,"Nintendo Labo Toy-Con 04 VR Kit",services;crash,boots,2023-01-17 22:30:24
+01009AB0034E0000,"Nintendo Labo™ Toy-Con 02: Robot Kit",gpu,ingame,2022-08-07 13:03:19
+0100D2F00D5C0000,"Nintendo Switch™ Sports",deadlock,boots,2024-09-10 14:20:24
+01000EE017182000,"Nintendo Switch™ Sports Online Play Test",gpu,ingame,2022-03-16 07:44:12
+010037200C72A000,"Nippon Marathon",nvdec,playable,2021-01-28 20:32:46
+010020901088A000,"Nirvana Pilot Yume",,playable,2022-10-29 11:49:49
+01009B400ACBA000,"No Heroes Here",online,playable,2020-05-10 02:41:57
+0100853015E86000,"No Man's Sky",gpu,ingame,2024-07-25 05:18:17
+0100F0400F202000,"No More Heroes",32-bit,playable,2022-09-13 07:44:27
+010071400F204000,"No More Heroes 2: Desperate Struggle",32-bit;nvdec,playable,2022-11-19 01:38:13
+01007C600EB42000,"No More Heroes 3",gpu;UE4,ingame,2024-03-11 17:06:19
+01009F3011004000,"No Straight Roads",nvdec,playable,2022-10-05 17:01:38
+0100F7D00A1BC000,"NO THING",,playable,2021-01-04 19:06:01
+0100542012884000,"Nongunz: Doppelganger Edition",,playable,2022-10-29 12:00:39
+010016E011EFA000,"Norman's Great Illusion",,playable,2020-12-15 19:28:24
+01001A500AD6A000,"Norn9 ~Norn + Nonette~ LOFN",nvdec;vulkan-backend-bug,playable,2022-12-09 09:29:16
+01004840086FE000,"NORTH",nvdec,playable,2021-01-05 16:17:44
+0100A9E00D97A000,"Northgard",crash,menus,2022-02-06 02:05:35
+01008AE019614000,"nOS new Operating System",,playable,2023-03-22 16:49:08
+0100CB800B07E000,"NOT A HERO: SUPER SNAZZY EDITION",,playable,2021-01-28 19:31:24
+01004D500D9BE000,"Not Not - A Brain Buster",,playable,2020-05-10 02:05:26
+0100DAF00D0E2000,"Not Tonight: Take Back Control Edition",nvdec,playable,2022-10-19 11:48:47
+0100343013248000,"Nubarron: The adventure of an unlucky gnome",,playable,2020-12-17 16:45:17
+01005140089F6000,"Nuclien",,playable,2020-05-10 05:32:55
+010002700C34C000,"Numbala",,playable,2020-05-11 12:01:07
+010020500C8C8000,"Number Place 10000",gpu,menus,2021-11-24 09:14:23
+010003701002C000,"Nurse Love Syndrome",,playable,2022-10-13 10:05:22
+0000000000000000,"nx-hbmenu",Needs Update;homebrew,boots,2024-04-06 22:05:32
+,"nxquake2",services;crash;homebrew,nothing,2022-08-04 23:14:04
+010049F00EC30000,"Nyan Cat: Lost in Space",online,playable,2021-06-12 13:22:03
+01002E6014FC4000,"O---O",,playable,2022-10-29 12:12:14
+010074600CC7A000,"OBAKEIDORO!",nvdec;online,playable,2020-10-16 16:57:34
+01002A000C478000,"Observer",UE4;gpu;nvdec,ingame,2021-03-03 20:19:45
+01007D7001D0E000,"Oceanhorn - Monster of Uncharted Seas",,playable,2021-01-05 13:55:22
+01006CB010840000,"Oceanhorn 2: Knights of the Lost Realm",,playable,2021-05-21 18:26:10
+010096B00A08E000,"Octocopter: Double or Squids",,playable,2021-01-06 01:30:16
+0100CAB006F54000,"Octodad: Dadliest Catch",crash,boots,2021-04-23 15:26:12
+0100A3501946E000,"OCTOPATH TRAVELER II",gpu;amd-vendor-bug,ingame,2024-09-22 11:39:20
+010057D006492000,"Octopath Traveler™",UE4;crash;gpu,ingame,2020-08-31 02:34:36
+010084300C816000,"Odallus: The Dark Call",,playable,2022-08-08 12:37:58
+0100BB500EE3C000,"Oddworld: Munch's Oddysee",gpu;nvdec,ingame,2021-06-17 12:11:50
+01005E700ABB8000,"Oddworld: New 'n' Tasty",nvdec,playable,2021-06-17 17:51:32
+0100D210177C6000,"ODDWORLD: SOULSTORM",services-horizon;crash,boots,2024-08-18 13:13:26
+01002EA00ABBA000,"Oddworld: Stranger's Wrath",crash;nvdec;loader-allocator,menus,2021-11-23 09:23:21
+010029F00C876000,"Odium to the Core",gpu,ingame,2021-01-08 14:03:52
+01006F5013202000,"Off And On Again",,playable,2022-10-29 19:46:26
+01003CD00E8BC000,"Offroad Racing - Buggy X ATV X Moto",online-broken;UE4,playable,2022-09-14 18:53:22
+01003B900AE12000,"Oh My Godheads: Party Edition",,playable,2021-04-15 11:04:11
+0100F45006A00000,"Oh...Sir! The Hollywood Roast",,ingame,2020-12-06 00:42:30
+010030B00B2F6000,"OK K.O.! Let’s Play Heroes",nvdec,playable,2021-01-11 18:41:02
+0100276009872000,"OKAMI HD",nvdec,playable,2024-04-05 06:24:58
+01006AB00BD82000,"OkunoKA",online-broken,playable,2022-08-08 14:41:51
+0100CE2007A86000,"Old Man's Journey",nvdec,playable,2021-01-28 19:16:52
+0100C3D00923A000,"Old School Musical",,playable,2020-12-10 12:51:12
+010099000BA48000,"Old School Racer 2",,playable,2020-10-19 12:11:26
+0100E0200B980000,"OlliOlli: Switch Stance",gpu,boots,2024-04-25 08:36:37
+0100F9D00C186000,"Olympia Soiree",,playable,2022-12-04 21:07:12
+0100A8B00E14A000,"Olympic Games Tokyo 2020 – The Official Video Game™",ldn-untested;nvdec;online,playable,2021-01-06 01:20:24
+01001D600E51A000,"Omega Labyrinth Life",,playable,2021-02-23 21:03:03
+,"Omega Vampire",nvdec,playable,2020-10-17 19:15:35
+0100CDC00C40A000,"Omensight: Definitive Edition",UE4;crash;nvdec,ingame,2020-07-26 01:45:14
+01006DB00D970000,"OMG Zombies!",32-bit,playable,2021-04-12 18:04:45
+010014E017B14000,"OMORI",,playable,2023-01-07 20:21:02
+,"Once Upon A Coma",nvdec,playable,2020-08-01 12:09:39
+0100BD3006A02000,"One More Dungeon",,playable,2021-01-06 09:10:58
+010076600FD64000,"One Person Story",,playable,2020-07-14 11:51:02
+0100774009CF6000,"ONE PIECE Pirate Warriors 3 Deluxe Edition",nvdec,playable,2020-05-10 06:23:52
+01008FE00E2F6000,"ONE PIECE: PIRATE WARRIORS 4",online-broken;ldn-untested,playable,2022-09-27 22:55:46
+0100574002AF4000,"ONE PIECE: Unlimited World Red Deluxe Edition",,playable,2020-05-10 22:26:32
+0100EEA00E3EA000,"One-Way Ticket",UE4,playable,2020-06-20 17:20:49
+0100463013246000,"Oneiros",,playable,2022-10-13 10:17:22
+010057C00D374000,"Oniken",,playable,2022-09-10 14:22:38
+010037900C814000,"Oniken: Unstoppable Edition",,playable,2022-08-08 14:52:06
+0100416008A12000,"Onimusha: Warlords",nvdec,playable,2020-07-31 13:08:39
+0100CF4011B2A000,"OniNaki",nvdec,playable,2021-02-27 21:52:42
+010074000BE8E000,"oOo: Ascension",,playable,2021-01-25 14:13:34
+0100D5400BD90000,"Operación Triunfo 2017",services;nvdec,ingame,2022-08-08 15:06:42
+01006CF00CFA4000,"Operencia: The Stolen Sun",UE4;nvdec,playable,2021-06-08 13:51:07
+01004A200BE82000,"OPUS Collection",,playable,2021-01-25 15:24:04
+010049C0075F0000,"OPUS: The Day We Found Earth",nvdec,playable,2021-01-21 18:29:31
+0100F9A012892000,"Ord.",,playable,2020-12-14 11:59:06
+010061D00DB74000,"Ori and the Blind Forest: Definitive Edition",nvdec;online-broken,playable,2022-09-14 19:58:13
+010005800F46E000,"Ori and the Blind Forest: Definitive Edition Demo",,playable,2022-09-10 14:40:12
+01008DD013200000,"Ori and the Will of the Wisps",gpu,ingame,2025-01-11 06:09:54
+01006C70102EA000,"Orn: The Tiny Forest Sprite",UE4;gpu,ingame,2020-08-07 14:25:30
+0100E5900F49A000,"Othercide",nvdec,playable,2022-10-05 19:04:38
+01006AA00EE44000,"Otokomizu",,playable,2020-07-13 21:00:44
+01006AF013A9E000,"Otti: The House Keeper",,playable,2021-01-31 12:11:24
+01000320060AC000,"OTTTD: Over The Top Tower Defense",slow,ingame,2020-10-10 19:31:07
+010097F010FE6000,"Our Two Bedroom Story",gpu;nvdec,ingame,2023-10-10 17:41:20
+0100D5D00C6BE000,"Our World Is Ended.",nvdec,playable,2021-01-19 22:46:57
+01005A700A166000,"OUT OF THE BOX",,playable,2021-01-28 01:34:27
+0100D9F013102000,"Outbreak Lost Hope",crash,boots,2021-04-26 18:01:23
+01006EE013100000,"Outbreak The Nightmare Chronicles",,playable,2022-10-13 10:41:57
+0100A0D013464000,"Outbreak: Endless Nightmares",,playable,2022-10-29 12:35:49
+0100C850130FE000,"Outbreak: Epidemic",,playable,2022-10-13 10:27:31
+0100B450130FC000,"Outbreak: The New Nightmare",,playable,2022-10-19 15:42:07
+0100B8900EFA6000,"Outbuddies DX",gpu,ingame,2022-08-04 22:39:24
+0100DE70085E8000,"Outlast 2",crash;nvdec,ingame,2022-01-22 22:28:05
+01008D4007A1E000,"Outlast: Bundle of Terror",nvdec;loader-allocator;vulkan-backend-bug,playable,2024-01-27 04:44:26
+01009B900401E000,"Overcooked Special Edition",,playable,2022-08-08 20:48:52
+01006FD0080B2000,"Overcooked! 2",ldn-untested,playable,2022-08-08 16:48:10
+0100F28011892000,"Overcooked! All You Can Eat",ldn-untested;online,playable,2021-04-15 10:33:52
+0100D7F00EC64000,"Overlanders",nvdec;UE4,playable,2022-09-14 20:15:06
+01008EA00E816000,"OVERPASS™",online-broken;UE4;ldn-untested,playable,2022-10-17 15:29:47
+0100647012F62000,"Override 2: Super Mech League",online-broken;UE4,playable,2022-10-19 15:56:04
+01008A700F7EE000,"Override: Mech City Brawl - Super Charged Mega Edition",nvdec;online-broken;UE4,playable,2022-09-20 17:33:32
+0100F8600E21E000,"Overwatch® 2",deadlock,boots,2022-09-14 20:22:22
+01005F000CC18000,"OVERWHELM",,playable,2021-01-21 18:37:18
+0100BC2004FF4000,"Owlboy",,playable,2020-10-19 14:24:45
+0100AD9012510000,"PAC-MAN™ 99",gpu;online-broken,ingame,2024-04-23 00:48:25
+010024C001224000,"PAC-MAN™ CHAMPIONSHIP EDITION 2 PLUS",,playable,2021-01-19 22:06:18
+011123900AEE0000,"Paladins",online,menus,2021-01-21 19:21:37
+0100F0D004CAE000,"PAN-PAN A tiny big adventure",audout,playable,2021-01-25 14:42:00
+010083700B730000,"Pang Adventures",,playable,2021-04-10 12:16:59
+010006E00DFAE000,"Pantsu Hunter: Back to the 90s",,playable,2021-02-19 15:12:27
+0100C6A00E94A000,"Panzer Dragoon: Remake",,playable,2020-10-04 04:03:55
+01004AE0108E0000,"Panzer Paladin",,playable,2021-05-05 18:26:00
+010004500DE50000,"Paper Dolls Original",UE4;crash,boots,2020-07-13 20:26:21
+0100A3900C3E2000,"Paper Mario™: The Origami King",audio;Needs Update,playable,2024-08-09 18:27:40
+0100ECD018EBE000,"Paper Mario™: The Thousand-Year Door",gpu;intel-vendor-bug;slow,ingame,2025-01-07 04:27:35
+01006AD00B82C000,"Paperbound Brawlers",,playable,2021-01-25 14:32:15
+0100DC70174E0000,"Paradigm Paradox",vulkan-backend-bug,playable,2022-12-03 22:28:13
+01007FB010DC8000,"Paradise Killer",UE4,playable,2022-10-05 19:33:05
+010063400B2EC000,"Paranautical Activity",,playable,2021-01-25 13:49:19
+01006B5012B32000,"Part Time UFO™",crash,ingame,2023-03-03 03:13:05
+01007FC00A040000,"Party Arcade",online-broken;UE4;ldn-untested,playable,2022-08-09 12:32:53
+0100B8E00359E000,"Party Golf",nvdec,playable,2022-08-09 12:38:30
+010022801217E000,"Party Hard 2",nvdec,playable,2022-10-05 20:31:48
+010027D00F63C000,"Party Treats",,playable,2020-07-02 00:05:00
+01001E500EA16000,"Path of Sin: Greed",crash,menus,2021-11-24 08:00:00
+010031F006E76000,"Pato Box",,playable,2021-01-25 15:17:52
+01001F201121E000,"PAW Patrol Mighty Pups Save Adventure Bay",,playable,2022-10-13 12:17:55
+0100360016800000,"PAW Patrol: Grand Prix",gpu,ingame,2024-05-03 16:16:11
+0100CEC003A4A000,"PAW Patrol: On a Roll!",nvdec,playable,2021-01-28 21:14:49
+01000C4015030000,"Pawapoke R",services-horizon,nothing,2024-05-14 14:28:32
+0100A56006CEE000,"Pawarumi",online-broken,playable,2022-09-10 15:19:33
+0100274004052000,"PAYDAY 2",nvdec;online-broken;ldn-untested,playable,2022-08-09 12:56:39
+010085700ABC8000,"PBA Pro Bowling",nvdec;online-broken;UE4,playable,2022-09-14 23:00:49
+0100F95013772000,"PBA Pro Bowling 2021",online-broken;UE4,playable,2022-10-19 16:46:40
+010072800CBE8000,"PC Building Simulator",,playable,2020-06-12 00:31:58
+010002100CDCC000,"Peaky Blinders: Mastermind",,playable,2022-10-19 16:56:35
+010028A0048A6000,"Peasant Knight",,playable,2020-12-22 09:30:50
+0100C510049E0000,"Penny-Punching Princess",,playable,2022-08-09 13:37:05
+0100CA901AA9C000,"Penny’s Big Breakaway",amd-vendor-bug,playable,2024-05-27 07:58:51
+0100563005B70000,"Perception",UE4;crash;nvdec,menus,2020-12-18 11:49:23
+010011700D1B2000,"Perchang",,playable,2021-01-25 14:19:52
+010089F00A3B4000,"Perfect Angle",,playable,2021-01-21 18:48:45
+01005CD012DC0000,"Perky Little Things",crash;vulkan,boots,2024-08-04 07:22:46
+01005EB013FBA000,"Persephone",,playable,2021-03-23 22:39:19
+0100A0300FC3E000,"Perseverance",,playable,2020-07-13 18:48:27
+010062B01525C000,"Persona 4 Golden",,playable,2024-08-07 17:48:07
+01005CA01580E000,"Persona 5 Royal",gpu,ingame,2024-08-17 21:45:15
+010087701B092000,"Persona 5 Tactica",,playable,2024-04-01 22:21:03
+,"Persona 5: Scramble",deadlock,boots,2020-10-04 03:22:29
+0100801011C3E000,"Persona® 5 Strikers",nvdec;mac-bug,playable,2023-09-26 09:36:01
+010044400EEAE000,"Petoons Party",nvdec,playable,2021-03-02 21:07:58
+010053401147C000,"PGA TOUR 2K21",deadlock;nvdec,ingame,2022-10-05 21:53:50
+0100DDD00C0EA000,"Phantaruk",,playable,2021-06-11 18:09:54
+0100063005C86000,"Phantom Breaker: Battle Grounds Overdrive",audio;nvdec,playable,2024-02-29 14:20:35
+010096F00E5B0000,"Phantom Doctrine",UE4,playable,2022-09-15 10:51:50
+0100C31005A50000,"Phantom Trigger",,playable,2022-08-09 14:27:30
+0100CB000A142000,"Phoenix Wright: Ace Attorney Trilogy",,playable,2023-09-15 22:03:12
+0100DA400F624000,"PHOGS!",online,playable,2021-01-18 15:18:37
+0100BF1003B9A000,"Physical Contact: 2048",slow,playable,2021-01-25 15:18:32
+01008110036FE000,"Physical Contact: SPEED",,playable,2022-08-09 14:40:46
+010077300A86C000,"PIANISTA",online-broken,playable,2022-08-09 14:52:56
+010012100E8DC000,"PICROSS LORD OF THE NAZARICK",,playable,2023-02-08 15:54:56
+0100C9600A88E000,"PICROSS S2",,playable,2020-10-15 12:01:40
+010079200D330000,"PICROSS S3",,playable,2020-10-15 11:55:27
+0100C250115DC000,"PICROSS S4",,playable,2020-10-15 12:33:46
+0100AC30133EC000,"PICROSS S5",,playable,2022-10-17 18:51:42
+010025901432A000,"PICROSS S6",,playable,2022-10-29 17:52:19
+01009B2016104000,"PICROSS S7",,playable,2022-02-16 12:51:25
+010043B00E1CE000,"PictoQuest",,playable,2021-02-27 15:03:16
+0100D06003056000,"Piczle Lines DX",UE4;crash;nvdec,menus,2020-11-16 04:21:31
+010017600B532000,"Piczle Lines DX 500 More Puzzles!",UE4,playable,2020-12-15 23:42:51
+01000FD00D5CC000,"Pig Eat Ball",services,ingame,2021-11-30 01:57:45
+01001CB0106F8000,"Pikmin 3 Deluxe Demo",32-bit;crash;demo;gpu,ingame,2021-06-16 18:38:07
+0100E0B019974000,"Pikmin 4 Demo",gpu;nvdec;UE4;demo;amd-vendor-bug,ingame,2023-09-22 21:41:08
+0100AA80194B0000,"Pikmin™ 1",audio,ingame,2024-05-28 18:56:11
+0100D680194B2000,"Pikmin™ 1+2",gpu,ingame,2023-07-31 08:53:41
+0100F4C009322000,"Pikmin™ 3 Deluxe",gpu;32-bit;nvdec;Needs Update,ingame,2024-09-03 00:28:26
+0100B7C00933A000,"Pikmin™ 4",gpu;crash;UE4,ingame,2024-08-26 03:39:08
+0100D6200E130000,"Pillars of Eternity: Complete Edition",,playable,2021-02-27 00:24:21
+01007A500B0B2000,"Pilot Sports",,playable,2021-01-20 15:04:17
+0100DA70186D4000,"Pinball FX",,playable,2024-05-03 17:09:11
+0100DB7003828000,"Pinball FX3",online-broken,playable,2022-11-11 23:49:07
+01002BA00D662000,"Pine",slow,ingame,2020-07-29 16:57:39
+010041100B148000,"Pinstripe",,playable,2020-11-26 10:40:40
+01002B20174EE000,"Piofiore: Episodio 1926",,playable,2022-11-23 18:36:05
+01009240117A2000,"Piofiore: Fated Memories",nvdec,playable,2020-11-30 14:27:50
+0100EA2013BCC000,"Pixel Game Maker Series Puzzle Pedestrians",,playable,2022-10-24 20:15:50
+0100859013CE6000,"Pixel Game Maker Series Werewolf Princess Kaguya",crash;services,nothing,2021-03-26 00:23:07
+010060A00F5E8000,"Pixel Gladiator",,playable,2020-07-08 02:41:26
+010000E00E612000,"Pixel Puzzle Makeout League",,playable,2022-10-13 12:34:00
+0100382011002000,"PixelJunk Eden 2",crash,ingame,2020-12-17 11:55:52
+0100E4D00A690000,"PixelJunk™ Monsters 2",,playable,2021-06-07 03:40:01
+01004A900C352000,"Pizza Titan Ultra",nvdec,playable,2021-01-20 15:58:42
+05000FD261232000,"Pizza Tower",crash,ingame,2024-09-16 00:21:56
+0100FF8005EB2000,"Plague Road",,playable,2022-08-09 15:27:14
+010030B00C316000,"Planescape: Torment and Icewind Dale: Enhanced Editions",cpu;32-bit;crash;Needs Update,boots,2022-09-10 03:58:26
+010003C0099EE000,"PLANET ALPHA",UE4;gpu,ingame,2020-12-16 14:42:20
+01007EA019CFC000,"Planet Cube: Edge",,playable,2023-03-22 17:10:12
+0100F0A01F112000,"planetarian: The Reverie of a Little Planet & Snow Globe",,playable,2020-10-17 20:26:20
+010087000428E000,"Plantera Deluxe",,playable,2022-08-09 15:36:28
+0100C56010FD8000,"Plants vs. Zombies: Battle for Neighborville™ Complete Edition",gpu;audio;crash,boots,2024-09-02 12:58:14
+0100E5B011F48000,"PLOID SAGA",,playable,2021-04-19 16:58:45
+01009440095FE000,"Pode",nvdec,playable,2021-01-25 12:58:35
+010086F0064CE000,"Poi: Explorer Edition",nvdec,playable,2021-01-21 19:32:00
+0100EB6012FD2000,"Poison Control",,playable,2021-05-16 14:01:54
+010072400E04A000,"Pokémon Café ReMix",,playable,2021-08-17 20:00:04
+01003D200BAA2000,"Pokémon Mystery Dungeon™: Rescue Team DX",mac-bug,playable,2024-01-21 00:16:32
+01008DB008C2C000,"Pokémon Shield + Pokémon Shield Expansion Pass",deadlock;crash;online-broken;ldn-works;LAN,ingame,2024-08-12 07:20:22
+0100ABF008968000,"Pokémon Sword + Pokémon Sword Expansion Pass",deadlock;crash;online-broken;ldn-works;LAN,ingame,2024-08-26 15:40:37
+01009AD008C4C000,"Pokémon: Let's Go, Pikachu! demo",slow;demo,playable,2023-11-26 11:23:20
+0100000011D90000,"Pokémon™ Brilliant Diamond",gpu;ldn-works,ingame,2024-08-28 13:26:35
+010015F008C54000,"Pokémon™ HOME",Needs Update;crash;services,menus,2020-12-06 06:01:51
+01001F5010DFA000,"Pokémon™ Legends: Arceus",gpu;Needs Update;ldn-works,ingame,2024-09-19 10:02:02
+01005D100807A000,"Pokémon™ Quest",,playable,2022-02-22 16:12:32
+0100A3D008C5C000,"Pokémon™ Scarlet",gpu;nvdec;ldn-works;amd-vendor-bug,ingame,2023-12-14 13:18:29
+01008F6008C5E000,"Pokémon™ Violet",gpu;nvdec;ldn-works;amd-vendor-bug;mac-bug,ingame,2024-07-30 02:51:48
+0100187003A36000,"Pokémon™: Let’s Go, Eevee!",crash;nvdec;online-broken;ldn-broken,ingame,2024-06-01 15:03:04
+010003F003A34000,"Pokémon™: Let’s Go, Pikachu!",crash;nvdec;online-broken;ldn-broken,ingame,2024-03-15 07:55:41
+0100B3F000BE2000,"Pokkén Tournament™ DX",nvdec;ldn-works;opengl-backend-bug;LAN;amd-vendor-bug;intel-vendor-bug,playable,2024-07-18 23:11:08
+010030D005AE6000,"Pokkén Tournament™ DX Demo",demo;opengl-backend-bug,playable,2022-08-10 12:03:19
+0100A3500B4EC000,"Polandball: Can Into Space",,playable,2020-06-25 15:13:26
+0100EAB00605C000,"Poly Bridge",services,playable,2020-06-08 23:32:41
+010017600B180000,"Polygod",slow;regression,ingame,2022-08-10 14:38:14
+010074B00ED32000,"Polyroll",gpu,boots,2021-07-01 16:16:50
+010096B01179A000,"Ponpu",,playable,2020-12-16 19:09:34
+01005C5011086000,"Pooplers",,playable,2020-11-02 11:52:10
+01007EF013CA0000,"Port Royale 4",crash;nvdec,menus,2022-10-30 14:34:06
+01007BB017812000,"Portal",,playable,2024-06-12 03:48:29
+0100ABD01785C000,"Portal 2",gpu,ingame,2023-02-20 22:44:15
+010050D00FE0C000,"Portal Dogs",,playable,2020-09-04 12:55:46
+0100437004170000,"Portal Knights",ldn-untested;online,playable,2021-05-27 19:29:04
+01005FC010EB2000,"Potata: Fairy Flower",nvdec,playable,2020-06-17 09:51:34
+01000A4014596000,"Potion Party",,playable,2021-05-06 14:26:54
+0100E1E00CF1A000,"Power Rangers: Battle for the Grid",,playable,2020-06-21 16:52:42
+0100D1C01C194000,"Powerful Pro Baseball 2024-2025",gpu,ingame,2024-08-25 06:40:48
+01008E100E416000,"PowerSlave Exhumed",gpu,ingame,2023-07-31 23:19:10
+010054F01266C000,"Prehistoric Dude",gpu,ingame,2020-10-12 12:38:48
+,"Pretty Princess Magical Coordinate",,playable,2020-10-15 11:43:41
+01007F00128CC000,"Pretty Princess Party",,playable,2022-10-19 17:23:58
+010009300D278000,"Preventive Strike",nvdec,playable,2022-10-06 10:55:51
+0100210019428000,"Prince of Persia The Lost Crown",crash,ingame,2024-06-08 21:31:58
+01007A3009184000,"Princess Peach™: Showtime!",UE4,playable,2024-09-21 13:39:45
+010024701DC2E000,"Princess Peach™: Showtime! Demo",UE4;demo,playable,2024-03-10 17:46:45
+01001FA01451C000,"Prinny Presents NIS Classics Volume 1: Phantom Brave: The Hermuda Triangle Remastered / Soul Nomad & the World Eaters",crash;Needs Update,boots,2023-02-02 07:23:09
+01008FA01187A000,"Prinny® 2: Dawn of Operation Panties, Dood!",32-bit,playable,2022-10-13 12:42:58
+01007A0011878000,"Prinny®: Can I Really Be the Hero?",32-bit;nvdec,playable,2023-10-22 09:25:25
+010007F00879E000,"PriPara: All Idol Perfect Stage",,playable,2022-11-22 16:35:52
+010029200AB1C000,"Prison Architect: Nintendo Switch™ Edition",,playable,2021-04-10 12:27:58
+0100C1801B914000,"Prison City",gpu,ingame,2024-03-01 08:19:33
+0100F4800F872000,"Prison Princess",,playable,2022-11-20 15:00:25
+0100A9800A1B6000,"Professional Construction – The Simulation",slow,playable,2022-08-10 15:15:45
+010077B00BDD8000,"Professional Farmer: Nintendo Switch™ Edition",slow,playable,2020-12-16 13:38:19
+010018300C83A000,"Professor Lupo and his Horrible Pets",,playable,2020-06-12 00:08:45
+0100D1F0132F6000,"Professor Lupo: Ocean",,playable,2021-04-14 16:33:33
+0100BBD00976C000,"Project Highrise: Architect's Edition",,playable,2022-08-10 17:19:12
+0100ACE00DAB6000,"Project Nimbus: Complete Edition",nvdec;UE4;vulkan-backend-bug,playable,2022-08-10 17:35:43
+01002980140F6000,"Project TRIANGLE STRATEGY™ Debut Demo",UE4;demo,playable,2022-10-24 21:40:27
+0100BDB01150E000,"Project Warlock",,playable,2020-06-16 10:50:41
+,"Psikyo Collection Vol 1",32-bit,playable,2020-10-11 13:18:47
+0100A2300DB78000,"Psikyo Collection Vol. 3",,ingame,2021-06-07 02:46:23
+01009D400C4A8000,"Psikyo Collection Vol.2",32-bit,playable,2021-06-07 03:22:07
+01007A200F2E2000,"Psikyo Shooting Stars Alpha",32-bit,playable,2021-04-13 12:03:43
+0100D7400F2E4000,"Psikyo Shooting Stars Bravo",32-bit,playable,2021-06-14 12:09:07
+0100EC100A790000,"PSYVARIAR DELTA",nvdec,playable,2021-01-20 13:01:46
+,"Puchitto kurasutā",Need-Update;crash;services,menus,2020-07-04 16:44:28
+0100D61010526000,"Pulstario",,playable,2022-10-06 11:02:01
+01009AE00B788000,"Pumped BMX Pro",nvdec;online-broken,playable,2022-09-20 17:40:50
+01006C10131F6000,"Pumpkin Jack",nvdec;UE4,playable,2022-10-13 12:52:32
+010016400F07E000,"Push the Crate",nvdec;UE4,playable,2022-09-15 13:28:41
+0100B60010432000,"Push the Crate 2",UE4;gpu;nvdec,ingame,2021-06-10 14:20:01
+0100F1200F6D8000,"Pushy and Pully in Blockland",,playable,2020-07-04 11:44:41
+0100AAE00CAB4000,"Puyo Puyo Champions",online,playable,2020-06-19 11:35:08
+010038E011940000,"Puyo Puyo™ Tetris® 2",ldn-untested,playable,2023-09-26 11:35:25
+0100C5700ECE0000,"Puzzle & Dragons GOLD",slow,playable,2020-05-13 15:09:34
+010079E01A1E0000,"Puzzle Bobble Everybubble!",audio;ldn-works,playable,2023-06-10 03:53:40
+010043100F0EA000,"Puzzle Book",,playable,2020-09-28 13:26:01
+0100476004A9E000,"Puzzle Box Maker",nvdec;online-broken,playable,2022-08-10 18:00:52
+0100A4E017372000,"Pyramid Quest",gpu,ingame,2023-08-16 21:14:52
+0100F1100E606000,"Q-YO Blaster",gpu,ingame,2020-06-07 22:36:53
+010023600AA34000,"Q.U.B.E. 2",UE4,playable,2021-03-03 21:38:57
+0100A8D003BAE000,"Qbics Paint",gpu;services,ingame,2021-06-07 10:54:09
+0100BA5012E54000,"QUAKE",gpu;crash,menus,2022-08-08 12:40:34
+010048F0195E8000,"Quake II",,playable,2023-08-15 03:42:14
+,"QuakespasmNX",crash;homebrew,nothing,2022-07-23 19:28:07
+010045101288A000,"Quantum Replica",nvdec;UE4,playable,2022-10-30 21:17:22
+0100F1400BA88000,"Quarantine Circular",,playable,2021-01-20 15:24:15
+0100DCF00F13A000,"Queen's Quest 4: Sacred Truce",nvdec,playable,2022-10-13 12:59:21
+0100492012378000,"Quell",gpu,ingame,2021-06-11 15:59:53
+01001DE005012000,"Quest of Dungeons",,playable,2021-06-07 10:29:22
+,"QuietMansion2",,playable,2020-09-03 14:59:35
+0100AF100EE76000,"Quiplash 2 InterLASHional: The Say Anything Party Game!",online-working,playable,2022-10-19 17:43:45
+0100E5400BE64000,"R-Type Dimensions EX",,playable,2020-10-09 12:04:43
+0100F930136B6000,"R-Type® Final 2",slow;nvdec;UE4,ingame,2022-10-30 21:46:29
+01007B0014300000,"R-Type® Final 2 Demo",slow;nvdec;UE4;demo,ingame,2022-10-24 21:57:42
+0100B5A004302000,"R.B.I. Baseball 17",online-working,playable,2022-08-11 11:55:47
+01005CC007616000,"R.B.I. Baseball 18",nvdec;online-working,playable,2022-08-11 11:27:52
+0100FCB00BF40000,"R.B.I. Baseball 19",nvdec;online-working,playable,2022-08-11 11:43:52
+010061400E7D4000,"R.B.I. Baseball 20",,playable,2021-06-15 21:16:29
+0100B4A0115CA000,"R.B.I. Baseball 21",online-working,playable,2022-10-24 22:31:45
+01005BF00E4DE000,"Rabi-Ribi",,playable,2022-08-06 17:02:44
+010075D00DD04000,"Race with Ryan",UE4;gpu;nvdec;slow,ingame,2020-11-16 04:35:33
+0100B8100C54A000,"Rack N Ruin",,playable,2020-09-04 15:20:26
+010024400C516000,"RAD",gpu;crash;UE4,menus,2021-11-29 02:01:56
+010000600CD54000,"Rad Rodgers Radical Edition",nvdec;online-broken,playable,2022-08-10 19:57:23
+0100DA400E07E000,"Radiation City",crash,ingame,2022-09-30 11:15:04
+01009E40095EE000,"Radiation Island",opengl;vulkan-backend-bug,ingame,2022-08-11 10:51:04
+0100C8B00D2BE000,"Radical Rabbit Stew",,playable,2020-08-03 12:02:56
+0100BAD013B6E000,"Radio Commander",nvdec,playable,2021-03-24 11:20:46
+01008FA00ACEC000,"RADIOHAMMER STATION",audout,playable,2021-02-26 20:20:06
+01003D00099EC000,"Raging Justice",,playable,2021-06-03 14:06:50
+01005CD013116000,"Raiden IV x Mikado Remix [ 雷電Ⅳ×MIKADO remix ]",,playable,2022-07-29 15:50:13
+01002B000D97E000,"Raiden V: Director's Cut",deadlock;nvdec,boots,2024-07-12 07:31:46
+01002EE00DC02000,"Railway Empire - Nintendo Switch™ Edition",nvdec,playable,2022-10-03 13:53:50
+01003C700D0DE000,"Rain City",,playable,2020-10-08 16:59:03
+0100BDD014232000,"Rain on Your Parade",,playable,2021-05-06 19:32:04
+010047600BF72000,"Rain World",,playable,2023-05-10 23:34:08
+01009D9010B9E000,"Rainbows, toilets & unicorns",nvdec,playable,2020-10-03 18:08:18
+010010B00DDA2000,"Raji: An Ancient Epic",UE4;gpu;nvdec,ingame,2020-12-16 10:05:25
+010042A00A9CC000,"Rapala Fishing Pro Series",nvdec,playable,2020-12-16 13:26:53
+0100E73010754000,"Rascal Fight",,playable,2020-10-08 13:23:30
+010003F00C5C0000,"Rawr-Off",crash;nvdec,menus,2020-07-02 00:14:44
+01005FF002E2A000,"Rayman® Legends Definitive Edition",nvdec;ldn-works,playable,2023-05-27 18:33:07
+0100F03011616000,"Re:Turn - One Way Trip",,playable,2022-08-29 22:42:53
+01000B20117B8000,"Re:ZERO -Starting Life in Another World- The Prophecy of the Throne",gpu;crash;nvdec;vulkan,boots,2023-03-07 21:27:24
+0100A8A00E462000,"Real Drift Racing",,playable,2020-07-25 14:31:31
+010048600CC16000,"Real Heroes: Firefighter",,playable,2022-09-20 18:18:44
+0100E64010BAA000,"realMyst: Masterpiece Edition",nvdec,playable,2020-11-30 15:25:42
+01000F300F082000,"Reaper: Tale of a Pale Swordsman",,playable,2020-12-12 15:12:23
+0100D9B00E22C000,"Rebel Cops",,playable,2022-09-11 10:02:53
+0100CAA01084A000,"Rebel Galaxy Outlaw",nvdec,playable,2022-12-01 07:44:56
+0100EF0015A9A000,"Record of Lodoss War-Deedlit in Wonder Labyrinth-",deadlock;Needs Update;Incomplete,ingame,2022-01-19 10:00:59
+0100CF600FF7A000,"Red Bow",services,ingame,2021-11-29 03:51:34
+0100351013A06000,"Red Colony",,playable,2021-01-25 20:44:41
+01007820196A6000,"Red Dead Redemption",amd-vendor-bug,playable,2024-09-13 13:26:13
+0100069010592000,"Red Death",,playable,2020-08-30 13:07:37
+010075000C608000,"Red Faction Guerrilla Re-Mars-tered",ldn-untested;nvdec;online,playable,2021-06-07 03:02:13
+01002290070E4000,"Red Game Without a Great Name",,playable,2021-01-19 21:42:35
+010045400D73E000,"Red Siren: Space Defense",UE4,playable,2021-04-25 21:21:29
+0100D8A00E880000,"Red Wings: Aces of the Sky",,playable,2020-06-12 01:19:53
+01000D100DCF8000,"Redeemer: Enhanced Edition",nvdec;UE4;vulkan-backend-bug,playable,2022-09-11 10:20:24
+0100326010B98000,"Redout: Space Assault",UE4,playable,2022-10-19 23:04:35
+010007C00E558000,"Reel Fishing: Road Trip Adventure",,playable,2021-03-02 16:06:43
+010045D01273A000,"Reflection of Mine",audio,playable,2020-12-17 15:06:37
+01003AA00F5C4000,"Refreshing Sideways Puzzle Ghost Hammer",,playable,2020-10-18 12:08:54
+01007A800D520000,"Refunct",UE4,playable,2020-12-15 22:46:21
+0100FDF0083A6000,"Regalia: Of Men and Monarchs - Royal Edition",,playable,2022-08-11 12:24:01
+01005FD00F15A000,"Regions of Ruin",,playable,2020-08-05 11:38:58
+,"Reine des Fleurs",cpu;crash,boots,2020-09-27 18:50:39
+0100F1900B144000,"REKT! High Octane Stunts",online,playable,2020-09-28 12:33:56
+01002AD013C52000,"Relicta",nvdec;UE4,playable,2022-10-31 12:48:33
+010095900B436000,"RemiLore",,playable,2021-06-03 18:58:15
+0100FBD00F5F6000,"Remothered: Broken Porcelain",UE4;gpu;nvdec,ingame,2021-06-17 15:13:11
+01001F100E8AE000,"Remothered: Tormented Fathers",nvdec;UE4,playable,2022-10-19 23:26:50
+01008EE00B22C000,"Rento Fortune",ldn-untested;online,playable,2021-01-19 19:52:21
+01007CC0130C6000,"Renzo Racer",,playable,2021-03-23 22:28:05
+01003C400AD42000,"Rescue Tale",,playable,2022-09-20 18:40:18
+010099A00BC1E000,"resident evil 4",nvdec,playable,2022-11-16 21:16:04
+010018100CD46000,"Resident Evil 5",nvdec,playable,2024-02-18 17:15:29
+01002A000CD48000,"Resident Evil 6",nvdec,playable,2022-09-15 14:31:47
+0100643002136000,"Resident Evil Revelations",nvdec;ldn-untested,playable,2022-08-11 12:44:19
+010095300212A000,"Resident Evil Revelations 2",online-broken;ldn-untested,playable,2022-08-11 12:57:50
+0100E7F00FFB8000,"Resolutiion",crash,boots,2021-04-25 21:57:56
+0100FF201568E000,"Restless Night",crash,nothing,2022-02-09 10:54:49
+0100069000078000,"Retail Interactive Display Menu (DevQuestMenu)",services;crash,nothing,2022-08-11 13:19:41
+010086E00BCB2000,"Retimed",,playable,2022-08-11 13:32:39
+0100F17004156000,"Retro City Rampage DX",,playable,2021-01-05 17:04:17
+01000ED014A2C000,"Retro Machina",online-broken,playable,2022-10-31 13:38:58
+010032E00E6E2000,"Return of the Obra Dinn",,playable,2022-09-15 19:56:45
+010027400F708000,"Revenge of Justice",nvdec,playable,2022-11-20 15:43:23
+0100E2E00EA42000,"Reventure",,playable,2022-09-15 20:07:06
+010071D00F156000,"REZ PLZ",,playable,2020-10-24 13:26:12
+0100729012D18000,"Rhythm Fighter",crash,nothing,2021-02-16 18:51:30
+010081D0100F0000,"Rhythm of the Gods",UE4;crash,nothing,2020-10-03 17:39:59
+01009D5009234000,"RICO",nvdec;online-broken,playable,2022-08-11 20:16:40
+01002C700C326000,"Riddled Corpses EX",,playable,2021-06-06 16:02:44
+0100AC600D898000,"Rift Keeper",,playable,2022-09-20 19:48:20
+0100A62002042000,"RiME",UE4;crash;gpu,boots,2020-07-20 15:52:38
+01006AC00EE6E000,"Rimelands: Hammer of Thor",,playable,2022-10-13 13:32:56
+01002FF008C24000,"RingFit Adventure",crash;services,nothing,2021-04-14 19:00:01
+010088E00B816000,"RIOT - Civil Unrest",,playable,2022-08-11 20:27:56
+01002A6006AA4000,"Riptide GP: Renegade",online,playable,2021-04-13 23:33:02
+010065B00B0EC000,"Rise and Shine",,playable,2020-12-12 15:56:43
+0100E9C010EA8000,"Rise of Insanity",,playable,2020-08-30 15:42:14
+01006BA00E652000,"Rise: Race The Future",,playable,2021-02-27 13:29:06
+010020C012F48000,"Rising Hell",,playable,2022-10-31 13:54:02
+010076D00E4BA000,"Risk of Rain 2",online-broken,playable,2024-03-04 17:01:05
+0100E8300A67A000,"RISK® Global Domination",nvdec;online-broken,playable,2022-08-01 18:53:28
+010042500FABA000,"Ritual: Crown of Horns",,playable,2021-01-26 16:01:47
+0100BD300F0EC000,"Ritual: Sorcerer Angel",,playable,2021-03-02 13:51:19
+0100A7D008392000,"Rival Megagun",nvdec;online,playable,2021-01-19 14:01:46
+010069C00401A000,"RIVE: Ultimate Edition",,playable,2021-03-24 18:45:55
+01004E700DFE6000,"River City Girls",nvdec,playable,2020-06-10 23:44:09
+01002E80168F4000,"River City Girls 2",,playable,2022-12-07 00:46:27
+0100B2100767C000,"River City Melee Mach!!",online-broken,playable,2022-09-20 20:51:57
+01008AC0115C6000,"RMX Real Motocross",,playable,2020-10-08 21:06:15
+010053000B986000,"Road Redemption",online-broken,playable,2022-08-12 11:26:20
+010002F009A7A000,"Road to Ballhalla",UE4,playable,2021-06-07 02:22:36
+0100735010F58000,"Road To Guangdong",slow,playable,2020-10-12 12:15:32
+010068200C5BE000,"Roarr! Jurassic Edition",,playable,2022-10-19 23:57:45
+0100618004096000,"Robonauts",nvdec,playable,2022-08-12 11:33:23
+010039A0117C0000,"ROBOTICS;NOTES DaSH",,playable,2020-11-16 23:09:54
+01002A900EE8A000,"ROBOTICS;NOTES ELITE",,playable,2020-11-26 10:28:20
+010044A010BB8000,"Robozarro",,playable,2020-09-03 13:33:40
+01000CC012D74000,"Rock 'N Racing Bundle Grand Prix & Rally",,playable,2021-01-06 20:23:57
+0100A1B00DB36000,"Rock of Ages 3: Make & Break",UE4,playable,2022-10-06 12:18:29
+0100513005AF4000,"Rock'N Racing Off Road DX",,playable,2021-01-10 15:27:15
+01005EE0036EC000,"Rocket League®",gpu;online-broken;ldn-untested,ingame,2024-02-08 19:51:36
+0100E88009A34000,"Rocket Wars",,playable,2020-07-24 14:27:39
+0100EC7009348000,"Rogue Aces",gpu;services;nvdec,ingame,2021-11-30 02:18:30
+01009FA010848000,"Rogue Heroes: Ruins of Tasos",online,playable,2021-04-01 15:41:25
+010056500AD50000,"Rogue Legacy",,playable,2020-08-10 19:17:28
+0100F3B010F56000,"Rogue Robots",,playable,2020-06-16 12:16:11
+01001CC00416C000,"Rogue Trooper Redux",nvdec;online-broken,playable,2022-08-12 11:53:01
+0100C7300C0EC000,"RogueCube",,playable,2021-06-16 12:16:42
+0100B7200FC96000,"Roll'd",,playable,2020-07-04 20:24:01
+01004900113F8000,"RollerCoaster Tycoon 3 Complete Edition",32-bit,playable,2022-10-17 14:18:01
+0100E3900B598000,"RollerCoaster Tycoon Adventures",nvdec,playable,2021-01-05 18:14:18
+010076200CA16000,"Rolling Gunner",,playable,2021-05-26 12:54:18
+0100579011B40000,"Rolling Sky 2",,playable,2022-11-03 10:21:12
+010050400BD38000,"Roman Rumble in Las Vegum - Asterix & Obelix XXL 2",deadlock;nvdec,ingame,2022-07-21 17:54:14
+01001F600829A000,"Romancing SaGa 2",,playable,2022-08-12 12:02:24
+0100D0400D27A000,"Romancing SaGa 3",audio;gpu,ingame,2020-06-27 20:26:18
+010088100DD42000,"Roof Rage",crash;regression,boots,2023-11-12 03:47:18
+0100F3000FA58000,"Roombo: First Blood",nvdec,playable,2020-08-05 12:11:37
+0100936011556000,"Root Double -Before Crime * After Days- Xtend Edition",crash,nothing,2022-02-05 02:03:49
+010030A00DA3A000,"Root Letter: Last Answer",vulkan-backend-bug,playable,2022-09-17 10:25:57
+0100AFE00DDAC000,"Royal Roads",,playable,2020-11-17 12:54:38
+0100E2C00B414000,"RPG Maker MV",nvdec,playable,2021-01-05 20:12:01
+01005CD015986000,"rRootage Reloaded",,playable,2022-08-05 23:20:18
+0000000000000000,"RSDKv5u",homebrew,ingame,2024-04-01 16:25:34
+010009B00D33C000,"Rugby Challenge 4",slow;online-broken;UE4,playable,2022-10-06 12:45:53
+01006EC00F2CC000,"RUINER",UE4,playable,2022-10-03 14:11:33
+010074F00DE4A000,"Run the Fan",,playable,2021-02-27 13:36:28
+0100ADF00700E000,"Runbow",online,playable,2021-01-08 22:47:44
+0100D37009B8A000,"Runbow Deluxe Edition",online-broken,playable,2022-08-12 12:20:25
+010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49
+010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17
+010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36
+0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01
+010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43
+0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09
+010007700CFA2000,"Saboteur II: Avenging Angel",Needs Update;cpu;crash,nothing,2021-01-26 14:47:37
+0100D94012FE8000,"Saboteur SiO",slow,ingame,2020-12-17 16:59:49
+0100A5200C2E0000,"Safety First!",,playable,2021-01-06 09:05:23
+0100A51013530000,"SaGa Frontier Remastered",nvdec,playable,2022-11-03 13:54:56
+010003A00D0B4000,"SaGa SCARLET GRACE: AMBITIONS™",,playable,2022-10-06 13:20:31
+01008D100D43E000,"Saints Row IV®: Re-Elected™",ldn-untested;LAN,playable,2023-12-04 18:33:37
+0100DE600BEEE000,"SAINTS ROW®: THE THIRD™ - THE FULL PACKAGE",slow;LAN,playable,2023-08-24 02:40:58
+01007F000EB36000,"Sakai and...",nvdec,playable,2022-12-15 13:53:19
+0100B1400E8FE000,"Sakuna: Of Rice and Ruin",,playable,2023-07-24 13:47:13
+0100BBF0122B4000,"Sally Face",,playable,2022-06-06 18:41:24
+0100D250083B4000,"Salt and Sanctuary",,playable,2020-10-22 11:52:19
+0100CD301354E000,"Sam & Max Save the World",,playable,2020-12-12 13:11:51
+010014000C63C000,"Samsara: Deluxe Edition",,playable,2021-01-11 15:14:12
+0100ADF0096F2000,"Samurai Aces for Nintendo Switch",32-bit,playable,2020-11-24 20:26:55
+01006C600E46E000,"Samurai Jack: Battle Through Time",nvdec;UE4,playable,2022-10-06 13:33:59
+01002DF00F76C000,"SAMURAI SHODOWN",UE4;crash;nvdec,menus,2020-09-06 02:17:00
+0100F6800F48E000,"SAMURAI SHODOWN NEOGEO COLLECTION",nvdec,playable,2021-06-14 17:12:56
+0100B6501A360000,"Samurai Warrior",,playable,2023-02-27 18:42:38
+,"Sangoku Rensenki ~Otome no Heihou!~",gpu;nvdec,ingame,2020-10-17 19:13:14
+0100A4700BC98000,"Satsujin Tantei Jack the Ripper",,playable,2021-06-21 16:32:54
+0100F0000869C000,"Saturday Morning RPG",nvdec,playable,2022-08-12 12:41:50
+01006EE00380C000,"Sausage Sports Club",gpu,ingame,2021-01-10 05:37:17
+0100C8300FA90000,"Save Koch",,playable,2022-09-26 17:06:56
+0100D6E008700000,"Save the Ninja Clan",,playable,2021-01-11 13:56:37
+010091000F72C000,"Save Your Nuts",nvdec;online-broken;UE4,playable,2022-09-27 23:12:02
+0100AA00128BA000,"Saviors of Sapphire Wings / Stranger of Sword City Revisited",crash,menus,2022-10-24 23:00:46
+01001C3012912000,"Say No! More",,playable,2021-05-06 13:43:34
+010010A00A95E000,"Sayonara Wild Hearts",,playable,2023-10-23 03:20:01
+0100ACB004006000,"Schlag den Star",slow;nvdec,playable,2022-08-12 14:28:22
+0100394011C30000,"Scott Pilgrim vs. The World™: The Game – Complete Edition",services-horizon;crash,nothing,2024-07-12 08:13:03
+0100E7100B198000,"Scribblenauts Mega Pack",nvdec,playable,2020-12-17 22:56:14
+01001E40041BE000,"Scribblenauts Showdown",gpu;nvdec,ingame,2020-12-17 23:05:53
+0100829018568000,"SD GUNDAM BATTLE ALLIANCE Demo",audio;crash;demo,ingame,2022-08-01 23:01:20
+010055700CEA8000,"SD GUNDAM G GENERATION CROSS RAYS",nvdec,playable,2022-09-15 20:58:44
+010022900D3EC00,"SD GUNDAM G GENERATION CROSS RAYS PREMIUM G SOUND EDITION",nvdec,playable,2022-09-15 20:45:57
+0100E4A00D066000,"Sea King",UE4;nvdec,playable,2021-06-04 15:49:22
+0100AFE012BA2000,"Sea of Solitude: The Director's Cut",gpu,ingame,2024-07-12 18:29:29
+01008C0016544000,"Sea of Stars",,playable,2024-03-15 20:27:12
+010036F0182C4000,"Sea of Stars Demo",demo,playable,2023-02-12 15:33:56
+0100C2400D68C000,"SeaBed",,playable,2020-05-17 13:25:37
+010077100CA6E000,"Season Match Bundle",,playable,2020-10-27 16:15:22
+010028F010644000,"Secret Files 3",nvdec,playable,2020-10-24 15:32:39
+010075D0101FA000,"Seek Hearts",,playable,2022-11-22 15:06:26
+0100394010844000,"Seers Isle",,playable,2020-11-17 12:28:50
+0100A8900AF04000,"SEGA AGES Alex Kidd in Miracle World",online,playable,2021-05-05 16:35:47
+01001E600AF08000,"SEGA AGES Gain Ground",online,playable,2021-05-05 16:16:27
+0100D4D00AC62000,"SEGA AGES Out Run",,playable,2021-01-11 13:13:59
+01005A300C9F6000,"SEGA AGES Phantasy Star",,playable,2021-01-11 12:49:48
+01005F600CB0E000,"SEGA AGES Puyo Puyo",online,playable,2021-05-05 16:09:28
+010051F00AC5E000,"SEGA AGES Sonic The Hedgehog",slow,playable,2023-03-05 20:16:31
+01000D200C614000,"SEGA AGES Sonic The Hedgehog 2",,playable,2022-09-21 20:26:35
+0100C3E00B700000,"SEGA AGES Space Harrier",,playable,2021-01-11 12:57:40
+010054400D2E6000,"SEGA AGES Virtua Racing",online-broken,playable,2023-01-29 17:08:39
+01001E700AC60000,"SEGA AGES Wonder Boy: Monster Land",online,playable,2021-05-05 16:28:25
+0100B3C014BDA000,"SEGA Genesis™ – Nintendo Switch Online",crash;regression,nothing,2022-04-11 07:27:21
+,"SEGA Mega Drive Classics",online,playable,2021-01-05 11:08:00
+01009840046BC000,"Semispheres",,playable,2021-01-06 23:08:31
+0100D1800D902000,"SENRAN KAGURA Peach Ball",,playable,2021-06-03 15:12:10
+0100E0C00ADAC000,"SENRAN KAGURA Reflexions",,playable,2020-03-23 19:15:23
+01009E500D29C000,"Sentinels of Freedom",,playable,2021-06-14 16:42:19
+0100A5D012DAC000,"SENTRY",,playable,2020-12-13 12:00:24
+010059700D4A0000,"Sephirothic Stories",services,menus,2021-11-25 08:52:17
+010007D00D43A000,"Serious Sam Collection",vulkan-backend-bug,boots,2022-10-13 13:53:34
+0100B2C00E4DA000,"Served!",nvdec,playable,2022-09-28 12:46:00
+010018400C24E000,"Seven Knights -Time Wanderer-",vulkan-backend-bug,playable,2022-10-13 22:08:54
+0100D6F016676000,"Seven Pirates H",,playable,2024-06-03 14:54:12
+0100157004512000,"Severed",,playable,2020-12-15 21:48:48
+0100D5500DA94000,"Shadow Blade: Reload",nvdec,playable,2021-06-11 18:40:43
+0100BE501382A000,"Shadow Gangs",cpu;gpu;crash;regression,ingame,2024-04-29 00:07:26
+0100C3A013840000,"Shadow Man Remastered",gpu,ingame,2024-05-20 06:01:39
+010073400B696000,"Shadowgate",,playable,2021-04-24 07:32:57
+0100371013B3E000,"Shadowrun Returns",gpu;Needs Update,ingame,2022-10-04 21:32:31
+01008310154C4000,"Shadowrun: Dragonfall - Director's Cut",gpu;Needs Update,ingame,2022-10-04 20:52:18
+0100C610154CA000,"Shadowrun: Hong Kong - Extended Edition",gpu;Needs Update,ingame,2022-10-04 20:53:09
+010000000EEF0000,"Shadows 2: Perfidia",,playable,2020-08-07 12:43:46
+0100AD700CBBE000,"Shadows of Adam",,playable,2021-01-11 13:35:58
+01002A800C064000,"Shadowverse Champions Battle",,playable,2022-10-02 22:59:29
+01003B90136DA000,"Shadowverse: Champion's Battle",crash,nothing,2023-03-06 00:31:50
+0100820013612000,"Shady Part of Me",,playable,2022-10-20 11:31:55
+0100B10002904000,"Shakedown: Hawaii",,playable,2021-01-07 09:44:36
+01008DA012EC0000,"Shakes on a Plane",crash,menus,2021-11-25 08:52:25
+0100B4900E008000,"Shalnor Legends: Sacred Lands",,playable,2021-06-11 14:57:11
+010006C00CC10000,"Shanky: The Vegan`s Nightmare",,playable,2021-01-26 15:03:55
+0100430013120000,"Shantae",,playable,2021-05-21 04:53:26
+0100EFD00A4FA000,"Shantae and the Pirate's Curse",,playable,2024-04-29 17:21:57
+0100EB901040A000,"Shantae and the Seven Sirens",nvdec,playable,2020-06-19 12:23:40
+01006A200936C000,"Shantae: Half- Genie Hero Ultimate Edition",,playable,2020-06-04 20:14:20
+0100ADA012370000,"Shantae: Risky's Revenge - Director's Cut",,playable,2022-10-06 20:47:39
+01003AB01062C000,"Shaolin vs Wutang",deadlock,nothing,2021-03-29 20:38:54
+0100B250009B9600,"Shape Of The World0",UE4,playable,2021-03-05 16:42:28
+01004F50085F2000,"She Remembered Caterpillars",,playable,2022-08-12 17:45:14
+01000320110C2000,"She Sees Red - Interactive Movie",nvdec,playable,2022-09-30 11:30:15
+01009EB004CB0000,"Shelter Generations",,playable,2021-06-04 16:52:39
+010020F014DBE000,"Sherlock Holmes: The Devil’s Daughter",gpu,ingame,2022-07-11 00:07:26
+0100B1000AC3A000,"Shift Happens",,playable,2021-01-05 21:24:18
+01000E8009E1C000,"Shift Quantum",UE4;crash,ingame,2020-11-06 21:54:08
+01000750084B2000,"Shiftlings - Enhanced Edition",nvdec,playable,2021-03-04 13:49:54
+01003B0012DC2000,"Shin Megami Tensei III Nocturne HD Remaster",,playable,2022-11-03 22:53:27
+010045800ED1E000,"Shin Megami Tensei III NOCTURNE HD REMASTER",gpu;Needs Update,ingame,2022-11-03 19:57:01
+010063B012DC6000,"Shin Megami Tensei V",UE4,playable,2024-02-21 06:30:07
+010069C01AB82000,"Shin Megami Tensei V: Vengeance",gpu;vulkan-backend-bug,ingame,2024-07-14 11:28:24
+01009050133B4000,"Shing! (サムライフォース:斬!)",nvdec,playable,2022-10-22 00:48:54
+01009A5009A9E000,"Shining Resonance Refrain",nvdec,playable,2022-08-12 18:03:01
+01004EE0104F6000,"Shinsekai Into the Depths™",,playable,2022-09-28 14:07:51
+0100C2F00A568000,"Shio",,playable,2021-02-22 16:25:09
+0100B2E00F13E000,"Shipped",,playable,2020-11-21 14:22:32
+01000E800FCB4000,"Ships",,playable,2021-06-11 16:14:37
+01007430122D0000,"Shiren the Wanderer: The Tower of Fortune and the Dice of Fate",nvdec,playable,2022-10-20 11:44:36
+,"Shiritsu Berubara Gakuen ~Versailles no Bara Re*imagination~",cpu;crash,boots,2020-09-27 19:01:25
+01000244016BAE00,"Shiro0",gpu,ingame,2024-01-13 08:54:39
+0100CCE00DDB6000,"Shoot 1UP DX",,playable,2020-12-13 12:32:47
+01001180021FA000,"Shovel Knight: Specter of Torment",,playable,2020-05-30 08:34:17
+010057D0021E8000,"Shovel Knight: Treasure Trove",,playable,2021-02-14 18:24:39
+01003DD00BF0E000,"Shred! 2 - ft Sam Pilgrim",,playable,2020-05-30 14:34:09
+01001DE0076A4000,"Shu",nvdec,playable,2020-05-30 09:08:59
+0100A7900B936000,"Shut Eye",,playable,2020-07-23 18:08:35
+010044500C182000,"Sid Meier’s Civilization VI",ldn-untested,playable,2024-04-08 16:03:40
+01007FC00B674000,"Sigi - A Fart for Melusina",,playable,2021-02-22 16:46:58
+0100F1400B0D6000,"Silence",nvdec,playable,2021-06-03 14:46:17
+0100A32010618000,"Silent World",,playable,2020-08-28 13:45:13
+010045500DFE2000,"Silk",nvdec,playable,2021-06-10 15:34:37
+010016D00A964000,"SilverStarChess",,playable,2021-05-06 15:25:57
+0100E8C019B36000,"Simona's Requiem",gpu,ingame,2023-02-21 18:29:19
+01006FE010438000,"Sin Slayers",,playable,2022-10-20 11:53:52
+01002820036A8000,"Sine Mora EX",gpu;online-broken,ingame,2022-08-12 19:36:18
+0100F10012002000,"Singled Out",online,playable,2020-08-03 13:06:18
+0100B8800F858000,"Sinless",nvdec,playable,2020-08-09 20:18:55
+0100B16009C10000,"SINNER: Sacrifice for Redemption",nvdec;UE4;vulkan-backend-bug,playable,2022-08-12 20:37:33
+0100E9201410E000,"Sir Lovelot",,playable,2021-04-05 16:21:46
+0100134011E32000,"Skate City",,playable,2022-11-04 11:37:39
+0100B2F008BD8000,"Skee-Ball",,playable,2020-11-16 04:44:07
+01001A900F862000,"Skelattack",,playable,2021-06-09 15:26:26
+01008E700F952000,"Skelittle: A Giant Party!",,playable,2021-06-09 19:08:34
+01006C000DC8A000,"Skelly Selest",,playable,2020-05-30 15:38:18
+0100D67006F14000,"Skies of Fury DX",,playable,2020-05-30 16:40:54
+010046B00DE62000,"Skullgirls 2nd Encore",,playable,2022-09-15 21:21:25
+0100D1100BF9C000,"Skulls of the Shogun: Bone-A-Fide Edition",,playable,2020-08-31 18:58:12
+0100D7B011654000,"Skully",nvdec;UE4,playable,2022-10-06 13:52:59
+010083100B5CA000,"Sky Force Anniversary",online-broken,playable,2022-08-12 20:50:07
+01006FE005B6E000,"Sky Force Reloaded",,playable,2021-01-04 20:06:57
+010003F00CC98000,"Sky Gamblers - Afterburner",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-12 21:04:55
+010093D00AC38000,"Sky Gamblers: Storm Raiders",gpu;audio;32-bit,ingame,2022-08-12 21:13:36
+010068200E96E000,"Sky Gamblers: Storm Raiders 2",gpu,ingame,2022-09-13 12:24:04
+01004F0010A02000,"Sky Racket",,playable,2020-09-07 12:22:24
+0100DDB004F30000,"Sky Ride",,playable,2021-02-22 16:53:07
+0100C5700434C000,"Sky Rogue",,playable,2020-05-30 08:26:28
+0100C52011460000,"Sky: Children of the Light",cpu;online-broken,nothing,2023-02-23 10:57:10
+010041C01014E000,"Skybolt Zack",,playable,2021-04-12 18:28:00
+0100A0A00D1AA000,"SKYHILL",,playable,2021-03-05 15:19:11
+,"Skylanders Imaginators",crash;services,boots,2020-05-30 18:49:18
+010021A00ABEE000,"SKYPEACE",,playable,2020-05-29 14:14:30
+0100EA400BF44000,"SkyScrappers",,playable,2020-05-28 22:11:25
+0100F3C00C400000,"SkyTime",slow,ingame,2020-05-30 09:24:51
+01003AD00DEAE000,"SlabWell: The Quest For Kaktun's Alpaca",,playable,2021-02-22 17:02:51
+0100224004004000,"Slain: Back from Hell",,playable,2022-08-12 23:36:19
+010026300BA4A000,"Slay the Spire",,playable,2023-01-20 15:09:26
+0100501006494000,"Slayaway Camp: Butcher's Cut",opengl-backend-bug,playable,2022-08-12 23:44:05
+01004E900EDDA000,"Slayin 2",gpu,ingame,2024-04-19 16:15:26
+01004AC0081DC000,"Sleep Tight",gpu;UE4,ingame,2022-08-13 00:17:32
+0100F4500AA4E000,"Slice, Dice & Rice",online,playable,2021-02-22 17:44:23
+010010D011E1C000,"Slide Stars",crash,menus,2021-11-25 08:53:43
+0100112003B8A000,"Slime-san",,playable,2020-05-30 16:15:12
+01002AA00C974000,"SMASHING THE BATTLE",,playable,2021-06-11 15:53:57
+0100C9100B06A000,"SmileBASIC 4",gpu,menus,2021-07-29 17:35:59
+0100207007EB2000,"Smoke And Sacrifice",,playable,2022-08-14 12:38:27
+01009790186FE000,"SMURFS KART",,playable,2023-10-18 00:55:00
+0100F2800D46E000,"Snack World The Dungeon Crawl Gold",gpu;slow;nvdec;audout,ingame,2022-05-01 21:12:44
+0100C0F0020E8000,"Snake Pass",nvdec;UE4,playable,2022-01-03 04:31:52
+010075A00BA14000,"Sniper Elite 3 Ultimate Edition",ldn-untested,playable,2024-04-18 07:47:49
+010007B010FCC000,"Sniper Elite 4",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2024-06-18 17:53:15
+0100BB000A3AA000,"Sniper Elite V2 Remastered",slow;nvdec;online-broken;ldn-untested,ingame,2022-08-14 13:23:13
+01008E20047DC000,"Snipperclips Plus: Cut It Out, Together!",,playable,2023-02-14 20:20:13
+0100704000B3A000,"Snipperclips™ – Cut it out, together!",,playable,2022-12-05 12:44:55
+01004AB00AEF8000,"SNK 40th ANNIVERSARY COLLECTION",,playable,2022-08-14 13:33:15
+010027F00AD6C000,"SNK HEROINES Tag Team Frenzy",nvdec;online-broken;ldn-untested,playable,2022-08-14 14:19:25
+01008DA00CBBA000,"Snooker 19",nvdec;online-broken;UE4,playable,2022-09-11 17:43:22
+010045300516E000,"Snow Moto Racing Freedom",gpu;vulkan-backend-bug,ingame,2022-08-15 16:05:14
+0100BE200C34A000,"Snowboarding The Next Phase",nvdec,playable,2021-02-23 12:56:58
+0100FBD013AB6000,"SnowRunner",services;crash,boots,2023-10-07 00:01:16
+010017B012AFC000,"Soccer Club Life: Playing Manager",gpu,ingame,2022-10-25 11:59:22
+0100B5000E05C000,"Soccer Pinball",UE4;gpu,ingame,2021-06-15 20:56:51
+010011A00A9A8000,"Soccer Slammers",,playable,2020-05-30 07:48:14
+010095C00F9DE000,"Soccer, Tactics & Glory",gpu,ingame,2022-09-26 17:15:58
+0100590009C38000,"SOL DIVIDE -SWORD OF DARKNESS- for Nintendo Switch",32-bit,playable,2021-06-09 14:13:03
+0100A290048B0000,"Soldam: Drop, Connect, Erase",,playable,2020-05-30 09:18:54
+010008600D1AC000,"Solo: Islands of the Heart",gpu;nvdec,ingame,2022-09-11 17:54:43
+01009EE00E91E000,"Some Distant Memory",,playable,2022-09-15 21:48:19
+01004F401BEBE000,"Song of Nunu: A League of Legends Story",,ingame,2024-07-12 18:53:44
+0100E5400BF94000,"Songbird Symphony",,playable,2021-02-27 02:44:04
+010031D00A604000,"Songbringer",,playable,2020-06-22 10:42:02
+0000000000000000,"Sonic 1 (2013)",crash;homebrew,ingame,2024-04-06 18:31:20
+0000000000000000,"Sonic 2 (2013)",crash;homebrew,ingame,2024-04-01 16:25:30
+0000000000000000,"Sonic A.I.R",homebrew,ingame,2024-04-01 16:25:32
+0000000000000000,"Sonic CD",crash;homebrew,ingame,2024-04-01 16:25:31
+010040E0116B8000,"Sonic Colors: Ultimate",,playable,2022-11-12 21:24:26
+01001270012B6000,"SONIC FORCES™",,playable,2024-07-28 13:11:21
+01004AD014BF0000,"Sonic Frontiers",gpu;deadlock;amd-vendor-bug;intel-vendor-bug,ingame,2024-09-05 09:18:53
+01009AA000FAA000,"Sonic Mania",,playable,2020-06-08 17:30:57
+01009FB016286000,"Sonic Origins",crash,ingame,2024-06-02 07:20:15
+01008F701C074000,"SONIC SUPERSTARS",gpu;nvdec,ingame,2023-10-28 17:48:07
+010088801C150000,"Sonic Superstars Digital Art Book with Mini Digital Soundtrack",,playable,2024-08-20 13:26:56
+01005EA01C0FC000,"SONIC X SHADOW GENERATIONS",crash,ingame,2025-01-07 04:20:45
+010064F00C212000,"Soul Axiom Rebooted",nvdec;slow,ingame,2020-09-04 12:41:01
+0100F2100F0B2000,"Soul Searching",,playable,2020-07-09 18:39:07
+01008F2005154000,"South Park™: The Fractured but Whole™ - Standard Edition",slow;online-broken,playable,2024-07-08 17:47:28
+0100B9F00C162000,"Space Blaze",,playable,2020-08-30 16:18:05
+010005500E81E000,"Space Cows",UE4;crash,menus,2020-06-15 11:33:20
+0100707011722000,"Space Elite Force",,playable,2020-11-27 15:21:05
+010047B010260000,"Space Pioneer",,playable,2022-10-20 12:24:37
+010010A009830000,"Space Ribbon",,playable,2022-08-15 17:17:10
+0000000000000000,"SpaceCadetPinball",homebrew,ingame,2024-04-18 19:30:04
+0100D9B0041CE000,"Spacecats with Lasers",,playable,2022-08-15 17:22:44
+010034800FB60000,"Spaceland",,playable,2020-11-01 14:31:56
+010028D0045CE000,"Sparkle 2",,playable,2020-10-19 11:51:39
+01000DC007E90000,"Sparkle Unleashed",,playable,2021-06-03 14:52:15
+0100E4F00AE14000,"Sparkle ZERO",gpu;slow,ingame,2020-03-23 18:19:18
+01007ED00C032000,"Sparklite",,playable,2022-08-06 11:35:41
+0100E6A009A26000,"Spartan",UE4;nvdec,playable,2021-03-05 15:53:19
+010020500E7A6000,"Speaking Simulator",,playable,2020-10-08 13:00:39
+01008B000A5AE000,"Spectrum",,playable,2022-08-16 11:15:59
+0100F18010BA0000,"Speed 3: Grand Prix",UE4,playable,2022-10-20 12:32:31
+010040F00AA9A000,"Speed Brawl",slow,playable,2020-09-18 22:08:16
+01000540139F6000,"Speed Limit",gpu,ingame,2022-09-02 18:37:40
+010061F013A0E000,"Speed Truck Racing",,playable,2022-10-20 12:57:04
+0100E74007EAC000,"Spellspire",,playable,2022-08-16 11:21:21
+010021F004270000,"Spelunker Party!",services,boots,2022-08-16 11:25:49
+0100710013ABA000,"Spelunky",,playable,2021-11-20 17:45:03
+0100BD500BA94000,"Sphinx and the Cursed Mummy",gpu;32-bit;opengl,ingame,2024-05-20 06:00:51
+010092A0102AE000,"Spider Solitaire",,playable,2020-12-16 16:19:30
+010076D0122A8000,"Spinch",,playable,2024-07-12 19:02:10
+01001E40136FE000,"Spinny's Journey",crash,ingame,2021-11-30 03:39:44
+010023E008702000,"Spiral Splatter",,playable,2020-06-04 14:03:57
+0100D1B00B6FA000,"Spirit Hunter: Death Mark",,playable,2020-12-13 10:56:25
+0100FAE00E19A000,"Spirit Hunter: NG",32-bit,playable,2020-12-17 20:38:47
+01005E101122E000,"Spirit of the North",UE4,playable,2022-09-30 11:40:47
+01000AC00F5EC000,"Spirit Roots",nvdec,playable,2020-07-10 13:33:32
+0100BD400DC52000,"Spiritfarer",gpu,ingame,2022-10-06 16:31:38
+01009D60080B4000,"SpiritSphere DX",,playable,2021-07-03 23:37:49
+010042700E3FC000,"Spitlings",online-broken,playable,2022-10-06 16:42:39
+01003BC0000A0000,"Splatoon™ 2",ldn-works;LAN,playable,2024-07-12 19:11:15
+0100C2500FC20000,"Splatoon™ 3",ldn-works;opengl-backend-bug;LAN;amd-vendor-bug,playable,2024-08-04 23:49:11
+0100BA0018500000,"Splatoon™ 3: Splatfest World Premiere",gpu;online-broken;demo,ingame,2022-09-19 03:17:12
+010062800D39C000,"SpongeBob SquarePants: Battle for Bikini Bottom - Rehydrated",online-broken;UE4;ldn-broken;vulkan-backend-bug,playable,2023-08-01 19:29:34
+01009FB0172F4000,"SpongeBob SquarePants: The Cosmic Shake",gpu;UE4,ingame,2023-08-01 19:29:53
+010097C01336A000,"Spooky Chase",,playable,2022-11-04 12:17:44
+0100C6100D75E000,"Spooky Ghosts Dot Com",,playable,2021-06-15 15:16:11
+0100DE9005170000,"Sports Party",nvdec,playable,2021-03-05 13:40:42
+0100E04009BD4000,"Spot The Difference",,playable,2022-08-16 11:49:52
+010052100D1B4000,"Spot The Differences: Party!",,playable,2022-08-16 11:55:26
+01000E6015350000,"Spy Alarm",services,ingame,2022-12-09 10:12:51
+01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51
+010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33
+0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05
+010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08
+0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32
+0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16
+010065301A2E0000,"STAR OCEAN THE SECOND STORY R",crash,ingame,2024-06-01 02:39:59
+010060D00F658000,"Star Renegades",nvdec,playable,2020-12-11 12:19:23
+0100D7000AE6A000,"Star Story: The Horizon Escape",,playable,2020-08-11 22:31:38
+01009DF015776000,"Star Trek Prodigy: Supernova",nvdec;UE4;opengl-backend-bug,playable,2022-10-14 10:18:50
+0100BD100FFBE000,"STAR WARS™ Episode I Racer",slow;nvdec,playable,2022-10-03 16:08:36
+0100BB500EACA000,"STAR WARS™ Jedi Knight II: Jedi Outcast™",gpu,ingame,2022-09-15 22:51:00
+01008CA00FAE8000,"STAR WARS™ Jedi Knight: Jedi Academy",gpu,boots,2021-06-16 12:35:30
+01006DA00DEAC000,"Star Wars™ Pinball",online-broken,playable,2022-09-11 18:53:31
+0100FA10115F8000,"STAR WARS™ Republic Commando™",gpu;32-bit,ingame,2023-10-31 15:57:17
+010040701B948000,"STAR WARS™: Battlefront Classic Collection",gpu;vulkan,ingame,2024-07-12 19:24:21
+0100854015868000,"STAR WARS™: Knights of the Old Republic™",gpu;deadlock,boots,2024-02-12 10:13:51
+0100153014544000,"STAR WARS™: The Force Unleashed™",,playable,2024-05-01 17:41:28
+01005EB00EA10000,"Star-Crossed Myth - The Department of Wishes -",gpu,ingame,2021-06-04 19:34:36
+0100E6B0115FC000,"Star99",online,menus,2021-11-26 14:18:51
+01002100137BA000,"Stardash",,playable,2021-01-21 16:31:19
+0100E65002BB8000,"Stardew Valley",online-broken;ldn-untested,playable,2024-02-14 03:11:19
+01002CC003FE6000,"Starlink: Battle for Atlas™ Digital Edition",services-horizon;crash;Needs Update,nothing,2024-05-05 17:25:11
+010098E010FDA000,"Starlit Adventures Golden Stars",,playable,2020-11-21 12:14:43
+01001BB00AC26000,"STARSHIP AVENGER Operation: Take Back Earth",,playable,2021-01-12 15:52:55
+010000700A572000,"State of Anarchy: Master of Mayhem",nvdec,playable,2021-01-12 19:00:05
+0100844004CB6000,"State of Mind",UE4;crash,boots,2020-06-22 22:17:50
+0100616009082000,"STAY",crash;services,boots,2021-04-23 14:24:52
+0100B61009C60000,"STAY COOL, KOBAYASHI-SAN!: A RIVER CITY RANSOM STORY",,playable,2021-01-26 17:37:28
+01008010118CC000,"Steam Prison",nvdec,playable,2021-04-01 15:34:11
+0100AE100DAFA000,"Steam Tactics",,playable,2022-10-06 16:53:45
+01004DD00C87A000,"Steamburg",,playable,2021-01-13 08:42:01
+01009320084A4000,"SteamWorld Dig",,playable,2024-08-19 12:12:23
+0100CA9002322000,"SteamWorld Dig 2",,playable,2022-12-21 19:25:42
+0100F6D00D83E000,"SteamWorld Quest: Hand of Gilgamech",nvdec,playable,2020-11-09 13:10:04
+01001C6014772000,"Steel Assault",,playable,2022-12-06 14:48:30
+010042800B880000,"STEINS;GATE ELITE",,playable,2020-08-04 07:33:32
+0100CB400E9BC000,"STEINS;GATE: My Darling's Embrace",nvdec,playable,2022-11-20 16:48:34
+01002DE01043E000,"Stela",UE4,playable,2021-06-15 13:28:34
+01005A700C954000,"Stellar Interface",,playable,2022-10-20 13:44:33
+0100BC800EDA2000,"STELLATUM",gpu,playable,2021-03-07 16:30:23
+0100775004794000,"Steredenn: Binary Stars",,playable,2021-01-13 09:19:42
+0100AE0006474000,"Stern Pinball Arcade",,playable,2022-08-16 14:24:41
+0100E24006FA8000,"Stikbold! A Dodgeball Adventure DELUXE",,playable,2021-01-11 20:12:54
+010077B014518000,"Stitchy in Tooki Trouble",,playable,2021-05-06 16:25:53
+010070D00F640000,"STONE",UE4,playable,2022-09-30 11:53:32
+010074400F6A8000,"Stories Untold",nvdec,playable,2022-12-22 01:08:46
+010040D00BCF4000,"Storm Boy",,playable,2022-10-20 14:15:06
+0100B2300B932000,"Storm In A Teacup",gpu,ingame,2021-11-06 02:03:19
+0100D5D00DAF2000,"Story of a Gladiator",,playable,2020-07-29 15:08:18
+010017301007E000,"STORY OF SEASONS Pioneers of Olive [ 牧場物語 オリーブタウンと希望の大地 ]",,playable,2021-03-18 11:42:19
+0100ED400EEC2000,"STORY OF SEASONS: Friends of Mineral Town",,playable,2022-10-03 16:40:31
+010078D00E8F4000,"Stranded Sails - Explorers of the Cursed Islands",slow;nvdec;UE4,playable,2022-09-16 11:58:38
+01000A6013F86000,"Strange Field Football",,playable,2022-11-04 12:25:57
+0100DD600DD48000,"Stranger Things 3: The Game",,playable,2021-01-11 17:44:09
+0100D7E011C64000,"Strawberry Vinegar",nvdec,playable,2022-12-05 16:25:40
+010075101EF84000,"Stray",crash,ingame,2025-01-07 04:03:00
+0100024008310000,"Street Fighter 30th Anniversary Collection",online-broken;ldn-partial,playable,2022-08-20 16:50:47
+010012400D202000,"Street Outlaws: The List",nvdec,playable,2021-06-11 12:15:32
+0100888011CB2000,"Street Power Soccer",UE4;crash,boots,2020-11-21 12:28:57
+0100EC9010258000,"Streets of Rage 4",nvdec;online,playable,2020-07-07 21:21:22
+0100BDE012928000,"Strife: Veteran Edition",gpu,ingame,2022-01-15 05:10:42
+010039100DACC000,"Strike Force - War on Terror",crash;Needs Update,menus,2021-11-24 08:08:20
+010038A00E6C6000,"Strike Force Kitty",nvdec,playable,2020-07-29 16:22:15
+010072500D52E000,"Strike Suit Zero: Director's Cut",crash,boots,2021-04-23 17:15:14
+0100FF5005B76000,"STRIKERS1945 for Nintendo Switch",32-bit,playable,2021-06-03 19:35:04
+0100720008ED2000,"STRIKERS1945 Ⅱ for Nintendo Switch",32-bit,playable,2021-06-03 19:43:00
+0100681011B56000,"Struggling",,playable,2020-10-15 20:37:03
+0100AF000B4AE000,"Stunt Kite Party",nvdec,playable,2021-01-25 17:16:56
+0100C5500E7AE000,"STURMWIND EX",audio;32-bit,playable,2022-09-16 12:01:39
+,"Subarashiki Kono Sekai -Final Remix-",services;slow,ingame,2020-02-10 16:21:51
+010001400E474000,"Subdivision Infinity DX",UE4;crash,boots,2021-03-03 14:26:46
+0100E6400BCE8000,"Sublevel Zero Redux",,playable,2022-09-16 12:30:03
+0100EDA00D866000,"Submerged",nvdec;UE4;vulkan-backend-bug,playable,2022-08-16 15:17:01
+0100429011144000,"Subnautica",vulkan-backend-bug,playable,2022-11-04 13:07:29
+010014C011146000,"Subnautica: Below Zero",,playable,2022-12-23 14:15:13
+0100BF9012AC6000,"Suguru Nature",crash,ingame,2021-07-29 11:36:27
+01005CD00A2A2000,"Suicide Guy",,playable,2021-01-26 13:13:54
+0100DE000C2E4000,"Suicide Guy: Sleepin' Deeply",Needs More Attention,ingame,2022-09-20 23:45:25
+01003D50126A4000,"Sumire",,playable,2022-11-12 13:40:43
+0100A130109B2000,"Summer in Mara",nvdec,playable,2021-03-06 14:10:38
+01004E500DB9E000,"Summer Sweetheart",nvdec,playable,2022-09-16 12:51:46
+0100BFE014476000,"Sunblaze",,playable,2022-11-12 13:59:23
+01002D3007962000,"Sundered: Eldritch Edition",gpu,ingame,2021-06-07 11:46:00
+0100F7000464A000,"Super Beat Sports™",ldn-untested,playable,2022-08-16 16:05:50
+010051A00D716000,"Super Blood Hockey",,playable,2020-12-11 20:01:41
+01007AD00013E000,"Super Bomberman R",nvdec;online-broken;ldn-works,playable,2022-08-16 19:19:14
+0100B87017D94000,"SUPER BOMBERMAN R 2",deadlock,boots,2023-09-29 13:19:51
+0100D9B00DB5E000,"Super Cane Magic ZERO",,playable,2022-09-12 15:33:46
+010065F004E5E000,"Super Chariot",,playable,2021-06-03 13:19:01
+0100E5E00C464000,"SUPER DRAGON BALL HEROES WORLD MISSION",nvdec;online-broken,playable,2022-08-17 12:56:30
+010023100B19A000,"Super Dungeon Tactics",,playable,2022-10-06 17:40:40
+010056800B534000,"Super Inefficient Golf",UE4,playable,2022-08-17 15:53:45
+010015700D5DC000,"Super Jumpy Ball",,playable,2020-07-04 18:40:36
+0100196009998000,"Super Kickers League Ultimate",,playable,2021-01-26 13:36:48
+01003FB00C5A8000,"Super Kirby Clash™",ldn-works,playable,2024-07-30 18:21:55
+010000D00F81A000,"Super Korotama",,playable,2021-06-06 19:06:22
+01003E300FCAE000,"Super Loop Drive",nvdec;UE4,playable,2022-09-22 10:58:05
+054507E0B7552000,"Super Mario 64",homebrew,ingame,2024-03-20 16:57:27
+0100277011F1A000,"Super Mario Bros.™ 35",online-broken,menus,2022-08-07 16:27:25
+010015100B514000,"Super Mario Bros.™ Wonder",amd-vendor-bug,playable,2024-09-06 13:21:21
+01009B90006DC000,"Super Mario Maker™ 2",online-broken;ldn-broken,playable,2024-08-25 11:05:19
+0100000000010000,"Super Mario Odyssey™",nvdec;intel-vendor-bug;mac-bug,playable,2024-08-25 01:32:34
+010036B0034E4000,"Super Mario Party™",gpu;Needs Update;ldn-works,ingame,2024-06-21 05:10:16
+0100BC0018138000,"Super Mario RPG™",gpu;audio;nvdec,ingame,2024-06-19 17:43:42
+0000000000000000,"Super Mario World",homebrew,boots,2024-06-13 01:40:31
+010049900F546000,"Super Mario™ 3D All-Stars",services-horizon;slow;vulkan;amd-vendor-bug,ingame,2024-05-07 02:38:16
+010028600EBDA000,"Super Mario™ 3D World + Bowser’s Fury",ldn-works,playable,2024-07-31 10:45:37
+01004F8006A78000,"Super Meat Boy",services,playable,2020-04-02 23:10:07
+01009C200D60E000,"Super Meat Boy Forever",gpu,boots,2021-04-26 14:25:39
+0100BDD00EC5C000,"Super Mega Space Blaster Special Turbo",online,playable,2020-08-06 12:13:25
+010031F019294000,"Super Monkey Ball Banana Rumble",,playable,2024-06-28 10:39:18
+0100B2A00E1E0000,"Super Monkey Ball: Banana Blitz HD",online-broken,playable,2022-09-16 13:16:25
+01006D000D2A0000,"Super Mutant Alien Assault",,playable,2020-06-07 23:32:45
+01004D600AC14000,"Super Neptunia RPG",nvdec,playable,2022-08-17 16:38:52
+01008D300C50C000,"Super Nintendo Entertainment System™ - Nintendo Switch Online",,playable,2021-01-05 00:29:48
+0100284007D6C000,"Super One More Jump",,playable,2022-08-17 16:47:47
+01001F90122B2000,"Super Punch Patrol",,playable,2024-07-12 19:49:02
+0100331005E8E000,"Super Putty Squad",gpu;32-bit,ingame,2024-04-29 15:51:54
+,"SUPER ROBOT WARS T",online,playable,2021-03-25 11:00:40
+,"SUPER ROBOT WARS V",online,playable,2020-06-23 12:56:37
+,"SUPER ROBOT WARS X",online,playable,2020-08-05 19:18:51
+01004CF00A60E000,"Super Saurio Fly",nvdec,playable,2020-08-06 13:12:14
+010039700D200000,"Super Skelemania",,playable,2020-06-07 22:59:50
+01006A800016E000,"Super Smash Bros.™ Ultimate",gpu;crash;nvdec;ldn-works;intel-vendor-bug,ingame,2024-09-14 23:05:21
+0100D61012270000,"Super Soccer Blast",gpu,ingame,2022-02-16 08:39:12
+0100A9300A4AE000,"Super Sportmatchen",,playable,2022-08-19 12:34:40
+0100FB400F54E000,"Super Street: Racer",UE4,playable,2022-09-16 13:43:14
+010000500DB50000,"Super Tennis Blast",,playable,2022-08-19 16:20:48
+0100C6800D770000,"Super Toy Cars 2",gpu;regression,ingame,2021-03-02 20:15:15
+010035B00B3F0000,"Super Volley Blast",,playable,2022-08-19 18:14:40
+0100FF60051E2000,"Superbeat: Xonic EX",crash;nvdec,ingame,2022-08-19 18:54:40
+0100630010252000,"SuperEpic: The Entertainment War",,playable,2022-10-13 23:02:48
+01001A500E8B4000,"SUPERHOT",,playable,2021-05-05 19:51:30
+010075701153A000,"Superliminal",,playable,2020-09-03 13:20:50
+0100C01012654000,"Supermarket Shriek",,playable,2022-10-13 23:19:20
+0100A6E01201C000,"Supraland",nvdec;UE4;opengl-backend-bug,playable,2022-10-14 09:49:11
+010029A00AEB0000,"Survive! MR.CUBE",,playable,2022-10-20 14:44:47
+01005AB01119C000,"SUSHI REVERSI",,playable,2021-06-11 19:26:58
+0100DDD0085A4000,"Sushi Striker™: The Way of Sushido",nvdec,playable,2020-06-26 20:49:11
+0100D6D00EC2C000,"Sweet Witches",nvdec,playable,2022-10-20 14:56:37
+010049D00C8B0000,"Swimsanity!",online,menus,2021-11-26 14:27:16
+01005DF00DC26000,"SWORD ART ONLINE: FATAL BULLET Complete Edition",UE4;gpu;online,ingame,2021-06-09 16:58:50
+01001B600D1D6000,"SWORD ART ONLINE: Hollow Realization Deluxe Edition",nvdec,playable,2022-08-19 19:19:15
+01000D70049BE000,"Sword of the Guardian",,playable,2020-07-16 12:24:39
+0100E4701355C000,"Sword of the Necromancer",crash,ingame,2022-12-10 01:28:39
+01004BB00421E000,"Syberia 1 & 2",,playable,2021-12-24 12:06:25
+010028C003FD6000,"Syberia 2",gpu,ingame,2022-08-24 12:43:03
+0100CBE004E6C000,"Syberia 3",nvdec,playable,2021-01-25 16:15:12
+010007300C482000,"Sydney Hunter and the Curse of the Mayan",,playable,2020-06-15 12:15:57
+0100D8400DAF0000,"SYNAPTIC DRIVE",online,playable,2020-09-07 13:44:05
+01009E700F448000,"Synergia",,playable,2021-04-06 17:58:04
+01009BF00E7D2000,"SYNTHETIK: Ultimate",gpu;crash,ingame,2022-08-30 03:19:25
+010015B00BB00000,"Table Top Racing: World Tour - Nitro Edition",,playable,2020-04-05 23:21:30
+01000F20083A8000,"Tactical Mind",,playable,2021-01-25 18:05:00
+0100BD700F5F0000,"Tactical Mind 2",,playable,2020-07-01 23:11:07
+0100E12013C1A000,"Tactics Ogre: Reborn",vulkan-backend-bug,playable,2024-04-09 06:21:35
+01007C7006AEE000,"Tactics V: Obsidian Brigade",,playable,2021-02-28 15:09:42
+01002C000B552000,"Taiko no Tatsujin: Drum 'n' Fun!",online-broken;ldn-broken,playable,2023-05-20 15:10:12
+0100BCA0135A0000,"Taiko no Tatsujin: Rhythm Festival",,playable,2023-11-13 13:16:34
+0100DD6012644000,"Taiko no Tatsujin: Rhythmic Adventure Pack",,playable,2020-12-03 07:28:26
+0100346017304000,"Taiko Risshiden V DX",crash,nothing,2022-06-06 16:25:31
+010040A00EA26000,"Taimumari: Complete Edition",,playable,2022-12-06 13:34:49
+0100F0C011A68000,"Tales from the Borderlands",nvdec,playable,2022-10-25 18:44:14
+0100408007078000,"Tales of the Tiny Planet",,playable,2021-01-25 15:47:41
+01002C0008E52000,"Tales of Vesperia™: Definitive Edition",,playable,2024-09-28 03:20:47
+010012800EE3E000,"Tamashii",,playable,2021-06-10 15:26:20
+010008A0128C4000,"Tamiku",gpu,ingame,2021-06-15 20:06:55
+010048F007ADE000,"Tangledeep",crash,boots,2021-01-05 04:08:41
+01007DB010D2C000,"TaniNani",crash;kernel,nothing,2021-04-08 03:06:44
+0100E06012BB4000,"Tank Mechanic Simulator",,playable,2020-12-11 15:10:45
+01007A601318C000,"Tanuki Justice",opengl,playable,2023-02-21 18:28:10
+01004DF007564000,"Tanzia",,playable,2021-06-07 11:10:25
+01002D4011208000,"Task Force Kampas",,playable,2020-11-30 14:44:15
+0100B76011DAA000,"Taxi Chaos",slow;online-broken;UE4,playable,2022-10-25 19:13:00
+0100F43011E5A000,"Tcheco in the Castle of Lucio",,playable,2020-06-27 13:35:43
+010092B0091D0000,"Team Sonic Racing",online-broken;ldn-works,playable,2024-02-05 15:05:27
+0100FE701475A000,"Teenage Mutant Ninja Turtles: Shredder's Revenge",deadlock;crash,boots,2024-09-28 09:31:39
+01005CF01E784000,"Teenage Mutant Ninja Turtles: Splintered Fate",,playable,2024-08-03 13:50:42
+0100FDB0154E4000,"Teenage Mutant Ninja Turtles: The Cowabunga Collection",,playable,2024-01-22 19:39:04
+010021100DF22000,"Telling Lies",,playable,2020-10-23 21:14:51
+0100C8B012DEA000,"Temtem",online-broken,menus,2022-12-17 17:36:11
+0100B2600A398000,"TENGAI for Nintendo Switch",32-bit,playable,2020-11-25 19:52:26
+0100D7A005DFC000,"Tennis",,playable,2020-06-01 20:50:36
+01002970080AA000,"Tennis in the Face",,playable,2022-08-22 14:10:54
+0100092006814000,"Tennis World Tour",online-broken,playable,2022-08-22 14:27:10
+0100950012F66000,"Tennis World Tour 2",online-broken,playable,2022-10-14 10:43:16
+0100E46006708000,"Terraria",online-broken,playable,2022-09-12 16:14:57
+010070C00FB56000,"TERROR SQUID",online-broken,playable,2023-10-30 22:29:29
+010043700EB68000,"TERRORHYTHM (TRRT)",,playable,2021-02-27 13:18:14
+0100FBC007EAE000,"Tesla vs Lovecraft",,playable,2023-11-21 06:19:36
+01005C8005F34000,"Teslagrad",,playable,2021-02-23 14:41:02
+01006F701507A000,"Tested on Humans: Escape Room",,playable,2022-11-12 14:42:52
+0100671016432000,"TETRA for Nintendo Switch™ International Edition",,playable,2020-06-26 20:49:55
+01004E500A15C000,"TETRA's Escape",,playable,2020-06-03 18:21:14
+010040600C5CE000,"Tetris 99 Retail Bundle",gpu;online-broken;ldn-untested,ingame,2024-05-02 16:36:41
+0100EC000D39A000,"Tetsumo Party",,playable,2020-06-09 22:39:55
+01008ED0087A4000,"The Adventure Pals",,playable,2022-08-22 14:48:52
+0100137010152000,"The Adventures of 00 Dilly®",,playable,2020-12-30 19:32:29
+01003B400A00A000,"The Adventures of Bertram Fiddle: Episode 1: A Dreadly Business",nvdec,playable,2022-09-17 11:07:56
+010035C00A4BC000,"The Adventures of Elena Temple",,playable,2020-06-03 23:15:35
+010045A00E038000,"The Alliance Alive HD Remastered",nvdec,playable,2021-03-07 15:43:45
+010079A0112BE000,"The Almost Gone",,playable,2020-07-05 12:33:07
+0100CD500DDAE000,"The Bard's Tale ARPG: Remastered and Resnarkled",gpu;nvdec;online-working,ingame,2024-07-18 12:52:01
+01001E50141BC000,"The Battle Cats Unite!",deadlock,ingame,2021-12-14 21:38:34
+010089600E66A000,"The Big Journey",,playable,2022-09-16 14:03:08
+010021C000B6A000,"The Binding of Isaac: Afterbirth+",,playable,2021-04-26 14:11:56
+0100A5A00B2AA000,"The Bluecoats North & South",nvdec,playable,2020-12-10 21:22:29
+010062500BFC0000,"The Book of Unwritten Tales 2",,playable,2021-06-09 14:42:53
+01002A2004530000,"The Bridge",,playable,2020-06-03 13:53:26
+01008D700AB14000,"The Bug Butcher",,playable,2020-06-03 12:02:04
+01001B40086E2000,"The Bunker",nvdec,playable,2022-09-16 14:24:05
+010069100B7F0000,"The Caligula Effect: Overdose",UE4;gpu,ingame,2021-01-04 11:07:50
+010066800E9F8000,"The Childs Sight",,playable,2021-06-11 19:04:56
+0100B7C01169C000,"The Coma 2: Vicious Sisters",gpu,ingame,2020-06-20 12:51:51
+010033100691A000,"The Coma: Recut",,playable,2020-06-03 15:11:23
+01004170113D4000,"The Complex",nvdec,playable,2022-09-28 14:35:41
+01000F20102AC000,"The Copper Canyon Dixie Dash",UE4,playable,2022-09-29 11:42:29
+01000850037C0000,"The Count Lucanor",nvdec,playable,2022-08-22 15:26:37
+0100EBA01548E000,"The Cruel King and the Great Hero",gpu;services,ingame,2022-12-02 07:02:08
+010051800E922000,"The Dark Crystal: Age of Resistance Tactics",,playable,2020-08-11 13:43:41
+01003DE00918E000,"The Darkside Detective",,playable,2020-06-03 22:16:18
+01000A10041EA000,"The Elder Scrolls V: Skyrim",gpu;crash,ingame,2024-07-14 03:21:31
+01004A9006B84000,"The End Is Nigh",,playable,2020-06-01 11:26:45
+0100CA100489C000,"The Escapists 2",nvdec,playable,2020-09-24 12:31:31
+01001B700BA7C000,"The Escapists: Complete Edition",,playable,2021-02-24 17:50:31
+0100C2E0129A6000,"The Executioner",nvdec,playable,2021-01-23 00:31:28
+01006050114D4000,"The Experiment: Escape Room",gpu,ingame,2022-09-30 13:20:35
+0100B5900DFB2000,"The Eyes of Ara",,playable,2022-09-16 14:44:06
+01002DD00AF9E000,"The Fall",gpu,ingame,2020-05-31 23:31:16
+01003E5002320000,"The Fall Part 2: Unbound",,playable,2021-11-06 02:18:08
+0100CDC00789E000,"The Final Station",nvdec,playable,2022-08-22 15:54:39
+010098800A1E4000,"The First Tree",,playable,2021-02-24 15:51:05
+0100C38004DCC000,"The Flame In The Flood: Complete Edition",gpu;nvdec;UE4,ingame,2022-08-22 16:23:49
+010007700D4AC000,"The Forbidden Arts",,playable,2021-01-26 16:26:24
+010030700CBBC000,"The friends of Ringo Ishikawa",,playable,2022-08-22 16:33:17
+01006350148DA000,"The Gardener and the Wild Vines",gpu,ingame,2024-04-29 16:32:10
+0100B13007A6A000,"The Gardens Between",,playable,2021-01-29 16:16:53
+010036E00FB20000,"The Great Ace Attorney Chronicles",,playable,2023-06-22 21:26:29
+010007B012514000,"The Great Perhaps",,playable,2020-09-02 15:57:04
+01003B300E4AA000,"THE GRISAIA TRILOGY",,playable,2021-01-31 15:53:59
+01001950137D8000,"The Hong Kong Massacre",crash,ingame,2021-01-21 12:06:56
+01004AD00E094000,"The House of Da Vinci",,playable,2021-01-05 14:17:19
+01005A80113D2000,"The House of Da Vinci 2",,playable,2020-10-23 20:47:17
+010088401495E000,"The House of the Dead: Remake",,playable,2025-01-11 00:36:01
+0100E24004510000,"The Hunt - Championship Edition",32-bit,menus,2022-07-21 20:21:25
+01008940086E0000,"The Infectious Madness of Doctor Dekker",nvdec,playable,2022-08-22 16:45:01
+0100B0B00B318000,"The Inner World",nvdec,playable,2020-06-03 21:22:29
+0100A9D00B31A000,"The Inner World - The Last Wind Monk",nvdec,playable,2020-11-16 13:09:40
+0100AE5003EE6000,"The Jackbox Party Pack",online-working,playable,2023-05-28 09:28:40
+010015D003EE4000,"The Jackbox Party Pack 2",online-working,playable,2022-08-22 18:23:40
+0100CC80013D6000,"The Jackbox Party Pack 3",slow;online-working,playable,2022-08-22 18:41:06
+0100E1F003EE8000,"The Jackbox Party Pack 4",online-working,playable,2022-08-22 18:56:34
+010052C00B184000,"The Journey Down: Chapter One",nvdec,playable,2021-02-24 13:32:41
+01006BC00B188000,"The Journey Down: Chapter Three",nvdec,playable,2021-02-24 13:45:27
+01009AB00B186000,"The Journey Down: Chapter Two",nvdec,playable,2021-02-24 13:32:13
+010020500BD98000,"The King's Bird",,playable,2022-08-22 19:07:46
+010031B00DB34000,"the Knight & the Dragon",gpu,ingame,2023-08-14 10:31:43
+01007AF012E16000,"The Language Of Love",Needs Update;crash,nothing,2020-12-03 17:54:00
+010079C017F5E000,"The Lara Croft Collection",services-horizon;deadlock,nothing,2024-07-12 22:45:51
+0100449011506000,"The Last Campfire",,playable,2022-10-20 16:44:19
+0100AAD011592000,"The Last Dead End",gpu;UE4,ingame,2022-10-20 16:59:44
+0100AC800D022000,"THE LAST REMNANT Remastered",nvdec;UE4,playable,2023-02-09 17:24:44
+0100B1900F0B6000,"The Legend of Dark Witch",,playable,2020-07-12 15:18:33
+01001920156C2000,"The Legend of Heroes: Trails from Zero",gpu;mac-bug,ingame,2024-09-14 21:41:41
+01005420101DA000,"The Legend of Heroes: Trails of Cold Steel III",,playable,2020-12-16 10:59:18
+01009B101044C000,"The Legend of Heroes: Trails of Cold Steel III Demo",demo;nvdec,playable,2021-04-23 01:07:32
+0100D3C010DE8000,"The Legend of Heroes: Trails of Cold Steel IV",nvdec,playable,2021-04-23 14:01:05
+01005E5013862000,"THE LEGEND OF HEROES: ZERO NO KISEKI KAI [英雄傳說 零之軌跡:改]",crash,nothing,2021-09-30 14:41:07
+01008CF01BAAC000,"The Legend of Zelda Echoes of Wisdom",nvdec;ASTC;intel-vendor-bug,playable,2024-10-01 14:11:01
+0100509005AF2000,"The Legend of Zelda: Breath of the Wild Demo",demo,ingame,2022-12-24 05:02:58
+01007EF00011E000,"The Legend of Zelda™: Breath of the Wild",gpu;amd-vendor-bug;mac-bug,ingame,2024-09-23 19:35:46
+01006BB00C6F0000,"The Legend of Zelda™: Link’s Awakening",gpu;nvdec;mac-bug,ingame,2023-08-09 17:37:40
+01002DA013484000,"The Legend of Zelda™: Skyward Sword HD",gpu,ingame,2024-06-14 16:48:29
+0100F2C0115B6000,"The Legend of Zelda™: Tears of the Kingdom",gpu;amd-vendor-bug;intel-vendor-bug;mac-bug,ingame,2024-08-24 12:38:30
+0100A4400BE74000,"The LEGO Movie 2 Videogame",,playable,2023-03-01 11:23:37
+010064B00B95C000,"The Liar Princess and the Blind Prince",audio;slow,playable,2020-06-08 21:23:28
+0100735004898000,"The Lion's Song",,playable,2021-06-09 15:07:16
+0100A5000D590000,"The Little Acre",nvdec,playable,2021-03-02 20:22:27
+01007A700A87C000,"The Long Dark",,playable,2021-02-21 14:19:52
+010052B003A38000,"The Long Reach",nvdec,playable,2021-02-24 14:09:48
+01003C3013300000,"The Long Return",slow,playable,2020-12-10 21:05:10
+0100CE1004E72000,"The Longest Five Minutes",gpu,boots,2023-02-19 18:33:11
+0100F3D0122C2000,"The Longing",gpu,ingame,2022-11-12 15:00:58
+010085A00C5E8000,"The Lord of the Rings: Adventure Card Game - Definitive Edition",online-broken,menus,2022-09-16 15:19:32
+01008A000A404000,"The Lost Child",nvdec,playable,2021-02-23 15:44:20
+0100BAB00A116000,"The Low Road",,playable,2021-02-26 13:23:22
+,"The Mahjong",Needs Update;crash;services,nothing,2021-04-01 22:06:22
+0100DC300AC78000,"The Messenger",,playable,2020-03-22 13:51:37
+0100DEC00B2BC000,"The Midnight Sanctuary",nvdec;UE4;vulkan-backend-bug,playable,2022-10-03 17:17:32
+0100F1B00B456000,"The MISSING: J.J. Macfield and the Island of Memories",,playable,2022-08-22 19:36:18
+010033300AC1A000,"The Mooseman",,playable,2021-02-24 12:58:57
+01005E9016BDE000,"The movie The Quintessential Bride -Five Memories Spent with You-",,playable,2023-12-14 14:43:43
+0100496004194000,"The Mummy Demastered",,playable,2021-02-23 13:11:27
+01004C500AAF6000,"The Mystery of the Hudson Case",,playable,2020-06-01 11:03:36
+01000CF0084BC000,"The Next Penelope",,playable,2021-01-29 16:26:11
+01001FB00E386000,"THE NINJA SAVIORS Return of the Warriors",online,playable,2021-03-25 23:48:07
+0100B080184BC000,"The Oregon Trail",gpu,ingame,2022-11-25 16:11:49
+0100B0101265C000,"The Otterman Empire",UE4;gpu,ingame,2021-06-17 12:27:15
+01000BC01801A000,"The Outbound Ghost",,nothing,2024-03-02 17:10:58
+0100626011656000,"The Outer Worlds",gpu;nvdec;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-10-03 17:55:32
+01005C500D690000,"The Park",UE4;crash;gpu,ingame,2020-12-18 12:50:07
+010050101127C000,"The Persistence",nvdec,playable,2021-06-06 19:15:40
+0100CD300880E000,"The Pinball Arcade",online-broken,playable,2022-08-22 19:49:46
+01006BD018B54000,"The Plucky Squire",crash,ingame,2024-09-27 22:32:33
+0100E6A00B960000,"The Princess Guide",,playable,2021-02-24 14:23:34
+010058A00BF1C000,"The Raven Remastered",nvdec,playable,2022-08-22 20:02:47
+0100EB100D17C000,"The Red Strings Club",,playable,2020-06-01 10:51:18
+010079400BEE0000,"The Room",,playable,2021-04-14 18:57:05
+010033100EE12000,"The Ryuo's Work is Never Done!",,playable,2022-03-29 00:35:37
+01002BA00C7CE000,"The Savior's Gang",gpu;nvdec;UE4,ingame,2022-09-21 12:37:48
+0100F3200E7CA000,"The Settlers®: New Allies",deadlock,nothing,2023-10-25 00:18:05
+0100F89003BC8000,"The Sexy Brutale",,playable,2021-01-06 17:48:28
+01001FF00BEE8000,"The Shapeshifting Detective",nvdec,playable,2021-01-10 13:10:49
+010028D00BA1A000,"The Sinking City",nvdec;UE4,playable,2022-09-12 16:41:55
+010041C00A68C000,"The Spectrum Retreat",,playable,2022-10-03 18:52:40
+010029300E5C4000,"The Stanley Parable: Ultra Deluxe",gpu,ingame,2024-07-12 23:18:26
+010007F00AF56000,"The Station",,playable,2022-09-28 18:15:27
+0100858010DC4000,"the StoryTale",,playable,2022-09-03 13:00:25
+0100AA400A238000,"The Stretchers™",nvdec;UE4,playable,2022-09-16 15:40:58
+0100E3100450E000,"The Strike - Championship Edition",gpu;32-bit,boots,2022-12-09 15:58:16
+0100EF200DA60000,"The Survivalists",,playable,2020-10-27 15:51:13
+010040D00B7CE000,"The Swindle",nvdec,playable,2022-08-22 20:53:52
+010037D00D568000,"The Swords of Ditto: Mormo's Curse",slow,ingame,2020-12-06 00:13:12
+01009B300D76A000,"The Tiny Bang Story",,playable,2021-03-05 15:39:05
+0100C3300D8C4000,"The Touryst",crash,ingame,2023-08-22 01:32:38
+010047300EBA6000,"The Tower of Beatrice",,playable,2022-09-12 16:51:42
+010058000A576000,"The Town of Light: Deluxe Edition",gpu,playable,2022-09-21 12:51:34
+0100B0E0086F6000,"The Trail: Frontier Challenge",slow,playable,2022-08-23 15:10:51
+0100EA100F516000,"The Turing Test",nvdec,playable,2022-09-21 13:24:07
+010064E00ECBC000,"The Unicorn Princess",,playable,2022-09-16 16:20:56
+0100BCF00E970000,"The Vanishing of Ethan Carter",UE4,playable,2021-06-09 17:14:47
+0100D0500B0A6000,"The VideoKid",nvdec,playable,2021-01-06 09:28:24
+,"The Voice",services,menus,2020-07-28 20:48:49
+010056E00B4F4000,"The Walking Dead: A New Frontier",,playable,2022-09-21 13:40:48
+010099100B6AC000,"The Walking Dead: Season Two",,playable,2020-08-09 12:57:06
+010029200B6AA000,"The Walking Dead: The Complete First Season",,playable,2021-06-04 13:10:56
+010060F00AA70000,"The Walking Dead: The Final Season - Season Pass",online-broken,playable,2022-08-23 17:22:32
+010095F010568000,"The Wanderer: Frankenstein's Creature",,playable,2020-07-11 12:49:51
+01008B200FC6C000,"The Wardrobe: Even Better Edition",,playable,2022-09-16 19:14:55
+01003D100E9C6000,"The Witcher 3: Wild Hunt",nvdec;vulkan-backend-bug;amd-vendor-bug,playable,2024-02-22 12:21:51
+0100B1300FF08000,"The Wonderful 101: Remastered",slow;nvdec,playable,2022-09-30 13:49:28
+0100C1500B82E000,"The World Ends with You®: Final Remix",ldn-untested,playable,2022-07-09 01:11:21
+0100E6200D56E000,"The World Next Door",,playable,2022-09-21 14:15:23
+010075900CD1C000,"Thea: The Awakening",,playable,2021-01-18 15:08:47
+010081B01777C000,"THEATRHYTHM FINAL BAR LINE",Incomplete,ingame,2024-08-05 14:24:55
+01001C2010D08000,"They Bleed Pixels",gpu,ingame,2024-08-09 05:52:18
+0100768010970000,"They Came From the Sky",,playable,2020-06-12 16:38:19
+0100CE700F62A000,"Thief of Thieves: Season One",crash;loader-allocator,nothing,2021-11-03 07:16:30
+0100CE400E34E000,"Thief Simulator",,playable,2023-04-22 04:39:11
+01009BD003B36000,"Thimbleweed Park",,playable,2022-08-24 11:15:31
+0100F2300A5DA000,"Think of the Children",deadlock,menus,2021-11-23 09:04:45
+0100066004D68000,"This Is the Police",,playable,2022-08-24 11:37:05
+01004C100A04C000,"This is the Police 2",,playable,2022-08-24 11:49:17
+0100C7C00F77C000,"This Strange Realm Of Mine",,playable,2020-08-28 12:07:24
+0100A8700BC2A000,"This War of Mine: Complete Edition",gpu;32-bit;nvdec,ingame,2022-08-24 12:00:44
+0100AC500EEE8000,"THOTH",,playable,2020-08-05 18:35:28
+0100E910103B4000,"Thronebreaker: The Witcher Tales",nvdec,playable,2021-06-03 16:40:15
+01006F6002840000,"Thumper",gpu,ingame,2024-08-12 02:41:07
+01000AC011588000,"Thy Sword",crash,ingame,2022-09-30 16:43:14
+0100E9000C42C000,"Tick Tock: A Tale for Two",,menus,2020-07-14 14:49:38
+0100B6D00C2DE000,"Tied Together",nvdec,playable,2021-04-10 14:03:46
+010074500699A000,"Timber Tennis: Versus",online,playable,2020-10-03 17:07:15
+01004C500B698000,"Time Carnage",,playable,2021-06-16 17:57:28
+0100F770045CA000,"Time Recoil",,playable,2022-08-24 12:44:03
+0100DD300CF3A000,"Timespinner",gpu,ingame,2022-08-09 09:39:11
+0100393013A10000,"Timothy and the Mysterious Forest",gpu;slow,ingame,2021-06-02 00:42:11
+0100F7C010AF6000,"Tin & Kuna",,playable,2020-11-17 12:16:12
+0100DF900FC52000,"Tiny Gladiators",,playable,2020-12-14 00:09:43
+010061A00AE64000,"Tiny Hands Adventure",,playable,2022-08-24 16:07:48
+010074800741A000,"TINY METAL",UE4;gpu;nvdec,ingame,2021-03-05 17:11:57
+01005D0011A40000,"Tiny Racer",,playable,2022-10-07 11:13:03
+010002401AE94000,"Tiny Thor",gpu,ingame,2024-07-26 08:37:35
+0100A73016576000,"Tinykin",gpu,ingame,2023-06-18 12:12:24
+0100FE801185E000,"Titan Glory",,boots,2022-10-07 11:36:40
+0100605008268000,"Titan Quest",nvdec;online-broken,playable,2022-08-19 21:54:15
+01009C400E93E000,"Titans Pinball",slow,playable,2020-06-09 16:53:52
+010019500DB1E000,"Tlicolity Eyes - twinkle showtime -",gpu,boots,2021-05-29 19:43:44
+010036700F83E000,"To the Moon",,playable,2021-03-20 15:33:38
+010014900865A000,"Toast Time: Smash Up!",crash;services,menus,2020-04-03 12:26:59
+0100A4A00B2E8000,"Toby: The Secret Mine",nvdec,playable,2021-01-06 09:22:33
+0100B5200BB7C000,"ToeJam & Earl: Back in the Groove!",,playable,2021-01-06 22:56:58
+0100B5E011920000,"TOHU",slow,playable,2021-02-08 15:40:44
+0100F3400A432000,"Toki",nvdec,playable,2021-01-06 19:59:23
+01003E500F962000,"Tokyo Dark – Remembrance –",nvdec,playable,2021-06-10 20:09:49
+0100A9400C9C2000,"Tokyo Mirage Sessions™ #FE Encore",32-bit;nvdec,playable,2022-07-07 09:41:07
+0100E2E00CB14000,"Tokyo School Life",,playable,2022-09-16 20:25:54
+010024601BB16000,"Tomb Raider I-III Remastered Starring Lara Croft",gpu;opengl,ingame,2024-09-27 12:32:04
+0100D7F01E49C000,"Tomba! Special Edition",services-horizon,nothing,2024-09-15 21:59:54
+0100D400100F8000,"Tonight We Riot",,playable,2021-02-26 15:55:09
+0100CC00102B4000,"Tony Hawk's™ Pro Skater™ 1 + 2",gpu;Needs Update,ingame,2024-09-24 08:18:14
+010093F00E818000,"Tools Up!",crash,ingame,2020-07-21 12:58:17
+01009EA00E2B8000,"Toon War",,playable,2021-06-11 16:41:53
+010090400D366000,"Torchlight II",,playable,2020-07-27 14:18:37
+010075400DDB8000,"Torchlight III",nvdec;online-broken;UE4,playable,2022-10-14 22:20:17
+01007AF011732000,"TORICKY-S",deadlock,menus,2021-11-25 08:53:36
+0100BEB010F2A000,"Torn Tales: Rebound Edition",,playable,2020-11-01 14:11:59
+0100A64010D48000,"Total Arcade Racing",,playable,2022-11-12 15:12:48
+0100512010728000,"Totally Reliable Delivery Service",online-broken,playable,2024-09-27 19:32:22
+01004E900B082000,"Touhou Genso Wanderer Reloaded",gpu;nvdec,ingame,2022-08-25 11:57:36
+010010F004022000,"Touhou Kobuto V: Burst Battle",,playable,2021-01-11 15:28:58
+0100E9D00D6C2000,"TOUHOU Spell Bubble",,playable,2020-10-18 11:43:43
+0100F7B00595C000,"Tower Of Babel",,playable,2021-01-06 17:05:15
+010094600DC86000,"Tower Of Time",gpu;nvdec,ingame,2020-07-03 11:11:12
+0100A1C00359C000,"TowerFall",,playable,2020-05-16 18:58:07
+0100F6200F77E000,"Towertale",,playable,2020-10-15 13:56:58
+010049E00BA34000,"Townsmen - A Kingdom Rebuilt",nvdec,playable,2022-10-14 22:48:59
+01009FF00A160000,"Toy Stunt Bike: Tiptop's Trials",UE4,playable,2021-04-10 13:56:34
+0100192010F5A000,"Tracks - Toybox Edition",UE4;crash,nothing,2021-02-08 15:19:18
+0100BCA00843A000,"Trailblazers",,playable,2021-03-02 20:40:49
+010009F004E66000,"Transcripted",,playable,2022-08-25 12:13:11
+01005E500E528000,"TRANSFORMERS: BATTLEGROUNDS",online,playable,2021-06-17 18:08:19
+0100BE500BEA2000,"Transistor",,playable,2020-10-22 11:28:02
+0100A8D010BFA000,"Travel Mosaics 2: Roman Holiday",,playable,2021-05-26 12:33:16
+0100102010BFC000,"Travel Mosaics 3: Tokyo Animated",,playable,2021-05-26 12:06:27
+010096D010BFE000,"Travel Mosaics 4: Adventures In Rio",,playable,2021-05-26 11:54:58
+01004C4010C00000,"Travel Mosaics 5: Waltzing Vienna",,playable,2021-05-26 11:49:35
+0100D520119D6000,"Travel Mosaics 6: Christmas Around the World",,playable,2021-05-26 00:52:47
+01000BD0119DE000,"Travel Mosaics 7: Fantastic Berlin",,playable,2021-05-22 18:37:34
+01007DB00A226000,"Travel Mosaics: A Paris Tour",,playable,2021-05-26 12:42:26
+010011600C946000,"Travis Strikes Again: No More Heroes",nvdec;UE4,playable,2022-08-25 12:36:38
+01006EB004B0E000,"Treadnauts",,playable,2021-01-10 14:57:41
+0100D7800E9E0000,"Trials of Mana",UE4,playable,2022-09-30 21:50:37
+0100E1D00FBDE000,"Trials of Mana Demo",nvdec;UE4;demo;vulkan-backend-bug,playable,2022-09-26 18:00:02
+01003E800A102000,"Trials Rising Standard Edition",,playable,2024-02-11 01:36:39
+0100CC80140F8000,"TRIANGLE STRATEGY™",gpu;Needs Update;UE4;vulkan-backend-bug,ingame,2024-09-25 20:48:37
+010064E00A932000,"Trine 2: Complete Story",nvdec,playable,2021-06-03 11:45:20
+0100DEC00A934000,"Trine 3: The Artifacts of Power",ldn-untested;online,playable,2021-06-03 12:01:24
+010055E00CA68000,"Trine 4: The Nightmare Prince",gpu,nothing,2025-01-07 05:47:46
+0100D9000A930000,"Trine Enchanted Edition",ldn-untested;nvdec,playable,2021-06-03 11:28:15
+01002D7010A54000,"Trinity Trigger",crash,ingame,2023-03-03 03:09:09
+0100868013FFC000,"TRIVIAL PURSUIT Live! 2",,boots,2022-12-19 00:04:33
+0100F78002040000,"Troll and I™",gpu;nvdec,ingame,2021-06-04 16:58:50
+0100145011008000,"Trollhunters: Defenders of Arcadia",gpu;nvdec,ingame,2020-11-30 13:27:09
+0100FBE0113CC000,"Tropico 6 - Nintendo Switch™ Edition",nvdec;UE4,playable,2022-10-14 23:21:03
+0100D06018DCA000,"Trouble Witches Final! Episode 01: Daughters of Amalgam",,playable,2024-04-08 15:08:11
+0100B5B0113CE000,"Troubleshooter",UE4;crash,nothing,2020-10-04 13:46:50
+010089600FB72000,"Trover Saves The Universe",UE4;crash,nothing,2020-10-03 10:25:27
+0100E6300D448000,"Trüberbrook",,playable,2021-06-04 17:08:00
+0100F2100AA5C000,"Truck and Logistics Simulator",,playable,2021-06-11 13:29:08
+0100CB50107BA000,"Truck Driver",online-broken,playable,2022-10-20 17:42:33
+0100E75004766000,"True Fear: Forsaken Souls - Part 1",nvdec,playable,2020-12-15 21:39:52
+010099900CAB2000,"TT Isle of Man",nvdec,playable,2020-06-22 12:25:13
+010000400F582000,"TT Isle of Man Ride on the Edge 2",gpu;nvdec;online-broken,ingame,2022-09-30 22:13:05
+0100752011628000,"TTV2",,playable,2020-11-27 13:21:36
+0100AFE00452E000,"Tumblestone",,playable,2021-01-07 17:49:20
+010085500D5F6000,"Turok",gpu,ingame,2021-06-04 13:16:24
+0100CDC00D8D6000,"Turok 2: Seeds of Evil",gpu;vulkan,ingame,2022-09-12 17:50:05
+010004B0130C8000,"Turrican Flashback",audout,playable,2021-08-30 10:07:56
+0100B1F0090F2000,"TurtlePop: Journey to Freedom",,playable,2020-06-12 17:45:39
+0100047009742000,"Twin Robots: Ultimate Edition",nvdec,playable,2022-08-25 14:24:03
+010031200E044000,"Two Point Hospital™",crash;nvdec,ingame,2022-09-22 11:22:23
+010038400C2FE000,"TY the Tasmanian Tiger™ HD",32-bit;crash;nvdec,menus,2020-12-17 21:15:00
+010073A00C4B2000,"Tyd wag vir Niemand",,playable,2021-03-02 13:39:53
+0100D5B00D6DA000,"Type:Rider",,playable,2021-01-06 13:12:55
+010040D01222C000,"UBERMOSH: SANTICIDE",,playable,2020-11-27 15:05:01
+0100992010BF8000,"Ubongo",,playable,2021-02-04 21:15:01
+010079000B56C000,"UglyDolls: An Imperfect Adventure",nvdec;UE4,playable,2022-08-25 14:42:16
+010048901295C000,"Ultimate Fishing Simulator",,playable,2021-06-16 18:38:23
+01009D000FAE0000,"Ultimate Racing 2D",,playable,2020-08-05 17:27:09
+010045200A1C2000,"Ultimate Runner",,playable,2022-08-29 12:52:40
+01006B601117E000,"Ultimate Ski Jumping 2020",online,playable,2021-03-02 20:54:11
+01002D4012222000,"Ultra Hat Dimension",services;audio,menus,2021-11-18 09:05:20
+01009C000415A000,"Ultra Hyperball",,playable,2021-01-06 10:09:55
+01007330027EE000,"Ultra Street Fighter® II: The Final Challengers",ldn-untested,playable,2021-11-25 07:54:58
+01006A300BA2C000,"Umineko no Naku Koro ni Saku - うみねこのなく頃に咲 ~猫箱と夢想の交響曲~",audout,playable,2023-05-04 17:25:23
+0100592005164000,"UNBOX: Newbie's Adventure",UE4,playable,2022-08-29 13:12:56
+01002D900C5E4000,"Uncanny Valley",nvdec,playable,2021-06-04 13:28:45
+010076F011F54000,"Undead & Beyond",nvdec,playable,2022-10-04 09:11:18
+01008F3013E4E000,"Under Leaves",,playable,2021-05-22 18:13:58
+010080B00AD66000,"Undertale",,playable,2022-08-31 17:31:46
+01008F80049C6000,"Unepic",,playable,2024-01-15 17:03:00
+01007820096FC000,"UnExplored",,playable,2021-01-06 10:02:16
+01007D1013512000,"Unhatched",,playable,2020-12-11 12:11:09
+010069401ADB8000,"Unicorn Overlord",,playable,2024-09-27 14:04:32
+0100B1400D92A000,"Unit 4",,playable,2020-12-16 18:54:13
+010045200D3A4000,"Unknown Fate",slow,ingame,2020-10-15 12:27:42
+0100AB2010B4C000,"Unlock The King",,playable,2020-09-01 13:58:27
+0100A3E011CB0000,"Unlock the King 2",,playable,2021-06-15 20:43:55
+01005AA00372A000,"UNO® for Nintendo Switch",nvdec;ldn-untested,playable,2022-07-28 14:49:47
+0100E5D00CC0C000,"Unravel Two",nvdec,playable,2024-05-23 15:45:05
+010001300CC4A000,"Unruly Heroes",,playable,2021-01-07 18:09:31
+0100B410138C0000,"Unspottable",,playable,2022-10-25 19:28:49
+010082400BCC6000,"Untitled Goose Game",,playable,2020-09-26 13:18:06
+0100E49013190000,"Unto The End",gpu,ingame,2022-10-21 11:13:29
+0100B110109F8000,"Urban Flow",services,playable,2020-07-05 12:51:47
+010054F014016000,"Urban Street Fighting",,playable,2021-02-20 19:16:36
+01001B10068EC000,"Urban Trial Playground",UE4;nvdec;online,playable,2021-03-25 20:56:51
+0100A2500EB92000,"Urban Trial Tricky",nvdec;UE4,playable,2022-12-06 13:07:56
+01007C0003AEC000,"Use Your Words",nvdec;online-broken,menus,2022-08-29 17:22:10
+0100D4300EBF8000,"Uta no Prince-sama Amazing Aria & Sweet Serenade LOVE",crash;Needs More Attention;Needs Update,nothing,2022-02-09 08:57:44
+010024200E00A000,"Uta no☆Prince-sama♪ Repeat Love",nvdec,playable,2022-12-09 09:21:51
+010029B00CC3E000,"UTOPIA 9 - A Volatile Vacation",nvdec,playable,2020-12-16 17:06:42
+010064400B138000,"V-Rally 4",gpu;nvdec,ingame,2021-06-07 19:37:31
+0100A6700D66E000,"VA-11 HALL-A",,playable,2021-02-26 15:05:34
+01009E2003FE2000,"Vaccine",nvdec,playable,2021-01-06 01:02:07
+010089700F30C000,"Valfaris",,playable,2022-09-16 21:37:24
+0100CAF00B744000,"Valkyria Chronicles",32-bit;crash;nvdec,ingame,2022-11-23 20:03:32
+01005C600AC68000,"Valkyria Chronicles 4",audout;nvdec,playable,2021-06-03 18:12:25
+0100FBD00B91E000,"Valkyria Chronicles 4 Demo",slow;demo,ingame,2022-08-29 20:39:07
+0100E0E00B108000,"Valley",nvdec,playable,2022-09-28 19:27:58
+010089A0197E4000,"Vampire Survivors",,ingame,2024-06-17 09:57:38
+010020C00FFB6000,"Vampire: The Masquerade - Coteries of New York",,playable,2020-10-04 14:55:22
+01000BD00CE64000,"VAMPYR",nvdec;UE4,playable,2022-09-16 22:15:51
+01007C500D650000,"Vandals",,playable,2021-01-27 21:45:46
+010030F00CA1E000,"Vaporum",nvdec,playable,2021-05-28 14:25:33
+010045C0109F2000,"VARIABLE BARRICADE NS",nvdec,playable,2022-02-26 15:50:13
+0100FE200AF48000,"VASARA Collection",nvdec,playable,2021-02-28 15:26:10
+0100AD300E4FA000,"Vasilis",,playable,2020-09-01 15:05:35
+01009CD003A0A000,"Vegas Party",,playable,2021-04-14 19:21:41
+010098400E39E000,"Vektor Wars",online-broken;vulkan-backend-bug,playable,2022-10-04 09:23:46
+01003A8018E60000,"Vengeful Guardian: Moonrider",deadlock,boots,2024-03-17 23:35:37
+010095B00DBC8000,"Venture Kid",crash;gpu,ingame,2021-04-18 16:33:17
+0100C850134A0000,"Vera Blanc: Full Moon",audio,playable,2020-12-17 12:09:30
+0100379013A62000,"Very Very Valet",nvdec,playable,2022-11-12 15:25:51
+01006C8014DDA000,"Very Very Valet Demo",crash;Needs Update;demo,boots,2022-11-12 15:26:13
+010057B00712C000,"Vesta",nvdec,playable,2022-08-29 21:03:39
+0100E81007A06000,"Victor Vran Overkill Edition",gpu;deadlock;nvdec;opengl,ingame,2022-08-30 11:46:56
+01005880063AA000,"Violett",nvdec,playable,2021-01-28 13:09:36
+010037900CB1C000,"Viviette",,playable,2021-06-11 15:33:40
+0100D010113A8000,"Void Bastards",,playable,2022-10-15 00:04:19
+0100FF7010E7E000,"void tRrLM(); //Void Terrarium",gpu;Needs Update;regression,ingame,2023-02-10 01:13:25
+010078D0175EE000,"void* tRrLM2(); //Void Terrarium 2",,playable,2023-12-21 11:00:41
+0100B1A0066DC000,"Volgarr the Viking",,playable,2020-12-18 15:25:50
+0100A7900E79C000,"Volta-X",online-broken,playable,2022-10-07 12:20:51
+01004D8007368000,"Vostok Inc.",,playable,2021-01-27 17:43:59
+0100B1E0100A4000,"Voxel Galaxy",,playable,2022-09-28 22:45:02
+0100AFA011068000,"Voxel Pirates",,playable,2022-09-28 22:55:02
+0100BFB00D1F4000,"Voxel Sword",,playable,2022-08-30 14:57:27
+01004E90028A2000,"Vroom in the night sky",Needs Update;vulkan-backend-bug,playable,2023-02-20 02:32:29
+0100C7C00AE6C000,"VSR: Void Space Racing",,playable,2021-01-27 14:08:59
+0100B130119D0000,"Waifu Uncovered",crash,ingame,2023-02-27 01:17:46
+0100E29010A4A000,"Wanba Warriors",,playable,2020-10-04 17:56:22
+010078800825E000,"Wanderjahr TryAgainOrWalkAway",,playable,2020-12-16 09:46:04
+0100B27010436000,"Wanderlust Travel Stories",,playable,2021-04-07 16:09:12
+0100F8A00853C000,"Wandersong",nvdec,playable,2021-06-04 15:33:34
+0100D67013910000,"Wanna Survive",,playable,2022-11-12 21:15:43
+010056901285A000,"War Dogs: Red's Return",,playable,2022-11-13 15:29:01
+01004FA01391A000,"War Of Stealth - assassin",,playable,2021-05-22 17:34:38
+010035A00D4E6000,"War Party",nvdec,playable,2021-01-27 18:26:32
+010049500DE56000,"War Tech Fighters",nvdec,playable,2022-09-16 22:29:31
+010084D00A134000,"War Theatre",gpu,ingame,2021-06-07 19:42:45
+0100B6B013B8A000,"War Truck Simulator",,playable,2021-01-31 11:22:54
+0100563011B4A000,"War-Torn Dreams",crash,nothing,2020-10-21 11:36:16
+010054900F51A000,"WARBORN",,playable,2020-06-25 12:36:47
+01000F0002BB6000,"Wargroove",online-broken,playable,2022-08-31 10:30:45
+0100C6000EEA8000,"Warhammer 40,000: Mechanicus",nvdec,playable,2021-06-13 10:46:38
+0100E5600D7B2000,"WARHAMMER 40,000: SPACE WOLF",online-broken,playable,2022-09-20 21:11:20
+010031201307A000,"Warhammer Age of Sigmar: Storm Ground",nvdec;online-broken;UE4,playable,2022-11-13 15:46:14
+01002FF00F460000,"Warhammer Quest 2: The End Times",,playable,2020-08-04 15:28:03
+0100563010E0C000,"WarioWare™: Get It Together!",gpu;opengl-backend-bug,ingame,2024-04-23 01:04:56
+010045B018EC2000,"WarioWare™: Move It!",,playable,2023-11-14 00:23:51
+0100E0400E320000,"Warlocks 2: God Slayers",,playable,2020-12-16 17:36:50
+0100DB300A026000,"Warp Shift",nvdec,playable,2020-12-15 14:48:48
+010032700EAC4000,"WarriOrb",UE4,playable,2021-06-17 15:45:14
+0100E8500AD58000,"WARRIORS OROCHI 4 ULTIMATE",nvdec;online-broken,playable,2024-08-07 01:50:37
+0100CD900FB24000,"WARTILE",UE4;crash;gpu,menus,2020-12-11 21:56:10
+010039A00BC64000,"Wasteland 2: Director's Cut",nvdec,playable,2021-01-27 13:34:11
+0100B79011F06000,"Water Balloon Mania",,playable,2020-10-23 20:20:59
+0100BA200C378000,"Way of the Passive Fist",gpu,ingame,2021-02-26 21:07:06
+0100560010E3E000,"We should talk.",crash,nothing,2020-08-03 12:32:36
+010096000EEBA000,"Welcome to Hanwell",UE4;crash,boots,2020-08-03 11:54:57
+0100D7F010B94000,"Welcome to Primrose Lake",,playable,2022-10-21 11:30:57
+010035600EC94000,"Wenjia",,playable,2020-06-08 11:38:30
+010031B00A4E8000,"West of Loathing",,playable,2021-01-28 12:35:19
+010038900DFE0000,"What Remains of Edith Finch",slow;UE4,playable,2022-08-31 19:57:59
+010033600ADE6000,"Wheel of Fortune®",crash;Needs More Attention;nvdec,boots,2023-11-12 20:29:24
+0100DFC00405E000,"Wheels of Aurelia",,playable,2021-01-27 21:59:25
+010027D011C9C000,"Where Angels Cry",gpu;nvdec,ingame,2022-09-30 22:24:47
+0100FDB0092B4000,"Where Are My Friends?",,playable,2022-09-21 14:39:26
+01000C000C966000,"Where the Bees Make Honey",,playable,2020-07-15 12:40:49
+010017500E7E0000,"Whipseey and the Lost Atlas",,playable,2020-06-23 20:24:14
+010015A00AF1E000,"Whispering Willows",nvdec,playable,2022-09-30 22:33:05
+010027F0128EA000,"Who Wants to Be a Millionaire?",crash,nothing,2020-12-11 20:22:42
+0100C7800CA06000,"Widget Satchel",,playable,2022-09-16 22:41:07
+0100CFC00A1D8000,"Wild Guns™ Reloaded",,playable,2021-01-28 12:29:05
+010071F00D65A000,"Wilmot's Warehouse",audio;gpu,ingame,2021-06-02 17:24:32
+010048800B638000,"Windjammers",online,playable,2020-10-13 11:24:25
+010059900BA3C000,"Windscape",,playable,2022-10-21 11:49:42
+0100D6800CEAC000,"Windstorm: An Unexpected Arrival",UE4,playable,2021-06-07 19:33:19
+01005A100B314000,"Windstorm: Start of a Great Friendship",UE4;gpu;nvdec,ingame,2020-12-22 13:17:48
+010035B012F28000,"Wing of Darkness",UE4,playable,2022-11-13 16:03:51
+0100A4A015FF0000,"Winter Games 2023",deadlock,menus,2023-11-07 20:47:36
+010012A017F18800,"Witch On The Holy Night",,playable,2023-03-06 23:28:11
+0100454012E32000,"Witch Spring 3 Re:Fine -The Story of the Marionette Witch Eirudy-",crash,ingame,2021-08-08 11:56:18
+01002FC00C6D0000,"Witch Thief",,playable,2021-01-27 18:16:07
+010061501904E000,"Witch's Garden",gpu;crash;vulkan-backend-bug;opengl-backend-bug,ingame,2023-01-11 02:11:24
+0100BD4011FFE000,"Witcheye",,playable,2020-12-14 22:56:08
+0100522007AAA000,"Wizard of Legend",,playable,2021-06-07 12:20:46
+010081900F9E2000,"Wizards of Brandel",,nothing,2020-10-14 15:52:33
+0100C7600E77E000,"Wizards: Wand of Epicosity",,playable,2022-10-07 12:32:06
+01009040091E0000,"Wolfenstein II®: The New Colossus™",gpu,ingame,2024-04-05 05:39:46
+01003BD00CAAE000,"Wolfenstein: Youngblood",online-broken,boots,2024-07-12 23:49:20
+010037A00F5E2000,"Wonder Blade",,playable,2020-12-11 17:55:31
+0100B49016FF0000,"Wonder Boy Anniversary Collection",deadlock,nothing,2023-04-20 16:01:48
+0100EB2012E36000,"Wonder Boy Asha in Monster World",crash,nothing,2021-11-03 08:45:06
+0100A6300150C000,"Wonder Boy: The Dragon's Trap",,playable,2021-06-25 04:53:21
+0100F5D00C812000,"Wondershot",,playable,2022-08-31 21:05:31
+0100E0300EB04000,"Woodle Tree 2: Deluxe",gpu;slow,ingame,2020-06-04 18:44:00
+0100288012966000,"Woodsalt",,playable,2021-04-06 17:01:48
+010083E011BC8000,"Wordify",,playable,2020-10-03 09:01:07
+01009D500A194000,"World Conqueror X",,playable,2020-12-22 16:10:29
+010072000BD32000,"WORLD OF FINAL FANTASY MAXIMA",,playable,2020-06-07 13:57:23
+010009E001D90000,"World of Goo",gpu;32-bit;crash;regression,boots,2024-04-12 05:52:14
+010061F01DB7C800,"World of Goo 2",,boots,2024-08-08 22:52:49
+01001E300B038000,"World Soccer Pinball",,playable,2021-01-06 00:37:02
+010048900CF64000,"Worldend Syndrome",,playable,2021-01-03 14:16:32
+01008E9007064000,"WorldNeverland - Elnea Kingdom",,playable,2021-01-28 17:44:23
+010000301025A000,"Worlds of Magic: Planar Conquest",,playable,2021-06-12 12:51:28
+01009CD012CC0000,"Worm Jazz",gpu;services;UE4;regression,ingame,2021-11-10 10:33:04
+01001AE005166000,"Worms W.M.D",gpu;crash;nvdec;ldn-untested,boots,2023-09-16 21:42:59
+010037500C4DE000,"Worse Than Death",,playable,2021-06-11 16:05:40
+01006F100EB16000,"Woven",nvdec,playable,2021-06-02 13:41:08
+010087800DCEA000,"WRC 8 FIA World Rally Championship",nvdec,playable,2022-09-16 23:03:36
+01001A0011798000,"WRC 9 The Official Game",gpu;slow;nvdec,ingame,2022-10-25 19:47:39
+0100DC0012E48000,"Wreckfest",,playable,2023-02-12 16:13:00
+0100C5D00EDB8000,"Wreckin' Ball Adventure",UE4,playable,2022-09-12 18:56:28
+010033700418A000,"Wulverblade",nvdec,playable,2021-01-27 22:29:05
+01001C400482C000,"Wunderling DX",audio;crash,ingame,2022-09-10 13:20:12
+01003B401148E000,"Wurroom",,playable,2020-10-07 22:46:21
+010081700EDF4000,"WWE 2K Battlegrounds",nvdec;online-broken;UE4,playable,2022-10-07 12:44:40
+010009800203E000,"WWE 2K18",nvdec;online-broken,ingame,2025-01-17 11:36:56
+0100DF100B97C000,"X-Morph: Defense",,playable,2020-06-22 11:05:31
+0100D0B00FB74000,"XCOM® 2 Collection",gpu;crash,ingame,2022-10-04 09:38:30
+0100CC9015360000,"XEL",gpu,ingame,2022-10-03 10:19:39
+0100C9F009F7A000,"Xenoblade Chronicles 2: Torna ~ The Golden Country",slow;nvdec,playable,2023-01-28 16:47:28
+0100E95004038000,"Xenoblade Chronicles™ 2",deadlock;amd-vendor-bug,ingame,2024-03-28 14:31:41
+010074F013262000,"Xenoblade Chronicles™ 3",gpu;crash;nvdec;vulkan-backend-bug;amd-vendor-bug,ingame,2024-08-06 19:56:44
+0100FF500E34A000,"Xenoblade Chronicles™ Definitive Edition",nvdec,playable,2024-05-04 20:12:41
+010028600BA16000,"Xenon Racer",nvdec;UE4,playable,2022-08-31 22:05:30
+010064200C324000,"Xenon Valkyrie+",,playable,2021-06-07 20:25:53
+0100928005BD2000,"Xenoraid",,playable,2022-09-03 13:01:10
+01005B5009364000,"Xeodrifter",,playable,2022-09-03 13:18:39
+01006FB00DB02000,"Yaga",nvdec,playable,2022-09-16 23:17:17
+010076B0101A0000,"YesterMorrow",crash,ingame,2020-12-17 17:15:25
+010085500B29A000,"Yet Another Zombie Defense HD",,playable,2021-01-06 00:18:39
+0100725019978000,"YGGDRA UNION ~WE'LL NEVER FIGHT ALONE~",,playable,2020-04-03 02:20:47
+0100634008266000,"YIIK: A Postmodern RPG",,playable,2021-01-28 13:38:37
+0100C0000CEEA000,"Yo kai watch 1 for Nintendo Switch",gpu;opengl,ingame,2024-05-28 11:11:49
+010086C00AF7C000,"Yo-Kai Watch 4++",,playable,2024-06-18 20:21:44
+010002D00632E000,"Yoku's Island Express",nvdec,playable,2022-09-03 13:59:02
+0100F47016F26000,"Yomawari 3",,playable,2022-05-10 08:26:51
+010012F00B6F2000,"Yomawari: The Long Night Collection",,playable,2022-09-03 14:36:59
+0100CC600ABB2000,"Yonder: The Cloud Catcher Chronicles (Retail Only)",,playable,2021-01-28 14:06:25
+0100BE50042F6000,"Yono and the Celestial Elephants",,playable,2021-01-28 18:23:58
+0100F110029C8000,"Yooka-Laylee",,playable,2021-01-28 14:21:45
+010022F00DA66000,"Yooka-Laylee and the Impossible Lair",,playable,2021-03-05 17:32:21
+01006000040C2000,"Yoshi’s Crafted World™",gpu;audout,ingame,2021-08-30 13:25:51
+0100AE800C9C6000,"Yoshi’s Crafted World™ Demo",gpu,boots,2020-12-16 14:57:40
+,"Yoshiwara Higanbana Kuon no Chigiri",nvdec,playable,2020-10-17 19:14:46
+01003A400C3DA800,"YouTube",,playable,2024-06-08 05:24:10
+00100A7700CCAA40,"Youtubers Life00",nvdec,playable,2022-09-03 14:56:19
+0100E390124D8000,"Ys IX: Monstrum Nox",,playable,2022-06-12 04:14:42
+0100F90010882000,"Ys Origin",nvdec,playable,2024-04-17 05:07:33
+01007F200B0C0000,"Ys VIII: Lacrimosa of DANA",nvdec,playable,2023-08-05 09:26:41
+010022400BE5A000,"Yu-Gi-Oh! Legacy of the Duelist : Link Evolution",,playable,2024-09-27 21:48:43
+01002D60188DE000,"Yu-Gi-Oh! Rush Duel: Dawn of the Battle Royale!! Let's Go! Go Rush!!",crash,ingame,2023-03-17 01:54:01
+010037D00DBDC000,"YU-NO: A girl who chants love at the bound of this world.",nvdec,playable,2021-01-26 17:03:52
+0100B56011502000,"Yumeutsutsu Re:After",,playable,2022-11-20 16:09:06
+,"Yunohana Spring! - Mellow Times -",audio;crash,menus,2020-09-27 19:27:40
+0100307011C44000,"Yuppie Psycho: Executive Edition",crash,ingame,2020-12-11 10:37:06
+0100FC900963E000,"Yuri",,playable,2021-06-11 13:08:50
+010092400A678000,"Zaccaria Pinball",online-broken,playable,2022-09-03 15:44:28
+0100E7900C4C0000,"Zarvot",,playable,2021-01-28 13:51:36
+01005F200F7C2000,"Zen Chess Collection",,playable,2020-07-01 22:28:27
+01008DD0114AE000,"Zenge",,playable,2020-10-22 13:23:57
+0100057011E50000,"Zengeon",services-horizon;crash,boots,2024-04-29 15:43:07
+0100AAC00E692000,"Zenith",,playable,2022-09-17 09:57:02
+0100A6A00894C000,"ZERO GUNNER 2- for Nintendo Switch",,playable,2021-01-04 20:17:14
+01004B001058C000,"Zero Strain",services;UE4,menus,2021-11-10 07:48:32
+,"Zettai kaikyu gakuen",gpu;nvdec,ingame,2020-08-25 15:15:54
+0100D7B013DD0000,"Ziggy the Chaser",,playable,2021-02-04 20:34:27
+010086700EF16000,"ZikSquare",gpu,ingame,2021-11-06 02:02:48
+010069C0123D8000,"Zoids Wild Blast Unleashed",nvdec,playable,2022-10-15 11:26:59
+0100C7300EEE4000,"Zombie Army Trilogy",ldn-untested;online,playable,2020-12-16 12:02:28
+01006CF00DA8C000,"Zombie Driver Immortal Edition",nvdec,playable,2020-12-14 23:15:10
+0100CFE003A64000,"ZOMBIE GOLD RUSH",online,playable,2020-09-24 12:56:08
+01001740116EC000,"Zombie's Cool",,playable,2020-12-17 12:41:26
+01000E5800D32C00,"Zombieland: Double Tap - Road Trip0",,playable,2022-09-17 10:08:45
+0100CD300A1BA000,"Zombillie",,playable,2020-07-23 17:42:23
+01001EE00A6B0000,"Zotrix: Solar Division",,playable,2021-06-07 20:34:05
+0100B9B00C6A4000,"この世の果てで恋を唄う少女YU-NO",audio,ingame,2021-01-22 07:00:16
+,"スーパーファミコン Nintendo Switch Online",slow,ingame,2020-03-14 05:48:38
+01000BB01CB8A000,"トラブル・マギア ~訳アリ少女は未来を勝ち取るために異国の魔法学校へ留学します~(Trouble Magia ~Wakeari Shoujo wa Mirai o Kachitoru Tame ni Ikoku no Mahou Gakkou e Ryuugaku Shimasu~)",,nothing,2024-09-28 07:03:14
+010065500B218000,"メモリーズオフ - Innocent Fille",,playable,2022-12-02 17:36:48
+010032400E700000,"二ノ国 白き聖灰の女王",services;32-bit,menus,2023-04-16 17:11:06
+0100F3100DA46000,"初音ミク Project DIVA MEGA39's",audio;loader-allocator,playable,2022-07-29 11:45:52
+010047F012BE2000,"密室のサクリファイス/ABYSS OF THE SACRIFICE",nvdec,playable,2022-10-21 13:56:28
+0100BF401AF9C000,"御伽活劇 豆狸のバケル ~オラクル祭太郎の祭難!!~ (Otogi Katsugeki Mameda no Bakeru Oracle Saitarou no Sainan!!)",slow,playable,2023-12-31 14:37:17
+0100AFA01750C000,"死神と少女/Shinigami to Shoujo",gpu;Incomplete,ingame,2024-03-22 01:06:45
+01001BA01EBFC000,"燃えよ! 乙女道士 ~華遊恋語~ (Moeyo! Otome Doushi Kayu Koigatari)",services-horizon,nothing,2024-09-28 12:22:55
+0100936018EB4000,"牧場物語 Welcome!ワンダフルライフ",crash,ingame,2023-04-25 19:43:52
+0100F4401940A000,"超探偵事件簿 レインコード (Master Detective Archives: Rain Code)",crash,ingame,2024-02-12 20:58:31
+010064801A01C000,"超次元ゲイム ネプテューヌ GameMaker R:Evolution",crash,nothing,2023-10-30 22:37:40
+0100F3400332C000,"ゼノブレイド2",deadlock;amd-vendor-bug,ingame,2024-03-28 14:31:41
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs
index 13d9fac68..694633f97 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs
@@ -406,7 +406,7 @@ namespace ARMeilleure.Instructions
{
Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2);
- return EmitUnaryMathCall(context, nameof(Math.Abs), res);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res);
});
}
}
@@ -451,7 +451,7 @@ namespace ARMeilleure.Instructions
{
Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2);
- return EmitUnaryMathCall(context, nameof(Math.Abs), res);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res);
});
}
}
@@ -483,7 +483,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Abs), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1);
});
}
}
@@ -522,7 +522,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Abs), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1);
});
}
}
@@ -2246,7 +2246,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Floor), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1);
});
}
}
@@ -2265,7 +2265,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Floor), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1);
});
}
}
@@ -2322,7 +2322,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1);
});
}
}
@@ -2341,7 +2341,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1);
});
}
}
@@ -2390,7 +2390,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Truncate), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1);
});
}
}
@@ -2409,7 +2409,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Truncate), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1);
});
}
}
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
index c807fc858..284f3f576 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
@@ -43,7 +43,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1));
+ EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1));
}
}
@@ -66,7 +66,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1));
+ EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1));
}
}
else
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs
index aab677869..8fcb06286 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs
@@ -726,8 +726,8 @@ namespace ARMeilleure.Instructions
if (absolute)
{
- ne = EmitUnaryMathCall(context, nameof(Math.Abs), ne);
- me = EmitUnaryMathCall(context, nameof(Math.Abs), me);
+ ne = EmitUnaryMathCall(context, nameof(MathHelper.Abs), ne);
+ me = EmitUnaryMathCall(context, nameof(MathHelper.Abs), me);
}
Operand e = EmitSoftFloatCall(context, name, ne, me);
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs
index 3363a7c77..a5d4744f7 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs
@@ -333,7 +333,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1));
+ EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1));
}
}
@@ -349,7 +349,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1), signed: true, scalar: false);
+ EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1), signed: true, scalar: false);
}
}
@@ -365,7 +365,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1));
+ EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1));
}
}
@@ -538,7 +538,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1));
+ EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1));
}
}
@@ -554,7 +554,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1));
+ EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1));
}
}
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs
index 8eef6b14d..216726df9 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs
@@ -357,10 +357,10 @@ namespace ARMeilleure.Instructions
toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert);
break;
case 0b10: // Towards positive infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert);
break;
case 0b11: // Towards negative infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert);
break;
}
@@ -494,10 +494,10 @@ namespace ARMeilleure.Instructions
toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert);
break;
case 0b10: // Towards positive infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert);
break;
case 0b11: // Towards negative infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert);
break;
}
@@ -534,7 +534,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Floor), m));
+ EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), m));
}
}
@@ -574,7 +574,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Ceiling), m));
+ EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), m));
}
}
@@ -613,7 +613,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Truncate), op1));
+ EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1));
}
}
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs
index abd0d9acc..634e5c18b 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs
@@ -460,8 +460,8 @@ namespace ARMeilleure.Instructions
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
MethodInfo info = (op.Size & 1) == 0
- ? typeof(MathF).GetMethod(name, new Type[] { typeof(float) })
- : typeof(Math).GetMethod(name, new Type[] { typeof(double) });
+ ? typeof(MathHelperF).GetMethod(name, new Type[] { typeof(float) })
+ : typeof(MathHelper).GetMethod(name, new Type[] { typeof(double) });
return context.Call(info, n);
}
@@ -470,11 +470,11 @@ namespace ARMeilleure.Instructions
{
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
- string name = nameof(Math.Round);
+ string name = nameof(MathHelper.Round);
MethodInfo info = (op.Size & 1) == 0
- ? typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(MidpointRounding) })
- : typeof(Math).GetMethod(name, new Type[] { typeof(double), typeof(MidpointRounding) });
+ ? typeof(MathHelperF).GetMethod(name, new Type[] { typeof(float), typeof(int) })
+ : typeof(MathHelper).GetMethod(name, new Type[] { typeof(double), typeof(int) });
return context.Call(info, n, Const((int)roundMode));
}
@@ -510,16 +510,16 @@ namespace ARMeilleure.Instructions
context.MarkLabel(lbl1);
context.BranchIf(lbl2, rMode, rP, Comparison.NotEqual);
- context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Ceiling), op));
+ context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op));
context.Branch(lblEnd);
context.MarkLabel(lbl2);
context.BranchIf(lbl3, rMode, rM, Comparison.NotEqual);
- context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Floor), op));
+ context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Floor), op));
context.Branch(lblEnd);
context.MarkLabel(lbl3);
- context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Truncate), op));
+ context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op));
context.Branch(lblEnd);
context.MarkLabel(lblEnd);
diff --git a/src/ARMeilleure/Instructions/MathHelper.cs b/src/ARMeilleure/Instructions/MathHelper.cs
new file mode 100644
index 000000000..a11ce9d2e
--- /dev/null
+++ b/src/ARMeilleure/Instructions/MathHelper.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace ARMeilleure.Instructions
+{
+ static class MathHelper
+ {
+ [UnmanagedCallersOnly]
+ public static double Abs(double value)
+ {
+ return Math.Abs(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Ceiling(double value)
+ {
+ return Math.Ceiling(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Floor(double value)
+ {
+ return Math.Floor(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Round(double value, int mode)
+ {
+ return Math.Round(value, (MidpointRounding)mode);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Truncate(double value)
+ {
+ return Math.Truncate(value);
+ }
+ }
+
+ static class MathHelperF
+ {
+ [UnmanagedCallersOnly]
+ public static float Abs(float value)
+ {
+ return MathF.Abs(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Ceiling(float value)
+ {
+ return MathF.Ceiling(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Floor(float value)
+ {
+ return MathF.Floor(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Round(float value, int mode)
+ {
+ return MathF.Round(value, (MidpointRounding)mode);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Truncate(float value)
+ {
+ return MathF.Truncate(value);
+ }
+ }
+}
diff --git a/src/ARMeilleure/Instructions/NativeInterface.cs b/src/ARMeilleure/Instructions/NativeInterface.cs
index 0cd3754f7..9d6279613 100644
--- a/src/ARMeilleure/Instructions/NativeInterface.cs
+++ b/src/ARMeilleure/Instructions/NativeInterface.cs
@@ -2,6 +2,7 @@ using ARMeilleure.Memory;
using ARMeilleure.State;
using ARMeilleure.Translation;
using System;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
@@ -34,6 +35,7 @@ namespace ARMeilleure.Instructions
Context = null;
}
+ [UnmanagedCallersOnly]
public static void Break(ulong address, int imm)
{
Statistics.PauseTimer();
@@ -43,6 +45,7 @@ namespace ARMeilleure.Instructions
Statistics.ResumeTimer();
}
+ [UnmanagedCallersOnly]
public static void SupervisorCall(ulong address, int imm)
{
Statistics.PauseTimer();
@@ -52,6 +55,7 @@ namespace ARMeilleure.Instructions
Statistics.ResumeTimer();
}
+ [UnmanagedCallersOnly]
public static void Undefined(ulong address, int opCode)
{
Statistics.PauseTimer();
@@ -62,26 +66,31 @@ namespace ARMeilleure.Instructions
}
#region "System registers"
+ [UnmanagedCallersOnly]
public static ulong GetCtrEl0()
{
return GetContext().CtrEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetDczidEl0()
{
return GetContext().DczidEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetCntfrqEl0()
{
return GetContext().CntfrqEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetCntpctEl0()
{
return GetContext().CntpctEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetCntvctEl0()
{
return GetContext().CntvctEl0;
@@ -89,26 +98,31 @@ namespace ARMeilleure.Instructions
#endregion
#region "Read"
+ [UnmanagedCallersOnly]
public static byte ReadByte(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static ushort ReadUInt16(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static uint ReadUInt32(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static ulong ReadUInt64(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static V128 ReadVector128(ulong address)
{
return GetMemoryManager().ReadGuest(address);
@@ -116,47 +130,56 @@ namespace ARMeilleure.Instructions
#endregion
#region "Write"
+ [UnmanagedCallersOnly]
public static void WriteByte(ulong address, byte value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteUInt16(ulong address, ushort value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteUInt32(ulong address, uint value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteUInt64(ulong address, ulong value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteVector128(ulong address, V128 value)
{
GetMemoryManager().WriteGuest(address, value);
}
#endregion
+ [UnmanagedCallersOnly]
public static void EnqueueForRejit(ulong address)
{
Context.Translator.EnqueueForRejit(address, GetContext().ExecutionMode);
}
- public static void SignalMemoryTracking(ulong address, ulong size, bool write)
+ [UnmanagedCallersOnly]
+ public static void SignalMemoryTracking(ulong address, ulong size, byte write)
{
- GetMemoryManager().SignalMemoryTracking(address, size, write);
+ GetMemoryManager().SignalMemoryTracking(address, size, write == 1);
}
+ [UnmanagedCallersOnly]
public static void ThrowInvalidMemoryAccess(ulong address)
{
throw new InvalidAccessException(address);
}
+ [UnmanagedCallersOnly]
public static ulong GetFunctionAddress(ulong address)
{
TranslatedFunction function = Context.Translator.GetOrTranslate(address, GetContext().ExecutionMode);
@@ -164,12 +187,14 @@ namespace ARMeilleure.Instructions
return (ulong)function.FuncPointer.ToInt64();
}
+ [UnmanagedCallersOnly]
public static void InvalidateCacheLine(ulong address)
{
Context.Translator.InvalidateJitCacheRegion(address, InstEmit.DczSizeInBytes);
}
- public static bool CheckSynchronization()
+ [UnmanagedCallersOnly]
+ public static byte CheckSynchronization()
{
Statistics.PauseTimer();
@@ -179,7 +204,7 @@ namespace ARMeilleure.Instructions
Statistics.ResumeTimer();
- return context.Running;
+ return (byte)(context.Running ? 1 : 0);
}
public static ExecutionContext GetContext()
diff --git a/src/ARMeilleure/Instructions/SoftFallback.cs b/src/ARMeilleure/Instructions/SoftFallback.cs
index 899326c4b..178be6f79 100644
--- a/src/ARMeilleure/Instructions/SoftFallback.cs
+++ b/src/ARMeilleure/Instructions/SoftFallback.cs
@@ -1,11 +1,13 @@
using ARMeilleure.State;
using System;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
static class SoftFallback
{
#region "ShrImm64"
+ [UnmanagedCallersOnly]
public static long SignedShrImm64(long value, long roundConst, int shift)
{
if (roundConst == 0L)
@@ -48,6 +50,7 @@ namespace ARMeilleure.Instructions
}
}
+ [UnmanagedCallersOnly]
public static ulong UnsignedShrImm64(ulong value, long roundConst, int shift)
{
if (roundConst == 0L)
@@ -92,6 +95,7 @@ namespace ARMeilleure.Instructions
#endregion
#region "Saturation"
+ [UnmanagedCallersOnly]
public static int SatF32ToS32(float value)
{
if (float.IsNaN(value))
@@ -103,6 +107,7 @@ namespace ARMeilleure.Instructions
value <= int.MinValue ? int.MinValue : (int)value;
}
+ [UnmanagedCallersOnly]
public static long SatF32ToS64(float value)
{
if (float.IsNaN(value))
@@ -114,6 +119,7 @@ namespace ARMeilleure.Instructions
value <= long.MinValue ? long.MinValue : (long)value;
}
+ [UnmanagedCallersOnly]
public static uint SatF32ToU32(float value)
{
if (float.IsNaN(value))
@@ -125,6 +131,7 @@ namespace ARMeilleure.Instructions
value <= uint.MinValue ? uint.MinValue : (uint)value;
}
+ [UnmanagedCallersOnly]
public static ulong SatF32ToU64(float value)
{
if (float.IsNaN(value))
@@ -136,6 +143,7 @@ namespace ARMeilleure.Instructions
value <= ulong.MinValue ? ulong.MinValue : (ulong)value;
}
+ [UnmanagedCallersOnly]
public static int SatF64ToS32(double value)
{
if (double.IsNaN(value))
@@ -147,6 +155,7 @@ namespace ARMeilleure.Instructions
value <= int.MinValue ? int.MinValue : (int)value;
}
+ [UnmanagedCallersOnly]
public static long SatF64ToS64(double value)
{
if (double.IsNaN(value))
@@ -158,6 +167,7 @@ namespace ARMeilleure.Instructions
value <= long.MinValue ? long.MinValue : (long)value;
}
+ [UnmanagedCallersOnly]
public static uint SatF64ToU32(double value)
{
if (double.IsNaN(value))
@@ -169,6 +179,7 @@ namespace ARMeilleure.Instructions
value <= uint.MinValue ? uint.MinValue : (uint)value;
}
+ [UnmanagedCallersOnly]
public static ulong SatF64ToU64(double value)
{
if (double.IsNaN(value))
@@ -182,6 +193,7 @@ namespace ARMeilleure.Instructions
#endregion
#region "Count"
+ [UnmanagedCallersOnly]
public static ulong CountLeadingSigns(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.).
{
value ^= value >> 1;
@@ -201,6 +213,7 @@ namespace ARMeilleure.Instructions
private static ReadOnlySpan ClzNibbleTbl => new byte[] { 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
+ [UnmanagedCallersOnly]
public static ulong CountLeadingZeros(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.).
{
if (value == 0ul)
@@ -224,41 +237,49 @@ namespace ARMeilleure.Instructions
#endregion
#region "Table"
+ [UnmanagedCallersOnly]
public static V128 Tbl1(V128 vector, int bytes, V128 tb0)
{
return TblOrTbx(default, vector, bytes, tb0);
}
+ [UnmanagedCallersOnly]
public static V128 Tbl2(V128 vector, int bytes, V128 tb0, V128 tb1)
{
return TblOrTbx(default, vector, bytes, tb0, tb1);
}
+ [UnmanagedCallersOnly]
public static V128 Tbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2)
{
return TblOrTbx(default, vector, bytes, tb0, tb1, tb2);
}
+ [UnmanagedCallersOnly]
public static V128 Tbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3)
{
return TblOrTbx(default, vector, bytes, tb0, tb1, tb2, tb3);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx1(V128 dest, V128 vector, int bytes, V128 tb0)
{
return TblOrTbx(dest, vector, bytes, tb0);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1)
{
return TblOrTbx(dest, vector, bytes, tb0, tb1);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2)
{
return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3)
{
return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2, tb3);
@@ -300,14 +321,22 @@ namespace ARMeilleure.Instructions
private const uint Crc32RevPoly = 0xedb88320;
private const uint Crc32cRevPoly = 0x82f63b78;
+ [UnmanagedCallersOnly]
public static uint Crc32b(uint crc, byte value) => Crc32(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32h(uint crc, ushort value) => Crc32h(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32w(uint crc, uint value) => Crc32w(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32x(uint crc, ulong value) => Crc32x(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32cb(uint crc, byte value) => Crc32(crc, Crc32cRevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32ch(uint crc, ushort value) => Crc32h(crc, Crc32cRevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32cw(uint crc, uint value) => Crc32w(crc, Crc32cRevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32cx(uint crc, ulong value) => Crc32x(crc, Crc32cRevPoly, value);
private static uint Crc32h(uint crc, uint poly, ushort val)
@@ -358,21 +387,25 @@ namespace ARMeilleure.Instructions
#endregion
#region "Aes"
+ [UnmanagedCallersOnly]
public static V128 Decrypt(V128 value, V128 roundKey)
{
return CryptoHelper.AesInvSubBytes(CryptoHelper.AesInvShiftRows(value ^ roundKey));
}
+ [UnmanagedCallersOnly]
public static V128 Encrypt(V128 value, V128 roundKey)
{
return CryptoHelper.AesSubBytes(CryptoHelper.AesShiftRows(value ^ roundKey));
}
+ [UnmanagedCallersOnly]
public static V128 InverseMixColumns(V128 value)
{
return CryptoHelper.AesInvMixColumns(value);
}
+ [UnmanagedCallersOnly]
public static V128 MixColumns(V128 value)
{
return CryptoHelper.AesMixColumns(value);
@@ -380,6 +413,7 @@ namespace ARMeilleure.Instructions
#endregion
#region "Sha1"
+ [UnmanagedCallersOnly]
public static V128 HashChoose(V128 hash_abcd, uint hash_e, V128 wk)
{
for (int e = 0; e <= 3; e++)
@@ -400,11 +434,13 @@ namespace ARMeilleure.Instructions
return hash_abcd;
}
+ [UnmanagedCallersOnly]
public static uint FixedRotate(uint hash_e)
{
return hash_e.Rol(30);
}
+ [UnmanagedCallersOnly]
public static V128 HashMajority(V128 hash_abcd, uint hash_e, V128 wk)
{
for (int e = 0; e <= 3; e++)
@@ -425,6 +461,7 @@ namespace ARMeilleure.Instructions
return hash_abcd;
}
+ [UnmanagedCallersOnly]
public static V128 HashParity(V128 hash_abcd, uint hash_e, V128 wk)
{
for (int e = 0; e <= 3; e++)
@@ -445,6 +482,7 @@ namespace ARMeilleure.Instructions
return hash_abcd;
}
+ [UnmanagedCallersOnly]
public static V128 Sha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11)
{
ulong t2 = w4_7.Extract(0);
@@ -455,6 +493,7 @@ namespace ARMeilleure.Instructions
return result ^ (w0_3 ^ w8_11);
}
+ [UnmanagedCallersOnly]
public static V128 Sha1SchedulePart2(V128 tw0_3, V128 w12_15)
{
V128 t = tw0_3 ^ (w12_15 >> 32);
@@ -499,16 +538,19 @@ namespace ARMeilleure.Instructions
#endregion
#region "Sha256"
+ [UnmanagedCallersOnly]
public static V128 HashLower(V128 hash_abcd, V128 hash_efgh, V128 wk)
{
return Sha256Hash(hash_abcd, hash_efgh, wk, part1: true);
}
+ [UnmanagedCallersOnly]
public static V128 HashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk)
{
return Sha256Hash(hash_abcd, hash_efgh, wk, part1: false);
}
+ [UnmanagedCallersOnly]
public static V128 Sha256SchedulePart1(V128 w0_3, V128 w4_7)
{
V128 result = new();
@@ -527,6 +569,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static V128 Sha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15)
{
V128 result = new();
@@ -628,6 +671,7 @@ namespace ARMeilleure.Instructions
}
#endregion
+ [UnmanagedCallersOnly]
public static V128 PolynomialMult64_128(ulong op1, ulong op2)
{
V128 result = V128.Zero;
diff --git a/src/ARMeilleure/Instructions/SoftFloat.cs b/src/ARMeilleure/Instructions/SoftFloat.cs
index a67349e6e..7895ca1dc 100644
--- a/src/ARMeilleure/Instructions/SoftFloat.cs
+++ b/src/ARMeilleure/Instructions/SoftFloat.cs
@@ -1,6 +1,7 @@
using ARMeilleure.State;
using System;
using System.Diagnostics;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
@@ -312,6 +313,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat16_32
{
+ [UnmanagedCallersOnly]
public static float FPConvert(ushort valueBits)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -487,6 +489,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat16_64
{
+ [UnmanagedCallersOnly]
public static double FPConvert(ushort valueBits)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -662,6 +665,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat32_16
{
+ [UnmanagedCallersOnly]
public static ushort FPConvert(float value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -781,12 +785,19 @@ namespace ARMeilleure.Instructions
static class SoftFloat32
{
+ [UnmanagedCallersOnly]
public static float FPAdd(float value1, float value2)
{
- return FPAddFpscr(value1, value2, false);
+ return FPAddFpscrImpl(value1, value2, false);
}
- public static float FPAddFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPAddFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPAddFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPAddFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -837,7 +848,8 @@ namespace ARMeilleure.Instructions
return result;
}
- public static int FPCompare(float value1, float value2, bool signalNaNs)
+ [UnmanagedCallersOnly]
+ public static int FPCompare(float value1, float value2, byte signalNaNs)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = context.Fpcr;
@@ -851,7 +863,7 @@ namespace ARMeilleure.Instructions
{
result = 0b0011;
- if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs)
+ if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1)
{
SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr);
}
@@ -875,12 +887,13 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPCompareEQ(float value1, float value2)
{
- return FPCompareEQFpscr(value1, value2, false);
+ return FPCompareEQFpscrImpl(value1, value2, false);
}
- public static float FPCompareEQFpscr(float value1, float value2, bool standardFpscr)
+ private static float FPCompareEQFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -907,12 +920,25 @@ namespace ARMeilleure.Instructions
return result;
}
- public static float FPCompareGE(float value1, float value2)
+ [UnmanagedCallersOnly]
+ public static float FPCompareEQFpscr(float value1, float value2, byte standardFpscr)
{
- return FPCompareGEFpscr(value1, value2, false);
+ return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1);
}
- public static float FPCompareGEFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareGE(float value1, float value2)
+ {
+ return FPCompareGEFpscrImpl(value1, value2, false);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float FPCompareGEFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPCompareGEFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -936,12 +962,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPCompareGT(float value1, float value2)
{
- return FPCompareGTFpscr(value1, value2, false);
+ return FPCompareGTFpscrImpl(value1, value2, false);
}
- public static float FPCompareGTFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareGTFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPCompareGTFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -965,26 +998,31 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPCompareLE(float value1, float value2)
{
- return FPCompareGE(value2, value1);
+ return FPCompareGEFpscrImpl(value2, value1, false);
}
+ [UnmanagedCallersOnly]
public static float FPCompareLT(float value1, float value2)
{
- return FPCompareGT(value2, value1);
+ return FPCompareGTFpscrImpl(value2, value1, false);
}
- public static float FPCompareLEFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareLEFpscr(float value1, float value2, byte standardFpscr)
{
- return FPCompareGEFpscr(value2, value1, standardFpscr);
+ return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1);
}
- public static float FPCompareLTFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareLTFpscr(float value1, float value2, byte standardFpscr)
{
- return FPCompareGTFpscr(value2, value1, standardFpscr);
+ return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static float FPDiv(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1037,12 +1075,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMax(float value1, float value2)
{
- return FPMaxFpscr(value1, value2, false);
+ return FPMaxFpscrImpl(value1, value2, false);
}
- public static float FPMaxFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMaxFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMaxFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMaxFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1103,12 +1148,13 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMaxNum(float value1, float value2)
{
- return FPMaxNumFpscr(value1, value2, false);
+ return FPMaxNumFpscrImpl(value1, value2, false);
}
- public static float FPMaxNumFpscr(float value1, float value2, bool standardFpscr)
+ private static float FPMaxNumFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1125,15 +1171,28 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(true);
}
- return FPMaxFpscr(value1, value2, standardFpscr);
+ return FPMaxFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
+ public static float FPMaxNumFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ [UnmanagedCallersOnly]
public static float FPMin(float value1, float value2)
{
- return FPMinFpscr(value1, value2, false);
+ return FPMinFpscrImpl(value1, value2, false);
}
- public static float FPMinFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMinFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMinFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMinFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1194,12 +1253,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMinNum(float value1, float value2)
{
- return FPMinNumFpscr(value1, value2, false);
+ return FPMinNumFpscrImpl(value1, value2, false);
}
- public static float FPMinNumFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMinNumFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMinNumFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1216,15 +1282,22 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(false);
}
- return FPMinFpscr(value1, value2, standardFpscr);
+ return FPMinFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
public static float FPMul(float value1, float value2)
{
- return FPMulFpscr(value1, value2, false);
+ return FPMulFpscrImpl(value1, value2, false);
}
- public static float FPMulFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMulFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMulFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMulFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1271,12 +1344,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMulAdd(float valueA, float value1, float value2)
{
- return FPMulAddFpscr(valueA, value1, value2, false);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static float FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMulAddFpscr(float valueA, float value1, float value2, byte standardFpscr)
+ {
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMulAddFpscrImpl(float valueA, float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1342,20 +1422,23 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMulSub(float valueA, float value1, float value2)
{
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static float FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMulSubFpscr(float valueA, float value1, float value2, byte standardFpscr)
{
value1 = value1.FPNeg();
- return FPMulAddFpscr(valueA, value1, value2, standardFpscr);
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static float FPMulX(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1401,27 +1484,36 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPNegMulAdd(float valueA, float value1, float value2)
{
valueA = valueA.FPNeg();
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static float FPNegMulSub(float valueA, float value1, float value2)
{
valueA = valueA.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static float FPRecipEstimate(float value)
{
- return FPRecipEstimateFpscr(value, false);
+ return FPRecipEstimateFpscrImpl(value, false);
}
- public static float FPRecipEstimateFpscr(float value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPRecipEstimateFpscr(float value, byte standardFpscr)
+ {
+ return FPRecipEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static float FPRecipEstimateFpscrImpl(float value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1508,6 +1600,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRecipStep(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1533,15 +1626,16 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
- result = FPSubFpscr(FPTwo(false), product, true);
+ result = FPSubFpscrImpl(FPTwo(false), product, true);
}
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRecipStepFused(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1585,6 +1679,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRecpX(float value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1610,12 +1705,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRSqrtEstimate(float value)
{
- return FPRSqrtEstimateFpscr(value, false);
+ return FPRSqrtEstimateFpscrImpl(value, false);
}
- public static float FPRSqrtEstimateFpscr(float value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPRSqrtEstimateFpscr(float value, byte standardFpscr)
+ {
+ return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static float FPRSqrtEstimateFpscrImpl(float value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1729,6 +1831,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRSqrtStep(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1754,7 +1857,7 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
result = FPHalvedSub(FPThree(false), product, context, fpcr);
@@ -1763,6 +1866,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRSqrtStepFused(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1806,6 +1910,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPSqrt(float value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1848,12 +1953,13 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPSub(float value1, float value2)
{
- return FPSubFpscr(value1, value2, false);
+ return FPSubFpscrImpl(value1, value2, false);
}
- public static float FPSubFpscr(float value1, float value2, bool standardFpscr)
+ private static float FPSubFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2094,6 +2200,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat64_16
{
+ [UnmanagedCallersOnly]
public static ushort FPConvert(double value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2213,12 +2320,19 @@ namespace ARMeilleure.Instructions
static class SoftFloat64
{
+ [UnmanagedCallersOnly]
public static double FPAdd(double value1, double value2)
{
- return FPAddFpscr(value1, value2, false);
+ return FPAddFpscrImpl(value1, value2, false);
}
- public static double FPAddFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPAddFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPAddFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPAddFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2269,7 +2383,8 @@ namespace ARMeilleure.Instructions
return result;
}
- public static int FPCompare(double value1, double value2, bool signalNaNs)
+ [UnmanagedCallersOnly]
+ public static int FPCompare(double value1, double value2, byte signalNaNs)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = context.Fpcr;
@@ -2283,7 +2398,7 @@ namespace ARMeilleure.Instructions
{
result = 0b0011;
- if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs)
+ if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1)
{
SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr);
}
@@ -2307,12 +2422,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareEQ(double value1, double value2)
{
- return FPCompareEQFpscr(value1, value2, false);
+ return FPCompareEQFpscrImpl(value1, value2, false);
}
- public static double FPCompareEQFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareEQFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPCompareEQFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2339,12 +2461,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareGE(double value1, double value2)
{
- return FPCompareGEFpscr(value1, value2, false);
+ return FPCompareGEFpscrImpl(value1, value2, false);
}
- public static double FPCompareGEFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareGEFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPCompareGEFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2368,12 +2497,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareGT(double value1, double value2)
{
- return FPCompareGTFpscr(value1, value2, false);
+ return FPCompareGTFpscrImpl(value1, value2, false);
}
- public static double FPCompareGTFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareGTFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPCompareGTFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2397,26 +2533,31 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareLE(double value1, double value2)
{
- return FPCompareGE(value2, value1);
+ return FPCompareGEFpscrImpl(value2, value1, false);
}
+ [UnmanagedCallersOnly]
public static double FPCompareLT(double value1, double value2)
{
- return FPCompareGT(value2, value1);
+ return FPCompareGTFpscrImpl(value2, value1, false);
}
- public static double FPCompareLEFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareLEFpscr(double value1, double value2, byte standardFpscr)
{
- return FPCompareGEFpscr(value2, value1, standardFpscr);
+ return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1);
}
- public static double FPCompareLTFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareLTFpscr(double value1, double value2, byte standardFpscr)
{
- return FPCompareGTFpscr(value2, value1, standardFpscr);
+ return FPCompareGTFpscrImpl(value2, value1, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static double FPDiv(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2469,12 +2610,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMax(double value1, double value2)
{
- return FPMaxFpscr(value1, value2, false);
+ return FPMaxFpscrImpl(value1, value2, false);
}
- public static double FPMaxFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMaxFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMaxFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMaxFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2535,12 +2683,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMaxNum(double value1, double value2)
{
- return FPMaxNumFpscr(value1, value2, false);
+ return FPMaxNumFpscrImpl(value1, value2, false);
}
- public static double FPMaxNumFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMaxNumFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMaxNumFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2557,15 +2712,22 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(true);
}
- return FPMaxFpscr(value1, value2, standardFpscr);
+ return FPMaxFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
public static double FPMin(double value1, double value2)
{
- return FPMinFpscr(value1, value2, false);
+ return FPMinFpscrImpl(value1, value2, false);
}
- public static double FPMinFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMinFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMinFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMinFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2626,12 +2788,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMinNum(double value1, double value2)
{
- return FPMinNumFpscr(value1, value2, false);
+ return FPMinNumFpscrImpl(value1, value2, false);
}
- public static double FPMinNumFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMinNumFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMinNumFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2648,15 +2817,22 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(false);
}
- return FPMinFpscr(value1, value2, standardFpscr);
+ return FPMinFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
public static double FPMul(double value1, double value2)
{
- return FPMulFpscr(value1, value2, false);
+ return FPMulFpscrImpl(value1, value2, false);
}
- public static double FPMulFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMulFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMulFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMulFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2703,12 +2879,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMulAdd(double valueA, double value1, double value2)
{
- return FPMulAddFpscr(valueA, value1, value2, false);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static double FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMulAddFpscr(double valueA, double value1, double value2, byte standardFpscr)
+ {
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMulAddFpscrImpl(double valueA, double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2774,20 +2957,23 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMulSub(double valueA, double value1, double value2)
{
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static double FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMulSubFpscr(double valueA, double value1, double value2, byte standardFpscr)
{
value1 = value1.FPNeg();
- return FPMulAddFpscr(valueA, value1, value2, standardFpscr);
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static double FPMulX(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2833,27 +3019,36 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPNegMulAdd(double valueA, double value1, double value2)
{
valueA = valueA.FPNeg();
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static double FPNegMulSub(double valueA, double value1, double value2)
{
valueA = valueA.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static double FPRecipEstimate(double value)
{
- return FPRecipEstimateFpscr(value, false);
+ return FPRecipEstimateFpscrImpl(value, false);
}
- public static double FPRecipEstimateFpscr(double value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPRecipEstimateFpscr(double value, byte standardFpscr)
+ {
+ return FPRecipEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static double FPRecipEstimateFpscrImpl(double value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2940,6 +3135,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRecipStep(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2965,7 +3161,7 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
result = FPSubFpscr(FPTwo(false), product, true);
@@ -2974,6 +3170,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRecipStepFused(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3017,6 +3214,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRecpX(double value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3042,12 +3240,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRSqrtEstimate(double value)
{
- return FPRSqrtEstimateFpscr(value, false);
+ return FPRSqrtEstimateFpscrImpl(value, false);
}
- public static double FPRSqrtEstimateFpscr(double value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPRSqrtEstimateFpscr(double value, byte standardFpscr)
+ {
+ return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static double FPRSqrtEstimateFpscrImpl(double value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -3161,6 +3366,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRSqrtStep(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3186,7 +3392,7 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
result = FPHalvedSub(FPThree(false), product, context, fpcr);
@@ -3195,6 +3401,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRSqrtStepFused(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3238,6 +3445,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPSqrt(double value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3280,6 +3488,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPSub(double value1, double value2)
{
return FPSubFpscr(value1, value2, false);
diff --git a/src/ARMeilleure/Translation/DelegateInfo.cs b/src/ARMeilleure/Translation/DelegateInfo.cs
index d3b535de1..64ee7bc9c 100644
--- a/src/ARMeilleure/Translation/DelegateInfo.cs
+++ b/src/ARMeilleure/Translation/DelegateInfo.cs
@@ -4,15 +4,9 @@ namespace ARMeilleure.Translation
{
class DelegateInfo
{
-#pragma warning disable IDE0052 // Remove unread private member
- private readonly Delegate _dlg; // Ensure that this delegate will not be garbage collected.
-#pragma warning restore IDE0052
-
- public nint FuncPtr { get; }
-
- public DelegateInfo(Delegate dlg, nint funcPtr)
+ public nint FuncPtr { get; private set; }
+ public DelegateInfo(nint funcPtr)
{
- _dlg = dlg;
FuncPtr = funcPtr;
}
}
diff --git a/src/ARMeilleure/Translation/Delegates.cs b/src/ARMeilleure/Translation/Delegates.cs
index d8c1cfd58..d4f46108c 100644
--- a/src/ARMeilleure/Translation/Delegates.cs
+++ b/src/ARMeilleure/Translation/Delegates.cs
@@ -1,9 +1,7 @@
using ARMeilleure.Instructions;
-using ARMeilleure.State;
using System;
using System.Collections.Generic;
using System.Reflection;
-using System.Runtime.InteropServices;
namespace ARMeilleure.Translation
{
@@ -34,21 +32,7 @@ namespace ARMeilleure.Translation
return _delegates.Values[index].FuncPtr; // O(1).
}
-
- public static nint GetDelegateFuncPtr(MethodInfo info)
- {
- ArgumentNullException.ThrowIfNull(info);
-
- string key = GetKey(info);
-
- if (!_delegates.TryGetValue(key, out DelegateInfo dlgInfo)) // O(log(n)).
- {
- throw new KeyNotFoundException($"({nameof(key)} = {key})");
- }
-
- return dlgInfo.FuncPtr;
- }
-
+
public static int GetDelegateIndex(MethodInfo info)
{
ArgumentNullException.ThrowIfNull(info);
@@ -64,12 +48,12 @@ namespace ARMeilleure.Translation
return index;
}
-
- private static void SetDelegateInfo(Delegate dlg, nint funcPtr)
+
+ private static void SetDelegateInfo(MethodInfo method)
{
- string key = GetKey(dlg.Method);
+ string key = GetKey(method);
- _delegates.Add(key, new DelegateInfo(dlg, funcPtr)); // ArgumentException (key).
+ _delegates.Add(key, new DelegateInfo(method.MethodHandle.GetFunctionPointer())); // ArgumentException (key).
}
private static string GetKey(MethodInfo info)
@@ -83,528 +67,179 @@ namespace ARMeilleure.Translation
{
_delegates = new SortedList();
- var dlgMathAbs = new MathAbs(Math.Abs);
- var dlgMathCeiling = new MathCeiling(Math.Ceiling);
- var dlgMathFloor = new MathFloor(Math.Floor);
- var dlgMathRound = new MathRound(Math.Round);
- var dlgMathTruncate = new MathTruncate(Math.Truncate);
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Abs)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Ceiling)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Floor)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Round)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Truncate)));
- var dlgMathFAbs = new MathFAbs(MathF.Abs);
- var dlgMathFCeiling = new MathFCeiling(MathF.Ceiling);
- var dlgMathFFloor = new MathFFloor(MathF.Floor);
- var dlgMathFRound = new MathFRound(MathF.Round);
- var dlgMathFTruncate = new MathFTruncate(MathF.Truncate);
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Abs)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Ceiling)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Floor)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Round)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Truncate)));
- var dlgNativeInterfaceBreak = new NativeInterfaceBreak(NativeInterface.Break);
- var dlgNativeInterfaceCheckSynchronization = new NativeInterfaceCheckSynchronization(NativeInterface.CheckSynchronization);
- var dlgNativeInterfaceEnqueueForRejit = new NativeInterfaceEnqueueForRejit(NativeInterface.EnqueueForRejit);
- var dlgNativeInterfaceGetCntfrqEl0 = new NativeInterfaceGetCntfrqEl0(NativeInterface.GetCntfrqEl0);
- var dlgNativeInterfaceGetCntpctEl0 = new NativeInterfaceGetCntpctEl0(NativeInterface.GetCntpctEl0);
- var dlgNativeInterfaceGetCntvctEl0 = new NativeInterfaceGetCntvctEl0(NativeInterface.GetCntvctEl0);
- var dlgNativeInterfaceGetCtrEl0 = new NativeInterfaceGetCtrEl0(NativeInterface.GetCtrEl0);
- var dlgNativeInterfaceGetDczidEl0 = new NativeInterfaceGetDczidEl0(NativeInterface.GetDczidEl0);
- var dlgNativeInterfaceGetFunctionAddress = new NativeInterfaceGetFunctionAddress(NativeInterface.GetFunctionAddress);
- var dlgNativeInterfaceInvalidateCacheLine = new NativeInterfaceInvalidateCacheLine(NativeInterface.InvalidateCacheLine);
- var dlgNativeInterfaceReadByte = new NativeInterfaceReadByte(NativeInterface.ReadByte);
- var dlgNativeInterfaceReadUInt16 = new NativeInterfaceReadUInt16(NativeInterface.ReadUInt16);
- var dlgNativeInterfaceReadUInt32 = new NativeInterfaceReadUInt32(NativeInterface.ReadUInt32);
- var dlgNativeInterfaceReadUInt64 = new NativeInterfaceReadUInt64(NativeInterface.ReadUInt64);
- var dlgNativeInterfaceReadVector128 = new NativeInterfaceReadVector128(NativeInterface.ReadVector128);
- var dlgNativeInterfaceSignalMemoryTracking = new NativeInterfaceSignalMemoryTracking(NativeInterface.SignalMemoryTracking);
- var dlgNativeInterfaceSupervisorCall = new NativeInterfaceSupervisorCall(NativeInterface.SupervisorCall);
- var dlgNativeInterfaceThrowInvalidMemoryAccess = new NativeInterfaceThrowInvalidMemoryAccess(NativeInterface.ThrowInvalidMemoryAccess);
- var dlgNativeInterfaceUndefined = new NativeInterfaceUndefined(NativeInterface.Undefined);
- var dlgNativeInterfaceWriteByte = new NativeInterfaceWriteByte(NativeInterface.WriteByte);
- var dlgNativeInterfaceWriteUInt16 = new NativeInterfaceWriteUInt16(NativeInterface.WriteUInt16);
- var dlgNativeInterfaceWriteUInt32 = new NativeInterfaceWriteUInt32(NativeInterface.WriteUInt32);
- var dlgNativeInterfaceWriteUInt64 = new NativeInterfaceWriteUInt64(NativeInterface.WriteUInt64);
- var dlgNativeInterfaceWriteVector128 = new NativeInterfaceWriteVector128(NativeInterface.WriteVector128);
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Break)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.CheckSynchronization)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.EnqueueForRejit)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntfrqEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntpctEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntvctEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCtrEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetDczidEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFunctionAddress)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.InvalidateCacheLine)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SignalMemoryTracking)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SupervisorCall)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ThrowInvalidMemoryAccess)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Undefined)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128)));
- var dlgSoftFallbackCountLeadingSigns = new SoftFallbackCountLeadingSigns(SoftFallback.CountLeadingSigns);
- var dlgSoftFallbackCountLeadingZeros = new SoftFallbackCountLeadingZeros(SoftFallback.CountLeadingZeros);
- var dlgSoftFallbackCrc32b = new SoftFallbackCrc32b(SoftFallback.Crc32b);
- var dlgSoftFallbackCrc32cb = new SoftFallbackCrc32cb(SoftFallback.Crc32cb);
- var dlgSoftFallbackCrc32ch = new SoftFallbackCrc32ch(SoftFallback.Crc32ch);
- var dlgSoftFallbackCrc32cw = new SoftFallbackCrc32cw(SoftFallback.Crc32cw);
- var dlgSoftFallbackCrc32cx = new SoftFallbackCrc32cx(SoftFallback.Crc32cx);
- var dlgSoftFallbackCrc32h = new SoftFallbackCrc32h(SoftFallback.Crc32h);
- var dlgSoftFallbackCrc32w = new SoftFallbackCrc32w(SoftFallback.Crc32w);
- var dlgSoftFallbackCrc32x = new SoftFallbackCrc32x(SoftFallback.Crc32x);
- var dlgSoftFallbackDecrypt = new SoftFallbackDecrypt(SoftFallback.Decrypt);
- var dlgSoftFallbackEncrypt = new SoftFallbackEncrypt(SoftFallback.Encrypt);
- var dlgSoftFallbackFixedRotate = new SoftFallbackFixedRotate(SoftFallback.FixedRotate);
- var dlgSoftFallbackHashChoose = new SoftFallbackHashChoose(SoftFallback.HashChoose);
- var dlgSoftFallbackHashLower = new SoftFallbackHashLower(SoftFallback.HashLower);
- var dlgSoftFallbackHashMajority = new SoftFallbackHashMajority(SoftFallback.HashMajority);
- var dlgSoftFallbackHashParity = new SoftFallbackHashParity(SoftFallback.HashParity);
- var dlgSoftFallbackHashUpper = new SoftFallbackHashUpper(SoftFallback.HashUpper);
- var dlgSoftFallbackInverseMixColumns = new SoftFallbackInverseMixColumns(SoftFallback.InverseMixColumns);
- var dlgSoftFallbackMixColumns = new SoftFallbackMixColumns(SoftFallback.MixColumns);
- var dlgSoftFallbackPolynomialMult64_128 = new SoftFallbackPolynomialMult64_128(SoftFallback.PolynomialMult64_128);
- var dlgSoftFallbackSatF32ToS32 = new SoftFallbackSatF32ToS32(SoftFallback.SatF32ToS32);
- var dlgSoftFallbackSatF32ToS64 = new SoftFallbackSatF32ToS64(SoftFallback.SatF32ToS64);
- var dlgSoftFallbackSatF32ToU32 = new SoftFallbackSatF32ToU32(SoftFallback.SatF32ToU32);
- var dlgSoftFallbackSatF32ToU64 = new SoftFallbackSatF32ToU64(SoftFallback.SatF32ToU64);
- var dlgSoftFallbackSatF64ToS32 = new SoftFallbackSatF64ToS32(SoftFallback.SatF64ToS32);
- var dlgSoftFallbackSatF64ToS64 = new SoftFallbackSatF64ToS64(SoftFallback.SatF64ToS64);
- var dlgSoftFallbackSatF64ToU32 = new SoftFallbackSatF64ToU32(SoftFallback.SatF64ToU32);
- var dlgSoftFallbackSatF64ToU64 = new SoftFallbackSatF64ToU64(SoftFallback.SatF64ToU64);
- var dlgSoftFallbackSha1SchedulePart1 = new SoftFallbackSha1SchedulePart1(SoftFallback.Sha1SchedulePart1);
- var dlgSoftFallbackSha1SchedulePart2 = new SoftFallbackSha1SchedulePart2(SoftFallback.Sha1SchedulePart2);
- var dlgSoftFallbackSha256SchedulePart1 = new SoftFallbackSha256SchedulePart1(SoftFallback.Sha256SchedulePart1);
- var dlgSoftFallbackSha256SchedulePart2 = new SoftFallbackSha256SchedulePart2(SoftFallback.Sha256SchedulePart2);
- var dlgSoftFallbackSignedShrImm64 = new SoftFallbackSignedShrImm64(SoftFallback.SignedShrImm64);
- var dlgSoftFallbackTbl1 = new SoftFallbackTbl1(SoftFallback.Tbl1);
- var dlgSoftFallbackTbl2 = new SoftFallbackTbl2(SoftFallback.Tbl2);
- var dlgSoftFallbackTbl3 = new SoftFallbackTbl3(SoftFallback.Tbl3);
- var dlgSoftFallbackTbl4 = new SoftFallbackTbl4(SoftFallback.Tbl4);
- var dlgSoftFallbackTbx1 = new SoftFallbackTbx1(SoftFallback.Tbx1);
- var dlgSoftFallbackTbx2 = new SoftFallbackTbx2(SoftFallback.Tbx2);
- var dlgSoftFallbackTbx3 = new SoftFallbackTbx3(SoftFallback.Tbx3);
- var dlgSoftFallbackTbx4 = new SoftFallbackTbx4(SoftFallback.Tbx4);
- var dlgSoftFallbackUnsignedShrImm64 = new SoftFallbackUnsignedShrImm64(SoftFallback.UnsignedShrImm64);
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingSigns)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingZeros)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32b)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cb)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32ch)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cw)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cx)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32h)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32w)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32x)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.FixedRotate)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashChoose)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashLower)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashMajority)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashParity)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashUpper)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.PolynomialMult64_128)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShrImm64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl3)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl4)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx3)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx4)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShrImm64)));
- var dlgSoftFloat16_32FPConvert = new SoftFloat16_32FPConvert(SoftFloat16_32.FPConvert);
- var dlgSoftFloat16_64FPConvert = new SoftFloat16_64FPConvert(SoftFloat16_64.FPConvert);
+ SetDelegateInfo(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert)));
+ SetDelegateInfo(typeof(SoftFloat16_64).GetMethod(nameof(SoftFloat16_64.FPConvert)));
- var dlgSoftFloat32FPAdd = new SoftFloat32FPAdd(SoftFloat32.FPAdd);
- var dlgSoftFloat32FPAddFpscr = new SoftFloat32FPAddFpscr(SoftFloat32.FPAddFpscr); // A32 only.
- var dlgSoftFloat32FPCompare = new SoftFloat32FPCompare(SoftFloat32.FPCompare);
- var dlgSoftFloat32FPCompareEQ = new SoftFloat32FPCompareEQ(SoftFloat32.FPCompareEQ);
- var dlgSoftFloat32FPCompareEQFpscr = new SoftFloat32FPCompareEQFpscr(SoftFloat32.FPCompareEQFpscr); // A32 only.
- var dlgSoftFloat32FPCompareGE = new SoftFloat32FPCompareGE(SoftFloat32.FPCompareGE);
- var dlgSoftFloat32FPCompareGEFpscr = new SoftFloat32FPCompareGEFpscr(SoftFloat32.FPCompareGEFpscr); // A32 only.
- var dlgSoftFloat32FPCompareGT = new SoftFloat32FPCompareGT(SoftFloat32.FPCompareGT);
- var dlgSoftFloat32FPCompareGTFpscr = new SoftFloat32FPCompareGTFpscr(SoftFloat32.FPCompareGTFpscr); // A32 only.
- var dlgSoftFloat32FPCompareLE = new SoftFloat32FPCompareLE(SoftFloat32.FPCompareLE);
- var dlgSoftFloat32FPCompareLEFpscr = new SoftFloat32FPCompareLEFpscr(SoftFloat32.FPCompareLEFpscr); // A32 only.
- var dlgSoftFloat32FPCompareLT = new SoftFloat32FPCompareLT(SoftFloat32.FPCompareLT);
- var dlgSoftFloat32FPCompareLTFpscr = new SoftFloat32FPCompareLTFpscr(SoftFloat32.FPCompareLTFpscr); // A32 only.
- var dlgSoftFloat32FPDiv = new SoftFloat32FPDiv(SoftFloat32.FPDiv);
- var dlgSoftFloat32FPMax = new SoftFloat32FPMax(SoftFloat32.FPMax);
- var dlgSoftFloat32FPMaxFpscr = new SoftFloat32FPMaxFpscr(SoftFloat32.FPMaxFpscr); // A32 only.
- var dlgSoftFloat32FPMaxNum = new SoftFloat32FPMaxNum(SoftFloat32.FPMaxNum);
- var dlgSoftFloat32FPMaxNumFpscr = new SoftFloat32FPMaxNumFpscr(SoftFloat32.FPMaxNumFpscr); // A32 only.
- var dlgSoftFloat32FPMin = new SoftFloat32FPMin(SoftFloat32.FPMin);
- var dlgSoftFloat32FPMinFpscr = new SoftFloat32FPMinFpscr(SoftFloat32.FPMinFpscr); // A32 only.
- var dlgSoftFloat32FPMinNum = new SoftFloat32FPMinNum(SoftFloat32.FPMinNum);
- var dlgSoftFloat32FPMinNumFpscr = new SoftFloat32FPMinNumFpscr(SoftFloat32.FPMinNumFpscr); // A32 only.
- var dlgSoftFloat32FPMul = new SoftFloat32FPMul(SoftFloat32.FPMul);
- var dlgSoftFloat32FPMulFpscr = new SoftFloat32FPMulFpscr(SoftFloat32.FPMulFpscr); // A32 only.
- var dlgSoftFloat32FPMulAdd = new SoftFloat32FPMulAdd(SoftFloat32.FPMulAdd);
- var dlgSoftFloat32FPMulAddFpscr = new SoftFloat32FPMulAddFpscr(SoftFloat32.FPMulAddFpscr); // A32 only.
- var dlgSoftFloat32FPMulSub = new SoftFloat32FPMulSub(SoftFloat32.FPMulSub);
- var dlgSoftFloat32FPMulSubFpscr = new SoftFloat32FPMulSubFpscr(SoftFloat32.FPMulSubFpscr); // A32 only.
- var dlgSoftFloat32FPMulX = new SoftFloat32FPMulX(SoftFloat32.FPMulX);
- var dlgSoftFloat32FPNegMulAdd = new SoftFloat32FPNegMulAdd(SoftFloat32.FPNegMulAdd);
- var dlgSoftFloat32FPNegMulSub = new SoftFloat32FPNegMulSub(SoftFloat32.FPNegMulSub);
- var dlgSoftFloat32FPRecipEstimate = new SoftFloat32FPRecipEstimate(SoftFloat32.FPRecipEstimate);
- var dlgSoftFloat32FPRecipEstimateFpscr = new SoftFloat32FPRecipEstimateFpscr(SoftFloat32.FPRecipEstimateFpscr); // A32 only.
- var dlgSoftFloat32FPRecipStep = new SoftFloat32FPRecipStep(SoftFloat32.FPRecipStep); // A32 only.
- var dlgSoftFloat32FPRecipStepFused = new SoftFloat32FPRecipStepFused(SoftFloat32.FPRecipStepFused);
- var dlgSoftFloat32FPRecpX = new SoftFloat32FPRecpX(SoftFloat32.FPRecpX);
- var dlgSoftFloat32FPRSqrtEstimate = new SoftFloat32FPRSqrtEstimate(SoftFloat32.FPRSqrtEstimate);
- var dlgSoftFloat32FPRSqrtEstimateFpscr = new SoftFloat32FPRSqrtEstimateFpscr(SoftFloat32.FPRSqrtEstimateFpscr); // A32 only.
- var dlgSoftFloat32FPRSqrtStep = new SoftFloat32FPRSqrtStep(SoftFloat32.FPRSqrtStep); // A32 only.
- var dlgSoftFloat32FPRSqrtStepFused = new SoftFloat32FPRSqrtStepFused(SoftFloat32.FPRSqrtStepFused);
- var dlgSoftFloat32FPSqrt = new SoftFloat32FPSqrt(SoftFloat32.FPSqrt);
- var dlgSoftFloat32FPSub = new SoftFloat32FPSub(SoftFloat32.FPSub);
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAdd)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompare)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQ)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGE)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGT)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLE)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLT)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPDiv)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMax)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNum)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMin)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNum)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMul)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSub)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSubFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulX)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulSub)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimate)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStepFused)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecpX)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimate)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStepFused)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSqrt)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSub)));
- var dlgSoftFloat32_16FPConvert = new SoftFloat32_16FPConvert(SoftFloat32_16.FPConvert);
+ SetDelegateInfo(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert)));
- var dlgSoftFloat64FPAdd = new SoftFloat64FPAdd(SoftFloat64.FPAdd);
- var dlgSoftFloat64FPAddFpscr = new SoftFloat64FPAddFpscr(SoftFloat64.FPAddFpscr); // A32 only.
- var dlgSoftFloat64FPCompare = new SoftFloat64FPCompare(SoftFloat64.FPCompare);
- var dlgSoftFloat64FPCompareEQ = new SoftFloat64FPCompareEQ(SoftFloat64.FPCompareEQ);
- var dlgSoftFloat64FPCompareEQFpscr = new SoftFloat64FPCompareEQFpscr(SoftFloat64.FPCompareEQFpscr); // A32 only.
- var dlgSoftFloat64FPCompareGE = new SoftFloat64FPCompareGE(SoftFloat64.FPCompareGE);
- var dlgSoftFloat64FPCompareGEFpscr = new SoftFloat64FPCompareGEFpscr(SoftFloat64.FPCompareGEFpscr); // A32 only.
- var dlgSoftFloat64FPCompareGT = new SoftFloat64FPCompareGT(SoftFloat64.FPCompareGT);
- var dlgSoftFloat64FPCompareGTFpscr = new SoftFloat64FPCompareGTFpscr(SoftFloat64.FPCompareGTFpscr); // A32 only.
- var dlgSoftFloat64FPCompareLE = new SoftFloat64FPCompareLE(SoftFloat64.FPCompareLE);
- var dlgSoftFloat64FPCompareLEFpscr = new SoftFloat64FPCompareLEFpscr(SoftFloat64.FPCompareLEFpscr); // A32 only.
- var dlgSoftFloat64FPCompareLT = new SoftFloat64FPCompareLT(SoftFloat64.FPCompareLT);
- var dlgSoftFloat64FPCompareLTFpscr = new SoftFloat64FPCompareLTFpscr(SoftFloat64.FPCompareLTFpscr); // A32 only.
- var dlgSoftFloat64FPDiv = new SoftFloat64FPDiv(SoftFloat64.FPDiv);
- var dlgSoftFloat64FPMax = new SoftFloat64FPMax(SoftFloat64.FPMax);
- var dlgSoftFloat64FPMaxFpscr = new SoftFloat64FPMaxFpscr(SoftFloat64.FPMaxFpscr); // A32 only.
- var dlgSoftFloat64FPMaxNum = new SoftFloat64FPMaxNum(SoftFloat64.FPMaxNum);
- var dlgSoftFloat64FPMaxNumFpscr = new SoftFloat64FPMaxNumFpscr(SoftFloat64.FPMaxNumFpscr); // A32 only.
- var dlgSoftFloat64FPMin = new SoftFloat64FPMin(SoftFloat64.FPMin);
- var dlgSoftFloat64FPMinFpscr = new SoftFloat64FPMinFpscr(SoftFloat64.FPMinFpscr); // A32 only.
- var dlgSoftFloat64FPMinNum = new SoftFloat64FPMinNum(SoftFloat64.FPMinNum);
- var dlgSoftFloat64FPMinNumFpscr = new SoftFloat64FPMinNumFpscr(SoftFloat64.FPMinNumFpscr); // A32 only.
- var dlgSoftFloat64FPMul = new SoftFloat64FPMul(SoftFloat64.FPMul);
- var dlgSoftFloat64FPMulFpscr = new SoftFloat64FPMulFpscr(SoftFloat64.FPMulFpscr); // A32 only.
- var dlgSoftFloat64FPMulAdd = new SoftFloat64FPMulAdd(SoftFloat64.FPMulAdd);
- var dlgSoftFloat64FPMulAddFpscr = new SoftFloat64FPMulAddFpscr(SoftFloat64.FPMulAddFpscr); // A32 only.
- var dlgSoftFloat64FPMulSub = new SoftFloat64FPMulSub(SoftFloat64.FPMulSub);
- var dlgSoftFloat64FPMulSubFpscr = new SoftFloat64FPMulSubFpscr(SoftFloat64.FPMulSubFpscr); // A32 only.
- var dlgSoftFloat64FPMulX = new SoftFloat64FPMulX(SoftFloat64.FPMulX);
- var dlgSoftFloat64FPNegMulAdd = new SoftFloat64FPNegMulAdd(SoftFloat64.FPNegMulAdd);
- var dlgSoftFloat64FPNegMulSub = new SoftFloat64FPNegMulSub(SoftFloat64.FPNegMulSub);
- var dlgSoftFloat64FPRecipEstimate = new SoftFloat64FPRecipEstimate(SoftFloat64.FPRecipEstimate);
- var dlgSoftFloat64FPRecipEstimateFpscr = new SoftFloat64FPRecipEstimateFpscr(SoftFloat64.FPRecipEstimateFpscr); // A32 only.
- var dlgSoftFloat64FPRecipStep = new SoftFloat64FPRecipStep(SoftFloat64.FPRecipStep); // A32 only.
- var dlgSoftFloat64FPRecipStepFused = new SoftFloat64FPRecipStepFused(SoftFloat64.FPRecipStepFused);
- var dlgSoftFloat64FPRecpX = new SoftFloat64FPRecpX(SoftFloat64.FPRecpX);
- var dlgSoftFloat64FPRSqrtEstimate = new SoftFloat64FPRSqrtEstimate(SoftFloat64.FPRSqrtEstimate);
- var dlgSoftFloat64FPRSqrtEstimateFpscr = new SoftFloat64FPRSqrtEstimateFpscr(SoftFloat64.FPRSqrtEstimateFpscr); // A32 only.
- var dlgSoftFloat64FPRSqrtStep = new SoftFloat64FPRSqrtStep(SoftFloat64.FPRSqrtStep); // A32 only.
- var dlgSoftFloat64FPRSqrtStepFused = new SoftFloat64FPRSqrtStepFused(SoftFloat64.FPRSqrtStepFused);
- var dlgSoftFloat64FPSqrt = new SoftFloat64FPSqrt(SoftFloat64.FPSqrt);
- var dlgSoftFloat64FPSub = new SoftFloat64FPSub(SoftFloat64.FPSub);
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAdd)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompare)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQ)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGE)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGT)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLE)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLT)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPDiv)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMax)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNum)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMin)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNum)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMul)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSub)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSubFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulX)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulSub)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimate)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStepFused)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecpX)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimate)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStepFused)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSqrt)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSub)));
- var dlgSoftFloat64_16FPConvert = new SoftFloat64_16FPConvert(SoftFloat64_16.FPConvert);
-
- SetDelegateInfo(dlgMathAbs, Marshal.GetFunctionPointerForDelegate(dlgMathAbs));
- SetDelegateInfo(dlgMathCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathCeiling));
- SetDelegateInfo(dlgMathFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFloor));
- SetDelegateInfo(dlgMathRound, Marshal.GetFunctionPointerForDelegate(dlgMathRound));
- SetDelegateInfo(dlgMathTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathTruncate));
-
- SetDelegateInfo(dlgMathFAbs, Marshal.GetFunctionPointerForDelegate(dlgMathFAbs));
- SetDelegateInfo(dlgMathFCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathFCeiling));
- SetDelegateInfo(dlgMathFFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFFloor));
- SetDelegateInfo(dlgMathFRound, Marshal.GetFunctionPointerForDelegate(dlgMathFRound));
- SetDelegateInfo(dlgMathFTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathFTruncate));
-
- SetDelegateInfo(dlgNativeInterfaceBreak, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceBreak));
- SetDelegateInfo(dlgNativeInterfaceCheckSynchronization, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceCheckSynchronization));
- SetDelegateInfo(dlgNativeInterfaceEnqueueForRejit, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceEnqueueForRejit));
- SetDelegateInfo(dlgNativeInterfaceGetCntfrqEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntfrqEl0));
- SetDelegateInfo(dlgNativeInterfaceGetCntpctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntpctEl0));
- SetDelegateInfo(dlgNativeInterfaceGetCntvctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntvctEl0));
- SetDelegateInfo(dlgNativeInterfaceGetCtrEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCtrEl0));
- SetDelegateInfo(dlgNativeInterfaceGetDczidEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetDczidEl0));
- SetDelegateInfo(dlgNativeInterfaceGetFunctionAddress, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetFunctionAddress));
- SetDelegateInfo(dlgNativeInterfaceInvalidateCacheLine, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceInvalidateCacheLine));
- SetDelegateInfo(dlgNativeInterfaceReadByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadByte));
- SetDelegateInfo(dlgNativeInterfaceReadUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt16));
- SetDelegateInfo(dlgNativeInterfaceReadUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt32));
- SetDelegateInfo(dlgNativeInterfaceReadUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt64));
- SetDelegateInfo(dlgNativeInterfaceReadVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadVector128));
- SetDelegateInfo(dlgNativeInterfaceSignalMemoryTracking, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSignalMemoryTracking));
- SetDelegateInfo(dlgNativeInterfaceSupervisorCall, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSupervisorCall));
- SetDelegateInfo(dlgNativeInterfaceThrowInvalidMemoryAccess, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceThrowInvalidMemoryAccess));
- SetDelegateInfo(dlgNativeInterfaceUndefined, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceUndefined));
- SetDelegateInfo(dlgNativeInterfaceWriteByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteByte));
- SetDelegateInfo(dlgNativeInterfaceWriteUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt16));
- SetDelegateInfo(dlgNativeInterfaceWriteUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt32));
- SetDelegateInfo(dlgNativeInterfaceWriteUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt64));
- SetDelegateInfo(dlgNativeInterfaceWriteVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteVector128));
-
- SetDelegateInfo(dlgSoftFallbackCountLeadingSigns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingSigns));
- SetDelegateInfo(dlgSoftFallbackCountLeadingZeros, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingZeros));
- SetDelegateInfo(dlgSoftFallbackCrc32b, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32b));
- SetDelegateInfo(dlgSoftFallbackCrc32cb, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cb));
- SetDelegateInfo(dlgSoftFallbackCrc32ch, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32ch));
- SetDelegateInfo(dlgSoftFallbackCrc32cw, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cw));
- SetDelegateInfo(dlgSoftFallbackCrc32cx, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cx));
- SetDelegateInfo(dlgSoftFallbackCrc32h, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32h));
- SetDelegateInfo(dlgSoftFallbackCrc32w, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32w));
- SetDelegateInfo(dlgSoftFallbackCrc32x, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32x));
- SetDelegateInfo(dlgSoftFallbackDecrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackDecrypt));
- SetDelegateInfo(dlgSoftFallbackEncrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackEncrypt));
- SetDelegateInfo(dlgSoftFallbackFixedRotate, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackFixedRotate));
- SetDelegateInfo(dlgSoftFallbackHashChoose, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashChoose));
- SetDelegateInfo(dlgSoftFallbackHashLower, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashLower));
- SetDelegateInfo(dlgSoftFallbackHashMajority, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashMajority));
- SetDelegateInfo(dlgSoftFallbackHashParity, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashParity));
- SetDelegateInfo(dlgSoftFallbackHashUpper, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashUpper));
- SetDelegateInfo(dlgSoftFallbackInverseMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackInverseMixColumns));
- SetDelegateInfo(dlgSoftFallbackMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackMixColumns));
- SetDelegateInfo(dlgSoftFallbackPolynomialMult64_128, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackPolynomialMult64_128));
- SetDelegateInfo(dlgSoftFallbackSatF32ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS32));
- SetDelegateInfo(dlgSoftFallbackSatF32ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS64));
- SetDelegateInfo(dlgSoftFallbackSatF32ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU32));
- SetDelegateInfo(dlgSoftFallbackSatF32ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU64));
- SetDelegateInfo(dlgSoftFallbackSatF64ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS32));
- SetDelegateInfo(dlgSoftFallbackSatF64ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS64));
- SetDelegateInfo(dlgSoftFallbackSatF64ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU32));
- SetDelegateInfo(dlgSoftFallbackSatF64ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU64));
- SetDelegateInfo(dlgSoftFallbackSha1SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart1));
- SetDelegateInfo(dlgSoftFallbackSha1SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart2));
- SetDelegateInfo(dlgSoftFallbackSha256SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart1));
- SetDelegateInfo(dlgSoftFallbackSha256SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart2));
- SetDelegateInfo(dlgSoftFallbackSignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSignedShrImm64));
- SetDelegateInfo(dlgSoftFallbackTbl1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl1));
- SetDelegateInfo(dlgSoftFallbackTbl2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl2));
- SetDelegateInfo(dlgSoftFallbackTbl3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl3));
- SetDelegateInfo(dlgSoftFallbackTbl4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl4));
- SetDelegateInfo(dlgSoftFallbackTbx1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx1));
- SetDelegateInfo(dlgSoftFallbackTbx2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx2));
- SetDelegateInfo(dlgSoftFallbackTbx3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx3));
- SetDelegateInfo(dlgSoftFallbackTbx4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx4));
- SetDelegateInfo(dlgSoftFallbackUnsignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackUnsignedShrImm64));
-
- SetDelegateInfo(dlgSoftFloat16_32FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_32FPConvert));
- SetDelegateInfo(dlgSoftFloat16_64FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_64FPConvert));
-
- SetDelegateInfo(dlgSoftFloat32FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAdd));
- SetDelegateInfo(dlgSoftFloat32FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompare));
- SetDelegateInfo(dlgSoftFloat32FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQ));
- SetDelegateInfo(dlgSoftFloat32FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGE));
- SetDelegateInfo(dlgSoftFloat32FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGT));
- SetDelegateInfo(dlgSoftFloat32FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLE));
- SetDelegateInfo(dlgSoftFloat32FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLT));
- SetDelegateInfo(dlgSoftFloat32FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPDiv));
- SetDelegateInfo(dlgSoftFloat32FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMax));
- SetDelegateInfo(dlgSoftFloat32FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNum));
- SetDelegateInfo(dlgSoftFloat32FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMin));
- SetDelegateInfo(dlgSoftFloat32FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNum));
- SetDelegateInfo(dlgSoftFloat32FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMul));
- SetDelegateInfo(dlgSoftFloat32FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAdd));
- SetDelegateInfo(dlgSoftFloat32FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSub));
- SetDelegateInfo(dlgSoftFloat32FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSubFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulX));
- SetDelegateInfo(dlgSoftFloat32FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulAdd));
- SetDelegateInfo(dlgSoftFloat32FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulSub));
- SetDelegateInfo(dlgSoftFloat32FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimate));
- SetDelegateInfo(dlgSoftFloat32FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStepFused));
- SetDelegateInfo(dlgSoftFloat32FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecpX));
- SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimate));
- SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStepFused));
- SetDelegateInfo(dlgSoftFloat32FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSqrt));
- SetDelegateInfo(dlgSoftFloat32FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSub));
-
- SetDelegateInfo(dlgSoftFloat32_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32_16FPConvert));
-
- SetDelegateInfo(dlgSoftFloat64FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAdd));
- SetDelegateInfo(dlgSoftFloat64FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompare));
- SetDelegateInfo(dlgSoftFloat64FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQ));
- SetDelegateInfo(dlgSoftFloat64FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGE));
- SetDelegateInfo(dlgSoftFloat64FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGT));
- SetDelegateInfo(dlgSoftFloat64FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLE));
- SetDelegateInfo(dlgSoftFloat64FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLT));
- SetDelegateInfo(dlgSoftFloat64FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPDiv));
- SetDelegateInfo(dlgSoftFloat64FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMax));
- SetDelegateInfo(dlgSoftFloat64FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNum));
- SetDelegateInfo(dlgSoftFloat64FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMin));
- SetDelegateInfo(dlgSoftFloat64FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNum));
- SetDelegateInfo(dlgSoftFloat64FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMul));
- SetDelegateInfo(dlgSoftFloat64FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAdd));
- SetDelegateInfo(dlgSoftFloat64FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSub));
- SetDelegateInfo(dlgSoftFloat64FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSubFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulX));
- SetDelegateInfo(dlgSoftFloat64FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulAdd));
- SetDelegateInfo(dlgSoftFloat64FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulSub));
- SetDelegateInfo(dlgSoftFloat64FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimate));
- SetDelegateInfo(dlgSoftFloat64FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStepFused));
- SetDelegateInfo(dlgSoftFloat64FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecpX));
- SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimate));
- SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStepFused));
- SetDelegateInfo(dlgSoftFloat64FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSqrt));
- SetDelegateInfo(dlgSoftFloat64FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSub));
-
- SetDelegateInfo(dlgSoftFloat64_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64_16FPConvert));
+ SetDelegateInfo(typeof(SoftFloat64_16).GetMethod(nameof(SoftFloat64_16.FPConvert)));
}
-
- private delegate double MathAbs(double value);
- private delegate double MathCeiling(double a);
- private delegate double MathFloor(double d);
- private delegate double MathRound(double value, MidpointRounding mode);
- private delegate double MathTruncate(double d);
-
- private delegate float MathFAbs(float x);
- private delegate float MathFCeiling(float x);
- private delegate float MathFFloor(float x);
- private delegate float MathFRound(float x, MidpointRounding mode);
- private delegate float MathFTruncate(float x);
-
- private delegate void NativeInterfaceBreak(ulong address, int imm);
- private delegate bool NativeInterfaceCheckSynchronization();
- private delegate void NativeInterfaceEnqueueForRejit(ulong address);
- private delegate ulong NativeInterfaceGetCntfrqEl0();
- private delegate ulong NativeInterfaceGetCntpctEl0();
- private delegate ulong NativeInterfaceGetCntvctEl0();
- private delegate ulong NativeInterfaceGetCtrEl0();
- private delegate ulong NativeInterfaceGetDczidEl0();
- private delegate ulong NativeInterfaceGetFunctionAddress(ulong address);
- private delegate void NativeInterfaceInvalidateCacheLine(ulong address);
- private delegate byte NativeInterfaceReadByte(ulong address);
- private delegate ushort NativeInterfaceReadUInt16(ulong address);
- private delegate uint NativeInterfaceReadUInt32(ulong address);
- private delegate ulong NativeInterfaceReadUInt64(ulong address);
- private delegate V128 NativeInterfaceReadVector128(ulong address);
- private delegate void NativeInterfaceSignalMemoryTracking(ulong address, ulong size, bool write);
- private delegate void NativeInterfaceSupervisorCall(ulong address, int imm);
- private delegate void NativeInterfaceThrowInvalidMemoryAccess(ulong address);
- private delegate void NativeInterfaceUndefined(ulong address, int opCode);
- private delegate void NativeInterfaceWriteByte(ulong address, byte value);
- private delegate void NativeInterfaceWriteUInt16(ulong address, ushort value);
- private delegate void NativeInterfaceWriteUInt32(ulong address, uint value);
- private delegate void NativeInterfaceWriteUInt64(ulong address, ulong value);
- private delegate void NativeInterfaceWriteVector128(ulong address, V128 value);
-
- private delegate ulong SoftFallbackCountLeadingSigns(ulong value, int size);
- private delegate ulong SoftFallbackCountLeadingZeros(ulong value, int size);
- private delegate uint SoftFallbackCrc32b(uint crc, byte value);
- private delegate uint SoftFallbackCrc32cb(uint crc, byte value);
- private delegate uint SoftFallbackCrc32ch(uint crc, ushort value);
- private delegate uint SoftFallbackCrc32cw(uint crc, uint value);
- private delegate uint SoftFallbackCrc32cx(uint crc, ulong value);
- private delegate uint SoftFallbackCrc32h(uint crc, ushort value);
- private delegate uint SoftFallbackCrc32w(uint crc, uint value);
- private delegate uint SoftFallbackCrc32x(uint crc, ulong value);
- private delegate V128 SoftFallbackDecrypt(V128 value, V128 roundKey);
- private delegate V128 SoftFallbackEncrypt(V128 value, V128 roundKey);
- private delegate uint SoftFallbackFixedRotate(uint hash_e);
- private delegate V128 SoftFallbackHashChoose(V128 hash_abcd, uint hash_e, V128 wk);
- private delegate V128 SoftFallbackHashLower(V128 hash_abcd, V128 hash_efgh, V128 wk);
- private delegate V128 SoftFallbackHashMajority(V128 hash_abcd, uint hash_e, V128 wk);
- private delegate V128 SoftFallbackHashParity(V128 hash_abcd, uint hash_e, V128 wk);
- private delegate V128 SoftFallbackHashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk);
- private delegate V128 SoftFallbackInverseMixColumns(V128 value);
- private delegate V128 SoftFallbackMixColumns(V128 value);
- private delegate V128 SoftFallbackPolynomialMult64_128(ulong op1, ulong op2);
- private delegate int SoftFallbackSatF32ToS32(float value);
- private delegate long SoftFallbackSatF32ToS64(float value);
- private delegate uint SoftFallbackSatF32ToU32(float value);
- private delegate ulong SoftFallbackSatF32ToU64(float value);
- private delegate int SoftFallbackSatF64ToS32(double value);
- private delegate long SoftFallbackSatF64ToS64(double value);
- private delegate uint SoftFallbackSatF64ToU32(double value);
- private delegate ulong SoftFallbackSatF64ToU64(double value);
- private delegate V128 SoftFallbackSha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11);
- private delegate V128 SoftFallbackSha1SchedulePart2(V128 tw0_3, V128 w12_15);
- private delegate V128 SoftFallbackSha256SchedulePart1(V128 w0_3, V128 w4_7);
- private delegate V128 SoftFallbackSha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15);
- private delegate long SoftFallbackSignedShrImm64(long value, long roundConst, int shift);
- private delegate V128 SoftFallbackTbl1(V128 vector, int bytes, V128 tb0);
- private delegate V128 SoftFallbackTbl2(V128 vector, int bytes, V128 tb0, V128 tb1);
- private delegate V128 SoftFallbackTbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2);
- private delegate V128 SoftFallbackTbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3);
- private delegate V128 SoftFallbackTbx1(V128 dest, V128 vector, int bytes, V128 tb0);
- private delegate V128 SoftFallbackTbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1);
- private delegate V128 SoftFallbackTbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2);
- private delegate V128 SoftFallbackTbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3);
- private delegate ulong SoftFallbackUnsignedShrImm64(ulong value, long roundConst, int shift);
-
- private delegate float SoftFloat16_32FPConvert(ushort valueBits);
-
- private delegate double SoftFloat16_64FPConvert(ushort valueBits);
-
- private delegate float SoftFloat32FPAdd(float value1, float value2);
- private delegate float SoftFloat32FPAddFpscr(float value1, float value2, bool standardFpscr);
- private delegate int SoftFloat32FPCompare(float value1, float value2, bool signalNaNs);
- private delegate float SoftFloat32FPCompareEQ(float value1, float value2);
- private delegate float SoftFloat32FPCompareEQFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareGE(float value1, float value2);
- private delegate float SoftFloat32FPCompareGEFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareGT(float value1, float value2);
- private delegate float SoftFloat32FPCompareGTFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareLE(float value1, float value2);
- private delegate float SoftFloat32FPCompareLEFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareLT(float value1, float value2);
- private delegate float SoftFloat32FPCompareLTFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPDiv(float value1, float value2);
- private delegate float SoftFloat32FPMax(float value1, float value2);
- private delegate float SoftFloat32FPMaxFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMaxNum(float value1, float value2);
- private delegate float SoftFloat32FPMaxNumFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMin(float value1, float value2);
- private delegate float SoftFloat32FPMinFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMinNum(float value1, float value2);
- private delegate float SoftFloat32FPMinNumFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMul(float value1, float value2);
- private delegate float SoftFloat32FPMulFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMulAdd(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMulSub(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMulX(float value1, float value2);
- private delegate float SoftFloat32FPNegMulAdd(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPNegMulSub(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPRecipEstimate(float value);
- private delegate float SoftFloat32FPRecipEstimateFpscr(float value, bool standardFpscr);
- private delegate float SoftFloat32FPRecipStep(float value1, float value2);
- private delegate float SoftFloat32FPRecipStepFused(float value1, float value2);
- private delegate float SoftFloat32FPRecpX(float value);
- private delegate float SoftFloat32FPRSqrtEstimate(float value);
- private delegate float SoftFloat32FPRSqrtEstimateFpscr(float value, bool standardFpscr);
- private delegate float SoftFloat32FPRSqrtStep(float value1, float value2);
- private delegate float SoftFloat32FPRSqrtStepFused(float value1, float value2);
- private delegate float SoftFloat32FPSqrt(float value);
- private delegate float SoftFloat32FPSub(float value1, float value2);
-
- private delegate ushort SoftFloat32_16FPConvert(float value);
-
- private delegate double SoftFloat64FPAdd(double value1, double value2);
- private delegate double SoftFloat64FPAddFpscr(double value1, double value2, bool standardFpscr);
- private delegate int SoftFloat64FPCompare(double value1, double value2, bool signalNaNs);
- private delegate double SoftFloat64FPCompareEQ(double value1, double value2);
- private delegate double SoftFloat64FPCompareEQFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareGE(double value1, double value2);
- private delegate double SoftFloat64FPCompareGEFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareGT(double value1, double value2);
- private delegate double SoftFloat64FPCompareGTFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareLE(double value1, double value2);
- private delegate double SoftFloat64FPCompareLEFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareLT(double value1, double value2);
- private delegate double SoftFloat64FPCompareLTFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPDiv(double value1, double value2);
- private delegate double SoftFloat64FPMax(double value1, double value2);
- private delegate double SoftFloat64FPMaxFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMaxNum(double value1, double value2);
- private delegate double SoftFloat64FPMaxNumFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMin(double value1, double value2);
- private delegate double SoftFloat64FPMinFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMinNum(double value1, double value2);
- private delegate double SoftFloat64FPMinNumFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMul(double value1, double value2);
- private delegate double SoftFloat64FPMulFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMulAdd(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMulSub(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMulX(double value1, double value2);
- private delegate double SoftFloat64FPNegMulAdd(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPNegMulSub(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPRecipEstimate(double value);
- private delegate double SoftFloat64FPRecipEstimateFpscr(double value, bool standardFpscr);
- private delegate double SoftFloat64FPRecipStep(double value1, double value2);
- private delegate double SoftFloat64FPRecipStepFused(double value1, double value2);
- private delegate double SoftFloat64FPRecpX(double value);
- private delegate double SoftFloat64FPRSqrtEstimate(double value);
- private delegate double SoftFloat64FPRSqrtEstimateFpscr(double value, bool standardFpscr);
- private delegate double SoftFloat64FPRSqrtStep(double value1, double value2);
- private delegate double SoftFloat64FPRSqrtStepFused(double value1, double value2);
- private delegate double SoftFloat64FPSqrt(double value);
- private delegate double SoftFloat64FPSub(double value1, double value2);
-
- private delegate ushort SoftFloat64_16FPConvert(double value);
}
}
diff --git a/src/ARMeilleure/Translation/EmitterContext.cs b/src/ARMeilleure/Translation/EmitterContext.cs
index 22b6b9842..3d800e16f 100644
--- a/src/ARMeilleure/Translation/EmitterContext.cs
+++ b/src/ARMeilleure/Translation/EmitterContext.cs
@@ -97,7 +97,7 @@ namespace ARMeilleure.Translation
public virtual Operand Call(MethodInfo info, params Operand[] callArgs)
{
- nint funcPtr = Delegates.GetDelegateFuncPtr(info);
+ nint funcPtr = info.MethodHandle.GetFunctionPointer();
OperandType returnType = GetOperandType(info.ReturnType);
diff --git a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
index 49335dcb0..d67a852bb 100644
--- a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
+++ b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
@@ -1,4 +1,5 @@
using ARMeilleure.State;
+using Humanizer;
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Memory;
@@ -59,8 +60,8 @@ namespace ARMeilleure.Translation.PTC
{
_ptc = ptc;
- _timer = new Timer(SaveInterval * 1000d);
- _timer.Elapsed += PreSave;
+ _timer = new Timer(SaveInterval.Seconds());
+ _timer.Elapsed += TimerElapsed;
_outerHeaderMagic = BinaryPrimitives.ReadUInt64LittleEndian(EncodingCache.UTF8NoBOM.GetBytes(OuterHeaderMagicString).AsSpan());
@@ -73,6 +74,9 @@ namespace ARMeilleure.Translation.PTC
Enabled = false;
}
+ private void TimerElapsed(object _, ElapsedEventArgs __)
+ => new Thread(PreSave) { Name = "Ptc.DiskWriter" }.Start();
+
public void AddEntry(ulong address, ExecutionMode mode, bool highCq, bool blacklist = false)
{
if (IsAddressInStaticCodeRange(address))
@@ -306,7 +310,7 @@ namespace ARMeilleure.Translation.PTC
compressedStream.SetLength(0L);
}
- private void PreSave(object source, ElapsedEventArgs e)
+ private void PreSave()
{
_waitEvent.Reset();
@@ -494,7 +498,7 @@ namespace ARMeilleure.Translation.PTC
{
_disposed = true;
- _timer.Elapsed -= PreSave;
+ _timer.Elapsed -= TimerElapsed;
_timer.Dispose();
Wait();
diff --git a/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs b/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs
index 3a3c1d1b1..5991b816f 100644
--- a/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs
+++ b/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs
@@ -9,20 +9,12 @@ namespace Ryujinx.Audio.Backends.Dummy
{
public class DummyHardwareDeviceDriver : IHardwareDeviceDriver
{
- private readonly ManualResetEvent _updateRequiredEvent;
- private readonly ManualResetEvent _pauseEvent;
+ private readonly ManualResetEvent _updateRequiredEvent = new(false);
+ private readonly ManualResetEvent _pauseEvent = new(true);
public static bool IsSupported => true;
- public float Volume { get; set; }
-
- public DummyHardwareDeviceDriver()
- {
- _updateRequiredEvent = new ManualResetEvent(false);
- _pauseEvent = new ManualResetEvent(true);
-
- Volume = 1f;
- }
+ public float Volume { get; set; } = 1f;
public IHardwareDeviceSession OpenDeviceSession(Direction direction, IVirtualMemoryManager memoryManager, SampleFormat sampleFormat, uint sampleRate, uint channelCount)
{
@@ -60,7 +52,7 @@ namespace Ryujinx.Audio.Backends.Dummy
Dispose(true);
}
- protected virtual void Dispose(bool disposing)
+ private void Dispose(bool disposing)
{
if (disposing)
{
diff --git a/src/Ryujinx.BuildValidationTasks/IValidationTask.cs b/src/Ryujinx.BuildValidationTasks/IValidationTask.cs
new file mode 100644
index 000000000..682d79a0a
--- /dev/null
+++ b/src/Ryujinx.BuildValidationTasks/IValidationTask.cs
@@ -0,0 +1,7 @@
+namespace Ryujinx.BuildValidationTasks
+{
+ public interface IValidationTask
+ {
+ public bool Execute(string projectPath, bool isGitRunner);
+ }
+}
diff --git a/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs b/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs
new file mode 100644
index 000000000..1f2c39e95
--- /dev/null
+++ b/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.IO;
+using System.Text.Json;
+using System.Text.Encodings.Web;
+
+namespace Ryujinx.BuildValidationTasks
+{
+ public class LocalesValidationTask : IValidationTask
+ {
+ public LocalesValidationTask() { }
+
+ public bool Execute(string projectPath, bool isGitRunner)
+ {
+ Console.WriteLine("Running Locale Validation Task...");
+
+ string path = projectPath + "src/Ryujinx/Assets/locales.json";
+ string data;
+
+ using (StreamReader sr = new(path))
+ {
+ data = sr.ReadToEnd();
+ }
+
+ LocalesJson json;
+
+ if (isGitRunner && data.Contains("\r\n"))
+ throw new FormatException("locales.json is using CRLF line endings! It should be using LF line endings, build locally to fix...");
+
+ try
+ {
+ json = JsonSerializer.Deserialize(data);
+
+ }
+ catch (JsonException e)
+ {
+ throw new JsonException(e.Message); //shorter and easier stacktrace
+ }
+
+
+
+ bool encounteredIssue = false;
+
+ for (int i = 0; i < json.Locales.Count; i++)
+ {
+ LocalesEntry locale = json.Locales[i];
+
+ foreach (string langCode in json.Languages.Where(lang => !locale.Translations.ContainsKey(lang)))
+ {
+ encounteredIssue = true;
+
+ if (!isGitRunner)
+ {
+ locale.Translations.Add(langCode, string.Empty);
+ Console.WriteLine($"Added '{langCode}' to Locale '{locale.ID}'");
+ }
+ else
+ {
+ Console.WriteLine($"Missing '{langCode}' in Locale '{locale.ID}'!");
+ }
+ }
+
+ foreach (string langCode in json.Languages.Where(lang => locale.Translations.ContainsKey(lang) && lang != "en_US" && locale.Translations[lang] == locale.Translations["en_US"]))
+ {
+ encounteredIssue = true;
+
+ if (!isGitRunner)
+ {
+ locale.Translations[langCode] = string.Empty;
+ Console.WriteLine($"Lanugage '{langCode}' is a duplicate of en_US in Locale '{locale.ID}'! Resetting it...");
+ }
+ else
+ {
+ Console.WriteLine($"Lanugage '{langCode}' is a duplicate of en_US in Locale '{locale.ID}'!");
+ }
+ }
+
+ locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
+ json.Locales[i] = locale;
+ }
+
+ if (isGitRunner && encounteredIssue)
+ throw new JsonException("1 or more locales are invalid!");
+
+ JsonSerializerOptions jsonOptions = new JsonSerializerOptions()
+ {
+ WriteIndented = true,
+ NewLine = "\n",
+ Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
+ };
+
+ string jsonString = JsonSerializer.Serialize(json, jsonOptions);
+
+ using (StreamWriter sw = new(path))
+ {
+ sw.Write(jsonString);
+ }
+
+ Console.WriteLine("Finished Locale Validation Task!");
+
+ return true;
+ }
+
+ struct LocalesJson
+ {
+ public List Languages { get; set; }
+ public List Locales { get; set; }
+ }
+
+ struct LocalesEntry
+ {
+ public string ID { get; set; }
+ public Dictionary Translations { get; set; }
+ }
+ }
+}
diff --git a/src/Ryujinx.BuildValidationTasks/Program.cs b/src/Ryujinx.BuildValidationTasks/Program.cs
new file mode 100644
index 000000000..ed1cee490
--- /dev/null
+++ b/src/Ryujinx.BuildValidationTasks/Program.cs
@@ -0,0 +1,37 @@
+using System;
+using System.IO;
+using System.Linq;
+
+namespace Ryujinx.BuildValidationTasks
+{
+ public class Program
+ {
+ static void Main(string[] args)
+ {
+ // Display the number of command line arguments.
+ if (args.Length == 0)
+ throw new ArgumentException("Error: too few arguments!");
+
+ string path = args[0];
+
+ if (string.IsNullOrEmpty(path))
+ throw new ArgumentException("Error: path is null or empty!");
+
+ if (!Path.Exists(path))
+ throw new FileLoadException($"path {{{path}}} does not exist!");
+
+ path = Path.GetFullPath(path);
+
+ if (!Directory.GetDirectories(path).Contains($"{path}src"))
+ throw new FileLoadException($"path {{{path}}} is not a valid ryujinx project!");
+
+ bool isGitRunner = path.Contains("runner") || path.Contains("D:\\a\\Ryujinx\\Ryujinx");
+ if (isGitRunner)
+ Console.WriteLine("Is Git Runner!");
+
+ // Run tasks
+ // Pass extra info needed in the task constructors
+ new LocalesValidationTask().Execute(path, isGitRunner);
+ }
+ }
+}
diff --git a/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj b/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj
new file mode 100644
index 000000000..c9fea9313
--- /dev/null
+++ b/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj
@@ -0,0 +1,17 @@
+
+
+
+ Exe
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs b/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs
index bae6e35de..05dbe67d9 100644
--- a/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs
+++ b/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs
@@ -35,6 +35,8 @@ namespace Ryujinx.Common.Configuration
#pragma warning restore IDE0055
};
}
+
+
public static float ToFloatY(this AspectRatio aspectRatio)
{
diff --git a/src/Ryujinx.Common/Configuration/DirtyHack.cs b/src/Ryujinx.Common/Configuration/DirtyHack.cs
new file mode 100644
index 000000000..9ab9a26a5
--- /dev/null
+++ b/src/Ryujinx.Common/Configuration/DirtyHack.cs
@@ -0,0 +1,60 @@
+using Gommon;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Ryujinx.Common.Configuration
+{
+ [Flags]
+ public enum DirtyHack : byte
+ {
+ Xc2MenuSoftlockFix = 1,
+ ShaderTranslationDelay = 2
+ }
+
+ public readonly struct EnabledDirtyHack(DirtyHack hack, int value)
+ {
+ public DirtyHack Hack => hack;
+ public int Value => value;
+
+
+
+ public ulong Pack() => Raw.PackBitFields(PackedFormat);
+
+ public static EnabledDirtyHack Unpack(ulong packedHack)
+ {
+ var unpackedFields = packedHack.UnpackBitFields(PackedFormat);
+ if (unpackedFields is not [var hack, var value])
+ throw new Exception("The unpack operation on the integer resulted in an invalid unpacked result.");
+
+ return new EnabledDirtyHack((DirtyHack)hack, (int)value);
+ }
+
+ private uint[] Raw => [(uint)Hack, (uint)Value.CoerceAtLeast(0)];
+
+ public static readonly byte[] PackedFormat = [8, 32];
+ }
+
+ public class DirtyHacks : Dictionary
+ {
+ public DirtyHacks(IEnumerable hacks)
+ => hacks.ForEach(edh => Add(edh.Hack, edh.Value));
+
+ public DirtyHacks(ulong[] packedHacks) : this(packedHacks.Select(EnabledDirtyHack.Unpack)) {}
+
+ public ulong[] PackEntries()
+ => Entries.Select(it => it.Pack()).ToArray();
+
+ public EnabledDirtyHack[] Entries
+ => this
+ .Select(it => new EnabledDirtyHack(it.Key, it.Value))
+ .ToArray();
+
+ public static implicit operator DirtyHacks(EnabledDirtyHack[] hacks) => new(hacks);
+ public static implicit operator DirtyHacks(ulong[] packedHacks) => new(packedHacks);
+
+ public new int this[DirtyHack hack] => TryGetValue(hack, out var value) ? value : -1;
+
+ public bool IsEnabled(DirtyHack hack) => ContainsKey(hack);
+ }
+}
diff --git a/src/Ryujinx.Common/Configuration/GraphicsBackend.cs b/src/Ryujinx.Common/Configuration/GraphicsBackend.cs
index e3b4f91b0..9d399d560 100644
--- a/src/Ryujinx.Common/Configuration/GraphicsBackend.cs
+++ b/src/Ryujinx.Common/Configuration/GraphicsBackend.cs
@@ -6,7 +6,9 @@ namespace Ryujinx.Common.Configuration
[JsonConverter(typeof(TypedStringEnumConverter))]
public enum GraphicsBackend
{
+ Auto,
Vulkan,
OpenGl,
+ Metal
}
}
diff --git a/src/Ryujinx.Common/Configuration/ScalingFilter.cs b/src/Ryujinx.Common/Configuration/ScalingFilter.cs
index 1c6a74b3a..474685d49 100644
--- a/src/Ryujinx.Common/Configuration/ScalingFilter.cs
+++ b/src/Ryujinx.Common/Configuration/ScalingFilter.cs
@@ -9,5 +9,6 @@ namespace Ryujinx.Common.Configuration
Bilinear,
Nearest,
Fsr,
+ Area,
}
}
diff --git a/src/Ryujinx.Common/Extensions/StreamExtensions.cs b/src/Ryujinx.Common/Extensions/StreamExtensions.cs
index 4b02781c9..59ff44edc 100644
--- a/src/Ryujinx.Common/Extensions/StreamExtensions.cs
+++ b/src/Ryujinx.Common/Extensions/StreamExtensions.cs
@@ -8,10 +8,10 @@ namespace Ryujinx.Common
public static class StreamExtensions
{
///
- /// Writes a to this stream.
+ /// Writes an int span to this stream.
///
/// This default implementation converts each buffer value to a stack-allocated
- /// byte array, then writes it to the Stream using .
+ /// byte array, then writes it to the Stream using .
///
/// The stream to be written to
/// The buffer of values to be written
diff --git a/src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs
similarity index 98%
rename from src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs
rename to src/Ryujinx.Common/Helpers/ConsoleHelper.cs
index 99b209c6e..105c9881e 100644
--- a/src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs
+++ b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs
@@ -3,7 +3,7 @@ using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
-namespace Ryujinx.UI.Common.Helper
+namespace Ryujinx.Common.Helper
{
public static partial class ConsoleHelper
{
diff --git a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs
similarity index 97%
rename from src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs
rename to src/Ryujinx.Common/Helpers/FileAssociationHelper.cs
index 9333a1b76..476aee228 100644
--- a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs
+++ b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs
@@ -8,7 +8,7 @@ using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
-namespace Ryujinx.UI.Common.Helper
+namespace Ryujinx.Common.Helper
{
public static partial class FileAssociationHelper
{
@@ -23,7 +23,7 @@ namespace Ryujinx.UI.Common.Helper
[LibraryImport("shell32.dll", SetLastError = true)]
public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2);
- public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild;
+ public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows());
public static bool AreMimeTypesRegistered
{
@@ -132,7 +132,7 @@ namespace Ryujinx.UI.Common.Helper
if (uninstall)
{
- // If the types don't already exist, there's nothing to do and we can call this operation successful.
+ // If the types don't already exist, there's nothing to do, and we can call this operation successful.
if (!AreMimeTypesRegisteredWindows())
{
return true;
diff --git a/src/Ryujinx.UI.Common/Helper/LinuxHelper.cs b/src/Ryujinx.Common/Helpers/LinuxHelper.cs
similarity index 98%
rename from src/Ryujinx.UI.Common/Helper/LinuxHelper.cs
rename to src/Ryujinx.Common/Helpers/LinuxHelper.cs
index b57793791..2adfd20f8 100644
--- a/src/Ryujinx.UI.Common/Helper/LinuxHelper.cs
+++ b/src/Ryujinx.Common/Helpers/LinuxHelper.cs
@@ -3,7 +3,7 @@ using System.Diagnostics;
using System.IO;
using System.Runtime.Versioning;
-namespace Ryujinx.UI.Common.Helper
+namespace Ryujinx.Common.Helper
{
[SupportedOSPlatform("linux")]
public static class LinuxHelper
diff --git a/src/Ryujinx.UI.Common/Helper/ObjectiveC.cs b/src/Ryujinx.Common/Helpers/ObjectiveC.cs
similarity index 99%
rename from src/Ryujinx.UI.Common/Helper/ObjectiveC.cs
rename to src/Ryujinx.Common/Helpers/ObjectiveC.cs
index f8f972098..d8e02f54d 100644
--- a/src/Ryujinx.UI.Common/Helper/ObjectiveC.cs
+++ b/src/Ryujinx.Common/Helpers/ObjectiveC.cs
@@ -2,7 +2,7 @@ using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
-namespace Ryujinx.UI.Common.Helper
+namespace Ryujinx.Common.Helper
{
[SupportedOSPlatform("macos")]
public static partial class ObjectiveC
diff --git a/src/Ryujinx.UI.Common/Helper/OpenHelper.cs b/src/Ryujinx.Common/Helpers/OpenHelper.cs
similarity index 97%
rename from src/Ryujinx.UI.Common/Helper/OpenHelper.cs
rename to src/Ryujinx.Common/Helpers/OpenHelper.cs
index 8b0e1f1fd..6a54b69f3 100644
--- a/src/Ryujinx.UI.Common/Helper/OpenHelper.cs
+++ b/src/Ryujinx.Common/Helpers/OpenHelper.cs
@@ -1,10 +1,11 @@
+using Gommon;
using Ryujinx.Common.Logging;
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
-namespace Ryujinx.UI.Common.Helper
+namespace Ryujinx.Common.Helper
{
public static partial class OpenHelper
{
@@ -34,6 +35,8 @@ namespace Ryujinx.UI.Common.Helper
}
}
+ public static void OpenFolder(FilePath path) => OpenFolder(path.Path);
+
public static void LocateFile(string path)
{
if (File.Exists(path))
diff --git a/src/Ryujinx.Common/Logging/Logger.cs b/src/Ryujinx.Common/Logging/Logger.cs
index 26d343969..6ea6b7ac3 100644
--- a/src/Ryujinx.Common/Logging/Logger.cs
+++ b/src/Ryujinx.Common/Logging/Logger.cs
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
@@ -157,21 +158,16 @@ namespace Ryujinx.Common.Logging
_time.Restart();
}
- private static ILogTarget GetTarget(string targetName)
- {
- foreach (var target in _logTargets)
- {
- if (target.Name.Equals(targetName))
- {
- return target;
- }
- }
-
- return null;
- }
+ private static ILogTarget GetTarget(string targetName)
+ => _logTargets.FirstOrDefault(target => target.Name.Equals(targetName));
public static void AddTarget(ILogTarget target)
{
+ if (_logTargets.Any(t => t.Name == target.Name))
+ {
+ return;
+ }
+
_logTargets.Add(target);
Updated += target.Log;
diff --git a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs
index a9dbe646a..1fcfea4da 100644
--- a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs
+++ b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs
@@ -27,11 +27,7 @@ namespace Ryujinx.Common.Logging.Targets
private readonly int _overflowTimeout;
- string ILogTarget.Name { get => _target.Name; }
-
- public AsyncLogTargetWrapper(ILogTarget target)
- : this(target, -1)
- { }
+ string ILogTarget.Name => _target.Name;
public AsyncLogTargetWrapper(ILogTarget target, int queueLimit = -1, AsyncLogTargetOverflowAction overflowAction = AsyncLogTargetOverflowAction.Block)
{
diff --git a/src/Ryujinx.Common/ReactiveObject.cs b/src/Ryujinx.Common/ReactiveObject.cs
index 8df1e20fe..bb2ece81c 100644
--- a/src/Ryujinx.Common/ReactiveObject.cs
+++ b/src/Ryujinx.Common/ReactiveObject.cs
@@ -53,6 +53,9 @@ namespace Ryujinx.Common
{
public static void LogValueChange(LogClass logClass, ReactiveEventArgs eventArgs, string valueName)
{
+ if (eventArgs.AreValuesEqual)
+ return;
+
string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}");
Logger.Info?.Print(logClass, message);
@@ -65,5 +68,22 @@ namespace Ryujinx.Common
{
public T OldValue { get; } = oldValue;
public T NewValue { get; } = newValue;
+
+ public bool AreValuesEqual
+ {
+ get
+ {
+ if (OldValue == null && NewValue == null)
+ return true;
+
+ if (OldValue == null && NewValue != null)
+ return false;
+
+ if (OldValue != null && NewValue == null)
+ return false;
+
+ return OldValue!.Equals(NewValue);
+ }
+ }
}
}
diff --git a/src/Ryujinx.Common/ReleaseInformation.cs b/src/Ryujinx.Common/ReleaseInformation.cs
index 011d9848a..cbf93013f 100644
--- a/src/Ryujinx.Common/ReleaseInformation.cs
+++ b/src/Ryujinx.Common/ReleaseInformation.cs
@@ -6,7 +6,6 @@ namespace Ryujinx.Common
// DO NOT EDIT, filled by CI
public static class ReleaseInformation
{
- private const string FlatHubChannel = "flathub";
private const string CanaryChannel = "canary";
private const string ReleaseChannel = "release";
@@ -29,8 +28,6 @@ namespace Ryujinx.Common
!ReleaseChannelRepo.StartsWith("%%") &&
!ConfigFileName.StartsWith("%%");
- public static bool IsFlatHubBuild => IsValid && ReleaseChannelOwner.Equals(FlatHubChannel);
-
public static bool IsCanaryBuild => IsValid && ReleaseChannelName.Equals(CanaryChannel);
public static bool IsReleaseBuild => IsValid && ReleaseChannelName.Equals(ReleaseChannel);
diff --git a/src/Ryujinx.Common/RyujinxException.cs b/src/Ryujinx.Common/RyujinxException.cs
new file mode 100644
index 000000000..dbb5184e4
--- /dev/null
+++ b/src/Ryujinx.Common/RyujinxException.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Ryujinx.Common
+{
+ public class RyujinxException : Exception
+ {
+ public RyujinxException(string message) : base(message)
+ { }
+ }
+}
diff --git a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs b/src/Ryujinx.Common/TitleIDs.cs
similarity index 61%
rename from src/Ryujinx.UI.Common/DiscordIntegrationModule.cs
rename to src/Ryujinx.Common/TitleIDs.cs
index 338d28531..dca634d9d 100644
--- a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs
+++ b/src/Ryujinx.Common/TitleIDs.cs
@@ -1,130 +1,55 @@
-using DiscordRPC;
-using Humanizer;
-using Humanizer.Localisation;
-using Ryujinx.Common;
-using Ryujinx.HLE.Loaders.Processes;
-using Ryujinx.UI.App.Common;
-using Ryujinx.UI.Common.Configuration;
+using Gommon;
+using Ryujinx.Common.Configuration;
+using System;
using System.Linq;
-using System.Text;
+using System.Runtime.InteropServices;
-namespace Ryujinx.UI.Common
+namespace Ryujinx.Common
{
- public static class DiscordIntegrationModule
+ public static class TitleIDs
{
- public static Timestamps StartedAt { get; set; }
-
- private static string VersionString
- => (ReleaseInformation.IsCanaryBuild ? "Canary " : string.Empty) + $"v{ReleaseInformation.Version}";
-
- private static readonly string _description =
- ReleaseInformation.IsValid
- ? $"{VersionString} {ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelSourceRepo}@{ReleaseInformation.BuildGitHash}"
- : "dev build";
-
- private const string ApplicationId = "1293250299716173864";
-
- private const int ApplicationByteLimit = 128;
- private const string Ellipsis = "…";
-
- private static DiscordRpcClient _discordClient;
- private static RichPresence _discordPresenceMain;
-
- public static void Initialize()
+ public static ReactiveObject> CurrentApplication { get; set; } = new();
+
+ public static GraphicsBackend SelectGraphicsBackend(string titleId, GraphicsBackend currentBackend)
{
- _discordPresenceMain = new RichPresence
+ switch (currentBackend)
{
- Assets = new Assets
- {
- LargeImageKey = "ryujinx",
- LargeImageText = TruncateToByteLength(_description)
- },
- Details = "Main Menu",
- State = "Idling",
- Timestamps = StartedAt
- };
-
- ConfigurationState.Instance.EnableDiscordIntegration.Event += Update;
- }
-
- private static void Update(object sender, ReactiveEventArgs evnt)
- {
- if (evnt.OldValue != evnt.NewValue)
- {
- // If the integration was active, disable it and unload everything
- if (evnt.OldValue)
- {
- _discordClient?.Dispose();
-
- _discordClient = null;
- }
-
- // If we need to activate it and the client isn't active, initialize it
- if (evnt.NewValue && _discordClient == null)
- {
- _discordClient = new DiscordRpcClient(ApplicationId);
-
- _discordClient.Initialize();
- _discordClient.SetPresence(_discordPresenceMain);
- }
- }
- }
-
- public static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes)
- {
- _discordClient?.SetPresence(new RichPresence
- {
- Assets = new Assets
- {
- LargeImageKey = _discordGameAssetKeys.Contains(procRes.ProgramIdText) ? procRes.ProgramIdText : "game",
- LargeImageText = TruncateToByteLength($"{appMeta.Title} (v{procRes.DisplayVersion})"),
- SmallImageKey = "ryujinx",
- SmallImageText = TruncateToByteLength(_description)
- },
- Details = TruncateToByteLength($"Playing {appMeta.Title}"),
- State = appMeta.LastPlayed.HasValue && appMeta.TimePlayed.TotalSeconds > 5
- ? $"Total play time: {appMeta.TimePlayed.Humanize(2, false, maxUnit: TimeUnit.Hour)}"
- : "Never played",
- Timestamps = Timestamps.Now
- });
- }
-
- public static void SwitchToMainState() => _discordClient?.SetPresence(_discordPresenceMain);
-
- private static string TruncateToByteLength(string input)
- {
- if (Encoding.UTF8.GetByteCount(input) <= ApplicationByteLimit)
- {
- return input;
+ case GraphicsBackend.OpenGl when OperatingSystem.IsMacOS():
+ return GraphicsBackend.Vulkan;
+ case GraphicsBackend.Vulkan or GraphicsBackend.OpenGl or GraphicsBackend.Metal:
+ return currentBackend;
}
- // Find the length to trim the string to guarantee we have space for the trailing ellipsis.
- int trimLimit = ApplicationByteLimit - Encoding.UTF8.GetByteCount(Ellipsis);
+ if (!(OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture is Architecture.Arm64))
+ return GraphicsBackend.Vulkan;
- // Make sure the string is long enough to perform the basic trim.
- // Amount of bytes != Length of the string
- if (input.Length > trimLimit)
- {
- // Basic trim to best case scenario of 1 byte characters.
- input = input[..trimLimit];
- }
-
- while (Encoding.UTF8.GetByteCount(input) > trimLimit)
- {
- // Remove one character from the end of the string at a time.
- input = input[..^1];
- }
-
- return input.TrimEnd() + Ellipsis;
+ return GreatMetalTitles.ContainsIgnoreCase(titleId) ? GraphicsBackend.Metal : GraphicsBackend.Vulkan;
}
-
- public static void Exit()
- {
- _discordClient?.Dispose();
- }
-
- private static readonly string[] _discordGameAssetKeys =
+
+ public static readonly string[] GreatMetalTitles =
[
+ "01006f8002326000", // Animal Crossings: New Horizons
+ "01009bf0072d4000", // Captain Toad: Treasure Tracker
+ "0100a5c00d162000", // Cuphead
+ "010023800d64a000", // Deltarune
+ "010028600EBDA000", // Mario 3D World
+ "0100152000022000", // Mario Kart 8 Deluxe
+ "01005CA01580E000", // Persona 5
+ "0100187003A36000", // Pokémon: Let's Go, Evoli!
+ "010003f003a34000", // Pokémon: Let's Go, Pikachu!
+ "01008C0016544000", // Sea of Stars
+ "01006A800016E000", // Smash Ultimate
+ "0100000000010000", // Super Mario Odyessy
+ ];
+
+ public static string GetDiscordGameAsset(string titleId)
+ => DiscordGameAssetKeys.Contains(titleId) ? titleId : "game";
+
+ public static readonly string[] DiscordGameAssetKeys =
+ [
+ "010008900705c000", // Dragon Quest Builders
+ "010042000a986000", // Dragon Quest Builders 2
+
"010055d009f78000", // Fire Emblem: Three Houses
"0100a12011cc8000", // Fire Emblem: Shadow Dragon
"0100a6301214e000", // Fire Emblem Engage
@@ -183,17 +108,18 @@ namespace Ryujinx.UI.Common
"0100f4c009322000", // Pikmin 3 Deluxe
"0100b7c00933a000", // Pikmin 4
+ "0100f4300bf2c000", // New Pokémon Snap
+ "0100000011d90000", // Pokémon Brilliant Diamond
+ "01001f5010dfa000", // Pokémon Legends: Arceus
"010003f003a34000", // Pokémon: Let's Go Pikachu!
"0100187003a36000", // Pokémon: Let's Go Eevee!
- "0100abf008968000", // Pokémon Sword
- "01008db008c2c000", // Pokémon Shield
- "0100000011d90000", // Pokémon Brilliant Diamond
- "010018e011d92000", // Pokémon Shining Pearl
- "01001f5010dfa000", // Pokémon Legends: Arceus
+ "01003d200baa2000", // Pokémon Mystery Dungeon - Rescue Team DX
"0100a3d008c5c000", // Pokémon Scarlet
+ "01008db008c2c000", // Pokémon Shield
+ "010018e011d92000", // Pokémon Shining Pearl
+ "0100abf008968000", // Pokémon Sword
"01008f6008c5e000", // Pokémon Violet
"0100b3f000be2000", // Pokkén Tournament DX
- "0100f4300bf2c000", // New Pokémon Snap
"01003bc0000a0000", // Splatoon 2 (US)
"0100f8f0000a2000", // Splatoon 2 (EU)
@@ -243,12 +169,21 @@ namespace Ryujinx.UI.Common
"01005ea01c0fc000", // SONIC X SHADOW GENERATIONS
"01005ea01c0fc001", // ^
+ "0100ff500e34a000", // Xenoblade Chronicles - Definitive Edition
+ "0100e95004038000", // Xenoblade Chronicles 2
+ "010074f013262000", // Xenoblade Chronicles 3
+
"010056e00853a000", // A Hat in Time
+ "0100fd1014726000", // Baldurs Gate: Dark Alliance
"0100dbf01000a000", // Burnout Paradise Remastered
"0100744001588000", // Cars 3: Driven to Win
"0100b41013c82000", // Cruis'n Blast
+ "010085900337e000", // Death Squared
"01001b300b9be000", // Diablo III: Eternal Collection
"01008c8012920000", // Dying Light Platinum Edition
+ "01001cc01b2d4000", // Goat Simulator 3
+ "01003620068ea000", // Hand of Fate 2
+ "010085500130a000", // Lego City: Undercover
"010073c01af34000", // LEGO Horizon Adventures
"0100770008dd8000", // Monster Hunter Generations Ultimate
"0100b04011742000", // Monster Hunter Rise
@@ -267,6 +202,8 @@ namespace Ryujinx.UI.Common
"01000a10041ea000", // The Elder Scrolls V: Skyrim
"010057a01e4d4000", // TSUKIHIME -A piece of blue glass moon-
"010080b00ad66000", // Undertale
+ "010069401adb8000", // Unicorn Overlord
+ "0100534009ff2000", // Yonder - The cloud catcher chronicles
];
}
}
diff --git a/src/Ryujinx.UI.Common/UserError.cs b/src/Ryujinx.Common/UI/UserError.cs
similarity index 96%
rename from src/Ryujinx.UI.Common/UserError.cs
rename to src/Ryujinx.Common/UI/UserError.cs
index 706971efa..cdcc42eac 100644
--- a/src/Ryujinx.UI.Common/UserError.cs
+++ b/src/Ryujinx.Common/UI/UserError.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.UI.Common
+namespace Ryujinx.Common.UI
{
///
/// Represent a common error that could be reported to the user by the emulator.
diff --git a/src/Ryujinx.Common/Utilities/BitUtils.cs b/src/Ryujinx.Common/Utilities/BitUtils.cs
index b9dae2e53..acbdde1f6 100644
--- a/src/Ryujinx.Common/Utilities/BitUtils.cs
+++ b/src/Ryujinx.Common/Utilities/BitUtils.cs
@@ -40,5 +40,35 @@ namespace Ryujinx.Common
return (value >> 32) | (value << 32);
}
+
+ // Never actually written bit packing logic before, so I looked it up.
+ // This code is from https://gist.github.com/Alan-FGR/04938e93e2bffdf5802ceb218a37c195
+
+ public static ulong PackBitFields(this uint[] values, byte[] bitFields)
+ {
+ ulong retVal = values[0]; //we set the first value right away
+ for (int f = 1; f < values.Length; f++)
+ {
+ retVal <<= bitFields[f]; // we shift the previous value
+ retVal += values[f];// and add our current value
+ }
+ return retVal;
+ }
+
+ public static uint[] UnpackBitFields(this ulong packed, byte[] bitFields)
+ {
+ int fields = bitFields.Length - 1; // number of fields to unpack
+ uint[] retArr = new uint[fields + 1]; // init return array
+ int curPos = 0; // current field bit position (start)
+ int lastEnd; // position where last field ended
+ for (int f = fields; f >= 0; f--) // loop from last
+ {
+ lastEnd = curPos; // we store where the last value ended
+ curPos += bitFields[f]; // we get where the current value starts
+ int leftShift = 64 - curPos; // we figure how much left shift we gotta apply for the other numbers to overflow into oblivion
+ retArr[f] = (uint)((packed << leftShift) >> leftShift + lastEnd); // we do magic
+ }
+ return retArr;
+ }
}
}
diff --git a/src/Ryujinx.Common/Utilities/JsonHelper.cs b/src/Ryujinx.Common/Utilities/JsonHelper.cs
index 276dd5f8c..82eeaddc1 100644
--- a/src/Ryujinx.Common/Utilities/JsonHelper.cs
+++ b/src/Ryujinx.Common/Utilities/JsonHelper.cs
@@ -1,3 +1,4 @@
+using System;
using System.IO;
using System.Text;
using System.Text.Json;
@@ -27,9 +28,14 @@ namespace Ryujinx.Common.Utilities
ReadCommentHandling = JsonCommentHandling.Skip
};
- public static string Serialize(T value, JsonTypeInfo typeInfo) => JsonSerializer.Serialize(value, typeInfo);
+ public static string Serialize(T value, JsonTypeInfo typeInfo)
+ => JsonSerializer.Serialize(value, typeInfo);
- public static T Deserialize(string value, JsonTypeInfo typeInfo) => JsonSerializer.Deserialize(value, typeInfo);
+ public static T Deserialize(string value, JsonTypeInfo typeInfo)
+ => JsonSerializer.Deserialize(value, typeInfo);
+
+ public static T Deserialize(ReadOnlySpan utf8Value, JsonTypeInfo typeInfo)
+ => JsonSerializer.Deserialize(utf8Value, typeInfo);
public static void SerializeToFile(string filePath, T value, JsonTypeInfo typeInfo)
{
diff --git a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
index bb56a4344..74c39d6a8 100644
--- a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
+++ b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
@@ -230,25 +230,20 @@ namespace Ryujinx.Cpu.AppleHv
{
if (size == 0)
{
- return Enumerable.Empty();
+ yield break;
}
var guestRegions = GetPhysicalRegionsImpl(va, size);
if (guestRegions == null)
{
- return null;
+ yield break;
}
- var regions = new HostMemoryRange[guestRegions.Count];
-
- for (int i = 0; i < regions.Length; i++)
+ foreach (var guestRegion in guestRegions)
{
- var guestRegion = guestRegions[i];
nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size);
- regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
+ yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
}
-
- return regions;
}
///
@@ -256,23 +251,24 @@ namespace Ryujinx.Cpu.AppleHv
{
if (size == 0)
{
- return Enumerable.Empty();
+ yield break;
}
- return GetPhysicalRegionsImpl(va, size);
+ foreach (var physicalRegion in GetPhysicalRegionsImpl(va, size))
+ {
+ yield return physicalRegion;
+ }
}
- private List GetPhysicalRegionsImpl(ulong va, ulong size)
+ private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size)
{
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
{
- return null;
+ yield break;
}
int pages = GetPagesCount(va, (uint)size, out va);
- var regions = new List();
-
ulong regionStart = GetPhysicalAddressInternal(va);
ulong regionSize = PageSize;
@@ -280,14 +276,14 @@ namespace Ryujinx.Cpu.AppleHv
{
if (!ValidateAddress(va + PageSize))
{
- return null;
+ yield break;
}
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
{
- regions.Add(new MemoryRange(regionStart, regionSize));
+ yield return new MemoryRange(regionStart, regionSize);
regionStart = newPa;
regionSize = 0;
}
@@ -296,9 +292,7 @@ namespace Ryujinx.Cpu.AppleHv
regionSize += PageSize;
}
- regions.Add(new MemoryRange(regionStart, regionSize));
-
- return regions;
+ yield return new MemoryRange(regionStart, regionSize);
}
///
diff --git a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs
index a49e0179d..f39b295cd 100644
--- a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs
+++ b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs
@@ -115,6 +115,9 @@ namespace Ryujinx.Cpu.Jit.HostTracked
}
private readonly AddressIntrusiveRedBlackTree _mappingTree;
+
+ // type is not Lock due to the unique usage of this mechanism,
+ // an arbitrary object is used as the lock passed in by constructor.
private readonly object _lock;
public Block(MemoryTracking tracking, Func readPtCallback, MemoryBlock memory, ulong size, object locker) : base(memory, size)
@@ -174,6 +177,9 @@ namespace Ryujinx.Cpu.Jit.HostTracked
private readonly MemoryTracking _tracking;
private readonly Func _readPtCallback;
+
+ // type is not Lock due to the unique usage of this mechanism,
+ // an arbitrary object is used as the lock passed in by constructor.
private readonly object _lock;
public AddressSpacePartitionAllocator(
diff --git a/src/Ryujinx.Cpu/Jit/MemoryManager.cs b/src/Ryujinx.Cpu/Jit/MemoryManager.cs
index 049e508d0..076fb6ad8 100644
--- a/src/Ryujinx.Cpu/Jit/MemoryManager.cs
+++ b/src/Ryujinx.Cpu/Jit/MemoryManager.cs
@@ -250,25 +250,20 @@ namespace Ryujinx.Cpu.Jit
{
if (size == 0)
{
- return Enumerable.Empty();
+ yield break;
}
var guestRegions = GetPhysicalRegionsImpl(va, size);
if (guestRegions == null)
{
- return null;
+ yield break;
}
- var regions = new HostMemoryRange[guestRegions.Count];
-
- for (int i = 0; i < regions.Length; i++)
+ foreach (var guestRegion in guestRegions)
{
- var guestRegion = guestRegions[i];
nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size);
- regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
+ yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
}
-
- return regions;
}
///
@@ -276,23 +271,24 @@ namespace Ryujinx.Cpu.Jit
{
if (size == 0)
{
- return Enumerable.Empty();
+ yield break;
}
- return GetPhysicalRegionsImpl(va, size);
+ foreach (var physicalRegion in GetPhysicalRegionsImpl(va, size))
+ {
+ yield return physicalRegion;
+ }
}
- private List GetPhysicalRegionsImpl(ulong va, ulong size)
+ private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size)
{
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
{
- return null;
+ yield break;
}
int pages = GetPagesCount(va, (uint)size, out va);
- var regions = new List();
-
ulong regionStart = GetPhysicalAddressInternal(va);
ulong regionSize = PageSize;
@@ -300,14 +296,14 @@ namespace Ryujinx.Cpu.Jit
{
if (!ValidateAddress(va + PageSize))
{
- return null;
+ yield break;
}
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
{
- regions.Add(new MemoryRange(regionStart, regionSize));
+ yield return new MemoryRange(regionStart, regionSize);
regionStart = newPa;
regionSize = 0;
}
@@ -316,9 +312,7 @@ namespace Ryujinx.Cpu.Jit
regionSize += PageSize;
}
- regions.Add(new MemoryRange(regionStart, regionSize));
-
- return regions;
+ yield return new MemoryRange(regionStart, regionSize);
}
///
diff --git a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
index 4dab212a7..499f991f2 100644
--- a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
+++ b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
@@ -475,17 +475,15 @@ namespace Ryujinx.Cpu.Jit
return GetPhysicalRegionsImpl(va, size);
}
- private List GetPhysicalRegionsImpl(ulong va, ulong size)
+ private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size)
{
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
{
- return null;
+ yield break;
}
int pages = GetPagesCount(va, (uint)size, out va);
- var regions = new List();
-
ulong regionStart = GetPhysicalAddressInternal(va);
ulong regionSize = PageSize;
@@ -493,14 +491,14 @@ namespace Ryujinx.Cpu.Jit
{
if (!ValidateAddress(va + PageSize))
{
- return null;
+ yield break;
}
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
{
- regions.Add(new MemoryRange(regionStart, regionSize));
+ yield return new MemoryRange(regionStart, regionSize);
regionStart = newPa;
regionSize = 0;
}
@@ -509,9 +507,7 @@ namespace Ryujinx.Cpu.Jit
regionSize += PageSize;
}
- regions.Add(new MemoryRange(regionStart, regionSize));
-
- return regions;
+ yield return new MemoryRange(regionStart, regionSize);
}
///
diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
index 3ce7c4f9c..1432c4598 100644
--- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
+++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
@@ -8,8 +8,6 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64
{
public IEnumerable GetCallStack(nint framePointer, nint codeRegionStart, int codeRegionSize, nint codeRegion2Start, int codeRegion2Size)
{
- List functionPointers = new();
-
while (true)
{
nint functionPointer = Marshal.ReadIntPtr(framePointer, nint.Size);
@@ -20,11 +18,9 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64
break;
}
- functionPointers.Add((ulong)functionPointer - 4);
+ yield return (ulong)functionPointer - 4;
framePointer = Marshal.ReadIntPtr(framePointer);
}
-
- return functionPointers;
}
}
}
diff --git a/src/Ryujinx.Graphics.GAL/AntiAliasing.cs b/src/Ryujinx.Graphics.GAL/AntiAliasing.cs
deleted file mode 100644
index 04b529764..000000000
--- a/src/Ryujinx.Graphics.GAL/AntiAliasing.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace Ryujinx.Graphics.GAL
-{
- public enum AntiAliasing
- {
- None,
- Fxaa,
- SmaaLow,
- SmaaMedium,
- SmaaHigh,
- SmaaUltra,
- }
-}
diff --git a/src/Ryujinx.Graphics.GAL/ComputeSize.cs b/src/Ryujinx.Graphics.GAL/ComputeSize.cs
new file mode 100644
index 000000000..ce9c2531c
--- /dev/null
+++ b/src/Ryujinx.Graphics.GAL/ComputeSize.cs
@@ -0,0 +1,18 @@
+namespace Ryujinx.Graphics.GAL
+{
+ public readonly struct ComputeSize
+ {
+ public readonly static ComputeSize VtgAsCompute = new ComputeSize(32, 32, 1);
+
+ public readonly int X;
+ public readonly int Y;
+ public readonly int Z;
+
+ public ComputeSize(int x, int y, int z)
+ {
+ X = x;
+ Y = y;
+ Z = z;
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.GAL/Format.cs b/src/Ryujinx.Graphics.GAL/Format.cs
index 17c42d2d4..b1eb68f72 100644
--- a/src/Ryujinx.Graphics.GAL/Format.cs
+++ b/src/Ryujinx.Graphics.GAL/Format.cs
@@ -339,6 +339,84 @@ namespace Ryujinx.Graphics.GAL
return 1;
}
+ ///
+ /// Get bytes per element for this format.
+ ///
+ /// Texture format
+ /// Byte size for an element of this format (pixel, vertex attribute, etc)
+ public static int GetBytesPerElement(this Format format)
+ {
+ int scalarSize = format.GetScalarSize();
+
+ switch (format)
+ {
+ case Format.R8G8Unorm:
+ case Format.R8G8Snorm:
+ case Format.R8G8Uint:
+ case Format.R8G8Sint:
+ case Format.R8G8Uscaled:
+ case Format.R8G8Sscaled:
+ case Format.R16G16Float:
+ case Format.R16G16Unorm:
+ case Format.R16G16Snorm:
+ case Format.R16G16Uint:
+ case Format.R16G16Sint:
+ case Format.R16G16Uscaled:
+ case Format.R16G16Sscaled:
+ case Format.R32G32Float:
+ case Format.R32G32Uint:
+ case Format.R32G32Sint:
+ case Format.R32G32Uscaled:
+ case Format.R32G32Sscaled:
+ return 2 * scalarSize;
+
+ case Format.R8G8B8Unorm:
+ case Format.R8G8B8Snorm:
+ case Format.R8G8B8Uint:
+ case Format.R8G8B8Sint:
+ case Format.R8G8B8Uscaled:
+ case Format.R8G8B8Sscaled:
+ case Format.R16G16B16Float:
+ case Format.R16G16B16Unorm:
+ case Format.R16G16B16Snorm:
+ case Format.R16G16B16Uint:
+ case Format.R16G16B16Sint:
+ case Format.R16G16B16Uscaled:
+ case Format.R16G16B16Sscaled:
+ case Format.R32G32B32Float:
+ case Format.R32G32B32Uint:
+ case Format.R32G32B32Sint:
+ case Format.R32G32B32Uscaled:
+ case Format.R32G32B32Sscaled:
+ return 3 * scalarSize;
+
+ case Format.R8G8B8A8Unorm:
+ case Format.R8G8B8A8Snorm:
+ case Format.R8G8B8A8Uint:
+ case Format.R8G8B8A8Sint:
+ case Format.R8G8B8A8Srgb:
+ case Format.R8G8B8A8Uscaled:
+ case Format.R8G8B8A8Sscaled:
+ case Format.B8G8R8A8Unorm:
+ case Format.B8G8R8A8Srgb:
+ case Format.R16G16B16A16Float:
+ case Format.R16G16B16A16Unorm:
+ case Format.R16G16B16A16Snorm:
+ case Format.R16G16B16A16Uint:
+ case Format.R16G16B16A16Sint:
+ case Format.R16G16B16A16Uscaled:
+ case Format.R16G16B16A16Sscaled:
+ case Format.R32G32B32A32Float:
+ case Format.R32G32B32A32Uint:
+ case Format.R32G32B32A32Sint:
+ case Format.R32G32B32A32Uscaled:
+ case Format.R32G32B32A32Sscaled:
+ return 4 * scalarSize;
+ }
+
+ return scalarSize;
+ }
+
///
/// Checks if the texture format is a depth or depth-stencil format.
///
diff --git a/src/Ryujinx.Graphics.GAL/IWindow.cs b/src/Ryujinx.Graphics.GAL/IWindow.cs
index 12686cb28..48144f0b0 100644
--- a/src/Ryujinx.Graphics.GAL/IWindow.cs
+++ b/src/Ryujinx.Graphics.GAL/IWindow.cs
@@ -1,3 +1,4 @@
+using Ryujinx.Common.Configuration;
using System;
namespace Ryujinx.Graphics.GAL
diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs
index 102fdb1bb..7a4836982 100644
--- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs
+++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs
@@ -1,3 +1,4 @@
+using Ryujinx.Common.Configuration;
using Ryujinx.Graphics.GAL.Multithreading.Commands.Window;
using Ryujinx.Graphics.GAL.Multithreading.Model;
using Ryujinx.Graphics.GAL.Multithreading.Resources;
diff --git a/src/Ryujinx.Graphics.GAL/ShaderInfo.cs b/src/Ryujinx.Graphics.GAL/ShaderInfo.cs
index 2fd3227dc..c7965a03d 100644
--- a/src/Ryujinx.Graphics.GAL/ShaderInfo.cs
+++ b/src/Ryujinx.Graphics.GAL/ShaderInfo.cs
@@ -4,23 +4,22 @@ namespace Ryujinx.Graphics.GAL
{
public int FragmentOutputMap { get; }
public ResourceLayout ResourceLayout { get; }
+ public ComputeSize ComputeLocalSize { get; }
public ProgramPipelineState? State { get; }
public bool FromCache { get; set; }
- public ShaderInfo(int fragmentOutputMap, ResourceLayout resourceLayout, ProgramPipelineState state, bool fromCache = false)
+ public ShaderInfo(
+ int fragmentOutputMap,
+ ResourceLayout resourceLayout,
+ ComputeSize computeLocalSize,
+ ProgramPipelineState? state,
+ bool fromCache = false)
{
FragmentOutputMap = fragmentOutputMap;
ResourceLayout = resourceLayout;
+ ComputeLocalSize = computeLocalSize;
State = state;
FromCache = fromCache;
}
-
- public ShaderInfo(int fragmentOutputMap, ResourceLayout resourceLayout, bool fromCache = false)
- {
- FragmentOutputMap = fragmentOutputMap;
- ResourceLayout = resourceLayout;
- State = null;
- FromCache = fromCache;
- }
}
}
diff --git a/src/Ryujinx.Graphics.GAL/UpscaleType.cs b/src/Ryujinx.Graphics.GAL/UpscaleType.cs
deleted file mode 100644
index e2482faef..000000000
--- a/src/Ryujinx.Graphics.GAL/UpscaleType.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Ryujinx.Graphics.GAL
-{
- public enum ScalingFilter
- {
- Bilinear,
- Nearest,
- Fsr,
- Area,
- }
-}
diff --git a/src/Ryujinx.Graphics.GAL/VSyncMode.cs b/src/Ryujinx.Graphics.GAL/VSyncMode.cs
deleted file mode 100644
index c5794b8f7..000000000
--- a/src/Ryujinx.Graphics.GAL/VSyncMode.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Ryujinx.Graphics.GAL
-{
- public enum VSyncMode
- {
- Switch,
- Unbounded,
- Custom
- }
-}
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs
index 6de50fb2e..34f2cfcad 100644
--- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs
+++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs
@@ -11,8 +11,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw
///
class VtgAsComputeContext : IDisposable
{
- private const int DummyBufferSize = 16;
-
private readonly GpuContext _context;
///
@@ -48,7 +46,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw
1,
1,
1,
- 1,
+ format.GetBytesPerElement(),
format,
DepthStencilMode.Depth,
Target.TextureBuffer,
@@ -521,21 +519,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw
return new BufferRange(_geometryIndexDataBuffer.Handle, offset, size, write);
}
- ///
- /// Gets the range for a dummy 16 bytes buffer, filled with zeros.
- ///
- /// Dummy buffer range
- public BufferRange GetDummyBufferRange()
- {
- if (_dummyBuffer == BufferHandle.Null)
- {
- _dummyBuffer = _context.Renderer.CreateBuffer(DummyBufferSize, BufferAccess.DeviceMemory);
- _context.Renderer.Pipeline.ClearBuffer(_dummyBuffer, 0, DummyBufferSize, 0);
- }
-
- return new BufferRange(_dummyBuffer, 0, DummyBufferSize);
- }
-
///
/// Gets the range for a sequential index buffer, with ever incrementing index values.
///
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs
index 73682866b..2de324392 100644
--- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs
+++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs
@@ -147,7 +147,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw
{
_vacContext.VertexInfoBufferUpdater.SetVertexStride(index, 0, componentsCount);
_vacContext.VertexInfoBufferUpdater.SetVertexOffset(index, 0, 0);
- SetDummyBufferTexture(_vertexAsCompute.Reservations, index, format);
continue;
}
@@ -163,15 +162,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw
{
_vacContext.VertexInfoBufferUpdater.SetVertexStride(index, 0, componentsCount);
_vacContext.VertexInfoBufferUpdater.SetVertexOffset(index, 0, 0);
- SetDummyBufferTexture(_vertexAsCompute.Reservations, index, format);
continue;
}
int vbStride = vertexBuffer.UnpackStride();
ulong vbSize = GetVertexBufferSize(address, endAddress.Pack(), vbStride, _indexed, instanced, _firstVertex, _count);
- ulong oldVbSize = vbSize;
-
ulong attributeOffset = (ulong)vertexAttrib.UnpackOffset();
int componentSize = format.GetScalarSize();
@@ -345,20 +341,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw
return maxOutputVertices / verticesPerPrimitive;
}
- ///
- /// Binds a dummy buffer as vertex buffer into a buffer texture.
- ///
- /// Shader resource binding reservations
- /// Buffer texture index
- /// Buffer texture format
- private readonly void SetDummyBufferTexture(ResourceReservations reservations, int index, Format format)
- {
- ITexture bufferTexture = _vacContext.EnsureBufferTexture(index + 2, format);
- bufferTexture.SetStorage(_vacContext.GetDummyBufferRange());
-
- _context.Renderer.Pipeline.SetTextureAndSampler(ShaderStage.Compute, reservations.GetVertexBufferTextureBinding(index), bufferTexture, null);
- }
-
///
/// Binds a vertex buffer into a buffer texture.
///
diff --git a/src/Ryujinx.Graphics.Gpu/GpuContext.cs b/src/Ryujinx.Graphics.Gpu/GpuContext.cs
index fb529e914..f7e8f1bf8 100644
--- a/src/Ryujinx.Graphics.Gpu/GpuContext.cs
+++ b/src/Ryujinx.Graphics.Gpu/GpuContext.cs
@@ -1,4 +1,5 @@
using Ryujinx.Common;
+using Ryujinx.Common.Configuration;
using Ryujinx.Graphics.Device;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Gpu.Engine.GPFifo;
@@ -90,6 +91,13 @@ namespace Ryujinx.Graphics.Gpu
/// Support buffer updater.
///
internal SupportBufferUpdater SupportBufferUpdater { get; }
+
+ ///
+ /// Enabled dirty hacks.
+ /// Used for workarounds to emulator bugs we can't fix/don't know how to fix yet.
+ ///
+ internal DirtyHacks DirtyHacks { get; }
+
///
/// Host hardware capabilities.
@@ -113,7 +121,7 @@ namespace Ryujinx.Graphics.Gpu
/// Creates a new instance of the GPU emulation context.
///
/// Host renderer
- public GpuContext(IRenderer renderer)
+ public GpuContext(IRenderer renderer, DirtyHacks hacks)
{
Renderer = renderer;
@@ -136,6 +144,8 @@ namespace Ryujinx.Graphics.Gpu
SupportBufferUpdater = new SupportBufferUpdater(renderer);
+ DirtyHacks = hacks;
+
_firstTimestamp = ConvertNanosecondsToTicks((ulong)PerformanceCounter.ElapsedNanoseconds);
}
diff --git a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs
index fbb7399ca..066ac28f7 100644
--- a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs
+++ b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs
@@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Gpu
/// Enables or disables high-level emulation of common GPU Macro code.
///
public static bool EnableMacroHLE = true;
-
+
///
/// Title id of the current running game.
/// Used by the shader cache.
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
index c36fc0ada..b6b811389 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
@@ -324,6 +324,11 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
bool loadHostCache = header.CodeGenVersion == CodeGenVersion;
+ if (context.Capabilities.Api == TargetApi.Metal)
+ {
+ loadHostCache = false;
+ }
+
int programIndex = 0;
DataEntry entry = new();
@@ -392,7 +397,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
context,
shaders,
specState.PipelineState,
- specState.TransformFeedbackDescriptors != null);
+ specState.TransformFeedbackDescriptors != null,
+ specState.ComputeState.GetLocalSize());
IProgram hostProgram;
@@ -629,7 +635,10 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
return;
}
- WriteHostCode(context, hostCode, program.Shaders, streams, timestamp);
+ if (context.Capabilities.Api != TargetApi.Metal)
+ {
+ WriteHostCode(context, hostCode, program.Shaders, streams, timestamp);
+ }
}
///
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs
index 20f96462e..eb0f72af1 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs
@@ -1,3 +1,4 @@
+using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
@@ -366,6 +367,9 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
{
try
{
+ if (_context.Capabilities.Api == TargetApi.Metal && _context.DirtyHacks.IsEnabled(DirtyHack.ShaderTranslationDelay))
+ Thread.Sleep(_context.DirtyHacks[DirtyHack.ShaderTranslationDelay]);
+
AsyncProgramTranslation asyncTranslation = new(guestShaders, specState, programIndex, isCompute);
_asyncTranslationQueue.Add(asyncTranslation, _cancellationToken);
}
@@ -490,7 +494,12 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
{
ShaderSource[] shaderSources = new ShaderSource[compilation.TranslatedStages.Length];
- ShaderInfoBuilder shaderInfoBuilder = new(_context, compilation.SpecializationState.TransformFeedbackDescriptors != null);
+ ref GpuChannelComputeState computeState = ref compilation.SpecializationState.ComputeState;
+
+ ShaderInfoBuilder shaderInfoBuilder = new(
+ _context,
+ compilation.SpecializationState.TransformFeedbackDescriptors != null,
+ computeLocalSize: computeState.GetLocalSize());
for (int index = 0; index < compilation.TranslatedStages.Length; index++)
{
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs
index 1be75f242..4e9134291 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs
@@ -16,7 +16,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
private readonly GpuAccessorState _state;
private readonly int _stageIndex;
private readonly bool _compute;
- private readonly bool _isVulkan;
+ private readonly bool _isOpenGL;
private readonly bool _hasGeometryShader;
private readonly bool _supportsQuads;
@@ -38,7 +38,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
_channel = channel;
_state = state;
_stageIndex = stageIndex;
- _isVulkan = context.Capabilities.Api == TargetApi.Vulkan;
+ _isOpenGL = context.Capabilities.Api == TargetApi.OpenGL;
_hasGeometryShader = hasGeometryShader;
_supportsQuads = context.Capabilities.SupportsQuads;
@@ -116,10 +116,10 @@ namespace Ryujinx.Graphics.Gpu.Shader
public GpuGraphicsState QueryGraphicsState()
{
return _state.GraphicsState.CreateShaderGraphicsState(
- !_isVulkan,
+ _isOpenGL,
_supportsQuads,
_hasGeometryShader,
- _isVulkan || _state.GraphicsState.YNegateEnabled);
+ !_isOpenGL || _state.GraphicsState.YNegateEnabled);
}
///
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
index d89eebabf..701ff764a 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
@@ -55,7 +55,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
{
int binding;
- if (_context.Capabilities.Api == TargetApi.Vulkan)
+ if (_context.Capabilities.Api != TargetApi.OpenGL)
{
binding = GetBindingFromIndex(index, _context.Capabilities.MaximumUniformBuffersPerStage, "Uniform buffer");
}
@@ -71,7 +71,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
{
int binding;
- if (_context.Capabilities.Api == TargetApi.Vulkan)
+ if (_context.Capabilities.Api != TargetApi.OpenGL)
{
if (count == 1)
{
@@ -103,7 +103,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
{
int binding;
- if (_context.Capabilities.Api == TargetApi.Vulkan)
+ if (_context.Capabilities.Api != TargetApi.OpenGL)
{
binding = GetBindingFromIndex(index, _context.Capabilities.MaximumStorageBuffersPerStage, "Storage buffer");
}
@@ -119,7 +119,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
{
int binding;
- if (_context.Capabilities.Api == TargetApi.Vulkan)
+ if (_context.Capabilities.Api != TargetApi.OpenGL)
{
if (count == 1)
{
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelComputeState.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelComputeState.cs
index d8cdbc348..720f7e796 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelComputeState.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelComputeState.cs
@@ -1,3 +1,5 @@
+using Ryujinx.Graphics.GAL;
+
namespace Ryujinx.Graphics.Gpu.Shader
{
///
@@ -61,5 +63,14 @@ namespace Ryujinx.Graphics.Gpu.Shader
SharedMemorySize = sharedMemorySize;
HasUnalignedStorageBuffer = hasUnalignedStorageBuffer;
}
+
+ ///
+ /// Gets the local group size of the shader in a GAL compatible struct.
+ ///
+ /// Local group size
+ public ComputeSize GetLocalSize()
+ {
+ return new ComputeSize(LocalSizeX, LocalSizeY, LocalSizeZ);
+ }
}
}
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index 4fc66c4c0..3a02eb615 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -1,3 +1,4 @@
+using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
@@ -224,7 +225,10 @@ namespace Ryujinx.Graphics.Gpu.Shader
TranslatedShader translatedShader = TranslateShader(_dumper, channel, translatorContext, cachedGuestCode, asCompute: false);
ShaderSource[] shaderSourcesArray = new ShaderSource[] { CreateShaderSource(translatedShader.Program) };
- ShaderInfo info = ShaderInfoBuilder.BuildForCompute(_context, translatedShader.Program.Info);
+ ShaderInfo info = ShaderInfoBuilder.BuildForCompute(
+ _context,
+ translatedShader.Program.Info,
+ computeState.GetLocalSize());
IProgram hostProgram = _context.Renderer.CreateProgram(shaderSourcesArray, info);
cpShader = new CachedShaderProgram(hostProgram, specState, translatedShader.Shader);
@@ -425,7 +429,8 @@ namespace Ryujinx.Graphics.Gpu.Shader
TranslatorContext lastInVertexPipeline = geometryToCompute ? translatorContexts[4] ?? currentStage : currentStage;
- program = lastInVertexPipeline.GenerateVertexPassthroughForCompute();
+ (program, ShaderProgramInfo vacInfo) = lastInVertexPipeline.GenerateVertexPassthroughForCompute();
+ infoBuilder.AddStageInfoVac(vacInfo);
}
else
{
@@ -530,7 +535,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
private ShaderAsCompute CreateHostVertexAsComputeProgram(ShaderProgram program, TranslatorContext context, bool tfEnabled)
{
ShaderSource source = new(program.Code, program.BinaryCode, ShaderStage.Compute, program.Language);
- ShaderInfo info = ShaderInfoBuilder.BuildForVertexAsCompute(_context, program.Info, tfEnabled);
+ ShaderInfo info = ShaderInfoBuilder.BuildForVertexAsCompute(_context, program.Info, context.GetVertexAsComputeInfo(), tfEnabled);
return new(_context.Renderer.CreateProgram(new[] { source }, info), program.Info, context.GetResourceReservations());
}
@@ -822,16 +827,20 @@ namespace Ryujinx.Graphics.Gpu.Shader
///
/// Creates shader translation options with the requested graphics API and flags.
- /// The shader language is choosen based on the current configuration and graphics API.
+ /// The shader language is chosen based on the current configuration and graphics API.
///
/// Target graphics API
/// Translation flags
/// Translation options
private static TranslationOptions CreateTranslationOptions(TargetApi api, TranslationFlags flags)
{
- TargetLanguage lang = GraphicsConfig.EnableSpirvCompilationOnVulkan && api == TargetApi.Vulkan
- ? TargetLanguage.Spirv
- : TargetLanguage.Glsl;
+ TargetLanguage lang = api switch
+ {
+ TargetApi.OpenGL => TargetLanguage.Glsl,
+ TargetApi.Vulkan => GraphicsConfig.EnableSpirvCompilationOnVulkan ? TargetLanguage.Spirv : TargetLanguage.Glsl,
+ TargetApi.Metal => TargetLanguage.Msl,
+ _ => throw new NotImplementedException()
+ };
return new TranslationOptions(lang, api, flags);
}
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs
index 49823562f..e283d0832 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs
@@ -22,6 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
ResourceStages.Geometry;
private readonly GpuContext _context;
+ private readonly ComputeSize _computeLocalSize;
private int _fragmentOutputMap;
@@ -39,9 +40,11 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// GPU context that owns the shaders that will be added to the builder
/// Indicates if the graphics shader is used with transform feedback enabled
/// Indicates that the vertex shader will be emulated on a compute shader
- public ShaderInfoBuilder(GpuContext context, bool tfEnabled, bool vertexAsCompute = false)
+ /// Indicates the local thread size for a compute shader
+ public ShaderInfoBuilder(GpuContext context, bool tfEnabled, bool vertexAsCompute = false, ComputeSize computeLocalSize = default)
{
_context = context;
+ _computeLocalSize = computeLocalSize;
_fragmentOutputMap = -1;
@@ -95,7 +98,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
private void PopulateDescriptorAndUsages(ResourceStages stages, ResourceType type, int setIndex, int start, int count, bool write = false)
{
AddDescriptor(stages, type, setIndex, start, count);
- AddUsage(stages, type, setIndex, start, count, write);
+ // AddUsage(stages, type, setIndex, start, count, write);
}
///
@@ -159,6 +162,25 @@ namespace Ryujinx.Graphics.Gpu.Shader
AddUsage(info.Images, stages, isImage: true);
}
+ public void AddStageInfoVac(ShaderProgramInfo info)
+ {
+ ResourceStages stages = info.Stage switch
+ {
+ ShaderStage.Compute => ResourceStages.Compute,
+ ShaderStage.Vertex => ResourceStages.Vertex,
+ ShaderStage.TessellationControl => ResourceStages.TessellationControl,
+ ShaderStage.TessellationEvaluation => ResourceStages.TessellationEvaluation,
+ ShaderStage.Geometry => ResourceStages.Geometry,
+ ShaderStage.Fragment => ResourceStages.Fragment,
+ _ => ResourceStages.None,
+ };
+
+ AddUsage(info.CBuffers, stages, isStorage: false);
+ AddUsage(info.SBuffers, stages, isStorage: true);
+ AddUsage(info.Textures, stages, isImage: false);
+ AddUsage(info.Images, stages, isImage: true);
+ }
+
///
/// Adds a resource descriptor to the list of descriptors.
///
@@ -361,14 +383,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
ResourceLayout resourceLayout = new(descriptors.AsReadOnly(), usages.AsReadOnly());
- if (pipeline.HasValue)
- {
- return new ShaderInfo(_fragmentOutputMap, resourceLayout, pipeline.Value, fromCache);
- }
- else
- {
- return new ShaderInfo(_fragmentOutputMap, resourceLayout, fromCache);
- }
+ return new ShaderInfo(_fragmentOutputMap, resourceLayout, _computeLocalSize, pipeline, fromCache);
}
///
@@ -378,14 +393,16 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// Shaders from the disk cache
/// Optional pipeline for background compilation
/// Indicates if the graphics shader is used with transform feedback enabled
+ /// Compute local thread size
/// Shader information
public static ShaderInfo BuildForCache(
GpuContext context,
IEnumerable programs,
ProgramPipelineState? pipeline,
- bool tfEnabled)
+ bool tfEnabled,
+ ComputeSize computeLocalSize)
{
- ShaderInfoBuilder builder = new(context, tfEnabled);
+ ShaderInfoBuilder builder = new(context, tfEnabled, computeLocalSize: computeLocalSize);
foreach (CachedShaderStage program in programs)
{
@@ -403,11 +420,12 @@ namespace Ryujinx.Graphics.Gpu.Shader
///
/// GPU context that owns the shader
/// Compute shader information
+ /// Compute local thread size
/// True if the compute shader comes from a disk cache, false otherwise
/// Shader information
- public static ShaderInfo BuildForCompute(GpuContext context, ShaderProgramInfo info, bool fromCache = false)
+ public static ShaderInfo BuildForCompute(GpuContext context, ShaderProgramInfo info, ComputeSize computeLocalSize, bool fromCache = false)
{
- ShaderInfoBuilder builder = new(context, tfEnabled: false, vertexAsCompute: false);
+ ShaderInfoBuilder builder = new(context, tfEnabled: false, vertexAsCompute: false, computeLocalSize: computeLocalSize);
builder.AddStageInfo(info);
@@ -422,10 +440,11 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// Indicates if the graphics shader is used with transform feedback enabled
/// True if the compute shader comes from a disk cache, false otherwise
/// Shader information
- public static ShaderInfo BuildForVertexAsCompute(GpuContext context, ShaderProgramInfo info, bool tfEnabled, bool fromCache = false)
+ public static ShaderInfo BuildForVertexAsCompute(GpuContext context, ShaderProgramInfo info, ShaderProgramInfo info2, bool tfEnabled, bool fromCache = false)
{
- ShaderInfoBuilder builder = new(context, tfEnabled, vertexAsCompute: true);
+ ShaderInfoBuilder builder = new(context, tfEnabled, vertexAsCompute: true, computeLocalSize: ComputeSize.VtgAsCompute);
+ builder.AddStageInfoVac(info2);
builder.AddStageInfo(info, vertexAsCompute: true);
return builder.Build(null, fromCache);
diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs
new file mode 100644
index 000000000..f8fe7d2e7
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs
@@ -0,0 +1,22 @@
+using SharpMetal;
+using SharpMetal.Foundation;
+using SharpMetal.ObjectiveCCore;
+using SharpMetal.QuartzCore;
+using System.Runtime.Versioning;
+// ReSharper disable InconsistentNaming
+
+namespace Ryujinx.Graphics.Metal.SharpMetalExtensions
+{
+ [SupportedOSPlatform("macOS")]
+ public static class CAMetalLayerExtensions
+ {
+ private static readonly Selector sel_developerHUDProperties = "developerHUDProperties";
+ private static readonly Selector sel_setDeveloperHUDProperties = "setDeveloperHUDProperties:";
+
+ public static NSDictionary GetDeveloperHudProperties(this CAMetalLayer metalLayer)
+ => new(ObjectiveCRuntime.IntPtr_objc_msgSend(metalLayer.NativePtr, sel_developerHUDProperties));
+
+ public static void SetDeveloperHudProperties(this CAMetalLayer metalLayer, NSDictionary dictionary)
+ => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDeveloperHUDProperties, dictionary);
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs
new file mode 100644
index 000000000..dc2495d07
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs
@@ -0,0 +1,32 @@
+using SharpMetal.Foundation;
+using SharpMetal.ObjectiveCCore;
+using System.Runtime.Versioning;
+// ReSharper disable InconsistentNaming
+
+namespace Ryujinx.Graphics.Metal.SharpMetalExtensions
+{
+ [SupportedOSPlatform("macOS")]
+ public static class NSHelper
+ {
+ private static readonly Selector sel_getCStringMaxLengthEncoding = "getCString:maxLength:encoding:";
+ private static readonly Selector sel_stringWithUTF8String = "stringWithUTF8String:";
+
+ public static unsafe string ToDotNetString(this NSString source)
+ {
+ char[] sourceBuffer = new char[source.Length];
+ fixed (char* pSourceBuffer = sourceBuffer)
+ {
+ ObjectiveC.bool_objc_msgSend(source,
+ sel_getCStringMaxLengthEncoding,
+ pSourceBuffer,
+ source.MaximumLengthOfBytes(NSStringEncoding.UTF16) + 1,
+ (ulong)NSStringEncoding.UTF16);
+ }
+
+ return new string(sourceBuffer);
+ }
+
+ public static NSString ToNSString(this string source)
+ => new(ObjectiveC.IntPtr_objc_msgSend(new ObjectiveCClass(nameof(NSString)), sel_stringWithUTF8String, source));
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj
new file mode 100644
index 000000000..1e75b4d26
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj
@@ -0,0 +1,11 @@
+
+
+ enable
+ enable
+ true
+
+
+
+
+
+
diff --git a/src/Ryujinx.Graphics.Metal/Auto.cs b/src/Ryujinx.Graphics.Metal/Auto.cs
new file mode 100644
index 000000000..7e79ecbc3
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/Auto.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Diagnostics;
+using System.Runtime.Versioning;
+using System.Threading;
+
+namespace Ryujinx.Graphics.Metal
+{
+ interface IAuto
+ {
+ bool HasCommandBufferDependency(CommandBufferScoped cbs);
+
+ void IncrementReferenceCount();
+ void DecrementReferenceCount(int cbIndex);
+ void DecrementReferenceCount();
+ }
+
+ interface IAutoPrivate : IAuto
+ {
+ void AddCommandBufferDependencies(CommandBufferScoped cbs);
+ }
+
+ [SupportedOSPlatform("macos")]
+ class Auto : IAutoPrivate, IDisposable where T : IDisposable
+ {
+ private int _referenceCount;
+ private T _value;
+
+ private readonly BitMap _cbOwnership;
+ private readonly MultiFenceHolder _waitable;
+
+ private bool _disposed;
+ private bool _destroyed;
+
+ public Auto(T value)
+ {
+ _referenceCount = 1;
+ _value = value;
+ _cbOwnership = new BitMap(CommandBufferPool.MaxCommandBuffers);
+ }
+
+ public Auto(T value, MultiFenceHolder waitable) : this(value)
+ {
+ _waitable = waitable;
+ }
+
+ public T Get(CommandBufferScoped cbs, int offset, int size, bool write = false)
+ {
+ _waitable?.AddBufferUse(cbs.CommandBufferIndex, offset, size, write);
+ return Get(cbs);
+ }
+
+ public T GetUnsafe()
+ {
+ return _value;
+ }
+
+ public T Get(CommandBufferScoped cbs)
+ {
+ if (!_destroyed)
+ {
+ AddCommandBufferDependencies(cbs);
+ }
+
+ return _value;
+ }
+
+ public bool HasCommandBufferDependency(CommandBufferScoped cbs)
+ {
+ return _cbOwnership.IsSet(cbs.CommandBufferIndex);
+ }
+
+ public bool HasRentedCommandBufferDependency(CommandBufferPool cbp)
+ {
+ return _cbOwnership.AnySet();
+ }
+
+ public void AddCommandBufferDependencies(CommandBufferScoped cbs)
+ {
+ // We don't want to add a reference to this object to the command buffer
+ // more than once, so if we detect that the command buffer already has ownership
+ // of this object, then we can just return without doing anything else.
+ if (_cbOwnership.Set(cbs.CommandBufferIndex))
+ {
+ if (_waitable != null)
+ {
+ cbs.AddWaitable(_waitable);
+ }
+
+ cbs.AddDependant(this);
+ }
+ }
+
+ public bool TryIncrementReferenceCount()
+ {
+ int lastValue;
+ do
+ {
+ lastValue = _referenceCount;
+
+ if (lastValue == 0)
+ {
+ return false;
+ }
+ }
+ while (Interlocked.CompareExchange(ref _referenceCount, lastValue + 1, lastValue) != lastValue);
+
+ return true;
+ }
+
+ public void IncrementReferenceCount()
+ {
+ if (Interlocked.Increment(ref _referenceCount) == 1)
+ {
+ Interlocked.Decrement(ref _referenceCount);
+ throw new InvalidOperationException("Attempted to increment the reference count of an object that was already destroyed.");
+ }
+ }
+
+ public void DecrementReferenceCount(int cbIndex)
+ {
+ _cbOwnership.Clear(cbIndex);
+ DecrementReferenceCount();
+ }
+
+ public void DecrementReferenceCount()
+ {
+ if (Interlocked.Decrement(ref _referenceCount) == 0)
+ {
+ _value.Dispose();
+ _value = default;
+ _destroyed = true;
+ }
+
+ Debug.Assert(_referenceCount >= 0);
+ }
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ DecrementReferenceCount();
+ _disposed = true;
+ }
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/BackgroundResources.cs b/src/Ryujinx.Graphics.Metal/BackgroundResources.cs
new file mode 100644
index 000000000..8bf6b92bd
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/BackgroundResources.cs
@@ -0,0 +1,107 @@
+using SharpMetal.Metal;
+using System;
+using System.Collections.Generic;
+using System.Runtime.Versioning;
+using System.Threading;
+
+namespace Ryujinx.Graphics.Metal
+{
+ [SupportedOSPlatform("macos")]
+ class BackgroundResource : IDisposable
+ {
+ private readonly MetalRenderer _renderer;
+
+ private CommandBufferPool _pool;
+ private PersistentFlushBuffer _flushBuffer;
+
+ public BackgroundResource(MetalRenderer renderer)
+ {
+ _renderer = renderer;
+ }
+
+ public CommandBufferPool GetPool()
+ {
+ if (_pool == null)
+ {
+ MTLCommandQueue queue = _renderer.BackgroundQueue;
+ _pool = new CommandBufferPool(queue, true);
+ _pool.Initialize(null); // TODO: Proper encoder factory for background render/compute
+ }
+
+ return _pool;
+ }
+
+ public PersistentFlushBuffer GetFlushBuffer()
+ {
+ _flushBuffer ??= new PersistentFlushBuffer(_renderer);
+
+ return _flushBuffer;
+ }
+
+ public void Dispose()
+ {
+ _pool?.Dispose();
+ _flushBuffer?.Dispose();
+ }
+ }
+
+ [SupportedOSPlatform("macos")]
+ class BackgroundResources : IDisposable
+ {
+ private readonly MetalRenderer _renderer;
+
+ private readonly Dictionary _resources;
+
+ public BackgroundResources(MetalRenderer renderer)
+ {
+ _renderer = renderer;
+
+ _resources = new Dictionary();
+ }
+
+ private void Cleanup()
+ {
+ lock (_resources)
+ {
+ foreach (KeyValuePair tuple in _resources)
+ {
+ if (!tuple.Key.IsAlive)
+ {
+ tuple.Value.Dispose();
+ _resources.Remove(tuple.Key);
+ }
+ }
+ }
+ }
+
+ public BackgroundResource Get()
+ {
+ Thread thread = Thread.CurrentThread;
+
+ lock (_resources)
+ {
+ if (!_resources.TryGetValue(thread, out BackgroundResource resource))
+ {
+ Cleanup();
+
+ resource = new BackgroundResource(_renderer);
+
+ _resources[thread] = resource;
+ }
+
+ return resource;
+ }
+ }
+
+ public void Dispose()
+ {
+ lock (_resources)
+ {
+ foreach (var resource in _resources.Values)
+ {
+ resource.Dispose();
+ }
+ }
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/BitMap.cs b/src/Ryujinx.Graphics.Metal/BitMap.cs
new file mode 100644
index 000000000..4ddc438c1
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/BitMap.cs
@@ -0,0 +1,157 @@
+namespace Ryujinx.Graphics.Metal
+{
+ readonly struct BitMap
+ {
+ public const int IntSize = 64;
+
+ private const int IntShift = 6;
+ private const int IntMask = IntSize - 1;
+
+ private readonly long[] _masks;
+
+ public BitMap(int count)
+ {
+ _masks = new long[(count + IntMask) / IntSize];
+ }
+
+ public bool AnySet()
+ {
+ for (int i = 0; i < _masks.Length; i++)
+ {
+ if (_masks[i] != 0)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public bool IsSet(int bit)
+ {
+ int wordIndex = bit >> IntShift;
+ int wordBit = bit & IntMask;
+
+ long wordMask = 1L << wordBit;
+
+ return (_masks[wordIndex] & wordMask) != 0;
+ }
+
+ public bool IsSet(int start, int end)
+ {
+ if (start == end)
+ {
+ return IsSet(start);
+ }
+
+ int startIndex = start >> IntShift;
+ int startBit = start & IntMask;
+ long startMask = -1L << startBit;
+
+ int endIndex = end >> IntShift;
+ int endBit = end & IntMask;
+ long endMask = (long)(ulong.MaxValue >> (IntMask - endBit));
+
+ if (startIndex == endIndex)
+ {
+ return (_masks[startIndex] & startMask & endMask) != 0;
+ }
+
+ if ((_masks[startIndex] & startMask) != 0)
+ {
+ return true;
+ }
+
+ for (int i = startIndex + 1; i < endIndex; i++)
+ {
+ if (_masks[i] != 0)
+ {
+ return true;
+ }
+ }
+
+ if ((_masks[endIndex] & endMask) != 0)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool Set(int bit)
+ {
+ int wordIndex = bit >> IntShift;
+ int wordBit = bit & IntMask;
+
+ long wordMask = 1L << wordBit;
+
+ if ((_masks[wordIndex] & wordMask) != 0)
+ {
+ return false;
+ }
+
+ _masks[wordIndex] |= wordMask;
+
+ return true;
+ }
+
+ public void SetRange(int start, int end)
+ {
+ if (start == end)
+ {
+ Set(start);
+ return;
+ }
+
+ int startIndex = start >> IntShift;
+ int startBit = start & IntMask;
+ long startMask = -1L << startBit;
+
+ int endIndex = end >> IntShift;
+ int endBit = end & IntMask;
+ long endMask = (long)(ulong.MaxValue >> (IntMask - endBit));
+
+ if (startIndex == endIndex)
+ {
+ _masks[startIndex] |= startMask & endMask;
+ }
+ else
+ {
+ _masks[startIndex] |= startMask;
+
+ for (int i = startIndex + 1; i < endIndex; i++)
+ {
+ _masks[i] |= -1;
+ }
+
+ _masks[endIndex] |= endMask;
+ }
+ }
+
+ public void Clear(int bit)
+ {
+ int wordIndex = bit >> IntShift;
+ int wordBit = bit & IntMask;
+
+ long wordMask = 1L << wordBit;
+
+ _masks[wordIndex] &= ~wordMask;
+ }
+
+ public void Clear()
+ {
+ for (int i = 0; i < _masks.Length; i++)
+ {
+ _masks[i] = 0;
+ }
+ }
+
+ public void ClearInt(int start, int end)
+ {
+ for (int i = start; i <= end; i++)
+ {
+ _masks[i] = 0;
+ }
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/BufferHolder.cs b/src/Ryujinx.Graphics.Metal/BufferHolder.cs
new file mode 100644
index 000000000..cc86a403f
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/BufferHolder.cs
@@ -0,0 +1,385 @@
+using Ryujinx.Graphics.GAL;
+using SharpMetal.Metal;
+using System;
+using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
+using System.Threading;
+
+namespace Ryujinx.Graphics.Metal
+{
+ [SupportedOSPlatform("macos")]
+ class BufferHolder : IDisposable
+ {
+ private CacheByRange _cachedConvertedBuffers;
+
+ public int Size { get; }
+
+ private readonly IntPtr _map;
+ private readonly MetalRenderer _renderer;
+ private readonly Pipeline _pipeline;
+
+ private readonly MultiFenceHolder _waitable;
+ private readonly Auto _buffer;
+
+ private readonly ReaderWriterLockSlim _flushLock;
+ private FenceHolder _flushFence;
+ private int _flushWaiting;
+
+ public BufferHolder(MetalRenderer renderer, Pipeline pipeline, MTLBuffer buffer, int size)
+ {
+ _renderer = renderer;
+ _pipeline = pipeline;
+ _map = buffer.Contents;
+ _waitable = new MultiFenceHolder(size);
+ _buffer = new Auto(new(buffer), _waitable);
+
+ _flushLock = new ReaderWriterLockSlim();
+
+ Size = size;
+ }
+
+ public Auto GetBuffer()
+ {
+ return _buffer;
+ }
+
+ public Auto GetBuffer(bool isWrite)
+ {
+ if (isWrite)
+ {
+ SignalWrite(0, Size);
+ }
+
+ return _buffer;
+ }
+
+ public Auto GetBuffer(int offset, int size, bool isWrite)
+ {
+ if (isWrite)
+ {
+ SignalWrite(offset, size);
+ }
+
+ return _buffer;
+ }
+
+ public void SignalWrite(int offset, int size)
+ {
+ if (offset == 0 && size == Size)
+ {
+ _cachedConvertedBuffers.Clear();
+ }
+ else
+ {
+ _cachedConvertedBuffers.ClearRange(offset, size);
+ }
+ }
+
+ private void ClearFlushFence()
+ {
+ // Assumes _flushLock is held as writer.
+
+ if (_flushFence != null)
+ {
+ if (_flushWaiting == 0)
+ {
+ _flushFence.Put();
+ }
+
+ _flushFence = null;
+ }
+ }
+
+ private void WaitForFlushFence()
+ {
+ if (_flushFence == null)
+ {
+ return;
+ }
+
+ // If storage has changed, make sure the fence has been reached so that the data is in place.
+ _flushLock.ExitReadLock();
+ _flushLock.EnterWriteLock();
+
+ if (_flushFence != null)
+ {
+ var fence = _flushFence;
+ Interlocked.Increment(ref _flushWaiting);
+
+ // Don't wait in the lock.
+
+ _flushLock.ExitWriteLock();
+
+ fence.Wait();
+
+ _flushLock.EnterWriteLock();
+
+ if (Interlocked.Decrement(ref _flushWaiting) == 0)
+ {
+ fence.Put();
+ }
+
+ _flushFence = null;
+ }
+
+ // Assumes the _flushLock is held as reader, returns in same state.
+ _flushLock.ExitWriteLock();
+ _flushLock.EnterReadLock();
+ }
+
+ public PinnedSpan GetData(int offset, int size)
+ {
+ _flushLock.EnterReadLock();
+
+ WaitForFlushFence();
+
+ Span result;
+
+ if (_map != IntPtr.Zero)
+ {
+ result = GetDataStorage(offset, size);
+
+ // Need to be careful here, the buffer can't be unmapped while the data is being used.
+ _buffer.IncrementReferenceCount();
+
+ _flushLock.ExitReadLock();
+
+ return PinnedSpan.UnsafeFromSpan(result, _buffer.DecrementReferenceCount);
+ }
+
+ throw new InvalidOperationException("The buffer is not mapped");
+ }
+
+ public unsafe Span GetDataStorage(int offset, int size)
+ {
+ int mappingSize = Math.Min(size, Size - offset);
+
+ if (_map != IntPtr.Zero)
+ {
+ return new Span((void*)(_map + offset), mappingSize);
+ }
+
+ throw new InvalidOperationException("The buffer is not mapped.");
+ }
+
+ public unsafe void SetData(int offset, ReadOnlySpan data, CommandBufferScoped? cbs = null, bool allowCbsWait = true)
+ {
+ int dataSize = Math.Min(data.Length, Size - offset);
+ if (dataSize == 0)
+ {
+ return;
+ }
+
+ if (_map != IntPtr.Zero)
+ {
+ // If persistently mapped, set the data directly if the buffer is not currently in use.
+ bool isRented = _buffer.HasRentedCommandBufferDependency(_renderer.CommandBufferPool);
+
+ // If the buffer is rented, take a little more time and check if the use overlaps this handle.
+ bool needsFlush = isRented && _waitable.IsBufferRangeInUse(offset, dataSize, false);
+
+ if (!needsFlush)
+ {
+ WaitForFences(offset, dataSize);
+
+ data[..dataSize].CopyTo(new Span((void*)(_map + offset), dataSize));
+
+ SignalWrite(offset, dataSize);
+
+ return;
+ }
+ }
+
+ if (cbs != null &&
+ cbs.Value.Encoders.CurrentEncoderType == EncoderType.Render &&
+ !(_buffer.HasCommandBufferDependency(cbs.Value) &&
+ _waitable.IsBufferRangeInUse(cbs.Value.CommandBufferIndex, offset, dataSize)))
+ {
+ // If the buffer hasn't been used on the command buffer yet, try to preload the data.
+ // This avoids ending and beginning render passes on each buffer data upload.
+
+ cbs = _pipeline.GetPreloadCommandBuffer();
+ }
+
+ if (allowCbsWait)
+ {
+ _renderer.BufferManager.StagingBuffer.PushData(_renderer.CommandBufferPool, cbs, this, offset, data);
+ }
+ else
+ {
+ bool rentCbs = cbs == null;
+ if (rentCbs)
+ {
+ cbs = _renderer.CommandBufferPool.Rent();
+ }
+
+ if (!_renderer.BufferManager.StagingBuffer.TryPushData(cbs.Value, this, offset, data))
+ {
+ // Need to do a slow upload.
+ BufferHolder srcHolder = _renderer.BufferManager.Create(dataSize);
+ srcHolder.SetDataUnchecked(0, data);
+
+ var srcBuffer = srcHolder.GetBuffer();
+ var dstBuffer = this.GetBuffer(true);
+
+ Copy(cbs.Value, srcBuffer, dstBuffer, 0, offset, dataSize);
+
+ srcHolder.Dispose();
+ }
+
+ if (rentCbs)
+ {
+ cbs.Value.Dispose();
+ }
+ }
+ }
+
+ public unsafe void SetDataUnchecked(int offset, ReadOnlySpan data)
+ {
+ int dataSize = Math.Min(data.Length, Size - offset);
+ if (dataSize == 0)
+ {
+ return;
+ }
+
+ if (_map != IntPtr.Zero)
+ {
+ data[..dataSize].CopyTo(new Span((void*)(_map + offset), dataSize));
+ }
+ }
+
+ public void SetDataUnchecked(int offset, ReadOnlySpan data) where T : unmanaged
+ {
+ SetDataUnchecked(offset, MemoryMarshal.AsBytes(data));
+ }
+
+ public static void Copy(
+ CommandBufferScoped cbs,
+ Auto src,
+ Auto dst,
+ int srcOffset,
+ int dstOffset,
+ int size,
+ bool registerSrcUsage = true)
+ {
+ var srcBuffer = registerSrcUsage ? src.Get(cbs, srcOffset, size).Value : src.GetUnsafe().Value;
+ var dstbuffer = dst.Get(cbs, dstOffset, size, true).Value;
+
+ cbs.Encoders.EnsureBlitEncoder().CopyFromBuffer(
+ srcBuffer,
+ (ulong)srcOffset,
+ dstbuffer,
+ (ulong)dstOffset,
+ (ulong)size);
+ }
+
+ public void WaitForFences()
+ {
+ _waitable.WaitForFences();
+ }
+
+ public void WaitForFences(int offset, int size)
+ {
+ _waitable.WaitForFences(offset, size);
+ }
+
+ private bool BoundToRange(int offset, ref int size)
+ {
+ if (offset >= Size)
+ {
+ return false;
+ }
+
+ size = Math.Min(Size - offset, size);
+
+ return true;
+ }
+
+ public Auto GetBufferI8ToI16(CommandBufferScoped cbs, int offset, int size)
+ {
+ if (!BoundToRange(offset, ref size))
+ {
+ return null;
+ }
+
+ var key = new I8ToI16CacheKey(_renderer);
+
+ if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
+ {
+ holder = _renderer.BufferManager.Create((size * 2 + 3) & ~3);
+
+ _renderer.HelperShader.ConvertI8ToI16(cbs, this, holder, offset, size);
+
+ key.SetBuffer(holder.GetBuffer());
+
+ _cachedConvertedBuffers.Add(offset, size, key, holder);
+ }
+
+ return holder.GetBuffer();
+ }
+
+ public Auto GetBufferTopologyConversion(CommandBufferScoped cbs, int offset, int size, IndexBufferPattern pattern, int indexSize)
+ {
+ if (!BoundToRange(offset, ref size))
+ {
+ return null;
+ }
+
+ var key = new TopologyConversionCacheKey(_renderer, pattern, indexSize);
+
+ if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
+ {
+ // The destination index size is always I32.
+
+ int indexCount = size / indexSize;
+
+ int convertedCount = pattern.GetConvertedCount(indexCount);
+
+ holder = _renderer.BufferManager.Create(convertedCount * 4);
+
+ _renderer.HelperShader.ConvertIndexBuffer(cbs, this, holder, pattern, indexSize, offset, indexCount);
+
+ key.SetBuffer(holder.GetBuffer());
+
+ _cachedConvertedBuffers.Add(offset, size, key, holder);
+ }
+
+ return holder.GetBuffer();
+ }
+
+ public bool TryGetCachedConvertedBuffer(int offset, int size, ICacheKey key, out BufferHolder holder)
+ {
+ return _cachedConvertedBuffers.TryGetValue(offset, size, key, out holder);
+ }
+
+ public void AddCachedConvertedBuffer(int offset, int size, ICacheKey key, BufferHolder holder)
+ {
+ _cachedConvertedBuffers.Add(offset, size, key, holder);
+ }
+
+ public void AddCachedConvertedBufferDependency(int offset, int size, ICacheKey key, Dependency dependency)
+ {
+ _cachedConvertedBuffers.AddDependency(offset, size, key, dependency);
+ }
+
+ public void RemoveCachedConvertedBuffer(int offset, int size, ICacheKey key)
+ {
+ _cachedConvertedBuffers.Remove(offset, size, key);
+ }
+
+
+ public void Dispose()
+ {
+ _pipeline.FlushCommandsIfWeightExceeding(_buffer, (ulong)Size);
+
+ _buffer.Dispose();
+ _cachedConvertedBuffers.Dispose();
+
+ _flushLock.EnterWriteLock();
+
+ ClearFlushFence();
+
+ _flushLock.ExitWriteLock();
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/BufferManager.cs b/src/Ryujinx.Graphics.Metal/BufferManager.cs
new file mode 100644
index 000000000..07a686223
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/BufferManager.cs
@@ -0,0 +1,237 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.Graphics.GAL;
+using SharpMetal.Metal;
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
+
+namespace Ryujinx.Graphics.Metal
+{
+ [SupportedOSPlatform("macos")]
+ readonly struct ScopedTemporaryBuffer : IDisposable
+ {
+ private readonly BufferManager _bufferManager;
+ private readonly bool _isReserved;
+
+ public readonly BufferRange Range;
+ public readonly BufferHolder Holder;
+
+ public BufferHandle Handle => Range.Handle;
+ public int Offset => Range.Offset;
+
+ public ScopedTemporaryBuffer(BufferManager bufferManager, BufferHolder holder, BufferHandle handle, int offset, int size, bool isReserved)
+ {
+ _bufferManager = bufferManager;
+
+ Range = new BufferRange(handle, offset, size);
+ Holder = holder;
+
+ _isReserved = isReserved;
+ }
+
+ public void Dispose()
+ {
+ if (!_isReserved)
+ {
+ _bufferManager.Delete(Range.Handle);
+ }
+ }
+ }
+
+ [SupportedOSPlatform("macos")]
+ class BufferManager : IDisposable
+ {
+ private readonly IdList _buffers;
+
+ private readonly MTLDevice _device;
+ private readonly MetalRenderer _renderer;
+ private readonly Pipeline _pipeline;
+
+ public int BufferCount { get; private set; }
+
+ public StagingBuffer StagingBuffer { get; }
+
+ public BufferManager(MTLDevice device, MetalRenderer renderer, Pipeline pipeline)
+ {
+ _device = device;
+ _renderer = renderer;
+ _pipeline = pipeline;
+ _buffers = new IdList();
+
+ StagingBuffer = new StagingBuffer(_renderer, this);
+ }
+
+ public BufferHandle Create(nint pointer, int size)
+ {
+ // TODO: This is the wrong Metal method, we need no-copy which SharpMetal isn't giving us.
+ var buffer = _device.NewBuffer(pointer, (ulong)size, MTLResourceOptions.ResourceStorageModeShared);
+
+ if (buffer == IntPtr.Zero)
+ {
+ Logger.Error?.PrintMsg(LogClass.Gpu, $"Failed to create buffer with size 0x{size:X}, and pointer 0x{pointer:X}.");
+
+ return BufferHandle.Null;
+ }
+
+ var holder = new BufferHolder(_renderer, _pipeline, buffer, size);
+
+ BufferCount++;
+
+ ulong handle64 = (uint)_buffers.Add(holder);
+
+ return Unsafe.As(ref handle64);
+ }
+
+ public BufferHandle CreateWithHandle(int size)
+ {
+ return CreateWithHandle(size, out _);
+ }
+
+ public BufferHandle CreateWithHandle(int size, out BufferHolder holder)
+ {
+ holder = Create(size);
+
+ if (holder == null)
+ {
+ return BufferHandle.Null;
+ }
+
+ BufferCount++;
+
+ ulong handle64 = (uint)_buffers.Add(holder);
+
+ return Unsafe.As(ref handle64);
+ }
+
+ public ScopedTemporaryBuffer ReserveOrCreate(CommandBufferScoped cbs, int size)
+ {
+ StagingBufferReserved? result = StagingBuffer.TryReserveData(cbs, size);
+
+ if (result.HasValue)
+ {
+ return new ScopedTemporaryBuffer(this, result.Value.Buffer, StagingBuffer.Handle, result.Value.Offset, result.Value.Size, true);
+ }
+ else
+ {
+ // Create a temporary buffer.
+ BufferHandle handle = CreateWithHandle(size, out BufferHolder holder);
+
+ return new ScopedTemporaryBuffer(this, holder, handle, 0, size, false);
+ }
+ }
+
+ public BufferHolder Create(int size)
+ {
+ var buffer = _device.NewBuffer((ulong)size, MTLResourceOptions.ResourceStorageModeShared);
+
+ if (buffer != IntPtr.Zero)
+ {
+ return new BufferHolder(_renderer, _pipeline, buffer, size);
+ }
+
+ Logger.Error?.PrintMsg(LogClass.Gpu, $"Failed to create buffer with size 0x{size:X}.");
+
+ return null;
+ }
+
+ public Auto GetBuffer(BufferHandle handle, bool isWrite, out int size)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ size = holder.Size;
+ return holder.GetBuffer(isWrite);
+ }
+
+ size = 0;
+ return null;
+ }
+
+ public Auto GetBuffer(BufferHandle handle, int offset, int size, bool isWrite)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ return holder.GetBuffer(offset, size, isWrite);
+ }
+
+ return null;
+ }
+
+ public Auto GetBuffer(BufferHandle handle, bool isWrite)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ return holder.GetBuffer(isWrite);
+ }
+
+ return null;
+ }
+
+ public Auto GetBufferI8ToI16(CommandBufferScoped cbs, BufferHandle handle, int offset, int size)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ return holder.GetBufferI8ToI16(cbs, offset, size);
+ }
+
+ return null;
+ }
+
+ public Auto GetBufferTopologyConversion(CommandBufferScoped cbs, BufferHandle handle, int offset, int size, IndexBufferPattern pattern, int indexSize)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ return holder.GetBufferTopologyConversion(cbs, offset, size, pattern, indexSize);
+ }
+
+ return null;
+ }
+
+ public PinnedSpan GetData(BufferHandle handle, int offset, int size)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ return holder.GetData(offset, size);
+ }
+
+ return new PinnedSpan();
+ }
+
+ public void SetData(BufferHandle handle, int offset, ReadOnlySpan data) where T : unmanaged
+ {
+ SetData(handle, offset, MemoryMarshal.Cast(data), null);
+ }
+
+ public void SetData(BufferHandle handle, int offset, ReadOnlySpan data, CommandBufferScoped? cbs)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ holder.SetData(offset, data, cbs);
+ }
+ }
+
+ public void Delete(BufferHandle handle)
+ {
+ if (TryGetBuffer(handle, out var holder))
+ {
+ holder.Dispose();
+ _buffers.Remove((int)Unsafe.As(ref handle));
+ }
+ }
+
+ private bool TryGetBuffer(BufferHandle handle, out BufferHolder holder)
+ {
+ return _buffers.TryGetValue((int)Unsafe.As(ref handle), out holder);
+ }
+
+ public void Dispose()
+ {
+ StagingBuffer.Dispose();
+
+ foreach (var buffer in _buffers)
+ {
+ buffer.Dispose();
+ }
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/BufferUsageBitmap.cs b/src/Ryujinx.Graphics.Metal/BufferUsageBitmap.cs
new file mode 100644
index 000000000..379e27407
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/BufferUsageBitmap.cs
@@ -0,0 +1,85 @@
+using System.Runtime.Versioning;
+
+namespace Ryujinx.Graphics.Metal
+{
+ [SupportedOSPlatform("macos")]
+ internal class BufferUsageBitmap
+ {
+ private readonly BitMap _bitmap;
+ private readonly int _size;
+ private readonly int _granularity;
+ private readonly int _bits;
+ private readonly int _writeBitOffset;
+
+ private readonly int _intsPerCb;
+ private readonly int _bitsPerCb;
+
+ public BufferUsageBitmap(int size, int granularity)
+ {
+ _size = size;
+ _granularity = granularity;
+
+ // There are two sets of bits - one for read tracking, and the other for write.
+ int bits = (size + (granularity - 1)) / granularity;
+ _writeBitOffset = bits;
+ _bits = bits << 1;
+
+ _intsPerCb = (_bits + (BitMap.IntSize - 1)) / BitMap.IntSize;
+ _bitsPerCb = _intsPerCb * BitMap.IntSize;
+
+ _bitmap = new BitMap(_bitsPerCb * CommandBufferPool.MaxCommandBuffers);
+ }
+
+ public void Add(int cbIndex, int offset, int size, bool write)
+ {
+ if (size == 0)
+ {
+ return;
+ }
+
+ // Some usages can be out of bounds (vertex buffer on amd), so bound if necessary.
+ if (offset + size > _size)
+ {
+ size = _size - offset;
+ }
+
+ int cbBase = cbIndex * _bitsPerCb + (write ? _writeBitOffset : 0);
+ int start = cbBase + offset / _granularity;
+ int end = cbBase + (offset + size - 1) / _granularity;
+
+ _bitmap.SetRange(start, end);
+ }
+
+ public bool OverlapsWith(int cbIndex, int offset, int size, bool write = false)
+ {
+ if (size == 0)
+ {
+ return false;
+ }
+
+ int cbBase = cbIndex * _bitsPerCb + (write ? _writeBitOffset : 0);
+ int start = cbBase + offset / _granularity;
+ int end = cbBase + (offset + size - 1) / _granularity;
+
+ return _bitmap.IsSet(start, end);
+ }
+
+ public bool OverlapsWith(int offset, int size, bool write)
+ {
+ for (int i = 0; i < CommandBufferPool.MaxCommandBuffers; i++)
+ {
+ if (OverlapsWith(i, offset, size, write))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public void Clear(int cbIndex)
+ {
+ _bitmap.ClearInt(cbIndex * _intsPerCb, (cbIndex + 1) * _intsPerCb - 1);
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/CacheByRange.cs b/src/Ryujinx.Graphics.Metal/CacheByRange.cs
new file mode 100644
index 000000000..76515808f
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/CacheByRange.cs
@@ -0,0 +1,294 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.Versioning;
+
+namespace Ryujinx.Graphics.Metal
+{
+ interface ICacheKey : IDisposable
+ {
+ bool KeyEqual(ICacheKey other);
+ }
+
+ [SupportedOSPlatform("macos")]
+ struct I8ToI16CacheKey : ICacheKey
+ {
+ // Used to notify the pipeline that bindings have invalidated on dispose.
+ // private readonly MetalRenderer _renderer;
+ // private Auto _buffer;
+
+ public I8ToI16CacheKey(MetalRenderer renderer)
+ {
+ // _renderer = renderer;
+ // _buffer = null;
+ }
+
+ public readonly bool KeyEqual(ICacheKey other)
+ {
+ return other is I8ToI16CacheKey;
+ }
+
+ public readonly void SetBuffer(Auto buffer)
+ {
+ // _buffer = buffer;
+ }
+
+ public readonly void Dispose()
+ {
+ // TODO: Tell pipeline buffer is dirty!
+ // _renderer.PipelineInternal.DirtyIndexBuffer(_buffer);
+ }
+ }
+
+ [SupportedOSPlatform("macos")]
+ readonly struct TopologyConversionCacheKey : ICacheKey
+ {
+ private readonly IndexBufferPattern _pattern;
+ private readonly int _indexSize;
+
+ // Used to notify the pipeline that bindings have invalidated on dispose.
+ // private readonly MetalRenderer _renderer;
+ // private Auto _buffer;
+
+ public TopologyConversionCacheKey(MetalRenderer renderer, IndexBufferPattern pattern, int indexSize)
+ {
+ // _renderer = renderer;
+ // _buffer = null;
+ _pattern = pattern;
+ _indexSize = indexSize;
+ }
+
+ public readonly bool KeyEqual(ICacheKey other)
+ {
+ return other is TopologyConversionCacheKey entry &&
+ entry._pattern == _pattern &&
+ entry._indexSize == _indexSize;
+ }
+
+ public void SetBuffer(Auto buffer)
+ {
+ // _buffer = buffer;
+ }
+
+ public readonly void Dispose()
+ {
+ // TODO: Tell pipeline buffer is dirty!
+ // _renderer.PipelineInternal.DirtyVertexBuffer(_buffer);
+ }
+ }
+
+ [SupportedOSPlatform("macos")]
+ readonly struct Dependency
+ {
+ private readonly BufferHolder _buffer;
+ private readonly int _offset;
+ private readonly int _size;
+ private readonly ICacheKey _key;
+
+ public Dependency(BufferHolder buffer, int offset, int size, ICacheKey key)
+ {
+ _buffer = buffer;
+ _offset = offset;
+ _size = size;
+ _key = key;
+ }
+
+ public void RemoveFromOwner()
+ {
+ _buffer.RemoveCachedConvertedBuffer(_offset, _size, _key);
+ }
+ }
+
+ [SupportedOSPlatform("macos")]
+ struct CacheByRange where T : IDisposable
+ {
+ private struct Entry
+ {
+ public readonly ICacheKey Key;
+ public readonly T Value;
+ public List DependencyList;
+
+ public Entry(ICacheKey key, T value)
+ {
+ Key = key;
+ Value = value;
+ DependencyList = null;
+ }
+
+ public readonly void InvalidateDependencies()
+ {
+ if (DependencyList != null)
+ {
+ foreach (Dependency dependency in DependencyList)
+ {
+ dependency.RemoveFromOwner();
+ }
+
+ DependencyList.Clear();
+ }
+ }
+ }
+
+ private Dictionary> _ranges;
+
+ public void Add(int offset, int size, ICacheKey key, T value)
+ {
+ List entries = GetEntries(offset, size);
+
+ entries.Add(new Entry(key, value));
+ }
+
+ public void AddDependency(int offset, int size, ICacheKey key, Dependency dependency)
+ {
+ List entries = GetEntries(offset, size);
+
+ for (int i = 0; i < entries.Count; i++)
+ {
+ Entry entry = entries[i];
+
+ if (entry.Key.KeyEqual(key))
+ {
+ if (entry.DependencyList == null)
+ {
+ entry.DependencyList = new List();
+ entries[i] = entry;
+ }
+
+ entry.DependencyList.Add(dependency);
+
+ break;
+ }
+ }
+ }
+
+ public void Remove(int offset, int size, ICacheKey key)
+ {
+ List entries = GetEntries(offset, size);
+
+ for (int i = 0; i < entries.Count; i++)
+ {
+ Entry entry = entries[i];
+
+ if (entry.Key.KeyEqual(key))
+ {
+ entries.RemoveAt(i--);
+
+ DestroyEntry(entry);
+ }
+ }
+
+ if (entries.Count == 0)
+ {
+ _ranges.Remove(PackRange(offset, size));
+ }
+ }
+
+ public bool TryGetValue(int offset, int size, ICacheKey key, out T value)
+ {
+ List entries = GetEntries(offset, size);
+
+ foreach (Entry entry in entries)
+ {
+ if (entry.Key.KeyEqual(key))
+ {
+ value = entry.Value;
+
+ return true;
+ }
+ }
+
+ value = default;
+ return false;
+ }
+
+ public void Clear()
+ {
+ if (_ranges != null)
+ {
+ foreach (List entries in _ranges.Values)
+ {
+ foreach (Entry entry in entries)
+ {
+ DestroyEntry(entry);
+ }
+ }
+
+ _ranges.Clear();
+ _ranges = null;
+ }
+ }
+
+ public readonly void ClearRange(int offset, int size)
+ {
+ if (_ranges != null && _ranges.Count > 0)
+ {
+ int end = offset + size;
+
+ List toRemove = null;
+
+ foreach (KeyValuePair> range in _ranges)
+ {
+ (int rOffset, int rSize) = UnpackRange(range.Key);
+
+ int rEnd = rOffset + rSize;
+
+ if (rEnd > offset && rOffset < end)
+ {
+ List entries = range.Value;
+
+ foreach (Entry entry in entries)
+ {
+ DestroyEntry(entry);
+ }
+
+ (toRemove ??= new List()).Add(range.Key);
+ }
+ }
+
+ if (toRemove != null)
+ {
+ foreach (ulong range in toRemove)
+ {
+ _ranges.Remove(range);
+ }
+ }
+ }
+ }
+
+ private List GetEntries(int offset, int size)
+ {
+ _ranges ??= new Dictionary>();
+
+ ulong key = PackRange(offset, size);
+
+ if (!_ranges.TryGetValue(key, out List value))
+ {
+ value = new List();
+ _ranges.Add(key, value);
+ }
+
+ return value;
+ }
+
+ private static void DestroyEntry(Entry entry)
+ {
+ entry.Key.Dispose();
+ entry.Value?.Dispose();
+ entry.InvalidateDependencies();
+ }
+
+ private static ulong PackRange(int offset, int size)
+ {
+ return (uint)offset | ((ulong)size << 32);
+ }
+
+ private static (int offset, int size) UnpackRange(ulong range)
+ {
+ return ((int)range, (int)(range >> 32));
+ }
+
+ public void Dispose()
+ {
+ Clear();
+ }
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/CommandBufferEncoder.cs b/src/Ryujinx.Graphics.Metal/CommandBufferEncoder.cs
new file mode 100644
index 000000000..ec4150030
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/CommandBufferEncoder.cs
@@ -0,0 +1,170 @@
+using Ryujinx.Graphics.Metal;
+using SharpMetal.Metal;
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.Versioning;
+
+interface IEncoderFactory
+{
+ MTLRenderCommandEncoder CreateRenderCommandEncoder();
+ MTLComputeCommandEncoder CreateComputeCommandEncoder();
+}
+
+///
+/// Tracks active encoder object for a command buffer.
+///
+[SupportedOSPlatform("macos")]
+class CommandBufferEncoder
+{
+ public EncoderType CurrentEncoderType { get; private set; } = EncoderType.None;
+
+ public MTLBlitCommandEncoder BlitEncoder => new(CurrentEncoder.Value);
+
+ public MTLComputeCommandEncoder ComputeEncoder => new(CurrentEncoder.Value);
+
+ public MTLRenderCommandEncoder RenderEncoder => new(CurrentEncoder.Value);
+
+ internal MTLCommandEncoder? CurrentEncoder { get; private set; }
+
+ private MTLCommandBuffer _commandBuffer;
+ private IEncoderFactory _encoderFactory;
+
+ public void Initialize(MTLCommandBuffer commandBuffer, IEncoderFactory encoderFactory)
+ {
+ _commandBuffer = commandBuffer;
+ _encoderFactory = encoderFactory;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public MTLRenderCommandEncoder EnsureRenderEncoder()
+ {
+ if (CurrentEncoderType != EncoderType.Render)
+ {
+ return BeginRenderPass();
+ }
+
+ return RenderEncoder;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public MTLBlitCommandEncoder EnsureBlitEncoder()
+ {
+ if (CurrentEncoderType != EncoderType.Blit)
+ {
+ return BeginBlitPass();
+ }
+
+ return BlitEncoder;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public MTLComputeCommandEncoder EnsureComputeEncoder()
+ {
+ if (CurrentEncoderType != EncoderType.Compute)
+ {
+ return BeginComputePass();
+ }
+
+ return ComputeEncoder;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool TryGetRenderEncoder(out MTLRenderCommandEncoder encoder)
+ {
+ if (CurrentEncoderType != EncoderType.Render)
+ {
+ encoder = default;
+ return false;
+ }
+
+ encoder = RenderEncoder;
+ return true;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool TryGetBlitEncoder(out MTLBlitCommandEncoder encoder)
+ {
+ if (CurrentEncoderType != EncoderType.Blit)
+ {
+ encoder = default;
+ return false;
+ }
+
+ encoder = BlitEncoder;
+ return true;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool TryGetComputeEncoder(out MTLComputeCommandEncoder encoder)
+ {
+ if (CurrentEncoderType != EncoderType.Compute)
+ {
+ encoder = default;
+ return false;
+ }
+
+ encoder = ComputeEncoder;
+ return true;
+ }
+
+ public void EndCurrentPass()
+ {
+ if (CurrentEncoder != null)
+ {
+ switch (CurrentEncoderType)
+ {
+ case EncoderType.Blit:
+ BlitEncoder.EndEncoding();
+ CurrentEncoder = null;
+ break;
+ case EncoderType.Compute:
+ ComputeEncoder.EndEncoding();
+ CurrentEncoder = null;
+ break;
+ case EncoderType.Render:
+ RenderEncoder.EndEncoding();
+ CurrentEncoder = null;
+ break;
+ default:
+ throw new InvalidOperationException();
+ }
+
+ CurrentEncoderType = EncoderType.None;
+ }
+ }
+
+ private MTLRenderCommandEncoder BeginRenderPass()
+ {
+ EndCurrentPass();
+
+ var renderCommandEncoder = _encoderFactory.CreateRenderCommandEncoder();
+
+ CurrentEncoder = renderCommandEncoder;
+ CurrentEncoderType = EncoderType.Render;
+
+ return renderCommandEncoder;
+ }
+
+ private MTLBlitCommandEncoder BeginBlitPass()
+ {
+ EndCurrentPass();
+
+ using var descriptor = new MTLBlitPassDescriptor();
+ var blitCommandEncoder = _commandBuffer.BlitCommandEncoder(descriptor);
+
+ CurrentEncoder = blitCommandEncoder;
+ CurrentEncoderType = EncoderType.Blit;
+ return blitCommandEncoder;
+ }
+
+ private MTLComputeCommandEncoder BeginComputePass()
+ {
+ EndCurrentPass();
+
+ var computeCommandEncoder = _encoderFactory.CreateComputeCommandEncoder();
+
+ CurrentEncoder = computeCommandEncoder;
+ CurrentEncoderType = EncoderType.Compute;
+ return computeCommandEncoder;
+ }
+}
diff --git a/src/Ryujinx.Graphics.Metal/CommandBufferPool.cs b/src/Ryujinx.Graphics.Metal/CommandBufferPool.cs
new file mode 100644
index 000000000..5e7576b37
--- /dev/null
+++ b/src/Ryujinx.Graphics.Metal/CommandBufferPool.cs
@@ -0,0 +1,289 @@
+using SharpMetal.Metal;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Runtime.Versioning;
+using System.Threading;
+
+namespace Ryujinx.Graphics.Metal
+{
+ [SupportedOSPlatform("macos")]
+ class CommandBufferPool : IDisposable
+ {
+ public const int MaxCommandBuffers = 16;
+
+ private readonly int _totalCommandBuffers;
+ private readonly int _totalCommandBuffersMask;
+ private readonly MTLCommandQueue _queue;
+ private readonly Thread _owner;
+ private IEncoderFactory _defaultEncoderFactory;
+
+ public bool OwnedByCurrentThread => _owner == Thread.CurrentThread;
+
+ [SupportedOSPlatform("macos")]
+ private struct ReservedCommandBuffer
+ {
+ public bool InUse;
+ public bool InConsumption;
+ public int SubmissionCount;
+ public MTLCommandBuffer CommandBuffer;
+ public CommandBufferEncoder Encoders;
+ public FenceHolder Fence;
+
+ public List Dependants;
+ public List