diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..263762bd6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +ko_fi: shadps4 diff --git a/.github/linux-appimage-qt.sh b/.github/linux-appimage-qt.sh index 203d214e3..fe77c678c 100755 --- a/.github/linux-appimage-qt.sh +++ b/.github/linux-appimage-qt.sh @@ -19,12 +19,13 @@ chmod a+x linuxdeploy-x86_64.AppImage chmod a+x linuxdeploy-plugin-qt-x86_64.AppImage chmod a+x linuxdeploy-plugin-checkrt-x86_64.sh - # Build AppImage ./linuxdeploy-x86_64.AppImage --appdir AppDir ./linuxdeploy-plugin-checkrt-x86_64.sh --appdir AppDir cp -a "$GITHUB_WORKSPACE/build/translations" AppDir/usr/bin -./linuxdeploy-x86_64.AppImage --appdir AppDir -d "$GITHUB_WORKSPACE"/.github/shadps4.desktop -e "$GITHUB_WORKSPACE"/build/shadps4 -i "$GITHUB_WORKSPACE"/.github/shadps4.png --plugin qt --output appimage +./linuxdeploy-x86_64.AppImage --appdir AppDir -d "$GITHUB_WORKSPACE"/.github/shadps4.desktop -e "$GITHUB_WORKSPACE"/build/shadps4 -i "$GITHUB_WORKSPACE"/.github/shadps4.png --plugin qt +rm AppDir/usr/plugins/multimedia/libgstreamermediaplugin.so +./linuxdeploy-x86_64.AppImage --appdir AppDir --output appimage mv Shadps4-x86_64.AppImage Shadps4-qt.AppImage diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..7950084cd --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,481 @@ +# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +name: Build and Release + +on: [push, pull_request] + +concurrency: + group: ci-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'push' }} + +env: + BUILD_TYPE: Release + +jobs: + reuse: + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v4 + - uses: fsfe/reuse-action@v4 + + clang-format: + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main' + sudo apt update + sudo apt install clang-format-17 + - name: Build + env: + COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} + run: ./.ci/clang-format.sh + + get-info: + runs-on: ubuntu-latest + outputs: + date: ${{ steps.vars.outputs.date }} + shorthash: ${{ steps.vars.outputs.shorthash }} + steps: + - uses: actions/checkout@v4 + - name: Get date and git hash + id: vars + run: | + echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_ENV + echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_ENV + echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT + echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + windows-sdl: + runs-on: windows-latest + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-sdl-ninja-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{ runner.os }}-sdl-cache-cmake-build + with: + append-timestamp: false + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + + - name: Setup VS Environment + uses: ilammy/msvc-dev-cmd@v1.13.0 + with: + arch: amd64 + + - name: Configure CMake + run: cmake --fresh -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel + + - name: Upload Windows SDL artifact + uses: actions/upload-artifact@v4 + with: + name: shadps4-win64-sdl-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: ${{github.workspace}}/build/shadPS4.exe + + windows-qt: + runs-on: windows-latest + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Qt + uses: jurplel/install-qt-action@v4 + with: + version: 6.7.3 + host: windows + target: desktop + arch: win64_msvc2019_64 + archives: qtbase qttools + modules: qtmultimedia + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-qt-ninja-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{ runner.os }}-qt-cache-cmake-build + with: + append-timestamp: false + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + + - name: Setup VS Environment + uses: ilammy/msvc-dev-cmd@v1.13.0 + with: + arch: amd64 + + - name: Configure CMake + run: cmake --fresh -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel + + - name: Deploy and Package + run: | + mkdir upload + move build/shadPS4.exe upload + windeployqt --no-compiler-runtime --no-system-d3d-compiler --no-system-dxc-compiler --dir upload upload/shadPS4.exe + Compress-Archive -Path upload/* -DestinationPath shadps4-win64-qt-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}.zip + + - name: Upload Windows Qt artifact + uses: actions/upload-artifact@v4 + with: + name: shadps4-win64-qt-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: upload/ + + macos-sdl: + runs-on: macos-latest + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup latest Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest + + - name: Install MoltenVK + run: | + arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + arch -x86_64 /usr/local/bin/brew install molten-vk + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-sdl-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{runner.os}}-sdl-cache-cmake-build + with: + append-timestamp: false + create-symlink: true + key: ${{env.cache-name}}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + variant: sccache + + - name: Configure CMake + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(sysctl -n hw.ncpu) + + - name: Package and Upload macOS SDL artifact + run: | + mkdir upload + mv ${{github.workspace}}/build/shadps4 upload + cp $(arch -x86_64 /usr/local/bin/brew --prefix)/opt/molten-vk/lib/libMoltenVK.dylib upload + tar cf shadps4-macos-sdl.tar.gz -C upload . + - uses: actions/upload-artifact@v4 + with: + name: shadps4-macos-sdl-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: shadps4-macos-sdl.tar.gz + + macos-qt: + runs-on: macos-latest + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup latest Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest + + - name: Install MoltenVK and Setup Qt + run: | + arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + arch -x86_64 /usr/local/bin/brew install molten-vk + - uses: jurplel/install-qt-action@v4 + with: + version: 6.7.3 + host: mac + target: desktop + arch: clang_64 + archives: qtbase qttools + modules: qtmultimedia + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-qt-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{runner.os}}-qt-cache-cmake-build + with: + append-timestamp: false + create-symlink: true + key: ${{env.cache-name}}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + variant: sccache + + - name: Configure CMake + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(sysctl -n hw.ncpu) + + - name: Package and Upload macOS Qt artifact + run: | + mkdir upload + mv ${{github.workspace}}/build/shadps4.app upload + macdeployqt upload/shadps4.app + tar cf shadps4-macos-qt.tar.gz -C upload . + - uses: actions/upload-artifact@v4 + with: + name: shadps4-macos-qt-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: shadps4-macos-qt.tar.gz + + linux-sdl: + runs-on: ubuntu-24.04 + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential libasound2-dev libpulse-dev libopenal-dev + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-sdl-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{ runner.os }}-sdl-cache-cmake-build + with: + append-timestamp: false + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + + - name: Configure CMake + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel + + - name: Package and Upload Linux(ubuntu64) SDL artifact + run: | + ls -la ${{ github.workspace }}/build/shadps4 + + - uses: actions/upload-artifact@v4 + with: + name: shadps4-ubuntu64-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: ${{ github.workspace }}/build/shadps4 + + - name: Run AppImage packaging script + run: ./.github/linux-appimage-sdl.sh + + - name: Package and Upload Linux SDL artifact + run: | + tar cf shadps4-linux-sdl.tar.gz -C ${{github.workspace}}/build shadps4 + - uses: actions/upload-artifact@v4 + with: + name: shadps4-linux-sdl-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: Shadps4-sdl.AppImage + + linux-qt: + runs-on: ubuntu-24.04 + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev libasound2-dev libpulse-dev libopenal-dev + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-qt-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{ runner.os }}-qt-cache-cmake-build + with: + append-timestamp: false + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + + - name: Configure CMake + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel + + - name: Run AppImage packaging script + run: ./.github/linux-appimage-qt.sh + + - name: Package and Upload Linux Qt artifact + run: | + tar cf shadps4-linux-qt.tar.gz -C ${{github.workspace}}/build shadps4 + - uses: actions/upload-artifact@v4 + with: + name: shadps4-linux-qt-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} + path: Shadps4-qt.AppImage + + pre-release: + if: github.ref == 'refs/heads/main' && github.repository == 'shadps4-emu/shadPS4' && github.event_name == 'push' + needs: [get-info, windows-sdl, windows-qt, macos-sdl, macos-qt, linux-sdl, linux-qt] + runs-on: ubuntu-latest + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: ./artifacts + + - name: Compress individual directories (without parent directory) + run: | + cd ./artifacts + for dir in */; do + if [ -d "$dir" ]; then + dir_name=${dir%/} + echo "Creating zip for $dir_name" + (cd "$dir_name" && zip -r "../${dir_name}.zip" .) + fi + done + + - name: Get latest release information + id: get_latest_release + env: + GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }} + run: | + api_url="https://api.github.com/repos/${{ github.repository }}" + latest_release_info=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url/releases/latest") + echo "last_release_tag=$(echo "$latest_release_info" | jq -r '.tag_name')" >> $GITHUB_ENV + + - name: Create Pre-Release on GitHub + id: create_release + uses: ncipollo/release-action@v1 + with: + token: ${{ secrets.SHADPS4_TOKEN_REPO }} + name: "Pre-release-shadPS4-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}" + tag: "Pre-release-shadPS4-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }}" + draft: false + prerelease: true + body: "Full Changelog: [${{ env.last_release_tag }}...${{ needs.get-info.outputs.shorthash }}](https://github.com/shadps4-emu/shadPS4/compare/${{ env.last_release_tag }}...${{ needs.get-info.outputs.shorthash }})" + artifacts: ./artifacts/*.zip + + - name: Get current pre-release information + env: + GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }} + run: | + api_url="https://api.github.com/repos/${{ github.repository }}/releases" + + # Get all releases (sorted by date) + releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url") + + # Capture the most recent pre-release (assuming the first one is the latest) + current_release=$(echo "$releases" | jq -c '.[] | select(.prerelease == true) | .published_at' | sort -r | head -n 1) + + # Remove extra quotes from captured date + current_release=$(echo $current_release | tr -d '"') + + # Export the current published_at to be available for the next step + echo "CURRENT_PUBLISHED_AT=$current_release" >> $GITHUB_ENV + + - name: Delete old pre-releases and tags + env: + GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }} + run: | + api_url="https://api.github.com/repos/${{ github.repository }}/releases" + + # Get current pre-releases + releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url") + + # Remove extra quotes from captured date + CURRENT_PUBLISHED_AT=$(echo $CURRENT_PUBLISHED_AT | tr -d '"') + + # Convert CURRENT_PUBLISHED_AT para timestamp Unix + current_published_ts=$(date -d "$CURRENT_PUBLISHED_AT" +%s) + + # Identify pre-releases + echo "$releases" | jq -c '.[] | select(.prerelease == true)' | while read -r release; do + release_date=$(echo "$release" | jq -r '.published_at') + release_id=$(echo "$release" | jq -r '.id') + release_tag=$(echo "$release" | jq -r '.tag_name') + + # Remove extra quotes from captured date + release_date=$(echo $release_date | tr -d '"') + + # Convert release_date para timestamp Unix + release_date_ts=$(date -d "$release_date" +%s) + + # Compare timestamps and delete old pre-releases + if [[ "$release_date_ts" -lt "$current_published_ts" ]]; then + echo "Deleting old pre-release: $release_id from $release_date with tag: $release_tag" + # Delete the pre-release + curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" "$api_url/$release_id" + # Delete the tag + curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/${{ github.repository }}/git/refs/tags/$release_tag" + else + echo "Skipping pre-release: $release_id (newer or same date)" + fi + done diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 123c7f3f8..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,17 +0,0 @@ -# SPDX-FileCopyrightText: 2021 yuzu Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: Reuse - -on: - push: - branches: [ main ] - tags: [ "*" ] - pull_request: - branches: [ main ] -jobs: - reuse: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: fsfe/reuse-action@v4 diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml deleted file mode 100644 index b9887ccac..000000000 --- a/.github/workflows/format.yml +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: Clang Format - -on: - push: - branches: [ "*" ] - pull_request: - branches: [ main ] - -jobs: - clang-format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install - run: | - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main' - sudo apt update - sudo apt install clang-format-17 - - name: Build - env: - COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} - run: ./.ci/clang-format.sh \ No newline at end of file diff --git a/.github/workflows/linux-qt.yml b/.github/workflows/linux-qt.yml deleted file mode 100644 index 6848f203b..000000000 --- a/.github/workflows/linux-qt.yml +++ /dev/null @@ -1,66 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: Linux-Qt - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - BUILD_TYPE: Release - -jobs: - build: - runs-on: ubuntu-24.04 - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install misc packages - run: > - sudo apt-get update && sudo apt install libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev - - - name: Cache CMake dependency source code - uses: actions/cache@v4 - env: - cache-name: ${{ runner.os }}-qt-cache-cmake-dependency-sources - with: - path: | - ${{github.workspace}}/build - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - restore-keys: | - ${{ env.cache-name }}- - - - name: Cache CMake dependency build objects - uses: hendrikmuhs/ccache-action@v1.2.14 - env: - cache-name: ${{ runner.os }}-qt-cache-cmake-dependency-builds - with: - append-timestamp: false - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - - - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - - - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel - - - name: Run AppImage packaging script - run: ./.github/linux-appimage-qt.sh - - - name: Get date and git hash - id: vars - run: | - echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-linux-qt-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: Shadps4-qt.AppImage diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml deleted file mode 100644 index d4402472a..000000000 --- a/.github/workflows/linux.yml +++ /dev/null @@ -1,73 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: Linux - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - BUILD_TYPE: Release - -jobs: - build: - runs-on: ubuntu-24.04 - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install misc packages - run: > - sudo apt-get update && sudo apt install libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential - - - name: Cache CMake dependency source code - uses: actions/cache@v4 - env: - cache-name: ${{ runner.os }}-sdl-cache-cmake-dependency-sources - with: - path: | - ${{github.workspace}}/build - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - restore-keys: | - ${{ env.cache-name }}- - - - name: Cache CMake dependency build objects - uses: hendrikmuhs/ccache-action@v1.2.14 - env: - cache-name: ${{ runner.os }}-sdl-cache-cmake-dependency-builds - with: - append-timestamp: false - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - - - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - - - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel - - - name: Get date and git hash - id: vars - run: | - echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-ubuntu64-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: | - ${{github.workspace}}/build/shadps4 - - - name: Run AppImage packaging script - run: ./.github/linux-appimage-sdl.sh - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-sdl-appimage-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: Shadps4-sdl.AppImage diff --git a/.github/workflows/macos-qt.yml b/.github/workflows/macos-qt.yml deleted file mode 100644 index beb927a79..000000000 --- a/.github/workflows/macos-qt.yml +++ /dev/null @@ -1,88 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: macOS-Qt - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - BUILD_TYPE: Release - -jobs: - build: - runs-on: macos-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Setup latest Xcode - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: latest - - - name: Install MoltenVK - run: | - arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - arch -x86_64 /usr/local/bin/brew install molten-vk - - - name: Setup Qt - uses: jurplel/install-qt-action@v4 - with: - version: 6.7.2 - host: mac - target: desktop - arch: clang_64 - archives: qtbase qttools - - - name: Cache CMake dependency source code - uses: actions/cache@v4 - env: - cache-name: ${{ runner.os }}-qt-cache-cmake-dependency-sources - with: - path: | - ${{github.workspace}}/build - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - restore-keys: | - ${{ env.cache-name }}- - - - name: Cache CMake dependency build objects - uses: hendrikmuhs/ccache-action@v1.2.14 - env: - cache-name: ${{runner.os}}-qt-cache-cmake-dependency-builds - with: - append-timestamp: false - create-symlink: true - key: ${{env.cache-name}}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - variant: sccache - - - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache - - - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(sysctl -n hw.ncpu) - - - name: Package - run: | - mkdir upload - mv ${{github.workspace}}/build/shadps4.app upload - macdeployqt upload/shadps4.app - tar cf shadps4-macos-qt.tar.gz -C upload . - - - name: Get date and git hash - id: vars - run: | - echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-macos-qt-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: shadps4-macos-qt.tar.gz diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml deleted file mode 100644 index 9526c6fd6..000000000 --- a/.github/workflows/macos.yml +++ /dev/null @@ -1,79 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: macOS - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - BUILD_TYPE: Release - -jobs: - build: - runs-on: macos-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Setup latest Xcode - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: latest - - - name: Install MoltenVK - run: | - arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - arch -x86_64 /usr/local/bin/brew install molten-vk - - - name: Cache CMake dependency source code - uses: actions/cache@v4 - env: - cache-name: ${{ runner.os }}-sdl-cache-cmake-dependency-sources - with: - path: | - ${{github.workspace}}/build - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - restore-keys: | - ${{ env.cache-name }}- - - - name: Cache CMake dependency build objects - uses: hendrikmuhs/ccache-action@v1.2.14 - env: - cache-name: ${{runner.os}}-sdl-cache-cmake-dependency-builds - with: - append-timestamp: false - create-symlink: true - key: ${{env.cache-name}}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - variant: sccache - - - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache - - - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(sysctl -n hw.ncpu) - - - name: Package - run: | - mkdir upload - mv ${{github.workspace}}/build/shadps4 upload - cp $(arch -x86_64 /usr/local/bin/brew --prefix)/opt/molten-vk/lib/libMoltenVK.dylib upload - install_name_tool -add_rpath "@loader_path" upload/shadps4 - tar cf shadps4-macos-sdl.tar.gz -C upload . - - - name: Get date and git hash - id: vars - run: | - echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - echo "shorthash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-macos-sdl-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: shadps4-macos-sdl.tar.gz diff --git a/.github/workflows/windows-qt.yml b/.github/workflows/windows-qt.yml deleted file mode 100644 index fee202b5c..000000000 --- a/.github/workflows/windows-qt.yml +++ /dev/null @@ -1,67 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: Windows-Qt - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - BUILD_TYPE: Release - -jobs: - build: - runs-on: windows-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Setup Qt - uses: jurplel/install-qt-action@v4 - with: - version: 6.7.2 - host: windows - target: desktop - arch: win64_msvc2019_64 - archives: qtbase qttools - - - name: Cache CMake dependency source code - uses: actions/cache@v4 - env: - cache-name: ${{ runner.os }}-qt-cache-cmake-dependency-sources - with: - path: | - ${{github.workspace}}/build - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - restore-keys: | - ${{ env.cache-name }}- - - - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL -DENABLE_QT_GUI=ON - - - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel - - - name: Deploy - run: | - mkdir upload - move build/Release/shadPS4.exe upload - windeployqt --dir upload upload/shadPS4.exe - - - name: Get date and git hash - id: vars - shell: pwsh - run: | - echo "date=$(Get-Date -Format 'yyyy-MM-dd')" >> $env:GITHUB_OUTPUT - echo "shorthash=$(git rev-parse --short HEAD)" >> $env:GITHUB_OUTPUT - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-win64-qt-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: upload diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml deleted file mode 100644 index 4bea63b16..000000000 --- a/.github/workflows/windows.yml +++ /dev/null @@ -1,52 +0,0 @@ -# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -name: Windows - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - BUILD_TYPE: Release - -jobs: - build: - runs-on: windows-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Cache CMake dependency source code - uses: actions/cache@v4 - env: - cache-name: ${{ runner.os }}-sdl-cache-cmake-dependency-sources - with: - path: | - ${{github.workspace}}/build - key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - restore-keys: | - ${{ env.cache-name }}- - - - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL - - - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel - - - name: Get date and git hash - id: vars - shell: pwsh - run: | - echo "date=$(Get-Date -Format 'yyyy-MM-dd')" >> $env:GITHUB_OUTPUT - echo "shorthash=$(git rev-parse --short HEAD)" >> $env:GITHUB_OUTPUT - - - name: Upload executable - uses: actions/upload-artifact@v4 - with: - name: shadps4-win64-sdl-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.shorthash }} - path: | - ${{github.workspace}}/build/Release/shadPS4.exe diff --git a/.gitignore b/.gitignore index 087f29683..9abc4aae4 100644 --- a/.gitignore +++ b/.gitignore @@ -387,6 +387,8 @@ FodyWeavers.xsd !.vscode/launch.json !.vscode/extensions.json *.code-workspace +/CMakeUserPresets.json +/compile_commands.json # Local History for Visual Studio Code .history/ @@ -409,6 +411,6 @@ FodyWeavers.xsd /out/* /third-party/out/* /src/common/scm_rev.cpp - + # for macOS -**/.DS_Store \ No newline at end of file +**/.DS_Store diff --git a/.gitmodules b/.gitmodules index 1bef08d4b..f4ef8d910 100644 --- a/.gitmodules +++ b/.gitmodules @@ -85,11 +85,16 @@ [submodule "externals/half"] path = externals/half url = https://github.com/ROCm/half.git + shallow = true [submodule "externals/dear_imgui"] path = externals/dear_imgui url = https://github.com/shadps4-emu/ext-imgui.git shallow = true branch = docking +[submodule "externals/pugixml"] + path = externals/pugixml + url = https://github.com/zeux/pugixml.git + shallow = true [submodule "externals/LibAtrac9"] path = externals/LibAtrac9 - url = https://github.com/Vita3K/LibAtrac9 + url = https://github.com/Vita3K/LibAtrac9 \ No newline at end of file diff --git a/.reuse/dep5 b/.reuse/dep5 deleted file mode 100644 index 0140c0c02..000000000 --- a/.reuse/dep5 +++ /dev/null @@ -1,60 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Comment: It is best to use this file to record copyright information about - generated, binary and third party files - -Files: CMakeSettings.json - .github/shadps4.desktop - .github/shadps4.png - .gitmodules - documents/changelog.txt - documents/readme.txt - documents/Quickstart/1.png - documents/Quickstart/2.png - documents/Screenshots/Bloodborne.png - documents/Screenshots/Sonic Mania.png - documents/Screenshots/Undertale.png - documents/Screenshots/We are DOOMED.png - scripts/ps4_names.txt - src/images/about_icon.png - src/images/controller_icon.png - src/images/exit_icon.png - src/images/file_icon.png - src/images/flag_china.png - src/images/flag_eu.png - src/images/flag_jp.png - src/images/flag_unk.png - src/images/flag_us.png - src/images/flag_world.png - src/images/folder_icon.png - src/images/grid_icon.png - src/images/iconsize_icon.png - src/images/list_icon.png - src/images/list_mode_icon.png - src/images/pause_icon.png - src/images/play_icon.png - src/images/refresh_icon.png - src/images/settings_icon.png - src/images/stop_icon.png - src/images/shadPS4.icns - src/images/shadps4.ico - src/images/themes_icon.png - src/shadps4.qrc - src/shadps4.rc -Copyright: shadPS4 Emulator Project -License: GPL-2.0-or-later - -Files: externals/cmake-modules/* -Copyright: 2009-2010 Iowa State University -License: BSL-1.0 - -Files: externals/renderdoc/* -Copyright: 2019-2024 Baldur Karlsson -License: MIT - -Files: externals/stb_image.h -Copyright: 2017 Sean Barrett -License: MIT - -Files: externals/tracy/* -Copyright: 2017-2024 Bartosz Taudul -License: BSD-3-Clause diff --git a/CMakeLists.txt b/CMakeLists.txt index bae59b831..d51fd5e72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) if(APPLE) enable_language(OBJC) - set(CMAKE_OSX_DEPLOYMENT_TARGET 11) + set(CMAKE_OSX_DEPLOYMENT_TARGET 14) endif() if (NOT CMAKE_BUILD_TYPE) @@ -47,6 +47,11 @@ else() message(FATAL_ERROR "Unsupported CPU architecture: ${BASE_ARCHITECTURE}") endif() +if (APPLE AND ARCHITECTURE STREQUAL "x86_64") + # Exclude ARM homebrew path to avoid conflicts when cross compiling. + list(APPEND CMAKE_IGNORE_PREFIX_PATH "/opt/homebrew") +endif() + # This function should be passed a list of all files in a target. It will automatically generate file groups # following the directory hierarchy, so that the layout of the files in IDEs matches the one in the filesystem. function(create_target_directory_groups target_name) @@ -90,6 +95,7 @@ include(GetGitRevisionDescription) get_git_head_revision(GIT_REF_SPEC GIT_REV) git_describe(GIT_DESC --always --long --dirty) git_branch_name(GIT_BRANCH) +string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp" @ONLY) @@ -108,6 +114,7 @@ find_package(xbyak 7.07 CONFIG) find_package(xxHash 0.8.2 MODULE) find_package(zlib-ng 2.1.7 MODULE) find_package(Zydis 5.0.0 CONFIG) +find_package(pugixml 1.14 CONFIG) if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR NOT MSVC) find_package(cryptopp 8.9.0 MODULE) @@ -137,7 +144,7 @@ add_subdirectory(externals) include_directories(src) if(ENABLE_QT_GUI) - find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network) + find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network Multimedia) qt_standard_project_setup() set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) @@ -215,6 +222,9 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/net.cpp src/core/libraries/network/netctl.cpp src/core/libraries/network/netctl.h + src/core/libraries/network/net_ctl_obj.cpp + src/core/libraries/network/net_ctl_obj.h + src/core/libraries/network/net_ctl_codes.h src/core/libraries/network/net.h src/core/libraries/network/ssl.cpp src/core/libraries/network/ssl.h @@ -227,11 +237,18 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp src/core/libraries/system/msgdialog_ui.cpp src/core/libraries/system/posix.cpp src/core/libraries/system/posix.h - src/core/libraries/save_data/error_codes.h + src/core/libraries/save_data/save_backup.cpp + src/core/libraries/save_data/save_backup.h + src/core/libraries/save_data/save_instance.cpp + src/core/libraries/save_data/save_instance.h + src/core/libraries/save_data/save_memory.cpp + src/core/libraries/save_data/save_memory.h src/core/libraries/save_data/savedata.cpp src/core/libraries/save_data/savedata.h - src/core/libraries/system/savedatadialog.cpp - src/core/libraries/system/savedatadialog.h + src/core/libraries/save_data/dialog/savedatadialog.cpp + src/core/libraries/save_data/dialog/savedatadialog.h + src/core/libraries/save_data/dialog/savedatadialog_ui.cpp + src/core/libraries/save_data/dialog/savedatadialog_ui.h src/core/libraries/system/sysmodule.cpp src/core/libraries/system/sysmodule.h src/core/libraries/system/systemservice.cpp @@ -317,12 +334,27 @@ set(NP_LIBS src/core/libraries/np_manager/np_manager.cpp src/core/libraries/np_score/np_score.h src/core/libraries/np_trophy/np_trophy.cpp src/core/libraries/np_trophy/np_trophy.h + src/core/libraries/np_trophy/trophy_ui.cpp + src/core/libraries/np_trophy/trophy_ui.h ) set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp src/core/libraries/screenshot/screenshot.h ) +set(DEV_TOOLS src/core/devtools/layer.cpp + src/core/devtools/layer.h + src/core/devtools/gcn/gcn_context_regs.cpp + src/core/devtools/gcn/gcn_op_names.cpp + src/core/devtools/gcn/gcn_shader_regs.cpp + src/core/devtools/widget/cmd_list.cpp + src/core/devtools/widget/cmd_list.h + src/core/devtools/widget/frame_dump.cpp + src/core/devtools/widget/frame_dump.h + src/core/devtools/widget/frame_graph.cpp + src/core/devtools/widget/frame_graph.h +) + set(COMMON src/common/logging/backend.cpp src/common/logging/backend.h src/common/logging/filter.cpp @@ -342,9 +374,11 @@ set(COMMON src/common/logging/backend.cpp src/common/concepts.h src/common/config.cpp src/common/config.h + src/common/cstring.h src/common/debug.h - src/common/disassembler.cpp - src/common/disassembler.h + src/common/decoder.cpp + src/common/decoder.h + src/common/elf_info.h src/common/endian.h src/common/enum.h src/common/io_file.cpp @@ -362,6 +396,8 @@ set(COMMON src/common/logging/backend.cpp src/common/polyfill_thread.h src/common/rdtsc.cpp src/common/rdtsc.h + src/common/signal_context.h + src/common/signal_context.cpp src/common/singleton.h src/common/slot_vector.h src/common/string_util.cpp @@ -374,6 +410,8 @@ set(COMMON src/common/logging/backend.cpp src/common/version.h src/common/ntapi.h src/common/ntapi.cpp + src/common/memory_patcher.h + src/common/memory_patcher.cpp src/common/scm_rev.cpp src/common/scm_rev.h ) @@ -428,6 +466,9 @@ set(CORE src/core/aerolib/stubs.cpp ${USBD_LIB} ${MISC_LIBS} ${DIALOGS_LIB} + ${DEV_TOOLS} + src/core/debug_state.cpp + src/core/debug_state.h src/core/linker.cpp src/core/linker.h src/core/memory.cpp @@ -435,6 +476,8 @@ set(CORE src/core/aerolib/stubs.cpp src/core/module.cpp src/core/module.h src/core/platform.h + src/core/signals.cpp + src/core/signals.h src/core/tls.cpp src/core/tls.h src/core/virtual_memory.cpp @@ -455,6 +498,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/params.h src/shader_recompiler/runtime_info.h src/shader_recompiler/specialization.h + src/shader_recompiler/backend/bindings.h src/shader_recompiler/backend/spirv/emit_spirv.cpp src/shader_recompiler/backend/spirv/emit_spirv.h src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp @@ -478,6 +522,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/frontend/translate/data_share.cpp src/shader_recompiler/frontend/translate/export.cpp src/shader_recompiler/frontend/translate/scalar_alu.cpp + src/shader_recompiler/frontend/translate/scalar_flow.cpp src/shader_recompiler/frontend/translate/scalar_memory.cpp src/shader_recompiler/frontend/translate/translate.cpp src/shader_recompiler/frontend/translate/translate.h @@ -486,6 +531,8 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/frontend/translate/vector_memory.cpp src/shader_recompiler/frontend/control_flow_graph.cpp src/shader_recompiler/frontend/control_flow_graph.h + src/shader_recompiler/frontend/copy_shader.cpp + src/shader_recompiler/frontend/copy_shader.h src/shader_recompiler/frontend/decode.cpp src/shader_recompiler/frontend/decode.h src/shader_recompiler/frontend/fetch_shader.cpp @@ -502,6 +549,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/ir/passes/ir_passes.h src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp src/shader_recompiler/ir/passes/resource_tracking_pass.cpp + src/shader_recompiler/ir/passes/ring_access_elimination.cpp src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp src/shader_recompiler/ir/abstract_syntax_list.h @@ -534,6 +582,7 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp src/video_core/amdgpu/pm4_cmds.h src/video_core/amdgpu/pm4_opcodes.h src/video_core/amdgpu/resource.h + src/video_core/amdgpu/types.h src/video_core/amdgpu/default_context.cpp src/video_core/buffer_cache/buffer.cpp src/video_core/buffer_cache/buffer.h @@ -560,6 +609,8 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp src/video_core/renderer_vulkan/vk_master_semaphore.h src/video_core/renderer_vulkan/vk_pipeline_cache.cpp src/video_core/renderer_vulkan/vk_pipeline_cache.h + src/video_core/renderer_vulkan/vk_pipeline_common.cpp + src/video_core/renderer_vulkan/vk_pipeline_common.h src/video_core/renderer_vulkan/vk_platform.cpp src/video_core/renderer_vulkan/vk_platform.h src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -596,14 +647,15 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp set(IMGUI src/imgui/imgui_config.h src/imgui/imgui_layer.h src/imgui/imgui_std.h - src/imgui/layer/video_info.cpp - src/imgui/layer/video_info.h + src/imgui/imgui_texture.h src/imgui/renderer/imgui_core.cpp src/imgui/renderer/imgui_core.h src/imgui/renderer/imgui_impl_sdl3.cpp src/imgui/renderer/imgui_impl_sdl3.h src/imgui/renderer/imgui_impl_vulkan.cpp src/imgui/renderer/imgui_impl_vulkan.h + src/imgui/renderer/texture_manager.cpp + src/imgui/renderer/texture_manager.h ) set(INPUT src/input/controller.cpp @@ -624,10 +676,12 @@ qt_add_resources(RESOURCE_FILES src/shadps4.qrc) set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/about_dialog.h src/qt_gui/about_dialog.ui + src/qt_gui/background_music_player.cpp + src/qt_gui/background_music_player.h src/qt_gui/cheats_patches.cpp src/qt_gui/cheats_patches.h - src/qt_gui/memory_patcher.cpp - src/qt_gui/memory_patcher.h + src/qt_gui/check_update.cpp + src/qt_gui/check_update.h src/qt_gui/main_window_ui.h src/qt_gui/main_window.cpp src/qt_gui/main_window.h @@ -692,8 +746,8 @@ endif() create_target_directory_groups(shadps4) -target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui LibAtrac9) -target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::SPIRV glslang::glslang SDL3::SDL3) +target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui LibAtrac9 gcn) +target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::SPIRV glslang::glslang SDL3::SDL3 pugixml::pugixml) target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h") target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h") @@ -731,7 +785,7 @@ else() endif() if (ENABLE_QT_GUI) - target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network) + target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network Qt6::Multimedia) add_definitions(-DENABLE_QT_GUI) endif() @@ -787,6 +841,11 @@ add_subdirectory(${HOST_SHADERS_INCLUDE}) add_dependencies(shadps4 host_shaders) target_include_directories(shadps4 PRIVATE ${HOST_SHADERS_INCLUDE}) +# ImGui resources +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/imgui/renderer) +add_dependencies(shadps4 ImGui_Resources) +target_include_directories(shadps4 PRIVATE ${IMGUI_RESOURCES_INCLUDE}) + if (ENABLE_QT_GUI) set_target_properties(shadps4 PROPERTIES # WIN32_EXECUTABLE ON @@ -802,4 +861,4 @@ if (UNIX AND NOT APPLE) find_package(OpenSSL REQUIRED) target_link_libraries(shadps4 PRIVATE ${OPENSSL_LIBRARIES}) endif() -endif() +endif() \ No newline at end of file diff --git a/CMakeSettings.json b/CMakeSettings.json index 9242e0808..bb522fcfc 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -9,7 +9,8 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64_x64" ] + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "intelliSenseMode": "windows-clang-x64" }, { "name": "x64-Clang-Debug", @@ -20,7 +21,8 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64_x64" ] + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "intelliSenseMode": "windows-clang-x64" }, { "name": "x64-Clang-RelWithDebInfo", @@ -31,7 +33,8 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64_x64" ] + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "intelliSenseMode": "windows-clang-x64" } ] } \ No newline at end of file diff --git a/LICENSES/OFL-1.1.txt b/LICENSES/OFL-1.1.txt new file mode 100644 index 000000000..6fe84ee21 --- /dev/null +++ b/LICENSES/OFL-1.1.txt @@ -0,0 +1,43 @@ +SIL OPEN FONT LICENSE + +Version 1.1 - 26 February 2007 + +PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. + +DEFINITIONS + +"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright statement(s). + +"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. + +TERMINATION + +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/README.md b/README.md index 5cf307e33..da01833e5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ SPDX-License-Identifier: GPL-2.0-or-later

- + @@ -26,30 +26,32 @@ SPDX-License-Identifier: GPL-2.0-or-later

- - - - + + + +

# General information -shadPS4 is an early **PlayStation 4** emulator for **Windows**, **Linux** and **macOS** written in C++. +**shadPS4** is an early **PlayStation 4** emulator for **Windows**, **Linux** and **macOS** written in C++. If you encounter problems or have doubts, do not hesitate to look at the [**Quickstart**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Quickstart/Quickstart.md). To verify that a game works, you can look at [**shadPS4 Game Compatibility**](https://github.com/shadps4-emu/shadps4-game-compatibility). -To discuss shadPS4 development, suggest ideas or to ask for help, join our [**Discord server**](https://discord.gg/MyZRaBngxA). +To discuss shadPS4 development, suggest ideas or to ask for help, join our [**Discord server**](https://discord.gg/bFJxfftGW6). To get the latest news, go to our [**X (Twitter)**](https://x.com/shadps4) or our [**website**](https://shadps4.net/). +For those who'd like to donate to the project, we now have a [**Kofi page**](https://ko-fi.com/shadps4)! + # Status > [!IMPORTANT] > shadPS4 is early in development, don't expect a flawless experience. -Currently, the emulator successfully runs small games like [**Sonic Mania**](https://www.youtube.com/watch?v=AAHoNzhHyCU), [**Undertale**](https://youtu.be/5zIvdy65Ro4) and it can even *somewhat* run [**Bloodborne**](https://www.youtube.com/watch?v=wC6s0avpQRE). +Currently, the emulator successfully runs small games like [**Sonic Mania**](https://www.youtube.com/watch?v=AAHoNzhHyCU), [**Undertale**](https://youtu.be/5zIvdy65Ro4) and it can even run [**Bloodborne**](https://www.youtube.com/watch?v=wC6s0avpQRE). # Why @@ -69,40 +71,12 @@ Check the build instructions for [**Linux**](https://github.com/shadps4-emu/shad Check the build instructions for [**macOS**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/building-macos.md). -Note that macOS users need at least macOS 15 on an Apple Silicon Mac, or at least macOS 11 on an Intel Mac. - -## Building status - -
-Windows - -| Windows | Build status | -|--------|--------| -|Windows SDL Build|[![Windows-sdl](https://github.com/shadps4-emu/shadPS4/actions/workflows/windows.yml/badge.svg)](https://github.com/shadps4-emu/shadPS4/actions/workflows/windows.yml) -|Windows Qt Build|[![Windows-qt](https://github.com/shadps4-emu/shadPS4/actions/workflows/windows-qt.yml/badge.svg)](https://github.com/shadps4-emu/shadPS4/actions/workflows/windows-qt.yml) -
- -
-Linux - -| Linux | Build status | -|--------|--------| -|Linux SDL Build|[![Linux-sdl](https://github.com/shadps4-emu/shadPS4/actions/workflows/linux.yml/badge.svg)](https://github.com/shadps4-emu/shadPS4/actions/workflows/linux.yml) -|Linux Qt Build|[![Linux-qt](https://github.com/shadps4-emu/shadPS4/actions/workflows/linux-qt.yml/badge.svg)](https://github.com/shadps4-emu/shadPS4/actions/workflows/linux-qt.yml) -
- -
-macOS - -| macOS | Build status | -|--------|--------| -|macOS SDL Build|[![macOS-sdl](https://github.com/shadps4-emu/shadPS4/actions/workflows/macos.yml/badge.svg)](https://github.com/shadps4-emu/shadPS4/actions/workflows/macos.yml) -|macOS Qt Build|[![macOS-qt](https://github.com/shadps4-emu/shadPS4/actions/workflows/macos-qt.yml/badge.svg)](https://github.com/shadps4-emu/shadPS4/actions/workflows/macos-qt.yml) -
+> [!IMPORTANT] +> macOS users need at least macOS 15 on Apple Silicon-based Mac devices and at least macOS 14 on Intel-based Mac devices. # Debugging and reporting issues -For more information on how to test, debug and report issues with the emulator or games, read the [Debugging documentation](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md). +For more information on how to test, debug and report issues with the emulator or games, read the [**Debugging documentation**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md). # Keyboard mapping @@ -172,12 +146,6 @@ A few noteworthy teams/projects who've helped us along the way are: - [**hydra**](https://github.com/hydra-emu/hydra): A multisystem, multiplatform emulator (chip-8, GB, NES, N64) from Paris. - -# Sister Projects - -- [**Panda3DS**](https://github.com/wheremyfoodat/Panda3DS): A multiplatform 3DS emulator from our co-author wheremyfoodat. -- [**hydra**](https://github.com/hydra-emu/hydra): A multisystem, multiplatform emulator (chip-8, GB, NES, N64) from Paris. - # License - [**GPL-2.0 license**](https://github.com/shadps4-emu/shadPS4/blob/main/LICENSE) diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 000000000..e1a266030 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,87 @@ +version = 1 + +[[annotations]] +path = [ + "REUSE.toml", + "CMakeSettings.json", + ".github/FUNDING.yml", + ".github/shadps4.desktop", + ".github/shadps4.png", + ".gitmodules", + "documents/changelog.txt", + "documents/Quickstart/2.png", + "documents/Screenshots/*", + "scripts/ps4_names.txt", + "src/images/about_icon.png", + "src/images/controller_icon.png", + "src/images/dump_icon.png", + "src/images/exit_icon.png", + "src/images/file_icon.png", + "src/images/flag_china.png", + "src/images/flag_eu.png", + "src/images/flag_jp.png", + "src/images/flag_unk.png", + "src/images/flag_us.png", + "src/images/flag_world.png", + "src/images/folder_icon.png", + "src/images/grid_icon.png", + "src/images/iconsize_icon.png", + "src/images/list_icon.png", + "src/images/list_mode_icon.png", + "src/images/pause_icon.png", + "src/images/play_icon.png", + "src/images/refresh_icon.png", + "src/images/settings_icon.png", + "src/images/stop_icon.png", + "src/images/shadPS4.icns", + "src/images/shadps4.ico", + "src/images/themes_icon.png", + "src/images/update_icon.png", + "src/shadps4.qrc", + "src/shadps4.rc", +] +precedence = "aggregate" +SPDX-FileCopyrightText = "shadPS4 Emulator Project" +SPDX-License-Identifier = "GPL-2.0-or-later" + +[[annotations]] +path = "externals/cmake-modules/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2009-2010 Iowa State University" +SPDX-License-Identifier = "BSL-1.0" + +[[annotations]] +path = "externals/renderdoc/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2019-2024 Baldur Karlsson" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "externals/stb_image.h" +precedence = "aggregate" +SPDX-FileCopyrightText = "2017 Sean Barrett" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "externals/tracy/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2017-2024 Bartosz Taudul " +SPDX-License-Identifier = "BSD-3-Clause" + +[[annotations]] +path = "src/imgui/renderer/fonts/NotoSansJP-Regular.ttf" +precedence = "aggregate" +SPDX-FileCopyrightText = "2012 Google Inc. All Rights Reserved." +SPDX-License-Identifier = "OFL-1.1" + +[[annotations]] +path = "src/imgui/renderer/fonts/ProggyVector-Regular.ttf" +precedence = "aggregate" +SPDX-FileCopyrightText = "Copyright (c) 2004, 2005 Tristan Grimmer" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "externals/gcn/include/**" +SPDX-FileCopyrightText = "NONE" +SPDX-License-Identifier = "CC0-1.0" + diff --git a/documents/Quickstart/Quickstart.md b/documents/Quickstart/Quickstart.md index 4dd897d85..7e496bcce 100644 --- a/documents/Quickstart/Quickstart.md +++ b/documents/Quickstart/Quickstart.md @@ -39,16 +39,12 @@ SPDX-License-Identifier: GPL-2.0-or-later ## How to run the latest Work-in-Progress builds of ShadPS4 -1. Go to and make sure you are logged into your GitHub account (important!) -2. On the left side of the page, select your operating system of choice (the "**qt**" versions have a user interface, which is probably the one you want. The others are SDL versions, which can only be run via command line). ![image](https://github.com/user-attachments/assets/43f01bbf-236c-4d6d-98ac-f5a5badd4ce8) +1. Go to In the release identified as 'pre-release' click on the down arrow(Assets), select your operating system of choice (the "**qt**" versions have a user interface, which is probably the one you want. The others are SDL versions, which can only be run via command line). +![image](https://github.com/user-attachments/assets/af520c77-797c-41a0-8f67-d87f5de3e3df) -3. In the workflow list, select the latest entry with a green :white_check_mark: icon in front of it. (or the latest entry for whatever pull request you wish to test). ![image](https://github.com/user-attachments/assets/6365f407-867c-44ae-bf00-944f8d84a349) +2. Once downloaded, extract to its own folder, and run ShadPS4's executable from the extracted folder. -4. On the bottom of this page, select the name of the file, and it should start downloading. (If there is no file here, double check that you are indeed logged into a GitHub account, and that there is a green :white_check_mark: icon. ![image](https://github.com/user-attachments/assets/97924500-3911-4f90-ab63-ffae7e52700b) - -5. Once downloaded, extract to its own folder, and run ShadPS4's executable from the extracted folder. - -6. Upon first launch, ShadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that ShadPS4 can use to install your PKG files to. +3. Upon first launch, ShadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that ShadPS4 can use to install your PKG files to. ## Install PKG files @@ -78,4 +74,4 @@ Here's a list of configuration entries that are worth changing: - If you'd like to mute everything, but still want to receive messages from Vulkan rendering: `*:Error Render.Vulkan:Info` - `[GPU]` - - `screenWidth` and `screenHeight`: Configures the game window width and height. \ No newline at end of file + - `screenWidth` and `screenHeight`: Configures the game window width and height. diff --git a/documents/Screenshots/1.png b/documents/Screenshots/1.png new file mode 100644 index 000000000..f5a5299e6 Binary files /dev/null and b/documents/Screenshots/1.png differ diff --git a/documents/Screenshots/2.png b/documents/Screenshots/2.png new file mode 100644 index 000000000..c80ff04f7 Binary files /dev/null and b/documents/Screenshots/2.png differ diff --git a/documents/Screenshots/3.png b/documents/Screenshots/3.png new file mode 100644 index 000000000..c41d71c8c Binary files /dev/null and b/documents/Screenshots/3.png differ diff --git a/documents/Screenshots/4.png b/documents/Screenshots/4.png new file mode 100644 index 000000000..e5aaa66e2 Binary files /dev/null and b/documents/Screenshots/4.png differ diff --git a/documents/Screenshots/Bloodborne.png b/documents/Screenshots/Bloodborne.png deleted file mode 100644 index b66222b47..000000000 Binary files a/documents/Screenshots/Bloodborne.png and /dev/null differ diff --git a/documents/Screenshots/Sonic Mania.png b/documents/Screenshots/Sonic Mania.png deleted file mode 100644 index 70bdacec3..000000000 Binary files a/documents/Screenshots/Sonic Mania.png and /dev/null differ diff --git a/documents/Screenshots/Undertale.png b/documents/Screenshots/Undertale.png deleted file mode 100644 index c3e7745d0..000000000 Binary files a/documents/Screenshots/Undertale.png and /dev/null differ diff --git a/documents/Screenshots/We are DOOMED.png b/documents/Screenshots/We are DOOMED.png deleted file mode 100644 index 757160e5b..000000000 Binary files a/documents/Screenshots/We are DOOMED.png and /dev/null differ diff --git a/documents/building-linux.md b/documents/building-linux.md index 622de543b..989669f4f 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -3,28 +3,28 @@ SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project SPDX-License-Identifier: GPL-2.0-or-later --> -## Build shadPS4 for Linux +## Build shadPS4 for Linux ### Install the necessary tools to build shadPS4: #### Debian & Ubuntu ``` -sudo apt-get install build-essential libasound2-dev libpulse-dev libopenal-dev zlib1g-dev libedit-dev libvulkan-dev libudev-dev git libevdev-dev libsdl2-2.0 libsdl2-dev libjack-dev libsndio-dev qt6-base-dev qt6-tools-dev +sudo apt install build-essential clang git cmake libasound2-dev libpulse-dev libopenal-dev libssl-dev zlib1g-dev libedit-dev libudev-dev libevdev-dev libsdl2-dev libjack-dev libsndio-dev qt6-base-dev qt6-tools-dev qt6-multimedia-dev libvulkan-dev vulkan-validationlayers ``` #### Fedora ``` -sudo dnf install alsa-lib-devel cmake libatomic libevdev-devel libudev-devel openal-devel qt6-qtbase-devel qt6-qtbase-private-devel vulkan-devel pipewire-jack-audio-connection-kit-devel qt6-qtmultimedia-devel qt6-qtsvg-devel +sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-connection-kit-devel openal-devel openssl-devel libevdev-devel libudev-devel libXext-devel qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qttools-devel vulkan-devel vulkan-validation-layers ``` #### Arch Linux ``` -sudo pacman -S openal cmake vulkan-validation-layers qt6-base qt6-declarative qt6-multimedia sdl2 sndio jack2 base-devel +sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers ``` #### OpenSUSE ``` -sudo zypper install git cmake libasound2 libpulse-devel openal-soft-devel zlib-devel libedit-devel vulkan-devel libudev-devel libqt6-qtbase-devel libqt6-qtmultimedia-devel libqt6-qtsvg-devel libQt6Gui-private-headers-devel libevdev-devel libsndio7_1 libjack-devel +sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers ``` ### Cloning and compiling: @@ -34,9 +34,11 @@ git clone --recursive https://github.com/shadps4-emu/shadPS4.git cd shadPS4 ``` -Generate the build directory in the shadPS4 directory. To enable the QT GUI, pass the ```-DENABLE_QT_GUI=ON``` flag: +Generate the build directory in the shadPS4 directory. To disable the QT GUI, remove the ```-DENABLE_QT_GUI=ON``` flag: + +**Note**: Clang is the compiler used for official builds and CI. If you build with GCC, you might encounter issues—please report any you find. If you choose to use GCC, we recommend building with Clang at least once before submitting a pull request. ``` -cmake -S . -B build/ -DENABLE_QT_GUI=ON +cmake -S . -B build/ -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ``` Enter the directory: diff --git a/documents/building-windows.md b/documents/building-windows.md index fb1bb93ca..48fd09c41 100644 --- a/documents/building-windows.md +++ b/documents/building-windows.md @@ -80,7 +80,7 @@ Normal x86-based computers, follow: 1. Open "MSYS2 MINGW64" from your new applications 2. Run `pacman -Syu`, let it complete; 3. Run `pacman -S --needed git mingw-w64-x86_64-binutils mingw-w64-x86_64-clang mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja mingw-w64-x86_64-ffmpeg` - 1. Optional (Qt only): run `pacman -S --needed mingw-w64-x86_64-qt6-base mingw-w64-x86_64-qt6-tools` + 1. Optional (Qt only): run `pacman -S --needed mingw-w64-x86_64-qt6-base mingw-w64-x86_64-qt6-tools mingw-w64-x86_64-qt6-multimedia` 4. Run `git clone --depth 1 --recursive https://github.com/shadps4-emu/shadPS4` 5. Run `cd shadPS4` 6. Run `cmake -S . -B build -DCMAKE_C_COMPILER="clang.exe" -DCMAKE_CXX_COMPILER="clang++.exe" -DCMAKE_CXX_FLAGS="-O2 -march=native"` @@ -94,7 +94,7 @@ ARM64-based computers, follow: 1. Open "MSYS2 CLANGARM64" from your new applications 2. Run `pacman -Syu`, let it complete; 3. Run `pacman -S --needed git mingw-w64-clang-aarch64-binutils mingw-w64-clang-aarch64-clang mingw-w64-clang-aarch64-cmake mingw-w64-clang-aarch64-ninja mingw-w64-clang-aarch64-ffmpeg` - 1. Optional (Qt only): run `pacman -S --needed mingw-w64-clang-aarch64-qt6-base mingw-w64-clang-aarch64-qt6-tools` + 1. Optional (Qt only): run `pacman -S --needed mingw-w64-clang-aarch64-qt6-base mingw-w64-clang-aarch64-qt6-tools mingw-w64-clang-aarch64-qt6-multimedia` 4. Run `git clone --depth 1 --recursive https://github.com/shadps4-emu/shadPS4` 5. Run `cd shadPS4` 6. Run `cmake -S . -B build -DCMAKE_C_COMPILER="clang.exe" -DCMAKE_CXX_COMPILER="clang++.exe" -DCMAKE_CXX_FLAGS="-O2 -march=native"` diff --git a/documents/changelog.txt b/documents/changelog.txt index 0e189f58d..33c3f77be 100644 --- a/documents/changelog.txt +++ b/documents/changelog.txt @@ -1,3 +1,14 @@ +v0.3.0 23/09/2024 - codename broamic +================= + +- Cheat/Patching support +- DLC support +- New translations support (26 languages) +- Support for unlocking trophies +- Support for more controllers (Dualshock and Xbox) +- Many GUI imporovements +- AVplayer + v0.2.0 15/08/2024 - codename validptr ================= - Adding macOS support diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 1c3a14b59..6df5399fc 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -187,3 +187,11 @@ option(TRACY_NO_SAMPLING "" ON) option(TRACY_ONLY_LOCALHOST "" ON) option(TRACY_NO_CONTEXT_SWITCH "" ON) add_subdirectory(tracy) + +# pugixml +if (NOT TARGET pugixml::pugixml) + add_subdirectory(pugixml) +endif() + +# GCN Headers +add_subdirectory(gcn) \ No newline at end of file diff --git a/externals/date b/externals/date index 1ead6715d..51ce7e131 160000 --- a/externals/date +++ b/externals/date @@ -1 +1 @@ -Subproject commit 1ead6715dec030d340a316c927c877a3c4e5a00c +Subproject commit 51ce7e131079c061533d741be5fe7cca57f2faac diff --git a/externals/fmt b/externals/fmt index c98518351..8ee89546f 160000 --- a/externals/fmt +++ b/externals/fmt @@ -1 +1 @@ -Subproject commit c98518351efd5a46f5d448e947e0b7242d197d07 +Subproject commit 8ee89546ffcf046309d1f0d38c0393f02fde56c8 diff --git a/externals/gcn/CMakeLists.txt b/externals/gcn/CMakeLists.txt new file mode 100644 index 000000000..592f28d0d --- /dev/null +++ b/externals/gcn/CMakeLists.txt @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +project(gcn LANGUAGES CXX) + +add_library(gcn dummy.cpp) + +target_include_directories(gcn INTERFACE include) diff --git a/externals/gcn/dummy.cpp b/externals/gcn/dummy.cpp new file mode 100644 index 000000000..4fd1bb62d --- /dev/null +++ b/externals/gcn/dummy.cpp @@ -0,0 +1,2 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later diff --git a/externals/gcn/include/gcn/si_ci_vi_merged_offset.h b/externals/gcn/include/gcn/si_ci_vi_merged_offset.h new file mode 100644 index 000000000..589a58bfe --- /dev/null +++ b/externals/gcn/include/gcn/si_ci_vi_merged_offset.h @@ -0,0 +1,15339 @@ +/* + *********************************************************************************************************************** + * + * Copyright (c) 2014-2021 Advanced Micro Devices, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************************************************************************/ + +#if !defined __SI__CI__VIoffset_HEADER +#define __SI__CI__VIoffset_HEADER + +namespace Pal +{ +namespace Gfx6 +{ +inline namespace Chip +{ + +#define SI_CI_offset_HEADER__SI__CI +constexpr unsigned int cfgADAPTER_ID = 0x000B; +constexpr unsigned int cfgADAPTER_ID_W = 0x0013; +constexpr unsigned int cfgBASE_ADDR_1 = 0x0004; +constexpr unsigned int cfgBASE_ADDR_2 = 0x0005; +constexpr unsigned int cfgBASE_ADDR_3 = 0x0006; +constexpr unsigned int cfgBASE_ADDR_4 = 0x0007; +constexpr unsigned int cfgBASE_ADDR_5 = 0x0008; +constexpr unsigned int cfgBASE_ADDR_6 = 0x0009; +constexpr unsigned int cfgBASE_CLASS = 0x0002; +constexpr unsigned int cfgBIST = 0x0003; +constexpr unsigned int cfgCACHE_LINE = 0x0003; +constexpr unsigned int cfgCAP_PTR = 0x000D; +constexpr unsigned int cfgCOMMAND = 0x0001; +constexpr unsigned int cfgDEVICE_CAP = 0x0017; +constexpr unsigned int cfgDEVICE_CAP2 = 0x001F; +constexpr unsigned int cfgDEVICE_CNTL = 0x0018; +constexpr unsigned int cfgDEVICE_CNTL2 = 0x0020; +constexpr unsigned int cfgDEVICE_ID = 0x0000; +constexpr unsigned int cfgDEVICE_STATUS = 0x0018; +constexpr unsigned int cfgDEVICE_STATUS2 = 0x0020; +constexpr unsigned int cfgHEADER = 0x0003; +constexpr unsigned int cfgINTERRUPT_LINE = 0x000F; +constexpr unsigned int cfgINTERRUPT_PIN = 0x000F; +constexpr unsigned int cfgLATENCY = 0x0003; +constexpr unsigned int cfgLINK_CAP = 0x0019; +constexpr unsigned int cfgLINK_CAP2 = 0x0021; +constexpr unsigned int cfgLINK_CNTL = 0x001A; +constexpr unsigned int cfgLINK_CNTL2 = 0x0022; +constexpr unsigned int cfgLINK_STATUS = 0x001A; +constexpr unsigned int cfgLINK_STATUS2 = 0x0022; +constexpr unsigned int cfgMAX_LATENCY = 0x000F; +constexpr unsigned int cfgMIN_GRANT = 0x000F; +constexpr unsigned int cfgMSI_CAP_LIST = 0x0028; +constexpr unsigned int cfgMSI_MSG_ADDR_HI = 0x002A; +constexpr unsigned int cfgMSI_MSG_ADDR_LO = 0x0029; +constexpr unsigned int cfgMSI_MSG_CNTL = 0x0028; +constexpr unsigned int cfgMSI_MSG_DATA = 0x002A; +constexpr unsigned int cfgMSI_MSG_DATA_64 = 0x002B; +constexpr unsigned int cfgPCIE_ACS_CAP__CI__VI = 0x00A9; +constexpr unsigned int cfgPCIE_ACS_CNTL__CI__VI = 0x00A9; +constexpr unsigned int cfgPCIE_ACS_ENH_CAP_LIST__CI__VI = 0x00A8; +constexpr unsigned int cfgPCIE_ADV_ERR_CAP_CNTL = 0x005A; +constexpr unsigned int cfgPCIE_ADV_ERR_RPT_ENH_CAP_LIST = 0x0054; +constexpr unsigned int cfgPCIE_ATS_CAP__CI__VI = 0x00AD; +constexpr unsigned int cfgPCIE_ATS_CNTL__CI__VI = 0x00AD; +constexpr unsigned int cfgPCIE_ATS_ENH_CAP_LIST__CI__VI = 0x00AC; +constexpr unsigned int cfgPCIE_BAR1_CAP__CI__VI = 0x0081; +constexpr unsigned int cfgPCIE_BAR1_CNTL__CI__VI = 0x0082; +constexpr unsigned int cfgPCIE_BAR2_CAP__CI__VI = 0x0083; +constexpr unsigned int cfgPCIE_BAR2_CNTL__CI__VI = 0x0084; +constexpr unsigned int cfgPCIE_BAR3_CAP__CI__VI = 0x0085; +constexpr unsigned int cfgPCIE_BAR3_CNTL__CI__VI = 0x0086; +constexpr unsigned int cfgPCIE_BAR4_CAP__CI__VI = 0x0087; +constexpr unsigned int cfgPCIE_BAR4_CNTL__CI__VI = 0x0088; +constexpr unsigned int cfgPCIE_BAR5_CAP__CI__VI = 0x0089; +constexpr unsigned int cfgPCIE_BAR5_CNTL__CI__VI = 0x008A; +constexpr unsigned int cfgPCIE_BAR6_CAP__CI__VI = 0x008B; +constexpr unsigned int cfgPCIE_BAR6_CNTL__CI__VI = 0x008C; +constexpr unsigned int cfgPCIE_BAR_ENH_CAP_LIST__CI__VI = 0x0080; +constexpr unsigned int cfgPCIE_CAP = 0x0016; +constexpr unsigned int cfgPCIE_CAP_LIST = 0x0016; +constexpr unsigned int cfgPCIE_CORR_ERR_MASK = 0x0059; +constexpr unsigned int cfgPCIE_CORR_ERR_STATUS = 0x0058; +constexpr unsigned int cfgPCIE_DEV_SERIAL_NUM_DW1 = 0x0051; +constexpr unsigned int cfgPCIE_DEV_SERIAL_NUM_DW2 = 0x0052; +constexpr unsigned int cfgPCIE_DEV_SERIAL_NUM_ENH_CAP_LIST = 0x0050; +constexpr unsigned int cfgPCIE_DPA_CAP__CI__VI = 0x0095; +constexpr unsigned int cfgPCIE_DPA_CNTL__CI__VI = 0x0097; +constexpr unsigned int cfgPCIE_DPA_ENH_CAP_LIST__CI__VI = 0x0094; +constexpr unsigned int cfgPCIE_DPA_LATENCY_INDICATOR__CI__VI = 0x0096; +constexpr unsigned int cfgPCIE_DPA_STATUS__CI__VI = 0x0097; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_0__CI__VI = 0x0098; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_1__CI__VI = 0x0098; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_2__CI__VI = 0x0098; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_3__CI__VI = 0x0098; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_4__CI__VI = 0x0099; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_5__CI__VI = 0x0099; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_6__CI__VI = 0x0099; +constexpr unsigned int cfgPCIE_DPA_SUBSTATE_PWR_ALLOC_7__CI__VI = 0x0099; +constexpr unsigned int cfgPCIE_HDR_LOG0 = 0x005B; +constexpr unsigned int cfgPCIE_HDR_LOG1 = 0x005C; +constexpr unsigned int cfgPCIE_HDR_LOG2 = 0x005D; +constexpr unsigned int cfgPCIE_HDR_LOG3 = 0x005E; +constexpr unsigned int cfgPCIE_LANE_0_EQUALIZATION_CNTL__CI__VI = 0x009F; +constexpr unsigned int cfgPCIE_LANE_10_EQUALIZATION_CNTL__CI__VI = 0x00A4; +constexpr unsigned int cfgPCIE_LANE_11_EQUALIZATION_CNTL__CI__VI = 0x00A4; +constexpr unsigned int cfgPCIE_LANE_12_EQUALIZATION_CNTL__CI__VI = 0x00A5; +constexpr unsigned int cfgPCIE_LANE_13_EQUALIZATION_CNTL__CI__VI = 0x00A5; +constexpr unsigned int cfgPCIE_LANE_14_EQUALIZATION_CNTL__CI__VI = 0x00A6; +constexpr unsigned int cfgPCIE_LANE_15_EQUALIZATION_CNTL__CI__VI = 0x00A6; +constexpr unsigned int cfgPCIE_LANE_1_EQUALIZATION_CNTL__CI__VI = 0x009F; +constexpr unsigned int cfgPCIE_LANE_2_EQUALIZATION_CNTL__CI__VI = 0x00A0; +constexpr unsigned int cfgPCIE_LANE_3_EQUALIZATION_CNTL__CI__VI = 0x00A0; +constexpr unsigned int cfgPCIE_LANE_4_EQUALIZATION_CNTL__CI__VI = 0x00A1; +constexpr unsigned int cfgPCIE_LANE_5_EQUALIZATION_CNTL__CI__VI = 0x00A1; +constexpr unsigned int cfgPCIE_LANE_6_EQUALIZATION_CNTL__CI__VI = 0x00A2; +constexpr unsigned int cfgPCIE_LANE_7_EQUALIZATION_CNTL__CI__VI = 0x00A2; +constexpr unsigned int cfgPCIE_LANE_8_EQUALIZATION_CNTL__CI__VI = 0x00A3; +constexpr unsigned int cfgPCIE_LANE_9_EQUALIZATION_CNTL__CI__VI = 0x00A3; +constexpr unsigned int cfgPCIE_LANE_ERROR_STATUS__CI__VI = 0x009E; +constexpr unsigned int cfgPCIE_LINK_CNTL3__CI__VI = 0x009D; +constexpr unsigned int cfgPCIE_OUTSTAND_PAGE_REQ_ALLOC__CI__VI = 0x00B3; +constexpr unsigned int cfgPCIE_OUTSTAND_PAGE_REQ_CAPACITY__CI__VI = 0x00B2; +constexpr unsigned int cfgPCIE_PAGE_REQ_CNTL__CI__VI = 0x00B1; +constexpr unsigned int cfgPCIE_PAGE_REQ_ENH_CAP_LIST__CI__VI = 0x00B0; +constexpr unsigned int cfgPCIE_PAGE_REQ_STATUS__CI__VI = 0x00B1; +constexpr unsigned int cfgPCIE_PASID_CAP__CI__VI = 0x00B5; +constexpr unsigned int cfgPCIE_PASID_CNTL__CI__VI = 0x00B5; +constexpr unsigned int cfgPCIE_PASID_ENH_CAP_LIST__CI__VI = 0x00B4; +constexpr unsigned int cfgPCIE_PORT_VC_CAP_REG1 = 0x0045; +constexpr unsigned int cfgPCIE_PORT_VC_CAP_REG2 = 0x0046; +constexpr unsigned int cfgPCIE_PORT_VC_CNTL = 0x0047; +constexpr unsigned int cfgPCIE_PORT_VC_STATUS = 0x0047; +constexpr unsigned int cfgPCIE_PWR_BUDGET_CAP__CI__VI = 0x0093; +constexpr unsigned int cfgPCIE_PWR_BUDGET_DATA_SELECT__CI__VI = 0x0091; +constexpr unsigned int cfgPCIE_PWR_BUDGET_DATA__CI__VI = 0x0092; +constexpr unsigned int cfgPCIE_PWR_BUDGET_ENH_CAP_LIST__CI__VI = 0x0090; +constexpr unsigned int cfgPCIE_SECONDARY_ENH_CAP_LIST__CI__VI = 0x009C; +constexpr unsigned int cfgPCIE_TLP_PREFIX_LOG0__CI__VI = 0x0062; +constexpr unsigned int cfgPCIE_TLP_PREFIX_LOG1__CI__VI = 0x0063; +constexpr unsigned int cfgPCIE_TLP_PREFIX_LOG2__CI__VI = 0x0064; +constexpr unsigned int cfgPCIE_TLP_PREFIX_LOG3__CI__VI = 0x0065; +constexpr unsigned int cfgPCIE_UNCORR_ERR_MASK = 0x0056; +constexpr unsigned int cfgPCIE_UNCORR_ERR_SEVERITY = 0x0057; +constexpr unsigned int cfgPCIE_UNCORR_ERR_STATUS = 0x0055; +constexpr unsigned int cfgPCIE_VC0_RESOURCE_CAP = 0x0048; +constexpr unsigned int cfgPCIE_VC0_RESOURCE_CNTL = 0x0049; +constexpr unsigned int cfgPCIE_VC0_RESOURCE_STATUS = 0x004A; +constexpr unsigned int cfgPCIE_VC1_RESOURCE_CAP = 0x004B; +constexpr unsigned int cfgPCIE_VC1_RESOURCE_CNTL = 0x004C; +constexpr unsigned int cfgPCIE_VC1_RESOURCE_STATUS = 0x004D; +constexpr unsigned int cfgPCIE_VC_ENH_CAP_LIST = 0x0044; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC1 = 0x0042; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC2 = 0x0043; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC_ENH_CAP_LIST = 0x0040; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC_HDR = 0x0041; +constexpr unsigned int cfgPMI_CAP = 0x0014; +constexpr unsigned int cfgPMI_CAP_LIST = 0x0014; +constexpr unsigned int cfgPMI_STATUS_CNTL = 0x0015; +constexpr unsigned int cfgPROG_INTERFACE = 0x0002; +constexpr unsigned int cfgREVISION_ID = 0x0002; +constexpr unsigned int cfgROM_BASE_ADDR = 0x000C; +constexpr unsigned int cfgSTATUS = 0x0001; +constexpr unsigned int cfgSUB_CLASS = 0x0002; +constexpr unsigned int cfgVENDOR_CAP_LIST__CI__VI = 0x0012; +constexpr unsigned int cfgVENDOR_ID = 0x0000; +constexpr unsigned int ioATTRDR__SI__VI = 0x00F0; +constexpr unsigned int ioATTRDW__SI__VI = 0x00F0; +constexpr unsigned int ioATTRX__SI__VI = 0x00F0; +constexpr unsigned int ioBIF_RFE_SNOOP_REG__CI__VI = 0x0027; +constexpr unsigned int ioCRTC8_DATA__SI__VI = 0x00ED; +constexpr unsigned int ioCRTC8_IDX__SI__VI = 0x00ED; +constexpr unsigned int ioDAC_DATA__SI__VI = 0x00F2; +constexpr unsigned int ioDAC_MASK__SI__VI = 0x00F1; +constexpr unsigned int ioDAC_R_INDEX__SI__VI = 0x00F1; +constexpr unsigned int ioDAC_W_INDEX__SI__VI = 0x00F2; +constexpr unsigned int ioGENENB__SI__VI = 0x00F0; +constexpr unsigned int ioGENFC_RD__SI__VI = 0x00F2; +constexpr unsigned int ioGENFC_WT__SI__VI = 0x00EE; +constexpr unsigned int ioGENMO_RD__SI__VI = 0x00F3; +constexpr unsigned int ioGENMO_WT__SI__VI = 0x00F0; +constexpr unsigned int ioGENS0__SI__VI = 0x00F0; +constexpr unsigned int ioGENS1__SI__VI = 0x00EE; +constexpr unsigned int ioGRPH8_DATA__SI__VI = 0x00F3; +constexpr unsigned int ioGRPH8_IDX__SI__VI = 0x00F3; +constexpr unsigned int ioMM_DATA = 0x0001; +constexpr unsigned int ioMM_INDEX = 0x0000; +constexpr unsigned int ioMM_INDEX_HI__CI__VI = 0x0006; +constexpr unsigned int ioPCIE_DATA_2__CI__VI = 0x000D; +constexpr unsigned int ioPCIE_DATA__CI__VI = 0x000F; +constexpr unsigned int ioPCIE_DATA__SI = 0x000D; +constexpr unsigned int ioPCIE_INDEX_2__CI__VI = 0x000C; +constexpr unsigned int ioPCIE_INDEX__CI__VI = 0x000E; +constexpr unsigned int ioPCIE_INDEX__SI = 0x000C; +constexpr unsigned int ioROM_DATA__SI = 0x002B; +constexpr unsigned int ioROM_INDEX__SI = 0x002A; +constexpr unsigned int ioSEQ8_DATA__SI__VI = 0x00F1; +constexpr unsigned int ioSEQ8_IDX__SI__VI = 0x00F1; +constexpr unsigned int ioVGA_MEM_READ_PAGE_ADDR__SI__VI = 0x0013; +constexpr unsigned int ioVGA_MEM_WRITE_PAGE_ADDR__SI__VI = 0x0012; +constexpr unsigned int mmABM_TEST_DEBUG_DATA__SI__VI = 0x169F; +constexpr unsigned int mmABM_TEST_DEBUG_INDEX__SI__VI = 0x169E; +constexpr unsigned int mmACP_CONFIG__CI = 0x0F95; +constexpr unsigned int mmAFMT_60958_0__SI = 0x1C41; +constexpr unsigned int mmAFMT_60958_1__SI = 0x1C42; +constexpr unsigned int mmAFMT_60958_2__SI = 0x1C48; +constexpr unsigned int mmAFMT_AUDIO_CRC_CONTROL__SI = 0x1C43; +constexpr unsigned int mmAFMT_AUDIO_CRC_RESULT__SI = 0x1C49; +constexpr unsigned int mmAFMT_AUDIO_INFO0__SI = 0x1C3F; +constexpr unsigned int mmAFMT_AUDIO_INFO1__SI = 0x1C40; +constexpr unsigned int mmAFMT_AUDIO_PACKET_CONTROL2__SI = 0x1C17; +constexpr unsigned int mmAFMT_AUDIO_PACKET_CONTROL__SI = 0x1C4B; +constexpr unsigned int mmAFMT_AVI_INFO0__SI = 0x1C21; +constexpr unsigned int mmAFMT_AVI_INFO1__SI = 0x1C22; +constexpr unsigned int mmAFMT_AVI_INFO2__SI = 0x1C23; +constexpr unsigned int mmAFMT_AVI_INFO3__SI = 0x1C24; +constexpr unsigned int mmAFMT_INFOFRAME_CONTROL0__SI = 0x1C4D; +constexpr unsigned int mmAFMT_ISRC1_0__SI = 0x1C18; +constexpr unsigned int mmAFMT_ISRC1_1__SI = 0x1C19; +constexpr unsigned int mmAFMT_ISRC1_2__SI = 0x1C1A; +constexpr unsigned int mmAFMT_ISRC1_3__SI = 0x1C1B; +constexpr unsigned int mmAFMT_ISRC1_4__SI = 0x1C1C; +constexpr unsigned int mmAFMT_ISRC2_0__SI = 0x1C1D; +constexpr unsigned int mmAFMT_ISRC2_1__SI = 0x1C1E; +constexpr unsigned int mmAFMT_ISRC2_2__SI = 0x1C1F; +constexpr unsigned int mmAFMT_ISRC2_3__SI = 0x1C20; +constexpr unsigned int mmAFMT_MPEG_INFO0__SI = 0x1C25; +constexpr unsigned int mmAFMT_MPEG_INFO1__SI = 0x1C26; +constexpr unsigned int mmAFMT_RAMP_CONTROL0__SI = 0x1C44; +constexpr unsigned int mmAFMT_RAMP_CONTROL1__SI = 0x1C45; +constexpr unsigned int mmAFMT_RAMP_CONTROL2__SI = 0x1C46; +constexpr unsigned int mmAFMT_RAMP_CONTROL3__SI = 0x1C47; +constexpr unsigned int mmAFMT_STATUS__SI = 0x1C4A; +constexpr unsigned int mmAFMT_VBI_PACKET_CONTROL__SI = 0x1C4C; +constexpr unsigned int mmATC_ATS_CNTL__CI__VI = 0x0CC9; +constexpr unsigned int mmATC_ATS_DEBUG__CI__VI = 0x0CCA; +constexpr unsigned int mmATC_ATS_DEFAULT_PAGE_CNTL__CI__VI = 0x0CD1; +constexpr unsigned int mmATC_ATS_DEFAULT_PAGE_LOW__CI__VI = 0x0CD0; +constexpr unsigned int mmATC_ATS_FAULT_CNTL__CI__VI = 0x0CCD; +constexpr unsigned int mmATC_ATS_FAULT_DEBUG__CI__VI = 0x0CCB; +constexpr unsigned int mmATC_ATS_FAULT_STATUS_ADDR__CI__VI = 0x0CCF; +constexpr unsigned int mmATC_ATS_FAULT_STATUS_INFO__CI__VI = 0x0CCE; +constexpr unsigned int mmATC_ATS_STATUS__CI__VI = 0x0CCC; +constexpr unsigned int mmATC_L1RD_DEBUG_TLB__CI__VI = 0x0CDE; +constexpr unsigned int mmATC_L1RD_STATUS__CI__VI = 0x0CE0; +constexpr unsigned int mmATC_L1WR_DEBUG_TLB__CI__VI = 0x0CDF; +constexpr unsigned int mmATC_L1WR_STATUS__CI__VI = 0x0CE1; +constexpr unsigned int mmATC_L1_ADDRESS_OFFSET__CI__VI = 0x0CDD; +constexpr unsigned int mmATC_L1_CNTL__CI__VI = 0x0CDC; +constexpr unsigned int mmATC_L2_CNTL2__CI__VI = 0x0CD6; +constexpr unsigned int mmATC_L2_CNTL__CI__VI = 0x0CD5; +constexpr unsigned int mmATC_L2_DEBUG2__CI__VI = 0x0CD8; +constexpr unsigned int mmATC_L2_DEBUG__CI__VI = 0x0CD7; +constexpr unsigned int mmATC_MISC_CG__CI__VI = 0x0CD4; +constexpr unsigned int mmATC_PERFCOUNTER0_CFG__CI__VI = 0x07C8; +constexpr unsigned int mmATC_PERFCOUNTER1_CFG__CI__VI = 0x07C9; +constexpr unsigned int mmATC_PERFCOUNTER2_CFG__CI__VI = 0x07CA; +constexpr unsigned int mmATC_PERFCOUNTER3_CFG__CI__VI = 0x07CB; +constexpr unsigned int mmATC_PERFCOUNTER_HI__CI__VI = 0x07AF; +constexpr unsigned int mmATC_PERFCOUNTER_LO__CI__VI = 0x07A7; +constexpr unsigned int mmATC_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07D5; +constexpr unsigned int mmATC_VMID0_PASID_MAPPING__CI__VI = 0x0CE7; +constexpr unsigned int mmATC_VMID10_PASID_MAPPING__CI__VI = 0x0CF1; +constexpr unsigned int mmATC_VMID11_PASID_MAPPING__CI__VI = 0x0CF2; +constexpr unsigned int mmATC_VMID12_PASID_MAPPING__CI__VI = 0x0CF3; +constexpr unsigned int mmATC_VMID13_PASID_MAPPING__CI__VI = 0x0CF4; +constexpr unsigned int mmATC_VMID14_PASID_MAPPING__CI__VI = 0x0CF5; +constexpr unsigned int mmATC_VMID15_PASID_MAPPING__CI__VI = 0x0CF6; +constexpr unsigned int mmATC_VMID1_PASID_MAPPING__CI__VI = 0x0CE8; +constexpr unsigned int mmATC_VMID2_PASID_MAPPING__CI__VI = 0x0CE9; +constexpr unsigned int mmATC_VMID3_PASID_MAPPING__CI__VI = 0x0CEA; +constexpr unsigned int mmATC_VMID4_PASID_MAPPING__CI__VI = 0x0CEB; +constexpr unsigned int mmATC_VMID5_PASID_MAPPING__CI__VI = 0x0CEC; +constexpr unsigned int mmATC_VMID6_PASID_MAPPING__CI__VI = 0x0CED; +constexpr unsigned int mmATC_VMID7_PASID_MAPPING__CI__VI = 0x0CEE; +constexpr unsigned int mmATC_VMID8_PASID_MAPPING__CI__VI = 0x0CEF; +constexpr unsigned int mmATC_VMID9_PASID_MAPPING__CI__VI = 0x0CF0; +constexpr unsigned int mmATC_VMID_PASID_MAPPING_UPDATE_STATUS__CI__VI = 0x0CE6; +constexpr unsigned int mmATC_VM_APERTURE0_CNTL2__CI__VI = 0x0CC6; +constexpr unsigned int mmATC_VM_APERTURE0_CNTL__CI__VI = 0x0CC4; +constexpr unsigned int mmATC_VM_APERTURE0_HIGH_ADDR__CI__VI = 0x0CC2; +constexpr unsigned int mmATC_VM_APERTURE0_LOW_ADDR__CI__VI = 0x0CC0; +constexpr unsigned int mmATC_VM_APERTURE1_CNTL2__CI__VI = 0x0CC7; +constexpr unsigned int mmATC_VM_APERTURE1_CNTL__CI__VI = 0x0CC5; +constexpr unsigned int mmATC_VM_APERTURE1_HIGH_ADDR__CI__VI = 0x0CC3; +constexpr unsigned int mmATC_VM_APERTURE1_LOW_ADDR__CI__VI = 0x0CC1; +constexpr unsigned int mmATTRDR__SI__VI = 0x00F0; +constexpr unsigned int mmATTRDW__SI__VI = 0x00F0; +constexpr unsigned int mmATTRX__SI__VI = 0x00F0; +constexpr unsigned int mmAUXN_IMPCAL__SI = 0x194B; +constexpr unsigned int mmAUXP_IMPCAL__SI = 0x194A; +constexpr unsigned int mmAUX_ARB_CONTROL__SI = 0x1882; +constexpr unsigned int mmAUX_CONTROL__SI = 0x1880; +constexpr unsigned int mmAUX_DPHY_RX_CONTROL0__SI = 0x188A; +constexpr unsigned int mmAUX_DPHY_RX_CONTROL1__SI = 0x188B; +constexpr unsigned int mmAUX_DPHY_RX_STATUS__SI = 0x188D; +constexpr unsigned int mmAUX_DPHY_TX_CONTROL__SI = 0x1889; +constexpr unsigned int mmAUX_DPHY_TX_REF_CONTROL__SI = 0x1888; +constexpr unsigned int mmAUX_DPHY_TX_STATUS__SI = 0x188C; +constexpr unsigned int mmAUX_INTERRUPT_CONTROL__SI = 0x1883; +constexpr unsigned int mmAUX_LS_DATA__SI = 0x1887; +constexpr unsigned int mmAUX_LS_STATUS__SI = 0x1885; +constexpr unsigned int mmAUX_SW_CONTROL__SI = 0x1881; +constexpr unsigned int mmAUX_SW_DATA__SI = 0x1886; +constexpr unsigned int mmAUX_SW_STATUS__SI = 0x1884; +constexpr unsigned int mmAZALIA_APPLICATION_POSITION_IN_CYCLIC_BUFFER__SI = 0x17F6; +constexpr unsigned int mmAZALIA_AUDIO_DTO_CONTROL__SI = 0x173D; +constexpr unsigned int mmAZALIA_AUDIO_DTO__SI = 0x173C; +constexpr unsigned int mmAZALIA_BDL_DMA_CONTROL__SI = 0x1730; +constexpr unsigned int mmAZALIA_CORB_DMA_CONTROL__SI = 0x172F; +constexpr unsigned int mmAZALIA_CUMULATIVE_LATENCY_COUNT__SI = 0x1737; +constexpr unsigned int mmAZALIA_CUMULATIVE_REQUEST_COUNT__SI = 0x1738; +constexpr unsigned int mmAZALIA_CYCLIC_BUFFER_SYNC__SI = 0x17F7; +constexpr unsigned int mmAZALIA_DATA_DMA_CONTROL__SI = 0x1731; +constexpr unsigned int mmAZALIA_F0_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__SI = 0x174F; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__SI = 0x174C; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_RESET__SI = 0x174D; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SI = 0x1750; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__SI = 0x1742; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__SI = 0x1745; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__SI = 0x1744; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__SI = 0x1743; +constexpr unsigned int mmAZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__SI = 0x174B; +constexpr unsigned int mmAZALIA_F0_CODEC_PIN_CONTROL_WIDGET_CONTROL__SI = 0x1753; +constexpr unsigned int mmAZALIA_F0_CODEC_ROOT_PARAMETER_REVISION_ID__SI = 0x173F; +constexpr unsigned int mmAZALIA_F0_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__SI = 0x173E; +constexpr unsigned int mmAZALIA_LATENCY_COUNTER_CONTROL__SI = 0x1735; +constexpr unsigned int mmAZALIA_RIRB_AND_DP_CONTROL__SI = 0x172D; +constexpr unsigned int mmAZALIA_UNDERFLOW_FILLER_SAMPLE__SI = 0x1732; +constexpr unsigned int mmAZALIA_WORSTCASE_LATENCY_COUNT__SI = 0x1736; +constexpr unsigned int mmAZ_TEST_DEBUG_DATA__SI = 0x1756; +constexpr unsigned int mmAZ_TEST_DEBUG_INDEX__SI = 0x1755; +constexpr unsigned int mmBACO_CNTL_MISC__CI__VI = 0x14DB; +constexpr unsigned int mmBACO_CNTL__CI__VI = 0x14E5; +constexpr unsigned int mmBCI_DEBUG_READ__CI__VI = 0x24EB; +constexpr unsigned int mmBCI_DEBUG_READ__SI = 0x24E3; +constexpr unsigned int mmBIF_BACO_DEBUG_LATCH__CI__VI = 0x14DC; +constexpr unsigned int mmBIF_BACO_DEBUG__CI__VI = 0x14DF; +constexpr unsigned int mmBIF_BACO_MSIC__CI = 0x1480; +constexpr unsigned int mmBIF_BUSNUM_CNTL1 = 0x1525; +constexpr unsigned int mmBIF_BUSNUM_CNTL2 = 0x152B; +constexpr unsigned int mmBIF_BUSNUM_LIST0 = 0x1526; +constexpr unsigned int mmBIF_BUSNUM_LIST1 = 0x1527; +constexpr unsigned int mmBIF_BUSY_DELAY_CNTR = 0x1529; +constexpr unsigned int mmBIF_CC_RFE_IMP_OVERRIDECNTL__CI__VI = 0x1455; +constexpr unsigned int mmBIF_CLK_PDWN_DELAY_TIMER__CI = 0x1483; +constexpr unsigned int mmBIF_CLK_PDWN_DELAY_TIMER__SI = 0x151F; +constexpr unsigned int mmBIF_DEBUG_CNTL = 0x151C; +constexpr unsigned int mmBIF_DEBUG_MUX = 0x151D; +constexpr unsigned int mmBIF_DEBUG_OUT = 0x151E; +constexpr unsigned int mmBIF_DEVFUNCNUM_LIST0__CI__VI = 0x14E8; +constexpr unsigned int mmBIF_DEVFUNCNUM_LIST1__CI__VI = 0x14E7; +constexpr unsigned int mmBIF_DOORBELL_CNTL__CI__VI = 0x14C3; +constexpr unsigned int mmBIF_FB_EN = 0x1524; +constexpr unsigned int mmBIF_FEATURES_CONTROL_MISC__CI__VI = 0x14C2; +constexpr unsigned int mmBIF_IMPCTL_CONTINUOUS_CALIBRATION_PERIOD__CI__VI = 0x1454; +constexpr unsigned int mmBIF_IMPCTL_RXCNTL__CI__VI = 0x1451; +constexpr unsigned int mmBIF_IMPCTL_SMPLCNTL__CI__VI = 0x1450; +constexpr unsigned int mmBIF_IMPCTL_TXCNTL_pd__CI__VI = 0x1452; +constexpr unsigned int mmBIF_IMPCTL_TXCNTL_pu__CI__VI = 0x1453; +constexpr unsigned int mmBIF_LNCNT_RESET__CI = 0x1488; +constexpr unsigned int mmBIF_PERFCOUNTER0_RESULT__CI__VI = 0x152D; +constexpr unsigned int mmBIF_PERFCOUNTER1_RESULT__CI__VI = 0x152E; +constexpr unsigned int mmBIF_PERFMON_CNTL__CI__VI = 0x152C; +constexpr unsigned int mmBIF_PIF_TXCLK_SWITCH_TIMER__CI = 0x1481; +constexpr unsigned int mmBIF_PWDN_COMMAND__CI__VI = 0x1444; +constexpr unsigned int mmBIF_PWDN_STATUS__CI__VI = 0x1445; +constexpr unsigned int mmBIF_RESET_CNTL__CI = 0x1486; +constexpr unsigned int mmBIF_RESET_EN__CI = 0x1482; +constexpr unsigned int mmBIF_RESET_EN__SI = 0x1511; +constexpr unsigned int mmBIF_RFE_CLIENT_SOFTRST_TRIGGER__CI__VI = 0x1442; +constexpr unsigned int mmBIF_RFE_IMPRST_CNTL__CI__VI = 0x1458; +constexpr unsigned int mmBIF_RFE_MASTER_SOFTRST_TRIGGER__CI__VI = 0x1443; +constexpr unsigned int mmBIF_RFE_MMCFG_CNTL__CI__VI = 0x144C; +constexpr unsigned int mmBIF_RFE_MST_BU_CMDSTATUS__CI__VI = 0x1446; +constexpr unsigned int mmBIF_RFE_MST_BX_CMDSTATUS__CI = 0x1448; +constexpr unsigned int mmBIF_RFE_MST_RWREG_RFEWDBIF_CMDSTATUS__CI__VI = 0x1447; +constexpr unsigned int mmBIF_RFE_MST_TMOUT_STATUS__CI__VI = 0x144B; +constexpr unsigned int mmBIF_RFE_SNOOP_REG__CI__VI = 0x0027; +constexpr unsigned int mmBIF_RFE_SOFTRST_CNTL__CI__VI = 0x1441; +constexpr unsigned int mmBIF_SCRATCH0 = 0x150E; +constexpr unsigned int mmBIF_SCRATCH1 = 0x150F; +constexpr unsigned int mmBIF_SLVARB_MODE__CI__VI = 0x14C4; +constexpr unsigned int mmBIF_SSA_DISP_LOWER__CI = 0x14D2; +constexpr unsigned int mmBIF_SSA_DISP_UPPER__CI = 0x14D3; +constexpr unsigned int mmBIF_SSA_GFX0_LOWER__CI = 0x14CA; +constexpr unsigned int mmBIF_SSA_GFX0_UPPER__CI = 0x14CB; +constexpr unsigned int mmBIF_SSA_GFX1_LOWER__CI = 0x14CC; +constexpr unsigned int mmBIF_SSA_GFX1_UPPER__CI = 0x14CD; +constexpr unsigned int mmBIF_SSA_GFX2_LOWER__CI = 0x14CE; +constexpr unsigned int mmBIF_SSA_GFX2_UPPER__CI = 0x14CF; +constexpr unsigned int mmBIF_SSA_GFX3_LOWER__CI = 0x14D0; +constexpr unsigned int mmBIF_SSA_GFX3_UPPER__CI = 0x14D1; +constexpr unsigned int mmBIF_SSA_MC_LOWER__CI = 0x14D4; +constexpr unsigned int mmBIF_SSA_MC_UPPER__CI = 0x14D5; +constexpr unsigned int mmBIF_SSA_PWR_STATUS__CI = 0x14C8; +constexpr unsigned int mmBIF_XDMA_HI__CI__VI = 0x14C1; +constexpr unsigned int mmBIF_XDMA_LO__CI__VI = 0x14C0; +constexpr unsigned int mmBIOS_SCRATCH_0 = 0x05C9; +constexpr unsigned int mmBIOS_SCRATCH_1 = 0x05CA; +constexpr unsigned int mmBIOS_SCRATCH_10 = 0x05D3; +constexpr unsigned int mmBIOS_SCRATCH_11 = 0x05D4; +constexpr unsigned int mmBIOS_SCRATCH_12 = 0x05D5; +constexpr unsigned int mmBIOS_SCRATCH_13 = 0x05D6; +constexpr unsigned int mmBIOS_SCRATCH_14 = 0x05D7; +constexpr unsigned int mmBIOS_SCRATCH_15 = 0x05D8; +constexpr unsigned int mmBIOS_SCRATCH_2 = 0x05CB; +constexpr unsigned int mmBIOS_SCRATCH_3 = 0x05CC; +constexpr unsigned int mmBIOS_SCRATCH_4 = 0x05CD; +constexpr unsigned int mmBIOS_SCRATCH_5 = 0x05CE; +constexpr unsigned int mmBIOS_SCRATCH_6 = 0x05CF; +constexpr unsigned int mmBIOS_SCRATCH_7 = 0x05D0; +constexpr unsigned int mmBIOS_SCRATCH_8 = 0x05D1; +constexpr unsigned int mmBIOS_SCRATCH_9 = 0x05D2; +constexpr unsigned int mmBL1_PWM_ABM_CNTL__SI__VI = 0x162E; +constexpr unsigned int mmBL1_PWM_AMBIENT_LIGHT_LEVEL__SI__VI = 0x1628; +constexpr unsigned int mmBL1_PWM_BL_UPDATE_SAMPLE_RATE__SI__VI = 0x162F; +constexpr unsigned int mmBL1_PWM_CURRENT_ABM_LEVEL__SI__VI = 0x162B; +constexpr unsigned int mmBL1_PWM_FINAL_DUTY_CYCLE__SI__VI = 0x162C; +constexpr unsigned int mmBL1_PWM_GRP2_REG_LOCK__SI__VI = 0x1630; +constexpr unsigned int mmBL1_PWM_MINIMUM_DUTY_CYCLE__SI__VI = 0x162D; +constexpr unsigned int mmBL1_PWM_TARGET_ABM_LEVEL__SI__VI = 0x162A; +constexpr unsigned int mmBL1_PWM_USER_LEVEL__SI__VI = 0x1629; +constexpr unsigned int mmBL_PWM_CNTL2__SI = 0x1968; +constexpr unsigned int mmBL_PWM_CNTL__SI = 0x1967; +constexpr unsigned int mmBL_PWM_GRP1_REG_LOCK__SI = 0x196A; +constexpr unsigned int mmBL_PWM_PERIOD_CNTL__SI = 0x1969; +constexpr unsigned int mmBUS_CNTL = 0x1508; +constexpr unsigned int mmBX_RESET_EN__CI__VI = 0x1514; +constexpr unsigned int mmCAPTURE_HOST_BUSNUM = 0x153C; +constexpr unsigned int mmCB_BLEND0_CONTROL = 0xA1E0; +constexpr unsigned int mmCB_BLEND1_CONTROL = 0xA1E1; +constexpr unsigned int mmCB_BLEND2_CONTROL = 0xA1E2; +constexpr unsigned int mmCB_BLEND3_CONTROL = 0xA1E3; +constexpr unsigned int mmCB_BLEND4_CONTROL = 0xA1E4; +constexpr unsigned int mmCB_BLEND5_CONTROL = 0xA1E5; +constexpr unsigned int mmCB_BLEND6_CONTROL = 0xA1E6; +constexpr unsigned int mmCB_BLEND7_CONTROL = 0xA1E7; +constexpr unsigned int mmCB_BLEND_ALPHA = 0xA108; +constexpr unsigned int mmCB_BLEND_BLUE = 0xA107; +constexpr unsigned int mmCB_BLEND_GREEN = 0xA106; +constexpr unsigned int mmCB_BLEND_RED = 0xA105; +constexpr unsigned int mmCB_CGTT_SCLK_CTRL__CI__VI = 0xF0A8; +constexpr unsigned int mmCB_CGTT_SCLK_CTRL__SI = 0x2698; +constexpr unsigned int mmCB_COLOR0_ATTRIB = 0xA31D; +constexpr unsigned int mmCB_COLOR0_BASE = 0xA318; +constexpr unsigned int mmCB_COLOR0_CLEAR_WORD0 = 0xA323; +constexpr unsigned int mmCB_COLOR0_CLEAR_WORD1 = 0xA324; +constexpr unsigned int mmCB_COLOR0_CMASK = 0xA31F; +constexpr unsigned int mmCB_COLOR0_CMASK_SLICE = 0xA320; +constexpr unsigned int mmCB_COLOR0_FMASK = 0xA321; +constexpr unsigned int mmCB_COLOR0_FMASK_SLICE = 0xA322; +constexpr unsigned int mmCB_COLOR0_INFO = 0xA31C; +constexpr unsigned int mmCB_COLOR0_PITCH = 0xA319; +constexpr unsigned int mmCB_COLOR0_SLICE = 0xA31A; +constexpr unsigned int mmCB_COLOR0_VIEW = 0xA31B; +constexpr unsigned int mmCB_COLOR1_ATTRIB = 0xA32C; +constexpr unsigned int mmCB_COLOR1_BASE = 0xA327; +constexpr unsigned int mmCB_COLOR1_CLEAR_WORD0 = 0xA332; +constexpr unsigned int mmCB_COLOR1_CLEAR_WORD1 = 0xA333; +constexpr unsigned int mmCB_COLOR1_CMASK = 0xA32E; +constexpr unsigned int mmCB_COLOR1_CMASK_SLICE = 0xA32F; +constexpr unsigned int mmCB_COLOR1_FMASK = 0xA330; +constexpr unsigned int mmCB_COLOR1_FMASK_SLICE = 0xA331; +constexpr unsigned int mmCB_COLOR1_INFO = 0xA32B; +constexpr unsigned int mmCB_COLOR1_PITCH = 0xA328; +constexpr unsigned int mmCB_COLOR1_SLICE = 0xA329; +constexpr unsigned int mmCB_COLOR1_VIEW = 0xA32A; +constexpr unsigned int mmCB_COLOR2_ATTRIB = 0xA33B; +constexpr unsigned int mmCB_COLOR2_BASE = 0xA336; +constexpr unsigned int mmCB_COLOR2_CLEAR_WORD0 = 0xA341; +constexpr unsigned int mmCB_COLOR2_CLEAR_WORD1 = 0xA342; +constexpr unsigned int mmCB_COLOR2_CMASK = 0xA33D; +constexpr unsigned int mmCB_COLOR2_CMASK_SLICE = 0xA33E; +constexpr unsigned int mmCB_COLOR2_FMASK = 0xA33F; +constexpr unsigned int mmCB_COLOR2_FMASK_SLICE = 0xA340; +constexpr unsigned int mmCB_COLOR2_INFO = 0xA33A; +constexpr unsigned int mmCB_COLOR2_PITCH = 0xA337; +constexpr unsigned int mmCB_COLOR2_SLICE = 0xA338; +constexpr unsigned int mmCB_COLOR2_VIEW = 0xA339; +constexpr unsigned int mmCB_COLOR3_ATTRIB = 0xA34A; +constexpr unsigned int mmCB_COLOR3_BASE = 0xA345; +constexpr unsigned int mmCB_COLOR3_CLEAR_WORD0 = 0xA350; +constexpr unsigned int mmCB_COLOR3_CLEAR_WORD1 = 0xA351; +constexpr unsigned int mmCB_COLOR3_CMASK = 0xA34C; +constexpr unsigned int mmCB_COLOR3_CMASK_SLICE = 0xA34D; +constexpr unsigned int mmCB_COLOR3_FMASK = 0xA34E; +constexpr unsigned int mmCB_COLOR3_FMASK_SLICE = 0xA34F; +constexpr unsigned int mmCB_COLOR3_INFO = 0xA349; +constexpr unsigned int mmCB_COLOR3_PITCH = 0xA346; +constexpr unsigned int mmCB_COLOR3_SLICE = 0xA347; +constexpr unsigned int mmCB_COLOR3_VIEW = 0xA348; +constexpr unsigned int mmCB_COLOR4_ATTRIB = 0xA359; +constexpr unsigned int mmCB_COLOR4_BASE = 0xA354; +constexpr unsigned int mmCB_COLOR4_CLEAR_WORD0 = 0xA35F; +constexpr unsigned int mmCB_COLOR4_CLEAR_WORD1 = 0xA360; +constexpr unsigned int mmCB_COLOR4_CMASK = 0xA35B; +constexpr unsigned int mmCB_COLOR4_CMASK_SLICE = 0xA35C; +constexpr unsigned int mmCB_COLOR4_FMASK = 0xA35D; +constexpr unsigned int mmCB_COLOR4_FMASK_SLICE = 0xA35E; +constexpr unsigned int mmCB_COLOR4_INFO = 0xA358; +constexpr unsigned int mmCB_COLOR4_PITCH = 0xA355; +constexpr unsigned int mmCB_COLOR4_SLICE = 0xA356; +constexpr unsigned int mmCB_COLOR4_VIEW = 0xA357; +constexpr unsigned int mmCB_COLOR5_ATTRIB = 0xA368; +constexpr unsigned int mmCB_COLOR5_BASE = 0xA363; +constexpr unsigned int mmCB_COLOR5_CLEAR_WORD0 = 0xA36E; +constexpr unsigned int mmCB_COLOR5_CLEAR_WORD1 = 0xA36F; +constexpr unsigned int mmCB_COLOR5_CMASK = 0xA36A; +constexpr unsigned int mmCB_COLOR5_CMASK_SLICE = 0xA36B; +constexpr unsigned int mmCB_COLOR5_FMASK = 0xA36C; +constexpr unsigned int mmCB_COLOR5_FMASK_SLICE = 0xA36D; +constexpr unsigned int mmCB_COLOR5_INFO = 0xA367; +constexpr unsigned int mmCB_COLOR5_PITCH = 0xA364; +constexpr unsigned int mmCB_COLOR5_SLICE = 0xA365; +constexpr unsigned int mmCB_COLOR5_VIEW = 0xA366; +constexpr unsigned int mmCB_COLOR6_ATTRIB = 0xA377; +constexpr unsigned int mmCB_COLOR6_BASE = 0xA372; +constexpr unsigned int mmCB_COLOR6_CLEAR_WORD0 = 0xA37D; +constexpr unsigned int mmCB_COLOR6_CLEAR_WORD1 = 0xA37E; +constexpr unsigned int mmCB_COLOR6_CMASK = 0xA379; +constexpr unsigned int mmCB_COLOR6_CMASK_SLICE = 0xA37A; +constexpr unsigned int mmCB_COLOR6_FMASK = 0xA37B; +constexpr unsigned int mmCB_COLOR6_FMASK_SLICE = 0xA37C; +constexpr unsigned int mmCB_COLOR6_INFO = 0xA376; +constexpr unsigned int mmCB_COLOR6_PITCH = 0xA373; +constexpr unsigned int mmCB_COLOR6_SLICE = 0xA374; +constexpr unsigned int mmCB_COLOR6_VIEW = 0xA375; +constexpr unsigned int mmCB_COLOR7_ATTRIB = 0xA386; +constexpr unsigned int mmCB_COLOR7_BASE = 0xA381; +constexpr unsigned int mmCB_COLOR7_CLEAR_WORD0 = 0xA38C; +constexpr unsigned int mmCB_COLOR7_CLEAR_WORD1 = 0xA38D; +constexpr unsigned int mmCB_COLOR7_CMASK = 0xA388; +constexpr unsigned int mmCB_COLOR7_CMASK_SLICE = 0xA389; +constexpr unsigned int mmCB_COLOR7_FMASK = 0xA38A; +constexpr unsigned int mmCB_COLOR7_FMASK_SLICE = 0xA38B; +constexpr unsigned int mmCB_COLOR7_INFO = 0xA385; +constexpr unsigned int mmCB_COLOR7_PITCH = 0xA382; +constexpr unsigned int mmCB_COLOR7_SLICE = 0xA383; +constexpr unsigned int mmCB_COLOR7_VIEW = 0xA384; +constexpr unsigned int mmCB_COLOR_CONTROL = 0xA202; +constexpr unsigned int mmCB_DEBUG_BUS_1 = 0x2699; +constexpr unsigned int mmCB_DEBUG_BUS_13 = 0x26A5; +constexpr unsigned int mmCB_DEBUG_BUS_14 = 0x26A6; +constexpr unsigned int mmCB_DEBUG_BUS_15 = 0x26A7; +constexpr unsigned int mmCB_DEBUG_BUS_16 = 0x26A8; +constexpr unsigned int mmCB_DEBUG_BUS_17 = 0x26A9; +constexpr unsigned int mmCB_DEBUG_BUS_18 = 0x26AA; +constexpr unsigned int mmCB_DEBUG_BUS_2 = 0x269A; +constexpr unsigned int mmCB_HW_CONTROL = 0x2684; +constexpr unsigned int mmCB_HW_CONTROL_1 = 0x2685; +constexpr unsigned int mmCB_HW_CONTROL_2 = 0x2686; +constexpr unsigned int mmCB_HW_CONTROL_3__CI__VI = 0x2683; +constexpr unsigned int mmCB_PERFCOUNTER0_HI__CI__VI = 0xD407; +constexpr unsigned int mmCB_PERFCOUNTER0_HI__SI = 0x2691; +constexpr unsigned int mmCB_PERFCOUNTER0_LO__CI__VI = 0xD406; +constexpr unsigned int mmCB_PERFCOUNTER0_LO__SI = 0x2690; +constexpr unsigned int mmCB_PERFCOUNTER0_SELECT0__SI = 0x2688; +constexpr unsigned int mmCB_PERFCOUNTER0_SELECT1__CI__VI = 0xDC02; +constexpr unsigned int mmCB_PERFCOUNTER0_SELECT1__SI = 0x2689; +constexpr unsigned int mmCB_PERFCOUNTER0_SELECT__CI__VI = 0xDC01; +constexpr unsigned int mmCB_PERFCOUNTER1_HI__CI__VI = 0xD409; +constexpr unsigned int mmCB_PERFCOUNTER1_HI__SI = 0x2693; +constexpr unsigned int mmCB_PERFCOUNTER1_LO__CI__VI = 0xD408; +constexpr unsigned int mmCB_PERFCOUNTER1_LO__SI = 0x2692; +constexpr unsigned int mmCB_PERFCOUNTER1_SELECT0__SI = 0x268A; +constexpr unsigned int mmCB_PERFCOUNTER1_SELECT1__SI = 0x268B; +constexpr unsigned int mmCB_PERFCOUNTER1_SELECT__CI__VI = 0xDC03; +constexpr unsigned int mmCB_PERFCOUNTER2_HI__CI__VI = 0xD40B; +constexpr unsigned int mmCB_PERFCOUNTER2_HI__SI = 0x2695; +constexpr unsigned int mmCB_PERFCOUNTER2_LO__CI__VI = 0xD40A; +constexpr unsigned int mmCB_PERFCOUNTER2_LO__SI = 0x2694; +constexpr unsigned int mmCB_PERFCOUNTER2_SELECT0__SI = 0x268C; +constexpr unsigned int mmCB_PERFCOUNTER2_SELECT1__SI = 0x268D; +constexpr unsigned int mmCB_PERFCOUNTER2_SELECT__CI__VI = 0xDC04; +constexpr unsigned int mmCB_PERFCOUNTER3_HI__CI__VI = 0xD40D; +constexpr unsigned int mmCB_PERFCOUNTER3_HI__SI = 0x2697; +constexpr unsigned int mmCB_PERFCOUNTER3_LO__CI__VI = 0xD40C; +constexpr unsigned int mmCB_PERFCOUNTER3_LO__SI = 0x2696; +constexpr unsigned int mmCB_PERFCOUNTER3_SELECT0__SI = 0x268E; +constexpr unsigned int mmCB_PERFCOUNTER3_SELECT1__SI = 0x268F; +constexpr unsigned int mmCB_PERFCOUNTER3_SELECT__CI__VI = 0xDC05; +constexpr unsigned int mmCB_PERFCOUNTER_FILTER__CI__VI = 0xDC00; +constexpr unsigned int mmCB_SHADER_MASK = 0xA08F; +constexpr unsigned int mmCB_TARGET_MASK = 0xA08E; +constexpr unsigned int mmCC_DRM_ID_STRAPS = 0x1559; +constexpr unsigned int mmCC_GC_EDC_CONFIG__CI__VI = 0x3098; +constexpr unsigned int mmCC_GC_PRIM_CONFIG__CI__VI = 0x2240; +constexpr unsigned int mmCC_GC_SHADER_ARRAY_CONFIG = 0x226F; +constexpr unsigned int mmCC_MC_MAX_CHANNEL = 0x096E; +constexpr unsigned int mmCC_RB_BACKEND_DISABLE = 0x263D; +constexpr unsigned int mmCC_RB_DAISY_CHAIN = 0x2641; +constexpr unsigned int mmCC_RB_REDUNDANCY = 0x263C; +constexpr unsigned int mmCC_SQC_BANK_DISABLE = 0x2307; +constexpr unsigned int mmCC_SYS_RB_BACKEND_DISABLE = 0x03A0; +constexpr unsigned int mmCC_SYS_RB_REDUNDANCY = 0x039F; +constexpr unsigned int mmCGTS_CU0_LDS_SQ_CTRL_REG__CI__VI = 0xF009; +constexpr unsigned int mmCGTS_CU0_SP0_CTRL_REG__CI__VI = 0xF008; +constexpr unsigned int mmCGTS_CU0_SP1_CTRL_REG__CI__VI = 0xF00B; +constexpr unsigned int mmCGTS_CU0_TA_SQC_CTRL_REG__CI__VI = 0xF00A; +constexpr unsigned int mmCGTS_CU0_TD_TCP_CTRL_REG__CI__VI = 0xF00C; +constexpr unsigned int mmCGTS_CU10_LDS_SQ_CTRL_REG__CI__VI = 0xF03B; +constexpr unsigned int mmCGTS_CU10_SP0_CTRL_REG__CI__VI = 0xF03A; +constexpr unsigned int mmCGTS_CU10_SP1_CTRL_REG__CI__VI = 0xF03D; +constexpr unsigned int mmCGTS_CU10_TA_CTRL_REG__CI__VI = 0xF03C; +constexpr unsigned int mmCGTS_CU10_TD_TCP_CTRL_REG__CI__VI = 0xF03E; +constexpr unsigned int mmCGTS_CU11_LDS_SQ_CTRL_REG__CI__VI = 0xF040; +constexpr unsigned int mmCGTS_CU11_SP0_CTRL_REG__CI__VI = 0xF03F; +constexpr unsigned int mmCGTS_CU11_SP1_CTRL_REG__CI__VI = 0xF042; +constexpr unsigned int mmCGTS_CU11_TA_CTRL_REG__CI__VI = 0xF041; +constexpr unsigned int mmCGTS_CU11_TD_TCP_CTRL_REG__CI__VI = 0xF043; +constexpr unsigned int mmCGTS_CU12_LDS_SQ_CTRL_REG__CI__VI = 0xF045; +constexpr unsigned int mmCGTS_CU12_SP0_CTRL_REG__CI__VI = 0xF044; +constexpr unsigned int mmCGTS_CU12_SP1_CTRL_REG__CI__VI = 0xF047; +constexpr unsigned int mmCGTS_CU12_TA_SQC_CTRL_REG__CI__VI = 0xF046; +constexpr unsigned int mmCGTS_CU12_TD_TCP_CTRL_REG__CI__VI = 0xF048; +constexpr unsigned int mmCGTS_CU13_LDS_SQ_CTRL_REG__CI__VI = 0xF04A; +constexpr unsigned int mmCGTS_CU13_SP0_CTRL_REG__CI__VI = 0xF049; +constexpr unsigned int mmCGTS_CU13_SP1_CTRL_REG__CI__VI = 0xF04C; +constexpr unsigned int mmCGTS_CU13_TA_CTRL_REG__CI__VI = 0xF04B; +constexpr unsigned int mmCGTS_CU13_TD_TCP_CTRL_REG__CI__VI = 0xF04D; +constexpr unsigned int mmCGTS_CU14_LDS_SQ_CTRL_REG__CI__VI = 0xF04F; +constexpr unsigned int mmCGTS_CU14_SP0_CTRL_REG__CI__VI = 0xF04E; +constexpr unsigned int mmCGTS_CU14_SP1_CTRL_REG__CI__VI = 0xF051; +constexpr unsigned int mmCGTS_CU14_TA_CTRL_REG__CI__VI = 0xF050; +constexpr unsigned int mmCGTS_CU14_TD_TCP_CTRL_REG__CI__VI = 0xF052; +constexpr unsigned int mmCGTS_CU15_LDS_SQ_CTRL_REG__CI__VI = 0xF054; +constexpr unsigned int mmCGTS_CU15_SP0_CTRL_REG__CI__VI = 0xF053; +constexpr unsigned int mmCGTS_CU15_SP1_CTRL_REG__CI__VI = 0xF056; +constexpr unsigned int mmCGTS_CU15_TA_CTRL_REG__CI__VI = 0xF055; +constexpr unsigned int mmCGTS_CU15_TD_TCP_CTRL_REG__CI__VI = 0xF057; +constexpr unsigned int mmCGTS_CU1_LDS_SQ_CTRL_REG__CI__VI = 0xF00E; +constexpr unsigned int mmCGTS_CU1_SP0_CTRL_REG__CI__VI = 0xF00D; +constexpr unsigned int mmCGTS_CU1_SP1_CTRL_REG__CI__VI = 0xF010; +constexpr unsigned int mmCGTS_CU1_TA_CTRL_REG__CI__VI = 0xF00F; +constexpr unsigned int mmCGTS_CU1_TD_TCP_CTRL_REG__CI__VI = 0xF011; +constexpr unsigned int mmCGTS_CU2_LDS_SQ_CTRL_REG__CI__VI = 0xF013; +constexpr unsigned int mmCGTS_CU2_SP0_CTRL_REG__CI__VI = 0xF012; +constexpr unsigned int mmCGTS_CU2_SP1_CTRL_REG__CI__VI = 0xF015; +constexpr unsigned int mmCGTS_CU2_TA_CTRL_REG__CI__VI = 0xF014; +constexpr unsigned int mmCGTS_CU2_TD_TCP_CTRL_REG__CI__VI = 0xF016; +constexpr unsigned int mmCGTS_CU3_LDS_SQ_CTRL_REG__CI__VI = 0xF018; +constexpr unsigned int mmCGTS_CU3_SP0_CTRL_REG__CI__VI = 0xF017; +constexpr unsigned int mmCGTS_CU3_SP1_CTRL_REG__CI__VI = 0xF01A; +constexpr unsigned int mmCGTS_CU3_TA_CTRL_REG__CI__VI = 0xF019; +constexpr unsigned int mmCGTS_CU3_TD_TCP_CTRL_REG__CI__VI = 0xF01B; +constexpr unsigned int mmCGTS_CU4_LDS_SQ_CTRL_REG__CI__VI = 0xF01D; +constexpr unsigned int mmCGTS_CU4_SP0_CTRL_REG__CI__VI = 0xF01C; +constexpr unsigned int mmCGTS_CU4_SP1_CTRL_REG__CI__VI = 0xF01F; +constexpr unsigned int mmCGTS_CU4_TA_SQC_CTRL_REG__CI__VI = 0xF01E; +constexpr unsigned int mmCGTS_CU4_TD_TCP_CTRL_REG__CI__VI = 0xF020; +constexpr unsigned int mmCGTS_CU5_LDS_SQ_CTRL_REG__CI__VI = 0xF022; +constexpr unsigned int mmCGTS_CU5_SP0_CTRL_REG__CI__VI = 0xF021; +constexpr unsigned int mmCGTS_CU5_SP1_CTRL_REG__CI__VI = 0xF024; +constexpr unsigned int mmCGTS_CU5_TA_CTRL_REG__CI__VI = 0xF023; +constexpr unsigned int mmCGTS_CU5_TD_TCP_CTRL_REG__CI__VI = 0xF025; +constexpr unsigned int mmCGTS_CU6_LDS_SQ_CTRL_REG__CI__VI = 0xF027; +constexpr unsigned int mmCGTS_CU6_SP0_CTRL_REG__CI__VI = 0xF026; +constexpr unsigned int mmCGTS_CU6_SP1_CTRL_REG__CI__VI = 0xF029; +constexpr unsigned int mmCGTS_CU6_TA_CTRL_REG__CI__VI = 0xF028; +constexpr unsigned int mmCGTS_CU6_TD_TCP_CTRL_REG__CI__VI = 0xF02A; +constexpr unsigned int mmCGTS_CU7_LDS_SQ_CTRL_REG__CI__VI = 0xF02C; +constexpr unsigned int mmCGTS_CU7_SP0_CTRL_REG__CI__VI = 0xF02B; +constexpr unsigned int mmCGTS_CU7_SP1_CTRL_REG__CI__VI = 0xF02E; +constexpr unsigned int mmCGTS_CU7_TA_CTRL_REG__CI__VI = 0xF02D; +constexpr unsigned int mmCGTS_CU7_TD_TCP_CTRL_REG__CI__VI = 0xF02F; +constexpr unsigned int mmCGTS_CU8_LDS_SQ_CTRL_REG__CI__VI = 0xF031; +constexpr unsigned int mmCGTS_CU8_SP0_CTRL_REG__CI__VI = 0xF030; +constexpr unsigned int mmCGTS_CU8_SP1_CTRL_REG__CI__VI = 0xF033; +constexpr unsigned int mmCGTS_CU8_TA_SQC_CTRL_REG__CI__VI = 0xF032; +constexpr unsigned int mmCGTS_CU8_TD_TCP_CTRL_REG__CI__VI = 0xF034; +constexpr unsigned int mmCGTS_CU9_LDS_SQ_CTRL_REG__CI__VI = 0xF036; +constexpr unsigned int mmCGTS_CU9_SP0_CTRL_REG__CI__VI = 0xF035; +constexpr unsigned int mmCGTS_CU9_SP1_CTRL_REG__CI__VI = 0xF038; +constexpr unsigned int mmCGTS_CU9_TA_CTRL_REG__CI__VI = 0xF037; +constexpr unsigned int mmCGTS_CU9_TD_TCP_CTRL_REG__CI__VI = 0xF039; +constexpr unsigned int mmCGTS_RD_CTRL_REG__CI__VI = 0xF001; +constexpr unsigned int mmCGTS_RD_CTRL_REG__SI = 0x2455; +constexpr unsigned int mmCGTS_RD_REG__CI__VI = 0xF002; +constexpr unsigned int mmCGTS_RD_REG__SI = 0x2456; +constexpr unsigned int mmCGTS_SM_CTRL_REG__CI__VI = 0xF000; +constexpr unsigned int mmCGTS_SM_CTRL_REG__SI = 0x2454; +constexpr unsigned int mmCGTS_TCC_DISABLE__CI__VI = 0xF003; +constexpr unsigned int mmCGTS_TCC_DISABLE__SI = 0x2452; +constexpr unsigned int mmCGTS_USER_TCC_DISABLE__CI__VI = 0xF004; +constexpr unsigned int mmCGTS_USER_TCC_DISABLE__SI = 0x2453; +constexpr unsigned int mmCGTT_BCI_CLK_CTRL__CI__VI = 0xF082; +constexpr unsigned int mmCGTT_BCI_CLK_CTRL__SI = 0x24A9; +constexpr unsigned int mmCGTT_CPC_CLK_CTRL__CI__VI = 0xF0B2; +constexpr unsigned int mmCGTT_CPF_CLK_CTRL__CI__VI = 0xF0B1; +constexpr unsigned int mmCGTT_CP_CLK_CTRL__CI__VI = 0xF0B0; +constexpr unsigned int mmCGTT_CP_CLK_CTRL__SI = 0x3059; +constexpr unsigned int mmCGTT_GDS_CLK_CTRL__CI__VI = 0xF0A0; +constexpr unsigned int mmCGTT_GDS_CLK_CTRL__SI = 0x25DD; +constexpr unsigned int mmCGTT_IA_CLK_CTRL__CI__VI = 0xF085; +constexpr unsigned int mmCGTT_IA_CLK_CTRL__SI = 0x2261; +constexpr unsigned int mmCGTT_PA_CLK_CTRL__CI__VI = 0xF088; +constexpr unsigned int mmCGTT_PA_CLK_CTRL__SI = 0x2286; +constexpr unsigned int mmCGTT_PC_CLK_CTRL__CI__VI = 0xF081; +constexpr unsigned int mmCGTT_PC_CLK_CTRL__SI = 0x24A8; +constexpr unsigned int mmCGTT_RLC_CLK_CTRL__CI__VI = 0xF0B8; +constexpr unsigned int mmCGTT_RLC_CLK_CTRL__SI = 0x30E0; +constexpr unsigned int mmCGTT_ROM_CLK_CTRL0__SI = 0x0583; +constexpr unsigned int mmCGTT_SC_CLK_CTRL__CI__VI = 0xF089; +constexpr unsigned int mmCGTT_SC_CLK_CTRL__SI = 0x22CA; +constexpr unsigned int mmCGTT_SPI_CLK_CTRL__CI__VI = 0xF080; +constexpr unsigned int mmCGTT_SPI_CLK_CTRL__SI = 0x2451; +constexpr unsigned int mmCGTT_SQG_CLK_CTRL__CI__VI = 0xF08D; +constexpr unsigned int mmCGTT_SQG_CLK_CTRL__SI = 0x2363; +constexpr unsigned int mmCGTT_SQ_CLK_CTRL__CI__VI = 0xF08C; +constexpr unsigned int mmCGTT_SQ_CLK_CTRL__SI = 0x2362; +constexpr unsigned int mmCGTT_SX_CLK_CTRL0__CI__VI = 0xF094; +constexpr unsigned int mmCGTT_SX_CLK_CTRL0__SI = 0x240C; +constexpr unsigned int mmCGTT_SX_CLK_CTRL1__CI__VI = 0xF095; +constexpr unsigned int mmCGTT_SX_CLK_CTRL1__SI = 0x240D; +constexpr unsigned int mmCGTT_SX_CLK_CTRL2__CI__VI = 0xF096; +constexpr unsigned int mmCGTT_SX_CLK_CTRL2__SI = 0x240E; +constexpr unsigned int mmCGTT_SX_CLK_CTRL3__CI__VI = 0xF097; +constexpr unsigned int mmCGTT_SX_CLK_CTRL3__SI = 0x240F; +constexpr unsigned int mmCGTT_SX_CLK_CTRL4__CI__VI = 0xF098; +constexpr unsigned int mmCGTT_SX_CLK_CTRL4__SI = 0x2410; +constexpr unsigned int mmCGTT_TCI_CLK_CTRL__CI__VI = 0xF09F; +constexpr unsigned int mmCGTT_TCI_CLK_CTRL__SI = 0x2B60; +constexpr unsigned int mmCGTT_TCP_CLK_CTRL__CI__VI = 0xF09E; +constexpr unsigned int mmCGTT_TCP_CLK_CTRL__SI = 0x2B15; +constexpr unsigned int mmCGTT_VGT_CLK_CTRL__CI__VI = 0xF084; +constexpr unsigned int mmCGTT_VGT_CLK_CTRL__SI = 0x225F; +constexpr unsigned int mmCGTT_WD_CLK_CTRL__CI__VI = 0xF086; +constexpr unsigned int mmCG_CLKPIN_CNTL__SI = 0x0198; +constexpr unsigned int mmCG_DISPLAY_GAP_CNTL__SI = 0x020A; +constexpr unsigned int mmCG_FDO_CTRL0__SI = 0x01D5; +constexpr unsigned int mmCG_FDO_CTRL1__SI = 0x01D6; +constexpr unsigned int mmCG_FDO_CTRL2__SI = 0x01D7; +constexpr unsigned int mmCG_FPS_CNT__CI = 0x0194; +constexpr unsigned int mmCG_FREQ_TRAN_VOTING__SI = 0x01EF; +constexpr unsigned int mmCG_MULT_THERMAL_CTRL__SI = 0x01C4; +constexpr unsigned int mmCG_MULT_THERMAL_STATUS__SI = 0x01C5; +constexpr unsigned int mmCG_SPLL_FUNC_CNTL_2__SI = 0x0181; +constexpr unsigned int mmCG_SPLL_FUNC_CNTL_3__SI = 0x0182; +constexpr unsigned int mmCG_SPLL_FUNC_CNTL_4__SI = 0x0183; +constexpr unsigned int mmCG_SPLL_FUNC_CNTL_5__SI = 0x0184; +constexpr unsigned int mmCG_SPLL_FUNC_CNTL__SI = 0x0180; +constexpr unsigned int mmCG_SPLL_SPREAD_SPECTRUM_2__SI = 0x0189; +constexpr unsigned int mmCG_SPLL_SPREAD_SPECTRUM__SI = 0x0188; +constexpr unsigned int mmCG_STATIC_SCREEN_PARAMETER__SI = 0x0203; +constexpr unsigned int mmCG_TACH_CTRL__SI = 0x01DC; +constexpr unsigned int mmCG_TACH_STATUS__SI = 0x01DD; +constexpr unsigned int mmCG_THERMAL_CTRL__SI = 0x01C0; +constexpr unsigned int mmCG_THERMAL_INT__SI = 0x01C2; +constexpr unsigned int mmCG_THERMAL_STATUS__SI = 0x01C1; +constexpr unsigned int mmCG_ULV_PARAMETER__SI = 0x021F; +constexpr unsigned int mmCHUB_ATC_PERFCOUNTER0_CFG__CI__VI = 0x07D8; +constexpr unsigned int mmCHUB_ATC_PERFCOUNTER1_CFG__CI__VI = 0x07D9; +constexpr unsigned int mmCHUB_ATC_PERFCOUNTER_HI__CI__VI = 0x07D7; +constexpr unsigned int mmCHUB_ATC_PERFCOUNTER_LO__CI__VI = 0x07D6; +constexpr unsigned int mmCHUB_ATC_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07DA; +constexpr unsigned int mmCLKREQB_PAD_CNTL__CI__VI = 0x1521; +constexpr unsigned int mmCOHER_DEST_BASE_0 = 0xA092; +constexpr unsigned int mmCOHER_DEST_BASE_1 = 0xA093; +constexpr unsigned int mmCOHER_DEST_BASE_2 = 0xA07E; +constexpr unsigned int mmCOHER_DEST_BASE_3 = 0xA07F; +constexpr unsigned int mmCOHER_DEST_BASE_HI_0__CI__VI = 0xA07A; +constexpr unsigned int mmCOHER_DEST_BASE_HI_1__CI__VI = 0xA07B; +constexpr unsigned int mmCOHER_DEST_BASE_HI_2__CI__VI = 0xA07C; +constexpr unsigned int mmCOHER_DEST_BASE_HI_3__CI__VI = 0xA07D; +constexpr unsigned int mmCOMPUTE_DIM_X = 0x2E01; +constexpr unsigned int mmCOMPUTE_DIM_Y = 0x2E02; +constexpr unsigned int mmCOMPUTE_DIM_Z = 0x2E03; +constexpr unsigned int mmCOMPUTE_DISPATCH_INITIATOR = 0x2E00; +constexpr unsigned int mmCOMPUTE_MISC_RESERVED__CI__VI = 0x2E1F; +constexpr unsigned int mmCOMPUTE_NUM_THREAD_X = 0x2E07; +constexpr unsigned int mmCOMPUTE_NUM_THREAD_Y = 0x2E08; +constexpr unsigned int mmCOMPUTE_NUM_THREAD_Z = 0x2E09; +constexpr unsigned int mmCOMPUTE_PERFCOUNT_ENABLE__CI__VI = 0x2E0B; +constexpr unsigned int mmCOMPUTE_PGM_HI = 0x2E0D; +constexpr unsigned int mmCOMPUTE_PGM_LO = 0x2E0C; +constexpr unsigned int mmCOMPUTE_PGM_RSRC1 = 0x2E12; +constexpr unsigned int mmCOMPUTE_PGM_RSRC2 = 0x2E13; +constexpr unsigned int mmCOMPUTE_PIPELINESTAT_ENABLE__CI__VI = 0x2E0A; +constexpr unsigned int mmCOMPUTE_RESOURCE_LIMITS = 0x2E15; +constexpr unsigned int mmCOMPUTE_RESTART_X__CI__VI = 0x2E1B; +constexpr unsigned int mmCOMPUTE_RESTART_Y__CI__VI = 0x2E1C; +constexpr unsigned int mmCOMPUTE_RESTART_Z__CI__VI = 0x2E1D; +constexpr unsigned int mmCOMPUTE_START_X = 0x2E04; +constexpr unsigned int mmCOMPUTE_START_Y = 0x2E05; +constexpr unsigned int mmCOMPUTE_START_Z = 0x2E06; +constexpr unsigned int mmCOMPUTE_STATIC_THREAD_MGMT_SE0 = 0x2E16; +constexpr unsigned int mmCOMPUTE_STATIC_THREAD_MGMT_SE1 = 0x2E17; +constexpr unsigned int mmCOMPUTE_STATIC_THREAD_MGMT_SE2__CI__VI = 0x2E19; +constexpr unsigned int mmCOMPUTE_STATIC_THREAD_MGMT_SE3__CI__VI = 0x2E1A; +constexpr unsigned int mmCOMPUTE_TBA_HI = 0x2E0F; +constexpr unsigned int mmCOMPUTE_TBA_LO = 0x2E0E; +constexpr unsigned int mmCOMPUTE_THREAD_TRACE_ENABLE__CI__VI = 0x2E1E; +constexpr unsigned int mmCOMPUTE_TMA_HI = 0x2E11; +constexpr unsigned int mmCOMPUTE_TMA_LO = 0x2E10; +constexpr unsigned int mmCOMPUTE_TMPRING_SIZE = 0x2E18; +constexpr unsigned int mmCOMPUTE_USER_DATA_0 = 0x2E40; +constexpr unsigned int mmCOMPUTE_USER_DATA_1 = 0x2E41; +constexpr unsigned int mmCOMPUTE_USER_DATA_10 = 0x2E4A; +constexpr unsigned int mmCOMPUTE_USER_DATA_11 = 0x2E4B; +constexpr unsigned int mmCOMPUTE_USER_DATA_12 = 0x2E4C; +constexpr unsigned int mmCOMPUTE_USER_DATA_13 = 0x2E4D; +constexpr unsigned int mmCOMPUTE_USER_DATA_14 = 0x2E4E; +constexpr unsigned int mmCOMPUTE_USER_DATA_15 = 0x2E4F; +constexpr unsigned int mmCOMPUTE_USER_DATA_2 = 0x2E42; +constexpr unsigned int mmCOMPUTE_USER_DATA_3 = 0x2E43; +constexpr unsigned int mmCOMPUTE_USER_DATA_4 = 0x2E44; +constexpr unsigned int mmCOMPUTE_USER_DATA_5 = 0x2E45; +constexpr unsigned int mmCOMPUTE_USER_DATA_6 = 0x2E46; +constexpr unsigned int mmCOMPUTE_USER_DATA_7 = 0x2E47; +constexpr unsigned int mmCOMPUTE_USER_DATA_8 = 0x2E48; +constexpr unsigned int mmCOMPUTE_USER_DATA_9 = 0x2E49; +constexpr unsigned int mmCOMPUTE_VMID = 0x2E14; +constexpr unsigned int mmCONFIG_APER_SIZE = 0x150C; +constexpr unsigned int mmCONFIG_CNTL = 0x1509; +constexpr unsigned int mmCONFIG_F0_BASE = 0x150B; +constexpr unsigned int mmCONFIG_MEMSIZE = 0x150A; +constexpr unsigned int mmCONFIG_REG_APER_SIZE = 0x150D; +constexpr unsigned int mmCPC1_CONFIG__CI = 0x0F97; +constexpr unsigned int mmCPC2_CONFIG__CI = 0x0F98; +constexpr unsigned int mmCPC_INT_CNTL__CI__VI = 0x30B4; +constexpr unsigned int mmCPC_INT_CNTX_ID__CI__VI = 0x30B7; +constexpr unsigned int mmCPC_INT_STATUS__CI__VI = 0x30B5; +constexpr unsigned int mmCPC_PERFCOUNTER0_HI__CI__VI = 0xD007; +constexpr unsigned int mmCPC_PERFCOUNTER0_LO__CI__VI = 0xD006; +constexpr unsigned int mmCPC_PERFCOUNTER0_SELECT1__CI__VI = 0xD804; +constexpr unsigned int mmCPC_PERFCOUNTER0_SELECT__CI__VI = 0xD809; +constexpr unsigned int mmCPC_PERFCOUNTER1_HI__CI__VI = 0xD005; +constexpr unsigned int mmCPC_PERFCOUNTER1_LO__CI__VI = 0xD004; +constexpr unsigned int mmCPC_PERFCOUNTER1_SELECT__CI__VI = 0xD803; +constexpr unsigned int mmCPF_PERFCOUNTER0_HI__CI__VI = 0xD00B; +constexpr unsigned int mmCPF_PERFCOUNTER0_LO__CI__VI = 0xD00A; +constexpr unsigned int mmCPF_PERFCOUNTER0_SELECT1__CI__VI = 0xD806; +constexpr unsigned int mmCPF_PERFCOUNTER0_SELECT__CI__VI = 0xD807; +constexpr unsigned int mmCPF_PERFCOUNTER1_HI__CI__VI = 0xD009; +constexpr unsigned int mmCPF_PERFCOUNTER1_LO__CI__VI = 0xD008; +constexpr unsigned int mmCPF_PERFCOUNTER1_SELECT__CI__VI = 0xD805; +constexpr unsigned int mmCPG_CONFIG__CI = 0x0F96; +constexpr unsigned int mmCPG_PERFCOUNTER0_HI__CI__VI = 0xD003; +constexpr unsigned int mmCPG_PERFCOUNTER0_LO__CI__VI = 0xD002; +constexpr unsigned int mmCPG_PERFCOUNTER0_SELECT1__CI__VI = 0xD801; +constexpr unsigned int mmCPG_PERFCOUNTER0_SELECT__CI__VI = 0xD802; +constexpr unsigned int mmCPG_PERFCOUNTER1_HI__CI__VI = 0xD001; +constexpr unsigned int mmCPG_PERFCOUNTER1_LO__CI__VI = 0xD000; +constexpr unsigned int mmCPG_PERFCOUNTER1_SELECT__CI__VI = 0xD800; +constexpr unsigned int mmCP_APPEND_ADDR_HI__CI__VI = 0xC059; +constexpr unsigned int mmCP_APPEND_ADDR_HI__SI = 0x2159; +constexpr unsigned int mmCP_APPEND_ADDR_LO__CI__VI = 0xC058; +constexpr unsigned int mmCP_APPEND_ADDR_LO__SI = 0x2158; +constexpr unsigned int mmCP_APPEND_DATA__CI__VI = 0xC05A; +constexpr unsigned int mmCP_APPEND_DATA__SI = 0x215A; +constexpr unsigned int mmCP_APPEND_LAST_CS_FENCE__CI__VI = 0xC05B; +constexpr unsigned int mmCP_APPEND_LAST_CS_FENCE__SI = 0x215B; +constexpr unsigned int mmCP_APPEND_LAST_PS_FENCE__CI__VI = 0xC05C; +constexpr unsigned int mmCP_APPEND_LAST_PS_FENCE__SI = 0x215C; +constexpr unsigned int mmCP_ATOMIC_PREOP_HI__CI__VI = 0xC05E; +constexpr unsigned int mmCP_ATOMIC_PREOP_HI__SI = 0x215E; +constexpr unsigned int mmCP_ATOMIC_PREOP_LO__CI__VI = 0xC05D; +constexpr unsigned int mmCP_ATOMIC_PREOP_LO__SI = 0x215D; +constexpr unsigned int mmCP_BUSY_STAT = 0x219F; +constexpr unsigned int mmCP_CEQ1_AVAIL = 0x21E6; +constexpr unsigned int mmCP_CEQ2_AVAIL = 0x21E7; +constexpr unsigned int mmCP_CE_COMPARE_COUNT__CI__VI = 0x20C0; +constexpr unsigned int mmCP_CE_COUNTER__CI__VI = 0xC09A; +constexpr unsigned int mmCP_CE_DE_COUNT__CI__VI = 0x20C1; +constexpr unsigned int mmCP_CE_HEADER_DUMP = 0x21A4; +constexpr unsigned int mmCP_CE_IB1_BASE_HI__CI__VI = 0xC0C7; +constexpr unsigned int mmCP_CE_IB1_BASE_HI__SI = 0x21C7; +constexpr unsigned int mmCP_CE_IB1_BASE_LO__CI__VI = 0xC0C6; +constexpr unsigned int mmCP_CE_IB1_BASE_LO__SI = 0x21C6; +constexpr unsigned int mmCP_CE_IB1_BUFSZ__CI__VI = 0xC0C8; +constexpr unsigned int mmCP_CE_IB1_BUFSZ__SI = 0x21C8; +constexpr unsigned int mmCP_CE_IB1_OFFSET__CI__VI = 0xC098; +constexpr unsigned int mmCP_CE_IB2_BASE_HI__CI__VI = 0xC0CA; +constexpr unsigned int mmCP_CE_IB2_BASE_HI__SI = 0x21CA; +constexpr unsigned int mmCP_CE_IB2_BASE_LO__CI__VI = 0xC0C9; +constexpr unsigned int mmCP_CE_IB2_BASE_LO__SI = 0x21C9; +constexpr unsigned int mmCP_CE_IB2_BUFSZ__CI__VI = 0xC0CB; +constexpr unsigned int mmCP_CE_IB2_BUFSZ__SI = 0x21CB; +constexpr unsigned int mmCP_CE_IB2_OFFSET__CI__VI = 0xC099; +constexpr unsigned int mmCP_CE_INIT_BASE_HI__CI__VI = 0xC0C4; +constexpr unsigned int mmCP_CE_INIT_BASE_HI__SI = 0x21C4; +constexpr unsigned int mmCP_CE_INIT_BASE_LO__CI__VI = 0xC0C3; +constexpr unsigned int mmCP_CE_INIT_BASE_LO__SI = 0x21C3; +constexpr unsigned int mmCP_CE_INIT_BUFSZ__CI__VI = 0xC0C5; +constexpr unsigned int mmCP_CE_INIT_BUFSZ__SI = 0x21C5; +constexpr unsigned int mmCP_CE_INTR_ROUTINE_START__CI__VI = 0x30A8; +constexpr unsigned int mmCP_CE_PRGRM_CNTR_START__CI__VI = 0x30A3; +constexpr unsigned int mmCP_CE_ROQ_IB1_STAT = 0x21E9; +constexpr unsigned int mmCP_CE_ROQ_IB2_STAT = 0x21EA; +constexpr unsigned int mmCP_CE_ROQ_RB_STAT = 0x21E8; +constexpr unsigned int mmCP_CMD_DATA = 0x21DF; +constexpr unsigned int mmCP_CMD_INDEX = 0x21DE; +constexpr unsigned int mmCP_CNTX_STAT = 0x21B8; +constexpr unsigned int mmCP_COHER_BASE_HI__CI__VI = 0xC079; +constexpr unsigned int mmCP_COHER_BASE__CI__VI = 0xC07E; +constexpr unsigned int mmCP_COHER_BASE__SI = 0x217E; +constexpr unsigned int mmCP_COHER_CNTL__CI__VI = 0xC07C; +constexpr unsigned int mmCP_COHER_CNTL__SI = 0x217C; +constexpr unsigned int mmCP_COHER_SIZE_HI__CI__VI = 0xC08C; +constexpr unsigned int mmCP_COHER_SIZE__CI__VI = 0xC07D; +constexpr unsigned int mmCP_COHER_SIZE__SI = 0x217D; +constexpr unsigned int mmCP_COHER_START_DELAY__CI__VI = 0xC07B; +constexpr unsigned int mmCP_COHER_START_DELAY__SI = 0x217B; +constexpr unsigned int mmCP_COHER_STATUS__CI__VI = 0xC07F; +constexpr unsigned int mmCP_COHER_STATUS__SI = 0x217F; +constexpr unsigned int mmCP_CONFIG__SI = 0x0F92; +constexpr unsigned int mmCP_CONTEXT_CNTL__CI__VI = 0x30AD; +constexpr unsigned int mmCP_CPC_BUSY_STAT__CI__VI = 0x2085; +constexpr unsigned int mmCP_CPC_GRBM_FREE_COUNT__CI__VI = 0x208B; +constexpr unsigned int mmCP_CPC_HALT_HYST_COUNT__CI__VI = 0x20A7; +constexpr unsigned int mmCP_CPC_MC_CNTL__CI = 0x208A; +constexpr unsigned int mmCP_CPC_SCRATCH_DATA__CI__VI = 0x2091; +constexpr unsigned int mmCP_CPC_SCRATCH_INDEX__CI__VI = 0x2090; +constexpr unsigned int mmCP_CPC_STALLED_STAT1__CI__VI = 0x2086; +constexpr unsigned int mmCP_CPC_STATUS__CI__VI = 0x2084; +constexpr unsigned int mmCP_CPF_BUSY_STAT__CI__VI = 0x2088; +constexpr unsigned int mmCP_CPF_STALLED_STAT1__CI__VI = 0x2089; +constexpr unsigned int mmCP_CPF_STATUS__CI__VI = 0x2087; +constexpr unsigned int mmCP_CSF_CNTL = 0x21B5; +constexpr unsigned int mmCP_CSF_STAT = 0x21B4; +constexpr unsigned int mmCP_DEBUG = 0x307F; +constexpr unsigned int mmCP_DEVICE_ID__CI__VI = 0x304B; +constexpr unsigned int mmCP_DE_CE_COUNT__CI__VI = 0x20C2; +constexpr unsigned int mmCP_DE_DE_COUNT__CI__VI = 0x20C4; +constexpr unsigned int mmCP_DE_LAST_INVAL_COUNT__CI__VI = 0x20C3; +constexpr unsigned int mmCP_DFY_ADDR_HI__CI__VI = 0x3022; +constexpr unsigned int mmCP_DFY_ADDR_LO__CI__VI = 0x3023; +constexpr unsigned int mmCP_DFY_CNTL__CI__VI = 0x3020; +constexpr unsigned int mmCP_DFY_DATA_0__CI__VI = 0x3024; +constexpr unsigned int mmCP_DFY_DATA_10__CI__VI = 0x302E; +constexpr unsigned int mmCP_DFY_DATA_11__CI__VI = 0x302F; +constexpr unsigned int mmCP_DFY_DATA_12__CI__VI = 0x3030; +constexpr unsigned int mmCP_DFY_DATA_13__CI__VI = 0x3031; +constexpr unsigned int mmCP_DFY_DATA_14__CI__VI = 0x3032; +constexpr unsigned int mmCP_DFY_DATA_15__CI__VI = 0x3033; +constexpr unsigned int mmCP_DFY_DATA_1__CI__VI = 0x3025; +constexpr unsigned int mmCP_DFY_DATA_2__CI__VI = 0x3026; +constexpr unsigned int mmCP_DFY_DATA_3__CI__VI = 0x3027; +constexpr unsigned int mmCP_DFY_DATA_4__CI__VI = 0x3028; +constexpr unsigned int mmCP_DFY_DATA_5__CI__VI = 0x3029; +constexpr unsigned int mmCP_DFY_DATA_6__CI__VI = 0x302A; +constexpr unsigned int mmCP_DFY_DATA_7__CI__VI = 0x302B; +constexpr unsigned int mmCP_DFY_DATA_8__CI__VI = 0x302C; +constexpr unsigned int mmCP_DFY_DATA_9__CI__VI = 0x302D; +constexpr unsigned int mmCP_DFY_STAT__CI__VI = 0x3021; +constexpr unsigned int mmCP_DMA_CNTL__CI__VI = 0xC08A; +constexpr unsigned int mmCP_DMA_CNTL__SI = 0x218A; +constexpr unsigned int mmCP_DMA_ME_COMMAND__CI__VI = 0xC084; +constexpr unsigned int mmCP_DMA_ME_COMMAND__SI = 0x2184; +constexpr unsigned int mmCP_DMA_ME_CONTROL__CI__VI = 0xC078; +constexpr unsigned int mmCP_DMA_ME_DST_ADDR_HI__CI__VI = 0xC083; +constexpr unsigned int mmCP_DMA_ME_DST_ADDR_HI__SI = 0x2183; +constexpr unsigned int mmCP_DMA_ME_DST_ADDR__CI__VI = 0xC082; +constexpr unsigned int mmCP_DMA_ME_DST_ADDR__SI = 0x2182; +constexpr unsigned int mmCP_DMA_ME_SRC_ADDR_HI__CI__VI = 0xC081; +constexpr unsigned int mmCP_DMA_ME_SRC_ADDR_HI__SI = 0x2181; +constexpr unsigned int mmCP_DMA_ME_SRC_ADDR__CI__VI = 0xC080; +constexpr unsigned int mmCP_DMA_ME_SRC_ADDR__SI = 0x2180; +constexpr unsigned int mmCP_DMA_PFP_COMMAND__CI__VI = 0xC089; +constexpr unsigned int mmCP_DMA_PFP_COMMAND__SI = 0x2189; +constexpr unsigned int mmCP_DMA_PFP_CONTROL__CI__VI = 0xC077; +constexpr unsigned int mmCP_DMA_PFP_DST_ADDR_HI__CI__VI = 0xC088; +constexpr unsigned int mmCP_DMA_PFP_DST_ADDR_HI__SI = 0x2188; +constexpr unsigned int mmCP_DMA_PFP_DST_ADDR__CI__VI = 0xC087; +constexpr unsigned int mmCP_DMA_PFP_DST_ADDR__SI = 0x2187; +constexpr unsigned int mmCP_DMA_PFP_SRC_ADDR_HI__CI__VI = 0xC086; +constexpr unsigned int mmCP_DMA_PFP_SRC_ADDR_HI__SI = 0x2186; +constexpr unsigned int mmCP_DMA_PFP_SRC_ADDR__CI__VI = 0xC085; +constexpr unsigned int mmCP_DMA_PFP_SRC_ADDR__SI = 0x2185; +constexpr unsigned int mmCP_DMA_READ_TAGS__CI__VI = 0xC08B; +constexpr unsigned int mmCP_DMA_READ_TAGS__SI = 0x218B; +constexpr unsigned int mmCP_ECC_FIRSTOCCURRENCE = 0x307A; +constexpr unsigned int mmCP_ECC_FIRSTOCCURRENCE_RING0 = 0x307B; +constexpr unsigned int mmCP_ECC_FIRSTOCCURRENCE_RING1 = 0x307C; +constexpr unsigned int mmCP_ECC_FIRSTOCCURRENCE_RING2 = 0x307D; +constexpr unsigned int mmCP_ENDIAN_SWAP__CI__VI = 0x3050; +constexpr unsigned int mmCP_EOP_DONE_ADDR_HI__CI__VI = 0xC001; +constexpr unsigned int mmCP_EOP_DONE_ADDR_HI__SI = 0x2101; +constexpr unsigned int mmCP_EOP_DONE_ADDR_LO__CI__VI = 0xC000; +constexpr unsigned int mmCP_EOP_DONE_ADDR_LO__SI = 0x2100; +constexpr unsigned int mmCP_EOP_DONE_DATA_CNTL__CI__VI = 0xC0D6; +constexpr unsigned int mmCP_EOP_DONE_DATA_HI__CI__VI = 0xC003; +constexpr unsigned int mmCP_EOP_DONE_DATA_HI__SI = 0x2103; +constexpr unsigned int mmCP_EOP_DONE_DATA_LO__CI__VI = 0xC002; +constexpr unsigned int mmCP_EOP_DONE_DATA_LO__SI = 0x2102; +constexpr unsigned int mmCP_EOP_DONE_EVENT_CNTL__CI__VI = 0xC0D5; +constexpr unsigned int mmCP_EOP_LAST_FENCE_HI__CI__VI = 0xC005; +constexpr unsigned int mmCP_EOP_LAST_FENCE_HI__SI = 0x2105; +constexpr unsigned int mmCP_EOP_LAST_FENCE_LO__CI__VI = 0xC004; +constexpr unsigned int mmCP_EOP_LAST_FENCE_LO__SI = 0x2104; +constexpr unsigned int mmCP_FETCHER_SOURCE__CI = 0x3082; +constexpr unsigned int mmCP_GDS_ATOMIC0_PREOP_HI__CI__VI = 0xC060; +constexpr unsigned int mmCP_GDS_ATOMIC0_PREOP_HI__SI = 0x2160; +constexpr unsigned int mmCP_GDS_ATOMIC0_PREOP_LO__CI__VI = 0xC05F; +constexpr unsigned int mmCP_GDS_ATOMIC0_PREOP_LO__SI = 0x215F; +constexpr unsigned int mmCP_GDS_ATOMIC1_PREOP_HI__CI__VI = 0xC062; +constexpr unsigned int mmCP_GDS_ATOMIC1_PREOP_HI__SI = 0x2162; +constexpr unsigned int mmCP_GDS_ATOMIC1_PREOP_LO__CI__VI = 0xC061; +constexpr unsigned int mmCP_GDS_ATOMIC1_PREOP_LO__SI = 0x2161; +constexpr unsigned int mmCP_GRBM_FREE_COUNT = 0x21A3; +constexpr unsigned int mmCP_HPD_EOP_BASE_ADDR_HI__CI = 0x3242; +constexpr unsigned int mmCP_HPD_EOP_BASE_ADDR__CI = 0x3241; +constexpr unsigned int mmCP_HPD_EOP_CONTROL__CI = 0x3244; +constexpr unsigned int mmCP_HPD_EOP_VMID__CI = 0x3243; +constexpr unsigned int mmCP_HPD_ROQ_OFFSETS__CI__VI = 0x3240; +constexpr unsigned int mmCP_HQD_ACTIVE__CI__VI = 0x3247; +constexpr unsigned int mmCP_HQD_ATOMIC0_PREOP_HI__CI__VI = 0x3262; +constexpr unsigned int mmCP_HQD_ATOMIC0_PREOP_LO__CI__VI = 0x3261; +constexpr unsigned int mmCP_HQD_ATOMIC1_PREOP_HI__CI__VI = 0x3264; +constexpr unsigned int mmCP_HQD_ATOMIC1_PREOP_LO__CI__VI = 0x3263; +constexpr unsigned int mmCP_HQD_DEQUEUE_REQUEST__CI__VI = 0x325D; +constexpr unsigned int mmCP_HQD_DMA_OFFLOAD__CI__VI = 0x325E; +constexpr unsigned int mmCP_HQD_HQ_SCHEDULER0__CI__VI = 0x3265; +constexpr unsigned int mmCP_HQD_HQ_SCHEDULER1__CI__VI = 0x3266; +constexpr unsigned int mmCP_HQD_IB_BASE_ADDR_HI__CI__VI = 0x3258; +constexpr unsigned int mmCP_HQD_IB_BASE_ADDR__CI__VI = 0x3257; +constexpr unsigned int mmCP_HQD_IB_CONTROL__CI__VI = 0x325A; +constexpr unsigned int mmCP_HQD_IB_RPTR__CI__VI = 0x3259; +constexpr unsigned int mmCP_HQD_IQ_RPTR__CI__VI = 0x325C; +constexpr unsigned int mmCP_HQD_IQ_TIMER__CI__VI = 0x325B; +constexpr unsigned int mmCP_HQD_MSG_TYPE__CI__VI = 0x3260; +constexpr unsigned int mmCP_HQD_PERSISTENT_STATE__CI__VI = 0x3249; +constexpr unsigned int mmCP_HQD_PIPE_PRIORITY__CI__VI = 0x324A; +constexpr unsigned int mmCP_HQD_PQ_BASE_HI__CI__VI = 0x324E; +constexpr unsigned int mmCP_HQD_PQ_BASE__CI__VI = 0x324D; +constexpr unsigned int mmCP_HQD_PQ_CONTROL__CI__VI = 0x3256; +constexpr unsigned int mmCP_HQD_PQ_DOORBELL_CONTROL__CI__VI = 0x3254; +constexpr unsigned int mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI__CI__VI = 0x3251; +constexpr unsigned int mmCP_HQD_PQ_RPTR_REPORT_ADDR__CI__VI = 0x3250; +constexpr unsigned int mmCP_HQD_PQ_RPTR__CI__VI = 0x324F; +constexpr unsigned int mmCP_HQD_PQ_WPTR_POLL_ADDR_HI__CI__VI = 0x3253; +constexpr unsigned int mmCP_HQD_PQ_WPTR_POLL_ADDR__CI__VI = 0x3252; +constexpr unsigned int mmCP_HQD_PQ_WPTR__CI__VI = 0x3255; +constexpr unsigned int mmCP_HQD_QUANTUM__CI__VI = 0x324C; +constexpr unsigned int mmCP_HQD_QUEUE_PRIORITY__CI__VI = 0x324B; +constexpr unsigned int mmCP_HQD_SEMA_CMD__CI__VI = 0x325F; +constexpr unsigned int mmCP_HQD_VMID__CI__VI = 0x3248; +constexpr unsigned int mmCP_IB1_BASE_HI__CI__VI = 0xC0CD; +constexpr unsigned int mmCP_IB1_BASE_HI__SI = 0x21CD; +constexpr unsigned int mmCP_IB1_BASE_LO__CI__VI = 0xC0CC; +constexpr unsigned int mmCP_IB1_BASE_LO__SI = 0x21CC; +constexpr unsigned int mmCP_IB1_BUFSZ__CI__VI = 0xC0CE; +constexpr unsigned int mmCP_IB1_BUFSZ__SI = 0x21CE; +constexpr unsigned int mmCP_IB1_OFFSET__CI__VI = 0xC092; +constexpr unsigned int mmCP_IB1_OFFSET__SI = 0x2192; +constexpr unsigned int mmCP_IB1_PREAMBLE_BEGIN__CI__VI = 0xC094; +constexpr unsigned int mmCP_IB1_PREAMBLE_BEGIN__SI = 0x2194; +constexpr unsigned int mmCP_IB1_PREAMBLE_END__CI__VI = 0xC095; +constexpr unsigned int mmCP_IB1_PREAMBLE_END__SI = 0x2195; +constexpr unsigned int mmCP_IB2_BASE_HI__CI__VI = 0xC0D0; +constexpr unsigned int mmCP_IB2_BASE_HI__SI = 0x21D0; +constexpr unsigned int mmCP_IB2_BASE_LO__CI__VI = 0xC0CF; +constexpr unsigned int mmCP_IB2_BASE_LO__SI = 0x21CF; +constexpr unsigned int mmCP_IB2_BUFSZ__CI__VI = 0xC0D1; +constexpr unsigned int mmCP_IB2_BUFSZ__SI = 0x21D1; +constexpr unsigned int mmCP_IB2_OFFSET__CI__VI = 0xC093; +constexpr unsigned int mmCP_IB2_OFFSET__SI = 0x2193; +constexpr unsigned int mmCP_IB2_PREAMBLE_BEGIN__CI__VI = 0xC096; +constexpr unsigned int mmCP_IB2_PREAMBLE_BEGIN__SI = 0x2196; +constexpr unsigned int mmCP_IB2_PREAMBLE_END__CI__VI = 0xC097; +constexpr unsigned int mmCP_IB2_PREAMBLE_END__SI = 0x2197; +constexpr unsigned int mmCP_INT_CNTL = 0x3049; +constexpr unsigned int mmCP_INT_CNTL_RING0 = 0x306A; +constexpr unsigned int mmCP_INT_CNTL_RING1 = 0x306B; +constexpr unsigned int mmCP_INT_CNTL_RING2 = 0x306C; +constexpr unsigned int mmCP_INT_STATUS = 0x304A; +constexpr unsigned int mmCP_INT_STATUS_RING0 = 0x306D; +constexpr unsigned int mmCP_INT_STATUS_RING1 = 0x306E; +constexpr unsigned int mmCP_INT_STATUS_RING2 = 0x306F; +constexpr unsigned int mmCP_INT_STAT_DEBUG = 0x21F7; +constexpr unsigned int mmCP_IQ_WAIT_TIME1__CI__VI = 0x30AF; +constexpr unsigned int mmCP_IQ_WAIT_TIME2__CI__VI = 0x30B0; +constexpr unsigned int mmCP_MAX_CONTEXT__CI__VI = 0x30AE; +constexpr unsigned int mmCP_MC_PACK_DELAY_CNT__SI__CI = 0x21A7; +constexpr unsigned int mmCP_MC_TAG_CNTL__CI = 0x21A8; +constexpr unsigned int mmCP_MC_TAG_DATA__CI = 0x21A9; +constexpr unsigned int mmCP_ME0_PIPE0_PRIORITY__CI__VI = 0x304D; +constexpr unsigned int mmCP_ME0_PIPE0_VMID__CI__VI = 0x3052; +constexpr unsigned int mmCP_ME0_PIPE1_PRIORITY__CI__VI = 0x304E; +constexpr unsigned int mmCP_ME0_PIPE1_VMID__CI__VI = 0x3053; +constexpr unsigned int mmCP_ME0_PIPE2_PRIORITY__CI__VI = 0x304F; +constexpr unsigned int mmCP_ME0_PIPE_PRIORITY_CNTS__CI__VI = 0x304C; +constexpr unsigned int mmCP_ME1_INT_STAT_DEBUG__CI__VI = 0x3095; +constexpr unsigned int mmCP_ME1_PIPE0_INT_CNTL__CI__VI = 0x3085; +constexpr unsigned int mmCP_ME1_PIPE0_INT_STATUS__CI__VI = 0x308D; +constexpr unsigned int mmCP_ME1_PIPE0_PRIORITY__CI__VI = 0x309A; +constexpr unsigned int mmCP_ME1_PIPE1_INT_CNTL__CI__VI = 0x3086; +constexpr unsigned int mmCP_ME1_PIPE1_INT_STATUS__CI__VI = 0x308E; +constexpr unsigned int mmCP_ME1_PIPE1_PRIORITY__CI__VI = 0x309B; +constexpr unsigned int mmCP_ME1_PIPE2_INT_CNTL__CI__VI = 0x3087; +constexpr unsigned int mmCP_ME1_PIPE2_INT_STATUS__CI__VI = 0x308F; +constexpr unsigned int mmCP_ME1_PIPE2_PRIORITY__CI__VI = 0x309C; +constexpr unsigned int mmCP_ME1_PIPE3_INT_CNTL__CI__VI = 0x3088; +constexpr unsigned int mmCP_ME1_PIPE3_INT_STATUS__CI__VI = 0x3090; +constexpr unsigned int mmCP_ME1_PIPE3_PRIORITY__CI__VI = 0x309D; +constexpr unsigned int mmCP_ME1_PIPE_PRIORITY_CNTS__CI__VI = 0x3099; +constexpr unsigned int mmCP_ME2_INT_STAT_DEBUG__CI__VI = 0x3096; +constexpr unsigned int mmCP_ME2_PIPE0_INT_CNTL__CI__VI = 0x3089; +constexpr unsigned int mmCP_ME2_PIPE0_INT_STATUS__CI__VI = 0x3091; +constexpr unsigned int mmCP_ME2_PIPE0_PRIORITY__CI__VI = 0x309F; +constexpr unsigned int mmCP_ME2_PIPE1_INT_CNTL__CI__VI = 0x308A; +constexpr unsigned int mmCP_ME2_PIPE1_INT_STATUS__CI__VI = 0x3092; +constexpr unsigned int mmCP_ME2_PIPE1_PRIORITY__CI__VI = 0x30A0; +constexpr unsigned int mmCP_ME2_PIPE2_INT_CNTL__CI__VI = 0x308B; +constexpr unsigned int mmCP_ME2_PIPE2_INT_STATUS__CI__VI = 0x3093; +constexpr unsigned int mmCP_ME2_PIPE2_PRIORITY__CI__VI = 0x30A1; +constexpr unsigned int mmCP_ME2_PIPE3_INT_CNTL__CI__VI = 0x308C; +constexpr unsigned int mmCP_ME2_PIPE3_INT_STATUS__CI__VI = 0x3094; +constexpr unsigned int mmCP_ME2_PIPE3_PRIORITY__CI__VI = 0x30A2; +constexpr unsigned int mmCP_ME2_PIPE_PRIORITY_CNTS__CI__VI = 0x309E; +constexpr unsigned int mmCP_MEC1_INTR_ROUTINE_START__CI__VI = 0x30AB; +constexpr unsigned int mmCP_MEC1_PRGRM_CNTR_START__CI__VI = 0x30A6; +constexpr unsigned int mmCP_MEC2_INTR_ROUTINE_START__CI__VI = 0x30AC; +constexpr unsigned int mmCP_MEC2_PRGRM_CNTR_START__CI__VI = 0x30A7; +constexpr unsigned int mmCP_MEC_CNTL__CI__VI = 0x208D; +constexpr unsigned int mmCP_MEC_ME1_HEADER_DUMP__CI__VI = 0x208E; +constexpr unsigned int mmCP_MEC_ME1_UCODE_ADDR__CI = 0x305C; +constexpr unsigned int mmCP_MEC_ME1_UCODE_DATA__CI = 0x305D; +constexpr unsigned int mmCP_MEC_ME2_HEADER_DUMP__CI__VI = 0x208F; +constexpr unsigned int mmCP_MEC_ME2_UCODE_ADDR__CI = 0x305E; +constexpr unsigned int mmCP_MEC_ME2_UCODE_DATA__CI = 0x305F; +constexpr unsigned int mmCP_MEM_SLP_CNTL = 0x3079; +constexpr unsigned int mmCP_MEQ_AVAIL = 0x21DD; +constexpr unsigned int mmCP_MEQ_STAT = 0x21E5; +constexpr unsigned int mmCP_MEQ_STQ_THRESHOLD__CI__VI = 0x21BD; +constexpr unsigned int mmCP_MEQ_THRESHOLDS = 0x21D9; +constexpr unsigned int mmCP_ME_ATOMIC_PREOP_HI__CI__VI = 0xC05E; +constexpr unsigned int mmCP_ME_ATOMIC_PREOP_LO__CI__VI = 0xC05D; +constexpr unsigned int mmCP_ME_CNTL = 0x21B6; +constexpr unsigned int mmCP_ME_GDS_ATOMIC0_PREOP_HI__CI__VI = 0xC060; +constexpr unsigned int mmCP_ME_GDS_ATOMIC0_PREOP_LO__CI__VI = 0xC05F; +constexpr unsigned int mmCP_ME_GDS_ATOMIC1_PREOP_HI__CI__VI = 0xC062; +constexpr unsigned int mmCP_ME_GDS_ATOMIC1_PREOP_LO__CI__VI = 0xC061; +constexpr unsigned int mmCP_ME_HEADER_DUMP = 0x21A1; +constexpr unsigned int mmCP_ME_INTR_ROUTINE_START__CI__VI = 0x30AA; +constexpr unsigned int mmCP_ME_MC_RADDR_HI__CI__VI = 0xC06E; +constexpr unsigned int mmCP_ME_MC_RADDR_HI__SI = 0x216E; +constexpr unsigned int mmCP_ME_MC_RADDR_LO__CI__VI = 0xC06D; +constexpr unsigned int mmCP_ME_MC_RADDR_LO__SI = 0x216D; +constexpr unsigned int mmCP_ME_MC_WADDR_HI__CI__VI = 0xC06A; +constexpr unsigned int mmCP_ME_MC_WADDR_HI__SI = 0x216A; +constexpr unsigned int mmCP_ME_MC_WADDR_LO__CI__VI = 0xC069; +constexpr unsigned int mmCP_ME_MC_WADDR_LO__SI = 0x2169; +constexpr unsigned int mmCP_ME_MC_WDATA_HI__CI__VI = 0xC06C; +constexpr unsigned int mmCP_ME_MC_WDATA_HI__SI = 0x216C; +constexpr unsigned int mmCP_ME_MC_WDATA_LO__CI__VI = 0xC06B; +constexpr unsigned int mmCP_ME_MC_WDATA_LO__SI = 0x216B; +constexpr unsigned int mmCP_ME_PREEMPTION = 0x21B9; +constexpr unsigned int mmCP_ME_PRGRM_CNTR_START__CI__VI = 0x30A5; +constexpr unsigned int mmCP_MQD_BASE_ADDR_HI__CI__VI = 0x3246; +constexpr unsigned int mmCP_MQD_BASE_ADDR__CI__VI = 0x3245; +constexpr unsigned int mmCP_MQD_CONTROL__CI__VI = 0x3267; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT0_HI__CI__VI = 0xC00B; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT0_HI__SI = 0x210B; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT0_LO__CI__VI = 0xC00A; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT0_LO__SI = 0x210A; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT1_HI__CI__VI = 0xC00F; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT1_HI__SI = 0x210F; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT1_LO__CI__VI = 0xC00E; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT1_LO__SI = 0x210E; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT2_HI__CI__VI = 0xC013; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT2_HI__SI = 0x2113; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT2_LO__CI__VI = 0xC012; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT2_LO__SI = 0x2112; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT3_HI__CI__VI = 0xC017; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT3_HI__SI = 0x2117; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT3_LO__CI__VI = 0xC016; +constexpr unsigned int mmCP_NUM_PRIM_NEEDED_COUNT3_LO__SI = 0x2116; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT0_HI__CI__VI = 0xC009; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT0_HI__SI = 0x2109; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT0_LO__CI__VI = 0xC008; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT0_LO__SI = 0x2108; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT1_HI__CI__VI = 0xC00D; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT1_HI__SI = 0x210D; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT1_LO__CI__VI = 0xC00C; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT1_LO__SI = 0x210C; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT2_HI__CI__VI = 0xC011; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT2_HI__SI = 0x2111; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT2_LO__CI__VI = 0xC010; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT2_LO__SI = 0x2110; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT3_HI__CI__VI = 0xC015; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT3_HI__SI = 0x2115; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT3_LO__CI__VI = 0xC014; +constexpr unsigned int mmCP_NUM_PRIM_WRITTEN_COUNT3_LO__SI = 0x2114; +constexpr unsigned int mmCP_PA_CINVOC_COUNT_HI__CI__VI = 0xC029; +constexpr unsigned int mmCP_PA_CINVOC_COUNT_HI__SI = 0x2129; +constexpr unsigned int mmCP_PA_CINVOC_COUNT_LO__CI__VI = 0xC028; +constexpr unsigned int mmCP_PA_CINVOC_COUNT_LO__SI = 0x2128; +constexpr unsigned int mmCP_PA_CPRIM_COUNT_HI__CI__VI = 0xC02B; +constexpr unsigned int mmCP_PA_CPRIM_COUNT_HI__SI = 0x212B; +constexpr unsigned int mmCP_PA_CPRIM_COUNT_LO__CI__VI = 0xC02A; +constexpr unsigned int mmCP_PA_CPRIM_COUNT_LO__SI = 0x212A; +constexpr unsigned int mmCP_PERFCOUNTER_HI__SI = 0x21FE; +constexpr unsigned int mmCP_PERFCOUNTER_LO__SI = 0x21FD; +constexpr unsigned int mmCP_PERFCOUNTER_SELECT__SI = 0x21FC; +constexpr unsigned int mmCP_PERFMON_CNTL__CI__VI = 0xD808; +constexpr unsigned int mmCP_PERFMON_CNTL__SI = 0x21FF; +constexpr unsigned int mmCP_PERFMON_CNTX_CNTL = 0xA0D8; +constexpr unsigned int mmCP_PFP_ATOMIC_PREOP_HI__CI__VI = 0xC053; +constexpr unsigned int mmCP_PFP_ATOMIC_PREOP_LO__CI__VI = 0xC052; +constexpr unsigned int mmCP_PFP_GDS_ATOMIC0_PREOP_HI__CI__VI = 0xC055; +constexpr unsigned int mmCP_PFP_GDS_ATOMIC0_PREOP_LO__CI__VI = 0xC054; +constexpr unsigned int mmCP_PFP_GDS_ATOMIC1_PREOP_HI__CI__VI = 0xC057; +constexpr unsigned int mmCP_PFP_GDS_ATOMIC1_PREOP_LO__CI__VI = 0xC056; +constexpr unsigned int mmCP_PFP_HEADER_DUMP = 0x21A2; +constexpr unsigned int mmCP_PFP_IB_CONTROL__CI__VI = 0xC08D; +constexpr unsigned int mmCP_PFP_IB_CONTROL__SI = 0x218D; +constexpr unsigned int mmCP_PFP_INTR_ROUTINE_START__CI__VI = 0x30A9; +constexpr unsigned int mmCP_PFP_LOAD_CONTROL__CI__VI = 0xC08E; +constexpr unsigned int mmCP_PFP_LOAD_CONTROL__SI = 0x218E; +constexpr unsigned int mmCP_PFP_PRGRM_CNTR_START__CI__VI = 0x30A4; +constexpr unsigned int mmCP_PIPEID__CI__VI = 0xA0D9; +constexpr unsigned int mmCP_PIPE_STATS_ADDR_HI__CI__VI = 0xC019; +constexpr unsigned int mmCP_PIPE_STATS_ADDR_HI__SI = 0x2119; +constexpr unsigned int mmCP_PIPE_STATS_ADDR_LO__CI__VI = 0xC018; +constexpr unsigned int mmCP_PIPE_STATS_ADDR_LO__SI = 0x2118; +constexpr unsigned int mmCP_PQ_WPTR_POLL_CNTL1__CI__VI = 0x3084; +constexpr unsigned int mmCP_PQ_WPTR_POLL_CNTL__CI__VI = 0x3083; +constexpr unsigned int mmCP_PRT_LOD_STATS_CNTL0__CI__VI = 0x20AD; +constexpr unsigned int mmCP_PRT_LOD_STATS_CNTL1__CI__VI = 0x20AE; +constexpr unsigned int mmCP_PRT_LOD_STATS_CNTL2__CI__VI = 0x20AF; +constexpr unsigned int mmCP_PWR_CNTL = 0x3078; +constexpr unsigned int mmCP_QUEUE_THRESHOLDS = 0x21D8; +constexpr unsigned int mmCP_RB0_BASE = 0x3040; +constexpr unsigned int mmCP_RB0_BASE_HI__CI__VI = 0x30B1; +constexpr unsigned int mmCP_RB0_CNTL = 0x3041; +constexpr unsigned int mmCP_RB0_RPTR = 0x21C0; +constexpr unsigned int mmCP_RB0_RPTR_ADDR = 0x3043; +constexpr unsigned int mmCP_RB0_RPTR_ADDR_HI = 0x3044; +constexpr unsigned int mmCP_RB0_WPTR = 0x3045; +constexpr unsigned int mmCP_RB1_BASE = 0x3060; +constexpr unsigned int mmCP_RB1_BASE_HI__CI__VI = 0x30B2; +constexpr unsigned int mmCP_RB1_CNTL = 0x3061; +constexpr unsigned int mmCP_RB1_RPTR = 0x21BF; +constexpr unsigned int mmCP_RB1_RPTR_ADDR = 0x3062; +constexpr unsigned int mmCP_RB1_RPTR_ADDR_HI = 0x3063; +constexpr unsigned int mmCP_RB1_WPTR = 0x3064; +constexpr unsigned int mmCP_RB2_BASE = 0x3065; +constexpr unsigned int mmCP_RB2_CNTL = 0x3066; +constexpr unsigned int mmCP_RB2_RPTR = 0x21BE; +constexpr unsigned int mmCP_RB2_RPTR_ADDR = 0x3067; +constexpr unsigned int mmCP_RB2_RPTR_ADDR_HI = 0x3068; +constexpr unsigned int mmCP_RB2_WPTR = 0x3069; +constexpr unsigned int mmCP_RB_BASE = 0x3040; +constexpr unsigned int mmCP_RB_CNTL = 0x3041; +constexpr unsigned int mmCP_RB_OFFSET__CI__VI = 0xC091; +constexpr unsigned int mmCP_RB_OFFSET__SI = 0x2191; +constexpr unsigned int mmCP_RB_RPTR = 0x21C0; +constexpr unsigned int mmCP_RB_RPTR_ADDR = 0x3043; +constexpr unsigned int mmCP_RB_RPTR_ADDR_HI = 0x3044; +constexpr unsigned int mmCP_RB_RPTR_WR = 0x3042; +constexpr unsigned int mmCP_RB_VMID = 0x3051; +constexpr unsigned int mmCP_RB_WPTR = 0x3045; +constexpr unsigned int mmCP_RB_WPTR_DELAY = 0x21C1; +constexpr unsigned int mmCP_RB_WPTR_POLL_ADDR_HI = 0x3047; +constexpr unsigned int mmCP_RB_WPTR_POLL_ADDR_LO = 0x3046; +constexpr unsigned int mmCP_RB_WPTR_POLL_CNTL = 0x21C2; +constexpr unsigned int mmCP_RING0_PRIORITY = 0x304D; +constexpr unsigned int mmCP_RING1_PRIORITY = 0x304E; +constexpr unsigned int mmCP_RING2_PRIORITY = 0x304F; +constexpr unsigned int mmCP_RINGID = 0xA0D9; +constexpr unsigned int mmCP_RING_PRIORITY_CNTS = 0x304C; +constexpr unsigned int mmCP_ROQ1_THRESHOLDS = 0x21D5; +constexpr unsigned int mmCP_ROQ2_AVAIL = 0x21DC; +constexpr unsigned int mmCP_ROQ2_THRESHOLDS = 0x21D6; +constexpr unsigned int mmCP_ROQ_AVAIL = 0x21DA; +constexpr unsigned int mmCP_ROQ_IB1_STAT = 0x21E1; +constexpr unsigned int mmCP_ROQ_IB2_STAT = 0x21E2; +constexpr unsigned int mmCP_ROQ_RB_STAT = 0x21E0; +constexpr unsigned int mmCP_ROQ_THRESHOLDS__CI__VI = 0x21BC; +constexpr unsigned int mmCP_SCRATCH_DATA__CI__VI = 0xC090; +constexpr unsigned int mmCP_SCRATCH_DATA__SI = 0x2190; +constexpr unsigned int mmCP_SCRATCH_INDEX__CI__VI = 0xC08F; +constexpr unsigned int mmCP_SCRATCH_INDEX__SI = 0x218F; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT0_HI__CI__VI = 0xC02D; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT0_HI__SI = 0x212D; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT0_LO__CI__VI = 0xC02C; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT0_LO__SI = 0x212C; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT1_HI__CI__VI = 0xC02F; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT1_HI__SI = 0x212F; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT1_LO__CI__VI = 0xC02E; +constexpr unsigned int mmCP_SC_PSINVOC_COUNT1_LO__SI = 0x212E; +constexpr unsigned int mmCP_SEM_WAIT_TIMER__CI__VI = 0xC06F; +constexpr unsigned int mmCP_SEM_WAIT_TIMER__SI = 0x216F; +constexpr unsigned int mmCP_SIG_SEM_ADDR_HI__CI__VI = 0xC071; +constexpr unsigned int mmCP_SIG_SEM_ADDR_HI__SI = 0x2171; +constexpr unsigned int mmCP_SIG_SEM_ADDR_LO__CI__VI = 0xC070; +constexpr unsigned int mmCP_SIG_SEM_ADDR_LO__SI = 0x2170; +constexpr unsigned int mmCP_STALLED_STAT1 = 0x219D; +constexpr unsigned int mmCP_STALLED_STAT2 = 0x219E; +constexpr unsigned int mmCP_STALLED_STAT3 = 0x219C; +constexpr unsigned int mmCP_STAT = 0x21A0; +constexpr unsigned int mmCP_STQ_AVAIL = 0x21DB; +constexpr unsigned int mmCP_STQ_STAT = 0x21E3; +constexpr unsigned int mmCP_STQ_THRESHOLDS = 0x21D7; +constexpr unsigned int mmCP_STQ_WR_STAT__CI__VI = 0x21E4; +constexpr unsigned int mmCP_STREAM_OUT_ADDR_HI__CI__VI = 0xC007; +constexpr unsigned int mmCP_STREAM_OUT_ADDR_HI__SI = 0x2107; +constexpr unsigned int mmCP_STREAM_OUT_ADDR_LO__CI__VI = 0xC006; +constexpr unsigned int mmCP_STREAM_OUT_ADDR_LO__SI = 0x2106; +constexpr unsigned int mmCP_STRMOUT_CNTL__CI__VI = 0xC03F; +constexpr unsigned int mmCP_STRMOUT_CNTL__SI = 0x213F; +constexpr unsigned int mmCP_ST_BASE_HI__CI__VI = 0xC0D3; +constexpr unsigned int mmCP_ST_BASE_HI__SI = 0x21D3; +constexpr unsigned int mmCP_ST_BASE_LO__CI__VI = 0xC0D2; +constexpr unsigned int mmCP_ST_BASE_LO__SI = 0x21D2; +constexpr unsigned int mmCP_ST_BUFSZ__CI__VI = 0xC0D4; +constexpr unsigned int mmCP_ST_BUFSZ__SI = 0x21D4; +constexpr unsigned int mmCP_VGT_CSINVOC_COUNT_HI__CI__VI = 0xC031; +constexpr unsigned int mmCP_VGT_CSINVOC_COUNT_HI__SI = 0x2131; +constexpr unsigned int mmCP_VGT_CSINVOC_COUNT_LO__CI__VI = 0xC030; +constexpr unsigned int mmCP_VGT_CSINVOC_COUNT_LO__SI = 0x2130; +constexpr unsigned int mmCP_VGT_DSINVOC_COUNT_HI__CI__VI = 0xC027; +constexpr unsigned int mmCP_VGT_DSINVOC_COUNT_HI__SI = 0x2127; +constexpr unsigned int mmCP_VGT_DSINVOC_COUNT_LO__CI__VI = 0xC026; +constexpr unsigned int mmCP_VGT_DSINVOC_COUNT_LO__SI = 0x2126; +constexpr unsigned int mmCP_VGT_GSINVOC_COUNT_HI__CI__VI = 0xC023; +constexpr unsigned int mmCP_VGT_GSINVOC_COUNT_HI__SI = 0x2123; +constexpr unsigned int mmCP_VGT_GSINVOC_COUNT_LO__CI__VI = 0xC022; +constexpr unsigned int mmCP_VGT_GSINVOC_COUNT_LO__SI = 0x2122; +constexpr unsigned int mmCP_VGT_GSPRIM_COUNT_HI__CI__VI = 0xC01F; +constexpr unsigned int mmCP_VGT_GSPRIM_COUNT_HI__SI = 0x211F; +constexpr unsigned int mmCP_VGT_GSPRIM_COUNT_LO__CI__VI = 0xC01E; +constexpr unsigned int mmCP_VGT_GSPRIM_COUNT_LO__SI = 0x211E; +constexpr unsigned int mmCP_VGT_HSINVOC_COUNT_HI__CI__VI = 0xC025; +constexpr unsigned int mmCP_VGT_HSINVOC_COUNT_HI__SI = 0x2125; +constexpr unsigned int mmCP_VGT_HSINVOC_COUNT_LO__CI__VI = 0xC024; +constexpr unsigned int mmCP_VGT_HSINVOC_COUNT_LO__SI = 0x2124; +constexpr unsigned int mmCP_VGT_IAPRIM_COUNT_HI__CI__VI = 0xC01D; +constexpr unsigned int mmCP_VGT_IAPRIM_COUNT_HI__SI = 0x211D; +constexpr unsigned int mmCP_VGT_IAPRIM_COUNT_LO__CI__VI = 0xC01C; +constexpr unsigned int mmCP_VGT_IAPRIM_COUNT_LO__SI = 0x211C; +constexpr unsigned int mmCP_VGT_IAVERT_COUNT_HI__CI__VI = 0xC01B; +constexpr unsigned int mmCP_VGT_IAVERT_COUNT_HI__SI = 0x211B; +constexpr unsigned int mmCP_VGT_IAVERT_COUNT_LO__CI__VI = 0xC01A; +constexpr unsigned int mmCP_VGT_IAVERT_COUNT_LO__SI = 0x211A; +constexpr unsigned int mmCP_VGT_VSINVOC_COUNT_HI__CI__VI = 0xC021; +constexpr unsigned int mmCP_VGT_VSINVOC_COUNT_HI__SI = 0x2121; +constexpr unsigned int mmCP_VGT_VSINVOC_COUNT_LO__CI__VI = 0xC020; +constexpr unsigned int mmCP_VGT_VSINVOC_COUNT_LO__SI = 0x2120; +constexpr unsigned int mmCP_VMID = 0xA0DA; +constexpr unsigned int mmCP_VMID_PREEMPT__CI__VI = 0x30B6; +constexpr unsigned int mmCP_VMID_RESET__CI__VI = 0x30B3; +constexpr unsigned int mmCP_WAIT_REG_MEM_TIMEOUT__CI__VI = 0xC074; +constexpr unsigned int mmCP_WAIT_REG_MEM_TIMEOUT__SI = 0x2174; +constexpr unsigned int mmCP_WAIT_SEM_ADDR_HI__CI__VI = 0xC076; +constexpr unsigned int mmCP_WAIT_SEM_ADDR_HI__SI = 0x2176; +constexpr unsigned int mmCP_WAIT_SEM_ADDR_LO__CI__VI = 0xC075; +constexpr unsigned int mmCP_WAIT_SEM_ADDR_LO__SI = 0x2175; +constexpr unsigned int mmCRTC0_CRTC_ALLOW_STOP_OFF_V_CNT__SI__VI = 0x1BC3; +constexpr unsigned int mmCRTC0_CRTC_BLACK_COLOR__SI = 0x1BA2; +constexpr unsigned int mmCRTC0_CRTC_BLANK_CONTROL = 0x1B9D; +constexpr unsigned int mmCRTC0_CRTC_BLANK_DATA_COLOR__SI = 0x1BA1; +constexpr unsigned int mmCRTC0_CRTC_CONTROL__SI__VI = 0x1B9C; +constexpr unsigned int mmCRTC0_CRTC_COUNT_CONTROL__SI__VI = 0x1BA9; +constexpr unsigned int mmCRTC0_CRTC_COUNT_RESET__SI__VI = 0x1BAA; +constexpr unsigned int mmCRTC0_CRTC_DOUBLE_BUFFER_CONTROL__SI__VI = 0x1BB6; +constexpr unsigned int mmCRTC0_CRTC_DTMTEST_CNTL__SI__VI = 0x1B92; +constexpr unsigned int mmCRTC0_CRTC_DTMTEST_STATUS_POSITION__SI__VI = 0x1B93; +constexpr unsigned int mmCRTC0_CRTC_FLOW_CONTROL__SI__VI = 0x1B99; +constexpr unsigned int mmCRTC0_CRTC_FORCE_COUNT_NOW_CNTL__SI__VI = 0x1B98; +constexpr unsigned int mmCRTC0_CRTC_H_BLANK_START_END__SI__VI = 0x1B81; +constexpr unsigned int mmCRTC0_CRTC_H_SYNC_A_CNTL__SI__VI = 0x1B83; +constexpr unsigned int mmCRTC0_CRTC_H_SYNC_A__SI__VI = 0x1B82; +constexpr unsigned int mmCRTC0_CRTC_H_SYNC_B_CNTL__SI__VI = 0x1B85; +constexpr unsigned int mmCRTC0_CRTC_H_SYNC_B__SI__VI = 0x1B84; +constexpr unsigned int mmCRTC0_CRTC_H_TOTAL__SI__VI = 0x1B80; +constexpr unsigned int mmCRTC0_CRTC_INTERLACE_CONTROL__SI__VI = 0x1B9E; +constexpr unsigned int mmCRTC0_CRTC_INTERLACE_STATUS__SI__VI = 0x1B9F; +constexpr unsigned int mmCRTC0_CRTC_INTERRUPT_CONTROL__SI__VI = 0x1BB4; +constexpr unsigned int mmCRTC0_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI__VI = 0x1BAB; +constexpr unsigned int mmCRTC0_CRTC_MASTER_EN__SI__VI = 0x1BC2; +constexpr unsigned int mmCRTC0_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI__VI = 0x1BC0; +constexpr unsigned int mmCRTC0_CRTC_MVP_INBAND_CNTL_INSERT__SI__VI = 0x1BBF; +constexpr unsigned int mmCRTC0_CRTC_MVP_STATUS__SI__VI = 0x1BC1; +constexpr unsigned int mmCRTC0_CRTC_NOM_VERT_POSITION__SI__VI = 0x1BA5; +constexpr unsigned int mmCRTC0_CRTC_OVERSCAN_COLOR__SI = 0x1BA0; +constexpr unsigned int mmCRTC0_CRTC_PIXEL_DATA_READBACK__SI = 0x1B9A; +constexpr unsigned int mmCRTC0_CRTC_SNAPSHOT_CONTROL__SI__VI = 0x1BB0; +constexpr unsigned int mmCRTC0_CRTC_SNAPSHOT_FRAME__SI__VI = 0x1BB2; +constexpr unsigned int mmCRTC0_CRTC_SNAPSHOT_POSITION__SI__VI = 0x1BB1; +constexpr unsigned int mmCRTC0_CRTC_SNAPSHOT_STATUS__SI__VI = 0x1BAF; +constexpr unsigned int mmCRTC0_CRTC_START_LINE_CONTROL__SI__VI = 0x1BB3; +constexpr unsigned int mmCRTC0_CRTC_STATUS = 0x1BA3; +constexpr unsigned int mmCRTC0_CRTC_STATUS_FRAME_COUNT__SI__VI = 0x1BA6; +constexpr unsigned int mmCRTC0_CRTC_STATUS_HV_COUNT__SI__VI = 0x1BA8; +constexpr unsigned int mmCRTC0_CRTC_STATUS_POSITION = 0x1BA4; +constexpr unsigned int mmCRTC0_CRTC_STATUS_VF_COUNT__SI__VI = 0x1BA7; +constexpr unsigned int mmCRTC0_CRTC_STEREO_CONTROL__SI__VI = 0x1BAE; +constexpr unsigned int mmCRTC0_CRTC_STEREO_FORCE_NEXT_EYE__SI = 0x1B9B; +constexpr unsigned int mmCRTC0_CRTC_STEREO_STATUS__SI__VI = 0x1BAD; +constexpr unsigned int mmCRTC0_CRTC_TEST_DEBUG_DATA__SI__VI = 0x1BC7; +constexpr unsigned int mmCRTC0_CRTC_TEST_DEBUG_INDEX__SI__VI = 0x1BC6; +constexpr unsigned int mmCRTC0_CRTC_TEST_PATTERN_COLOR__SI__VI = 0x1BBC; +constexpr unsigned int mmCRTC0_CRTC_TEST_PATTERN_CONTROL__SI__VI = 0x1BBA; +constexpr unsigned int mmCRTC0_CRTC_TEST_PATTERN_PARAMETERS__SI__VI = 0x1BBB; +constexpr unsigned int mmCRTC0_CRTC_TRIGA_CNTL__SI__VI = 0x1B94; +constexpr unsigned int mmCRTC0_CRTC_TRIGA_MANUAL_TRIG__SI__VI = 0x1B95; +constexpr unsigned int mmCRTC0_CRTC_TRIGB_CNTL__SI__VI = 0x1B96; +constexpr unsigned int mmCRTC0_CRTC_TRIGB_MANUAL_TRIG__SI__VI = 0x1B97; +constexpr unsigned int mmCRTC0_CRTC_UPDATE_LOCK__SI__VI = 0x1BB5; +constexpr unsigned int mmCRTC0_CRTC_VBI_END__SI__VI = 0x1B86; +constexpr unsigned int mmCRTC0_CRTC_VERT_SYNC_CONTROL__SI__VI = 0x1BAC; +constexpr unsigned int mmCRTC0_CRTC_VGA_PARAMETER_CAPTURE_MODE__SI__VI = 0x1BB7; +constexpr unsigned int mmCRTC0_CRTC_VSYNC_NOM_INT_STATUS__SI__VI = 0x1B8C; +constexpr unsigned int mmCRTC0_CRTC_V_BLANK_START_END__SI__VI = 0x1B8D; +constexpr unsigned int mmCRTC0_CRTC_V_SYNC_A_CNTL__SI__VI = 0x1B8F; +constexpr unsigned int mmCRTC0_CRTC_V_SYNC_A__SI__VI = 0x1B8E; +constexpr unsigned int mmCRTC0_CRTC_V_SYNC_B_CNTL__SI__VI = 0x1B91; +constexpr unsigned int mmCRTC0_CRTC_V_SYNC_B__SI__VI = 0x1B90; +constexpr unsigned int mmCRTC0_CRTC_V_TOTAL_CONTROL__SI__VI = 0x1B8A; +constexpr unsigned int mmCRTC0_CRTC_V_TOTAL_INT_STATUS__SI__VI = 0x1B8B; +constexpr unsigned int mmCRTC0_CRTC_V_TOTAL_MAX__SI__VI = 0x1B89; +constexpr unsigned int mmCRTC0_CRTC_V_TOTAL_MIN__SI__VI = 0x1B88; +constexpr unsigned int mmCRTC0_CRTC_V_TOTAL__SI__VI = 0x1B87; +constexpr unsigned int mmCRTC0_CRTC_V_UPDATE_INT_STATUS__SI__VI = 0x1BC4; +constexpr unsigned int mmCRTC0_MASTER_UPDATE_LOCK__SI__VI = 0x1BBD; +constexpr unsigned int mmCRTC0_MASTER_UPDATE_MODE = 0x1BBE; +constexpr unsigned int mmCRTC0_PIXEL_RATE_CNTL__SI = 0x0120; +constexpr unsigned int mmCRTC1_CRTC_ALLOW_STOP_OFF_V_CNT__SI = 0x1EC3; +constexpr unsigned int mmCRTC1_CRTC_BLACK_COLOR__SI = 0x1EA2; +constexpr unsigned int mmCRTC1_CRTC_BLANK_DATA_COLOR__SI = 0x1EA1; +constexpr unsigned int mmCRTC1_CRTC_CONTROL__SI = 0x1E9C; +constexpr unsigned int mmCRTC1_CRTC_COUNT_CONTROL__SI = 0x1EA9; +constexpr unsigned int mmCRTC1_CRTC_COUNT_RESET__SI = 0x1EAA; +constexpr unsigned int mmCRTC1_CRTC_DOUBLE_BUFFER_CONTROL__SI = 0x1EB6; +constexpr unsigned int mmCRTC1_CRTC_DTMTEST_CNTL__SI = 0x1E92; +constexpr unsigned int mmCRTC1_CRTC_DTMTEST_STATUS_POSITION__SI = 0x1E93; +constexpr unsigned int mmCRTC1_CRTC_FLOW_CONTROL__SI = 0x1E99; +constexpr unsigned int mmCRTC1_CRTC_FORCE_COUNT_NOW_CNTL__SI = 0x1E98; +constexpr unsigned int mmCRTC1_CRTC_H_BLANK_START_END__SI = 0x1E81; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_A_CNTL__SI = 0x1E83; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_A__SI = 0x1E82; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_B_CNTL__SI = 0x1E85; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_B__SI = 0x1E84; +constexpr unsigned int mmCRTC1_CRTC_H_TOTAL__SI = 0x1E80; +constexpr unsigned int mmCRTC1_CRTC_INTERLACE_CONTROL__SI = 0x1E9E; +constexpr unsigned int mmCRTC1_CRTC_INTERLACE_STATUS__SI = 0x1E9F; +constexpr unsigned int mmCRTC1_CRTC_INTERRUPT_CONTROL__SI = 0x1EB4; +constexpr unsigned int mmCRTC1_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI = 0x1EAB; +constexpr unsigned int mmCRTC1_CRTC_MASTER_EN__SI = 0x1EC2; +constexpr unsigned int mmCRTC1_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI = 0x1EC0; +constexpr unsigned int mmCRTC1_CRTC_MVP_INBAND_CNTL_INSERT__SI = 0x1EBF; +constexpr unsigned int mmCRTC1_CRTC_MVP_STATUS__SI = 0x1EC1; +constexpr unsigned int mmCRTC1_CRTC_NOM_VERT_POSITION__SI = 0x1EA5; +constexpr unsigned int mmCRTC1_CRTC_OVERSCAN_COLOR__SI = 0x1EA0; +constexpr unsigned int mmCRTC1_CRTC_PIXEL_DATA_READBACK__SI = 0x1E9A; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_CONTROL__SI = 0x1EB0; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_FRAME__SI = 0x1EB2; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_POSITION__SI = 0x1EB1; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_STATUS__SI = 0x1EAF; +constexpr unsigned int mmCRTC1_CRTC_START_LINE_CONTROL__SI = 0x1EB3; +constexpr unsigned int mmCRTC1_CRTC_STATUS_FRAME_COUNT__SI = 0x1EA6; +constexpr unsigned int mmCRTC1_CRTC_STATUS_HV_COUNT__SI = 0x1EA8; +constexpr unsigned int mmCRTC1_CRTC_STATUS_VF_COUNT__SI = 0x1EA7; +constexpr unsigned int mmCRTC1_CRTC_STEREO_CONTROL__SI = 0x1EAE; +constexpr unsigned int mmCRTC1_CRTC_STEREO_FORCE_NEXT_EYE__SI = 0x1E9B; +constexpr unsigned int mmCRTC1_CRTC_STEREO_STATUS__SI = 0x1EAD; +constexpr unsigned int mmCRTC1_CRTC_TEST_DEBUG_DATA__SI = 0x1EC7; +constexpr unsigned int mmCRTC1_CRTC_TEST_DEBUG_INDEX__SI = 0x1EC6; +constexpr unsigned int mmCRTC1_CRTC_TEST_PATTERN_COLOR__SI = 0x1EBC; +constexpr unsigned int mmCRTC1_CRTC_TEST_PATTERN_CONTROL__SI = 0x1EBA; +constexpr unsigned int mmCRTC1_CRTC_TEST_PATTERN_PARAMETERS__SI = 0x1EBB; +constexpr unsigned int mmCRTC1_CRTC_TRIGA_CNTL__SI = 0x1E94; +constexpr unsigned int mmCRTC1_CRTC_TRIGA_MANUAL_TRIG__SI = 0x1E95; +constexpr unsigned int mmCRTC1_CRTC_TRIGB_CNTL__SI = 0x1E96; +constexpr unsigned int mmCRTC1_CRTC_TRIGB_MANUAL_TRIG__SI = 0x1E97; +constexpr unsigned int mmCRTC1_CRTC_UPDATE_LOCK__SI = 0x1EB5; +constexpr unsigned int mmCRTC1_CRTC_VBI_END__SI = 0x1E86; +constexpr unsigned int mmCRTC1_CRTC_VERT_SYNC_CONTROL__SI = 0x1EAC; +constexpr unsigned int mmCRTC1_CRTC_VGA_PARAMETER_CAPTURE_MODE__SI = 0x1EB7; +constexpr unsigned int mmCRTC1_CRTC_VSYNC_NOM_INT_STATUS__SI = 0x1E8C; +constexpr unsigned int mmCRTC1_CRTC_V_BLANK_START_END__SI = 0x1E8D; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_A_CNTL__SI = 0x1E8F; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_A__SI = 0x1E8E; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_B_CNTL__SI = 0x1E91; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_B__SI = 0x1E90; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_CONTROL__SI = 0x1E8A; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_INT_STATUS__SI = 0x1E8B; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_MAX__SI = 0x1E89; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_MIN__SI = 0x1E88; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL__SI = 0x1E87; +constexpr unsigned int mmCRTC1_CRTC_V_UPDATE_INT_STATUS__SI = 0x1EC4; +constexpr unsigned int mmCRTC1_MASTER_UPDATE_LOCK__SI = 0x1EBD; +constexpr unsigned int mmCRTC1_PIXEL_RATE_CNTL__SI = 0x0121; +constexpr unsigned int mmCRTC2_CRTC_ALLOW_STOP_OFF_V_CNT__SI = 0x41C3; +constexpr unsigned int mmCRTC2_CRTC_BLACK_COLOR__SI = 0x41A2; +constexpr unsigned int mmCRTC2_CRTC_BLANK_DATA_COLOR__SI = 0x41A1; +constexpr unsigned int mmCRTC2_CRTC_CONTROL__SI = 0x419C; +constexpr unsigned int mmCRTC2_CRTC_COUNT_CONTROL__SI = 0x41A9; +constexpr unsigned int mmCRTC2_CRTC_COUNT_RESET__SI = 0x41AA; +constexpr unsigned int mmCRTC2_CRTC_DOUBLE_BUFFER_CONTROL__SI = 0x41B6; +constexpr unsigned int mmCRTC2_CRTC_DTMTEST_CNTL__SI = 0x4192; +constexpr unsigned int mmCRTC2_CRTC_DTMTEST_STATUS_POSITION__SI = 0x4193; +constexpr unsigned int mmCRTC2_CRTC_FLOW_CONTROL__SI = 0x4199; +constexpr unsigned int mmCRTC2_CRTC_FORCE_COUNT_NOW_CNTL__SI = 0x4198; +constexpr unsigned int mmCRTC2_CRTC_H_BLANK_START_END__SI = 0x4181; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_A_CNTL__SI = 0x4183; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_A__SI = 0x4182; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_B_CNTL__SI = 0x4185; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_B__SI = 0x4184; +constexpr unsigned int mmCRTC2_CRTC_H_TOTAL__SI = 0x4180; +constexpr unsigned int mmCRTC2_CRTC_INTERLACE_CONTROL__SI = 0x419E; +constexpr unsigned int mmCRTC2_CRTC_INTERLACE_STATUS__SI = 0x419F; +constexpr unsigned int mmCRTC2_CRTC_INTERRUPT_CONTROL__SI = 0x41B4; +constexpr unsigned int mmCRTC2_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI = 0x41AB; +constexpr unsigned int mmCRTC2_CRTC_MASTER_EN__SI = 0x41C2; +constexpr unsigned int mmCRTC2_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI = 0x41C0; +constexpr unsigned int mmCRTC2_CRTC_MVP_INBAND_CNTL_INSERT__SI = 0x41BF; +constexpr unsigned int mmCRTC2_CRTC_MVP_STATUS__SI = 0x41C1; +constexpr unsigned int mmCRTC2_CRTC_NOM_VERT_POSITION__SI = 0x41A5; +constexpr unsigned int mmCRTC2_CRTC_OVERSCAN_COLOR__SI = 0x41A0; +constexpr unsigned int mmCRTC2_CRTC_PIXEL_DATA_READBACK__SI = 0x419A; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_CONTROL__SI = 0x41B0; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_FRAME__SI = 0x41B2; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_POSITION__SI = 0x41B1; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_STATUS__SI = 0x41AF; +constexpr unsigned int mmCRTC2_CRTC_START_LINE_CONTROL__SI = 0x41B3; +constexpr unsigned int mmCRTC2_CRTC_STATUS_FRAME_COUNT__SI = 0x41A6; +constexpr unsigned int mmCRTC2_CRTC_STATUS_HV_COUNT__SI = 0x41A8; +constexpr unsigned int mmCRTC2_CRTC_STATUS_VF_COUNT__SI = 0x41A7; +constexpr unsigned int mmCRTC2_CRTC_STEREO_CONTROL__SI = 0x41AE; +constexpr unsigned int mmCRTC2_CRTC_STEREO_FORCE_NEXT_EYE__SI = 0x419B; +constexpr unsigned int mmCRTC2_CRTC_STEREO_STATUS__SI = 0x41AD; +constexpr unsigned int mmCRTC2_CRTC_TEST_DEBUG_DATA__SI = 0x41C7; +constexpr unsigned int mmCRTC2_CRTC_TEST_DEBUG_INDEX__SI = 0x41C6; +constexpr unsigned int mmCRTC2_CRTC_TEST_PATTERN_COLOR__SI = 0x41BC; +constexpr unsigned int mmCRTC2_CRTC_TEST_PATTERN_CONTROL__SI = 0x41BA; +constexpr unsigned int mmCRTC2_CRTC_TEST_PATTERN_PARAMETERS__SI = 0x41BB; +constexpr unsigned int mmCRTC2_CRTC_TRIGA_CNTL__SI = 0x4194; +constexpr unsigned int mmCRTC2_CRTC_TRIGA_MANUAL_TRIG__SI = 0x4195; +constexpr unsigned int mmCRTC2_CRTC_TRIGB_CNTL__SI = 0x4196; +constexpr unsigned int mmCRTC2_CRTC_TRIGB_MANUAL_TRIG__SI = 0x4197; +constexpr unsigned int mmCRTC2_CRTC_UPDATE_LOCK__SI = 0x41B5; +constexpr unsigned int mmCRTC2_CRTC_VBI_END__SI = 0x4186; +constexpr unsigned int mmCRTC2_CRTC_VERT_SYNC_CONTROL__SI = 0x41AC; +constexpr unsigned int mmCRTC2_CRTC_VGA_PARAMETER_CAPTURE_MODE__SI = 0x41B7; +constexpr unsigned int mmCRTC2_CRTC_VSYNC_NOM_INT_STATUS__SI = 0x418C; +constexpr unsigned int mmCRTC2_CRTC_V_BLANK_START_END__SI = 0x418D; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_A_CNTL__SI = 0x418F; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_A__SI = 0x418E; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_B_CNTL__SI = 0x4191; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_B__SI = 0x4190; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_CONTROL__SI = 0x418A; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_INT_STATUS__SI = 0x418B; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_MAX__SI = 0x4189; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_MIN__SI = 0x4188; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL__SI = 0x4187; +constexpr unsigned int mmCRTC2_CRTC_V_UPDATE_INT_STATUS__SI = 0x41C4; +constexpr unsigned int mmCRTC2_MASTER_UPDATE_LOCK__SI = 0x41BD; +constexpr unsigned int mmCRTC2_PIXEL_RATE_CNTL__SI = 0x0122; +constexpr unsigned int mmCRTC3_CRTC_ALLOW_STOP_OFF_V_CNT__SI = 0x44C3; +constexpr unsigned int mmCRTC3_CRTC_BLACK_COLOR__SI = 0x44A2; +constexpr unsigned int mmCRTC3_CRTC_BLANK_DATA_COLOR__SI = 0x44A1; +constexpr unsigned int mmCRTC3_CRTC_CONTROL__SI = 0x449C; +constexpr unsigned int mmCRTC3_CRTC_COUNT_CONTROL__SI = 0x44A9; +constexpr unsigned int mmCRTC3_CRTC_COUNT_RESET__SI = 0x44AA; +constexpr unsigned int mmCRTC3_CRTC_DOUBLE_BUFFER_CONTROL__SI = 0x44B6; +constexpr unsigned int mmCRTC3_CRTC_DTMTEST_CNTL__SI = 0x4492; +constexpr unsigned int mmCRTC3_CRTC_DTMTEST_STATUS_POSITION__SI = 0x4493; +constexpr unsigned int mmCRTC3_CRTC_FLOW_CONTROL__SI = 0x4499; +constexpr unsigned int mmCRTC3_CRTC_FORCE_COUNT_NOW_CNTL__SI = 0x4498; +constexpr unsigned int mmCRTC3_CRTC_H_BLANK_START_END__SI = 0x4481; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_A_CNTL__SI = 0x4483; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_A__SI = 0x4482; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_B_CNTL__SI = 0x4485; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_B__SI = 0x4484; +constexpr unsigned int mmCRTC3_CRTC_H_TOTAL__SI = 0x4480; +constexpr unsigned int mmCRTC3_CRTC_INTERLACE_CONTROL__SI = 0x449E; +constexpr unsigned int mmCRTC3_CRTC_INTERLACE_STATUS__SI = 0x449F; +constexpr unsigned int mmCRTC3_CRTC_INTERRUPT_CONTROL__SI = 0x44B4; +constexpr unsigned int mmCRTC3_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI = 0x44AB; +constexpr unsigned int mmCRTC3_CRTC_MASTER_EN__SI = 0x44C2; +constexpr unsigned int mmCRTC3_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI = 0x44C0; +constexpr unsigned int mmCRTC3_CRTC_MVP_INBAND_CNTL_INSERT__SI = 0x44BF; +constexpr unsigned int mmCRTC3_CRTC_MVP_STATUS__SI = 0x44C1; +constexpr unsigned int mmCRTC3_CRTC_NOM_VERT_POSITION__SI = 0x44A5; +constexpr unsigned int mmCRTC3_CRTC_OVERSCAN_COLOR__SI = 0x44A0; +constexpr unsigned int mmCRTC3_CRTC_PIXEL_DATA_READBACK__SI = 0x449A; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_CONTROL__SI = 0x44B0; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_FRAME__SI = 0x44B2; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_POSITION__SI = 0x44B1; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_STATUS__SI = 0x44AF; +constexpr unsigned int mmCRTC3_CRTC_START_LINE_CONTROL__SI = 0x44B3; +constexpr unsigned int mmCRTC3_CRTC_STATUS_FRAME_COUNT__SI = 0x44A6; +constexpr unsigned int mmCRTC3_CRTC_STATUS_HV_COUNT__SI = 0x44A8; +constexpr unsigned int mmCRTC3_CRTC_STATUS_VF_COUNT__SI = 0x44A7; +constexpr unsigned int mmCRTC3_CRTC_STEREO_CONTROL__SI = 0x44AE; +constexpr unsigned int mmCRTC3_CRTC_STEREO_FORCE_NEXT_EYE__SI = 0x449B; +constexpr unsigned int mmCRTC3_CRTC_STEREO_STATUS__SI = 0x44AD; +constexpr unsigned int mmCRTC3_CRTC_TEST_DEBUG_DATA__SI = 0x44C7; +constexpr unsigned int mmCRTC3_CRTC_TEST_DEBUG_INDEX__SI = 0x44C6; +constexpr unsigned int mmCRTC3_CRTC_TEST_PATTERN_COLOR__SI = 0x44BC; +constexpr unsigned int mmCRTC3_CRTC_TEST_PATTERN_CONTROL__SI = 0x44BA; +constexpr unsigned int mmCRTC3_CRTC_TEST_PATTERN_PARAMETERS__SI = 0x44BB; +constexpr unsigned int mmCRTC3_CRTC_TRIGA_CNTL__SI = 0x4494; +constexpr unsigned int mmCRTC3_CRTC_TRIGA_MANUAL_TRIG__SI = 0x4495; +constexpr unsigned int mmCRTC3_CRTC_TRIGB_CNTL__SI = 0x4496; +constexpr unsigned int mmCRTC3_CRTC_TRIGB_MANUAL_TRIG__SI = 0x4497; +constexpr unsigned int mmCRTC3_CRTC_UPDATE_LOCK__SI = 0x44B5; +constexpr unsigned int mmCRTC3_CRTC_VBI_END__SI = 0x4486; +constexpr unsigned int mmCRTC3_CRTC_VERT_SYNC_CONTROL__SI = 0x44AC; +constexpr unsigned int mmCRTC3_CRTC_VGA_PARAMETER_CAPTURE_MODE__SI = 0x44B7; +constexpr unsigned int mmCRTC3_CRTC_VSYNC_NOM_INT_STATUS__SI = 0x448C; +constexpr unsigned int mmCRTC3_CRTC_V_BLANK_START_END__SI = 0x448D; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_A_CNTL__SI = 0x448F; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_A__SI = 0x448E; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_B_CNTL__SI = 0x4491; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_B__SI = 0x4490; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_CONTROL__SI = 0x448A; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_INT_STATUS__SI = 0x448B; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_MAX__SI = 0x4489; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_MIN__SI = 0x4488; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL__SI = 0x4487; +constexpr unsigned int mmCRTC3_CRTC_V_UPDATE_INT_STATUS__SI = 0x44C4; +constexpr unsigned int mmCRTC3_MASTER_UPDATE_LOCK__SI = 0x44BD; +constexpr unsigned int mmCRTC3_PIXEL_RATE_CNTL__SI = 0x0123; +constexpr unsigned int mmCRTC4_CRTC_ALLOW_STOP_OFF_V_CNT__SI = 0x47C3; +constexpr unsigned int mmCRTC4_CRTC_BLACK_COLOR__SI = 0x47A2; +constexpr unsigned int mmCRTC4_CRTC_BLANK_DATA_COLOR__SI = 0x47A1; +constexpr unsigned int mmCRTC4_CRTC_CONTROL__SI = 0x479C; +constexpr unsigned int mmCRTC4_CRTC_COUNT_CONTROL__SI = 0x47A9; +constexpr unsigned int mmCRTC4_CRTC_COUNT_RESET__SI = 0x47AA; +constexpr unsigned int mmCRTC4_CRTC_DOUBLE_BUFFER_CONTROL__SI = 0x47B6; +constexpr unsigned int mmCRTC4_CRTC_DTMTEST_CNTL__SI = 0x4792; +constexpr unsigned int mmCRTC4_CRTC_DTMTEST_STATUS_POSITION__SI = 0x4793; +constexpr unsigned int mmCRTC4_CRTC_FLOW_CONTROL__SI = 0x4799; +constexpr unsigned int mmCRTC4_CRTC_FORCE_COUNT_NOW_CNTL__SI = 0x4798; +constexpr unsigned int mmCRTC4_CRTC_H_BLANK_START_END__SI = 0x4781; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_A_CNTL__SI = 0x4783; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_A__SI = 0x4782; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_B_CNTL__SI = 0x4785; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_B__SI = 0x4784; +constexpr unsigned int mmCRTC4_CRTC_H_TOTAL__SI = 0x4780; +constexpr unsigned int mmCRTC4_CRTC_INTERLACE_CONTROL__SI = 0x479E; +constexpr unsigned int mmCRTC4_CRTC_INTERLACE_STATUS__SI = 0x479F; +constexpr unsigned int mmCRTC4_CRTC_INTERRUPT_CONTROL__SI = 0x47B4; +constexpr unsigned int mmCRTC4_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI = 0x47AB; +constexpr unsigned int mmCRTC4_CRTC_MASTER_EN__SI = 0x47C2; +constexpr unsigned int mmCRTC4_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI = 0x47C0; +constexpr unsigned int mmCRTC4_CRTC_MVP_INBAND_CNTL_INSERT__SI = 0x47BF; +constexpr unsigned int mmCRTC4_CRTC_MVP_STATUS__SI = 0x47C1; +constexpr unsigned int mmCRTC4_CRTC_NOM_VERT_POSITION__SI = 0x47A5; +constexpr unsigned int mmCRTC4_CRTC_OVERSCAN_COLOR__SI = 0x47A0; +constexpr unsigned int mmCRTC4_CRTC_PIXEL_DATA_READBACK__SI = 0x479A; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_CONTROL__SI = 0x47B0; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_FRAME__SI = 0x47B2; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_POSITION__SI = 0x47B1; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_STATUS__SI = 0x47AF; +constexpr unsigned int mmCRTC4_CRTC_START_LINE_CONTROL__SI = 0x47B3; +constexpr unsigned int mmCRTC4_CRTC_STATUS_FRAME_COUNT__SI = 0x47A6; +constexpr unsigned int mmCRTC4_CRTC_STATUS_HV_COUNT__SI = 0x47A8; +constexpr unsigned int mmCRTC4_CRTC_STATUS_VF_COUNT__SI = 0x47A7; +constexpr unsigned int mmCRTC4_CRTC_STEREO_CONTROL__SI = 0x47AE; +constexpr unsigned int mmCRTC4_CRTC_STEREO_FORCE_NEXT_EYE__SI = 0x479B; +constexpr unsigned int mmCRTC4_CRTC_STEREO_STATUS__SI = 0x47AD; +constexpr unsigned int mmCRTC4_CRTC_TEST_DEBUG_DATA__SI = 0x47C7; +constexpr unsigned int mmCRTC4_CRTC_TEST_DEBUG_INDEX__SI = 0x47C6; +constexpr unsigned int mmCRTC4_CRTC_TEST_PATTERN_COLOR__SI = 0x47BC; +constexpr unsigned int mmCRTC4_CRTC_TEST_PATTERN_CONTROL__SI = 0x47BA; +constexpr unsigned int mmCRTC4_CRTC_TEST_PATTERN_PARAMETERS__SI = 0x47BB; +constexpr unsigned int mmCRTC4_CRTC_TRIGA_CNTL__SI = 0x4794; +constexpr unsigned int mmCRTC4_CRTC_TRIGA_MANUAL_TRIG__SI = 0x4795; +constexpr unsigned int mmCRTC4_CRTC_TRIGB_CNTL__SI = 0x4796; +constexpr unsigned int mmCRTC4_CRTC_TRIGB_MANUAL_TRIG__SI = 0x4797; +constexpr unsigned int mmCRTC4_CRTC_UPDATE_LOCK__SI = 0x47B5; +constexpr unsigned int mmCRTC4_CRTC_VBI_END__SI = 0x4786; +constexpr unsigned int mmCRTC4_CRTC_VERT_SYNC_CONTROL__SI = 0x47AC; +constexpr unsigned int mmCRTC4_CRTC_VGA_PARAMETER_CAPTURE_MODE__SI = 0x47B7; +constexpr unsigned int mmCRTC4_CRTC_VSYNC_NOM_INT_STATUS__SI = 0x478C; +constexpr unsigned int mmCRTC4_CRTC_V_BLANK_START_END__SI = 0x478D; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_A_CNTL__SI = 0x478F; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_A__SI = 0x478E; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_B_CNTL__SI = 0x4791; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_B__SI = 0x4790; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_CONTROL__SI = 0x478A; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_INT_STATUS__SI = 0x478B; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_MAX__SI = 0x4789; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_MIN__SI = 0x4788; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL__SI = 0x4787; +constexpr unsigned int mmCRTC4_CRTC_V_UPDATE_INT_STATUS__SI = 0x47C4; +constexpr unsigned int mmCRTC4_MASTER_UPDATE_LOCK__SI = 0x47BD; +constexpr unsigned int mmCRTC4_PIXEL_RATE_CNTL__SI = 0x0124; +constexpr unsigned int mmCRTC5_CRTC_ALLOW_STOP_OFF_V_CNT__SI = 0x4AC3; +constexpr unsigned int mmCRTC5_CRTC_BLACK_COLOR__SI = 0x4AA2; +constexpr unsigned int mmCRTC5_CRTC_BLANK_DATA_COLOR__SI = 0x4AA1; +constexpr unsigned int mmCRTC5_CRTC_CONTROL__SI = 0x4A9C; +constexpr unsigned int mmCRTC5_CRTC_COUNT_CONTROL__SI = 0x4AA9; +constexpr unsigned int mmCRTC5_CRTC_COUNT_RESET__SI = 0x4AAA; +constexpr unsigned int mmCRTC5_CRTC_DOUBLE_BUFFER_CONTROL__SI = 0x4AB6; +constexpr unsigned int mmCRTC5_CRTC_DTMTEST_CNTL__SI = 0x4A92; +constexpr unsigned int mmCRTC5_CRTC_DTMTEST_STATUS_POSITION__SI = 0x4A93; +constexpr unsigned int mmCRTC5_CRTC_FLOW_CONTROL__SI = 0x4A99; +constexpr unsigned int mmCRTC5_CRTC_FORCE_COUNT_NOW_CNTL__SI = 0x4A98; +constexpr unsigned int mmCRTC5_CRTC_H_BLANK_START_END__SI = 0x4A81; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_A_CNTL__SI = 0x4A83; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_A__SI = 0x4A82; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_B_CNTL__SI = 0x4A85; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_B__SI = 0x4A84; +constexpr unsigned int mmCRTC5_CRTC_H_TOTAL__SI = 0x4A80; +constexpr unsigned int mmCRTC5_CRTC_INTERLACE_CONTROL__SI = 0x4A9E; +constexpr unsigned int mmCRTC5_CRTC_INTERLACE_STATUS__SI = 0x4A9F; +constexpr unsigned int mmCRTC5_CRTC_INTERRUPT_CONTROL__SI = 0x4AB4; +constexpr unsigned int mmCRTC5_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI = 0x4AAB; +constexpr unsigned int mmCRTC5_CRTC_MASTER_EN__SI = 0x4AC2; +constexpr unsigned int mmCRTC5_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI = 0x4AC0; +constexpr unsigned int mmCRTC5_CRTC_MVP_INBAND_CNTL_INSERT__SI = 0x4ABF; +constexpr unsigned int mmCRTC5_CRTC_MVP_STATUS__SI = 0x4AC1; +constexpr unsigned int mmCRTC5_CRTC_NOM_VERT_POSITION__SI = 0x4AA5; +constexpr unsigned int mmCRTC5_CRTC_OVERSCAN_COLOR__SI = 0x4AA0; +constexpr unsigned int mmCRTC5_CRTC_PIXEL_DATA_READBACK__SI = 0x4A9A; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_CONTROL__SI = 0x4AB0; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_FRAME__SI = 0x4AB2; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_POSITION__SI = 0x4AB1; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_STATUS__SI = 0x4AAF; +constexpr unsigned int mmCRTC5_CRTC_START_LINE_CONTROL__SI = 0x4AB3; +constexpr unsigned int mmCRTC5_CRTC_STATUS_FRAME_COUNT__SI = 0x4AA6; +constexpr unsigned int mmCRTC5_CRTC_STATUS_HV_COUNT__SI = 0x4AA8; +constexpr unsigned int mmCRTC5_CRTC_STATUS_VF_COUNT__SI = 0x4AA7; +constexpr unsigned int mmCRTC5_CRTC_STEREO_CONTROL__SI = 0x4AAE; +constexpr unsigned int mmCRTC5_CRTC_STEREO_FORCE_NEXT_EYE__SI = 0x4A9B; +constexpr unsigned int mmCRTC5_CRTC_STEREO_STATUS__SI = 0x4AAD; +constexpr unsigned int mmCRTC5_CRTC_TEST_DEBUG_DATA__SI = 0x4AC7; +constexpr unsigned int mmCRTC5_CRTC_TEST_DEBUG_INDEX__SI = 0x4AC6; +constexpr unsigned int mmCRTC5_CRTC_TEST_PATTERN_COLOR__SI = 0x4ABC; +constexpr unsigned int mmCRTC5_CRTC_TEST_PATTERN_CONTROL__SI = 0x4ABA; +constexpr unsigned int mmCRTC5_CRTC_TEST_PATTERN_PARAMETERS__SI = 0x4ABB; +constexpr unsigned int mmCRTC5_CRTC_TRIGA_CNTL__SI = 0x4A94; +constexpr unsigned int mmCRTC5_CRTC_TRIGA_MANUAL_TRIG__SI = 0x4A95; +constexpr unsigned int mmCRTC5_CRTC_TRIGB_CNTL__SI = 0x4A96; +constexpr unsigned int mmCRTC5_CRTC_TRIGB_MANUAL_TRIG__SI = 0x4A97; +constexpr unsigned int mmCRTC5_CRTC_UPDATE_LOCK__SI = 0x4AB5; +constexpr unsigned int mmCRTC5_CRTC_VBI_END__SI = 0x4A86; +constexpr unsigned int mmCRTC5_CRTC_VERT_SYNC_CONTROL__SI = 0x4AAC; +constexpr unsigned int mmCRTC5_CRTC_VGA_PARAMETER_CAPTURE_MODE__SI = 0x4AB7; +constexpr unsigned int mmCRTC5_CRTC_VSYNC_NOM_INT_STATUS__SI = 0x4A8C; +constexpr unsigned int mmCRTC5_CRTC_V_BLANK_START_END__SI = 0x4A8D; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_A_CNTL__SI = 0x4A8F; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_A__SI = 0x4A8E; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_B_CNTL__SI = 0x4A91; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_B__SI = 0x4A90; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_CONTROL__SI = 0x4A8A; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_INT_STATUS__SI = 0x4A8B; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_MAX__SI = 0x4A89; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_MIN__SI = 0x4A88; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL__SI = 0x4A87; +constexpr unsigned int mmCRTC5_CRTC_V_UPDATE_INT_STATUS__SI = 0x4AC4; +constexpr unsigned int mmCRTC5_MASTER_UPDATE_LOCK__SI = 0x4ABD; +constexpr unsigned int mmCRTC5_PIXEL_RATE_CNTL__SI = 0x0125; +constexpr unsigned int mmCRTC8_DATA__SI__VI = 0x00ED; +constexpr unsigned int mmCRTC8_IDX__SI__VI = 0x00ED; +constexpr unsigned int mmCRTC_ALLOW_STOP_OFF_V_CNT__SI__VI = 0x1BC3; +constexpr unsigned int mmCRTC_BLACK_COLOR__SI = 0x1BA2; +constexpr unsigned int mmCRTC_BLANK_CONTROL = 0x1B9D; +constexpr unsigned int mmCRTC_BLANK_DATA_COLOR__SI = 0x1BA1; +constexpr unsigned int mmCRTC_CONTROL__SI__VI = 0x1B9C; +constexpr unsigned int mmCRTC_COUNT_CONTROL__SI__VI = 0x1BA9; +constexpr unsigned int mmCRTC_COUNT_RESET__SI__VI = 0x1BAA; +constexpr unsigned int mmCRTC_DOUBLE_BUFFER_CONTROL__SI__VI = 0x1BB6; +constexpr unsigned int mmCRTC_DTMTEST_CNTL__SI__VI = 0x1B92; +constexpr unsigned int mmCRTC_DTMTEST_STATUS_POSITION__SI__VI = 0x1B93; +constexpr unsigned int mmCRTC_FLOW_CONTROL__SI__VI = 0x1B99; +constexpr unsigned int mmCRTC_FORCE_COUNT_NOW_CNTL__SI__VI = 0x1B98; +constexpr unsigned int mmCRTC_H_BLANK_START_END__SI__VI = 0x1B81; +constexpr unsigned int mmCRTC_H_SYNC_A_CNTL__SI__VI = 0x1B83; +constexpr unsigned int mmCRTC_H_SYNC_A__SI__VI = 0x1B82; +constexpr unsigned int mmCRTC_H_SYNC_B_CNTL__SI__VI = 0x1B85; +constexpr unsigned int mmCRTC_H_SYNC_B__SI__VI = 0x1B84; +constexpr unsigned int mmCRTC_H_TOTAL__SI__VI = 0x1B80; +constexpr unsigned int mmCRTC_INTERLACE_CONTROL__SI__VI = 0x1B9E; +constexpr unsigned int mmCRTC_INTERLACE_STATUS__SI__VI = 0x1B9F; +constexpr unsigned int mmCRTC_INTERRUPT_CONTROL__SI__VI = 0x1BB4; +constexpr unsigned int mmCRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SI__VI = 0x1BAB; +constexpr unsigned int mmCRTC_MASTER_EN__SI__VI = 0x1BC2; +constexpr unsigned int mmCRTC_MVP_INBAND_CNTL_INSERT_TIMER__SI__VI = 0x1BC0; +constexpr unsigned int mmCRTC_MVP_INBAND_CNTL_INSERT__SI__VI = 0x1BBF; +constexpr unsigned int mmCRTC_MVP_STATUS__SI__VI = 0x1BC1; +constexpr unsigned int mmCRTC_NOM_VERT_POSITION__SI__VI = 0x1BA5; +constexpr unsigned int mmCRTC_OVERSCAN_COLOR__SI = 0x1BA0; +constexpr unsigned int mmCRTC_PIXEL_DATA_READBACK__SI = 0x1B9A; +constexpr unsigned int mmCRTC_SNAPSHOT_CONTROL__SI__VI = 0x1BB0; +constexpr unsigned int mmCRTC_SNAPSHOT_FRAME__SI__VI = 0x1BB2; +constexpr unsigned int mmCRTC_SNAPSHOT_POSITION__SI__VI = 0x1BB1; +constexpr unsigned int mmCRTC_SNAPSHOT_STATUS__SI__VI = 0x1BAF; +constexpr unsigned int mmCRTC_START_LINE_CONTROL__SI__VI = 0x1BB3; +constexpr unsigned int mmCRTC_STATUS = 0x1BA3; +constexpr unsigned int mmCRTC_STATUS_FRAME_COUNT__SI__VI = 0x1BA6; +constexpr unsigned int mmCRTC_STATUS_HV_COUNT__SI__VI = 0x1BA8; +constexpr unsigned int mmCRTC_STATUS_POSITION__SI__VI = 0x1BA4; +constexpr unsigned int mmCRTC_STATUS_VF_COUNT__SI__VI = 0x1BA7; +constexpr unsigned int mmCRTC_STEREO_CONTROL__SI__VI = 0x1BAE; +constexpr unsigned int mmCRTC_STEREO_FORCE_NEXT_EYE__SI = 0x1B9B; +constexpr unsigned int mmCRTC_STEREO_STATUS__SI__VI = 0x1BAD; +constexpr unsigned int mmCRTC_TEST_DEBUG_DATA__SI__VI = 0x1BC7; +constexpr unsigned int mmCRTC_TEST_DEBUG_INDEX__SI__VI = 0x1BC6; +constexpr unsigned int mmCRTC_TEST_PATTERN_COLOR__SI__VI = 0x1BBC; +constexpr unsigned int mmCRTC_TEST_PATTERN_CONTROL__SI__VI = 0x1BBA; +constexpr unsigned int mmCRTC_TEST_PATTERN_PARAMETERS__SI__VI = 0x1BBB; +constexpr unsigned int mmCRTC_TRIGA_CNTL__SI__VI = 0x1B94; +constexpr unsigned int mmCRTC_TRIGA_MANUAL_TRIG__SI__VI = 0x1B95; +constexpr unsigned int mmCRTC_TRIGB_CNTL__SI__VI = 0x1B96; +constexpr unsigned int mmCRTC_TRIGB_MANUAL_TRIG__SI__VI = 0x1B97; +constexpr unsigned int mmCRTC_UPDATE_LOCK__SI__VI = 0x1BB5; +constexpr unsigned int mmCRTC_VBI_END__SI__VI = 0x1B86; +constexpr unsigned int mmCRTC_VERT_SYNC_CONTROL__SI__VI = 0x1BAC; +constexpr unsigned int mmCRTC_VGA_PARAMETER_CAPTURE_MODE__SI__VI = 0x1BB7; +constexpr unsigned int mmCRTC_VSYNC_NOM_INT_STATUS__SI__VI = 0x1B8C; +constexpr unsigned int mmCRTC_V_BLANK_START_END__SI__VI = 0x1B8D; +constexpr unsigned int mmCRTC_V_SYNC_A_CNTL__SI__VI = 0x1B8F; +constexpr unsigned int mmCRTC_V_SYNC_A__SI__VI = 0x1B8E; +constexpr unsigned int mmCRTC_V_SYNC_B_CNTL__SI__VI = 0x1B91; +constexpr unsigned int mmCRTC_V_SYNC_B__SI__VI = 0x1B90; +constexpr unsigned int mmCRTC_V_TOTAL_CONTROL__SI__VI = 0x1B8A; +constexpr unsigned int mmCRTC_V_TOTAL_INT_STATUS__SI__VI = 0x1B8B; +constexpr unsigned int mmCRTC_V_TOTAL_MAX__SI__VI = 0x1B89; +constexpr unsigned int mmCRTC_V_TOTAL_MIN__SI__VI = 0x1B88; +constexpr unsigned int mmCRTC_V_TOTAL__SI__VI = 0x1B87; +constexpr unsigned int mmCRTC_V_UPDATE_INT_STATUS__SI__VI = 0x1BC4; +constexpr unsigned int mmCS_COPY_STATE = 0xA1F3; +constexpr unsigned int mmCUR_COLOR1__SI__VI = 0x1A6C; +constexpr unsigned int mmCUR_COLOR2__SI__VI = 0x1A6D; +constexpr unsigned int mmCUR_CONTROL__SI__VI = 0x1A66; +constexpr unsigned int mmCUR_HOT_SPOT__SI__VI = 0x1A6B; +constexpr unsigned int mmCUR_POSITION__SI__VI = 0x1A6A; +constexpr unsigned int mmCUR_SIZE__SI__VI = 0x1A68; +constexpr unsigned int mmCUR_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A69; +constexpr unsigned int mmCUR_SURFACE_ADDRESS__SI__VI = 0x1A67; +constexpr unsigned int mmCUR_UPDATE__SI__VI = 0x1A6E; +constexpr unsigned int mmD1VGA_CONTROL__SI__VI = 0x00CC; +constexpr unsigned int mmD2VGA_CONTROL__SI__VI = 0x00CE; +constexpr unsigned int mmD3VGA_CONTROL__SI__VI = 0x00F8; +constexpr unsigned int mmD4VGA_CONTROL__SI__VI = 0x00F9; +constexpr unsigned int mmD5VGA_CONTROL__SI__VI = 0x00FA; +constexpr unsigned int mmD6VGA_CONTROL__SI__VI = 0x00FB; +constexpr unsigned int mmDAC_AUTODETECT_CONTROL2__SI = 0x19AF; +constexpr unsigned int mmDAC_AUTODETECT_CONTROL3__SI = 0x19B0; +constexpr unsigned int mmDAC_AUTODETECT_CONTROL__SI = 0x19AE; +constexpr unsigned int mmDAC_AUTODETECT_INT_CONTROL__SI = 0x19B2; +constexpr unsigned int mmDAC_AUTODETECT_STATUS__SI = 0x19B1; +constexpr unsigned int mmDAC_COMPARATOR_ENABLE__SI = 0x19B7; +constexpr unsigned int mmDAC_COMPARATOR_OUTPUT__SI = 0x19B8; +constexpr unsigned int mmDAC_CONTROL__SI = 0x19B6; +constexpr unsigned int mmDAC_CRC_CONTROL__SI = 0x19A7; +constexpr unsigned int mmDAC_CRC_EN__SI = 0x19A6; +constexpr unsigned int mmDAC_CRC_SIG_CONTROL_MASK__SI = 0x19A9; +constexpr unsigned int mmDAC_CRC_SIG_CONTROL__SI = 0x19AB; +constexpr unsigned int mmDAC_CRC_SIG_RGB_MASK__SI = 0x19A8; +constexpr unsigned int mmDAC_CRC_SIG_RGB__SI = 0x19AA; +constexpr unsigned int mmDAC_DATA__SI__VI = 0x00F2; +constexpr unsigned int mmDAC_DFT_CONFIG__SI = 0x19BA; +constexpr unsigned int mmDAC_ENABLE__SI = 0x19A4; +constexpr unsigned int mmDAC_FORCE_DATA__SI = 0x19B4; +constexpr unsigned int mmDAC_FORCE_OUTPUT_CNTL__SI = 0x19B3; +constexpr unsigned int mmDAC_MACRO_CNTL__SI = 0x1939; +constexpr unsigned int mmDAC_MASK__SI__VI = 0x00F1; +constexpr unsigned int mmDAC_POWERDOWN__SI = 0x19B5; +constexpr unsigned int mmDAC_PWR_CNTL__SI = 0x19B9; +constexpr unsigned int mmDAC_R_INDEX__SI__VI = 0x00F1; +constexpr unsigned int mmDAC_SOURCE_SELECT__SI = 0x19A5; +constexpr unsigned int mmDAC_STEREOSYNC_SELECT__SI = 0x19AD; +constexpr unsigned int mmDAC_SYNC_TRISTATE_CONTROL__SI = 0x19AC; +constexpr unsigned int mmDAC_W_INDEX__SI__VI = 0x00F2; +constexpr unsigned int mmDATA_FORMAT__SI = 0x1AC0; +constexpr unsigned int mmDBG_BYPASS_SRBM_ACCESS__CI = 0x14EB; +constexpr unsigned int mmDB_ALPHA_TO_MASK = 0xA2DC; +constexpr unsigned int mmDB_CGTT_CLK_CTRL_0__CI__VI = 0xF0A4; +constexpr unsigned int mmDB_CGTT_CLK_CTRL_0__SI = 0x261A; +constexpr unsigned int mmDB_COUNT_CONTROL = 0xA001; +constexpr unsigned int mmDB_CREDIT_LIMIT = 0x2614; +constexpr unsigned int mmDB_DEBUG = 0x260C; +constexpr unsigned int mmDB_DEBUG2 = 0x260D; +constexpr unsigned int mmDB_DEBUG3 = 0x260E; +constexpr unsigned int mmDB_DEBUG4 = 0x260F; +constexpr unsigned int mmDB_DEPTH_BOUNDS_MAX = 0xA009; +constexpr unsigned int mmDB_DEPTH_BOUNDS_MIN = 0xA008; +constexpr unsigned int mmDB_DEPTH_CLEAR = 0xA00B; +constexpr unsigned int mmDB_DEPTH_CONTROL = 0xA200; +constexpr unsigned int mmDB_DEPTH_INFO = 0xA00F; +constexpr unsigned int mmDB_DEPTH_SIZE = 0xA016; +constexpr unsigned int mmDB_DEPTH_SLICE = 0xA017; +constexpr unsigned int mmDB_DEPTH_VIEW = 0xA002; +constexpr unsigned int mmDB_EQAA = 0xA201; +constexpr unsigned int mmDB_FIFO_DEPTH1 = 0x2618; +constexpr unsigned int mmDB_FIFO_DEPTH2 = 0x2619; +constexpr unsigned int mmDB_FREE_CACHELINES = 0x2617; +constexpr unsigned int mmDB_HTILE_DATA_BASE = 0xA005; +constexpr unsigned int mmDB_HTILE_SURFACE = 0xA2AF; +constexpr unsigned int mmDB_OCCLUSION_COUNT0_HI__CI__VI = 0xC3C1; +constexpr unsigned int mmDB_OCCLUSION_COUNT0_LOW__CI__VI = 0xC3C0; +constexpr unsigned int mmDB_OCCLUSION_COUNT1_HI__CI__VI = 0xC3C3; +constexpr unsigned int mmDB_OCCLUSION_COUNT1_LOW__CI__VI = 0xC3C2; +constexpr unsigned int mmDB_OCCLUSION_COUNT2_HI__CI__VI = 0xC3C5; +constexpr unsigned int mmDB_OCCLUSION_COUNT2_LOW__CI__VI = 0xC3C4; +constexpr unsigned int mmDB_OCCLUSION_COUNT3_HI__CI__VI = 0xC3C7; +constexpr unsigned int mmDB_OCCLUSION_COUNT3_LOW__CI__VI = 0xC3C6; +constexpr unsigned int mmDB_PERFCOUNTER0_HI__CI__VI = 0xD441; +constexpr unsigned int mmDB_PERFCOUNTER0_HI__SI = 0x2602; +constexpr unsigned int mmDB_PERFCOUNTER0_LO__CI__VI = 0xD440; +constexpr unsigned int mmDB_PERFCOUNTER0_LO__SI = 0x2601; +constexpr unsigned int mmDB_PERFCOUNTER0_SELECT1__CI__VI = 0xDC41; +constexpr unsigned int mmDB_PERFCOUNTER0_SELECT__CI__VI = 0xDC40; +constexpr unsigned int mmDB_PERFCOUNTER0_SELECT__SI = 0x2600; +constexpr unsigned int mmDB_PERFCOUNTER1_HI__CI__VI = 0xD443; +constexpr unsigned int mmDB_PERFCOUNTER1_HI__SI = 0x2605; +constexpr unsigned int mmDB_PERFCOUNTER1_LO__CI__VI = 0xD442; +constexpr unsigned int mmDB_PERFCOUNTER1_LO__SI = 0x2604; +constexpr unsigned int mmDB_PERFCOUNTER1_SELECT1__CI__VI = 0xDC43; +constexpr unsigned int mmDB_PERFCOUNTER1_SELECT__CI__VI = 0xDC42; +constexpr unsigned int mmDB_PERFCOUNTER1_SELECT__SI = 0x2603; +constexpr unsigned int mmDB_PERFCOUNTER2_HI__CI__VI = 0xD445; +constexpr unsigned int mmDB_PERFCOUNTER2_HI__SI = 0x2608; +constexpr unsigned int mmDB_PERFCOUNTER2_LO__CI__VI = 0xD444; +constexpr unsigned int mmDB_PERFCOUNTER2_LO__SI = 0x2607; +constexpr unsigned int mmDB_PERFCOUNTER2_SELECT__CI__VI = 0xDC44; +constexpr unsigned int mmDB_PERFCOUNTER2_SELECT__SI = 0x2606; +constexpr unsigned int mmDB_PERFCOUNTER3_HI__CI__VI = 0xD447; +constexpr unsigned int mmDB_PERFCOUNTER3_HI__SI = 0x260B; +constexpr unsigned int mmDB_PERFCOUNTER3_LO__CI__VI = 0xD446; +constexpr unsigned int mmDB_PERFCOUNTER3_LO__SI = 0x260A; +constexpr unsigned int mmDB_PERFCOUNTER3_SELECT__CI__VI = 0xDC46; +constexpr unsigned int mmDB_PERFCOUNTER3_SELECT__SI = 0x2609; +constexpr unsigned int mmDB_PRELOAD_CONTROL = 0xA2B2; +constexpr unsigned int mmDB_READ_DEBUG_0 = 0x2620; +constexpr unsigned int mmDB_READ_DEBUG_1 = 0x2621; +constexpr unsigned int mmDB_READ_DEBUG_2 = 0x2622; +constexpr unsigned int mmDB_READ_DEBUG_3 = 0x2623; +constexpr unsigned int mmDB_READ_DEBUG_4 = 0x2624; +constexpr unsigned int mmDB_READ_DEBUG_5 = 0x2625; +constexpr unsigned int mmDB_READ_DEBUG_6 = 0x2626; +constexpr unsigned int mmDB_READ_DEBUG_7 = 0x2627; +constexpr unsigned int mmDB_READ_DEBUG_8 = 0x2628; +constexpr unsigned int mmDB_READ_DEBUG_9 = 0x2629; +constexpr unsigned int mmDB_READ_DEBUG_A = 0x262A; +constexpr unsigned int mmDB_READ_DEBUG_B = 0x262B; +constexpr unsigned int mmDB_READ_DEBUG_C = 0x262C; +constexpr unsigned int mmDB_READ_DEBUG_D = 0x262D; +constexpr unsigned int mmDB_READ_DEBUG_E = 0x262E; +constexpr unsigned int mmDB_READ_DEBUG_F = 0x262F; +constexpr unsigned int mmDB_RENDER_CONTROL = 0xA000; +constexpr unsigned int mmDB_RENDER_OVERRIDE = 0xA003; +constexpr unsigned int mmDB_RENDER_OVERRIDE2 = 0xA004; +constexpr unsigned int mmDB_RING_CONTROL__CI__VI = 0x261B; +constexpr unsigned int mmDB_SHADER_CONTROL = 0xA203; +constexpr unsigned int mmDB_SRESULTS_COMPARE_STATE0 = 0xA2B0; +constexpr unsigned int mmDB_SRESULTS_COMPARE_STATE1 = 0xA2B1; +constexpr unsigned int mmDB_STENCILREFMASK = 0xA10C; +constexpr unsigned int mmDB_STENCILREFMASK_BF = 0xA10D; +constexpr unsigned int mmDB_STENCIL_CLEAR = 0xA00A; +constexpr unsigned int mmDB_STENCIL_CONTROL = 0xA10B; +constexpr unsigned int mmDB_STENCIL_INFO = 0xA011; +constexpr unsigned int mmDB_STENCIL_READ_BASE = 0xA013; +constexpr unsigned int mmDB_STENCIL_WRITE_BASE = 0xA015; +constexpr unsigned int mmDB_SUBTILE_CONTROL = 0x2616; +constexpr unsigned int mmDB_WATERMARKS = 0x2615; +constexpr unsigned int mmDB_ZPASS_COUNT_HI__CI__VI = 0xC3FF; +constexpr unsigned int mmDB_ZPASS_COUNT_HI__SI = 0x261D; +constexpr unsigned int mmDB_ZPASS_COUNT_LOW__CI__VI = 0xC3FE; +constexpr unsigned int mmDB_ZPASS_COUNT_LOW__SI = 0x261C; +constexpr unsigned int mmDB_Z_INFO = 0xA010; +constexpr unsigned int mmDB_Z_READ_BASE = 0xA012; +constexpr unsigned int mmDB_Z_WRITE_BASE = 0xA014; +constexpr unsigned int mmDCCG_AUDIO_DTO0_MODULE__SI = 0x0154; +constexpr unsigned int mmDCCG_AUDIO_DTO0_PHASE__SI = 0x0153; +constexpr unsigned int mmDCCG_GATE_DISABLE_CNTL__SI = 0x011F; +constexpr unsigned int mmDCCG_TEST_CLK_SEL__SI = 0x0147; +constexpr unsigned int mmDCCG_TEST_DEBUG_DATA__SI = 0x0159; +constexpr unsigned int mmDCCG_TEST_DEBUG_INDEX__SI = 0x0158; +constexpr unsigned int mmDCCG_VPCLK_CNTL__SI = 0x015E; +constexpr unsigned int mmDCDEBUG_BUS_CLK1_SEL__SI = 0x1860; +constexpr unsigned int mmDCDEBUG_BUS_CLK2_SEL__SI = 0x1861; +constexpr unsigned int mmDCDEBUG_BUS_CLK3_SEL__SI = 0x1862; +constexpr unsigned int mmDCDEBUG_BUS_CLK4_SEL__SI = 0x1863; +constexpr unsigned int mmDCDEBUG_OUT_CNTL__SI = 0x186B; +constexpr unsigned int mmDCDEBUG_OUT_PIN_OVERRIDE__SI = 0x186A; +constexpr unsigned int mmDCIO_DEBUG__SI = 0x196F; +constexpr unsigned int mmDCIO_IMPCAL_CNTL_AB__SI = 0x194C; +constexpr unsigned int mmDCIO_IMPCAL_CNTL_CD__SI = 0x194F; +constexpr unsigned int mmDCIO_IMPCAL_CNTL_EF__SI = 0x1952; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_DATA_SYNCHRONIZATION__SI = 0x1984; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_REG_TEST_OUTPUT__SI = 0x1986; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_DATA_SYNCHRONIZATION__SI = 0x1990; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_REG_TEST_OUTPUT__SI = 0x1992; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_DATA_SYNCHRONIZATION__SI = 0x199C; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_REG_TEST_OUTPUT__SI = 0x199E; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_DATA_SYNCHRONIZATION__SI = 0x19C4; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_REG_TEST_OUTPUT__SI = 0x19C6; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_DATA_SYNCHRONIZATION__SI = 0x19D0; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_REG_TEST_OUTPUT__SI = 0x19D2; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_DATA_SYNCHRONIZATION__SI = 0x19DC; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_REG_TEST_OUTPUT__SI = 0x19DE; +constexpr unsigned int mmDCI_TEST_DEBUG_DATA__SI = 0x0321; +constexpr unsigned int mmDCI_TEST_DEBUG_INDEX__SI = 0x0320; +constexpr unsigned int mmDCP0_CUR_COLOR1__SI__VI = 0x1A6C; +constexpr unsigned int mmDCP0_CUR_COLOR2__SI__VI = 0x1A6D; +constexpr unsigned int mmDCP0_CUR_CONTROL__SI__VI = 0x1A66; +constexpr unsigned int mmDCP0_CUR_HOT_SPOT__SI__VI = 0x1A6B; +constexpr unsigned int mmDCP0_CUR_POSITION__SI__VI = 0x1A6A; +constexpr unsigned int mmDCP0_CUR_SIZE__SI__VI = 0x1A68; +constexpr unsigned int mmDCP0_CUR_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A69; +constexpr unsigned int mmDCP0_CUR_SURFACE_ADDRESS__SI__VI = 0x1A67; +constexpr unsigned int mmDCP0_CUR_UPDATE__SI__VI = 0x1A6E; +constexpr unsigned int mmDCP0_DCP_CRC_CONTROL__SI__VI = 0x1A87; +constexpr unsigned int mmDCP0_DCP_CRC_CURRENT__SI__VI = 0x1A89; +constexpr unsigned int mmDCP0_DCP_CRC_LAST__SI__VI = 0x1A8B; +constexpr unsigned int mmDCP0_DCP_CRC_MASK__SI__VI = 0x1A88; +constexpr unsigned int mmDCP0_DCP_DEBUG__SI__VI = 0x1A8D; +constexpr unsigned int mmDCP0_DCP_LB_DATA_GAP_BETWEEN_CHUNK__SI__VI = 0x1A91; +constexpr unsigned int mmDCP0_DCP_TEST_DEBUG_DATA__SI__VI = 0x1A96; +constexpr unsigned int mmDCP0_DCP_TEST_DEBUG_INDEX__SI__VI = 0x1A95; +constexpr unsigned int mmDCP0_DC_LUT_30_COLOR__SI__VI = 0x1A7C; +constexpr unsigned int mmDCP0_DC_LUT_AUTOFILL__SI__VI = 0x1A7F; +constexpr unsigned int mmDCP0_DC_LUT_BLACK_OFFSET_BLUE__SI__VI = 0x1A81; +constexpr unsigned int mmDCP0_DC_LUT_BLACK_OFFSET_GREEN__SI__VI = 0x1A82; +constexpr unsigned int mmDCP0_DC_LUT_BLACK_OFFSET_RED__SI__VI = 0x1A83; +constexpr unsigned int mmDCP0_DC_LUT_CONTROL__SI__VI = 0x1A80; +constexpr unsigned int mmDCP0_DC_LUT_PWL_DATA__SI__VI = 0x1A7B; +constexpr unsigned int mmDCP0_DC_LUT_RW_INDEX__SI__VI = 0x1A79; +constexpr unsigned int mmDCP0_DC_LUT_RW_MODE__SI__VI = 0x1A78; +constexpr unsigned int mmDCP0_DC_LUT_SEQ_COLOR__SI__VI = 0x1A7A; +constexpr unsigned int mmDCP0_DC_LUT_WHITE_OFFSET_BLUE__SI__VI = 0x1A84; +constexpr unsigned int mmDCP0_DC_LUT_WHITE_OFFSET_GREEN__SI__VI = 0x1A85; +constexpr unsigned int mmDCP0_DC_LUT_WHITE_OFFSET_RED__SI__VI = 0x1A86; +constexpr unsigned int mmDCP0_DC_LUT_WRITE_EN_MASK__SI__VI = 0x1A7E; +constexpr unsigned int mmDCP0_GRPH_COMPRESS_PITCH__SI__VI = 0x1A1A; +constexpr unsigned int mmDCP0_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A1B; +constexpr unsigned int mmDCP0_GRPH_COMPRESS_SURFACE_ADDRESS__SI__VI = 0x1A19; +constexpr unsigned int mmDCP0_GRPH_CONTROL = 0x1A01; +constexpr unsigned int mmDCP0_GRPH_DFQ_CONTROL__SI__VI = 0x1A14; +constexpr unsigned int mmDCP0_GRPH_DFQ_STATUS__SI__VI = 0x1A15; +constexpr unsigned int mmDCP0_GRPH_ENABLE__SI__VI = 0x1A00; +constexpr unsigned int mmDCP0_GRPH_FLIP_CONTROL = 0x1A12; +constexpr unsigned int mmDCP0_GRPH_INTERRUPT_CONTROL__SI__VI = 0x1A17; +constexpr unsigned int mmDCP0_GRPH_INTERRUPT_STATUS__SI__VI = 0x1A16; +constexpr unsigned int mmDCP0_GRPH_LUT_10BIT_BYPASS__SI__VI = 0x1A02; +constexpr unsigned int mmDCP0_GRPH_PITCH = 0x1A06; +constexpr unsigned int mmDCP0_GRPH_PRIMARY_SURFACE_ADDRESS = 0x1A04; +constexpr unsigned int mmDCP0_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH = 0x1A07; +constexpr unsigned int mmDCP0_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A08; +constexpr unsigned int mmDCP0_GRPH_SECONDARY_SURFACE_ADDRESS__SI__VI = 0x1A05; +constexpr unsigned int mmDCP0_GRPH_SURFACE_ADDRESS_HIGH_INUSE__SI__VI = 0x1A18; +constexpr unsigned int mmDCP0_GRPH_SURFACE_ADDRESS_INUSE__SI__VI = 0x1A13; +constexpr unsigned int mmDCP0_GRPH_SURFACE_OFFSET_X__SI__VI = 0x1A09; +constexpr unsigned int mmDCP0_GRPH_SURFACE_OFFSET_Y__SI__VI = 0x1A0A; +constexpr unsigned int mmDCP0_GRPH_SWAP_CNTL__SI__VI = 0x1A03; +constexpr unsigned int mmDCP0_GRPH_UPDATE = 0x1A11; +constexpr unsigned int mmDCP0_GRPH_X_END__SI__VI = 0x1A0D; +constexpr unsigned int mmDCP0_GRPH_X_START__SI__VI = 0x1A0B; +constexpr unsigned int mmDCP0_GRPH_Y_END__SI__VI = 0x1A0E; +constexpr unsigned int mmDCP0_GRPH_Y_START__SI__VI = 0x1A0C; +constexpr unsigned int mmDCP0_OVLSCL_EDGE_PIXEL_CNTL__SI__VI = 0x1A2C; +constexpr unsigned int mmDCP0_OVL_CONTROL1__SI__VI = 0x1A1D; +constexpr unsigned int mmDCP0_OVL_CONTROL2__SI__VI = 0x1A1E; +constexpr unsigned int mmDCP0_OVL_DFQ_CONTROL__SI__VI = 0x1A29; +constexpr unsigned int mmDCP0_OVL_DFQ_STATUS__SI__VI = 0x1A2A; +constexpr unsigned int mmDCP0_OVL_ENABLE__SI__VI = 0x1A1C; +constexpr unsigned int mmDCP0_OVL_END__SI__VI = 0x1A26; +constexpr unsigned int mmDCP0_OVL_PITCH__SI__VI = 0x1A21; +constexpr unsigned int mmDCP0_OVL_START__SI__VI = 0x1A25; +constexpr unsigned int mmDCP0_OVL_SURFACE_ADDRESS = 0x1A20; +constexpr unsigned int mmDCP0_OVL_SURFACE_ADDRESS_HIGH = 0x1A22; +constexpr unsigned int mmDCP0_OVL_SURFACE_ADDRESS_HIGH_INUSE__SI__VI = 0x1A2B; +constexpr unsigned int mmDCP0_OVL_SURFACE_ADDRESS_INUSE__SI__VI = 0x1A28; +constexpr unsigned int mmDCP0_OVL_SURFACE_OFFSET_X__SI__VI = 0x1A23; +constexpr unsigned int mmDCP0_OVL_SURFACE_OFFSET_Y__SI__VI = 0x1A24; +constexpr unsigned int mmDCP0_OVL_SWAP_CNTL__SI__VI = 0x1A1F; +constexpr unsigned int mmDCP0_OVL_UPDATE__SI__VI = 0x1A27; +constexpr unsigned int mmDCP1_CUR_COLOR1__SI = 0x1D6C; +constexpr unsigned int mmDCP1_CUR_COLOR2__SI = 0x1D6D; +constexpr unsigned int mmDCP1_CUR_CONTROL__SI = 0x1D66; +constexpr unsigned int mmDCP1_CUR_HOT_SPOT__SI = 0x1D6B; +constexpr unsigned int mmDCP1_CUR_POSITION__SI = 0x1D6A; +constexpr unsigned int mmDCP1_CUR_SIZE__SI = 0x1D68; +constexpr unsigned int mmDCP1_CUR_SURFACE_ADDRESS_HIGH__SI = 0x1D69; +constexpr unsigned int mmDCP1_CUR_SURFACE_ADDRESS__SI = 0x1D67; +constexpr unsigned int mmDCP1_CUR_UPDATE__SI = 0x1D6E; +constexpr unsigned int mmDCP1_DCP_CRC_CONTROL__SI = 0x1D87; +constexpr unsigned int mmDCP1_DCP_CRC_CURRENT__SI = 0x1D89; +constexpr unsigned int mmDCP1_DCP_CRC_LAST__SI = 0x1D8B; +constexpr unsigned int mmDCP1_DCP_CRC_MASK__SI = 0x1D88; +constexpr unsigned int mmDCP1_DCP_DEBUG__SI = 0x1D8D; +constexpr unsigned int mmDCP1_DCP_LB_DATA_GAP_BETWEEN_CHUNK__SI = 0x1D91; +constexpr unsigned int mmDCP1_DCP_TEST_DEBUG_DATA__SI = 0x1D96; +constexpr unsigned int mmDCP1_DCP_TEST_DEBUG_INDEX__SI = 0x1D95; +constexpr unsigned int mmDCP1_DC_LUT_30_COLOR__SI = 0x1D7C; +constexpr unsigned int mmDCP1_DC_LUT_AUTOFILL__SI = 0x1D7F; +constexpr unsigned int mmDCP1_DC_LUT_BLACK_OFFSET_BLUE__SI = 0x1D81; +constexpr unsigned int mmDCP1_DC_LUT_BLACK_OFFSET_GREEN__SI = 0x1D82; +constexpr unsigned int mmDCP1_DC_LUT_BLACK_OFFSET_RED__SI = 0x1D83; +constexpr unsigned int mmDCP1_DC_LUT_CONTROL__SI = 0x1D80; +constexpr unsigned int mmDCP1_DC_LUT_PWL_DATA__SI = 0x1D7B; +constexpr unsigned int mmDCP1_DC_LUT_RW_INDEX__SI = 0x1D79; +constexpr unsigned int mmDCP1_DC_LUT_RW_MODE__SI = 0x1D78; +constexpr unsigned int mmDCP1_DC_LUT_SEQ_COLOR__SI = 0x1D7A; +constexpr unsigned int mmDCP1_DC_LUT_WHITE_OFFSET_BLUE__SI = 0x1D84; +constexpr unsigned int mmDCP1_DC_LUT_WHITE_OFFSET_GREEN__SI = 0x1D85; +constexpr unsigned int mmDCP1_DC_LUT_WHITE_OFFSET_RED__SI = 0x1D86; +constexpr unsigned int mmDCP1_DC_LUT_WRITE_EN_MASK__SI = 0x1D7E; +constexpr unsigned int mmDCP1_GRPH_COMPRESS_PITCH__SI = 0x1D1A; +constexpr unsigned int mmDCP1_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI = 0x1D1B; +constexpr unsigned int mmDCP1_GRPH_COMPRESS_SURFACE_ADDRESS__SI = 0x1D19; +constexpr unsigned int mmDCP1_GRPH_DFQ_CONTROL__SI = 0x1D14; +constexpr unsigned int mmDCP1_GRPH_DFQ_STATUS__SI = 0x1D15; +constexpr unsigned int mmDCP1_GRPH_ENABLE__SI = 0x1D00; +constexpr unsigned int mmDCP1_GRPH_INTERRUPT_CONTROL__SI = 0x1D17; +constexpr unsigned int mmDCP1_GRPH_INTERRUPT_STATUS__SI = 0x1D16; +constexpr unsigned int mmDCP1_GRPH_LUT_10BIT_BYPASS__SI = 0x1D02; +constexpr unsigned int mmDCP1_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SI = 0x1D07; +constexpr unsigned int mmDCP1_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI = 0x1D08; +constexpr unsigned int mmDCP1_GRPH_SECONDARY_SURFACE_ADDRESS__SI = 0x1D05; +constexpr unsigned int mmDCP1_GRPH_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x1D18; +constexpr unsigned int mmDCP1_GRPH_SURFACE_ADDRESS_INUSE__SI = 0x1D13; +constexpr unsigned int mmDCP1_GRPH_SURFACE_OFFSET_X__SI = 0x1D09; +constexpr unsigned int mmDCP1_GRPH_SURFACE_OFFSET_Y__SI = 0x1D0A; +constexpr unsigned int mmDCP1_GRPH_SWAP_CNTL__SI = 0x1D03; +constexpr unsigned int mmDCP1_GRPH_X_END__SI = 0x1D0D; +constexpr unsigned int mmDCP1_GRPH_X_START__SI = 0x1D0B; +constexpr unsigned int mmDCP1_GRPH_Y_END__SI = 0x1D0E; +constexpr unsigned int mmDCP1_GRPH_Y_START__SI = 0x1D0C; +constexpr unsigned int mmDCP1_OVLSCL_EDGE_PIXEL_CNTL__SI = 0x1D2C; +constexpr unsigned int mmDCP1_OVL_CONTROL1__SI = 0x1D1D; +constexpr unsigned int mmDCP1_OVL_CONTROL2__SI = 0x1D1E; +constexpr unsigned int mmDCP1_OVL_DFQ_CONTROL__SI = 0x1D29; +constexpr unsigned int mmDCP1_OVL_DFQ_STATUS__SI = 0x1D2A; +constexpr unsigned int mmDCP1_OVL_ENABLE__SI = 0x1D1C; +constexpr unsigned int mmDCP1_OVL_END__SI = 0x1D26; +constexpr unsigned int mmDCP1_OVL_PITCH__SI = 0x1D21; +constexpr unsigned int mmDCP1_OVL_START__SI = 0x1D25; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x1D2B; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS_HIGH__SI = 0x1D22; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS_INUSE__SI = 0x1D28; +constexpr unsigned int mmDCP1_OVL_SURFACE_OFFSET_X__SI = 0x1D23; +constexpr unsigned int mmDCP1_OVL_SURFACE_OFFSET_Y__SI = 0x1D24; +constexpr unsigned int mmDCP1_OVL_SWAP_CNTL__SI = 0x1D1F; +constexpr unsigned int mmDCP1_OVL_UPDATE__SI = 0x1D27; +constexpr unsigned int mmDCP2_CUR_COLOR1__SI = 0x406C; +constexpr unsigned int mmDCP2_CUR_COLOR2__SI = 0x406D; +constexpr unsigned int mmDCP2_CUR_CONTROL__SI = 0x4066; +constexpr unsigned int mmDCP2_CUR_HOT_SPOT__SI = 0x406B; +constexpr unsigned int mmDCP2_CUR_POSITION__SI = 0x406A; +constexpr unsigned int mmDCP2_CUR_SIZE__SI = 0x4068; +constexpr unsigned int mmDCP2_CUR_SURFACE_ADDRESS_HIGH__SI = 0x4069; +constexpr unsigned int mmDCP2_CUR_SURFACE_ADDRESS__SI = 0x4067; +constexpr unsigned int mmDCP2_CUR_UPDATE__SI = 0x406E; +constexpr unsigned int mmDCP2_DCP_CRC_CONTROL__SI = 0x4087; +constexpr unsigned int mmDCP2_DCP_CRC_CURRENT__SI = 0x4089; +constexpr unsigned int mmDCP2_DCP_CRC_LAST__SI = 0x408B; +constexpr unsigned int mmDCP2_DCP_CRC_MASK__SI = 0x4088; +constexpr unsigned int mmDCP2_DCP_DEBUG__SI = 0x408D; +constexpr unsigned int mmDCP2_DCP_LB_DATA_GAP_BETWEEN_CHUNK__SI = 0x4091; +constexpr unsigned int mmDCP2_DCP_TEST_DEBUG_DATA__SI = 0x4096; +constexpr unsigned int mmDCP2_DCP_TEST_DEBUG_INDEX__SI = 0x4095; +constexpr unsigned int mmDCP2_DC_LUT_30_COLOR__SI = 0x407C; +constexpr unsigned int mmDCP2_DC_LUT_AUTOFILL__SI = 0x407F; +constexpr unsigned int mmDCP2_DC_LUT_BLACK_OFFSET_BLUE__SI = 0x4081; +constexpr unsigned int mmDCP2_DC_LUT_BLACK_OFFSET_GREEN__SI = 0x4082; +constexpr unsigned int mmDCP2_DC_LUT_BLACK_OFFSET_RED__SI = 0x4083; +constexpr unsigned int mmDCP2_DC_LUT_CONTROL__SI = 0x4080; +constexpr unsigned int mmDCP2_DC_LUT_PWL_DATA__SI = 0x407B; +constexpr unsigned int mmDCP2_DC_LUT_RW_INDEX__SI = 0x4079; +constexpr unsigned int mmDCP2_DC_LUT_RW_MODE__SI = 0x4078; +constexpr unsigned int mmDCP2_DC_LUT_SEQ_COLOR__SI = 0x407A; +constexpr unsigned int mmDCP2_DC_LUT_WHITE_OFFSET_BLUE__SI = 0x4084; +constexpr unsigned int mmDCP2_DC_LUT_WHITE_OFFSET_GREEN__SI = 0x4085; +constexpr unsigned int mmDCP2_DC_LUT_WHITE_OFFSET_RED__SI = 0x4086; +constexpr unsigned int mmDCP2_DC_LUT_WRITE_EN_MASK__SI = 0x407E; +constexpr unsigned int mmDCP2_GRPH_COMPRESS_PITCH__SI = 0x401A; +constexpr unsigned int mmDCP2_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI = 0x401B; +constexpr unsigned int mmDCP2_GRPH_COMPRESS_SURFACE_ADDRESS__SI = 0x4019; +constexpr unsigned int mmDCP2_GRPH_DFQ_CONTROL__SI = 0x4014; +constexpr unsigned int mmDCP2_GRPH_DFQ_STATUS__SI = 0x4015; +constexpr unsigned int mmDCP2_GRPH_ENABLE__SI = 0x4000; +constexpr unsigned int mmDCP2_GRPH_INTERRUPT_CONTROL__SI = 0x4017; +constexpr unsigned int mmDCP2_GRPH_INTERRUPT_STATUS__SI = 0x4016; +constexpr unsigned int mmDCP2_GRPH_LUT_10BIT_BYPASS__SI = 0x4002; +constexpr unsigned int mmDCP2_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SI = 0x4007; +constexpr unsigned int mmDCP2_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI = 0x4008; +constexpr unsigned int mmDCP2_GRPH_SECONDARY_SURFACE_ADDRESS__SI = 0x4005; +constexpr unsigned int mmDCP2_GRPH_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x4018; +constexpr unsigned int mmDCP2_GRPH_SURFACE_ADDRESS_INUSE__SI = 0x4013; +constexpr unsigned int mmDCP2_GRPH_SURFACE_OFFSET_X__SI = 0x4009; +constexpr unsigned int mmDCP2_GRPH_SURFACE_OFFSET_Y__SI = 0x400A; +constexpr unsigned int mmDCP2_GRPH_SWAP_CNTL__SI = 0x4003; +constexpr unsigned int mmDCP2_GRPH_X_END__SI = 0x400D; +constexpr unsigned int mmDCP2_GRPH_X_START__SI = 0x400B; +constexpr unsigned int mmDCP2_GRPH_Y_END__SI = 0x400E; +constexpr unsigned int mmDCP2_GRPH_Y_START__SI = 0x400C; +constexpr unsigned int mmDCP2_OVLSCL_EDGE_PIXEL_CNTL__SI = 0x402C; +constexpr unsigned int mmDCP2_OVL_CONTROL1__SI = 0x401D; +constexpr unsigned int mmDCP2_OVL_CONTROL2__SI = 0x401E; +constexpr unsigned int mmDCP2_OVL_DFQ_CONTROL__SI = 0x4029; +constexpr unsigned int mmDCP2_OVL_DFQ_STATUS__SI = 0x402A; +constexpr unsigned int mmDCP2_OVL_ENABLE__SI = 0x401C; +constexpr unsigned int mmDCP2_OVL_END__SI = 0x4026; +constexpr unsigned int mmDCP2_OVL_PITCH__SI = 0x4021; +constexpr unsigned int mmDCP2_OVL_START__SI = 0x4025; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x402B; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS_HIGH__SI = 0x4022; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS_INUSE__SI = 0x4028; +constexpr unsigned int mmDCP2_OVL_SURFACE_OFFSET_X__SI = 0x4023; +constexpr unsigned int mmDCP2_OVL_SURFACE_OFFSET_Y__SI = 0x4024; +constexpr unsigned int mmDCP2_OVL_SWAP_CNTL__SI = 0x401F; +constexpr unsigned int mmDCP2_OVL_UPDATE__SI = 0x4027; +constexpr unsigned int mmDCP3_CUR_COLOR1__SI = 0x436C; +constexpr unsigned int mmDCP3_CUR_COLOR2__SI = 0x436D; +constexpr unsigned int mmDCP3_CUR_CONTROL__SI = 0x4366; +constexpr unsigned int mmDCP3_CUR_HOT_SPOT__SI = 0x436B; +constexpr unsigned int mmDCP3_CUR_POSITION__SI = 0x436A; +constexpr unsigned int mmDCP3_CUR_SIZE__SI = 0x4368; +constexpr unsigned int mmDCP3_CUR_SURFACE_ADDRESS_HIGH__SI = 0x4369; +constexpr unsigned int mmDCP3_CUR_SURFACE_ADDRESS__SI = 0x4367; +constexpr unsigned int mmDCP3_CUR_UPDATE__SI = 0x436E; +constexpr unsigned int mmDCP3_DCP_CRC_CONTROL__SI = 0x4387; +constexpr unsigned int mmDCP3_DCP_CRC_CURRENT__SI = 0x4389; +constexpr unsigned int mmDCP3_DCP_CRC_LAST__SI = 0x438B; +constexpr unsigned int mmDCP3_DCP_CRC_MASK__SI = 0x4388; +constexpr unsigned int mmDCP3_DCP_DEBUG__SI = 0x438D; +constexpr unsigned int mmDCP3_DCP_LB_DATA_GAP_BETWEEN_CHUNK__SI = 0x4391; +constexpr unsigned int mmDCP3_DCP_TEST_DEBUG_DATA__SI = 0x4396; +constexpr unsigned int mmDCP3_DCP_TEST_DEBUG_INDEX__SI = 0x4395; +constexpr unsigned int mmDCP3_DC_LUT_30_COLOR__SI = 0x437C; +constexpr unsigned int mmDCP3_DC_LUT_AUTOFILL__SI = 0x437F; +constexpr unsigned int mmDCP3_DC_LUT_BLACK_OFFSET_BLUE__SI = 0x4381; +constexpr unsigned int mmDCP3_DC_LUT_BLACK_OFFSET_GREEN__SI = 0x4382; +constexpr unsigned int mmDCP3_DC_LUT_BLACK_OFFSET_RED__SI = 0x4383; +constexpr unsigned int mmDCP3_DC_LUT_CONTROL__SI = 0x4380; +constexpr unsigned int mmDCP3_DC_LUT_PWL_DATA__SI = 0x437B; +constexpr unsigned int mmDCP3_DC_LUT_RW_INDEX__SI = 0x4379; +constexpr unsigned int mmDCP3_DC_LUT_RW_MODE__SI = 0x4378; +constexpr unsigned int mmDCP3_DC_LUT_SEQ_COLOR__SI = 0x437A; +constexpr unsigned int mmDCP3_DC_LUT_WHITE_OFFSET_BLUE__SI = 0x4384; +constexpr unsigned int mmDCP3_DC_LUT_WHITE_OFFSET_GREEN__SI = 0x4385; +constexpr unsigned int mmDCP3_DC_LUT_WHITE_OFFSET_RED__SI = 0x4386; +constexpr unsigned int mmDCP3_DC_LUT_WRITE_EN_MASK__SI = 0x437E; +constexpr unsigned int mmDCP3_GRPH_COMPRESS_PITCH__SI = 0x431A; +constexpr unsigned int mmDCP3_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI = 0x431B; +constexpr unsigned int mmDCP3_GRPH_COMPRESS_SURFACE_ADDRESS__SI = 0x4319; +constexpr unsigned int mmDCP3_GRPH_DFQ_CONTROL__SI = 0x4314; +constexpr unsigned int mmDCP3_GRPH_DFQ_STATUS__SI = 0x4315; +constexpr unsigned int mmDCP3_GRPH_ENABLE__SI = 0x4300; +constexpr unsigned int mmDCP3_GRPH_INTERRUPT_CONTROL__SI = 0x4317; +constexpr unsigned int mmDCP3_GRPH_INTERRUPT_STATUS__SI = 0x4316; +constexpr unsigned int mmDCP3_GRPH_LUT_10BIT_BYPASS__SI = 0x4302; +constexpr unsigned int mmDCP3_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SI = 0x4307; +constexpr unsigned int mmDCP3_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI = 0x4308; +constexpr unsigned int mmDCP3_GRPH_SECONDARY_SURFACE_ADDRESS__SI = 0x4305; +constexpr unsigned int mmDCP3_GRPH_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x4318; +constexpr unsigned int mmDCP3_GRPH_SURFACE_ADDRESS_INUSE__SI = 0x4313; +constexpr unsigned int mmDCP3_GRPH_SURFACE_OFFSET_X__SI = 0x4309; +constexpr unsigned int mmDCP3_GRPH_SURFACE_OFFSET_Y__SI = 0x430A; +constexpr unsigned int mmDCP3_GRPH_SWAP_CNTL__SI = 0x4303; +constexpr unsigned int mmDCP3_GRPH_X_END__SI = 0x430D; +constexpr unsigned int mmDCP3_GRPH_X_START__SI = 0x430B; +constexpr unsigned int mmDCP3_GRPH_Y_END__SI = 0x430E; +constexpr unsigned int mmDCP3_GRPH_Y_START__SI = 0x430C; +constexpr unsigned int mmDCP3_OVLSCL_EDGE_PIXEL_CNTL__SI = 0x432C; +constexpr unsigned int mmDCP3_OVL_CONTROL1__SI = 0x431D; +constexpr unsigned int mmDCP3_OVL_CONTROL2__SI = 0x431E; +constexpr unsigned int mmDCP3_OVL_DFQ_CONTROL__SI = 0x4329; +constexpr unsigned int mmDCP3_OVL_DFQ_STATUS__SI = 0x432A; +constexpr unsigned int mmDCP3_OVL_ENABLE__SI = 0x431C; +constexpr unsigned int mmDCP3_OVL_END__SI = 0x4326; +constexpr unsigned int mmDCP3_OVL_PITCH__SI = 0x4321; +constexpr unsigned int mmDCP3_OVL_START__SI = 0x4325; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x432B; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS_HIGH__SI = 0x4322; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS_INUSE__SI = 0x4328; +constexpr unsigned int mmDCP3_OVL_SURFACE_OFFSET_X__SI = 0x4323; +constexpr unsigned int mmDCP3_OVL_SURFACE_OFFSET_Y__SI = 0x4324; +constexpr unsigned int mmDCP3_OVL_SWAP_CNTL__SI = 0x431F; +constexpr unsigned int mmDCP3_OVL_UPDATE__SI = 0x4327; +constexpr unsigned int mmDCP4_CUR_COLOR1__SI = 0x466C; +constexpr unsigned int mmDCP4_CUR_COLOR2__SI = 0x466D; +constexpr unsigned int mmDCP4_CUR_CONTROL__SI = 0x4666; +constexpr unsigned int mmDCP4_CUR_HOT_SPOT__SI = 0x466B; +constexpr unsigned int mmDCP4_CUR_POSITION__SI = 0x466A; +constexpr unsigned int mmDCP4_CUR_SIZE__SI = 0x4668; +constexpr unsigned int mmDCP4_CUR_SURFACE_ADDRESS_HIGH__SI = 0x4669; +constexpr unsigned int mmDCP4_CUR_SURFACE_ADDRESS__SI = 0x4667; +constexpr unsigned int mmDCP4_CUR_UPDATE__SI = 0x466E; +constexpr unsigned int mmDCP4_DCP_CRC_CONTROL__SI = 0x4687; +constexpr unsigned int mmDCP4_DCP_CRC_CURRENT__SI = 0x4689; +constexpr unsigned int mmDCP4_DCP_CRC_LAST__SI = 0x468B; +constexpr unsigned int mmDCP4_DCP_CRC_MASK__SI = 0x4688; +constexpr unsigned int mmDCP4_DCP_DEBUG__SI = 0x468D; +constexpr unsigned int mmDCP4_DCP_LB_DATA_GAP_BETWEEN_CHUNK__SI = 0x4691; +constexpr unsigned int mmDCP4_DCP_TEST_DEBUG_DATA__SI = 0x4696; +constexpr unsigned int mmDCP4_DCP_TEST_DEBUG_INDEX__SI = 0x4695; +constexpr unsigned int mmDCP4_DC_LUT_30_COLOR__SI = 0x467C; +constexpr unsigned int mmDCP4_DC_LUT_AUTOFILL__SI = 0x467F; +constexpr unsigned int mmDCP4_DC_LUT_BLACK_OFFSET_BLUE__SI = 0x4681; +constexpr unsigned int mmDCP4_DC_LUT_BLACK_OFFSET_GREEN__SI = 0x4682; +constexpr unsigned int mmDCP4_DC_LUT_BLACK_OFFSET_RED__SI = 0x4683; +constexpr unsigned int mmDCP4_DC_LUT_CONTROL__SI = 0x4680; +constexpr unsigned int mmDCP4_DC_LUT_PWL_DATA__SI = 0x467B; +constexpr unsigned int mmDCP4_DC_LUT_RW_INDEX__SI = 0x4679; +constexpr unsigned int mmDCP4_DC_LUT_RW_MODE__SI = 0x4678; +constexpr unsigned int mmDCP4_DC_LUT_SEQ_COLOR__SI = 0x467A; +constexpr unsigned int mmDCP4_DC_LUT_WHITE_OFFSET_BLUE__SI = 0x4684; +constexpr unsigned int mmDCP4_DC_LUT_WHITE_OFFSET_GREEN__SI = 0x4685; +constexpr unsigned int mmDCP4_DC_LUT_WHITE_OFFSET_RED__SI = 0x4686; +constexpr unsigned int mmDCP4_DC_LUT_WRITE_EN_MASK__SI = 0x467E; +constexpr unsigned int mmDCP4_GRPH_COMPRESS_PITCH__SI = 0x461A; +constexpr unsigned int mmDCP4_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI = 0x461B; +constexpr unsigned int mmDCP4_GRPH_COMPRESS_SURFACE_ADDRESS__SI = 0x4619; +constexpr unsigned int mmDCP4_GRPH_DFQ_CONTROL__SI = 0x4614; +constexpr unsigned int mmDCP4_GRPH_DFQ_STATUS__SI = 0x4615; +constexpr unsigned int mmDCP4_GRPH_ENABLE__SI = 0x4600; +constexpr unsigned int mmDCP4_GRPH_INTERRUPT_CONTROL__SI = 0x4617; +constexpr unsigned int mmDCP4_GRPH_INTERRUPT_STATUS__SI = 0x4616; +constexpr unsigned int mmDCP4_GRPH_LUT_10BIT_BYPASS__SI = 0x4602; +constexpr unsigned int mmDCP4_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SI = 0x4607; +constexpr unsigned int mmDCP4_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI = 0x4608; +constexpr unsigned int mmDCP4_GRPH_SECONDARY_SURFACE_ADDRESS__SI = 0x4605; +constexpr unsigned int mmDCP4_GRPH_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x4618; +constexpr unsigned int mmDCP4_GRPH_SURFACE_ADDRESS_INUSE__SI = 0x4613; +constexpr unsigned int mmDCP4_GRPH_SURFACE_OFFSET_X__SI = 0x4609; +constexpr unsigned int mmDCP4_GRPH_SURFACE_OFFSET_Y__SI = 0x460A; +constexpr unsigned int mmDCP4_GRPH_SWAP_CNTL__SI = 0x4603; +constexpr unsigned int mmDCP4_GRPH_X_END__SI = 0x460D; +constexpr unsigned int mmDCP4_GRPH_X_START__SI = 0x460B; +constexpr unsigned int mmDCP4_GRPH_Y_END__SI = 0x460E; +constexpr unsigned int mmDCP4_GRPH_Y_START__SI = 0x460C; +constexpr unsigned int mmDCP4_OVLSCL_EDGE_PIXEL_CNTL__SI = 0x462C; +constexpr unsigned int mmDCP4_OVL_CONTROL1__SI = 0x461D; +constexpr unsigned int mmDCP4_OVL_CONTROL2__SI = 0x461E; +constexpr unsigned int mmDCP4_OVL_DFQ_CONTROL__SI = 0x4629; +constexpr unsigned int mmDCP4_OVL_DFQ_STATUS__SI = 0x462A; +constexpr unsigned int mmDCP4_OVL_ENABLE__SI = 0x461C; +constexpr unsigned int mmDCP4_OVL_END__SI = 0x4626; +constexpr unsigned int mmDCP4_OVL_PITCH__SI = 0x4621; +constexpr unsigned int mmDCP4_OVL_START__SI = 0x4625; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x462B; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS_HIGH__SI = 0x4622; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS_INUSE__SI = 0x4628; +constexpr unsigned int mmDCP4_OVL_SURFACE_OFFSET_X__SI = 0x4623; +constexpr unsigned int mmDCP4_OVL_SURFACE_OFFSET_Y__SI = 0x4624; +constexpr unsigned int mmDCP4_OVL_SWAP_CNTL__SI = 0x461F; +constexpr unsigned int mmDCP4_OVL_UPDATE__SI = 0x4627; +constexpr unsigned int mmDCP5_CUR_COLOR1__SI = 0x496C; +constexpr unsigned int mmDCP5_CUR_COLOR2__SI = 0x496D; +constexpr unsigned int mmDCP5_CUR_CONTROL__SI = 0x4966; +constexpr unsigned int mmDCP5_CUR_HOT_SPOT__SI = 0x496B; +constexpr unsigned int mmDCP5_CUR_POSITION__SI = 0x496A; +constexpr unsigned int mmDCP5_CUR_SIZE__SI = 0x4968; +constexpr unsigned int mmDCP5_CUR_SURFACE_ADDRESS_HIGH__SI = 0x4969; +constexpr unsigned int mmDCP5_CUR_SURFACE_ADDRESS__SI = 0x4967; +constexpr unsigned int mmDCP5_CUR_UPDATE__SI = 0x496E; +constexpr unsigned int mmDCP5_DCP_CRC_CONTROL__SI = 0x4987; +constexpr unsigned int mmDCP5_DCP_CRC_CURRENT__SI = 0x4989; +constexpr unsigned int mmDCP5_DCP_CRC_LAST__SI = 0x498B; +constexpr unsigned int mmDCP5_DCP_CRC_MASK__SI = 0x4988; +constexpr unsigned int mmDCP5_DCP_DEBUG__SI = 0x498D; +constexpr unsigned int mmDCP5_DCP_LB_DATA_GAP_BETWEEN_CHUNK__SI = 0x4991; +constexpr unsigned int mmDCP5_DCP_TEST_DEBUG_DATA__SI = 0x4996; +constexpr unsigned int mmDCP5_DCP_TEST_DEBUG_INDEX__SI = 0x4995; +constexpr unsigned int mmDCP5_DC_LUT_30_COLOR__SI = 0x497C; +constexpr unsigned int mmDCP5_DC_LUT_AUTOFILL__SI = 0x497F; +constexpr unsigned int mmDCP5_DC_LUT_BLACK_OFFSET_BLUE__SI = 0x4981; +constexpr unsigned int mmDCP5_DC_LUT_BLACK_OFFSET_GREEN__SI = 0x4982; +constexpr unsigned int mmDCP5_DC_LUT_BLACK_OFFSET_RED__SI = 0x4983; +constexpr unsigned int mmDCP5_DC_LUT_CONTROL__SI = 0x4980; +constexpr unsigned int mmDCP5_DC_LUT_PWL_DATA__SI = 0x497B; +constexpr unsigned int mmDCP5_DC_LUT_RW_INDEX__SI = 0x4979; +constexpr unsigned int mmDCP5_DC_LUT_RW_MODE__SI = 0x4978; +constexpr unsigned int mmDCP5_DC_LUT_SEQ_COLOR__SI = 0x497A; +constexpr unsigned int mmDCP5_DC_LUT_WHITE_OFFSET_BLUE__SI = 0x4984; +constexpr unsigned int mmDCP5_DC_LUT_WHITE_OFFSET_GREEN__SI = 0x4985; +constexpr unsigned int mmDCP5_DC_LUT_WHITE_OFFSET_RED__SI = 0x4986; +constexpr unsigned int mmDCP5_DC_LUT_WRITE_EN_MASK__SI = 0x497E; +constexpr unsigned int mmDCP5_GRPH_COMPRESS_PITCH__SI = 0x491A; +constexpr unsigned int mmDCP5_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI = 0x491B; +constexpr unsigned int mmDCP5_GRPH_COMPRESS_SURFACE_ADDRESS__SI = 0x4919; +constexpr unsigned int mmDCP5_GRPH_DFQ_CONTROL__SI = 0x4914; +constexpr unsigned int mmDCP5_GRPH_DFQ_STATUS__SI = 0x4915; +constexpr unsigned int mmDCP5_GRPH_ENABLE__SI = 0x4900; +constexpr unsigned int mmDCP5_GRPH_INTERRUPT_CONTROL__SI = 0x4917; +constexpr unsigned int mmDCP5_GRPH_INTERRUPT_STATUS__SI = 0x4916; +constexpr unsigned int mmDCP5_GRPH_LUT_10BIT_BYPASS__SI = 0x4902; +constexpr unsigned int mmDCP5_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SI = 0x4907; +constexpr unsigned int mmDCP5_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI = 0x4908; +constexpr unsigned int mmDCP5_GRPH_SECONDARY_SURFACE_ADDRESS__SI = 0x4905; +constexpr unsigned int mmDCP5_GRPH_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x4918; +constexpr unsigned int mmDCP5_GRPH_SURFACE_ADDRESS_INUSE__SI = 0x4913; +constexpr unsigned int mmDCP5_GRPH_SURFACE_OFFSET_X__SI = 0x4909; +constexpr unsigned int mmDCP5_GRPH_SURFACE_OFFSET_Y__SI = 0x490A; +constexpr unsigned int mmDCP5_GRPH_SWAP_CNTL__SI = 0x4903; +constexpr unsigned int mmDCP5_GRPH_X_END__SI = 0x490D; +constexpr unsigned int mmDCP5_GRPH_X_START__SI = 0x490B; +constexpr unsigned int mmDCP5_GRPH_Y_END__SI = 0x490E; +constexpr unsigned int mmDCP5_GRPH_Y_START__SI = 0x490C; +constexpr unsigned int mmDCP5_OVLSCL_EDGE_PIXEL_CNTL__SI = 0x492C; +constexpr unsigned int mmDCP5_OVL_CONTROL1__SI = 0x491D; +constexpr unsigned int mmDCP5_OVL_CONTROL2__SI = 0x491E; +constexpr unsigned int mmDCP5_OVL_DFQ_CONTROL__SI = 0x4929; +constexpr unsigned int mmDCP5_OVL_DFQ_STATUS__SI = 0x492A; +constexpr unsigned int mmDCP5_OVL_ENABLE__SI = 0x491C; +constexpr unsigned int mmDCP5_OVL_END__SI = 0x4926; +constexpr unsigned int mmDCP5_OVL_PITCH__SI = 0x4921; +constexpr unsigned int mmDCP5_OVL_START__SI = 0x4925; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS_HIGH_INUSE__SI = 0x492B; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS_HIGH__SI = 0x4922; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS_INUSE__SI = 0x4928; +constexpr unsigned int mmDCP5_OVL_SURFACE_OFFSET_X__SI = 0x4923; +constexpr unsigned int mmDCP5_OVL_SURFACE_OFFSET_Y__SI = 0x4924; +constexpr unsigned int mmDCP5_OVL_SWAP_CNTL__SI = 0x491F; +constexpr unsigned int mmDCP5_OVL_UPDATE__SI = 0x4927; +constexpr unsigned int mmDCP_CRC_CONTROL__SI__VI = 0x1A87; +constexpr unsigned int mmDCP_CRC_CURRENT__SI__VI = 0x1A89; +constexpr unsigned int mmDCP_CRC_LAST__SI__VI = 0x1A8B; +constexpr unsigned int mmDCP_CRC_MASK__SI__VI = 0x1A88; +constexpr unsigned int mmDCP_DEBUG__SI__VI = 0x1A8D; +constexpr unsigned int mmDCP_LB_DATA_GAP_BETWEEN_CHUNK__SI__VI = 0x1A91; +constexpr unsigned int mmDCP_TEST_DEBUG_DATA__SI__VI = 0x1A96; +constexpr unsigned int mmDCP_TEST_DEBUG_INDEX__SI__VI = 0x1A95; +constexpr unsigned int mmDC_ABM1_ACE_CNTL_MISC__SI__VI = 0x1641; +constexpr unsigned int mmDC_ABM1_ACE_OFFSET_SLOPE_0__SI__VI = 0x163A; +constexpr unsigned int mmDC_ABM1_ACE_OFFSET_SLOPE_1__SI__VI = 0x163B; +constexpr unsigned int mmDC_ABM1_ACE_OFFSET_SLOPE_2__SI__VI = 0x163C; +constexpr unsigned int mmDC_ABM1_ACE_OFFSET_SLOPE_3__SI__VI = 0x163D; +constexpr unsigned int mmDC_ABM1_ACE_OFFSET_SLOPE_4__SI__VI = 0x163E; +constexpr unsigned int mmDC_ABM1_ACE_THRES_12__SI__VI = 0x163F; +constexpr unsigned int mmDC_ABM1_ACE_THRES_34__SI__VI = 0x1640; +constexpr unsigned int mmDC_ABM1_BL_MASTER_LOCK__SI__VI = 0x169C; +constexpr unsigned int mmDC_ABM1_CNTL__SI__VI = 0x1638; +constexpr unsigned int mmDC_ABM1_DEBUG_MISC__SI__VI = 0x1649; +constexpr unsigned int mmDC_ABM1_HGLS_REG_READ_PROGRESS__SI__VI = 0x164A; +constexpr unsigned int mmDC_ABM1_HG_BIN_17_24_SHIFT_INDEX__SI__VI = 0x1659; +constexpr unsigned int mmDC_ABM1_HG_BIN_1_32_SHIFT_FLAG__SI__VI = 0x1656; +constexpr unsigned int mmDC_ABM1_HG_BIN_1_8_SHIFT_INDEX__SI__VI = 0x1657; +constexpr unsigned int mmDC_ABM1_HG_BIN_25_32_SHIFT_INDEX__SI__VI = 0x165A; +constexpr unsigned int mmDC_ABM1_HG_BIN_9_16_SHIFT_INDEX__SI__VI = 0x1658; +constexpr unsigned int mmDC_ABM1_HG_MISC_CTRL__SI__VI = 0x164B; +constexpr unsigned int mmDC_ABM1_HG_RESULT_10__SI__VI = 0x1664; +constexpr unsigned int mmDC_ABM1_HG_RESULT_11__SI__VI = 0x1665; +constexpr unsigned int mmDC_ABM1_HG_RESULT_12__SI__VI = 0x1666; +constexpr unsigned int mmDC_ABM1_HG_RESULT_13__SI__VI = 0x1667; +constexpr unsigned int mmDC_ABM1_HG_RESULT_14__SI__VI = 0x1668; +constexpr unsigned int mmDC_ABM1_HG_RESULT_15__SI__VI = 0x1669; +constexpr unsigned int mmDC_ABM1_HG_RESULT_16__SI__VI = 0x166A; +constexpr unsigned int mmDC_ABM1_HG_RESULT_17__SI__VI = 0x166B; +constexpr unsigned int mmDC_ABM1_HG_RESULT_18__SI__VI = 0x166C; +constexpr unsigned int mmDC_ABM1_HG_RESULT_19__SI__VI = 0x166D; +constexpr unsigned int mmDC_ABM1_HG_RESULT_1__SI__VI = 0x165B; +constexpr unsigned int mmDC_ABM1_HG_RESULT_20__SI__VI = 0x166E; +constexpr unsigned int mmDC_ABM1_HG_RESULT_21__SI__VI = 0x166F; +constexpr unsigned int mmDC_ABM1_HG_RESULT_22__SI__VI = 0x1670; +constexpr unsigned int mmDC_ABM1_HG_RESULT_23__SI__VI = 0x1671; +constexpr unsigned int mmDC_ABM1_HG_RESULT_24__SI__VI = 0x1672; +constexpr unsigned int mmDC_ABM1_HG_RESULT_2__SI__VI = 0x165C; +constexpr unsigned int mmDC_ABM1_HG_RESULT_3__SI__VI = 0x165D; +constexpr unsigned int mmDC_ABM1_HG_RESULT_4__SI__VI = 0x165E; +constexpr unsigned int mmDC_ABM1_HG_RESULT_5__SI__VI = 0x165F; +constexpr unsigned int mmDC_ABM1_HG_RESULT_6__SI__VI = 0x1660; +constexpr unsigned int mmDC_ABM1_HG_RESULT_7__SI__VI = 0x1661; +constexpr unsigned int mmDC_ABM1_HG_RESULT_8__SI__VI = 0x1662; +constexpr unsigned int mmDC_ABM1_HG_RESULT_9__SI__VI = 0x1663; +constexpr unsigned int mmDC_ABM1_HG_SAMPLE_RATE__SI__VI = 0x1654; +constexpr unsigned int mmDC_ABM1_IPCSC_COEFF_SEL__SI__VI = 0x1639; +constexpr unsigned int mmDC_ABM1_LS_FILTERED_MIN_MAX_LUMA__SI__VI = 0x164E; +constexpr unsigned int mmDC_ABM1_LS_MAX_PIXEL_VALUE_COUNT__SI__VI = 0x1653; +constexpr unsigned int mmDC_ABM1_LS_MIN_MAX_LUMA__SI__VI = 0x164D; +constexpr unsigned int mmDC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__SI__VI = 0x1651; +constexpr unsigned int mmDC_ABM1_LS_MIN_PIXEL_VALUE_COUNT__SI__VI = 0x1652; +constexpr unsigned int mmDC_ABM1_LS_OVR_SCAN_BIN__SI__VI = 0x1650; +constexpr unsigned int mmDC_ABM1_LS_PIXEL_COUNT__SI__VI = 0x164F; +constexpr unsigned int mmDC_ABM1_LS_SAMPLE_RATE__SI__VI = 0x1655; +constexpr unsigned int mmDC_ABM1_LS_SUM_OF_LUMA__SI__VI = 0x164C; +constexpr unsigned int mmDC_DMCU_SCRATCH__SI__VI = 0x1618; +constexpr unsigned int mmDC_GENERICA__SI = 0x1900; +constexpr unsigned int mmDC_GENERICB__SI = 0x1901; +constexpr unsigned int mmDC_GPIO_DDC1_A__SI = 0x190D; +constexpr unsigned int mmDC_GPIO_DDC1_EN__SI = 0x190E; +constexpr unsigned int mmDC_GPIO_DDC1_MASK__SI = 0x190C; +constexpr unsigned int mmDC_GPIO_DDC1_Y__SI = 0x190F; +constexpr unsigned int mmDC_GPIO_DDC2_A__SI = 0x1911; +constexpr unsigned int mmDC_GPIO_DDC2_EN__SI = 0x1912; +constexpr unsigned int mmDC_GPIO_DDC2_MASK__SI = 0x1910; +constexpr unsigned int mmDC_GPIO_DDC2_Y__SI = 0x1913; +constexpr unsigned int mmDC_GPIO_DDC3_A__SI = 0x1915; +constexpr unsigned int mmDC_GPIO_DDC3_EN__SI = 0x1916; +constexpr unsigned int mmDC_GPIO_DDC3_MASK__SI = 0x1914; +constexpr unsigned int mmDC_GPIO_DDC3_Y__SI = 0x1917; +constexpr unsigned int mmDC_GPIO_DDC4_A__SI = 0x1919; +constexpr unsigned int mmDC_GPIO_DDC4_EN__SI = 0x191A; +constexpr unsigned int mmDC_GPIO_DDC4_MASK__SI = 0x1918; +constexpr unsigned int mmDC_GPIO_DDC4_Y__SI = 0x191B; +constexpr unsigned int mmDC_GPIO_DDC5_A__SI = 0x191D; +constexpr unsigned int mmDC_GPIO_DDC5_EN__SI = 0x191E; +constexpr unsigned int mmDC_GPIO_DDC5_MASK__SI = 0x191C; +constexpr unsigned int mmDC_GPIO_DDC5_Y__SI = 0x191F; +constexpr unsigned int mmDC_GPIO_DDC6_A__SI = 0x1921; +constexpr unsigned int mmDC_GPIO_DDC6_EN__SI = 0x1922; +constexpr unsigned int mmDC_GPIO_DDC6_MASK__SI = 0x1920; +constexpr unsigned int mmDC_GPIO_DDC6_Y__SI = 0x1923; +constexpr unsigned int mmDC_GPIO_DEBUG__SI = 0x1946; +constexpr unsigned int mmDC_GPIO_DVODATA_A__SI = 0x1909; +constexpr unsigned int mmDC_GPIO_DVODATA_EN__SI = 0x190A; +constexpr unsigned int mmDC_GPIO_DVODATA_MASK__SI = 0x1908; +constexpr unsigned int mmDC_GPIO_DVODATA_Y__SI = 0x190B; +constexpr unsigned int mmDC_GPIO_GENERIC_A__SI = 0x1905; +constexpr unsigned int mmDC_GPIO_GENERIC_EN__SI = 0x1906; +constexpr unsigned int mmDC_GPIO_GENERIC_MASK__SI = 0x1904; +constexpr unsigned int mmDC_GPIO_GENERIC_Y__SI = 0x1907; +constexpr unsigned int mmDC_GPIO_HPD_A__SI = 0x192D; +constexpr unsigned int mmDC_GPIO_HPD_EN__SI = 0x192E; +constexpr unsigned int mmDC_GPIO_HPD_MASK__SI = 0x192C; +constexpr unsigned int mmDC_GPIO_HPD_Y__SI = 0x192F; +constexpr unsigned int mmDC_GPIO_PAD_STRENGTH_1__SI = 0x1944; +constexpr unsigned int mmDC_GPIO_PAD_STRENGTH_2__SI = 0x1945; +constexpr unsigned int mmDC_GPIO_PWRSEQ_A__SI = 0x1941; +constexpr unsigned int mmDC_GPIO_PWRSEQ_EN__SI = 0x1942; +constexpr unsigned int mmDC_GPIO_PWRSEQ_MASK__SI = 0x1940; +constexpr unsigned int mmDC_GPIO_PWRSEQ_Y__SI = 0x1943; +constexpr unsigned int mmDC_GPIO_SYNCA_A__SI = 0x1925; +constexpr unsigned int mmDC_GPIO_SYNCA_EN__SI = 0x1926; +constexpr unsigned int mmDC_GPIO_SYNCA_MASK__SI = 0x1924; +constexpr unsigned int mmDC_GPIO_SYNCA_Y__SI = 0x1927; +constexpr unsigned int mmDC_GPU_TIMER_READ_CNTL__SI = 0x1972; +constexpr unsigned int mmDC_GPU_TIMER_READ__SI = 0x1971; +constexpr unsigned int mmDC_GPU_TIMER_START_POSITION__SI = 0x1970; +constexpr unsigned int mmDC_HPD1_CONTROL__SI = 0x1809; +constexpr unsigned int mmDC_HPD1_INT_CONTROL__SI = 0x1808; +constexpr unsigned int mmDC_HPD1_INT_STATUS__SI = 0x1807; +constexpr unsigned int mmDC_HPD2_CONTROL__SI = 0x180C; +constexpr unsigned int mmDC_HPD2_INT_CONTROL__SI = 0x180B; +constexpr unsigned int mmDC_HPD2_INT_STATUS__SI = 0x180A; +constexpr unsigned int mmDC_HPD3_CONTROL__SI = 0x180F; +constexpr unsigned int mmDC_HPD3_INT_CONTROL__SI = 0x180E; +constexpr unsigned int mmDC_HPD3_INT_STATUS__SI = 0x180D; +constexpr unsigned int mmDC_HPD4_CONTROL__SI = 0x1812; +constexpr unsigned int mmDC_HPD4_INT_CONTROL__SI = 0x1811; +constexpr unsigned int mmDC_HPD4_INT_STATUS__SI = 0x1810; +constexpr unsigned int mmDC_HPD5_CONTROL__SI = 0x1815; +constexpr unsigned int mmDC_HPD5_INT_CONTROL__SI = 0x1814; +constexpr unsigned int mmDC_HPD5_INT_STATUS__SI = 0x1813; +constexpr unsigned int mmDC_HPD6_CONTROL__SI = 0x1818; +constexpr unsigned int mmDC_HPD6_INT_CONTROL__SI = 0x1817; +constexpr unsigned int mmDC_HPD6_INT_STATUS__SI = 0x1816; +constexpr unsigned int mmDC_I2C_ARBITRATION__SI = 0x181A; +constexpr unsigned int mmDC_I2C_CONTROL__SI = 0x1819; +constexpr unsigned int mmDC_I2C_DATA__SI = 0x1833; +constexpr unsigned int mmDC_I2C_DDC1_HW_STATUS__SI = 0x181D; +constexpr unsigned int mmDC_I2C_DDC1_SETUP__SI = 0x1824; +constexpr unsigned int mmDC_I2C_DDC1_SPEED__SI = 0x1823; +constexpr unsigned int mmDC_I2C_DDC2_HW_STATUS__SI = 0x181E; +constexpr unsigned int mmDC_I2C_DDC2_SETUP__SI = 0x1826; +constexpr unsigned int mmDC_I2C_DDC2_SPEED__SI = 0x1825; +constexpr unsigned int mmDC_I2C_DDC3_HW_STATUS__SI = 0x181F; +constexpr unsigned int mmDC_I2C_DDC3_SETUP__SI = 0x1828; +constexpr unsigned int mmDC_I2C_DDC3_SPEED__SI = 0x1827; +constexpr unsigned int mmDC_I2C_DDC4_HW_STATUS__SI = 0x1820; +constexpr unsigned int mmDC_I2C_DDC4_SETUP__SI = 0x182A; +constexpr unsigned int mmDC_I2C_DDC4_SPEED__SI = 0x1829; +constexpr unsigned int mmDC_I2C_DDC5_HW_STATUS__SI = 0x1821; +constexpr unsigned int mmDC_I2C_DDC5_SETUP__SI = 0x182C; +constexpr unsigned int mmDC_I2C_DDC5_SPEED__SI = 0x182B; +constexpr unsigned int mmDC_I2C_DDC6_HW_STATUS__SI = 0x1822; +constexpr unsigned int mmDC_I2C_DDC6_SETUP__SI = 0x182E; +constexpr unsigned int mmDC_I2C_DDC6_SPEED__SI = 0x182D; +constexpr unsigned int mmDC_I2C_INTERRUPT_CONTROL__SI = 0x181B; +constexpr unsigned int mmDC_I2C_SW_STATUS__SI = 0x181C; +constexpr unsigned int mmDC_I2C_TRANSACTION0__SI = 0x182F; +constexpr unsigned int mmDC_I2C_TRANSACTION1__SI = 0x1830; +constexpr unsigned int mmDC_I2C_TRANSACTION2__SI = 0x1831; +constexpr unsigned int mmDC_I2C_TRANSACTION3__SI = 0x1832; +constexpr unsigned int mmDC_LUT_30_COLOR__SI__VI = 0x1A7C; +constexpr unsigned int mmDC_LUT_AUTOFILL__SI__VI = 0x1A7F; +constexpr unsigned int mmDC_LUT_BLACK_OFFSET_BLUE__SI__VI = 0x1A81; +constexpr unsigned int mmDC_LUT_BLACK_OFFSET_GREEN__SI__VI = 0x1A82; +constexpr unsigned int mmDC_LUT_BLACK_OFFSET_RED__SI__VI = 0x1A83; +constexpr unsigned int mmDC_LUT_CONTROL__SI__VI = 0x1A80; +constexpr unsigned int mmDC_LUT_PWL_DATA__SI__VI = 0x1A7B; +constexpr unsigned int mmDC_LUT_RW_INDEX__SI__VI = 0x1A79; +constexpr unsigned int mmDC_LUT_RW_MODE__SI__VI = 0x1A78; +constexpr unsigned int mmDC_LUT_SEQ_COLOR__SI__VI = 0x1A7A; +constexpr unsigned int mmDC_LUT_WHITE_OFFSET_BLUE__SI__VI = 0x1A84; +constexpr unsigned int mmDC_LUT_WHITE_OFFSET_GREEN__SI__VI = 0x1A85; +constexpr unsigned int mmDC_LUT_WHITE_OFFSET_RED__SI__VI = 0x1A86; +constexpr unsigned int mmDC_LUT_WRITE_EN_MASK__SI__VI = 0x1A7E; +constexpr unsigned int mmDC_MVP_LB_CONTROL__SI = 0x1ADB; +constexpr unsigned int mmDC_PAD_EXTERN_SIG__SI = 0x1902; +constexpr unsigned int mmDC_PINSTRAPS__SI = 0x1954; +constexpr unsigned int mmDC_REF_CLK_CNTL__SI = 0x1903; +constexpr unsigned int mmDC_TEST_DEBUG_DATA__SI = 0x186D; +constexpr unsigned int mmDC_TEST_DEBUG_INDEX__SI = 0x186C; +constexpr unsigned int mmDEBUG_DATA = 0x203D; +constexpr unsigned int mmDEBUG_INDEX = 0x203C; +constexpr unsigned int mmDENTIST_DISPCLK_CNTL__SI = 0x015F; +constexpr unsigned int mmDESKTOP_HEIGHT__SI = 0x1AC1; +constexpr unsigned int mmDIDT_IND_DATA__CI__VI = 0x3281; +constexpr unsigned int mmDIDT_IND_INDEX__CI__VI = 0x3280; +constexpr unsigned int mmDIG0_AFMT_60958_0__SI = 0x1C41; +constexpr unsigned int mmDIG0_AFMT_60958_1__SI = 0x1C42; +constexpr unsigned int mmDIG0_AFMT_60958_2__SI = 0x1C48; +constexpr unsigned int mmDIG0_AFMT_AUDIO_CRC_CONTROL__SI = 0x1C43; +constexpr unsigned int mmDIG0_AFMT_AUDIO_CRC_RESULT__SI = 0x1C49; +constexpr unsigned int mmDIG0_AFMT_AUDIO_INFO0__SI = 0x1C3F; +constexpr unsigned int mmDIG0_AFMT_AUDIO_INFO1__SI = 0x1C40; +constexpr unsigned int mmDIG0_AFMT_AUDIO_PACKET_CONTROL2__SI = 0x1C17; +constexpr unsigned int mmDIG0_AFMT_AUDIO_PACKET_CONTROL__SI = 0x1C4B; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO0__SI = 0x1C21; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO1__SI = 0x1C22; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO2__SI = 0x1C23; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO3__SI = 0x1C24; +constexpr unsigned int mmDIG0_AFMT_INFOFRAME_CONTROL0__SI = 0x1C4D; +constexpr unsigned int mmDIG0_AFMT_ISRC1_0__SI = 0x1C18; +constexpr unsigned int mmDIG0_AFMT_ISRC1_1__SI = 0x1C19; +constexpr unsigned int mmDIG0_AFMT_ISRC1_2__SI = 0x1C1A; +constexpr unsigned int mmDIG0_AFMT_ISRC1_3__SI = 0x1C1B; +constexpr unsigned int mmDIG0_AFMT_ISRC1_4__SI = 0x1C1C; +constexpr unsigned int mmDIG0_AFMT_ISRC2_0__SI = 0x1C1D; +constexpr unsigned int mmDIG0_AFMT_ISRC2_1__SI = 0x1C1E; +constexpr unsigned int mmDIG0_AFMT_ISRC2_2__SI = 0x1C1F; +constexpr unsigned int mmDIG0_AFMT_ISRC2_3__SI = 0x1C20; +constexpr unsigned int mmDIG0_AFMT_MPEG_INFO0__SI = 0x1C25; +constexpr unsigned int mmDIG0_AFMT_MPEG_INFO1__SI = 0x1C26; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL0__SI = 0x1C44; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL1__SI = 0x1C45; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL2__SI = 0x1C46; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL3__SI = 0x1C47; +constexpr unsigned int mmDIG0_AFMT_STATUS__SI = 0x1C4A; +constexpr unsigned int mmDIG0_AFMT_VBI_PACKET_CONTROL__SI = 0x1C4C; +constexpr unsigned int mmDIG0_DIG_CLOCK_PATTERN__SI = 0x1C03; +constexpr unsigned int mmDIG0_DIG_OUTPUT_CRC_CNTL__SI = 0x1C01; +constexpr unsigned int mmDIG0_DIG_OUTPUT_CRC_RESULT__SI = 0x1C02; +constexpr unsigned int mmDIG0_DIG_RANDOM_PATTERN_SEED__SI = 0x1C05; +constexpr unsigned int mmDIG0_DIG_TEST_PATTERN__SI = 0x1C04; +constexpr unsigned int mmDIG0_HDMI_ACR_32_0__SI = 0x1C37; +constexpr unsigned int mmDIG0_HDMI_ACR_32_1__SI = 0x1C38; +constexpr unsigned int mmDIG0_HDMI_ACR_44_0__SI = 0x1C39; +constexpr unsigned int mmDIG0_HDMI_ACR_44_1__SI = 0x1C3A; +constexpr unsigned int mmDIG0_HDMI_ACR_48_0__SI = 0x1C3B; +constexpr unsigned int mmDIG0_HDMI_ACR_48_1__SI = 0x1C3C; +constexpr unsigned int mmDIG0_HDMI_ACR_PACKET_CONTROL__SI = 0x1C0F; +constexpr unsigned int mmDIG0_HDMI_ACR_STATUS_0__SI = 0x1C3D; +constexpr unsigned int mmDIG0_HDMI_ACR_STATUS_1__SI = 0x1C3E; +constexpr unsigned int mmDIG0_HDMI_AUDIO_PACKET_CONTROL__SI = 0x1C0E; +constexpr unsigned int mmDIG0_HDMI_CONTROL__SI = 0x1C0C; +constexpr unsigned int mmDIG0_HDMI_GC__SI = 0x1C16; +constexpr unsigned int mmDIG0_HDMI_GENERIC_PACKET_CONTROL__SI = 0x1C13; +constexpr unsigned int mmDIG0_HDMI_INFOFRAME_CONTROL0__SI = 0x1C11; +constexpr unsigned int mmDIG0_HDMI_INFOFRAME_CONTROL1__SI = 0x1C12; +constexpr unsigned int mmDIG0_HDMI_STATUS__SI = 0x1C0D; +constexpr unsigned int mmDIG0_HDMI_VBI_PACKET_CONTROL__SI = 0x1C10; +constexpr unsigned int mmDIG0_LVDS_DATA_CNTL__SI = 0x1C8C; +constexpr unsigned int mmDIG0_TMDS_CNTL__SI = 0x1C7C; +constexpr unsigned int mmDIG0_TMDS_CONTROL0_FEEDBACK__SI = 0x1C7E; +constexpr unsigned int mmDIG0_TMDS_CONTROL_CHAR__SI = 0x1C7D; +constexpr unsigned int mmDIG0_TMDS_CTL0_1_GEN_CNTL__SI = 0x1C86; +constexpr unsigned int mmDIG0_TMDS_CTL2_3_GEN_CNTL__SI = 0x1C87; +constexpr unsigned int mmDIG0_TMDS_CTL_BITS__SI = 0x1C83; +constexpr unsigned int mmDIG0_TMDS_DCBALANCER_CONTROL__SI = 0x1C84; +constexpr unsigned int mmDIG0_TMDS_DEBUG__SI = 0x1C82; +constexpr unsigned int mmDIG0_TMDS_STEREOSYNC_CTL_SEL__SI = 0x1C7F; +constexpr unsigned int mmDIG0_TMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x1C80; +constexpr unsigned int mmDIG0_TMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x1C81; +constexpr unsigned int mmDIG1_AFMT_60958_0__SI = 0x1F41; +constexpr unsigned int mmDIG1_AFMT_60958_1__SI = 0x1F42; +constexpr unsigned int mmDIG1_AFMT_60958_2__SI = 0x1F48; +constexpr unsigned int mmDIG1_AFMT_AUDIO_CRC_CONTROL__SI = 0x1F43; +constexpr unsigned int mmDIG1_AFMT_AUDIO_CRC_RESULT__SI = 0x1F49; +constexpr unsigned int mmDIG1_AFMT_AUDIO_INFO0__SI = 0x1F3F; +constexpr unsigned int mmDIG1_AFMT_AUDIO_INFO1__SI = 0x1F40; +constexpr unsigned int mmDIG1_AFMT_AUDIO_PACKET_CONTROL2__SI = 0x1F17; +constexpr unsigned int mmDIG1_AFMT_AUDIO_PACKET_CONTROL__SI = 0x1F4B; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO0__SI = 0x1F21; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO1__SI = 0x1F22; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO2__SI = 0x1F23; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO3__SI = 0x1F24; +constexpr unsigned int mmDIG1_AFMT_INFOFRAME_CONTROL0__SI = 0x1F4D; +constexpr unsigned int mmDIG1_AFMT_ISRC1_0__SI = 0x1F18; +constexpr unsigned int mmDIG1_AFMT_ISRC1_1__SI = 0x1F19; +constexpr unsigned int mmDIG1_AFMT_ISRC1_2__SI = 0x1F1A; +constexpr unsigned int mmDIG1_AFMT_ISRC1_3__SI = 0x1F1B; +constexpr unsigned int mmDIG1_AFMT_ISRC1_4__SI = 0x1F1C; +constexpr unsigned int mmDIG1_AFMT_ISRC2_0__SI = 0x1F1D; +constexpr unsigned int mmDIG1_AFMT_ISRC2_1__SI = 0x1F1E; +constexpr unsigned int mmDIG1_AFMT_ISRC2_2__SI = 0x1F1F; +constexpr unsigned int mmDIG1_AFMT_ISRC2_3__SI = 0x1F20; +constexpr unsigned int mmDIG1_AFMT_MPEG_INFO0__SI = 0x1F25; +constexpr unsigned int mmDIG1_AFMT_MPEG_INFO1__SI = 0x1F26; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL0__SI = 0x1F44; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL1__SI = 0x1F45; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL2__SI = 0x1F46; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL3__SI = 0x1F47; +constexpr unsigned int mmDIG1_AFMT_STATUS__SI = 0x1F4A; +constexpr unsigned int mmDIG1_AFMT_VBI_PACKET_CONTROL__SI = 0x1F4C; +constexpr unsigned int mmDIG1_DIG_CLOCK_PATTERN__SI = 0x1F03; +constexpr unsigned int mmDIG1_DIG_OUTPUT_CRC_CNTL__SI = 0x1F01; +constexpr unsigned int mmDIG1_DIG_OUTPUT_CRC_RESULT__SI = 0x1F02; +constexpr unsigned int mmDIG1_DIG_RANDOM_PATTERN_SEED__SI = 0x1F05; +constexpr unsigned int mmDIG1_DIG_TEST_PATTERN__SI = 0x1F04; +constexpr unsigned int mmDIG1_HDMI_ACR_32_0__SI = 0x1F37; +constexpr unsigned int mmDIG1_HDMI_ACR_32_1__SI = 0x1F38; +constexpr unsigned int mmDIG1_HDMI_ACR_44_0__SI = 0x1F39; +constexpr unsigned int mmDIG1_HDMI_ACR_44_1__SI = 0x1F3A; +constexpr unsigned int mmDIG1_HDMI_ACR_48_0__SI = 0x1F3B; +constexpr unsigned int mmDIG1_HDMI_ACR_48_1__SI = 0x1F3C; +constexpr unsigned int mmDIG1_HDMI_ACR_PACKET_CONTROL__SI = 0x1F0F; +constexpr unsigned int mmDIG1_HDMI_ACR_STATUS_0__SI = 0x1F3D; +constexpr unsigned int mmDIG1_HDMI_ACR_STATUS_1__SI = 0x1F3E; +constexpr unsigned int mmDIG1_HDMI_AUDIO_PACKET_CONTROL__SI = 0x1F0E; +constexpr unsigned int mmDIG1_HDMI_CONTROL__SI = 0x1F0C; +constexpr unsigned int mmDIG1_HDMI_GC__SI = 0x1F16; +constexpr unsigned int mmDIG1_HDMI_GENERIC_PACKET_CONTROL__SI = 0x1F13; +constexpr unsigned int mmDIG1_HDMI_INFOFRAME_CONTROL0__SI = 0x1F11; +constexpr unsigned int mmDIG1_HDMI_INFOFRAME_CONTROL1__SI = 0x1F12; +constexpr unsigned int mmDIG1_HDMI_STATUS__SI = 0x1F0D; +constexpr unsigned int mmDIG1_HDMI_VBI_PACKET_CONTROL__SI = 0x1F10; +constexpr unsigned int mmDIG1_LVDS_DATA_CNTL__SI = 0x1F8C; +constexpr unsigned int mmDIG1_TMDS_CNTL__SI = 0x1F7C; +constexpr unsigned int mmDIG1_TMDS_CONTROL0_FEEDBACK__SI = 0x1F7E; +constexpr unsigned int mmDIG1_TMDS_CONTROL_CHAR__SI = 0x1F7D; +constexpr unsigned int mmDIG1_TMDS_CTL0_1_GEN_CNTL__SI = 0x1F86; +constexpr unsigned int mmDIG1_TMDS_CTL2_3_GEN_CNTL__SI = 0x1F87; +constexpr unsigned int mmDIG1_TMDS_CTL_BITS__SI = 0x1F83; +constexpr unsigned int mmDIG1_TMDS_DCBALANCER_CONTROL__SI = 0x1F84; +constexpr unsigned int mmDIG1_TMDS_DEBUG__SI = 0x1F82; +constexpr unsigned int mmDIG1_TMDS_STEREOSYNC_CTL_SEL__SI = 0x1F7F; +constexpr unsigned int mmDIG1_TMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x1F80; +constexpr unsigned int mmDIG1_TMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x1F81; +constexpr unsigned int mmDIG2_AFMT_60958_0__SI = 0x4241; +constexpr unsigned int mmDIG2_AFMT_60958_1__SI = 0x4242; +constexpr unsigned int mmDIG2_AFMT_60958_2__SI = 0x4248; +constexpr unsigned int mmDIG2_AFMT_AUDIO_CRC_CONTROL__SI = 0x4243; +constexpr unsigned int mmDIG2_AFMT_AUDIO_CRC_RESULT__SI = 0x4249; +constexpr unsigned int mmDIG2_AFMT_AUDIO_INFO0__SI = 0x423F; +constexpr unsigned int mmDIG2_AFMT_AUDIO_INFO1__SI = 0x4240; +constexpr unsigned int mmDIG2_AFMT_AUDIO_PACKET_CONTROL2__SI = 0x4217; +constexpr unsigned int mmDIG2_AFMT_AUDIO_PACKET_CONTROL__SI = 0x424B; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO0__SI = 0x4221; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO1__SI = 0x4222; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO2__SI = 0x4223; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO3__SI = 0x4224; +constexpr unsigned int mmDIG2_AFMT_INFOFRAME_CONTROL0__SI = 0x424D; +constexpr unsigned int mmDIG2_AFMT_ISRC1_0__SI = 0x4218; +constexpr unsigned int mmDIG2_AFMT_ISRC1_1__SI = 0x4219; +constexpr unsigned int mmDIG2_AFMT_ISRC1_2__SI = 0x421A; +constexpr unsigned int mmDIG2_AFMT_ISRC1_3__SI = 0x421B; +constexpr unsigned int mmDIG2_AFMT_ISRC1_4__SI = 0x421C; +constexpr unsigned int mmDIG2_AFMT_ISRC2_0__SI = 0x421D; +constexpr unsigned int mmDIG2_AFMT_ISRC2_1__SI = 0x421E; +constexpr unsigned int mmDIG2_AFMT_ISRC2_2__SI = 0x421F; +constexpr unsigned int mmDIG2_AFMT_ISRC2_3__SI = 0x4220; +constexpr unsigned int mmDIG2_AFMT_MPEG_INFO0__SI = 0x4225; +constexpr unsigned int mmDIG2_AFMT_MPEG_INFO1__SI = 0x4226; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL0__SI = 0x4244; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL1__SI = 0x4245; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL2__SI = 0x4246; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL3__SI = 0x4247; +constexpr unsigned int mmDIG2_AFMT_STATUS__SI = 0x424A; +constexpr unsigned int mmDIG2_AFMT_VBI_PACKET_CONTROL__SI = 0x424C; +constexpr unsigned int mmDIG2_DIG_CLOCK_PATTERN__SI = 0x4203; +constexpr unsigned int mmDIG2_DIG_OUTPUT_CRC_CNTL__SI = 0x4201; +constexpr unsigned int mmDIG2_DIG_OUTPUT_CRC_RESULT__SI = 0x4202; +constexpr unsigned int mmDIG2_DIG_RANDOM_PATTERN_SEED__SI = 0x4205; +constexpr unsigned int mmDIG2_DIG_TEST_PATTERN__SI = 0x4204; +constexpr unsigned int mmDIG2_HDMI_ACR_32_0__SI = 0x4237; +constexpr unsigned int mmDIG2_HDMI_ACR_32_1__SI = 0x4238; +constexpr unsigned int mmDIG2_HDMI_ACR_44_0__SI = 0x4239; +constexpr unsigned int mmDIG2_HDMI_ACR_44_1__SI = 0x423A; +constexpr unsigned int mmDIG2_HDMI_ACR_48_0__SI = 0x423B; +constexpr unsigned int mmDIG2_HDMI_ACR_48_1__SI = 0x423C; +constexpr unsigned int mmDIG2_HDMI_ACR_PACKET_CONTROL__SI = 0x420F; +constexpr unsigned int mmDIG2_HDMI_ACR_STATUS_0__SI = 0x423D; +constexpr unsigned int mmDIG2_HDMI_ACR_STATUS_1__SI = 0x423E; +constexpr unsigned int mmDIG2_HDMI_AUDIO_PACKET_CONTROL__SI = 0x420E; +constexpr unsigned int mmDIG2_HDMI_CONTROL__SI = 0x420C; +constexpr unsigned int mmDIG2_HDMI_GC__SI = 0x4216; +constexpr unsigned int mmDIG2_HDMI_GENERIC_PACKET_CONTROL__SI = 0x4213; +constexpr unsigned int mmDIG2_HDMI_INFOFRAME_CONTROL0__SI = 0x4211; +constexpr unsigned int mmDIG2_HDMI_INFOFRAME_CONTROL1__SI = 0x4212; +constexpr unsigned int mmDIG2_HDMI_STATUS__SI = 0x420D; +constexpr unsigned int mmDIG2_HDMI_VBI_PACKET_CONTROL__SI = 0x4210; +constexpr unsigned int mmDIG2_LVDS_DATA_CNTL__SI = 0x428C; +constexpr unsigned int mmDIG2_TMDS_CNTL__SI = 0x427C; +constexpr unsigned int mmDIG2_TMDS_CONTROL0_FEEDBACK__SI = 0x427E; +constexpr unsigned int mmDIG2_TMDS_CONTROL_CHAR__SI = 0x427D; +constexpr unsigned int mmDIG2_TMDS_CTL0_1_GEN_CNTL__SI = 0x4286; +constexpr unsigned int mmDIG2_TMDS_CTL2_3_GEN_CNTL__SI = 0x4287; +constexpr unsigned int mmDIG2_TMDS_CTL_BITS__SI = 0x4283; +constexpr unsigned int mmDIG2_TMDS_DCBALANCER_CONTROL__SI = 0x4284; +constexpr unsigned int mmDIG2_TMDS_DEBUG__SI = 0x4282; +constexpr unsigned int mmDIG2_TMDS_STEREOSYNC_CTL_SEL__SI = 0x427F; +constexpr unsigned int mmDIG2_TMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x4280; +constexpr unsigned int mmDIG2_TMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x4281; +constexpr unsigned int mmDIG3_AFMT_60958_0__SI = 0x4541; +constexpr unsigned int mmDIG3_AFMT_60958_1__SI = 0x4542; +constexpr unsigned int mmDIG3_AFMT_60958_2__SI = 0x4548; +constexpr unsigned int mmDIG3_AFMT_AUDIO_CRC_CONTROL__SI = 0x4543; +constexpr unsigned int mmDIG3_AFMT_AUDIO_CRC_RESULT__SI = 0x4549; +constexpr unsigned int mmDIG3_AFMT_AUDIO_INFO0__SI = 0x453F; +constexpr unsigned int mmDIG3_AFMT_AUDIO_INFO1__SI = 0x4540; +constexpr unsigned int mmDIG3_AFMT_AUDIO_PACKET_CONTROL2__SI = 0x4517; +constexpr unsigned int mmDIG3_AFMT_AUDIO_PACKET_CONTROL__SI = 0x454B; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO0__SI = 0x4521; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO1__SI = 0x4522; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO2__SI = 0x4523; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO3__SI = 0x4524; +constexpr unsigned int mmDIG3_AFMT_INFOFRAME_CONTROL0__SI = 0x454D; +constexpr unsigned int mmDIG3_AFMT_ISRC1_0__SI = 0x4518; +constexpr unsigned int mmDIG3_AFMT_ISRC1_1__SI = 0x4519; +constexpr unsigned int mmDIG3_AFMT_ISRC1_2__SI = 0x451A; +constexpr unsigned int mmDIG3_AFMT_ISRC1_3__SI = 0x451B; +constexpr unsigned int mmDIG3_AFMT_ISRC1_4__SI = 0x451C; +constexpr unsigned int mmDIG3_AFMT_ISRC2_0__SI = 0x451D; +constexpr unsigned int mmDIG3_AFMT_ISRC2_1__SI = 0x451E; +constexpr unsigned int mmDIG3_AFMT_ISRC2_2__SI = 0x451F; +constexpr unsigned int mmDIG3_AFMT_ISRC2_3__SI = 0x4520; +constexpr unsigned int mmDIG3_AFMT_MPEG_INFO0__SI = 0x4525; +constexpr unsigned int mmDIG3_AFMT_MPEG_INFO1__SI = 0x4526; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL0__SI = 0x4544; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL1__SI = 0x4545; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL2__SI = 0x4546; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL3__SI = 0x4547; +constexpr unsigned int mmDIG3_AFMT_STATUS__SI = 0x454A; +constexpr unsigned int mmDIG3_AFMT_VBI_PACKET_CONTROL__SI = 0x454C; +constexpr unsigned int mmDIG3_DIG_CLOCK_PATTERN__SI = 0x4503; +constexpr unsigned int mmDIG3_DIG_OUTPUT_CRC_CNTL__SI = 0x4501; +constexpr unsigned int mmDIG3_DIG_OUTPUT_CRC_RESULT__SI = 0x4502; +constexpr unsigned int mmDIG3_DIG_RANDOM_PATTERN_SEED__SI = 0x4505; +constexpr unsigned int mmDIG3_DIG_TEST_PATTERN__SI = 0x4504; +constexpr unsigned int mmDIG3_HDMI_ACR_32_0__SI = 0x4537; +constexpr unsigned int mmDIG3_HDMI_ACR_32_1__SI = 0x4538; +constexpr unsigned int mmDIG3_HDMI_ACR_44_0__SI = 0x4539; +constexpr unsigned int mmDIG3_HDMI_ACR_44_1__SI = 0x453A; +constexpr unsigned int mmDIG3_HDMI_ACR_48_0__SI = 0x453B; +constexpr unsigned int mmDIG3_HDMI_ACR_48_1__SI = 0x453C; +constexpr unsigned int mmDIG3_HDMI_ACR_PACKET_CONTROL__SI = 0x450F; +constexpr unsigned int mmDIG3_HDMI_ACR_STATUS_0__SI = 0x453D; +constexpr unsigned int mmDIG3_HDMI_ACR_STATUS_1__SI = 0x453E; +constexpr unsigned int mmDIG3_HDMI_AUDIO_PACKET_CONTROL__SI = 0x450E; +constexpr unsigned int mmDIG3_HDMI_CONTROL__SI = 0x450C; +constexpr unsigned int mmDIG3_HDMI_GC__SI = 0x4516; +constexpr unsigned int mmDIG3_HDMI_GENERIC_PACKET_CONTROL__SI = 0x4513; +constexpr unsigned int mmDIG3_HDMI_INFOFRAME_CONTROL0__SI = 0x4511; +constexpr unsigned int mmDIG3_HDMI_INFOFRAME_CONTROL1__SI = 0x4512; +constexpr unsigned int mmDIG3_HDMI_STATUS__SI = 0x450D; +constexpr unsigned int mmDIG3_HDMI_VBI_PACKET_CONTROL__SI = 0x4510; +constexpr unsigned int mmDIG3_LVDS_DATA_CNTL__SI = 0x458C; +constexpr unsigned int mmDIG3_TMDS_CNTL__SI = 0x457C; +constexpr unsigned int mmDIG3_TMDS_CONTROL0_FEEDBACK__SI = 0x457E; +constexpr unsigned int mmDIG3_TMDS_CONTROL_CHAR__SI = 0x457D; +constexpr unsigned int mmDIG3_TMDS_CTL0_1_GEN_CNTL__SI = 0x4586; +constexpr unsigned int mmDIG3_TMDS_CTL2_3_GEN_CNTL__SI = 0x4587; +constexpr unsigned int mmDIG3_TMDS_CTL_BITS__SI = 0x4583; +constexpr unsigned int mmDIG3_TMDS_DCBALANCER_CONTROL__SI = 0x4584; +constexpr unsigned int mmDIG3_TMDS_DEBUG__SI = 0x4582; +constexpr unsigned int mmDIG3_TMDS_STEREOSYNC_CTL_SEL__SI = 0x457F; +constexpr unsigned int mmDIG3_TMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x4580; +constexpr unsigned int mmDIG3_TMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x4581; +constexpr unsigned int mmDIG4_AFMT_60958_0__SI = 0x4841; +constexpr unsigned int mmDIG4_AFMT_60958_1__SI = 0x4842; +constexpr unsigned int mmDIG4_AFMT_60958_2__SI = 0x4848; +constexpr unsigned int mmDIG4_AFMT_AUDIO_CRC_CONTROL__SI = 0x4843; +constexpr unsigned int mmDIG4_AFMT_AUDIO_CRC_RESULT__SI = 0x4849; +constexpr unsigned int mmDIG4_AFMT_AUDIO_INFO0__SI = 0x483F; +constexpr unsigned int mmDIG4_AFMT_AUDIO_INFO1__SI = 0x4840; +constexpr unsigned int mmDIG4_AFMT_AUDIO_PACKET_CONTROL2__SI = 0x4817; +constexpr unsigned int mmDIG4_AFMT_AUDIO_PACKET_CONTROL__SI = 0x484B; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO0__SI = 0x4821; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO1__SI = 0x4822; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO2__SI = 0x4823; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO3__SI = 0x4824; +constexpr unsigned int mmDIG4_AFMT_INFOFRAME_CONTROL0__SI = 0x484D; +constexpr unsigned int mmDIG4_AFMT_ISRC1_0__SI = 0x4818; +constexpr unsigned int mmDIG4_AFMT_ISRC1_1__SI = 0x4819; +constexpr unsigned int mmDIG4_AFMT_ISRC1_2__SI = 0x481A; +constexpr unsigned int mmDIG4_AFMT_ISRC1_3__SI = 0x481B; +constexpr unsigned int mmDIG4_AFMT_ISRC1_4__SI = 0x481C; +constexpr unsigned int mmDIG4_AFMT_ISRC2_0__SI = 0x481D; +constexpr unsigned int mmDIG4_AFMT_ISRC2_1__SI = 0x481E; +constexpr unsigned int mmDIG4_AFMT_ISRC2_2__SI = 0x481F; +constexpr unsigned int mmDIG4_AFMT_ISRC2_3__SI = 0x4820; +constexpr unsigned int mmDIG4_AFMT_MPEG_INFO0__SI = 0x4825; +constexpr unsigned int mmDIG4_AFMT_MPEG_INFO1__SI = 0x4826; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL0__SI = 0x4844; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL1__SI = 0x4845; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL2__SI = 0x4846; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL3__SI = 0x4847; +constexpr unsigned int mmDIG4_AFMT_STATUS__SI = 0x484A; +constexpr unsigned int mmDIG4_AFMT_VBI_PACKET_CONTROL__SI = 0x484C; +constexpr unsigned int mmDIG4_DIG_CLOCK_PATTERN__SI = 0x4803; +constexpr unsigned int mmDIG4_DIG_OUTPUT_CRC_CNTL__SI = 0x4801; +constexpr unsigned int mmDIG4_DIG_OUTPUT_CRC_RESULT__SI = 0x4802; +constexpr unsigned int mmDIG4_DIG_RANDOM_PATTERN_SEED__SI = 0x4805; +constexpr unsigned int mmDIG4_DIG_TEST_PATTERN__SI = 0x4804; +constexpr unsigned int mmDIG4_HDMI_ACR_32_0__SI = 0x4837; +constexpr unsigned int mmDIG4_HDMI_ACR_32_1__SI = 0x4838; +constexpr unsigned int mmDIG4_HDMI_ACR_44_0__SI = 0x4839; +constexpr unsigned int mmDIG4_HDMI_ACR_44_1__SI = 0x483A; +constexpr unsigned int mmDIG4_HDMI_ACR_48_0__SI = 0x483B; +constexpr unsigned int mmDIG4_HDMI_ACR_48_1__SI = 0x483C; +constexpr unsigned int mmDIG4_HDMI_ACR_PACKET_CONTROL__SI = 0x480F; +constexpr unsigned int mmDIG4_HDMI_ACR_STATUS_0__SI = 0x483D; +constexpr unsigned int mmDIG4_HDMI_ACR_STATUS_1__SI = 0x483E; +constexpr unsigned int mmDIG4_HDMI_AUDIO_PACKET_CONTROL__SI = 0x480E; +constexpr unsigned int mmDIG4_HDMI_CONTROL__SI = 0x480C; +constexpr unsigned int mmDIG4_HDMI_GC__SI = 0x4816; +constexpr unsigned int mmDIG4_HDMI_GENERIC_PACKET_CONTROL__SI = 0x4813; +constexpr unsigned int mmDIG4_HDMI_INFOFRAME_CONTROL0__SI = 0x4811; +constexpr unsigned int mmDIG4_HDMI_INFOFRAME_CONTROL1__SI = 0x4812; +constexpr unsigned int mmDIG4_HDMI_STATUS__SI = 0x480D; +constexpr unsigned int mmDIG4_HDMI_VBI_PACKET_CONTROL__SI = 0x4810; +constexpr unsigned int mmDIG4_LVDS_DATA_CNTL__SI = 0x488C; +constexpr unsigned int mmDIG4_TMDS_CNTL__SI = 0x487C; +constexpr unsigned int mmDIG4_TMDS_CONTROL0_FEEDBACK__SI = 0x487E; +constexpr unsigned int mmDIG4_TMDS_CONTROL_CHAR__SI = 0x487D; +constexpr unsigned int mmDIG4_TMDS_CTL0_1_GEN_CNTL__SI = 0x4886; +constexpr unsigned int mmDIG4_TMDS_CTL2_3_GEN_CNTL__SI = 0x4887; +constexpr unsigned int mmDIG4_TMDS_CTL_BITS__SI = 0x4883; +constexpr unsigned int mmDIG4_TMDS_DCBALANCER_CONTROL__SI = 0x4884; +constexpr unsigned int mmDIG4_TMDS_DEBUG__SI = 0x4882; +constexpr unsigned int mmDIG4_TMDS_STEREOSYNC_CTL_SEL__SI = 0x487F; +constexpr unsigned int mmDIG4_TMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x4880; +constexpr unsigned int mmDIG4_TMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x4881; +constexpr unsigned int mmDIG5_AFMT_60958_0__SI = 0x4B41; +constexpr unsigned int mmDIG5_AFMT_60958_1__SI = 0x4B42; +constexpr unsigned int mmDIG5_AFMT_60958_2__SI = 0x4B48; +constexpr unsigned int mmDIG5_AFMT_AUDIO_CRC_CONTROL__SI = 0x4B43; +constexpr unsigned int mmDIG5_AFMT_AUDIO_CRC_RESULT__SI = 0x4B49; +constexpr unsigned int mmDIG5_AFMT_AUDIO_INFO0__SI = 0x4B3F; +constexpr unsigned int mmDIG5_AFMT_AUDIO_INFO1__SI = 0x4B40; +constexpr unsigned int mmDIG5_AFMT_AUDIO_PACKET_CONTROL2__SI = 0x4B17; +constexpr unsigned int mmDIG5_AFMT_AUDIO_PACKET_CONTROL__SI = 0x4B4B; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO0__SI = 0x4B21; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO1__SI = 0x4B22; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO2__SI = 0x4B23; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO3__SI = 0x4B24; +constexpr unsigned int mmDIG5_AFMT_INFOFRAME_CONTROL0__SI = 0x4B4D; +constexpr unsigned int mmDIG5_AFMT_ISRC1_0__SI = 0x4B18; +constexpr unsigned int mmDIG5_AFMT_ISRC1_1__SI = 0x4B19; +constexpr unsigned int mmDIG5_AFMT_ISRC1_2__SI = 0x4B1A; +constexpr unsigned int mmDIG5_AFMT_ISRC1_3__SI = 0x4B1B; +constexpr unsigned int mmDIG5_AFMT_ISRC1_4__SI = 0x4B1C; +constexpr unsigned int mmDIG5_AFMT_ISRC2_0__SI = 0x4B1D; +constexpr unsigned int mmDIG5_AFMT_ISRC2_1__SI = 0x4B1E; +constexpr unsigned int mmDIG5_AFMT_ISRC2_2__SI = 0x4B1F; +constexpr unsigned int mmDIG5_AFMT_ISRC2_3__SI = 0x4B20; +constexpr unsigned int mmDIG5_AFMT_MPEG_INFO0__SI = 0x4B25; +constexpr unsigned int mmDIG5_AFMT_MPEG_INFO1__SI = 0x4B26; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL0__SI = 0x4B44; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL1__SI = 0x4B45; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL2__SI = 0x4B46; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL3__SI = 0x4B47; +constexpr unsigned int mmDIG5_AFMT_STATUS__SI = 0x4B4A; +constexpr unsigned int mmDIG5_AFMT_VBI_PACKET_CONTROL__SI = 0x4B4C; +constexpr unsigned int mmDIG5_DIG_CLOCK_PATTERN__SI = 0x4B03; +constexpr unsigned int mmDIG5_DIG_OUTPUT_CRC_CNTL__SI = 0x4B01; +constexpr unsigned int mmDIG5_DIG_OUTPUT_CRC_RESULT__SI = 0x4B02; +constexpr unsigned int mmDIG5_DIG_RANDOM_PATTERN_SEED__SI = 0x4B05; +constexpr unsigned int mmDIG5_DIG_TEST_PATTERN__SI = 0x4B04; +constexpr unsigned int mmDIG5_HDMI_ACR_32_0__SI = 0x4B37; +constexpr unsigned int mmDIG5_HDMI_ACR_32_1__SI = 0x4B38; +constexpr unsigned int mmDIG5_HDMI_ACR_44_0__SI = 0x4B39; +constexpr unsigned int mmDIG5_HDMI_ACR_44_1__SI = 0x4B3A; +constexpr unsigned int mmDIG5_HDMI_ACR_48_0__SI = 0x4B3B; +constexpr unsigned int mmDIG5_HDMI_ACR_48_1__SI = 0x4B3C; +constexpr unsigned int mmDIG5_HDMI_ACR_PACKET_CONTROL__SI = 0x4B0F; +constexpr unsigned int mmDIG5_HDMI_ACR_STATUS_0__SI = 0x4B3D; +constexpr unsigned int mmDIG5_HDMI_ACR_STATUS_1__SI = 0x4B3E; +constexpr unsigned int mmDIG5_HDMI_AUDIO_PACKET_CONTROL__SI = 0x4B0E; +constexpr unsigned int mmDIG5_HDMI_CONTROL__SI = 0x4B0C; +constexpr unsigned int mmDIG5_HDMI_GC__SI = 0x4B16; +constexpr unsigned int mmDIG5_HDMI_GENERIC_PACKET_CONTROL__SI = 0x4B13; +constexpr unsigned int mmDIG5_HDMI_INFOFRAME_CONTROL0__SI = 0x4B11; +constexpr unsigned int mmDIG5_HDMI_INFOFRAME_CONTROL1__SI = 0x4B12; +constexpr unsigned int mmDIG5_HDMI_STATUS__SI = 0x4B0D; +constexpr unsigned int mmDIG5_HDMI_VBI_PACKET_CONTROL__SI = 0x4B10; +constexpr unsigned int mmDIG5_LVDS_DATA_CNTL__SI = 0x4B8C; +constexpr unsigned int mmDIG5_TMDS_CNTL__SI = 0x4B7C; +constexpr unsigned int mmDIG5_TMDS_CONTROL0_FEEDBACK__SI = 0x4B7E; +constexpr unsigned int mmDIG5_TMDS_CONTROL_CHAR__SI = 0x4B7D; +constexpr unsigned int mmDIG5_TMDS_CTL0_1_GEN_CNTL__SI = 0x4B86; +constexpr unsigned int mmDIG5_TMDS_CTL2_3_GEN_CNTL__SI = 0x4B87; +constexpr unsigned int mmDIG5_TMDS_CTL_BITS__SI = 0x4B83; +constexpr unsigned int mmDIG5_TMDS_DCBALANCER_CONTROL__SI = 0x4B84; +constexpr unsigned int mmDIG5_TMDS_DEBUG__SI = 0x4B82; +constexpr unsigned int mmDIG5_TMDS_STEREOSYNC_CTL_SEL__SI = 0x4B7F; +constexpr unsigned int mmDIG5_TMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x4B80; +constexpr unsigned int mmDIG5_TMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x4B81; +constexpr unsigned int mmDIG_CLOCK_PATTERN__SI = 0x1C03; +constexpr unsigned int mmDIG_OUTPUT_CRC_CNTL__SI = 0x1C01; +constexpr unsigned int mmDIG_OUTPUT_CRC_RESULT__SI = 0x1C02; +constexpr unsigned int mmDIG_RANDOM_PATTERN_SEED__SI = 0x1C05; +constexpr unsigned int mmDIG_TEST_PATTERN__SI = 0x1C04; +constexpr unsigned int mmDISPCLK_CGTT_BLK_CTRL_REG__SI = 0x0128; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE2__SI = 0x183F; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE__SI = 0x183E; +constexpr unsigned int mmDISP_INTERRUPT_STATUS__SI = 0x183D; +constexpr unsigned int mmDISP_TIMER_CONTROL__SI = 0x1842; +constexpr unsigned int mmDLL_CNTL__SI__CI = 0x0AE9; +constexpr unsigned int mmDMCU_CTRL__SI__VI = 0x1600; +constexpr unsigned int mmDMCU_ERAM_RD_CTRL__SI__VI = 0x160B; +constexpr unsigned int mmDMCU_ERAM_RD_DATA__SI__VI = 0x160C; +constexpr unsigned int mmDMCU_ERAM_WR_CTRL__SI__VI = 0x1609; +constexpr unsigned int mmDMCU_ERAM_WR_DATA__SI__VI = 0x160A; +constexpr unsigned int mmDMCU_EVENT_TRIGGER__SI__VI = 0x1611; +constexpr unsigned int mmDMCU_FW_CHECKSUM_SMPL_BYTE_POS__SI__VI = 0x161A; +constexpr unsigned int mmDMCU_FW_CS_HI__SI__VI = 0x1606; +constexpr unsigned int mmDMCU_FW_CS_LO__SI__VI = 0x1607; +constexpr unsigned int mmDMCU_FW_END_ADDR__SI__VI = 0x1604; +constexpr unsigned int mmDMCU_FW_ISR_START_ADDR__SI__VI = 0x1605; +constexpr unsigned int mmDMCU_FW_START_ADDR__SI__VI = 0x1603; +constexpr unsigned int mmDMCU_INTERRUPT_STATUS__SI__VI = 0x1614; +constexpr unsigned int mmDMCU_INTERRUPT_TO_HOST_EN_MASK__SI__VI = 0x1615; +constexpr unsigned int mmDMCU_INTERRUPT_TO_UC_EN_MASK__SI__VI = 0x1616; +constexpr unsigned int mmDMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__SI__VI = 0x1617; +constexpr unsigned int mmDMCU_INT_CNT__SI__VI = 0x1619; +constexpr unsigned int mmDMCU_IRAM_RD_CTRL__SI__VI = 0x160F; +constexpr unsigned int mmDMCU_IRAM_RD_DATA__SI__VI = 0x1610; +constexpr unsigned int mmDMCU_IRAM_WR_CTRL__SI__VI = 0x160D; +constexpr unsigned int mmDMCU_IRAM_WR_DATA__SI__VI = 0x160E; +constexpr unsigned int mmDMCU_PC_START_ADDR__SI__VI = 0x1602; +constexpr unsigned int mmDMCU_RAM_ACCESS_CTRL__SI__VI = 0x1608; +constexpr unsigned int mmDMCU_STATUS__SI__VI = 0x1601; +constexpr unsigned int mmDMCU_TEST_DEBUG_DATA__SI__VI = 0x1627; +constexpr unsigned int mmDMCU_TEST_DEBUG_INDEX__SI__VI = 0x1626; +constexpr unsigned int mmDMCU_UC_INTERNAL_INT_STATUS__SI__VI = 0x1612; +constexpr unsigned int mmDMIF_ARBITRATION_CONTROL__SI__VI = 0x02F9; +constexpr unsigned int mmDMIF_CONTROL__SI__VI = 0x02F6; +constexpr unsigned int mmDMIF_HW_DEBUG__SI__VI = 0x02F8; +constexpr unsigned int mmDMIF_STATUS__SI__VI = 0x02F7; +constexpr unsigned int mmDMIF_TEST_DEBUG_DATA__SI = 0x0313; +constexpr unsigned int mmDMIF_TEST_DEBUG_INDEX__SI = 0x0312; +constexpr unsigned int mmDOUT_POWER_MANAGEMENT_CNTL__SI = 0x1841; +constexpr unsigned int mmDOUT_SCRATCH0__SI = 0x1844; +constexpr unsigned int mmDOUT_SCRATCH1__SI = 0x1845; +constexpr unsigned int mmDOUT_SCRATCH2__SI = 0x1846; +constexpr unsigned int mmDOUT_SCRATCH3__SI = 0x1847; +constexpr unsigned int mmDOUT_SCRATCH4__SI = 0x1848; +constexpr unsigned int mmDOUT_SCRATCH5__SI = 0x1849; +constexpr unsigned int mmDOUT_SCRATCH6__SI = 0x184A; +constexpr unsigned int mmDOUT_SCRATCH7__SI = 0x184B; +constexpr unsigned int mmDOUT_TEST_DEBUG_DATA__SI = 0x184E; +constexpr unsigned int mmDOUT_TEST_DEBUG_INDEX__SI = 0x184D; +constexpr unsigned int mmDP0_DP_CONFIG__SI = 0x1CC2; +constexpr unsigned int mmDP0_DP_DPHY_8B10B_CNTL__SI = 0x1CD3; +constexpr unsigned int mmDP0_DP_DPHY_CNTL__SI = 0x1CD0; +constexpr unsigned int mmDP0_DP_DPHY_CRC_CNTL__SI = 0x1CD7; +constexpr unsigned int mmDP0_DP_DPHY_CRC_EN__SI = 0x1CD6; +constexpr unsigned int mmDP0_DP_DPHY_CRC_RESULT__SI = 0x1CD8; +constexpr unsigned int mmDP0_DP_DPHY_FAST_TRAINING__SI = 0x1CCE; +constexpr unsigned int mmDP0_DP_DPHY_PRBS_CNTL__SI = 0x1CD4; +constexpr unsigned int mmDP0_DP_DPHY_SYM__SI = 0x1CD2; +constexpr unsigned int mmDP0_DP_DPHY_TRAINING_PATTERN_SEL__SI = 0x1CD1; +constexpr unsigned int mmDP0_DP_LINK_CNTL__SI = 0x1CC0; +constexpr unsigned int mmDP0_DP_PIXEL_FORMAT__SI = 0x1CC1; +constexpr unsigned int mmDP0_DP_SEC_AUD_M_READBACK__SI = 0x1CA8; +constexpr unsigned int mmDP0_DP_SEC_AUD_M__SI = 0x1CA7; +constexpr unsigned int mmDP0_DP_SEC_AUD_N_READBACK__SI = 0x1CA6; +constexpr unsigned int mmDP0_DP_SEC_AUD_N__SI = 0x1CA5; +constexpr unsigned int mmDP0_DP_SEC_CNTL__SI = 0x1CA0; +constexpr unsigned int mmDP0_DP_SEC_FRAMING1__SI = 0x1CA1; +constexpr unsigned int mmDP0_DP_SEC_FRAMING2__SI = 0x1CA2; +constexpr unsigned int mmDP0_DP_SEC_FRAMING3__SI = 0x1CA3; +constexpr unsigned int mmDP0_DP_SEC_FRAMING4__SI = 0x1CA4; +constexpr unsigned int mmDP0_DP_SEC_PACKET_CNTL__SI = 0x1CAA; +constexpr unsigned int mmDP0_DP_SEC_TIMESTAMP__SI = 0x1CA9; +constexpr unsigned int mmDP0_DP_STEER_FIFO__SI = 0x1CC4; +constexpr unsigned int mmDP0_DP_TEST_DEBUG_DATA__SI = 0x1CFD; +constexpr unsigned int mmDP0_DP_TEST_DEBUG_INDEX__SI = 0x1CFC; +constexpr unsigned int mmDP0_DP_VID_INTERRUPT_CNTL__SI = 0x1CCF; +constexpr unsigned int mmDP0_DP_VID_MSA_VBID__SI = 0x1CCD; +constexpr unsigned int mmDP0_DP_VID_M__SI = 0x1CCB; +constexpr unsigned int mmDP0_DP_VID_N__SI = 0x1CCA; +constexpr unsigned int mmDP0_DP_VID_STREAM_CNTL__SI = 0x1CC3; +constexpr unsigned int mmDP0_DP_VID_TIMING__SI = 0x1CC9; +constexpr unsigned int mmDP1_DP_CONFIG__SI = 0x1FC2; +constexpr unsigned int mmDP1_DP_DPHY_8B10B_CNTL__SI = 0x1FD3; +constexpr unsigned int mmDP1_DP_DPHY_CNTL__SI = 0x1FD0; +constexpr unsigned int mmDP1_DP_DPHY_CRC_CNTL__SI = 0x1FD7; +constexpr unsigned int mmDP1_DP_DPHY_CRC_EN__SI = 0x1FD6; +constexpr unsigned int mmDP1_DP_DPHY_CRC_RESULT__SI = 0x1FD8; +constexpr unsigned int mmDP1_DP_DPHY_FAST_TRAINING__SI = 0x1FCE; +constexpr unsigned int mmDP1_DP_DPHY_PRBS_CNTL__SI = 0x1FD4; +constexpr unsigned int mmDP1_DP_DPHY_SYM__SI = 0x1FD2; +constexpr unsigned int mmDP1_DP_DPHY_TRAINING_PATTERN_SEL__SI = 0x1FD1; +constexpr unsigned int mmDP1_DP_LINK_CNTL__SI = 0x1FC0; +constexpr unsigned int mmDP1_DP_PIXEL_FORMAT__SI = 0x1FC1; +constexpr unsigned int mmDP1_DP_SEC_AUD_M_READBACK__SI = 0x1FA8; +constexpr unsigned int mmDP1_DP_SEC_AUD_M__SI = 0x1FA7; +constexpr unsigned int mmDP1_DP_SEC_AUD_N_READBACK__SI = 0x1FA6; +constexpr unsigned int mmDP1_DP_SEC_AUD_N__SI = 0x1FA5; +constexpr unsigned int mmDP1_DP_SEC_CNTL__SI = 0x1FA0; +constexpr unsigned int mmDP1_DP_SEC_FRAMING1__SI = 0x1FA1; +constexpr unsigned int mmDP1_DP_SEC_FRAMING2__SI = 0x1FA2; +constexpr unsigned int mmDP1_DP_SEC_FRAMING3__SI = 0x1FA3; +constexpr unsigned int mmDP1_DP_SEC_FRAMING4__SI = 0x1FA4; +constexpr unsigned int mmDP1_DP_SEC_PACKET_CNTL__SI = 0x1FAA; +constexpr unsigned int mmDP1_DP_SEC_TIMESTAMP__SI = 0x1FA9; +constexpr unsigned int mmDP1_DP_STEER_FIFO__SI = 0x1FC4; +constexpr unsigned int mmDP1_DP_TEST_DEBUG_DATA__SI = 0x1FFD; +constexpr unsigned int mmDP1_DP_TEST_DEBUG_INDEX__SI = 0x1FFC; +constexpr unsigned int mmDP1_DP_VID_INTERRUPT_CNTL__SI = 0x1FCF; +constexpr unsigned int mmDP1_DP_VID_MSA_VBID__SI = 0x1FCD; +constexpr unsigned int mmDP1_DP_VID_M__SI = 0x1FCB; +constexpr unsigned int mmDP1_DP_VID_N__SI = 0x1FCA; +constexpr unsigned int mmDP1_DP_VID_STREAM_CNTL__SI = 0x1FC3; +constexpr unsigned int mmDP1_DP_VID_TIMING__SI = 0x1FC9; +constexpr unsigned int mmDP2_DP_CONFIG__SI = 0x42C2; +constexpr unsigned int mmDP2_DP_DPHY_8B10B_CNTL__SI = 0x42D3; +constexpr unsigned int mmDP2_DP_DPHY_CNTL__SI = 0x42D0; +constexpr unsigned int mmDP2_DP_DPHY_CRC_CNTL__SI = 0x42D7; +constexpr unsigned int mmDP2_DP_DPHY_CRC_EN__SI = 0x42D6; +constexpr unsigned int mmDP2_DP_DPHY_CRC_RESULT__SI = 0x42D8; +constexpr unsigned int mmDP2_DP_DPHY_FAST_TRAINING__SI = 0x42CE; +constexpr unsigned int mmDP2_DP_DPHY_PRBS_CNTL__SI = 0x42D4; +constexpr unsigned int mmDP2_DP_DPHY_SYM__SI = 0x42D2; +constexpr unsigned int mmDP2_DP_DPHY_TRAINING_PATTERN_SEL__SI = 0x42D1; +constexpr unsigned int mmDP2_DP_LINK_CNTL__SI = 0x42C0; +constexpr unsigned int mmDP2_DP_PIXEL_FORMAT__SI = 0x42C1; +constexpr unsigned int mmDP2_DP_SEC_AUD_M_READBACK__SI = 0x42A8; +constexpr unsigned int mmDP2_DP_SEC_AUD_M__SI = 0x42A7; +constexpr unsigned int mmDP2_DP_SEC_AUD_N_READBACK__SI = 0x42A6; +constexpr unsigned int mmDP2_DP_SEC_AUD_N__SI = 0x42A5; +constexpr unsigned int mmDP2_DP_SEC_CNTL__SI = 0x42A0; +constexpr unsigned int mmDP2_DP_SEC_FRAMING1__SI = 0x42A1; +constexpr unsigned int mmDP2_DP_SEC_FRAMING2__SI = 0x42A2; +constexpr unsigned int mmDP2_DP_SEC_FRAMING3__SI = 0x42A3; +constexpr unsigned int mmDP2_DP_SEC_FRAMING4__SI = 0x42A4; +constexpr unsigned int mmDP2_DP_SEC_PACKET_CNTL__SI = 0x42AA; +constexpr unsigned int mmDP2_DP_SEC_TIMESTAMP__SI = 0x42A9; +constexpr unsigned int mmDP2_DP_STEER_FIFO__SI = 0x42C4; +constexpr unsigned int mmDP2_DP_TEST_DEBUG_DATA__SI = 0x42FD; +constexpr unsigned int mmDP2_DP_TEST_DEBUG_INDEX__SI = 0x42FC; +constexpr unsigned int mmDP2_DP_VID_INTERRUPT_CNTL__SI = 0x42CF; +constexpr unsigned int mmDP2_DP_VID_MSA_VBID__SI = 0x42CD; +constexpr unsigned int mmDP2_DP_VID_M__SI = 0x42CB; +constexpr unsigned int mmDP2_DP_VID_N__SI = 0x42CA; +constexpr unsigned int mmDP2_DP_VID_STREAM_CNTL__SI = 0x42C3; +constexpr unsigned int mmDP2_DP_VID_TIMING__SI = 0x42C9; +constexpr unsigned int mmDP3_DP_CONFIG__SI = 0x45C2; +constexpr unsigned int mmDP3_DP_DPHY_8B10B_CNTL__SI = 0x45D3; +constexpr unsigned int mmDP3_DP_DPHY_CNTL__SI = 0x45D0; +constexpr unsigned int mmDP3_DP_DPHY_CRC_CNTL__SI = 0x45D7; +constexpr unsigned int mmDP3_DP_DPHY_CRC_EN__SI = 0x45D6; +constexpr unsigned int mmDP3_DP_DPHY_CRC_RESULT__SI = 0x45D8; +constexpr unsigned int mmDP3_DP_DPHY_FAST_TRAINING__SI = 0x45CE; +constexpr unsigned int mmDP3_DP_DPHY_PRBS_CNTL__SI = 0x45D4; +constexpr unsigned int mmDP3_DP_DPHY_SYM__SI = 0x45D2; +constexpr unsigned int mmDP3_DP_DPHY_TRAINING_PATTERN_SEL__SI = 0x45D1; +constexpr unsigned int mmDP3_DP_LINK_CNTL__SI = 0x45C0; +constexpr unsigned int mmDP3_DP_PIXEL_FORMAT__SI = 0x45C1; +constexpr unsigned int mmDP3_DP_SEC_AUD_M_READBACK__SI = 0x45A8; +constexpr unsigned int mmDP3_DP_SEC_AUD_M__SI = 0x45A7; +constexpr unsigned int mmDP3_DP_SEC_AUD_N_READBACK__SI = 0x45A6; +constexpr unsigned int mmDP3_DP_SEC_AUD_N__SI = 0x45A5; +constexpr unsigned int mmDP3_DP_SEC_CNTL__SI = 0x45A0; +constexpr unsigned int mmDP3_DP_SEC_FRAMING1__SI = 0x45A1; +constexpr unsigned int mmDP3_DP_SEC_FRAMING2__SI = 0x45A2; +constexpr unsigned int mmDP3_DP_SEC_FRAMING3__SI = 0x45A3; +constexpr unsigned int mmDP3_DP_SEC_FRAMING4__SI = 0x45A4; +constexpr unsigned int mmDP3_DP_SEC_PACKET_CNTL__SI = 0x45AA; +constexpr unsigned int mmDP3_DP_SEC_TIMESTAMP__SI = 0x45A9; +constexpr unsigned int mmDP3_DP_STEER_FIFO__SI = 0x45C4; +constexpr unsigned int mmDP3_DP_TEST_DEBUG_DATA__SI = 0x45FD; +constexpr unsigned int mmDP3_DP_TEST_DEBUG_INDEX__SI = 0x45FC; +constexpr unsigned int mmDP3_DP_VID_INTERRUPT_CNTL__SI = 0x45CF; +constexpr unsigned int mmDP3_DP_VID_MSA_VBID__SI = 0x45CD; +constexpr unsigned int mmDP3_DP_VID_M__SI = 0x45CB; +constexpr unsigned int mmDP3_DP_VID_N__SI = 0x45CA; +constexpr unsigned int mmDP3_DP_VID_STREAM_CNTL__SI = 0x45C3; +constexpr unsigned int mmDP3_DP_VID_TIMING__SI = 0x45C9; +constexpr unsigned int mmDP4_DP_CONFIG__SI = 0x48C2; +constexpr unsigned int mmDP4_DP_DPHY_8B10B_CNTL__SI = 0x48D3; +constexpr unsigned int mmDP4_DP_DPHY_CNTL__SI = 0x48D0; +constexpr unsigned int mmDP4_DP_DPHY_CRC_CNTL__SI = 0x48D7; +constexpr unsigned int mmDP4_DP_DPHY_CRC_EN__SI = 0x48D6; +constexpr unsigned int mmDP4_DP_DPHY_CRC_RESULT__SI = 0x48D8; +constexpr unsigned int mmDP4_DP_DPHY_FAST_TRAINING__SI = 0x48CE; +constexpr unsigned int mmDP4_DP_DPHY_PRBS_CNTL__SI = 0x48D4; +constexpr unsigned int mmDP4_DP_DPHY_SYM__SI = 0x48D2; +constexpr unsigned int mmDP4_DP_DPHY_TRAINING_PATTERN_SEL__SI = 0x48D1; +constexpr unsigned int mmDP4_DP_LINK_CNTL__SI = 0x48C0; +constexpr unsigned int mmDP4_DP_PIXEL_FORMAT__SI = 0x48C1; +constexpr unsigned int mmDP4_DP_SEC_AUD_M_READBACK__SI = 0x48A8; +constexpr unsigned int mmDP4_DP_SEC_AUD_M__SI = 0x48A7; +constexpr unsigned int mmDP4_DP_SEC_AUD_N_READBACK__SI = 0x48A6; +constexpr unsigned int mmDP4_DP_SEC_AUD_N__SI = 0x48A5; +constexpr unsigned int mmDP4_DP_SEC_CNTL__SI = 0x48A0; +constexpr unsigned int mmDP4_DP_SEC_FRAMING1__SI = 0x48A1; +constexpr unsigned int mmDP4_DP_SEC_FRAMING2__SI = 0x48A2; +constexpr unsigned int mmDP4_DP_SEC_FRAMING3__SI = 0x48A3; +constexpr unsigned int mmDP4_DP_SEC_FRAMING4__SI = 0x48A4; +constexpr unsigned int mmDP4_DP_SEC_PACKET_CNTL__SI = 0x48AA; +constexpr unsigned int mmDP4_DP_SEC_TIMESTAMP__SI = 0x48A9; +constexpr unsigned int mmDP4_DP_STEER_FIFO__SI = 0x48C4; +constexpr unsigned int mmDP4_DP_TEST_DEBUG_DATA__SI = 0x48FD; +constexpr unsigned int mmDP4_DP_TEST_DEBUG_INDEX__SI = 0x48FC; +constexpr unsigned int mmDP4_DP_VID_INTERRUPT_CNTL__SI = 0x48CF; +constexpr unsigned int mmDP4_DP_VID_MSA_VBID__SI = 0x48CD; +constexpr unsigned int mmDP4_DP_VID_M__SI = 0x48CB; +constexpr unsigned int mmDP4_DP_VID_N__SI = 0x48CA; +constexpr unsigned int mmDP4_DP_VID_STREAM_CNTL__SI = 0x48C3; +constexpr unsigned int mmDP4_DP_VID_TIMING__SI = 0x48C9; +constexpr unsigned int mmDP5_DP_CONFIG__SI = 0x4BC2; +constexpr unsigned int mmDP5_DP_DPHY_8B10B_CNTL__SI = 0x4BD3; +constexpr unsigned int mmDP5_DP_DPHY_CNTL__SI = 0x4BD0; +constexpr unsigned int mmDP5_DP_DPHY_CRC_CNTL__SI = 0x4BD7; +constexpr unsigned int mmDP5_DP_DPHY_CRC_EN__SI = 0x4BD6; +constexpr unsigned int mmDP5_DP_DPHY_CRC_RESULT__SI = 0x4BD8; +constexpr unsigned int mmDP5_DP_DPHY_FAST_TRAINING__SI = 0x4BCE; +constexpr unsigned int mmDP5_DP_DPHY_PRBS_CNTL__SI = 0x4BD4; +constexpr unsigned int mmDP5_DP_DPHY_SYM__SI = 0x4BD2; +constexpr unsigned int mmDP5_DP_DPHY_TRAINING_PATTERN_SEL__SI = 0x4BD1; +constexpr unsigned int mmDP5_DP_LINK_CNTL__SI = 0x4BC0; +constexpr unsigned int mmDP5_DP_PIXEL_FORMAT__SI = 0x4BC1; +constexpr unsigned int mmDP5_DP_SEC_AUD_M_READBACK__SI = 0x4BA8; +constexpr unsigned int mmDP5_DP_SEC_AUD_M__SI = 0x4BA7; +constexpr unsigned int mmDP5_DP_SEC_AUD_N_READBACK__SI = 0x4BA6; +constexpr unsigned int mmDP5_DP_SEC_AUD_N__SI = 0x4BA5; +constexpr unsigned int mmDP5_DP_SEC_CNTL__SI = 0x4BA0; +constexpr unsigned int mmDP5_DP_SEC_FRAMING1__SI = 0x4BA1; +constexpr unsigned int mmDP5_DP_SEC_FRAMING2__SI = 0x4BA2; +constexpr unsigned int mmDP5_DP_SEC_FRAMING3__SI = 0x4BA3; +constexpr unsigned int mmDP5_DP_SEC_FRAMING4__SI = 0x4BA4; +constexpr unsigned int mmDP5_DP_SEC_PACKET_CNTL__SI = 0x4BAA; +constexpr unsigned int mmDP5_DP_SEC_TIMESTAMP__SI = 0x4BA9; +constexpr unsigned int mmDP5_DP_STEER_FIFO__SI = 0x4BC4; +constexpr unsigned int mmDP5_DP_TEST_DEBUG_DATA__SI = 0x4BFD; +constexpr unsigned int mmDP5_DP_TEST_DEBUG_INDEX__SI = 0x4BFC; +constexpr unsigned int mmDP5_DP_VID_INTERRUPT_CNTL__SI = 0x4BCF; +constexpr unsigned int mmDP5_DP_VID_MSA_VBID__SI = 0x4BCD; +constexpr unsigned int mmDP5_DP_VID_M__SI = 0x4BCB; +constexpr unsigned int mmDP5_DP_VID_N__SI = 0x4BCA; +constexpr unsigned int mmDP5_DP_VID_STREAM_CNTL__SI = 0x4BC3; +constexpr unsigned int mmDP5_DP_VID_TIMING__SI = 0x4BC9; +constexpr unsigned int mmDP_AUX0_AUX_ARB_CONTROL__SI = 0x1882; +constexpr unsigned int mmDP_AUX0_AUX_CONTROL__SI = 0x1880; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_RX_CONTROL0__SI = 0x188A; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_RX_CONTROL1__SI = 0x188B; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_RX_STATUS__SI = 0x188D; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_TX_CONTROL__SI = 0x1889; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_TX_REF_CONTROL__SI = 0x1888; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_TX_STATUS__SI = 0x188C; +constexpr unsigned int mmDP_AUX0_AUX_INTERRUPT_CONTROL__SI = 0x1883; +constexpr unsigned int mmDP_AUX0_AUX_LS_DATA__SI = 0x1887; +constexpr unsigned int mmDP_AUX0_AUX_LS_STATUS__SI = 0x1885; +constexpr unsigned int mmDP_AUX0_AUX_SW_CONTROL__SI = 0x1881; +constexpr unsigned int mmDP_AUX0_AUX_SW_DATA__SI = 0x1886; +constexpr unsigned int mmDP_AUX0_AUX_SW_STATUS__SI = 0x1884; +constexpr unsigned int mmDP_AUX1_AUX_ARB_CONTROL__SI = 0x1896; +constexpr unsigned int mmDP_AUX1_AUX_CONTROL__SI = 0x1894; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_RX_CONTROL0__SI = 0x189E; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_RX_CONTROL1__SI = 0x189F; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_RX_STATUS__SI = 0x18A1; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_TX_CONTROL__SI = 0x189D; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_TX_REF_CONTROL__SI = 0x189C; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_TX_STATUS__SI = 0x18A0; +constexpr unsigned int mmDP_AUX1_AUX_INTERRUPT_CONTROL__SI = 0x1897; +constexpr unsigned int mmDP_AUX1_AUX_LS_DATA__SI = 0x189B; +constexpr unsigned int mmDP_AUX1_AUX_LS_STATUS__SI = 0x1899; +constexpr unsigned int mmDP_AUX1_AUX_SW_CONTROL__SI = 0x1895; +constexpr unsigned int mmDP_AUX1_AUX_SW_DATA__SI = 0x189A; +constexpr unsigned int mmDP_AUX1_AUX_SW_STATUS__SI = 0x1898; +constexpr unsigned int mmDP_AUX2_AUX_ARB_CONTROL__SI = 0x18AA; +constexpr unsigned int mmDP_AUX2_AUX_CONTROL__SI = 0x18A8; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_RX_CONTROL0__SI = 0x18B2; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_RX_CONTROL1__SI = 0x18B3; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_RX_STATUS__SI = 0x18B5; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_TX_CONTROL__SI = 0x18B1; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_TX_REF_CONTROL__SI = 0x18B0; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_TX_STATUS__SI = 0x18B4; +constexpr unsigned int mmDP_AUX2_AUX_INTERRUPT_CONTROL__SI = 0x18AB; +constexpr unsigned int mmDP_AUX2_AUX_LS_DATA__SI = 0x18AF; +constexpr unsigned int mmDP_AUX2_AUX_LS_STATUS__SI = 0x18AD; +constexpr unsigned int mmDP_AUX2_AUX_SW_CONTROL__SI = 0x18A9; +constexpr unsigned int mmDP_AUX2_AUX_SW_DATA__SI = 0x18AE; +constexpr unsigned int mmDP_AUX2_AUX_SW_STATUS__SI = 0x18AC; +constexpr unsigned int mmDP_AUX3_AUX_ARB_CONTROL__SI = 0x18C2; +constexpr unsigned int mmDP_AUX3_AUX_CONTROL__SI = 0x18C0; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_RX_CONTROL0__SI = 0x18CA; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_RX_CONTROL1__SI = 0x18CB; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_RX_STATUS__SI = 0x18CD; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_TX_CONTROL__SI = 0x18C9; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_TX_REF_CONTROL__SI = 0x18C8; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_TX_STATUS__SI = 0x18CC; +constexpr unsigned int mmDP_AUX3_AUX_INTERRUPT_CONTROL__SI = 0x18C3; +constexpr unsigned int mmDP_AUX3_AUX_LS_DATA__SI = 0x18C7; +constexpr unsigned int mmDP_AUX3_AUX_LS_STATUS__SI = 0x18C5; +constexpr unsigned int mmDP_AUX3_AUX_SW_CONTROL__SI = 0x18C1; +constexpr unsigned int mmDP_AUX3_AUX_SW_DATA__SI = 0x18C6; +constexpr unsigned int mmDP_AUX3_AUX_SW_STATUS__SI = 0x18C4; +constexpr unsigned int mmDP_AUX4_AUX_ARB_CONTROL__SI = 0x18D6; +constexpr unsigned int mmDP_AUX4_AUX_CONTROL__SI = 0x18D4; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_RX_CONTROL0__SI = 0x18DE; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_RX_CONTROL1__SI = 0x18DF; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_RX_STATUS__SI = 0x18E1; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_TX_CONTROL__SI = 0x18DD; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_TX_REF_CONTROL__SI = 0x18DC; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_TX_STATUS__SI = 0x18E0; +constexpr unsigned int mmDP_AUX4_AUX_INTERRUPT_CONTROL__SI = 0x18D7; +constexpr unsigned int mmDP_AUX4_AUX_LS_DATA__SI = 0x18DB; +constexpr unsigned int mmDP_AUX4_AUX_LS_STATUS__SI = 0x18D9; +constexpr unsigned int mmDP_AUX4_AUX_SW_CONTROL__SI = 0x18D5; +constexpr unsigned int mmDP_AUX4_AUX_SW_DATA__SI = 0x18DA; +constexpr unsigned int mmDP_AUX4_AUX_SW_STATUS__SI = 0x18D8; +constexpr unsigned int mmDP_AUX5_AUX_ARB_CONTROL__SI = 0x18EA; +constexpr unsigned int mmDP_AUX5_AUX_CONTROL__SI = 0x18E8; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_RX_CONTROL0__SI = 0x18F2; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_RX_CONTROL1__SI = 0x18F3; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_RX_STATUS__SI = 0x18F5; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_TX_CONTROL__SI = 0x18F1; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_TX_REF_CONTROL__SI = 0x18F0; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_TX_STATUS__SI = 0x18F4; +constexpr unsigned int mmDP_AUX5_AUX_INTERRUPT_CONTROL__SI = 0x18EB; +constexpr unsigned int mmDP_AUX5_AUX_LS_DATA__SI = 0x18EF; +constexpr unsigned int mmDP_AUX5_AUX_LS_STATUS__SI = 0x18ED; +constexpr unsigned int mmDP_AUX5_AUX_SW_CONTROL__SI = 0x18E9; +constexpr unsigned int mmDP_AUX5_AUX_SW_DATA__SI = 0x18EE; +constexpr unsigned int mmDP_AUX5_AUX_SW_STATUS__SI = 0x18EC; +constexpr unsigned int mmDP_CONFIG__SI = 0x1CC2; +constexpr unsigned int mmDP_DPHY_8B10B_CNTL__SI = 0x1CD3; +constexpr unsigned int mmDP_DPHY_CNTL__SI = 0x1CD0; +constexpr unsigned int mmDP_DPHY_CRC_CNTL__SI = 0x1CD7; +constexpr unsigned int mmDP_DPHY_CRC_EN__SI = 0x1CD6; +constexpr unsigned int mmDP_DPHY_CRC_RESULT__SI = 0x1CD8; +constexpr unsigned int mmDP_DPHY_FAST_TRAINING__SI = 0x1CCE; +constexpr unsigned int mmDP_DPHY_PRBS_CNTL__SI = 0x1CD4; +constexpr unsigned int mmDP_DPHY_SYM__SI = 0x1CD2; +constexpr unsigned int mmDP_DPHY_TRAINING_PATTERN_SEL__SI = 0x1CD1; +constexpr unsigned int mmDP_DTO0_MODULO__SI = 0x0171; +constexpr unsigned int mmDP_DTO0_PHASE__SI = 0x0170; +constexpr unsigned int mmDP_DTO1_MODULO__SI = 0x0173; +constexpr unsigned int mmDP_DTO1_PHASE__SI = 0x0172; +constexpr unsigned int mmDP_DTO2_MODULO__SI = 0x0175; +constexpr unsigned int mmDP_DTO2_PHASE__SI = 0x0174; +constexpr unsigned int mmDP_DTO3_MODULO__SI = 0x0177; +constexpr unsigned int mmDP_DTO3_PHASE__SI = 0x0176; +constexpr unsigned int mmDP_DTO4_MODULO__SI = 0x0179; +constexpr unsigned int mmDP_DTO4_PHASE__SI = 0x0178; +constexpr unsigned int mmDP_DTO5_MODULO__SI = 0x017B; +constexpr unsigned int mmDP_DTO5_PHASE__SI = 0x017A; +constexpr unsigned int mmDP_LINK_CNTL__SI = 0x1CC0; +constexpr unsigned int mmDP_PIXEL_FORMAT__SI = 0x1CC1; +constexpr unsigned int mmDP_SEC_AUD_M_READBACK__SI = 0x1CA8; +constexpr unsigned int mmDP_SEC_AUD_M__SI = 0x1CA7; +constexpr unsigned int mmDP_SEC_AUD_N_READBACK__SI = 0x1CA6; +constexpr unsigned int mmDP_SEC_AUD_N__SI = 0x1CA5; +constexpr unsigned int mmDP_SEC_CNTL__SI = 0x1CA0; +constexpr unsigned int mmDP_SEC_FRAMING1__SI = 0x1CA1; +constexpr unsigned int mmDP_SEC_FRAMING2__SI = 0x1CA2; +constexpr unsigned int mmDP_SEC_FRAMING3__SI = 0x1CA3; +constexpr unsigned int mmDP_SEC_FRAMING4__SI = 0x1CA4; +constexpr unsigned int mmDP_SEC_PACKET_CNTL__SI = 0x1CAA; +constexpr unsigned int mmDP_SEC_TIMESTAMP__SI = 0x1CA9; +constexpr unsigned int mmDP_STEER_FIFO__SI = 0x1CC4; +constexpr unsigned int mmDP_TEST_DEBUG_DATA__SI = 0x1CFD; +constexpr unsigned int mmDP_TEST_DEBUG_INDEX__SI = 0x1CFC; +constexpr unsigned int mmDP_VID_INTERRUPT_CNTL__SI = 0x1CCF; +constexpr unsigned int mmDP_VID_MSA_VBID__SI = 0x1CCD; +constexpr unsigned int mmDP_VID_M__SI = 0x1CCB; +constexpr unsigned int mmDP_VID_N__SI = 0x1CCA; +constexpr unsigned int mmDP_VID_STREAM_CNTL__SI = 0x1CC3; +constexpr unsigned int mmDP_VID_TIMING__SI = 0x1CC9; +constexpr unsigned int mmDVOACLKC_CNTL__SI = 0x014E; +constexpr unsigned int mmDVOACLKC_MVP_CNTL__SI = 0x014D; +constexpr unsigned int mmDVOACLKD_CNTL__SI = 0x014C; +constexpr unsigned int mmDVO_CONTROL__SI = 0x185B; +constexpr unsigned int mmDVO_CRC2_SIG_MASK__SI = 0x185D; +constexpr unsigned int mmDVO_CRC2_SIG_RESULT__SI = 0x185E; +constexpr unsigned int mmDVO_CRC_EN__SI = 0x185C; +constexpr unsigned int mmDVO_ENABLE__SI = 0x1858; +constexpr unsigned int mmDVO_OUTPUT__SI = 0x185A; +constexpr unsigned int mmDVO_SOURCE_SELECT__SI = 0x1859; +constexpr unsigned int mmDVO_STRENGTH_CONTROL__SI = 0x195D; +constexpr unsigned int mmEXT_OVERSCAN_LEFT_RIGHT__SI__VI = 0x1B5E; +constexpr unsigned int mmEXT_OVERSCAN_TOP_BOTTOM__SI__VI = 0x1B5F; +constexpr unsigned int mmFBC_CLIENT_REGION_MASK__SI = 0x16EB; +constexpr unsigned int mmFBC_CNTL__SI = 0x16D0; +constexpr unsigned int mmFBC_COMP_CNTL__SI = 0x16D4; +constexpr unsigned int mmFBC_COMP_MODE__SI = 0x16D5; +constexpr unsigned int mmFBC_CSM_REGION_OFFSET_01__SI = 0x16E9; +constexpr unsigned int mmFBC_CSM_REGION_OFFSET_23__SI = 0x16EA; +constexpr unsigned int mmFBC_DEBUG0__SI = 0x16D6; +constexpr unsigned int mmFBC_DEBUG1__SI = 0x16D7; +constexpr unsigned int mmFBC_DEBUG2__SI = 0x16D8; +constexpr unsigned int mmFBC_DEBUG_COMP__SI = 0x16EC; +constexpr unsigned int mmFBC_DEBUG_CSR_RDATA__SI = 0x16EE; +constexpr unsigned int mmFBC_DEBUG_CSR_WDATA__SI = 0x16EF; +constexpr unsigned int mmFBC_DEBUG_CSR__SI = 0x16ED; +constexpr unsigned int mmFBC_IDLE_FORCE_CLEAR_MASK__SI = 0x16D2; +constexpr unsigned int mmFBC_IDLE_MASK__SI = 0x16D1; +constexpr unsigned int mmFBC_IND_LUT0__SI = 0x16D9; +constexpr unsigned int mmFBC_IND_LUT10__SI = 0x16E3; +constexpr unsigned int mmFBC_IND_LUT11__SI = 0x16E4; +constexpr unsigned int mmFBC_IND_LUT12__SI = 0x16E5; +constexpr unsigned int mmFBC_IND_LUT13__SI = 0x16E6; +constexpr unsigned int mmFBC_IND_LUT14__SI = 0x16E7; +constexpr unsigned int mmFBC_IND_LUT15__SI = 0x16E8; +constexpr unsigned int mmFBC_IND_LUT1__SI = 0x16DA; +constexpr unsigned int mmFBC_IND_LUT2__SI = 0x16DB; +constexpr unsigned int mmFBC_IND_LUT3__SI = 0x16DC; +constexpr unsigned int mmFBC_IND_LUT4__SI = 0x16DD; +constexpr unsigned int mmFBC_IND_LUT5__SI = 0x16DE; +constexpr unsigned int mmFBC_IND_LUT6__SI = 0x16DF; +constexpr unsigned int mmFBC_IND_LUT7__SI = 0x16E0; +constexpr unsigned int mmFBC_IND_LUT8__SI = 0x16E1; +constexpr unsigned int mmFBC_IND_LUT9__SI = 0x16E2; +constexpr unsigned int mmFBC_MISC__SI = 0x16F0; +constexpr unsigned int mmFBC_START_STOP_DELAY__SI = 0x16D3; +constexpr unsigned int mmFBC_TEST_DEBUG_DATA__SI = 0x16F5; +constexpr unsigned int mmFBC_TEST_DEBUG_INDEX__SI = 0x16F4; +constexpr unsigned int mmFMT0_FMT_BIT_DEPTH_CONTROL__SI__VI = 0x1BF2; +constexpr unsigned int mmFMT0_FMT_CLAMP_CNTL__SI__VI = 0x1BF9; +constexpr unsigned int mmFMT0_FMT_CONTROL__SI__VI = 0x1BEE; +constexpr unsigned int mmFMT0_FMT_CRC_CNTL__SI__VI = 0x1BFA; +constexpr unsigned int mmFMT0_FMT_CRC_SIG_BLUE_CONTROL_MASK__SI__VI = 0x1BFC; +constexpr unsigned int mmFMT0_FMT_CRC_SIG_BLUE_CONTROL__SI__VI = 0x1BFE; +constexpr unsigned int mmFMT0_FMT_CRC_SIG_RED_GREEN_MASK__SI__VI = 0x1BFB; +constexpr unsigned int mmFMT0_FMT_CRC_SIG_RED_GREEN__SI__VI = 0x1BFD; +constexpr unsigned int mmFMT0_FMT_DEBUG_CNTL__SI__VI = 0x1BFF; +constexpr unsigned int mmFMT0_FMT_DITHER_RAND_B_SEED__SI__VI = 0x1BF5; +constexpr unsigned int mmFMT0_FMT_DITHER_RAND_G_SEED__SI__VI = 0x1BF4; +constexpr unsigned int mmFMT0_FMT_DITHER_RAND_R_SEED__SI__VI = 0x1BF3; +constexpr unsigned int mmFMT0_FMT_DYNAMIC_EXP_CNTL__SI__VI = 0x1BED; +constexpr unsigned int mmFMT0_FMT_FORCE_DATA_0_1__SI__VI = 0x1BF0; +constexpr unsigned int mmFMT0_FMT_FORCE_DATA_2_3__SI__VI = 0x1BF1; +constexpr unsigned int mmFMT0_FMT_FORCE_OUTPUT_CNTL__SI__VI = 0x1BEF; +constexpr unsigned int mmFMT0_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI__VI = 0x1BF6; +constexpr unsigned int mmFMT0_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI__VI = 0x1BF7; +constexpr unsigned int mmFMT0_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI__VI = 0x1BF8; +constexpr unsigned int mmFMT1_FMT_BIT_DEPTH_CONTROL__SI = 0x1EF2; +constexpr unsigned int mmFMT1_FMT_CLAMP_CNTL__SI = 0x1EF9; +constexpr unsigned int mmFMT1_FMT_CONTROL__SI = 0x1EEE; +constexpr unsigned int mmFMT1_FMT_CRC_CNTL__SI = 0x1EFA; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_BLUE_CONTROL_MASK__SI = 0x1EFC; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_BLUE_CONTROL__SI = 0x1EFE; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_RED_GREEN_MASK__SI = 0x1EFB; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_RED_GREEN__SI = 0x1EFD; +constexpr unsigned int mmFMT1_FMT_DEBUG_CNTL__SI = 0x1EFF; +constexpr unsigned int mmFMT1_FMT_DITHER_RAND_B_SEED__SI = 0x1EF5; +constexpr unsigned int mmFMT1_FMT_DITHER_RAND_G_SEED__SI = 0x1EF4; +constexpr unsigned int mmFMT1_FMT_DITHER_RAND_R_SEED__SI = 0x1EF3; +constexpr unsigned int mmFMT1_FMT_DYNAMIC_EXP_CNTL__SI = 0x1EED; +constexpr unsigned int mmFMT1_FMT_FORCE_DATA_0_1__SI = 0x1EF0; +constexpr unsigned int mmFMT1_FMT_FORCE_DATA_2_3__SI = 0x1EF1; +constexpr unsigned int mmFMT1_FMT_FORCE_OUTPUT_CNTL__SI = 0x1EEF; +constexpr unsigned int mmFMT1_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI = 0x1EF6; +constexpr unsigned int mmFMT1_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI = 0x1EF7; +constexpr unsigned int mmFMT1_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI = 0x1EF8; +constexpr unsigned int mmFMT2_FMT_BIT_DEPTH_CONTROL__SI = 0x41F2; +constexpr unsigned int mmFMT2_FMT_CLAMP_CNTL__SI = 0x41F9; +constexpr unsigned int mmFMT2_FMT_CONTROL__SI = 0x41EE; +constexpr unsigned int mmFMT2_FMT_CRC_CNTL__SI = 0x41FA; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_BLUE_CONTROL_MASK__SI = 0x41FC; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_BLUE_CONTROL__SI = 0x41FE; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_RED_GREEN_MASK__SI = 0x41FB; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_RED_GREEN__SI = 0x41FD; +constexpr unsigned int mmFMT2_FMT_DEBUG_CNTL__SI = 0x41FF; +constexpr unsigned int mmFMT2_FMT_DITHER_RAND_B_SEED__SI = 0x41F5; +constexpr unsigned int mmFMT2_FMT_DITHER_RAND_G_SEED__SI = 0x41F4; +constexpr unsigned int mmFMT2_FMT_DITHER_RAND_R_SEED__SI = 0x41F3; +constexpr unsigned int mmFMT2_FMT_DYNAMIC_EXP_CNTL__SI = 0x41ED; +constexpr unsigned int mmFMT2_FMT_FORCE_DATA_0_1__SI = 0x41F0; +constexpr unsigned int mmFMT2_FMT_FORCE_DATA_2_3__SI = 0x41F1; +constexpr unsigned int mmFMT2_FMT_FORCE_OUTPUT_CNTL__SI = 0x41EF; +constexpr unsigned int mmFMT2_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI = 0x41F6; +constexpr unsigned int mmFMT2_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI = 0x41F7; +constexpr unsigned int mmFMT2_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI = 0x41F8; +constexpr unsigned int mmFMT3_FMT_BIT_DEPTH_CONTROL__SI = 0x44F2; +constexpr unsigned int mmFMT3_FMT_CLAMP_CNTL__SI = 0x44F9; +constexpr unsigned int mmFMT3_FMT_CONTROL__SI = 0x44EE; +constexpr unsigned int mmFMT3_FMT_CRC_CNTL__SI = 0x44FA; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_BLUE_CONTROL_MASK__SI = 0x44FC; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_BLUE_CONTROL__SI = 0x44FE; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_RED_GREEN_MASK__SI = 0x44FB; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_RED_GREEN__SI = 0x44FD; +constexpr unsigned int mmFMT3_FMT_DEBUG_CNTL__SI = 0x44FF; +constexpr unsigned int mmFMT3_FMT_DITHER_RAND_B_SEED__SI = 0x44F5; +constexpr unsigned int mmFMT3_FMT_DITHER_RAND_G_SEED__SI = 0x44F4; +constexpr unsigned int mmFMT3_FMT_DITHER_RAND_R_SEED__SI = 0x44F3; +constexpr unsigned int mmFMT3_FMT_DYNAMIC_EXP_CNTL__SI = 0x44ED; +constexpr unsigned int mmFMT3_FMT_FORCE_DATA_0_1__SI = 0x44F0; +constexpr unsigned int mmFMT3_FMT_FORCE_DATA_2_3__SI = 0x44F1; +constexpr unsigned int mmFMT3_FMT_FORCE_OUTPUT_CNTL__SI = 0x44EF; +constexpr unsigned int mmFMT3_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI = 0x44F6; +constexpr unsigned int mmFMT3_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI = 0x44F7; +constexpr unsigned int mmFMT3_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI = 0x44F8; +constexpr unsigned int mmFMT4_FMT_BIT_DEPTH_CONTROL__SI = 0x47F2; +constexpr unsigned int mmFMT4_FMT_CLAMP_CNTL__SI = 0x47F9; +constexpr unsigned int mmFMT4_FMT_CONTROL__SI = 0x47EE; +constexpr unsigned int mmFMT4_FMT_CRC_CNTL__SI = 0x47FA; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_BLUE_CONTROL_MASK__SI = 0x47FC; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_BLUE_CONTROL__SI = 0x47FE; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_RED_GREEN_MASK__SI = 0x47FB; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_RED_GREEN__SI = 0x47FD; +constexpr unsigned int mmFMT4_FMT_DEBUG_CNTL__SI = 0x47FF; +constexpr unsigned int mmFMT4_FMT_DITHER_RAND_B_SEED__SI = 0x47F5; +constexpr unsigned int mmFMT4_FMT_DITHER_RAND_G_SEED__SI = 0x47F4; +constexpr unsigned int mmFMT4_FMT_DITHER_RAND_R_SEED__SI = 0x47F3; +constexpr unsigned int mmFMT4_FMT_DYNAMIC_EXP_CNTL__SI = 0x47ED; +constexpr unsigned int mmFMT4_FMT_FORCE_DATA_0_1__SI = 0x47F0; +constexpr unsigned int mmFMT4_FMT_FORCE_DATA_2_3__SI = 0x47F1; +constexpr unsigned int mmFMT4_FMT_FORCE_OUTPUT_CNTL__SI = 0x47EF; +constexpr unsigned int mmFMT4_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI = 0x47F6; +constexpr unsigned int mmFMT4_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI = 0x47F7; +constexpr unsigned int mmFMT4_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI = 0x47F8; +constexpr unsigned int mmFMT5_FMT_BIT_DEPTH_CONTROL__SI = 0x4AF2; +constexpr unsigned int mmFMT5_FMT_CLAMP_CNTL__SI = 0x4AF9; +constexpr unsigned int mmFMT5_FMT_CONTROL__SI = 0x4AEE; +constexpr unsigned int mmFMT5_FMT_CRC_CNTL__SI = 0x4AFA; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_BLUE_CONTROL_MASK__SI = 0x4AFC; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_BLUE_CONTROL__SI = 0x4AFE; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_RED_GREEN_MASK__SI = 0x4AFB; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_RED_GREEN__SI = 0x4AFD; +constexpr unsigned int mmFMT5_FMT_DEBUG_CNTL__SI = 0x4AFF; +constexpr unsigned int mmFMT5_FMT_DITHER_RAND_B_SEED__SI = 0x4AF5; +constexpr unsigned int mmFMT5_FMT_DITHER_RAND_G_SEED__SI = 0x4AF4; +constexpr unsigned int mmFMT5_FMT_DITHER_RAND_R_SEED__SI = 0x4AF3; +constexpr unsigned int mmFMT5_FMT_DYNAMIC_EXP_CNTL__SI = 0x4AED; +constexpr unsigned int mmFMT5_FMT_FORCE_DATA_0_1__SI = 0x4AF0; +constexpr unsigned int mmFMT5_FMT_FORCE_DATA_2_3__SI = 0x4AF1; +constexpr unsigned int mmFMT5_FMT_FORCE_OUTPUT_CNTL__SI = 0x4AEF; +constexpr unsigned int mmFMT5_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI = 0x4AF6; +constexpr unsigned int mmFMT5_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI = 0x4AF7; +constexpr unsigned int mmFMT5_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI = 0x4AF8; +constexpr unsigned int mmFMT_BIT_DEPTH_CONTROL__SI__VI = 0x1BF2; +constexpr unsigned int mmFMT_CLAMP_CNTL__SI__VI = 0x1BF9; +constexpr unsigned int mmFMT_CONTROL__SI__VI = 0x1BEE; +constexpr unsigned int mmFMT_CRC_CNTL__SI__VI = 0x1BFA; +constexpr unsigned int mmFMT_CRC_SIG_BLUE_CONTROL_MASK__SI__VI = 0x1BFC; +constexpr unsigned int mmFMT_CRC_SIG_BLUE_CONTROL__SI__VI = 0x1BFE; +constexpr unsigned int mmFMT_CRC_SIG_RED_GREEN_MASK__SI__VI = 0x1BFB; +constexpr unsigned int mmFMT_CRC_SIG_RED_GREEN__SI__VI = 0x1BFD; +constexpr unsigned int mmFMT_DEBUG_CNTL__SI__VI = 0x1BFF; +constexpr unsigned int mmFMT_DITHER_RAND_B_SEED__SI__VI = 0x1BF5; +constexpr unsigned int mmFMT_DITHER_RAND_G_SEED__SI__VI = 0x1BF4; +constexpr unsigned int mmFMT_DITHER_RAND_R_SEED__SI__VI = 0x1BF3; +constexpr unsigned int mmFMT_DYNAMIC_EXP_CNTL__SI__VI = 0x1BED; +constexpr unsigned int mmFMT_FORCE_DATA_0_1__SI__VI = 0x1BF0; +constexpr unsigned int mmFMT_FORCE_DATA_2_3__SI__VI = 0x1BF1; +constexpr unsigned int mmFMT_FORCE_OUTPUT_CNTL__SI__VI = 0x1BEF; +constexpr unsigned int mmFMT_TEMPORAL_DITHER_PATTERN_CONTROL__SI__VI = 0x1BF6; +constexpr unsigned int mmFMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__SI__VI = 0x1BF7; +constexpr unsigned int mmFMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__SI__VI = 0x1BF8; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_0__CI__VI = 0x1403; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_1__CI__VI = 0x1405; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_2__CI__VI = 0x1407; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_3__CI__VI = 0x1409; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_4__CI__VI = 0x140B; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_5__CI__VI = 0x140D; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_6__CI__VI = 0x140F; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_END_7__CI__VI = 0x1411; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_0__CI__VI = 0x1402; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_1__CI__VI = 0x1404; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_2__CI__VI = 0x1406; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_3__CI__VI = 0x1408; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_4__CI__VI = 0x140A; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_5__CI__VI = 0x140C; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_6__CI__VI = 0x140E; +constexpr unsigned int mmGARLIC_FLUSH_ADDR_START_7__CI__VI = 0x1410; +constexpr unsigned int mmGARLIC_FLUSH_CNTL__CI__VI = 0x1401; +constexpr unsigned int mmGARLIC_FLUSH_REQ__CI__VI = 0x1412; +constexpr unsigned int mmGB_ADDR_CONFIG = 0x263E; +constexpr unsigned int mmGB_BACKEND_MAP = 0x263F; +constexpr unsigned int mmGB_EDC_MODE = 0x307E; +constexpr unsigned int mmGB_GPU_ID = 0x2640; +constexpr unsigned int mmGB_MACROTILE_MODE0__CI__VI = 0x2664; +constexpr unsigned int mmGB_MACROTILE_MODE10__CI__VI = 0x266E; +constexpr unsigned int mmGB_MACROTILE_MODE11__CI__VI = 0x266F; +constexpr unsigned int mmGB_MACROTILE_MODE12__CI__VI = 0x2670; +constexpr unsigned int mmGB_MACROTILE_MODE13__CI__VI = 0x2671; +constexpr unsigned int mmGB_MACROTILE_MODE14__CI__VI = 0x2672; +constexpr unsigned int mmGB_MACROTILE_MODE15__CI__VI = 0x2673; +constexpr unsigned int mmGB_MACROTILE_MODE1__CI__VI = 0x2665; +constexpr unsigned int mmGB_MACROTILE_MODE2__CI__VI = 0x2666; +constexpr unsigned int mmGB_MACROTILE_MODE3__CI__VI = 0x2667; +constexpr unsigned int mmGB_MACROTILE_MODE4__CI__VI = 0x2668; +constexpr unsigned int mmGB_MACROTILE_MODE5__CI__VI = 0x2669; +constexpr unsigned int mmGB_MACROTILE_MODE6__CI__VI = 0x266A; +constexpr unsigned int mmGB_MACROTILE_MODE7__CI__VI = 0x266B; +constexpr unsigned int mmGB_MACROTILE_MODE8__CI__VI = 0x266C; +constexpr unsigned int mmGB_MACROTILE_MODE9__CI__VI = 0x266D; +constexpr unsigned int mmGB_TILE_MODE0 = 0x2644; +constexpr unsigned int mmGB_TILE_MODE1 = 0x2645; +constexpr unsigned int mmGB_TILE_MODE10 = 0x264E; +constexpr unsigned int mmGB_TILE_MODE11 = 0x264F; +constexpr unsigned int mmGB_TILE_MODE12 = 0x2650; +constexpr unsigned int mmGB_TILE_MODE13 = 0x2651; +constexpr unsigned int mmGB_TILE_MODE14 = 0x2652; +constexpr unsigned int mmGB_TILE_MODE15 = 0x2653; +constexpr unsigned int mmGB_TILE_MODE16 = 0x2654; +constexpr unsigned int mmGB_TILE_MODE17 = 0x2655; +constexpr unsigned int mmGB_TILE_MODE18 = 0x2656; +constexpr unsigned int mmGB_TILE_MODE19 = 0x2657; +constexpr unsigned int mmGB_TILE_MODE2 = 0x2646; +constexpr unsigned int mmGB_TILE_MODE20 = 0x2658; +constexpr unsigned int mmGB_TILE_MODE21 = 0x2659; +constexpr unsigned int mmGB_TILE_MODE22 = 0x265A; +constexpr unsigned int mmGB_TILE_MODE23 = 0x265B; +constexpr unsigned int mmGB_TILE_MODE24 = 0x265C; +constexpr unsigned int mmGB_TILE_MODE25 = 0x265D; +constexpr unsigned int mmGB_TILE_MODE26 = 0x265E; +constexpr unsigned int mmGB_TILE_MODE27 = 0x265F; +constexpr unsigned int mmGB_TILE_MODE28 = 0x2660; +constexpr unsigned int mmGB_TILE_MODE29 = 0x2661; +constexpr unsigned int mmGB_TILE_MODE3 = 0x2647; +constexpr unsigned int mmGB_TILE_MODE30 = 0x2662; +constexpr unsigned int mmGB_TILE_MODE31 = 0x2663; +constexpr unsigned int mmGB_TILE_MODE4 = 0x2648; +constexpr unsigned int mmGB_TILE_MODE5 = 0x2649; +constexpr unsigned int mmGB_TILE_MODE6 = 0x264A; +constexpr unsigned int mmGB_TILE_MODE7 = 0x264B; +constexpr unsigned int mmGB_TILE_MODE8 = 0x264C; +constexpr unsigned int mmGB_TILE_MODE9 = 0x264D; +constexpr unsigned int mmGCK_SMC_IND_DATA__CI__VI = 0x0081; +constexpr unsigned int mmGCK_SMC_IND_INDEX__CI__VI = 0x0080; +constexpr unsigned int mmGC_USER_PRIM_CONFIG__CI__VI = 0x2241; +constexpr unsigned int mmGC_USER_RB_BACKEND_DISABLE = 0x26DF; +constexpr unsigned int mmGC_USER_RB_REDUNDANCY__CI__VI = 0x26DE; +constexpr unsigned int mmGC_USER_SHADER_ARRAY_CONFIG = 0x2270; +constexpr unsigned int mmGC_USER_SYS_RB_BACKEND_DISABLE = 0x03A1; +constexpr unsigned int mmGDS_ATOM_BASE__CI__VI = 0xC40C; +constexpr unsigned int mmGDS_ATOM_BASE__SI = 0x25CE; +constexpr unsigned int mmGDS_ATOM_CNTL__CI__VI = 0xC40A; +constexpr unsigned int mmGDS_ATOM_CNTL__SI = 0x25CC; +constexpr unsigned int mmGDS_ATOM_COMPLETE__CI__VI = 0xC40B; +constexpr unsigned int mmGDS_ATOM_COMPLETE__SI = 0x25CD; +constexpr unsigned int mmGDS_ATOM_DST__CI__VI = 0xC410; +constexpr unsigned int mmGDS_ATOM_DST__SI = 0x25D2; +constexpr unsigned int mmGDS_ATOM_OFFSET0__CI__VI = 0xC40E; +constexpr unsigned int mmGDS_ATOM_OFFSET0__SI = 0x25D0; +constexpr unsigned int mmGDS_ATOM_OFFSET1__CI__VI = 0xC40F; +constexpr unsigned int mmGDS_ATOM_OFFSET1__SI = 0x25D1; +constexpr unsigned int mmGDS_ATOM_OP__CI__VI = 0xC411; +constexpr unsigned int mmGDS_ATOM_OP__SI = 0x25D3; +constexpr unsigned int mmGDS_ATOM_READ0_U__CI__VI = 0xC417; +constexpr unsigned int mmGDS_ATOM_READ0_U__SI = 0x25D9; +constexpr unsigned int mmGDS_ATOM_READ0__CI__VI = 0xC416; +constexpr unsigned int mmGDS_ATOM_READ0__SI = 0x25D8; +constexpr unsigned int mmGDS_ATOM_READ1_U__CI__VI = 0xC419; +constexpr unsigned int mmGDS_ATOM_READ1_U__SI = 0x25DB; +constexpr unsigned int mmGDS_ATOM_READ1__CI__VI = 0xC418; +constexpr unsigned int mmGDS_ATOM_READ1__SI = 0x25DA; +constexpr unsigned int mmGDS_ATOM_SIZE__CI__VI = 0xC40D; +constexpr unsigned int mmGDS_ATOM_SIZE__SI = 0x25CF; +constexpr unsigned int mmGDS_ATOM_SRC0_U__CI__VI = 0xC413; +constexpr unsigned int mmGDS_ATOM_SRC0_U__SI = 0x25D5; +constexpr unsigned int mmGDS_ATOM_SRC0__CI__VI = 0xC412; +constexpr unsigned int mmGDS_ATOM_SRC0__SI = 0x25D4; +constexpr unsigned int mmGDS_ATOM_SRC1_U__CI__VI = 0xC415; +constexpr unsigned int mmGDS_ATOM_SRC1_U__SI = 0x25D7; +constexpr unsigned int mmGDS_ATOM_SRC1__CI__VI = 0xC414; +constexpr unsigned int mmGDS_ATOM_SRC1__SI = 0x25D6; +constexpr unsigned int mmGDS_CNTL_STATUS = 0x25C1; +constexpr unsigned int mmGDS_COMPUTE_MAX_WAVE_ID__CI__VI = 0x3348; +constexpr unsigned int mmGDS_CONFIG = 0x25C0; +constexpr unsigned int mmGDS_DEBUG_CNTL__CI__VI = 0x25C8; +constexpr unsigned int mmGDS_DEBUG_CNTL__SI = 0x25DE; +constexpr unsigned int mmGDS_DEBUG_DATA__CI__VI = 0x25C9; +constexpr unsigned int mmGDS_DEBUG_DATA__SI = 0x25DF; +constexpr unsigned int mmGDS_ENHANCE2__CI__VI = 0x25C2; +constexpr unsigned int mmGDS_ENHANCE__CI__VI = 0x334B; +constexpr unsigned int mmGDS_ENHANCE__SI = 0x25DC; +constexpr unsigned int mmGDS_GRBM_SECDED_CNT__CI = 0x25C6; +constexpr unsigned int mmGDS_GRBM_SECDED_CNT__SI = 0x25E3; +constexpr unsigned int mmGDS_GWS_RESET0__CI__VI = 0x3344; +constexpr unsigned int mmGDS_GWS_RESET1__CI__VI = 0x3345; +constexpr unsigned int mmGDS_GWS_RESOURCE_CNTL__CI__VI = 0xC41A; +constexpr unsigned int mmGDS_GWS_RESOURCE_CNTL__SI = 0x25E0; +constexpr unsigned int mmGDS_GWS_RESOURCE_CNT__CI__VI = 0xC41C; +constexpr unsigned int mmGDS_GWS_RESOURCE_RESET__CI__VI = 0x3346; +constexpr unsigned int mmGDS_GWS_RESOURCE__CI__VI = 0xC41B; +constexpr unsigned int mmGDS_GWS_RESOURCE__SI = 0x25E1; +constexpr unsigned int mmGDS_GWS_VMID0__CI__VI = 0x3320; +constexpr unsigned int mmGDS_GWS_VMID10__CI__VI = 0x332A; +constexpr unsigned int mmGDS_GWS_VMID11__CI__VI = 0x332B; +constexpr unsigned int mmGDS_GWS_VMID12__CI__VI = 0x332C; +constexpr unsigned int mmGDS_GWS_VMID13__CI__VI = 0x332D; +constexpr unsigned int mmGDS_GWS_VMID14__CI__VI = 0x332E; +constexpr unsigned int mmGDS_GWS_VMID15__CI__VI = 0x332F; +constexpr unsigned int mmGDS_GWS_VMID1__CI__VI = 0x3321; +constexpr unsigned int mmGDS_GWS_VMID2__CI__VI = 0x3322; +constexpr unsigned int mmGDS_GWS_VMID3__CI__VI = 0x3323; +constexpr unsigned int mmGDS_GWS_VMID4__CI__VI = 0x3324; +constexpr unsigned int mmGDS_GWS_VMID5__CI__VI = 0x3325; +constexpr unsigned int mmGDS_GWS_VMID6__CI__VI = 0x3326; +constexpr unsigned int mmGDS_GWS_VMID7__CI__VI = 0x3327; +constexpr unsigned int mmGDS_GWS_VMID8__CI__VI = 0x3328; +constexpr unsigned int mmGDS_GWS_VMID9__CI__VI = 0x3329; +constexpr unsigned int mmGDS_OA_ADDRESS__CI__VI = 0xC41F; +constexpr unsigned int mmGDS_OA_CGPG_RESTORE__CI__VI = 0x334C; +constexpr unsigned int mmGDS_OA_CNTL__CI__VI = 0xC41D; +constexpr unsigned int mmGDS_OA_COUNTER__CI__VI = 0xC41E; +constexpr unsigned int mmGDS_OA_DED__CI = 0x25C7; +constexpr unsigned int mmGDS_OA_DED__SI = 0x25E4; +constexpr unsigned int mmGDS_OA_INCDEC__CI__VI = 0xC420; +constexpr unsigned int mmGDS_OA_RESET_MASK__CI__VI = 0x3349; +constexpr unsigned int mmGDS_OA_RESET__CI__VI = 0x334A; +constexpr unsigned int mmGDS_OA_RING_SIZE__CI__VI = 0xC421; +constexpr unsigned int mmGDS_OA_VMID0__CI__VI = 0x3330; +constexpr unsigned int mmGDS_OA_VMID10__CI__VI = 0x333A; +constexpr unsigned int mmGDS_OA_VMID11__CI__VI = 0x333B; +constexpr unsigned int mmGDS_OA_VMID12__CI__VI = 0x333C; +constexpr unsigned int mmGDS_OA_VMID13__CI__VI = 0x333D; +constexpr unsigned int mmGDS_OA_VMID14__CI__VI = 0x333E; +constexpr unsigned int mmGDS_OA_VMID15__CI__VI = 0x333F; +constexpr unsigned int mmGDS_OA_VMID1__CI__VI = 0x3331; +constexpr unsigned int mmGDS_OA_VMID2__CI__VI = 0x3332; +constexpr unsigned int mmGDS_OA_VMID3__CI__VI = 0x3333; +constexpr unsigned int mmGDS_OA_VMID4__CI__VI = 0x3334; +constexpr unsigned int mmGDS_OA_VMID5__CI__VI = 0x3335; +constexpr unsigned int mmGDS_OA_VMID6__CI__VI = 0x3336; +constexpr unsigned int mmGDS_OA_VMID7__CI__VI = 0x3337; +constexpr unsigned int mmGDS_OA_VMID8__CI__VI = 0x3338; +constexpr unsigned int mmGDS_OA_VMID9__CI__VI = 0x3339; +constexpr unsigned int mmGDS_PERFCOUNTER0_HI__CI__VI = 0xD281; +constexpr unsigned int mmGDS_PERFCOUNTER0_HI__SI = 0x25E7; +constexpr unsigned int mmGDS_PERFCOUNTER0_LO__CI__VI = 0xD280; +constexpr unsigned int mmGDS_PERFCOUNTER0_LO__SI = 0x25E6; +constexpr unsigned int mmGDS_PERFCOUNTER0_SELECT1__CI__VI = 0xDA84; +constexpr unsigned int mmGDS_PERFCOUNTER0_SELECT__CI__VI = 0xDA80; +constexpr unsigned int mmGDS_PERFCOUNTER0_SELECT__SI = 0x25E5; +constexpr unsigned int mmGDS_PERFCOUNTER1_HI__CI__VI = 0xD283; +constexpr unsigned int mmGDS_PERFCOUNTER1_HI__SI = 0x25EA; +constexpr unsigned int mmGDS_PERFCOUNTER1_LO__CI__VI = 0xD282; +constexpr unsigned int mmGDS_PERFCOUNTER1_LO__SI = 0x25E9; +constexpr unsigned int mmGDS_PERFCOUNTER1_SELECT__CI__VI = 0xDA81; +constexpr unsigned int mmGDS_PERFCOUNTER1_SELECT__SI = 0x25E8; +constexpr unsigned int mmGDS_PERFCOUNTER2_HI__CI__VI = 0xD285; +constexpr unsigned int mmGDS_PERFCOUNTER2_HI__SI = 0x25ED; +constexpr unsigned int mmGDS_PERFCOUNTER2_LO__CI__VI = 0xD284; +constexpr unsigned int mmGDS_PERFCOUNTER2_LO__SI = 0x25EC; +constexpr unsigned int mmGDS_PERFCOUNTER2_SELECT__CI__VI = 0xDA82; +constexpr unsigned int mmGDS_PERFCOUNTER2_SELECT__SI = 0x25EB; +constexpr unsigned int mmGDS_PERFCOUNTER3_HI__CI__VI = 0xD287; +constexpr unsigned int mmGDS_PERFCOUNTER3_HI__SI = 0x25F0; +constexpr unsigned int mmGDS_PERFCOUNTER3_LO__CI__VI = 0xD286; +constexpr unsigned int mmGDS_PERFCOUNTER3_LO__SI = 0x25EF; +constexpr unsigned int mmGDS_PERFCOUNTER3_SELECT__CI__VI = 0xDA83; +constexpr unsigned int mmGDS_PERFCOUNTER3_SELECT__SI = 0x25EE; +constexpr unsigned int mmGDS_PROTECTION_FAULT__CI__VI = 0x25C3; +constexpr unsigned int mmGDS_RD_ADDR__CI__VI = 0xC400; +constexpr unsigned int mmGDS_RD_ADDR__SI = 0x25C2; +constexpr unsigned int mmGDS_RD_BURST_ADDR__CI__VI = 0xC402; +constexpr unsigned int mmGDS_RD_BURST_ADDR__SI = 0x25C4; +constexpr unsigned int mmGDS_RD_BURST_COUNT__CI__VI = 0xC403; +constexpr unsigned int mmGDS_RD_BURST_COUNT__SI = 0x25C5; +constexpr unsigned int mmGDS_RD_BURST_DATA__CI__VI = 0xC404; +constexpr unsigned int mmGDS_RD_BURST_DATA__SI = 0x25C6; +constexpr unsigned int mmGDS_RD_DATA__CI__VI = 0xC401; +constexpr unsigned int mmGDS_RD_DATA__SI = 0x25C3; +constexpr unsigned int mmGDS_SECDED_CNT__CI = 0x25C5; +constexpr unsigned int mmGDS_SECDED_CNT__SI = 0x25E2; +constexpr unsigned int mmGDS_VMID0_BASE__CI__VI = 0x3300; +constexpr unsigned int mmGDS_VMID0_SIZE__CI__VI = 0x3301; +constexpr unsigned int mmGDS_VMID10_BASE__CI__VI = 0x3314; +constexpr unsigned int mmGDS_VMID10_SIZE__CI__VI = 0x3315; +constexpr unsigned int mmGDS_VMID11_BASE__CI__VI = 0x3316; +constexpr unsigned int mmGDS_VMID11_SIZE__CI__VI = 0x3317; +constexpr unsigned int mmGDS_VMID12_BASE__CI__VI = 0x3318; +constexpr unsigned int mmGDS_VMID12_SIZE__CI__VI = 0x3319; +constexpr unsigned int mmGDS_VMID13_BASE__CI__VI = 0x331A; +constexpr unsigned int mmGDS_VMID13_SIZE__CI__VI = 0x331B; +constexpr unsigned int mmGDS_VMID14_BASE__CI__VI = 0x331C; +constexpr unsigned int mmGDS_VMID14_SIZE__CI__VI = 0x331D; +constexpr unsigned int mmGDS_VMID15_BASE__CI__VI = 0x331E; +constexpr unsigned int mmGDS_VMID15_SIZE__CI__VI = 0x331F; +constexpr unsigned int mmGDS_VMID1_BASE__CI__VI = 0x3302; +constexpr unsigned int mmGDS_VMID1_SIZE__CI__VI = 0x3303; +constexpr unsigned int mmGDS_VMID2_BASE__CI__VI = 0x3304; +constexpr unsigned int mmGDS_VMID2_SIZE__CI__VI = 0x3305; +constexpr unsigned int mmGDS_VMID3_BASE__CI__VI = 0x3306; +constexpr unsigned int mmGDS_VMID3_SIZE__CI__VI = 0x3307; +constexpr unsigned int mmGDS_VMID4_BASE__CI__VI = 0x3308; +constexpr unsigned int mmGDS_VMID4_SIZE__CI__VI = 0x3309; +constexpr unsigned int mmGDS_VMID5_BASE__CI__VI = 0x330A; +constexpr unsigned int mmGDS_VMID5_SIZE__CI__VI = 0x330B; +constexpr unsigned int mmGDS_VMID6_BASE__CI__VI = 0x330C; +constexpr unsigned int mmGDS_VMID6_SIZE__CI__VI = 0x330D; +constexpr unsigned int mmGDS_VMID7_BASE__CI__VI = 0x330E; +constexpr unsigned int mmGDS_VMID7_SIZE__CI__VI = 0x330F; +constexpr unsigned int mmGDS_VMID8_BASE__CI__VI = 0x3310; +constexpr unsigned int mmGDS_VMID8_SIZE__CI__VI = 0x3311; +constexpr unsigned int mmGDS_VMID9_BASE__CI__VI = 0x3312; +constexpr unsigned int mmGDS_VMID9_SIZE__CI__VI = 0x3313; +constexpr unsigned int mmGDS_VM_PROTECTION_FAULT__CI__VI = 0x25C4; +constexpr unsigned int mmGDS_WRITE_COMPLETE__CI__VI = 0xC409; +constexpr unsigned int mmGDS_WRITE_COMPLETE__SI = 0x25CB; +constexpr unsigned int mmGDS_WR_ADDR__CI__VI = 0xC405; +constexpr unsigned int mmGDS_WR_ADDR__SI = 0x25C7; +constexpr unsigned int mmGDS_WR_BURST_ADDR__CI__VI = 0xC407; +constexpr unsigned int mmGDS_WR_BURST_ADDR__SI = 0x25C9; +constexpr unsigned int mmGDS_WR_BURST_DATA__CI__VI = 0xC408; +constexpr unsigned int mmGDS_WR_BURST_DATA__SI = 0x25CA; +constexpr unsigned int mmGDS_WR_DATA__CI__VI = 0xC406; +constexpr unsigned int mmGDS_WR_DATA__SI = 0x25C8; +constexpr unsigned int mmGENENB__SI__VI = 0x00F0; +constexpr unsigned int mmGENERAL_PWRMGT__SI = 0x01E0; +constexpr unsigned int mmGENERIC_I2C_CONTROL__SI = 0x1834; +constexpr unsigned int mmGENERIC_I2C_DATA__SI = 0x183A; +constexpr unsigned int mmGENERIC_I2C_INTERRUPT_CONTROL__SI = 0x1835; +constexpr unsigned int mmGENERIC_I2C_PIN_DEBUG__SI = 0x183C; +constexpr unsigned int mmGENERIC_I2C_PIN_SELECTION__SI = 0x183B; +constexpr unsigned int mmGENERIC_I2C_SETUP__SI = 0x1838; +constexpr unsigned int mmGENERIC_I2C_SPEED__SI = 0x1837; +constexpr unsigned int mmGENERIC_I2C_STATUS__SI = 0x1836; +constexpr unsigned int mmGENERIC_I2C_TRANSACTION__SI = 0x1839; +constexpr unsigned int mmGENFC_RD__SI__VI = 0x00F2; +constexpr unsigned int mmGENFC_WT__SI__VI = 0x00EE; +constexpr unsigned int mmGENMO_RD__SI__VI = 0x00F3; +constexpr unsigned int mmGENMO_WT__SI__VI = 0x00F0; +constexpr unsigned int mmGENS0__SI__VI = 0x00F0; +constexpr unsigned int mmGENS1__SI__VI = 0x00EE; +constexpr unsigned int mmGFX_COPY_STATE = 0xA1F4; +constexpr unsigned int mmGFX_PIPE_CONTROL__CI__VI = 0x226D; +constexpr unsigned int mmGFX_PIPE_PRIORITY__CI__VI = 0xF87F; +constexpr unsigned int mmGMCON_DEBUG__CI__VI = 0x0D5F; +constexpr unsigned int mmGMCON_MASK__CI__VI = 0x0D52; +constexpr unsigned int mmGMCON_MISC2__CI__VI = 0x0D44; +constexpr unsigned int mmGMCON_MISC3__CI__VI = 0x0D51; +constexpr unsigned int mmGMCON_MISC__CI__VI = 0x0D43; +constexpr unsigned int mmGMCON_PERF_MON_CNTL0__CI__VI = 0x0D4A; +constexpr unsigned int mmGMCON_PERF_MON_CNTL1__CI__VI = 0x0D4B; +constexpr unsigned int mmGMCON_PERF_MON_RSLT0__CI__VI = 0x0D4C; +constexpr unsigned int mmGMCON_PERF_MON_RSLT1__CI__VI = 0x0D4D; +constexpr unsigned int mmGMCON_PGFSM_CONFIG__CI__VI = 0x0D4E; +constexpr unsigned int mmGMCON_PGFSM_READ__CI__VI = 0x0D50; +constexpr unsigned int mmGMCON_PGFSM_WRITE__CI__VI = 0x0D4F; +constexpr unsigned int mmGMCON_RENG_EXECUTE__CI__VI = 0x0D42; +constexpr unsigned int mmGMCON_RENG_RAM_DATA__CI__VI = 0x0D41; +constexpr unsigned int mmGMCON_RENG_RAM_INDEX__CI__VI = 0x0D40; +constexpr unsigned int mmGMCON_STCTRL_REGISTER_SAVE_EXCL_SET0__CI__VI = 0x0D48; +constexpr unsigned int mmGMCON_STCTRL_REGISTER_SAVE_EXCL_SET1__CI__VI = 0x0D49; +constexpr unsigned int mmGMCON_STCTRL_REGISTER_SAVE_RANGE0__CI__VI = 0x0D45; +constexpr unsigned int mmGMCON_STCTRL_REGISTER_SAVE_RANGE1__CI__VI = 0x0D46; +constexpr unsigned int mmGMCON_STCTRL_REGISTER_SAVE_RANGE2__CI__VI = 0x0D47; +constexpr unsigned int mmGPIOPAD_A__CI__VI = 0x0183; +constexpr unsigned int mmGPIOPAD_A__SI = 0x05E7; +constexpr unsigned int mmGPIOPAD_EN__CI__VI = 0x0184; +constexpr unsigned int mmGPIOPAD_EN__SI = 0x05E8; +constexpr unsigned int mmGPIOPAD_EXTERN_TRIG_CNTL__CI__VI = 0x018D; +constexpr unsigned int mmGPIOPAD_EXTERN_TRIG_CNTL__SI = 0x05F1; +constexpr unsigned int mmGPIOPAD_INT_EN__CI__VI = 0x018A; +constexpr unsigned int mmGPIOPAD_INT_EN__SI = 0x05EE; +constexpr unsigned int mmGPIOPAD_INT_POLARITY__CI__VI = 0x018C; +constexpr unsigned int mmGPIOPAD_INT_POLARITY__SI = 0x05F0; +constexpr unsigned int mmGPIOPAD_INT_STAT_AK__CI__VI = 0x0189; +constexpr unsigned int mmGPIOPAD_INT_STAT_AK__SI = 0x05ED; +constexpr unsigned int mmGPIOPAD_INT_STAT_EN__CI__VI = 0x0187; +constexpr unsigned int mmGPIOPAD_INT_STAT_EN__SI = 0x05EB; +constexpr unsigned int mmGPIOPAD_INT_STAT__CI__VI = 0x0188; +constexpr unsigned int mmGPIOPAD_INT_STAT__SI = 0x05EC; +constexpr unsigned int mmGPIOPAD_INT_TYPE__CI__VI = 0x018B; +constexpr unsigned int mmGPIOPAD_INT_TYPE__SI = 0x05EF; +constexpr unsigned int mmGPIOPAD_MASK__CI__VI = 0x0182; +constexpr unsigned int mmGPIOPAD_MASK__SI = 0x05E6; +constexpr unsigned int mmGPIOPAD_PD_EN__CI__VI = 0x0193; +constexpr unsigned int mmGPIOPAD_PD_EN__SI = 0x05F4; +constexpr unsigned int mmGPIOPAD_PINSTRAPS__CI__VI = 0x0186; +constexpr unsigned int mmGPIOPAD_PINSTRAPS__SI = 0x05EA; +constexpr unsigned int mmGPIOPAD_PU_EN__CI__VI = 0x0192; +constexpr unsigned int mmGPIOPAD_PU_EN__SI = 0x05F3; +constexpr unsigned int mmGPIOPAD_RCVR_SEL__CI__VI = 0x0191; +constexpr unsigned int mmGPIOPAD_RCVR_SEL__SI = 0x05F2; +constexpr unsigned int mmGPIOPAD_STRENGTH__CI__VI = 0x0181; +constexpr unsigned int mmGPIOPAD_STRENGTH__SI = 0x05E5; +constexpr unsigned int mmGPIOPAD_SW_INT_STAT__CI__VI = 0x0180; +constexpr unsigned int mmGPIOPAD_SW_INT_STAT__SI = 0x05E4; +constexpr unsigned int mmGPIOPAD_Y__CI__VI = 0x0185; +constexpr unsigned int mmGPIOPAD_Y__SI = 0x05E9; +constexpr unsigned int mmGPU_GARLIC_FLUSH_DONE__CI__VI = 0x1414; +constexpr unsigned int mmGPU_GARLIC_FLUSH_REQ__CI__VI = 0x1413; +constexpr unsigned int mmGPU_HDP_FLUSH_DONE__CI__VI = 0x1538; +constexpr unsigned int mmGPU_HDP_FLUSH_REQ__CI__VI = 0x1537; +constexpr unsigned int mmGRBM_CNTL = 0x2000; +constexpr unsigned int mmGRBM_DEBUG = 0x2014; +constexpr unsigned int mmGRBM_DEBUG_CNTL = 0x2009; +constexpr unsigned int mmGRBM_DEBUG_DATA = 0x200A; +constexpr unsigned int mmGRBM_DEBUG_SNAPSHOT = 0x2015; +constexpr unsigned int mmGRBM_GFX_CLKEN_CNTL = 0x200C; +constexpr unsigned int mmGRBM_GFX_INDEX__CI__VI = 0xC200; +constexpr unsigned int mmGRBM_GFX_INDEX__SI = 0x200B; +constexpr unsigned int mmGRBM_INT_CNTL = 0x2018; +constexpr unsigned int mmGRBM_NOWHERE = 0x203F; +constexpr unsigned int mmGRBM_PERFCOUNTER0_HI__CI__VI = 0xD041; +constexpr unsigned int mmGRBM_PERFCOUNTER0_HI__SI = 0x201F; +constexpr unsigned int mmGRBM_PERFCOUNTER0_LO__CI__VI = 0xD040; +constexpr unsigned int mmGRBM_PERFCOUNTER0_LO__SI = 0x201E; +constexpr unsigned int mmGRBM_PERFCOUNTER0_SELECT__CI__VI = 0xD840; +constexpr unsigned int mmGRBM_PERFCOUNTER0_SELECT__SI = 0x201C; +constexpr unsigned int mmGRBM_PERFCOUNTER1_HI__CI__VI = 0xD044; +constexpr unsigned int mmGRBM_PERFCOUNTER1_HI__SI = 0x2021; +constexpr unsigned int mmGRBM_PERFCOUNTER1_LO__CI__VI = 0xD043; +constexpr unsigned int mmGRBM_PERFCOUNTER1_LO__SI = 0x2020; +constexpr unsigned int mmGRBM_PERFCOUNTER1_SELECT__CI__VI = 0xD841; +constexpr unsigned int mmGRBM_PERFCOUNTER1_SELECT__SI = 0x201D; +constexpr unsigned int mmGRBM_PWR_CNTL = 0x2003; +constexpr unsigned int mmGRBM_READ_ERROR = 0x2016; +constexpr unsigned int mmGRBM_READ_ERROR2__CI__VI = 0x2017; +constexpr unsigned int mmGRBM_SCRATCH_REG0 = 0x2040; +constexpr unsigned int mmGRBM_SCRATCH_REG1 = 0x2041; +constexpr unsigned int mmGRBM_SCRATCH_REG2 = 0x2042; +constexpr unsigned int mmGRBM_SCRATCH_REG3 = 0x2043; +constexpr unsigned int mmGRBM_SCRATCH_REG4 = 0x2044; +constexpr unsigned int mmGRBM_SCRATCH_REG5 = 0x2045; +constexpr unsigned int mmGRBM_SCRATCH_REG6 = 0x2046; +constexpr unsigned int mmGRBM_SCRATCH_REG7 = 0x2047; +constexpr unsigned int mmGRBM_SE0_PERFCOUNTER_HI__CI__VI = 0xD046; +constexpr unsigned int mmGRBM_SE0_PERFCOUNTER_HI__SI = 0x202B; +constexpr unsigned int mmGRBM_SE0_PERFCOUNTER_LO__CI__VI = 0xD045; +constexpr unsigned int mmGRBM_SE0_PERFCOUNTER_LO__SI = 0x202A; +constexpr unsigned int mmGRBM_SE0_PERFCOUNTER_SELECT__CI__VI = 0xD842; +constexpr unsigned int mmGRBM_SE0_PERFCOUNTER_SELECT__SI = 0x2026; +constexpr unsigned int mmGRBM_SE1_PERFCOUNTER_HI__CI__VI = 0xD048; +constexpr unsigned int mmGRBM_SE1_PERFCOUNTER_HI__SI = 0x202D; +constexpr unsigned int mmGRBM_SE1_PERFCOUNTER_LO__CI__VI = 0xD047; +constexpr unsigned int mmGRBM_SE1_PERFCOUNTER_LO__SI = 0x202C; +constexpr unsigned int mmGRBM_SE1_PERFCOUNTER_SELECT__CI__VI = 0xD843; +constexpr unsigned int mmGRBM_SE1_PERFCOUNTER_SELECT__SI = 0x2027; +constexpr unsigned int mmGRBM_SE2_PERFCOUNTER_HI__CI__VI = 0xD04A; +constexpr unsigned int mmGRBM_SE2_PERFCOUNTER_LO__CI__VI = 0xD049; +constexpr unsigned int mmGRBM_SE2_PERFCOUNTER_SELECT__CI__VI = 0xD844; +constexpr unsigned int mmGRBM_SE3_PERFCOUNTER_HI__CI__VI = 0xD04C; +constexpr unsigned int mmGRBM_SE3_PERFCOUNTER_LO__CI__VI = 0xD04B; +constexpr unsigned int mmGRBM_SE3_PERFCOUNTER_SELECT__CI__VI = 0xD845; +constexpr unsigned int mmGRBM_SKEW_CNTL = 0x2001; +constexpr unsigned int mmGRBM_SOFT_RESET = 0x2008; +constexpr unsigned int mmGRBM_STATUS = 0x2004; +constexpr unsigned int mmGRBM_STATUS2 = 0x2002; +constexpr unsigned int mmGRBM_STATUS_SE0 = 0x2005; +constexpr unsigned int mmGRBM_STATUS_SE1 = 0x2006; +constexpr unsigned int mmGRBM_STATUS_SE2__CI__VI = 0x200E; +constexpr unsigned int mmGRBM_STATUS_SE3__CI__VI = 0x200F; +constexpr unsigned int mmGRBM_WAIT_IDLE_CLOCKS = 0x200D; +constexpr unsigned int mmGRPH8_DATA__SI__VI = 0x00F3; +constexpr unsigned int mmGRPH8_IDX__SI__VI = 0x00F3; +constexpr unsigned int mmGRPH_COMPRESS_PITCH__SI__VI = 0x1A1A; +constexpr unsigned int mmGRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A1B; +constexpr unsigned int mmGRPH_COMPRESS_SURFACE_ADDRESS__SI__VI = 0x1A19; +constexpr unsigned int mmGRPH_CONTROL = 0x1A01; +constexpr unsigned int mmGRPH_DFQ_CONTROL__SI__VI = 0x1A14; +constexpr unsigned int mmGRPH_DFQ_STATUS__SI__VI = 0x1A15; +constexpr unsigned int mmGRPH_ENABLE__SI__VI = 0x1A00; +constexpr unsigned int mmGRPH_FLIP_CONTROL__SI__VI = 0x1A12; +constexpr unsigned int mmGRPH_INTERRUPT_CONTROL__SI__VI = 0x1A17; +constexpr unsigned int mmGRPH_INTERRUPT_STATUS__SI__VI = 0x1A16; +constexpr unsigned int mmGRPH_LUT_10BIT_BYPASS__SI__VI = 0x1A02; +constexpr unsigned int mmGRPH_PITCH__SI__VI = 0x1A06; +constexpr unsigned int mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A07; +constexpr unsigned int mmGRPH_PRIMARY_SURFACE_ADDRESS__SI__VI = 0x1A04; +constexpr unsigned int mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SI__VI = 0x1A08; +constexpr unsigned int mmGRPH_SECONDARY_SURFACE_ADDRESS__SI__VI = 0x1A05; +constexpr unsigned int mmGRPH_SURFACE_ADDRESS_HIGH_INUSE__SI__VI = 0x1A18; +constexpr unsigned int mmGRPH_SURFACE_ADDRESS_INUSE__SI__VI = 0x1A13; +constexpr unsigned int mmGRPH_SURFACE_OFFSET_X__SI__VI = 0x1A09; +constexpr unsigned int mmGRPH_SURFACE_OFFSET_Y__SI__VI = 0x1A0A; +constexpr unsigned int mmGRPH_SWAP_CNTL__SI__VI = 0x1A03; +constexpr unsigned int mmGRPH_UPDATE__SI__VI = 0x1A11; +constexpr unsigned int mmGRPH_X_END__SI__VI = 0x1A0D; +constexpr unsigned int mmGRPH_X_START__SI__VI = 0x1A0B; +constexpr unsigned int mmGRPH_Y_END__SI__VI = 0x1A0E; +constexpr unsigned int mmGRPH_Y_START__SI__VI = 0x1A0C; +constexpr unsigned int mmHDMI_ACR_32_0__SI = 0x1C37; +constexpr unsigned int mmHDMI_ACR_32_1__SI = 0x1C38; +constexpr unsigned int mmHDMI_ACR_44_0__SI = 0x1C39; +constexpr unsigned int mmHDMI_ACR_44_1__SI = 0x1C3A; +constexpr unsigned int mmHDMI_ACR_48_0__SI = 0x1C3B; +constexpr unsigned int mmHDMI_ACR_48_1__SI = 0x1C3C; +constexpr unsigned int mmHDMI_ACR_PACKET_CONTROL__SI = 0x1C0F; +constexpr unsigned int mmHDMI_ACR_STATUS_0__SI = 0x1C3D; +constexpr unsigned int mmHDMI_ACR_STATUS_1__SI = 0x1C3E; +constexpr unsigned int mmHDMI_AUDIO_PACKET_CONTROL__SI = 0x1C0E; +constexpr unsigned int mmHDMI_CONTROL__SI = 0x1C0C; +constexpr unsigned int mmHDMI_GC__SI = 0x1C16; +constexpr unsigned int mmHDMI_GENERIC_PACKET_CONTROL__SI = 0x1C13; +constexpr unsigned int mmHDMI_INFOFRAME_CONTROL0__SI = 0x1C11; +constexpr unsigned int mmHDMI_INFOFRAME_CONTROL1__SI = 0x1C12; +constexpr unsigned int mmHDMI_STATUS__SI = 0x1C0D; +constexpr unsigned int mmHDMI_VBI_PACKET_CONTROL__SI = 0x1C10; +constexpr unsigned int mmHDP_DEBUG0 = 0x0BCC; +constexpr unsigned int mmHDP_DEBUG1 = 0x0BCD; +constexpr unsigned int mmHDP_HOST_PATH_CNTL = 0x0B00; +constexpr unsigned int mmHDP_LAST_SURFACE_HIT = 0x0BCE; +constexpr unsigned int mmHDP_MEM_COHERENCY_FLUSH_CNTL = 0x1520; +constexpr unsigned int mmHDP_NONSURFACE_BASE = 0x0B01; +constexpr unsigned int mmHDP_NONSURFACE_INFO = 0x0B02; +constexpr unsigned int mmHDP_NONSURFACE_SIZE = 0x0B03; +constexpr unsigned int mmHDP_NONSURF_FLAGS = 0x0BC9; +constexpr unsigned int mmHDP_NONSURF_FLAGS_CLR = 0x0BCA; +constexpr unsigned int mmHDP_OUTSTANDING_REQ = 0x0BD1; +constexpr unsigned int mmHDP_REG_COHERENCY_FLUSH_CNTL = 0x1528; +constexpr unsigned int mmHDP_SC_MULTI_CHIP_CNTL = 0x0BD0; +constexpr unsigned int mmHDP_SW_SEMAPHORE = 0x0BCB; +constexpr unsigned int mmHDP_TILING_CONFIG = 0x0BCF; +constexpr unsigned int mmHDP_XDP_BUSY_STS = 0x0C3E; +constexpr unsigned int mmHDP_XDP_CGTT_BLK_CTRL = 0x0C33; +constexpr unsigned int mmHDP_XDP_CHKN = 0x0C40; +constexpr unsigned int mmHDP_XDP_D2H_BAR_UPDATE = 0x0C02; +constexpr unsigned int mmHDP_XDP_D2H_FLUSH = 0x0C01; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_10 = 0x0C0A; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_11 = 0x0C0B; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_12 = 0x0C0C; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_13 = 0x0C0D; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_14 = 0x0C0E; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_15 = 0x0C0F; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_16 = 0x0C10; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_17 = 0x0C11; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_18 = 0x0C12; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_19 = 0x0C13; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_20 = 0x0C14; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_21 = 0x0C15; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_22 = 0x0C16; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_23 = 0x0C17; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_24 = 0x0C18; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_25 = 0x0C19; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_26 = 0x0C1A; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_27 = 0x0C1B; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_28 = 0x0C1C; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_29 = 0x0C1D; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_3 = 0x0C03; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_30 = 0x0C1E; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_31 = 0x0C1F; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_32 = 0x0C20; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_33 = 0x0C21; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_34 = 0x0C22; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_4 = 0x0C04; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_5 = 0x0C05; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_6 = 0x0C06; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_7 = 0x0C07; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_8 = 0x0C08; +constexpr unsigned int mmHDP_XDP_D2H_RSVD_9 = 0x0C09; +constexpr unsigned int mmHDP_XDP_DBG_ADDR = 0x0C41; +constexpr unsigned int mmHDP_XDP_DBG_DATA = 0x0C42; +constexpr unsigned int mmHDP_XDP_DBG_MASK = 0x0C43; +constexpr unsigned int mmHDP_XDP_DIRECT2HDP_FIRST = 0x0C00; +constexpr unsigned int mmHDP_XDP_DIRECT2HDP_LAST = 0x0C23; +constexpr unsigned int mmHDP_XDP_FLUSH_ARMED_STS = 0x0C3C; +constexpr unsigned int mmHDP_XDP_FLUSH_CNTR0_STS = 0x0C3D; +constexpr unsigned int mmHDP_XDP_HDP_IPH_CFG = 0x0C31; +constexpr unsigned int mmHDP_XDP_HDP_MBX_MC_CFG = 0x0C2D; +constexpr unsigned int mmHDP_XDP_HDP_MC_CFG = 0x0C2E; +constexpr unsigned int mmHDP_XDP_HST_CFG = 0x0C2F; +constexpr unsigned int mmHDP_XDP_P2P_BAR0 = 0x0C34; +constexpr unsigned int mmHDP_XDP_P2P_BAR1 = 0x0C35; +constexpr unsigned int mmHDP_XDP_P2P_BAR2 = 0x0C36; +constexpr unsigned int mmHDP_XDP_P2P_BAR3 = 0x0C37; +constexpr unsigned int mmHDP_XDP_P2P_BAR4 = 0x0C38; +constexpr unsigned int mmHDP_XDP_P2P_BAR5 = 0x0C39; +constexpr unsigned int mmHDP_XDP_P2P_BAR6 = 0x0C3A; +constexpr unsigned int mmHDP_XDP_P2P_BAR7 = 0x0C3B; +constexpr unsigned int mmHDP_XDP_P2P_BAR_CFG = 0x0C24; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR0 = 0x0C26; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR1 = 0x0C27; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR2 = 0x0C28; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR3 = 0x0C29; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR4 = 0x0C2A; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR5 = 0x0C2B; +constexpr unsigned int mmHDP_XDP_P2P_MBX_ADDR6 = 0x0C2C; +constexpr unsigned int mmHDP_XDP_P2P_MBX_OFFSET = 0x0C25; +constexpr unsigned int mmHDP_XDP_SID_CFG = 0x0C30; +constexpr unsigned int mmHDP_XDP_SRBM_CFG = 0x0C32; +constexpr unsigned int mmHDP_XDP_STICKY = 0x0C3F; +constexpr unsigned int mmHOST_BUSNUM = 0x153D; +constexpr unsigned int mmHW_DEBUG = 0x1515; +constexpr unsigned int mmIA_CNTL_STATUS = 0x2237; +constexpr unsigned int mmIA_DEBUG_CNTL = 0x223A; +constexpr unsigned int mmIA_DEBUG_DATA = 0x223B; +constexpr unsigned int mmIA_ENHANCE = 0xA29C; +constexpr unsigned int mmIA_MULTI_VGT_PARAM = 0xA2AA; +constexpr unsigned int mmIA_PERFCOUNTER0_HI__CI__VI = 0xD089; +constexpr unsigned int mmIA_PERFCOUNTER0_HI__SI = 0x2225; +constexpr unsigned int mmIA_PERFCOUNTER0_LO__CI__VI = 0xD088; +constexpr unsigned int mmIA_PERFCOUNTER0_LO__SI = 0x2224; +constexpr unsigned int mmIA_PERFCOUNTER0_SELECT1__CI__VI = 0xD888; +constexpr unsigned int mmIA_PERFCOUNTER0_SELECT__CI__VI = 0xD884; +constexpr unsigned int mmIA_PERFCOUNTER0_SELECT__SI = 0x2220; +constexpr unsigned int mmIA_PERFCOUNTER1_HI__CI__VI = 0xD08B; +constexpr unsigned int mmIA_PERFCOUNTER1_HI__SI = 0x2227; +constexpr unsigned int mmIA_PERFCOUNTER1_LO__CI__VI = 0xD08A; +constexpr unsigned int mmIA_PERFCOUNTER1_LO__SI = 0x2226; +constexpr unsigned int mmIA_PERFCOUNTER1_SELECT__CI__VI = 0xD885; +constexpr unsigned int mmIA_PERFCOUNTER1_SELECT__SI = 0x2221; +constexpr unsigned int mmIA_PERFCOUNTER2_HI__CI__VI = 0xD08D; +constexpr unsigned int mmIA_PERFCOUNTER2_HI__SI = 0x2229; +constexpr unsigned int mmIA_PERFCOUNTER2_LO__CI__VI = 0xD08C; +constexpr unsigned int mmIA_PERFCOUNTER2_LO__SI = 0x2228; +constexpr unsigned int mmIA_PERFCOUNTER2_SELECT__CI__VI = 0xD886; +constexpr unsigned int mmIA_PERFCOUNTER2_SELECT__SI = 0x2222; +constexpr unsigned int mmIA_PERFCOUNTER3_HI__CI__VI = 0xD08F; +constexpr unsigned int mmIA_PERFCOUNTER3_HI__SI = 0x222B; +constexpr unsigned int mmIA_PERFCOUNTER3_LO__CI__VI = 0xD08E; +constexpr unsigned int mmIA_PERFCOUNTER3_LO__SI = 0x222A; +constexpr unsigned int mmIA_PERFCOUNTER3_SELECT__CI__VI = 0xD887; +constexpr unsigned int mmIA_PERFCOUNTER3_SELECT__SI = 0x2223; +constexpr unsigned int mmIA_VMID_OVERRIDE__SI__CI = 0x2260; +constexpr unsigned int mmIH_ADVFAULT_CNTL__SI__CI = 0x0F8C; +constexpr unsigned int mmIH_PERFCOUNTER0_RESULT__CI = 0x0F8A; +constexpr unsigned int mmIH_PERFCOUNTER1_RESULT__CI = 0x0F8B; +constexpr unsigned int mmIH_PERFMON_CNTL__CI = 0x0F89; +constexpr unsigned int mmIH_VMID_0_LUT__CI = 0x0F50; +constexpr unsigned int mmIH_VMID_10_LUT__CI = 0x0F5A; +constexpr unsigned int mmIH_VMID_11_LUT__CI = 0x0F5B; +constexpr unsigned int mmIH_VMID_12_LUT__CI = 0x0F5C; +constexpr unsigned int mmIH_VMID_13_LUT__CI = 0x0F5D; +constexpr unsigned int mmIH_VMID_14_LUT__CI = 0x0F5E; +constexpr unsigned int mmIH_VMID_15_LUT__CI = 0x0F5F; +constexpr unsigned int mmIH_VMID_1_LUT__CI = 0x0F51; +constexpr unsigned int mmIH_VMID_2_LUT__CI = 0x0F52; +constexpr unsigned int mmIH_VMID_3_LUT__CI = 0x0F53; +constexpr unsigned int mmIH_VMID_4_LUT__CI = 0x0F54; +constexpr unsigned int mmIH_VMID_5_LUT__CI = 0x0F55; +constexpr unsigned int mmIH_VMID_6_LUT__CI = 0x0F56; +constexpr unsigned int mmIH_VMID_7_LUT__CI = 0x0F57; +constexpr unsigned int mmIH_VMID_8_LUT__CI = 0x0F58; +constexpr unsigned int mmIH_VMID_9_LUT__CI = 0x0F59; +constexpr unsigned int mmIMPCTL_RESET__CI__VI = 0x14F5; +constexpr unsigned int mmINTERRUPT_CNTL = 0x151A; +constexpr unsigned int mmINTERRUPT_CNTL2 = 0x151B; +constexpr unsigned int mmINT_MASK__SI = 0x1AD0; +constexpr unsigned int mmLB0_DC_MVP_LB_CONTROL__SI = 0x1ADB; +constexpr unsigned int mmLB0_LB_DEBUG__SI = 0x1AFC; +constexpr unsigned int mmLB0_LB_SYNC_RESET_SEL__SI = 0x1ACA; +constexpr unsigned int mmLB0_LB_TEST_DEBUG_DATA__SI__VI = 0x1AFF; +constexpr unsigned int mmLB0_LB_TEST_DEBUG_INDEX__SI__VI = 0x1AFE; +constexpr unsigned int mmLB0_MVP_AFR_FLIP_FIFO_CNTL__SI = 0x1AD9; +constexpr unsigned int mmLB0_MVP_AFR_FLIP_MODE__SI = 0x1AD8; +constexpr unsigned int mmLB0_MVP_FLIP_LINE_NUM_INSERT__SI = 0x1ADA; +constexpr unsigned int mmLB1_DC_MVP_LB_CONTROL__SI = 0x1DDB; +constexpr unsigned int mmLB1_LB_DEBUG__SI = 0x1DFC; +constexpr unsigned int mmLB1_LB_SYNC_RESET_SEL__SI = 0x1DCA; +constexpr unsigned int mmLB1_LB_TEST_DEBUG_DATA__SI = 0x1DFF; +constexpr unsigned int mmLB1_LB_TEST_DEBUG_INDEX__SI = 0x1DFE; +constexpr unsigned int mmLB1_MVP_AFR_FLIP_FIFO_CNTL__SI = 0x1DD9; +constexpr unsigned int mmLB1_MVP_AFR_FLIP_MODE__SI = 0x1DD8; +constexpr unsigned int mmLB1_MVP_FLIP_LINE_NUM_INSERT__SI = 0x1DDA; +constexpr unsigned int mmLB2_DC_MVP_LB_CONTROL__SI = 0x40DB; +constexpr unsigned int mmLB2_LB_DEBUG__SI = 0x40FC; +constexpr unsigned int mmLB2_LB_SYNC_RESET_SEL__SI = 0x40CA; +constexpr unsigned int mmLB2_LB_TEST_DEBUG_DATA__SI = 0x40FF; +constexpr unsigned int mmLB2_LB_TEST_DEBUG_INDEX__SI = 0x40FE; +constexpr unsigned int mmLB2_MVP_AFR_FLIP_FIFO_CNTL__SI = 0x40D9; +constexpr unsigned int mmLB2_MVP_AFR_FLIP_MODE__SI = 0x40D8; +constexpr unsigned int mmLB2_MVP_FLIP_LINE_NUM_INSERT__SI = 0x40DA; +constexpr unsigned int mmLB3_DC_MVP_LB_CONTROL__SI = 0x43DB; +constexpr unsigned int mmLB3_LB_DEBUG__SI = 0x43FC; +constexpr unsigned int mmLB3_LB_SYNC_RESET_SEL__SI = 0x43CA; +constexpr unsigned int mmLB3_LB_TEST_DEBUG_DATA__SI = 0x43FF; +constexpr unsigned int mmLB3_LB_TEST_DEBUG_INDEX__SI = 0x43FE; +constexpr unsigned int mmLB3_MVP_AFR_FLIP_FIFO_CNTL__SI = 0x43D9; +constexpr unsigned int mmLB3_MVP_AFR_FLIP_MODE__SI = 0x43D8; +constexpr unsigned int mmLB3_MVP_FLIP_LINE_NUM_INSERT__SI = 0x43DA; +constexpr unsigned int mmLB4_DC_MVP_LB_CONTROL__SI = 0x46DB; +constexpr unsigned int mmLB4_LB_DEBUG__SI = 0x46FC; +constexpr unsigned int mmLB4_LB_SYNC_RESET_SEL__SI = 0x46CA; +constexpr unsigned int mmLB4_LB_TEST_DEBUG_DATA__SI = 0x46FF; +constexpr unsigned int mmLB4_LB_TEST_DEBUG_INDEX__SI = 0x46FE; +constexpr unsigned int mmLB4_MVP_AFR_FLIP_FIFO_CNTL__SI = 0x46D9; +constexpr unsigned int mmLB4_MVP_AFR_FLIP_MODE__SI = 0x46D8; +constexpr unsigned int mmLB4_MVP_FLIP_LINE_NUM_INSERT__SI = 0x46DA; +constexpr unsigned int mmLB5_DC_MVP_LB_CONTROL__SI = 0x49DB; +constexpr unsigned int mmLB5_LB_DEBUG__SI = 0x49FC; +constexpr unsigned int mmLB5_LB_SYNC_RESET_SEL__SI = 0x49CA; +constexpr unsigned int mmLB5_LB_TEST_DEBUG_DATA__SI = 0x49FF; +constexpr unsigned int mmLB5_LB_TEST_DEBUG_INDEX__SI = 0x49FE; +constexpr unsigned int mmLB5_MVP_AFR_FLIP_FIFO_CNTL__SI = 0x49D9; +constexpr unsigned int mmLB5_MVP_AFR_FLIP_MODE__SI = 0x49D8; +constexpr unsigned int mmLB5_MVP_FLIP_LINE_NUM_INSERT__SI = 0x49DA; +constexpr unsigned int mmLB_DEBUG__SI = 0x1AFC; +constexpr unsigned int mmLB_SYNC_RESET_SEL__SI = 0x1ACA; +constexpr unsigned int mmLB_TEST_DEBUG_DATA__SI__VI = 0x1AFF; +constexpr unsigned int mmLB_TEST_DEBUG_INDEX__SI__VI = 0x1AFE; +constexpr unsigned int mmLNCNT_CONTROL__CI = 0x1487; +constexpr unsigned int mmLVDS_DATA_CNTL__SI = 0x1C8C; +constexpr unsigned int mmLVTMA_PWRSEQ_CNTL__SI = 0x1962; +constexpr unsigned int mmLVTMA_PWRSEQ_DELAY1__SI = 0x1965; +constexpr unsigned int mmLVTMA_PWRSEQ_DELAY2__SI = 0x1966; +constexpr unsigned int mmLVTMA_PWRSEQ_REF_DIV__SI = 0x1964; +constexpr unsigned int mmLVTMA_PWRSEQ_STATE__SI = 0x1963; +constexpr unsigned int mmMASTER_COMM_CMD_REG__SI__VI = 0x161F; +constexpr unsigned int mmMASTER_COMM_CNTL_REG__SI__VI = 0x1620; +constexpr unsigned int mmMASTER_COMM_DATA_REG1__SI__VI = 0x161C; +constexpr unsigned int mmMASTER_COMM_DATA_REG2__SI__VI = 0x161D; +constexpr unsigned int mmMASTER_COMM_DATA_REG3__SI__VI = 0x161E; +constexpr unsigned int mmMASTER_CREDIT_CNTL = 0x1516; +constexpr unsigned int mmMASTER_UPDATE_LOCK__SI__VI = 0x1BBD; +constexpr unsigned int mmMASTER_UPDATE_MODE__SI__VI = 0x1BBE; +constexpr unsigned int mmMCIF_CONTROL__SI = 0x0314; +constexpr unsigned int mmMCIF_TEST_DEBUG_DATA__SI = 0x0317; +constexpr unsigned int mmMCIF_TEST_DEBUG_INDEX__SI = 0x0316; +constexpr unsigned int mmMCIF_WRITE_COMBINE_CONTROL__SI = 0x0315; +constexpr unsigned int mmMCLK_PWRMGT_CNTL__SI__CI = 0x0AE8; +constexpr unsigned int mmMC_ARB_ADDR_HASH = 0x09DC; +constexpr unsigned int mmMC_ARB_ADDR_SWIZ0__CI__VI = 0x09CB; +constexpr unsigned int mmMC_ARB_ADDR_SWIZ1__CI__VI = 0x09CC; +constexpr unsigned int mmMC_ARB_AGE_CNTL__CI__VI = 0x09BF; +constexpr unsigned int mmMC_ARB_AGE_RD = 0x09E9; +constexpr unsigned int mmMC_ARB_AGE_WR = 0x09EA; +constexpr unsigned int mmMC_ARB_BANKMAP = 0x09D7; +constexpr unsigned int mmMC_ARB_BURST_TIME = 0x0A02; +constexpr unsigned int mmMC_ARB_BUSY_STATUS__CI__VI = 0x09FD; +constexpr unsigned int mmMC_ARB_CAC_CNTL = 0x09D4; +constexpr unsigned int mmMC_ARB_CG = 0x09FA; +constexpr unsigned int mmMC_ARB_DRAM_TIMING = 0x09DD; +constexpr unsigned int mmMC_ARB_DRAM_TIMING2 = 0x09DE; +constexpr unsigned int mmMC_ARB_DRAM_TIMING2_1 = 0x09FF; +constexpr unsigned int mmMC_ARB_DRAM_TIMING_1 = 0x09FC; +constexpr unsigned int mmMC_ARB_FED_CNTL = 0x09C1; +constexpr unsigned int mmMC_ARB_GDEC_RD_CNTL = 0x09EE; +constexpr unsigned int mmMC_ARB_GDEC_WR_CNTL = 0x09EF; +constexpr unsigned int mmMC_ARB_GECC2 = 0x09C9; +constexpr unsigned int mmMC_ARB_GECC2_CLI = 0x09CA; +constexpr unsigned int mmMC_ARB_GECC2_DEBUG = 0x09C4; +constexpr unsigned int mmMC_ARB_GECC2_DEBUG2 = 0x09C5; +constexpr unsigned int mmMC_ARB_GECC2_MISC = 0x09C3; +constexpr unsigned int mmMC_ARB_GECC2_STATUS = 0x09C2; +constexpr unsigned int mmMC_ARB_HARSH_BWCNT0_RD__CI__VI = 0x0DCE; +constexpr unsigned int mmMC_ARB_HARSH_BWCNT0_WR__CI__VI = 0x0DCF; +constexpr unsigned int mmMC_ARB_HARSH_BWCNT1_RD__CI__VI = 0x0DD0; +constexpr unsigned int mmMC_ARB_HARSH_BWCNT1_WR__CI__VI = 0x0DD1; +constexpr unsigned int mmMC_ARB_HARSH_BWPERIOD0_RD__CI__VI = 0x0DCA; +constexpr unsigned int mmMC_ARB_HARSH_BWPERIOD0_WR__CI__VI = 0x0DCB; +constexpr unsigned int mmMC_ARB_HARSH_BWPERIOD1_RD__CI__VI = 0x0DCC; +constexpr unsigned int mmMC_ARB_HARSH_BWPERIOD1_WR__CI__VI = 0x0DCD; +constexpr unsigned int mmMC_ARB_HARSH_CTL_RD__CI__VI = 0x0DD6; +constexpr unsigned int mmMC_ARB_HARSH_CTL_WR__CI__VI = 0x0DD7; +constexpr unsigned int mmMC_ARB_HARSH_EN_RD__CI__VI = 0x0DC0; +constexpr unsigned int mmMC_ARB_HARSH_EN_WR__CI__VI = 0x0DC1; +constexpr unsigned int mmMC_ARB_HARSH_SAT0_RD__CI__VI = 0x0DD2; +constexpr unsigned int mmMC_ARB_HARSH_SAT0_WR__CI__VI = 0x0DD3; +constexpr unsigned int mmMC_ARB_HARSH_SAT1_RD__CI__VI = 0x0DD4; +constexpr unsigned int mmMC_ARB_HARSH_SAT1_WR__CI__VI = 0x0DD5; +constexpr unsigned int mmMC_ARB_HARSH_TX_HI0_RD__CI__VI = 0x0DC2; +constexpr unsigned int mmMC_ARB_HARSH_TX_HI0_WR__CI__VI = 0x0DC3; +constexpr unsigned int mmMC_ARB_HARSH_TX_HI1_RD__CI__VI = 0x0DC4; +constexpr unsigned int mmMC_ARB_HARSH_TX_HI1_WR__CI__VI = 0x0DC5; +constexpr unsigned int mmMC_ARB_HARSH_TX_LO0_RD__CI__VI = 0x0DC6; +constexpr unsigned int mmMC_ARB_HARSH_TX_LO0_WR__CI__VI = 0x0DC7; +constexpr unsigned int mmMC_ARB_HARSH_TX_LO1_RD__CI__VI = 0x0DC8; +constexpr unsigned int mmMC_ARB_HARSH_TX_LO1_WR__CI__VI = 0x0DC9; +constexpr unsigned int mmMC_ARB_LAZY0_RD = 0x09E5; +constexpr unsigned int mmMC_ARB_LAZY0_WR = 0x09E6; +constexpr unsigned int mmMC_ARB_LAZY1_RD = 0x09E7; +constexpr unsigned int mmMC_ARB_LAZY1_WR = 0x09E8; +constexpr unsigned int mmMC_ARB_LM_RD = 0x09F0; +constexpr unsigned int mmMC_ARB_LM_WR = 0x09F1; +constexpr unsigned int mmMC_ARB_MAX_LAT_CID__CI__VI = 0x09F6; +constexpr unsigned int mmMC_ARB_MAX_LAT_RSLT0__CI__VI = 0x09F7; +constexpr unsigned int mmMC_ARB_MAX_LAT_RSLT1__CI__VI = 0x09F8; +constexpr unsigned int mmMC_ARB_MINCLKS = 0x09DA; +constexpr unsigned int mmMC_ARB_MISC = 0x09D6; +constexpr unsigned int mmMC_ARB_MISC2 = 0x09D5; +constexpr unsigned int mmMC_ARB_MISC3__CI__VI = 0x09CD; +constexpr unsigned int mmMC_ARB_PERFCOUNTER0_CFG__CI__VI = 0x07BC; +constexpr unsigned int mmMC_ARB_PERFCOUNTER1_CFG__CI__VI = 0x07BD; +constexpr unsigned int mmMC_ARB_PERFCOUNTER2_CFG__CI__VI = 0x07BE; +constexpr unsigned int mmMC_ARB_PERFCOUNTER3_CFG__CI__VI = 0x07BF; +constexpr unsigned int mmMC_ARB_PERFCOUNTER_HI__CI__VI = 0x07AE; +constexpr unsigned int mmMC_ARB_PERFCOUNTER_LO__CI__VI = 0x07A6; +constexpr unsigned int mmMC_ARB_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07D4; +constexpr unsigned int mmMC_ARB_PERF_MON_CNTL0_ECC__CI = 0x07DB; +constexpr unsigned int mmMC_ARB_PERF_MON_CNTL0__SI = 0x09F6; +constexpr unsigned int mmMC_ARB_PM_CNTL = 0x09ED; +constexpr unsigned int mmMC_ARB_POP = 0x09D9; +constexpr unsigned int mmMC_ARB_RAMCFG = 0x09D8; +constexpr unsigned int mmMC_ARB_REMREQ = 0x09F2; +constexpr unsigned int mmMC_ARB_REPLAY = 0x09F3; +constexpr unsigned int mmMC_ARB_RET_CREDITS2__CI__VI = 0x09C0; +constexpr unsigned int mmMC_ARB_RET_CREDITS_RD = 0x09F4; +constexpr unsigned int mmMC_ARB_RET_CREDITS_WR = 0x09F5; +constexpr unsigned int mmMC_ARB_RFSH_CNTL = 0x09EB; +constexpr unsigned int mmMC_ARB_RFSH_RATE = 0x09EC; +constexpr unsigned int mmMC_ARB_RTT_CNTL0 = 0x09D0; +constexpr unsigned int mmMC_ARB_RTT_CNTL1 = 0x09D1; +constexpr unsigned int mmMC_ARB_RTT_CNTL2 = 0x09D2; +constexpr unsigned int mmMC_ARB_RTT_DATA = 0x09CF; +constexpr unsigned int mmMC_ARB_RTT_DEBUG = 0x09D3; +constexpr unsigned int mmMC_ARB_SQM_CNTL = 0x09DB; +constexpr unsigned int mmMC_ARB_SSM__CI = 0x09F9; +constexpr unsigned int mmMC_ARB_TM_CNTL_RD = 0x09E3; +constexpr unsigned int mmMC_ARB_TM_CNTL_WR = 0x09E4; +constexpr unsigned int mmMC_ARB_WCDR__SI__CI = 0x09FB; +constexpr unsigned int mmMC_ARB_WCDR_2__SI__CI = 0x09CE; +constexpr unsigned int mmMC_ARB_WTM_CNTL_RD = 0x09DF; +constexpr unsigned int mmMC_ARB_WTM_CNTL_WR = 0x09E0; +constexpr unsigned int mmMC_ARB_WTM_GRPWT_RD = 0x09E1; +constexpr unsigned int mmMC_ARB_WTM_GRPWT_WR = 0x09E2; +constexpr unsigned int mmMC_BIST_AUTO_CNTL__SI__CI = 0x0A06; +constexpr unsigned int mmMC_BIST_CMD_CNTL__SI__CI = 0x0A8E; +constexpr unsigned int mmMC_BIST_CMP_CNTL__SI__CI = 0x0A8D; +constexpr unsigned int mmMC_BIST_CMP_CNTL_2__SI__CI = 0x0AB6; +constexpr unsigned int mmMC_BIST_DATA_MASK__SI__CI = 0x0A12; +constexpr unsigned int mmMC_BIST_DIR_CNTL__SI__CI = 0x0A07; +constexpr unsigned int mmMC_BIST_EADDR__SI__CI = 0x0A09; +constexpr unsigned int mmMC_BIST_RDATA_EDC__SI__CI = 0x0A1D; +constexpr unsigned int mmMC_BIST_RDATA_MASK__SI__CI = 0x0A1C; +constexpr unsigned int mmMC_BIST_SADDR__SI__CI = 0x0A08; +constexpr unsigned int mmMC_CG_CONFIG = 0x096F; +constexpr unsigned int mmMC_CG_CONFIG_MCD = 0x0829; +constexpr unsigned int mmMC_CITF_CNTL = 0x0970; +constexpr unsigned int mmMC_CITF_CREDITS_ARB_RD = 0x0972; +constexpr unsigned int mmMC_CITF_CREDITS_ARB_WR = 0x0973; +constexpr unsigned int mmMC_CITF_CREDITS_VM = 0x0971; +constexpr unsigned int mmMC_CITF_CREDITS_XBAR = 0x0989; +constexpr unsigned int mmMC_CITF_DAGB_CNTL = 0x0974; +constexpr unsigned int mmMC_CITF_DAGB_DLY = 0x0977; +constexpr unsigned int mmMC_CITF_INT_CREDITS = 0x0975; +constexpr unsigned int mmMC_CITF_INT_CREDITS_WR__CI__VI = 0x097D; +constexpr unsigned int mmMC_CITF_MISC_RD_CG = 0x0992; +constexpr unsigned int mmMC_CITF_MISC_VM_CG = 0x0994; +constexpr unsigned int mmMC_CITF_MISC_WR_CG = 0x0993; +constexpr unsigned int mmMC_CITF_PERFCOUNTER0_CFG__CI__VI = 0x07B0; +constexpr unsigned int mmMC_CITF_PERFCOUNTER1_CFG__CI__VI = 0x07B1; +constexpr unsigned int mmMC_CITF_PERFCOUNTER2_CFG__CI__VI = 0x07B2; +constexpr unsigned int mmMC_CITF_PERFCOUNTER3_CFG__CI__VI = 0x07B3; +constexpr unsigned int mmMC_CITF_PERFCOUNTER_HI__CI__VI = 0x07A8; +constexpr unsigned int mmMC_CITF_PERFCOUNTER_LO__CI__VI = 0x07A0; +constexpr unsigned int mmMC_CITF_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07CE; +constexpr unsigned int mmMC_CITF_PERF_MON_CNTL2 = 0x098E; +constexpr unsigned int mmMC_CITF_PERF_MON_RSLT2 = 0x0991; +constexpr unsigned int mmMC_CITF_REMREQ = 0x097A; +constexpr unsigned int mmMC_CITF_RET_MODE = 0x0976; +constexpr unsigned int mmMC_CITF_WTM_RD_CNTL = 0x097F; +constexpr unsigned int mmMC_CITF_WTM_WR_CNTL = 0x0980; +constexpr unsigned int mmMC_CITF_XTRA_ENABLE = 0x096D; +constexpr unsigned int mmMC_CONFIG = 0x0800; +constexpr unsigned int mmMC_CONFIG_MCD = 0x0828; +constexpr unsigned int mmMC_DC_INTERFACE_NACK_STATUS__SI = 0x031C; +constexpr unsigned int mmMC_DLB_CONFIG0__CI = 0x0D93; +constexpr unsigned int mmMC_DLB_CONFIG1__CI = 0x0D94; +constexpr unsigned int mmMC_DLB_MISCCTRL0__CI = 0x0D90; +constexpr unsigned int mmMC_DLB_MISCCTRL1__CI = 0x0D91; +constexpr unsigned int mmMC_DLB_MISCCTRL2__CI = 0x0D92; +constexpr unsigned int mmMC_DLB_SETUPFIFO__CI = 0x0D97; +constexpr unsigned int mmMC_DLB_SETUPSWEEP__CI = 0x0D96; +constexpr unsigned int mmMC_DLB_SETUP__CI = 0x0D95; +constexpr unsigned int mmMC_DLB_STATUS_MISC0__CI = 0x0D9A; +constexpr unsigned int mmMC_DLB_STATUS_MISC1__CI = 0x0D9B; +constexpr unsigned int mmMC_DLB_STATUS_MISC2__CI = 0x0D9C; +constexpr unsigned int mmMC_DLB_STATUS_MISC3__CI = 0x0D9D; +constexpr unsigned int mmMC_DLB_STATUS_MISC4__CI = 0x0D9E; +constexpr unsigned int mmMC_DLB_STATUS_MISC5__CI = 0x0D9F; +constexpr unsigned int mmMC_DLB_STATUS_MISC6__CI = 0x0DA0; +constexpr unsigned int mmMC_DLB_STATUS_MISC7__CI = 0x0DA1; +constexpr unsigned int mmMC_DLB_STATUS__CI = 0x0D99; +constexpr unsigned int mmMC_DLB_WRITE_MASK__CI = 0x0D98; +constexpr unsigned int mmMC_HUB_MISC_DBG__SI__CI = 0x0831; +constexpr unsigned int mmMC_HUB_MISC_FRAMING = 0x0834; +constexpr unsigned int mmMC_HUB_MISC_HUB_CG = 0x082E; +constexpr unsigned int mmMC_HUB_MISC_IDLE_STATUS = 0x0847; +constexpr unsigned int mmMC_HUB_MISC_OVERRIDE = 0x0833; +constexpr unsigned int mmMC_HUB_MISC_POWER = 0x082D; +constexpr unsigned int mmMC_HUB_MISC_SIP_CG = 0x0830; +constexpr unsigned int mmMC_HUB_MISC_STATUS = 0x0832; +constexpr unsigned int mmMC_HUB_MISC_VM_CG = 0x082F; +constexpr unsigned int mmMC_HUB_PERFCOUNTER0_CFG__CI__VI = 0x07B4; +constexpr unsigned int mmMC_HUB_PERFCOUNTER1_CFG__CI__VI = 0x07B5; +constexpr unsigned int mmMC_HUB_PERFCOUNTER2_CFG__CI__VI = 0x07B6; +constexpr unsigned int mmMC_HUB_PERFCOUNTER3_CFG__CI__VI = 0x07B7; +constexpr unsigned int mmMC_HUB_PERFCOUNTER_HI__CI__VI = 0x07A9; +constexpr unsigned int mmMC_HUB_PERFCOUNTER_LO__CI__VI = 0x07A1; +constexpr unsigned int mmMC_HUB_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07CF; +constexpr unsigned int mmMC_HUB_RDREQ_ACPG_LIMIT__CI__VI = 0x0849; +constexpr unsigned int mmMC_HUB_RDREQ_ACPG__CI = 0x0887; +constexpr unsigned int mmMC_HUB_RDREQ_ACPO__CI = 0x0888; +constexpr unsigned int mmMC_HUB_RDREQ_CNTL = 0x083B; +constexpr unsigned int mmMC_HUB_RDREQ_CPC__CI = 0x085A; +constexpr unsigned int mmMC_HUB_RDREQ_CPF__CI = 0x085B; +constexpr unsigned int mmMC_HUB_RDREQ_CPG__CI = 0x0859; +constexpr unsigned int mmMC_HUB_RDREQ_CP__SI = 0x0859; +constexpr unsigned int mmMC_HUB_RDREQ_CREDITS = 0x0844; +constexpr unsigned int mmMC_HUB_RDREQ_CREDITS2 = 0x0845; +constexpr unsigned int mmMC_HUB_RDREQ_DMIF_LIMIT = 0x0848; +constexpr unsigned int mmMC_HUB_RDREQ_DMIF__CI = 0x0865; +constexpr unsigned int mmMC_HUB_RDREQ_DMIF__SI = 0x0863; +constexpr unsigned int mmMC_HUB_RDREQ_GBL0 = 0x0856; +constexpr unsigned int mmMC_HUB_RDREQ_GBL1 = 0x0857; +constexpr unsigned int mmMC_HUB_RDREQ_HDP__CI = 0x085E; +constexpr unsigned int mmMC_HUB_RDREQ_HDP__SI = 0x085B; +constexpr unsigned int mmMC_HUB_RDREQ_IA0__CI = 0x084F; +constexpr unsigned int mmMC_HUB_RDREQ_IA1__CI = 0x0850; +constexpr unsigned int mmMC_HUB_RDREQ_IA__CI = 0x0864; +constexpr unsigned int mmMC_HUB_RDREQ_MCDW = 0x0851; +constexpr unsigned int mmMC_HUB_RDREQ_MCDX = 0x0852; +constexpr unsigned int mmMC_HUB_RDREQ_MCDY = 0x0853; +constexpr unsigned int mmMC_HUB_RDREQ_MCDZ = 0x0854; +constexpr unsigned int mmMC_HUB_RDREQ_MCIF__CI = 0x0866; +constexpr unsigned int mmMC_HUB_RDREQ_MCIF__SI = 0x0864; +constexpr unsigned int mmMC_HUB_RDREQ_RLC__CI = 0x085F; +constexpr unsigned int mmMC_HUB_RDREQ_RLC__SI = 0x085D; +constexpr unsigned int mmMC_HUB_RDREQ_SAM__CI = 0x0889; +constexpr unsigned int mmMC_HUB_RDREQ_SDMA0__CI = 0x085C; +constexpr unsigned int mmMC_HUB_RDREQ_SDMA1__CI = 0x085D; +constexpr unsigned int mmMC_HUB_RDREQ_SEM__CI = 0x0860; +constexpr unsigned int mmMC_HUB_RDREQ_SEM__SI = 0x085E; +constexpr unsigned int mmMC_HUB_RDREQ_SIP = 0x0855; +constexpr unsigned int mmMC_HUB_RDREQ_SMU = 0x0858; +constexpr unsigned int mmMC_HUB_RDREQ_STATUS = 0x0839; +constexpr unsigned int mmMC_HUB_RDREQ_UMC__CI = 0x0862; +constexpr unsigned int mmMC_HUB_RDREQ_UMC__SI = 0x0860; +constexpr unsigned int mmMC_HUB_RDREQ_UVD__CI = 0x0863; +constexpr unsigned int mmMC_HUB_RDREQ_UVD__SI = 0x0861; +constexpr unsigned int mmMC_HUB_RDREQ_VCEU__CI = 0x0868; +constexpr unsigned int mmMC_HUB_RDREQ_VCEU__SI = 0x0866; +constexpr unsigned int mmMC_HUB_RDREQ_VCE__CI = 0x0861; +constexpr unsigned int mmMC_HUB_RDREQ_VCE__SI = 0x085F; +constexpr unsigned int mmMC_HUB_RDREQ_VMC__CI = 0x0867; +constexpr unsigned int mmMC_HUB_RDREQ_VMC__SI = 0x0865; +constexpr unsigned int mmMC_HUB_RDREQ_WTM_CNTL = 0x083D; +constexpr unsigned int mmMC_HUB_RDREQ_XDMAM__CI = 0x0886; +constexpr unsigned int mmMC_HUB_RDREQ_XDMAM__SI = 0x0882; +constexpr unsigned int mmMC_HUB_SHARED_DAGB_DLY = 0x0846; +constexpr unsigned int mmMC_HUB_WDP_ACPG__CI = 0x088A; +constexpr unsigned int mmMC_HUB_WDP_ACPO__CI = 0x088B; +constexpr unsigned int mmMC_HUB_WDP_BP = 0x0837; +constexpr unsigned int mmMC_HUB_WDP_CNTL = 0x0835; +constexpr unsigned int mmMC_HUB_WDP_CPC__CI = 0x086F; +constexpr unsigned int mmMC_HUB_WDP_CPF__CI = 0x0870; +constexpr unsigned int mmMC_HUB_WDP_CPG__CI = 0x086E; +constexpr unsigned int mmMC_HUB_WDP_CP__SI = 0x086C; +constexpr unsigned int mmMC_HUB_WDP_CREDITS = 0x083F; +constexpr unsigned int mmMC_HUB_WDP_ERR = 0x0836; +constexpr unsigned int mmMC_HUB_WDP_GBL0 = 0x0841; +constexpr unsigned int mmMC_HUB_WDP_GBL1 = 0x0842; +constexpr unsigned int mmMC_HUB_WDP_HDP__CI = 0x087C; +constexpr unsigned int mmMC_HUB_WDP_HDP__SI = 0x0879; +constexpr unsigned int mmMC_HUB_WDP_IH__CI = 0x0875; +constexpr unsigned int mmMC_HUB_WDP_IH__SI = 0x0872; +constexpr unsigned int mmMC_HUB_WDP_MCDW__CI = 0x0869; +constexpr unsigned int mmMC_HUB_WDP_MCDW__SI = 0x0867; +constexpr unsigned int mmMC_HUB_WDP_MCDX__CI = 0x086A; +constexpr unsigned int mmMC_HUB_WDP_MCDX__SI = 0x0868; +constexpr unsigned int mmMC_HUB_WDP_MCDY__CI = 0x086B; +constexpr unsigned int mmMC_HUB_WDP_MCDY__SI = 0x0869; +constexpr unsigned int mmMC_HUB_WDP_MCDZ__CI = 0x086C; +constexpr unsigned int mmMC_HUB_WDP_MCDZ__SI = 0x086A; +constexpr unsigned int mmMC_HUB_WDP_MCIF__CI = 0x0872; +constexpr unsigned int mmMC_HUB_WDP_MCIF__SI = 0x086F; +constexpr unsigned int mmMC_HUB_WDP_MGPU__SI__CI = 0x0843; +constexpr unsigned int mmMC_HUB_WDP_MGPU2__SI__CI = 0x0840; +constexpr unsigned int mmMC_HUB_WDP_RLC__CI = 0x0876; +constexpr unsigned int mmMC_HUB_WDP_RLC__SI = 0x0873; +constexpr unsigned int mmMC_HUB_WDP_SAM__CI = 0x088C; +constexpr unsigned int mmMC_HUB_WDP_SDMA0__CI = 0x087D; +constexpr unsigned int mmMC_HUB_WDP_SDMA1__CI = 0x087E; +constexpr unsigned int mmMC_HUB_WDP_SEM__CI = 0x0877; +constexpr unsigned int mmMC_HUB_WDP_SEM__SI = 0x0874; +constexpr unsigned int mmMC_HUB_WDP_SH0__CI = 0x0871; +constexpr unsigned int mmMC_HUB_WDP_SH0__SI = 0x086E; +constexpr unsigned int mmMC_HUB_WDP_SH1__CI = 0x0879; +constexpr unsigned int mmMC_HUB_WDP_SH1__SI = 0x0876; +constexpr unsigned int mmMC_HUB_WDP_SH2__CI__VI = 0x084D; +constexpr unsigned int mmMC_HUB_WDP_SH3__CI__VI = 0x084E; +constexpr unsigned int mmMC_HUB_WDP_SIP__CI = 0x086D; +constexpr unsigned int mmMC_HUB_WDP_SIP__SI = 0x086B; +constexpr unsigned int mmMC_HUB_WDP_SMU__CI = 0x0878; +constexpr unsigned int mmMC_HUB_WDP_SMU__SI = 0x0875; +constexpr unsigned int mmMC_HUB_WDP_STATUS = 0x0838; +constexpr unsigned int mmMC_HUB_WDP_UMC__CI = 0x087A; +constexpr unsigned int mmMC_HUB_WDP_UMC__SI = 0x0877; +constexpr unsigned int mmMC_HUB_WDP_UVD__CI = 0x087B; +constexpr unsigned int mmMC_HUB_WDP_UVD__SI = 0x0878; +constexpr unsigned int mmMC_HUB_WDP_VCEU__CI = 0x0883; +constexpr unsigned int mmMC_HUB_WDP_VCEU__SI = 0x087F; +constexpr unsigned int mmMC_HUB_WDP_VCE__CI = 0x0873; +constexpr unsigned int mmMC_HUB_WDP_VCE__SI = 0x0870; +constexpr unsigned int mmMC_HUB_WDP_WTM_CNTL = 0x083E; +constexpr unsigned int mmMC_HUB_WDP_XDMAM__CI = 0x0884; +constexpr unsigned int mmMC_HUB_WDP_XDMAM__SI = 0x0880; +constexpr unsigned int mmMC_HUB_WDP_XDMA__CI = 0x0885; +constexpr unsigned int mmMC_HUB_WDP_XDMA__SI = 0x0881; +constexpr unsigned int mmMC_HUB_WDP_XDP__CI = 0x0874; +constexpr unsigned int mmMC_HUB_WDP_XDP__SI = 0x0871; +constexpr unsigned int mmMC_HUB_WRRET_CNTL = 0x083C; +constexpr unsigned int mmMC_HUB_WRRET_MCDW__CI = 0x087F; +constexpr unsigned int mmMC_HUB_WRRET_MCDW__SI = 0x087B; +constexpr unsigned int mmMC_HUB_WRRET_MCDX__CI = 0x0880; +constexpr unsigned int mmMC_HUB_WRRET_MCDX__SI = 0x087C; +constexpr unsigned int mmMC_HUB_WRRET_MCDY__CI = 0x0881; +constexpr unsigned int mmMC_HUB_WRRET_MCDY__SI = 0x087D; +constexpr unsigned int mmMC_HUB_WRRET_MCDZ__CI = 0x0882; +constexpr unsigned int mmMC_HUB_WRRET_MCDZ__SI = 0x087E; +constexpr unsigned int mmMC_HUB_WRRET_STATUS = 0x083A; +constexpr unsigned int mmMC_IMP_CNTL__SI__CI = 0x0A36; +constexpr unsigned int mmMC_IMP_DEBUG__SI__CI = 0x0A37; +constexpr unsigned int mmMC_IMP_DQ_STATUS__SI__CI = 0x0ABC; +constexpr unsigned int mmMC_IMP_STATUS__SI__CI = 0x0A38; +constexpr unsigned int mmMC_IO_APHY_STR_CNTL_D0__SI__CI = 0x0A97; +constexpr unsigned int mmMC_IO_APHY_STR_CNTL_D1__SI__CI = 0x0A98; +constexpr unsigned int mmMC_IO_CDRCNTL1_D0__SI__CI = 0x0ADD; +constexpr unsigned int mmMC_IO_CDRCNTL1_D1__SI__CI = 0x0ADE; +constexpr unsigned int mmMC_IO_CDRCNTL2_D0__SI__CI = 0x0AE4; +constexpr unsigned int mmMC_IO_CDRCNTL2_D1__SI__CI = 0x0AE5; +constexpr unsigned int mmMC_IO_CDRCNTL_D0__SI__CI = 0x0A55; +constexpr unsigned int mmMC_IO_CDRCNTL_D1__SI__CI = 0x0A56; +constexpr unsigned int mmMC_IO_DPHY_STR_CNTL_D0__SI__CI = 0x0A4E; +constexpr unsigned int mmMC_IO_DPHY_STR_CNTL_D1__SI__CI = 0x0A54; +constexpr unsigned int mmMC_IO_PAD_CNTL__SI__CI = 0x0A73; +constexpr unsigned int mmMC_IO_PAD_CNTL_D0__SI__CI = 0x0A74; +constexpr unsigned int mmMC_IO_PAD_CNTL_D1__SI__CI = 0x0A75; +constexpr unsigned int mmMC_IO_RXCNTL1_DPHY0_D0__SI__CI = 0x0ADF; +constexpr unsigned int mmMC_IO_RXCNTL1_DPHY0_D1__SI__CI = 0x0AE1; +constexpr unsigned int mmMC_IO_RXCNTL1_DPHY1_D0__SI__CI = 0x0AE0; +constexpr unsigned int mmMC_IO_RXCNTL1_DPHY1_D1__SI__CI = 0x0AE2; +constexpr unsigned int mmMC_IO_RXCNTL_DPHY0_D0__SI__CI = 0x0A4C; +constexpr unsigned int mmMC_IO_RXCNTL_DPHY0_D1__SI__CI = 0x0A52; +constexpr unsigned int mmMC_IO_RXCNTL_DPHY1_D0__SI__CI = 0x0A4D; +constexpr unsigned int mmMC_IO_RXCNTL_DPHY1_D1__SI__CI = 0x0A53; +constexpr unsigned int mmMC_IO_TXCNTL_APHY_D0__SI__CI = 0x0A4B; +constexpr unsigned int mmMC_IO_TXCNTL_APHY_D1__SI__CI = 0x0A51; +constexpr unsigned int mmMC_IO_TXCNTL_DPHY0_D0__SI__CI = 0x0A49; +constexpr unsigned int mmMC_IO_TXCNTL_DPHY0_D1__SI__CI = 0x0A4F; +constexpr unsigned int mmMC_IO_TXCNTL_DPHY1_D0__SI__CI = 0x0A4A; +constexpr unsigned int mmMC_IO_TXCNTL_DPHY1_D1__SI__CI = 0x0A50; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER0_CFG__CI__VI = 0x07C0; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER1_CFG__CI__VI = 0x07C1; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER2_CFG__CI__VI = 0x07C2; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER3_CFG__CI__VI = 0x07C3; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER_HI__CI__VI = 0x07AA; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER_LO__CI__VI = 0x07A3; +constexpr unsigned int mmMC_MCBVM_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07D1; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER0_CFG__CI__VI = 0x07C4; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER1_CFG__CI__VI = 0x07C5; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER2_CFG__CI__VI = 0x07C6; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER3_CFG__CI__VI = 0x07C7; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER_HI__CI__VI = 0x07AB; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER_LO__CI__VI = 0x07A4; +constexpr unsigned int mmMC_MCDVM_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07D2; +constexpr unsigned int mmMC_MEM_POWER_LS = 0x082A; +constexpr unsigned int mmMC_NPL_STATUS__SI__CI = 0x0A76; +constexpr unsigned int mmMC_PHY_TIMING_2__SI__CI = 0x0ACE; +constexpr unsigned int mmMC_PHY_TIMING_D0__SI__CI = 0x0ACC; +constexpr unsigned int mmMC_PHY_TIMING_D1__SI__CI = 0x0ACD; +constexpr unsigned int mmMC_PMG_AUTO_CFG__SI__CI = 0x0A35; +constexpr unsigned int mmMC_PMG_AUTO_CMD__SI__CI = 0x0A34; +constexpr unsigned int mmMC_RD_CB = 0x0981; +constexpr unsigned int mmMC_RD_DB = 0x0982; +constexpr unsigned int mmMC_RD_GRP_EXT = 0x0978; +constexpr unsigned int mmMC_RD_GRP_GFX = 0x0803; +constexpr unsigned int mmMC_RD_GRP_LCL = 0x098A; +constexpr unsigned int mmMC_RD_GRP_OTH = 0x0807; +constexpr unsigned int mmMC_RD_GRP_SYS = 0x0805; +constexpr unsigned int mmMC_RD_HUB = 0x0985; +constexpr unsigned int mmMC_RD_TC0 = 0x0983; +constexpr unsigned int mmMC_RD_TC1 = 0x0984; +constexpr unsigned int mmMC_RPB_ARB_CNTL = 0x0951; +constexpr unsigned int mmMC_RPB_BIF_CNTL = 0x0952; +constexpr unsigned int mmMC_RPB_CID_QUEUE_EX = 0x095A; +constexpr unsigned int mmMC_RPB_CID_QUEUE_EX_DATA = 0x095B; +constexpr unsigned int mmMC_RPB_CID_QUEUE_RD = 0x0957; +constexpr unsigned int mmMC_RPB_CID_QUEUE_WR = 0x0956; +constexpr unsigned int mmMC_RPB_CONF = 0x094D; +constexpr unsigned int mmMC_RPB_DBG1 = 0x094F; +constexpr unsigned int mmMC_RPB_EFF_CNTL = 0x0950; +constexpr unsigned int mmMC_RPB_IF_CONF = 0x094E; +constexpr unsigned int mmMC_RPB_PERFCOUNTER0_CFG__CI__VI = 0x07B8; +constexpr unsigned int mmMC_RPB_PERFCOUNTER1_CFG__CI__VI = 0x07B9; +constexpr unsigned int mmMC_RPB_PERFCOUNTER2_CFG__CI__VI = 0x07BA; +constexpr unsigned int mmMC_RPB_PERFCOUNTER3_CFG__CI__VI = 0x07BB; +constexpr unsigned int mmMC_RPB_PERFCOUNTER_HI__CI__VI = 0x07AC; +constexpr unsigned int mmMC_RPB_PERFCOUNTER_LO__CI__VI = 0x07A2; +constexpr unsigned int mmMC_RPB_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07D0; +constexpr unsigned int mmMC_RPB_PERF_COUNTER_CNTL = 0x0958; +constexpr unsigned int mmMC_RPB_PERF_COUNTER_STATUS = 0x0959; +constexpr unsigned int mmMC_RPB_RD_SWITCH_CNTL = 0x0955; +constexpr unsigned int mmMC_RPB_WR_COMBINE_CNTL = 0x0954; +constexpr unsigned int mmMC_RPB_WR_SWITCH_CNTL = 0x0953; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B0_D0__SI__CI = 0x0AA3; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B0_D1__SI__CI = 0x0AA7; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B1_D0__SI__CI = 0x0AA4; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B1_D1__SI__CI = 0x0AA8; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B2_D0__SI__CI = 0x0AA5; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B2_D1__SI__CI = 0x0AA9; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B3_D0__SI__CI = 0x0AA6; +constexpr unsigned int mmMC_SEQ_BIT_REMAP_B3_D1__SI__CI = 0x0AAA; +constexpr unsigned int mmMC_SEQ_BYTE_REMAP_D0__SI__CI = 0x0A93; +constexpr unsigned int mmMC_SEQ_BYTE_REMAP_D1__SI__CI = 0x0A94; +constexpr unsigned int mmMC_SEQ_CNTL_3__CI = 0x0D80; +constexpr unsigned int mmMC_SEQ_DLL_STBY_LP__CI = 0x0D8F; +constexpr unsigned int mmMC_SEQ_DLL_STBY__CI = 0x0D8E; +constexpr unsigned int mmMC_SEQ_DRAM_ERROR_INSERTION__SI__CI = 0x0ACB; +constexpr unsigned int mmMC_SEQ_G5PDX_CMD0_LP__CI = 0x0D84; +constexpr unsigned int mmMC_SEQ_G5PDX_CMD0__CI = 0x0D83; +constexpr unsigned int mmMC_SEQ_G5PDX_CMD1_LP__CI = 0x0D86; +constexpr unsigned int mmMC_SEQ_G5PDX_CMD1__CI = 0x0D85; +constexpr unsigned int mmMC_SEQ_G5PDX_CTRL_LP__CI = 0x0D82; +constexpr unsigned int mmMC_SEQ_G5PDX_CTRL__CI = 0x0D81; +constexpr unsigned int mmMC_SEQ_IO_RDBI__SI__CI = 0x0AB4; +constexpr unsigned int mmMC_SEQ_IO_REDC__SI__CI = 0x0AB5; +constexpr unsigned int mmMC_SEQ_IO_RESERVE_D0__SI__CI = 0x0AB7; +constexpr unsigned int mmMC_SEQ_IO_RESERVE_D1__SI__CI = 0x0AB8; +constexpr unsigned int mmMC_SEQ_IO_RWORD0__SI__CI = 0x0AAC; +constexpr unsigned int mmMC_SEQ_IO_RWORD1__SI__CI = 0x0AAD; +constexpr unsigned int mmMC_SEQ_IO_RWORD2__SI__CI = 0x0AAE; +constexpr unsigned int mmMC_SEQ_IO_RWORD3__SI__CI = 0x0AAF; +constexpr unsigned int mmMC_SEQ_IO_RWORD4__SI__CI = 0x0AB0; +constexpr unsigned int mmMC_SEQ_IO_RWORD5__SI__CI = 0x0AB1; +constexpr unsigned int mmMC_SEQ_IO_RWORD6__SI__CI = 0x0AB2; +constexpr unsigned int mmMC_SEQ_IO_RWORD7__SI__CI = 0x0AB3; +constexpr unsigned int mmMC_SEQ_MPLL_OVERRIDE__SI__CI = 0x0A22; +constexpr unsigned int mmMC_SEQ_PERF_CNTL__SI__CI = 0x0A77; +constexpr unsigned int mmMC_SEQ_PERF_CNTL_1__SI__CI = 0x0AFD; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_A_I0__SI__CI = 0x0A79; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_A_I1__SI__CI = 0x0A7A; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_B_I0__SI__CI = 0x0A7B; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_B_I1__SI__CI = 0x0A7C; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_C_I0__SI__CI = 0x0AD9; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_C_I1__SI__CI = 0x0ADA; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_D_I0__SI__CI = 0x0ADB; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CNT_D_I1__SI__CI = 0x0ADC; +constexpr unsigned int mmMC_SEQ_PERF_SEQ_CTL__SI__CI = 0x0A78; +constexpr unsigned int mmMC_SEQ_PHYREG_BCAST__CI = 0x0D89; +constexpr unsigned int mmMC_SEQ_PMG_CMD_EMRS_LP__SI__CI = 0x0AA1; +constexpr unsigned int mmMC_SEQ_PMG_CMD_MRS1_LP__SI__CI = 0x0AD2; +constexpr unsigned int mmMC_SEQ_PMG_CMD_MRS2_LP__SI__CI = 0x0AD8; +constexpr unsigned int mmMC_SEQ_PMG_CMD_MRS_LP__SI__CI = 0x0AA2; +constexpr unsigned int mmMC_SEQ_PMG_DVS_CMD_LP__CI = 0x0D8D; +constexpr unsigned int mmMC_SEQ_PMG_DVS_CMD__CI = 0x0D8C; +constexpr unsigned int mmMC_SEQ_PMG_DVS_CTL_LP__CI = 0x0D8B; +constexpr unsigned int mmMC_SEQ_PMG_DVS_CTL__CI = 0x0D8A; +constexpr unsigned int mmMC_SEQ_PMG_PG_HWCNTL__SI__CI = 0x0AB9; +constexpr unsigned int mmMC_SEQ_PMG_PG_SWCNTL_0__SI__CI = 0x0ABA; +constexpr unsigned int mmMC_SEQ_PMG_PG_SWCNTL_1__SI__CI = 0x0ABB; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE0_D0__SI__CI = 0x0A67; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE0_D1__SI__CI = 0x0A6D; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE1_D0__SI__CI = 0x0A68; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE1_D1__SI__CI = 0x0A6E; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE2_D0__SI__CI = 0x0A69; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE2_D1__SI__CI = 0x0A6F; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE3_D0__SI__CI = 0x0A6A; +constexpr unsigned int mmMC_SEQ_RXFRAMING_BYTE3_D1__SI__CI = 0x0A70; +constexpr unsigned int mmMC_SEQ_RXFRAMING_DBI_D0__SI__CI = 0x0A6B; +constexpr unsigned int mmMC_SEQ_RXFRAMING_DBI_D1__SI__CI = 0x0A71; +constexpr unsigned int mmMC_SEQ_RXFRAMING_EDC_D0__SI__CI = 0x0A6C; +constexpr unsigned int mmMC_SEQ_RXFRAMING_EDC_D1__SI__CI = 0x0A72; +constexpr unsigned int mmMC_SEQ_SREG_READ__CI = 0x0D87; +constexpr unsigned int mmMC_SEQ_SREG_STATUS__CI = 0x0D88; +constexpr unsigned int mmMC_SEQ_TCG_CNTL__SI__CI = 0x0ABD; +constexpr unsigned int mmMC_SEQ_TRAIN_EDC_THRESHOLD__SI__CI = 0x0A3B; +constexpr unsigned int mmMC_SEQ_TRAIN_EDC_THRESHOLD2__SI__CI = 0x0AFE; +constexpr unsigned int mmMC_SEQ_TRAIN_EDC_THRESHOLD3__SI__CI = 0x0AFF; +constexpr unsigned int mmMC_SEQ_TRAIN_TIMING__SI__CI = 0x0A40; +constexpr unsigned int mmMC_SEQ_TSM_BCNT__SI__CI = 0x0AC2; +constexpr unsigned int mmMC_SEQ_TSM_CTRL__SI__CI = 0x0ABE; +constexpr unsigned int mmMC_SEQ_TSM_DBI__SI__CI = 0x0AC6; +constexpr unsigned int mmMC_SEQ_TSM_DEBUG_DATA__SI__CI = 0x0AD0; +constexpr unsigned int mmMC_SEQ_TSM_DEBUG_INDEX__SI__CI = 0x0ACF; +constexpr unsigned int mmMC_SEQ_TSM_EDC__SI__CI = 0x0AC5; +constexpr unsigned int mmMC_SEQ_TSM_FLAG__SI__CI = 0x0AC3; +constexpr unsigned int mmMC_SEQ_TSM_GCNT__SI__CI = 0x0ABF; +constexpr unsigned int mmMC_SEQ_TSM_MISC__SI__CI = 0x0AE6; +constexpr unsigned int mmMC_SEQ_TSM_NCNT__SI__CI = 0x0AC1; +constexpr unsigned int mmMC_SEQ_TSM_OCNT__SI__CI = 0x0AC0; +constexpr unsigned int mmMC_SEQ_TSM_UPDATE__SI__CI = 0x0AC4; +constexpr unsigned int mmMC_SEQ_TSM_WCDR__SI__CI = 0x0AE3; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE0_D0__SI__CI = 0x0A58; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE0_D1__SI__CI = 0x0A60; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE1_D0__SI__CI = 0x0A59; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE1_D1__SI__CI = 0x0A61; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE2_D0__SI__CI = 0x0A5A; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE2_D1__SI__CI = 0x0A62; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE3_D0__SI__CI = 0x0A5B; +constexpr unsigned int mmMC_SEQ_TXFRAMING_BYTE3_D1__SI__CI = 0x0A63; +constexpr unsigned int mmMC_SEQ_TXFRAMING_DBI_D0__SI__CI = 0x0A5C; +constexpr unsigned int mmMC_SEQ_TXFRAMING_DBI_D1__SI__CI = 0x0A64; +constexpr unsigned int mmMC_SEQ_TXFRAMING_EDC_D0__SI__CI = 0x0A5D; +constexpr unsigned int mmMC_SEQ_TXFRAMING_EDC_D1__SI__CI = 0x0A65; +constexpr unsigned int mmMC_SEQ_TXFRAMING_FCK_D0__SI__CI = 0x0A5E; +constexpr unsigned int mmMC_SEQ_TXFRAMING_FCK_D1__SI__CI = 0x0A66; +constexpr unsigned int mmMC_SEQ_VENDOR_ID_I0__SI__CI = 0x0A7E; +constexpr unsigned int mmMC_SEQ_VENDOR_ID_I1__SI__CI = 0x0A7F; +constexpr unsigned int mmMC_SEQ_WCDR_CTRL__SI__CI = 0x0A39; +constexpr unsigned int mmMC_SEQ_WR_CTL_2__SI__CI = 0x0AD5; +constexpr unsigned int mmMC_SEQ_WR_CTL_2_LP__SI__CI = 0x0AD6; +constexpr unsigned int mmMC_SHARED_BLACKOUT_CNTL = 0x082B; +constexpr unsigned int mmMC_SHARED_CHMAP = 0x0801; +constexpr unsigned int mmMC_SHARED_CHREMAP = 0x0802; +constexpr unsigned int mmMC_TRAIN_EDCCDR_R_D0__SI__CI = 0x0A41; +constexpr unsigned int mmMC_TRAIN_EDCCDR_R_D1__SI__CI = 0x0A42; +constexpr unsigned int mmMC_TRAIN_EDC_STATUS_D0__SI__CI = 0x0A45; +constexpr unsigned int mmMC_TRAIN_EDC_STATUS_D1__SI__CI = 0x0A48; +constexpr unsigned int mmMC_TRAIN_PRBSERR_0_D0__SI__CI = 0x0A43; +constexpr unsigned int mmMC_TRAIN_PRBSERR_0_D1__SI__CI = 0x0A46; +constexpr unsigned int mmMC_TRAIN_PRBSERR_1_D0__SI__CI = 0x0A44; +constexpr unsigned int mmMC_TRAIN_PRBSERR_1_D1__SI__CI = 0x0A47; +constexpr unsigned int mmMC_TRAIN_PRBSERR_2_D0__SI__CI = 0x0AFB; +constexpr unsigned int mmMC_TRAIN_PRBSERR_2_D1__SI__CI = 0x0AFC; +constexpr unsigned int mmMC_VM_AGP_BASE = 0x080C; +constexpr unsigned int mmMC_VM_AGP_BOT = 0x080B; +constexpr unsigned int mmMC_VM_AGP_TOP = 0x080A; +constexpr unsigned int mmMC_VM_DC_WRITE_CNTL = 0x0810; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_0_HIGH_ADDR = 0x0815; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_0_LOW_ADDR = 0x0811; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_1_HIGH_ADDR = 0x0816; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_1_LOW_ADDR = 0x0812; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_2_HIGH_ADDR = 0x0817; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_2_LOW_ADDR = 0x0813; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_3_HIGH_ADDR = 0x0818; +constexpr unsigned int mmMC_VM_DC_WRITE_HIT_REGION_3_LOW_ADDR = 0x0814; +constexpr unsigned int mmMC_VM_FB_LOCATION = 0x0809; +constexpr unsigned int mmMC_VM_FB_OFFSET = 0x081A; +constexpr unsigned int mmMC_VM_L2_PERFCOUNTER0_CFG__CI__VI = 0x07CC; +constexpr unsigned int mmMC_VM_L2_PERFCOUNTER1_CFG__CI__VI = 0x07CD; +constexpr unsigned int mmMC_VM_L2_PERFCOUNTER_HI__CI__VI = 0x07AD; +constexpr unsigned int mmMC_VM_L2_PERFCOUNTER_LO__CI__VI = 0x07A5; +constexpr unsigned int mmMC_VM_L2_PERFCOUNTER_RSLT_CNTL__CI__VI = 0x07D3; +constexpr unsigned int mmMC_VM_MB_L1_TLB0_DEBUG = 0x0891; +constexpr unsigned int mmMC_VM_MB_L1_TLB0_STATUS = 0x0895; +constexpr unsigned int mmMC_VM_MB_L1_TLB1_STATUS = 0x0896; +constexpr unsigned int mmMC_VM_MB_L1_TLB2_DEBUG = 0x0893; +constexpr unsigned int mmMC_VM_MB_L1_TLB2_STATUS = 0x0897; +constexpr unsigned int mmMC_VM_MB_L1_TLB3_DEBUG = 0x08A5; +constexpr unsigned int mmMC_VM_MB_L1_TLB3_STATUS = 0x08A6; +constexpr unsigned int mmMC_VM_MB_L2ARBITER_L2_CREDITS = 0x08A1; +constexpr unsigned int mmMC_VM_MD_L1_TLB0_DEBUG = 0x0998; +constexpr unsigned int mmMC_VM_MD_L1_TLB0_STATUS = 0x099B; +constexpr unsigned int mmMC_VM_MD_L1_TLB1_DEBUG = 0x0999; +constexpr unsigned int mmMC_VM_MD_L1_TLB1_STATUS = 0x099C; +constexpr unsigned int mmMC_VM_MD_L1_TLB2_DEBUG = 0x099A; +constexpr unsigned int mmMC_VM_MD_L1_TLB2_STATUS = 0x099D; +constexpr unsigned int mmMC_VM_MD_L1_TLB3_DEBUG = 0x09A7; +constexpr unsigned int mmMC_VM_MD_L1_TLB3_STATUS = 0x09A8; +constexpr unsigned int mmMC_VM_MD_L2ARBITER_L2_CREDITS = 0x09A4; +constexpr unsigned int mmMC_VM_MX_L1_TLB_CNTL = 0x0819; +constexpr unsigned int mmMC_VM_STEERING__CI__VI = 0x081B; +constexpr unsigned int mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR = 0x080F; +constexpr unsigned int mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR = 0x080E; +constexpr unsigned int mmMC_VM_SYSTEM_APERTURE_LOW_ADDR = 0x080D; +constexpr unsigned int mmMC_WR_CB = 0x0986; +constexpr unsigned int mmMC_WR_DB = 0x0987; +constexpr unsigned int mmMC_WR_GRP_EXT = 0x0979; +constexpr unsigned int mmMC_WR_GRP_GFX = 0x0804; +constexpr unsigned int mmMC_WR_GRP_LCL = 0x098B; +constexpr unsigned int mmMC_WR_GRP_OTH = 0x0808; +constexpr unsigned int mmMC_WR_GRP_SYS = 0x0806; +constexpr unsigned int mmMC_WR_HUB = 0x0988; +constexpr unsigned int mmMC_WR_TC0 = 0x097B; +constexpr unsigned int mmMC_WR_TC1 = 0x097C; +constexpr unsigned int mmMC_XBAR_ADDR_DEC = 0x0C80; +constexpr unsigned int mmMC_XBAR_ARB = 0x0C8D; +constexpr unsigned int mmMC_XBAR_ARB_MAX_BURST = 0x0C8E; +constexpr unsigned int mmMC_XBAR_CHTRIREMAP = 0x0C8B; +constexpr unsigned int mmMC_XBAR_PERF_MON_CNTL0__SI__CI = 0x0C8F; +constexpr unsigned int mmMC_XBAR_PERF_MON_CNTL1__SI__CI = 0x0C90; +constexpr unsigned int mmMC_XBAR_PERF_MON_CNTL2__SI__CI = 0x0C91; +constexpr unsigned int mmMC_XBAR_PERF_MON_MAX_THSH__SI__CI = 0x0C96; +constexpr unsigned int mmMC_XBAR_PERF_MON_RSLT0__SI__CI = 0x0C92; +constexpr unsigned int mmMC_XBAR_PERF_MON_RSLT1__SI__CI = 0x0C93; +constexpr unsigned int mmMC_XBAR_PERF_MON_RSLT2__SI__CI = 0x0C94; +constexpr unsigned int mmMC_XBAR_PERF_MON_RSLT3__SI__CI = 0x0C95; +constexpr unsigned int mmMC_XBAR_RDREQ_CREDIT = 0x0C83; +constexpr unsigned int mmMC_XBAR_RDREQ_PRI_CREDIT = 0x0C84; +constexpr unsigned int mmMC_XBAR_RDRET_CREDIT1 = 0x0C87; +constexpr unsigned int mmMC_XBAR_RDRET_CREDIT2 = 0x0C88; +constexpr unsigned int mmMC_XBAR_RDRET_PRI_CREDIT1 = 0x0C89; +constexpr unsigned int mmMC_XBAR_RDRET_PRI_CREDIT2 = 0x0C8A; +constexpr unsigned int mmMC_XBAR_REMOTE = 0x0C81; +constexpr unsigned int mmMC_XBAR_SPARE0 = 0x0C97; +constexpr unsigned int mmMC_XBAR_SPARE1 = 0x0C98; +constexpr unsigned int mmMC_XBAR_TWOCHAN = 0x0C8C; +constexpr unsigned int mmMC_XBAR_WRREQ_CREDIT = 0x0C82; +constexpr unsigned int mmMC_XBAR_WRRET_CREDIT1 = 0x0C85; +constexpr unsigned int mmMC_XBAR_WRRET_CREDIT2 = 0x0C86; +constexpr unsigned int mmMC_XPB_CLG_CFG0 = 0x08E9; +constexpr unsigned int mmMC_XPB_CLG_CFG1 = 0x08EA; +constexpr unsigned int mmMC_XPB_CLG_CFG10 = 0x08F3; +constexpr unsigned int mmMC_XPB_CLG_CFG11 = 0x08F4; +constexpr unsigned int mmMC_XPB_CLG_CFG12 = 0x08F5; +constexpr unsigned int mmMC_XPB_CLG_CFG13 = 0x08F6; +constexpr unsigned int mmMC_XPB_CLG_CFG14 = 0x08F7; +constexpr unsigned int mmMC_XPB_CLG_CFG15 = 0x08F8; +constexpr unsigned int mmMC_XPB_CLG_CFG16 = 0x08F9; +constexpr unsigned int mmMC_XPB_CLG_CFG17 = 0x08FA; +constexpr unsigned int mmMC_XPB_CLG_CFG18 = 0x08FB; +constexpr unsigned int mmMC_XPB_CLG_CFG19 = 0x08FC; +constexpr unsigned int mmMC_XPB_CLG_CFG2 = 0x08EB; +constexpr unsigned int mmMC_XPB_CLG_CFG20 = 0x0928; +constexpr unsigned int mmMC_XPB_CLG_CFG21 = 0x0929; +constexpr unsigned int mmMC_XPB_CLG_CFG22 = 0x092A; +constexpr unsigned int mmMC_XPB_CLG_CFG23 = 0x092B; +constexpr unsigned int mmMC_XPB_CLG_CFG24 = 0x092C; +constexpr unsigned int mmMC_XPB_CLG_CFG25 = 0x092D; +constexpr unsigned int mmMC_XPB_CLG_CFG26 = 0x092E; +constexpr unsigned int mmMC_XPB_CLG_CFG27 = 0x092F; +constexpr unsigned int mmMC_XPB_CLG_CFG28 = 0x0930; +constexpr unsigned int mmMC_XPB_CLG_CFG29 = 0x0931; +constexpr unsigned int mmMC_XPB_CLG_CFG3 = 0x08EC; +constexpr unsigned int mmMC_XPB_CLG_CFG30 = 0x0932; +constexpr unsigned int mmMC_XPB_CLG_CFG31 = 0x0933; +constexpr unsigned int mmMC_XPB_CLG_CFG32 = 0x0936; +constexpr unsigned int mmMC_XPB_CLG_CFG33 = 0x0937; +constexpr unsigned int mmMC_XPB_CLG_CFG34 = 0x0938; +constexpr unsigned int mmMC_XPB_CLG_CFG35 = 0x0939; +constexpr unsigned int mmMC_XPB_CLG_CFG36 = 0x093A; +constexpr unsigned int mmMC_XPB_CLG_CFG4 = 0x08ED; +constexpr unsigned int mmMC_XPB_CLG_CFG5 = 0x08EE; +constexpr unsigned int mmMC_XPB_CLG_CFG6 = 0x08EF; +constexpr unsigned int mmMC_XPB_CLG_CFG7 = 0x08F0; +constexpr unsigned int mmMC_XPB_CLG_CFG8 = 0x08F1; +constexpr unsigned int mmMC_XPB_CLG_CFG9 = 0x08F2; +constexpr unsigned int mmMC_XPB_CLG_EXTRA = 0x08FD; +constexpr unsigned int mmMC_XPB_CLG_EXTRA_RD = 0x0935; +constexpr unsigned int mmMC_XPB_CLK_GAT = 0x091E; +constexpr unsigned int mmMC_XPB_INTF_CFG = 0x091F; +constexpr unsigned int mmMC_XPB_INTF_CFG2 = 0x0934; +constexpr unsigned int mmMC_XPB_INTF_STS = 0x0920; +constexpr unsigned int mmMC_XPB_LB_ADDR = 0x08FE; +constexpr unsigned int mmMC_XPB_MAP_INVERT_FLUSH_NUM_LSB = 0x0923; +constexpr unsigned int mmMC_XPB_MISC_CFG = 0x0927; +constexpr unsigned int mmMC_XPB_P2P_BAR0 = 0x0904; +constexpr unsigned int mmMC_XPB_P2P_BAR1 = 0x0905; +constexpr unsigned int mmMC_XPB_P2P_BAR2 = 0x0906; +constexpr unsigned int mmMC_XPB_P2P_BAR3 = 0x0907; +constexpr unsigned int mmMC_XPB_P2P_BAR4 = 0x0908; +constexpr unsigned int mmMC_XPB_P2P_BAR5 = 0x0909; +constexpr unsigned int mmMC_XPB_P2P_BAR6 = 0x090A; +constexpr unsigned int mmMC_XPB_P2P_BAR7 = 0x090B; +constexpr unsigned int mmMC_XPB_P2P_BAR_CFG = 0x0903; +constexpr unsigned int mmMC_XPB_P2P_BAR_DEBUG = 0x090D; +constexpr unsigned int mmMC_XPB_P2P_BAR_DELTA_ABOVE = 0x090E; +constexpr unsigned int mmMC_XPB_P2P_BAR_DELTA_BELOW = 0x090F; +constexpr unsigned int mmMC_XPB_P2P_BAR_SETUP = 0x090C; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR0 = 0x0910; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR1 = 0x0911; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR2 = 0x0912; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR3 = 0x0913; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR4 = 0x0914; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR5 = 0x0915; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR6 = 0x0916; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR7 = 0x0917; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR8 = 0x0918; +constexpr unsigned int mmMC_XPB_PEER_SYS_BAR9 = 0x0919; +constexpr unsigned int mmMC_XPB_PERF_KNOBS = 0x0924; +constexpr unsigned int mmMC_XPB_PIPE_STS = 0x0921; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP0 = 0x08DB; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP1 = 0x08DC; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP2 = 0x08DD; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP3 = 0x08DE; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP4 = 0x08DF; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP5 = 0x08E0; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP6 = 0x08E1; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP7 = 0x08E2; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP8 = 0x08E3; +constexpr unsigned int mmMC_XPB_RTR_DEST_MAP9 = 0x08E4; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR0 = 0x08CD; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR1 = 0x08CE; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR2 = 0x08CF; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR3 = 0x08D0; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR4 = 0x08D1; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR5 = 0x08D2; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR6 = 0x08D3; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR7 = 0x08D4; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR8 = 0x08D5; +constexpr unsigned int mmMC_XPB_RTR_SRC_APRTR9 = 0x08D6; +constexpr unsigned int mmMC_XPB_STICKY = 0x0925; +constexpr unsigned int mmMC_XPB_STICKY_W1C = 0x0926; +constexpr unsigned int mmMC_XPB_SUB_CTRL = 0x0922; +constexpr unsigned int mmMC_XPB_UNC_THRESH_HST = 0x08FF; +constexpr unsigned int mmMC_XPB_UNC_THRESH_SID = 0x0900; +constexpr unsigned int mmMC_XPB_WCB_CFG = 0x0902; +constexpr unsigned int mmMC_XPB_WCB_STS = 0x0901; +constexpr unsigned int mmMC_XPB_XDMA_PEER_SYS_BAR0 = 0x091A; +constexpr unsigned int mmMC_XPB_XDMA_PEER_SYS_BAR1 = 0x091B; +constexpr unsigned int mmMC_XPB_XDMA_PEER_SYS_BAR2 = 0x091C; +constexpr unsigned int mmMC_XPB_XDMA_PEER_SYS_BAR3 = 0x091D; +constexpr unsigned int mmMC_XPB_XDMA_RTR_DEST_MAP0 = 0x08E5; +constexpr unsigned int mmMC_XPB_XDMA_RTR_DEST_MAP1 = 0x08E6; +constexpr unsigned int mmMC_XPB_XDMA_RTR_DEST_MAP2 = 0x08E7; +constexpr unsigned int mmMC_XPB_XDMA_RTR_DEST_MAP3 = 0x08E8; +constexpr unsigned int mmMC_XPB_XDMA_RTR_SRC_APRTR0 = 0x08D7; +constexpr unsigned int mmMC_XPB_XDMA_RTR_SRC_APRTR1 = 0x08D8; +constexpr unsigned int mmMC_XPB_XDMA_RTR_SRC_APRTR2 = 0x08D9; +constexpr unsigned int mmMC_XPB_XDMA_RTR_SRC_APRTR3 = 0x08DA; +constexpr unsigned int mmMEM_TYPE_CNTL__CI__VI = 0x14E4; +constexpr unsigned int mmMICROSECOND_TIME_BASE_DIV__SI = 0x0148; +constexpr unsigned int mmMM_CFGREGS_CNTL = 0x1513; +constexpr unsigned int mmMM_DATA = 0x0001; +constexpr unsigned int mmMM_INDEX = 0x0000; +constexpr unsigned int mmMM_INDEX_HI__CI__VI = 0x0006; +constexpr unsigned int mmMPLL_AD_FUNC_CNTL__SI__CI = 0x0AF0; +constexpr unsigned int mmMPLL_AD_STATUS__SI__CI = 0x0AF6; +constexpr unsigned int mmMPLL_BYPASSCLK_SEL__SI = 0x0197; +constexpr unsigned int mmMPLL_CNTL_MODE__SI__CI = 0x0AEC; +constexpr unsigned int mmMPLL_CONTROL__SI__CI = 0x0AF5; +constexpr unsigned int mmMPLL_DQ_0_0_STATUS__SI__CI = 0x0AF7; +constexpr unsigned int mmMPLL_DQ_0_1_STATUS__SI__CI = 0x0AF8; +constexpr unsigned int mmMPLL_DQ_1_0_STATUS__SI__CI = 0x0AF9; +constexpr unsigned int mmMPLL_DQ_1_1_STATUS__SI__CI = 0x0AFA; +constexpr unsigned int mmMPLL_DQ_FUNC_CNTL__SI__CI = 0x0AF1; +constexpr unsigned int mmMPLL_FUNC_CNTL__SI__CI = 0x0AED; +constexpr unsigned int mmMPLL_FUNC_CNTL_1__SI__CI = 0x0AEE; +constexpr unsigned int mmMPLL_FUNC_CNTL_2__SI__CI = 0x0AEF; +constexpr unsigned int mmMPLL_SEQ_UCODE_1__SI__CI = 0x0AEA; +constexpr unsigned int mmMPLL_SEQ_UCODE_2__SI__CI = 0x0AEB; +constexpr unsigned int mmMPLL_SS1__SI__CI = 0x0AF3; +constexpr unsigned int mmMPLL_SS2__SI__CI = 0x0AF4; +constexpr unsigned int mmMPLL_TIME__SI__CI = 0x0AF2; +constexpr unsigned int mmMVP_AFR_FLIP_FIFO_CNTL__SI = 0x1AD9; +constexpr unsigned int mmMVP_AFR_FLIP_MODE__SI = 0x1AD8; +constexpr unsigned int mmMVP_BLACK_KEYER__SI = 0x1686; +constexpr unsigned int mmMVP_CONTROL1__SI = 0x1680; +constexpr unsigned int mmMVP_CONTROL2__SI = 0x1681; +constexpr unsigned int mmMVP_CONTROL3__SI = 0x168A; +constexpr unsigned int mmMVP_CRC_CNTL__SI = 0x1687; +constexpr unsigned int mmMVP_CRC_RESULT_BLUE_GREEN__SI = 0x1688; +constexpr unsigned int mmMVP_CRC_RESULT_RED__SI = 0x1689; +constexpr unsigned int mmMVP_FIFO_CONTROL__SI = 0x1682; +constexpr unsigned int mmMVP_FIFO_STATUS__SI = 0x1683; +constexpr unsigned int mmMVP_FLIP_LINE_NUM_INSERT__SI = 0x1ADA; +constexpr unsigned int mmMVP_INBAND_CNTL_CAP__SI = 0x1685; +constexpr unsigned int mmMVP_RECEIVE_CNT_CNTL1__SI = 0x168B; +constexpr unsigned int mmMVP_RECEIVE_CNT_CNTL2__SI = 0x168C; +constexpr unsigned int mmMVP_SLAVE_STATUS__SI = 0x1684; +constexpr unsigned int mmMVP_TEST_DEBUG_DATA__SI = 0x168E; +constexpr unsigned int mmMVP_TEST_DEBUG_INDEX__SI = 0x168D; +constexpr unsigned int mmNEW_REFCLKB_TIMER_1__CI = 0x1484; +constexpr unsigned int mmNEW_REFCLKB_TIMER__CI = 0x1485; +constexpr unsigned int mmOVLSCL_EDGE_PIXEL_CNTL__SI__VI = 0x1A2C; +constexpr unsigned int mmOVL_CONTROL1__SI__VI = 0x1A1D; +constexpr unsigned int mmOVL_CONTROL2__SI__VI = 0x1A1E; +constexpr unsigned int mmOVL_DFQ_CONTROL__SI__VI = 0x1A29; +constexpr unsigned int mmOVL_DFQ_STATUS__SI__VI = 0x1A2A; +constexpr unsigned int mmOVL_ENABLE__SI__VI = 0x1A1C; +constexpr unsigned int mmOVL_END__SI__VI = 0x1A26; +constexpr unsigned int mmOVL_PITCH__SI__VI = 0x1A21; +constexpr unsigned int mmOVL_START__SI__VI = 0x1A25; +constexpr unsigned int mmOVL_SURFACE_ADDRESS = 0x1A20; +constexpr unsigned int mmOVL_SURFACE_ADDRESS_HIGH = 0x1A22; +constexpr unsigned int mmOVL_SURFACE_ADDRESS_HIGH_INUSE__SI__VI = 0x1A2B; +constexpr unsigned int mmOVL_SURFACE_ADDRESS_INUSE__SI__VI = 0x1A28; +constexpr unsigned int mmOVL_SURFACE_OFFSET_X__SI__VI = 0x1A23; +constexpr unsigned int mmOVL_SURFACE_OFFSET_Y__SI__VI = 0x1A24; +constexpr unsigned int mmOVL_SWAP_CNTL__SI__VI = 0x1A1F; +constexpr unsigned int mmOVL_UPDATE__SI__VI = 0x1A27; +constexpr unsigned int mmPAGE_MIRROR_CNTL__SI = 0x0581; +constexpr unsigned int mmPA_CL_CLIP_CNTL = 0xA204; +constexpr unsigned int mmPA_CL_CNTL_STATUS = 0x2284; +constexpr unsigned int mmPA_CL_ENHANCE = 0x2285; +constexpr unsigned int mmPA_CL_GB_HORZ_CLIP_ADJ = 0xA2FC; +constexpr unsigned int mmPA_CL_GB_HORZ_DISC_ADJ = 0xA2FD; +constexpr unsigned int mmPA_CL_GB_VERT_CLIP_ADJ = 0xA2FA; +constexpr unsigned int mmPA_CL_GB_VERT_DISC_ADJ = 0xA2FB; +constexpr unsigned int mmPA_CL_NANINF_CNTL = 0xA208; +constexpr unsigned int mmPA_CL_POINT_CULL_RAD = 0xA1F8; +constexpr unsigned int mmPA_CL_POINT_SIZE = 0xA1F7; +constexpr unsigned int mmPA_CL_POINT_X_RAD = 0xA1F5; +constexpr unsigned int mmPA_CL_POINT_Y_RAD = 0xA1F6; +constexpr unsigned int mmPA_CL_RESET_DEBUG__CI__VI = 0x2286; +constexpr unsigned int mmPA_CL_UCP_0_W = 0xA172; +constexpr unsigned int mmPA_CL_UCP_0_X = 0xA16F; +constexpr unsigned int mmPA_CL_UCP_0_Y = 0xA170; +constexpr unsigned int mmPA_CL_UCP_0_Z = 0xA171; +constexpr unsigned int mmPA_CL_UCP_1_W = 0xA176; +constexpr unsigned int mmPA_CL_UCP_1_X = 0xA173; +constexpr unsigned int mmPA_CL_UCP_1_Y = 0xA174; +constexpr unsigned int mmPA_CL_UCP_1_Z = 0xA175; +constexpr unsigned int mmPA_CL_UCP_2_W = 0xA17A; +constexpr unsigned int mmPA_CL_UCP_2_X = 0xA177; +constexpr unsigned int mmPA_CL_UCP_2_Y = 0xA178; +constexpr unsigned int mmPA_CL_UCP_2_Z = 0xA179; +constexpr unsigned int mmPA_CL_UCP_3_W = 0xA17E; +constexpr unsigned int mmPA_CL_UCP_3_X = 0xA17B; +constexpr unsigned int mmPA_CL_UCP_3_Y = 0xA17C; +constexpr unsigned int mmPA_CL_UCP_3_Z = 0xA17D; +constexpr unsigned int mmPA_CL_UCP_4_W = 0xA182; +constexpr unsigned int mmPA_CL_UCP_4_X = 0xA17F; +constexpr unsigned int mmPA_CL_UCP_4_Y = 0xA180; +constexpr unsigned int mmPA_CL_UCP_4_Z = 0xA181; +constexpr unsigned int mmPA_CL_UCP_5_W = 0xA186; +constexpr unsigned int mmPA_CL_UCP_5_X = 0xA183; +constexpr unsigned int mmPA_CL_UCP_5_Y = 0xA184; +constexpr unsigned int mmPA_CL_UCP_5_Z = 0xA185; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET = 0xA110; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_1 = 0xA116; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_10 = 0xA14C; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_11 = 0xA152; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_12 = 0xA158; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_13 = 0xA15E; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_14 = 0xA164; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_15 = 0xA16A; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_2 = 0xA11C; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_3 = 0xA122; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_4 = 0xA128; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_5 = 0xA12E; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_6 = 0xA134; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_7 = 0xA13A; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_8 = 0xA140; +constexpr unsigned int mmPA_CL_VPORT_XOFFSET_9 = 0xA146; +constexpr unsigned int mmPA_CL_VPORT_XSCALE = 0xA10F; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_1 = 0xA115; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_10 = 0xA14B; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_11 = 0xA151; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_12 = 0xA157; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_13 = 0xA15D; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_14 = 0xA163; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_15 = 0xA169; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_2 = 0xA11B; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_3 = 0xA121; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_4 = 0xA127; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_5 = 0xA12D; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_6 = 0xA133; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_7 = 0xA139; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_8 = 0xA13F; +constexpr unsigned int mmPA_CL_VPORT_XSCALE_9 = 0xA145; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET = 0xA112; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_1 = 0xA118; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_10 = 0xA14E; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_11 = 0xA154; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_12 = 0xA15A; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_13 = 0xA160; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_14 = 0xA166; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_15 = 0xA16C; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_2 = 0xA11E; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_3 = 0xA124; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_4 = 0xA12A; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_5 = 0xA130; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_6 = 0xA136; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_7 = 0xA13C; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_8 = 0xA142; +constexpr unsigned int mmPA_CL_VPORT_YOFFSET_9 = 0xA148; +constexpr unsigned int mmPA_CL_VPORT_YSCALE = 0xA111; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_1 = 0xA117; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_10 = 0xA14D; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_11 = 0xA153; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_12 = 0xA159; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_13 = 0xA15F; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_14 = 0xA165; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_15 = 0xA16B; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_2 = 0xA11D; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_3 = 0xA123; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_4 = 0xA129; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_5 = 0xA12F; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_6 = 0xA135; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_7 = 0xA13B; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_8 = 0xA141; +constexpr unsigned int mmPA_CL_VPORT_YSCALE_9 = 0xA147; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET = 0xA114; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_1 = 0xA11A; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_10 = 0xA150; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_11 = 0xA156; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_12 = 0xA15C; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_13 = 0xA162; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_14 = 0xA168; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_15 = 0xA16E; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_2 = 0xA120; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_3 = 0xA126; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_4 = 0xA12C; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_5 = 0xA132; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_6 = 0xA138; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_7 = 0xA13E; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_8 = 0xA144; +constexpr unsigned int mmPA_CL_VPORT_ZOFFSET_9 = 0xA14A; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE = 0xA113; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_1 = 0xA119; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_10 = 0xA14F; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_11 = 0xA155; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_12 = 0xA15B; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_13 = 0xA161; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_14 = 0xA167; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_15 = 0xA16D; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_2 = 0xA11F; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_3 = 0xA125; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_4 = 0xA12B; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_5 = 0xA131; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_6 = 0xA137; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_7 = 0xA13D; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_8 = 0xA143; +constexpr unsigned int mmPA_CL_VPORT_ZSCALE_9 = 0xA149; +constexpr unsigned int mmPA_CL_VS_OUT_CNTL = 0xA207; +constexpr unsigned int mmPA_CL_VTE_CNTL = 0xA206; +constexpr unsigned int mmPA_SC_AA_CONFIG = 0xA2F8; +constexpr unsigned int mmPA_SC_AA_MASK_X0Y0_X1Y0 = 0xA30E; +constexpr unsigned int mmPA_SC_AA_MASK_X0Y1_X1Y1 = 0xA30F; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0 = 0xA2FE; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_1 = 0xA2FF; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_2 = 0xA300; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_3 = 0xA301; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0 = 0xA306; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_1 = 0xA307; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_2 = 0xA308; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_3 = 0xA309; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0 = 0xA302; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_1 = 0xA303; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_2 = 0xA304; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_3 = 0xA305; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0 = 0xA30A; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_1 = 0xA30B; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_2 = 0xA30C; +constexpr unsigned int mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_3 = 0xA30D; +constexpr unsigned int mmPA_SC_CENTROID_PRIORITY_0 = 0xA2F5; +constexpr unsigned int mmPA_SC_CENTROID_PRIORITY_1 = 0xA2F6; +constexpr unsigned int mmPA_SC_CLIPRECT_0_BR = 0xA085; +constexpr unsigned int mmPA_SC_CLIPRECT_0_TL = 0xA084; +constexpr unsigned int mmPA_SC_CLIPRECT_1_BR = 0xA087; +constexpr unsigned int mmPA_SC_CLIPRECT_1_TL = 0xA086; +constexpr unsigned int mmPA_SC_CLIPRECT_2_BR = 0xA089; +constexpr unsigned int mmPA_SC_CLIPRECT_2_TL = 0xA088; +constexpr unsigned int mmPA_SC_CLIPRECT_3_BR = 0xA08B; +constexpr unsigned int mmPA_SC_CLIPRECT_3_TL = 0xA08A; +constexpr unsigned int mmPA_SC_CLIPRECT_RULE = 0xA083; +constexpr unsigned int mmPA_SC_DEBUG_CNTL = 0x22F6; +constexpr unsigned int mmPA_SC_DEBUG_DATA = 0x22F7; +constexpr unsigned int mmPA_SC_EDGERULE = 0xA08C; +constexpr unsigned int mmPA_SC_ENHANCE = 0x22FC; +constexpr unsigned int mmPA_SC_FIFO_DEPTH_CNTL = 0x2295; +constexpr unsigned int mmPA_SC_FIFO_SIZE = 0x22F3; +constexpr unsigned int mmPA_SC_FORCE_EOV_MAX_CNTS = 0x22C9; +constexpr unsigned int mmPA_SC_GENERIC_SCISSOR_BR = 0xA091; +constexpr unsigned int mmPA_SC_GENERIC_SCISSOR_TL = 0xA090; +constexpr unsigned int mmPA_SC_HP3D_TRAP_SCREEN_COUNT__CI__VI = 0xC2AC; +constexpr unsigned int mmPA_SC_HP3D_TRAP_SCREEN_HV_EN__CI__VI = 0xC2A8; +constexpr unsigned int mmPA_SC_HP3D_TRAP_SCREEN_HV_LOCK__CI__VI = 0x22C1; +constexpr unsigned int mmPA_SC_HP3D_TRAP_SCREEN_H__CI__VI = 0xC2A9; +constexpr unsigned int mmPA_SC_HP3D_TRAP_SCREEN_OCCURRENCE__CI__VI = 0xC2AB; +constexpr unsigned int mmPA_SC_HP3D_TRAP_SCREEN_V__CI__VI = 0xC2AA; +constexpr unsigned int mmPA_SC_IF_FIFO_SIZE = 0x22F5; +constexpr unsigned int mmPA_SC_LINE_CNTL = 0xA2F7; +constexpr unsigned int mmPA_SC_LINE_STIPPLE = 0xA283; +constexpr unsigned int mmPA_SC_LINE_STIPPLE_STATE__CI__VI = 0xC281; +constexpr unsigned int mmPA_SC_LINE_STIPPLE_STATE__SI = 0x22C4; +constexpr unsigned int mmPA_SC_MODE_CNTL_0 = 0xA292; +constexpr unsigned int mmPA_SC_MODE_CNTL_1 = 0xA293; +constexpr unsigned int mmPA_SC_P3D_TRAP_SCREEN_COUNT__CI__VI = 0xC2A4; +constexpr unsigned int mmPA_SC_P3D_TRAP_SCREEN_HV_EN__CI__VI = 0xC2A0; +constexpr unsigned int mmPA_SC_P3D_TRAP_SCREEN_HV_LOCK__CI__VI = 0x22C0; +constexpr unsigned int mmPA_SC_P3D_TRAP_SCREEN_H__CI__VI = 0xC2A1; +constexpr unsigned int mmPA_SC_P3D_TRAP_SCREEN_OCCURRENCE__CI__VI = 0xC2A3; +constexpr unsigned int mmPA_SC_P3D_TRAP_SCREEN_V__CI__VI = 0xC2A2; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_HI__CI__VI = 0xD141; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_HI__SI = 0x22A9; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_LO__CI__VI = 0xD140; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_LO__SI = 0x22A8; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_SELECT1__CI__VI = 0xD941; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_SELECT__CI__VI = 0xD940; +constexpr unsigned int mmPA_SC_PERFCOUNTER0_SELECT__SI = 0x22A0; +constexpr unsigned int mmPA_SC_PERFCOUNTER1_HI__CI__VI = 0xD143; +constexpr unsigned int mmPA_SC_PERFCOUNTER1_HI__SI = 0x22AB; +constexpr unsigned int mmPA_SC_PERFCOUNTER1_LO__CI__VI = 0xD142; +constexpr unsigned int mmPA_SC_PERFCOUNTER1_LO__SI = 0x22AA; +constexpr unsigned int mmPA_SC_PERFCOUNTER1_SELECT__CI__VI = 0xD942; +constexpr unsigned int mmPA_SC_PERFCOUNTER1_SELECT__SI = 0x22A1; +constexpr unsigned int mmPA_SC_PERFCOUNTER2_HI__CI__VI = 0xD145; +constexpr unsigned int mmPA_SC_PERFCOUNTER2_HI__SI = 0x22AD; +constexpr unsigned int mmPA_SC_PERFCOUNTER2_LO__CI__VI = 0xD144; +constexpr unsigned int mmPA_SC_PERFCOUNTER2_LO__SI = 0x22AC; +constexpr unsigned int mmPA_SC_PERFCOUNTER2_SELECT__CI__VI = 0xD943; +constexpr unsigned int mmPA_SC_PERFCOUNTER2_SELECT__SI = 0x22A2; +constexpr unsigned int mmPA_SC_PERFCOUNTER3_HI__CI__VI = 0xD147; +constexpr unsigned int mmPA_SC_PERFCOUNTER3_HI__SI = 0x22AF; +constexpr unsigned int mmPA_SC_PERFCOUNTER3_LO__CI__VI = 0xD146; +constexpr unsigned int mmPA_SC_PERFCOUNTER3_LO__SI = 0x22AE; +constexpr unsigned int mmPA_SC_PERFCOUNTER3_SELECT__CI__VI = 0xD944; +constexpr unsigned int mmPA_SC_PERFCOUNTER3_SELECT__SI = 0x22A3; +constexpr unsigned int mmPA_SC_PERFCOUNTER4_HI__CI__VI = 0xD149; +constexpr unsigned int mmPA_SC_PERFCOUNTER4_HI__SI = 0x22B1; +constexpr unsigned int mmPA_SC_PERFCOUNTER4_LO__CI__VI = 0xD148; +constexpr unsigned int mmPA_SC_PERFCOUNTER4_LO__SI = 0x22B0; +constexpr unsigned int mmPA_SC_PERFCOUNTER4_SELECT__CI__VI = 0xD945; +constexpr unsigned int mmPA_SC_PERFCOUNTER4_SELECT__SI = 0x22A4; +constexpr unsigned int mmPA_SC_PERFCOUNTER5_HI__CI__VI = 0xD14B; +constexpr unsigned int mmPA_SC_PERFCOUNTER5_HI__SI = 0x22B3; +constexpr unsigned int mmPA_SC_PERFCOUNTER5_LO__CI__VI = 0xD14A; +constexpr unsigned int mmPA_SC_PERFCOUNTER5_LO__SI = 0x22B2; +constexpr unsigned int mmPA_SC_PERFCOUNTER5_SELECT__CI__VI = 0xD946; +constexpr unsigned int mmPA_SC_PERFCOUNTER5_SELECT__SI = 0x22A5; +constexpr unsigned int mmPA_SC_PERFCOUNTER6_HI__CI__VI = 0xD14D; +constexpr unsigned int mmPA_SC_PERFCOUNTER6_HI__SI = 0x22B5; +constexpr unsigned int mmPA_SC_PERFCOUNTER6_LO__CI__VI = 0xD14C; +constexpr unsigned int mmPA_SC_PERFCOUNTER6_LO__SI = 0x22B4; +constexpr unsigned int mmPA_SC_PERFCOUNTER6_SELECT__CI__VI = 0xD947; +constexpr unsigned int mmPA_SC_PERFCOUNTER6_SELECT__SI = 0x22A6; +constexpr unsigned int mmPA_SC_PERFCOUNTER7_HI__CI__VI = 0xD14F; +constexpr unsigned int mmPA_SC_PERFCOUNTER7_HI__SI = 0x22B7; +constexpr unsigned int mmPA_SC_PERFCOUNTER7_LO__CI__VI = 0xD14E; +constexpr unsigned int mmPA_SC_PERFCOUNTER7_LO__SI = 0x22B6; +constexpr unsigned int mmPA_SC_PERFCOUNTER7_SELECT__CI__VI = 0xD948; +constexpr unsigned int mmPA_SC_PERFCOUNTER7_SELECT__SI = 0x22A7; +constexpr unsigned int mmPA_SC_RASTER_CONFIG = 0xA0D4; +constexpr unsigned int mmPA_SC_RASTER_CONFIG_1__CI__VI = 0xA0D5; +constexpr unsigned int mmPA_SC_SCREEN_SCISSOR_BR = 0xA00D; +constexpr unsigned int mmPA_SC_SCREEN_SCISSOR_TL = 0xA00C; +constexpr unsigned int mmPA_SC_TRAP_SCREEN_COUNT__CI__VI = 0xC2B4; +constexpr unsigned int mmPA_SC_TRAP_SCREEN_HV_EN__CI__VI = 0xC2B0; +constexpr unsigned int mmPA_SC_TRAP_SCREEN_HV_LOCK__CI__VI = 0x22C2; +constexpr unsigned int mmPA_SC_TRAP_SCREEN_H__CI__VI = 0xC2B1; +constexpr unsigned int mmPA_SC_TRAP_SCREEN_OCCURRENCE__CI__VI = 0xC2B3; +constexpr unsigned int mmPA_SC_TRAP_SCREEN_V__CI__VI = 0xC2B2; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_0_BR = 0xA095; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_0_TL = 0xA094; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_10_BR = 0xA0A9; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_10_TL = 0xA0A8; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_11_BR = 0xA0AB; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_11_TL = 0xA0AA; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_12_BR = 0xA0AD; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_12_TL = 0xA0AC; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_13_BR = 0xA0AF; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_13_TL = 0xA0AE; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_14_BR = 0xA0B1; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_14_TL = 0xA0B0; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_15_BR = 0xA0B3; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_15_TL = 0xA0B2; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_1_BR = 0xA097; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_1_TL = 0xA096; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_2_BR = 0xA099; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_2_TL = 0xA098; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_3_BR = 0xA09B; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_3_TL = 0xA09A; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_4_BR = 0xA09D; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_4_TL = 0xA09C; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_5_BR = 0xA09F; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_5_TL = 0xA09E; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_6_BR = 0xA0A1; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_6_TL = 0xA0A0; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_7_BR = 0xA0A3; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_7_TL = 0xA0A2; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_8_BR = 0xA0A5; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_8_TL = 0xA0A4; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_9_BR = 0xA0A7; +constexpr unsigned int mmPA_SC_VPORT_SCISSOR_9_TL = 0xA0A6; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_0 = 0xA0B5; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_1 = 0xA0B7; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_10 = 0xA0C9; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_11 = 0xA0CB; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_12 = 0xA0CD; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_13 = 0xA0CF; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_14 = 0xA0D1; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_15 = 0xA0D3; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_2 = 0xA0B9; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_3 = 0xA0BB; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_4 = 0xA0BD; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_5 = 0xA0BF; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_6 = 0xA0C1; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_7 = 0xA0C3; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_8 = 0xA0C5; +constexpr unsigned int mmPA_SC_VPORT_ZMAX_9 = 0xA0C7; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_0 = 0xA0B4; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_1 = 0xA0B6; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_10 = 0xA0C8; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_11 = 0xA0CA; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_12 = 0xA0CC; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_13 = 0xA0CE; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_14 = 0xA0D0; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_15 = 0xA0D2; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_2 = 0xA0B8; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_3 = 0xA0BA; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_4 = 0xA0BC; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_5 = 0xA0BE; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_6 = 0xA0C0; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_7 = 0xA0C2; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_8 = 0xA0C4; +constexpr unsigned int mmPA_SC_VPORT_ZMIN_9 = 0xA0C6; +constexpr unsigned int mmPA_SC_WINDOW_OFFSET = 0xA080; +constexpr unsigned int mmPA_SC_WINDOW_SCISSOR_BR = 0xA082; +constexpr unsigned int mmPA_SC_WINDOW_SCISSOR_TL = 0xA081; +constexpr unsigned int mmPA_SU_CNTL_STATUS = 0x2294; +constexpr unsigned int mmPA_SU_DEBUG_CNTL = 0x2280; +constexpr unsigned int mmPA_SU_DEBUG_DATA = 0x2281; +constexpr unsigned int mmPA_SU_HARDWARE_SCREEN_OFFSET = 0xA08D; +constexpr unsigned int mmPA_SU_LINE_CNTL = 0xA282; +constexpr unsigned int mmPA_SU_LINE_STIPPLE_CNTL = 0xA209; +constexpr unsigned int mmPA_SU_LINE_STIPPLE_SCALE = 0xA20A; +constexpr unsigned int mmPA_SU_LINE_STIPPLE_VALUE__CI__VI = 0xC280; +constexpr unsigned int mmPA_SU_LINE_STIPPLE_VALUE__SI = 0x2298; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_HI__CI__VI = 0xD101; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_HI__SI = 0x228D; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_LO__CI__VI = 0xD100; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_LO__SI = 0x228C; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_SELECT1__CI__VI = 0xD901; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_SELECT__CI__VI = 0xD900; +constexpr unsigned int mmPA_SU_PERFCOUNTER0_SELECT__SI = 0x2288; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_HI__CI__VI = 0xD103; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_HI__SI = 0x228F; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_LO__CI__VI = 0xD102; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_LO__SI = 0x228E; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_SELECT1__CI__VI = 0xD903; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_SELECT__CI__VI = 0xD902; +constexpr unsigned int mmPA_SU_PERFCOUNTER1_SELECT__SI = 0x2289; +constexpr unsigned int mmPA_SU_PERFCOUNTER2_HI__CI__VI = 0xD105; +constexpr unsigned int mmPA_SU_PERFCOUNTER2_HI__SI = 0x2291; +constexpr unsigned int mmPA_SU_PERFCOUNTER2_LO__CI__VI = 0xD104; +constexpr unsigned int mmPA_SU_PERFCOUNTER2_LO__SI = 0x2290; +constexpr unsigned int mmPA_SU_PERFCOUNTER2_SELECT__CI__VI = 0xD904; +constexpr unsigned int mmPA_SU_PERFCOUNTER2_SELECT__SI = 0x228A; +constexpr unsigned int mmPA_SU_PERFCOUNTER3_HI__CI__VI = 0xD107; +constexpr unsigned int mmPA_SU_PERFCOUNTER3_HI__SI = 0x2293; +constexpr unsigned int mmPA_SU_PERFCOUNTER3_LO__CI__VI = 0xD106; +constexpr unsigned int mmPA_SU_PERFCOUNTER3_LO__SI = 0x2292; +constexpr unsigned int mmPA_SU_PERFCOUNTER3_SELECT__CI__VI = 0xD905; +constexpr unsigned int mmPA_SU_PERFCOUNTER3_SELECT__SI = 0x228B; +constexpr unsigned int mmPA_SU_POINT_MINMAX = 0xA281; +constexpr unsigned int mmPA_SU_POINT_SIZE = 0xA280; +constexpr unsigned int mmPA_SU_POLY_OFFSET_BACK_OFFSET = 0xA2E3; +constexpr unsigned int mmPA_SU_POLY_OFFSET_BACK_SCALE = 0xA2E2; +constexpr unsigned int mmPA_SU_POLY_OFFSET_CLAMP = 0xA2DF; +constexpr unsigned int mmPA_SU_POLY_OFFSET_DB_FMT_CNTL = 0xA2DE; +constexpr unsigned int mmPA_SU_POLY_OFFSET_FRONT_OFFSET = 0xA2E1; +constexpr unsigned int mmPA_SU_POLY_OFFSET_FRONT_SCALE = 0xA2E0; +constexpr unsigned int mmPA_SU_PRIM_FILTER_CNTL = 0xA20B; +constexpr unsigned int mmPA_SU_SC_MODE_CNTL = 0xA205; +constexpr unsigned int mmPA_SU_VTX_CNTL = 0xA2F9; +constexpr unsigned int mmPCIE_DATA_2__CI__VI = 0x000D; +constexpr unsigned int mmPCIE_DATA__CI__VI = 0x000F; +constexpr unsigned int mmPCIE_DATA__SI = 0x000D; +constexpr unsigned int mmPCIE_INDEX_2__CI__VI = 0x000C; +constexpr unsigned int mmPCIE_INDEX__CI__VI = 0x000E; +constexpr unsigned int mmPCIE_INDEX__SI = 0x000C; +constexpr unsigned int mmPEER0_FB_OFFSET_HI__CI__VI = 0x14F3; +constexpr unsigned int mmPEER0_FB_OFFSET_LO__CI__VI = 0x14F2; +constexpr unsigned int mmPEER1_FB_OFFSET_HI__CI__VI = 0x14F1; +constexpr unsigned int mmPEER1_FB_OFFSET_LO__CI__VI = 0x14F0; +constexpr unsigned int mmPEER2_FB_OFFSET_HI__CI__VI = 0x14EF; +constexpr unsigned int mmPEER2_FB_OFFSET_LO__CI__VI = 0x14EE; +constexpr unsigned int mmPEER3_FB_OFFSET_HI__CI__VI = 0x14ED; +constexpr unsigned int mmPEER3_FB_OFFSET_LO__CI__VI = 0x14EC; +constexpr unsigned int mmPEER_REG_RANGE0 = 0x153E; +constexpr unsigned int mmPEER_REG_RANGE1 = 0x153F; +constexpr unsigned int mmPHY_AUX_CNTL__SI = 0x1953; +constexpr unsigned int mmPIPE0_ARBITRATION_CONTROL3__SI = 0x02FC; +constexpr unsigned int mmPIPE1_ARBITRATION_CONTROL3__SI = 0x0300; +constexpr unsigned int mmPIPE2_ARBITRATION_CONTROL3__SI = 0x0304; +constexpr unsigned int mmPIPE3_ARBITRATION_CONTROL3__SI = 0x0308; +constexpr unsigned int mmPIPE4_ARBITRATION_CONTROL3__SI = 0x030C; +constexpr unsigned int mmPIPE5_ARBITRATION_CONTROL3__SI = 0x0310; +constexpr unsigned int mmPIXCLK1_RESYNC_CNTL__SI = 0x0126; +constexpr unsigned int mmPIXCLK2_RESYNC_CNTL__SI = 0x0127; +constexpr unsigned int mmPLL_TEST_CNTL__SI = 0x0199; +constexpr unsigned int mmRAS_BCI_SIGNATURE0 = 0x339E; +constexpr unsigned int mmRAS_BCI_SIGNATURE1 = 0x339F; +constexpr unsigned int mmRAS_CB_SIGNATURE0 = 0x339D; +constexpr unsigned int mmRAS_DB_SIGNATURE0 = 0x338B; +constexpr unsigned int mmRAS_IA_SIGNATURE0 = 0x3397; +constexpr unsigned int mmRAS_IA_SIGNATURE1 = 0x3398; +constexpr unsigned int mmRAS_PA_SIGNATURE0 = 0x338C; +constexpr unsigned int mmRAS_SC_SIGNATURE0 = 0x338F; +constexpr unsigned int mmRAS_SC_SIGNATURE1 = 0x3390; +constexpr unsigned int mmRAS_SC_SIGNATURE2 = 0x3391; +constexpr unsigned int mmRAS_SC_SIGNATURE3 = 0x3392; +constexpr unsigned int mmRAS_SC_SIGNATURE4 = 0x3393; +constexpr unsigned int mmRAS_SC_SIGNATURE5 = 0x3394; +constexpr unsigned int mmRAS_SC_SIGNATURE6 = 0x3395; +constexpr unsigned int mmRAS_SC_SIGNATURE7 = 0x3396; +constexpr unsigned int mmRAS_SIGNATURE_CONTROL = 0x3380; +constexpr unsigned int mmRAS_SIGNATURE_MASK = 0x3381; +constexpr unsigned int mmRAS_SPI_SIGNATURE0 = 0x3399; +constexpr unsigned int mmRAS_SPI_SIGNATURE1 = 0x339A; +constexpr unsigned int mmRAS_SQ_SIGNATURE0 = 0x338E; +constexpr unsigned int mmRAS_SX_SIGNATURE0 = 0x3382; +constexpr unsigned int mmRAS_SX_SIGNATURE1 = 0x3383; +constexpr unsigned int mmRAS_SX_SIGNATURE2 = 0x3384; +constexpr unsigned int mmRAS_SX_SIGNATURE3 = 0x3385; +constexpr unsigned int mmRAS_TA_SIGNATURE0 = 0x339B; +constexpr unsigned int mmRAS_TD_SIGNATURE0 = 0x339C; +constexpr unsigned int mmRAS_VGT_SIGNATURE0 = 0x338D; +constexpr unsigned int mmRCU_MISC_CTRL__SI = 0x0043; +constexpr unsigned int mmRCU_UC_EVENTS__SI = 0x0045; +constexpr unsigned int mmRLC_AUTO_PG_CTRL__CI = 0x3115; +constexpr unsigned int mmRLC_AUTO_PG_CTRL__SI = 0x310D; +constexpr unsigned int mmRLC_CAPTURE_GPU_CLOCK_COUNT__CI = 0x30E6; +constexpr unsigned int mmRLC_CAPTURE_GPU_CLOCK_COUNT__SI = 0x30D0; +constexpr unsigned int mmRLC_CGCG_CGLS_CTRL__CI = 0x3109; +constexpr unsigned int mmRLC_CGCG_CGLS_CTRL__SI = 0x3101; +constexpr unsigned int mmRLC_CGCG_RAMP_CTRL__CI = 0x310A; +constexpr unsigned int mmRLC_CGCG_RAMP_CTRL__SI = 0x3102; +constexpr unsigned int mmRLC_CGTT_MGCG_OVERRIDE__CI = 0x3108; +constexpr unsigned int mmRLC_CGTT_MGCG_OVERRIDE__SI = 0x3100; +constexpr unsigned int mmRLC_CU_STATUS__CI = 0x310E; +constexpr unsigned int mmRLC_CU_STATUS__SI = 0x3106; +constexpr unsigned int mmRLC_DEBUG_SELECT__CI = 0x30C1; +constexpr unsigned int mmRLC_DEBUG_SELECT__SI = 0x30C9; +constexpr unsigned int mmRLC_DEBUG__CI = 0x30C2; +constexpr unsigned int mmRLC_DEBUG__SI = 0x30CA; +constexpr unsigned int mmRLC_DRIVER_CPDMA_STATUS__CI = 0x30DE; +constexpr unsigned int mmRLC_DRIVER_CPDMA_STATUS__SI = 0x30C7; +constexpr unsigned int mmRLC_DYN_PG_REQUEST__CI = 0x310C; +constexpr unsigned int mmRLC_DYN_PG_REQUEST__SI = 0x3104; +constexpr unsigned int mmRLC_DYN_PG_STATUS__CI = 0x310B; +constexpr unsigned int mmRLC_DYN_PG_STATUS__SI = 0x3103; +constexpr unsigned int mmRLC_GPM_CU_PD_TIMEOUT__CI = 0x312B; +constexpr unsigned int mmRLC_GPM_DEBUG_SELECT__CI = 0x30E0; +constexpr unsigned int mmRLC_GPM_DEBUG__CI = 0x30E1; +constexpr unsigned int mmRLC_GPM_GENERAL_0__CI = 0x3123; +constexpr unsigned int mmRLC_GPM_GENERAL_1__CI = 0x3124; +constexpr unsigned int mmRLC_GPM_GENERAL_2__CI = 0x3125; +constexpr unsigned int mmRLC_GPM_GENERAL_3__CI = 0x3126; +constexpr unsigned int mmRLC_GPM_GENERAL_4__CI = 0x3127; +constexpr unsigned int mmRLC_GPM_GENERAL_5__CI = 0x3128; +constexpr unsigned int mmRLC_GPM_GENERAL_6__CI = 0x3129; +constexpr unsigned int mmRLC_GPM_GENERAL_7__CI = 0x312A; +constexpr unsigned int mmRLC_GPM_LOG_ADDR__CI = 0x3136; +constexpr unsigned int mmRLC_GPM_LOG_CONT__CI = 0x3138; +constexpr unsigned int mmRLC_GPM_LOG_SIZE__CI = 0x3137; +constexpr unsigned int mmRLC_GPM_PERF_COUNT_0__CI = 0x312F; +constexpr unsigned int mmRLC_GPM_PERF_COUNT_1__CI = 0x3130; +constexpr unsigned int mmRLC_GPM_SCRATCH_ADDR__CI = 0x312C; +constexpr unsigned int mmRLC_GPM_SCRATCH_DATA__CI = 0x312D; +constexpr unsigned int mmRLC_GPM_STAT__CI = 0x3100; +constexpr unsigned int mmRLC_GPM_THREAD_ENABLE__CI = 0x3105; +constexpr unsigned int mmRLC_GPM_THREAD_PRIORITY__CI = 0x3104; +constexpr unsigned int mmRLC_GPM_UCODE_ADDR__CI = 0x30E2; +constexpr unsigned int mmRLC_GPM_UCODE_DATA__CI = 0x30E3; +constexpr unsigned int mmRLC_GPM_VMID_THREAD0__CI = 0x3106; +constexpr unsigned int mmRLC_GPM_VMID_THREAD1__CI = 0x3107; +constexpr unsigned int mmRLC_GPR_REG1__CI = 0x3139; +constexpr unsigned int mmRLC_GPR_REG2__CI = 0x313A; +constexpr unsigned int mmRLC_GPU_CLOCK_32_RES_SEL__CI = 0x3101; +constexpr unsigned int mmRLC_GPU_CLOCK_32_RES_SEL__SI = 0x30D4; +constexpr unsigned int mmRLC_GPU_CLOCK_32__CI = 0x3102; +constexpr unsigned int mmRLC_GPU_CLOCK_32__SI = 0x30D5; +constexpr unsigned int mmRLC_GPU_CLOCK_COUNT_LSB__CI = 0x30E4; +constexpr unsigned int mmRLC_GPU_CLOCK_COUNT_LSB__SI = 0x30CE; +constexpr unsigned int mmRLC_GPU_CLOCK_COUNT_MSB__CI = 0x30E5; +constexpr unsigned int mmRLC_GPU_CLOCK_COUNT_MSB__SI = 0x30CF; +constexpr unsigned int mmRLC_JUMP_TABLE_RESTORE__CI = 0x30DE; +constexpr unsigned int mmRLC_LB_ALWAYS_ACTIVE_CU_MASK__CI = 0x3110; +constexpr unsigned int mmRLC_LB_ALWAYS_ACTIVE_CU_MASK__SI = 0x3108; +constexpr unsigned int mmRLC_LB_CNTL__CI = 0x30D9; +constexpr unsigned int mmRLC_LB_CNTL__SI = 0x30C3; +constexpr unsigned int mmRLC_LB_CNTR_INIT__CI = 0x30DB; +constexpr unsigned int mmRLC_LB_CNTR_INIT__SI = 0x30C6; +constexpr unsigned int mmRLC_LB_CNTR_MAX__CI = 0x30D2; +constexpr unsigned int mmRLC_LB_CNTR_MAX__SI = 0x30C5; +constexpr unsigned int mmRLC_LB_INIT_CU_MASK__CI = 0x310F; +constexpr unsigned int mmRLC_LB_INIT_CU_MASK__SI = 0x3107; +constexpr unsigned int mmRLC_LB_PARAMS__CI = 0x3111; +constexpr unsigned int mmRLC_LB_PARAMS__SI = 0x3109; +constexpr unsigned int mmRLC_LOAD_BALANCE_CNTR__CI = 0x30DC; +constexpr unsigned int mmRLC_LOAD_BALANCE_CNTR__SI = 0x30F6; +constexpr unsigned int mmRLC_MAX_PG_CU__CI = 0x3114; +constexpr unsigned int mmRLC_MAX_PG_CU__SI = 0x310C; +constexpr unsigned int mmRLC_MC_CNTL__CI = 0x30C3; +constexpr unsigned int mmRLC_MC_CNTL__SI = 0x30D1; +constexpr unsigned int mmRLC_MEM_SLP_CNTL__CI = 0x30C6; +constexpr unsigned int mmRLC_MEM_SLP_CNTL__SI = 0x30D8; +constexpr unsigned int mmRLC_PERFCOUNTER0_HI__CI__VI = 0xD481; +constexpr unsigned int mmRLC_PERFCOUNTER0_HI__SI = 0x30DC; +constexpr unsigned int mmRLC_PERFCOUNTER0_LO__CI__VI = 0xD480; +constexpr unsigned int mmRLC_PERFCOUNTER0_LO__SI = 0x30DB; +constexpr unsigned int mmRLC_PERFCOUNTER0_SELECT__CI__VI = 0xDCC1; +constexpr unsigned int mmRLC_PERFCOUNTER0_SELECT__SI = 0x30DA; +constexpr unsigned int mmRLC_PERFCOUNTER1_HI__CI__VI = 0xD483; +constexpr unsigned int mmRLC_PERFCOUNTER1_HI__SI = 0x30DF; +constexpr unsigned int mmRLC_PERFCOUNTER1_LO__CI__VI = 0xD482; +constexpr unsigned int mmRLC_PERFCOUNTER1_LO__SI = 0x30DE; +constexpr unsigned int mmRLC_PERFCOUNTER1_SELECT__CI__VI = 0xDCC2; +constexpr unsigned int mmRLC_PERFCOUNTER1_SELECT__SI = 0x30DD; +constexpr unsigned int mmRLC_PERFMON_CNTL__CI__VI = 0xDCC0; +constexpr unsigned int mmRLC_PERFMON_CNTL__SI = 0x30D9; +constexpr unsigned int mmRLC_PG_ALWAYS_ON_CU_MASK__CI = 0x3113; +constexpr unsigned int mmRLC_PG_ALWAYS_ON_CU_MASK__SI = 0x310B; +constexpr unsigned int mmRLC_PG_CNTL__CI = 0x3103; +constexpr unsigned int mmRLC_PG_CNTL__SI = 0x30D7; +constexpr unsigned int mmRLC_PG_DELAY_2__CI = 0x30DF; +constexpr unsigned int mmRLC_PG_DELAY__CI = 0x310D; +constexpr unsigned int mmRLC_SAFE_MODE__CI = 0x313A; +constexpr unsigned int mmRLC_SAVE_AND_RESTORE_BASE__CI = 0x30DD; +constexpr unsigned int mmRLC_SAVE_AND_RESTORE_BASE__SI = 0x30C4; +constexpr unsigned int mmRLC_SERDES_CU_MASTER_BUSY__CI = 0x3121; +constexpr unsigned int mmRLC_SERDES_NONCU_MASTER_BUSY__CI = 0x3122; +constexpr unsigned int mmRLC_SERDES_RD_DATA_0__CI = 0x311A; +constexpr unsigned int mmRLC_SERDES_RD_DATA_0__SI = 0x3112; +constexpr unsigned int mmRLC_SERDES_RD_DATA_1__CI = 0x311B; +constexpr unsigned int mmRLC_SERDES_RD_DATA_1__SI = 0x3113; +constexpr unsigned int mmRLC_SERDES_RD_DATA_2__CI = 0x311C; +constexpr unsigned int mmRLC_SERDES_RD_DATA_2__SI = 0x3114; +constexpr unsigned int mmRLC_SERDES_RD_MASTER_INDEX__CI = 0x3119; +constexpr unsigned int mmRLC_SERDES_RD_MASTER_INDEX__SI = 0x3111; +constexpr unsigned int mmRLC_SERDES_WR_CTRL__CI = 0x311F; +constexpr unsigned int mmRLC_SERDES_WR_CTRL__SI = 0x3117; +constexpr unsigned int mmRLC_SERDES_WR_CU_MASTER_MASK__CI = 0x311D; +constexpr unsigned int mmRLC_SERDES_WR_DATA__CI = 0x3120; +constexpr unsigned int mmRLC_SERDES_WR_DATA__SI = 0x3118; +constexpr unsigned int mmRLC_SERDES_WR_NONCU_MASTER_MASK__CI = 0x311E; +constexpr unsigned int mmRLC_SMU_GRBM_REG_SAVE_CTRL__CI = 0x3116; +constexpr unsigned int mmRLC_SMU_GRBM_REG_SAVE_CTRL__SI = 0x310E; +constexpr unsigned int mmRLC_SMU_PG_CTRL__CI = 0x3117; +constexpr unsigned int mmRLC_SMU_PG_CTRL__SI = 0x310F; +constexpr unsigned int mmRLC_SMU_PG_WAKE_UP_CTRL__CI = 0x3118; +constexpr unsigned int mmRLC_SMU_PG_WAKE_UP_CTRL__SI = 0x3110; +constexpr unsigned int mmRLC_SOFT_RESET_GPU__CI = 0x30C5; +constexpr unsigned int mmRLC_SOFT_RESET_GPU__SI = 0x30D6; +constexpr unsigned int mmRLC_SPM_CB_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC8A; +constexpr unsigned int mmRLC_SPM_CPC_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC88; +constexpr unsigned int mmRLC_SPM_CPF_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC89; +constexpr unsigned int mmRLC_SPM_CPG_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC87; +constexpr unsigned int mmRLC_SPM_DB_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC8B; +constexpr unsigned int mmRLC_SPM_DEBUG_SELECT__CI = 0x3134; +constexpr unsigned int mmRLC_SPM_DEBUG__CI = 0x3135; +constexpr unsigned int mmRLC_SPM_GDS_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC8D; +constexpr unsigned int mmRLC_SPM_GLOBAL_MUXSEL_ADDR__CI__VI = 0xDC9B; +constexpr unsigned int mmRLC_SPM_GLOBAL_MUXSEL_DATA__CI__VI = 0xDC9C; +constexpr unsigned int mmRLC_SPM_IA_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC8E; +constexpr unsigned int mmRLC_SPM_INT_CNTL__CI = 0x3132; +constexpr unsigned int mmRLC_SPM_INT_STATUS__CI = 0x3133; +constexpr unsigned int mmRLC_SPM_PA_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC8C; +constexpr unsigned int mmRLC_SPM_PERFMON_CNTL__CI__VI = 0xDC80; +constexpr unsigned int mmRLC_SPM_PERFMON_RING_BASE_HI__CI__VI = 0xDC82; +constexpr unsigned int mmRLC_SPM_PERFMON_RING_BASE_LO__CI__VI = 0xDC81; +constexpr unsigned int mmRLC_SPM_PERFMON_RING_SIZE__CI__VI = 0xDC83; +constexpr unsigned int mmRLC_SPM_PERFMON_SEGMENT_SIZE__CI__VI = 0xDC84; +constexpr unsigned int mmRLC_SPM_RING_RDPTR__CI__VI = 0xDC9D; +constexpr unsigned int mmRLC_SPM_SC_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC90; +constexpr unsigned int mmRLC_SPM_SEGMENT_THRESHOLD__CI__VI = 0xDC9E; +constexpr unsigned int mmRLC_SPM_SE_MUXSEL_ADDR__CI__VI = 0xDC85; +constexpr unsigned int mmRLC_SPM_SE_MUXSEL_DATA__CI__VI = 0xDC86; +constexpr unsigned int mmRLC_SPM_SPI_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC97; +constexpr unsigned int mmRLC_SPM_SQG_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC98; +constexpr unsigned int mmRLC_SPM_SX_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC9A; +constexpr unsigned int mmRLC_SPM_TA_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC94; +constexpr unsigned int mmRLC_SPM_TCA_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC92; +constexpr unsigned int mmRLC_SPM_TCC_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC91; +constexpr unsigned int mmRLC_SPM_TCP_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC93; +constexpr unsigned int mmRLC_SPM_TCS_PERFMON_SAMPLE_DELAY__CI = 0xDC99; +constexpr unsigned int mmRLC_SPM_TD_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC95; +constexpr unsigned int mmRLC_SPM_VGT_PERFMON_SAMPLE_DELAY__CI__VI = 0xDC96; +constexpr unsigned int mmRLC_SPM_VMID__CI = 0x3131; +constexpr unsigned int mmRLC_STATIC_PG_STATUS__CI = 0x312E; +constexpr unsigned int mmRLC_STAT__CI = 0x30C4; +constexpr unsigned int mmRLC_STAT__SI = 0x30D3; +constexpr unsigned int mmRLC_THREAD1_DELAY__CI = 0x3112; +constexpr unsigned int mmRLC_THREAD1_DELAY__SI = 0x310A; +constexpr unsigned int mmRLC_UCODE_CNTL__CI = 0x30E7; +constexpr unsigned int mmRLC_UCODE_CNTL__SI = 0x30D2; +constexpr unsigned int mmROM_CNTL__SI = 0x0580; +constexpr unsigned int mmROM_DATA__SI = 0x002B; +constexpr unsigned int mmROM_INDEX__SI = 0x002A; +constexpr unsigned int mmROM_SMC_IND_DATA__CI__VI = 0x0081; +constexpr unsigned int mmROM_SMC_IND_INDEX__CI__VI = 0x0080; +constexpr unsigned int mmROM_START__SI = 0x0585; +constexpr unsigned int mmROM_STATUS__SI = 0x0582; +constexpr unsigned int mmROM_SW_CNTL__SI = 0x0586; +constexpr unsigned int mmROM_SW_COMMAND__SI = 0x0588; +constexpr unsigned int mmROM_SW_DATA_10__SI = 0x0592; +constexpr unsigned int mmROM_SW_DATA_11__SI = 0x0593; +constexpr unsigned int mmROM_SW_DATA_12__SI = 0x0594; +constexpr unsigned int mmROM_SW_DATA_13__SI = 0x0595; +constexpr unsigned int mmROM_SW_DATA_14__SI = 0x0596; +constexpr unsigned int mmROM_SW_DATA_15__SI = 0x0597; +constexpr unsigned int mmROM_SW_DATA_16__SI = 0x0598; +constexpr unsigned int mmROM_SW_DATA_17__SI = 0x0599; +constexpr unsigned int mmROM_SW_DATA_18__SI = 0x059A; +constexpr unsigned int mmROM_SW_DATA_19__SI = 0x059B; +constexpr unsigned int mmROM_SW_DATA_1__SI = 0x0589; +constexpr unsigned int mmROM_SW_DATA_20__SI = 0x059C; +constexpr unsigned int mmROM_SW_DATA_21__SI = 0x059D; +constexpr unsigned int mmROM_SW_DATA_22__SI = 0x059E; +constexpr unsigned int mmROM_SW_DATA_23__SI = 0x059F; +constexpr unsigned int mmROM_SW_DATA_24__SI = 0x05A0; +constexpr unsigned int mmROM_SW_DATA_25__SI = 0x05A1; +constexpr unsigned int mmROM_SW_DATA_26__SI = 0x05A2; +constexpr unsigned int mmROM_SW_DATA_27__SI = 0x05A3; +constexpr unsigned int mmROM_SW_DATA_28__SI = 0x05A4; +constexpr unsigned int mmROM_SW_DATA_29__SI = 0x05A5; +constexpr unsigned int mmROM_SW_DATA_2__SI = 0x058A; +constexpr unsigned int mmROM_SW_DATA_30__SI = 0x05A6; +constexpr unsigned int mmROM_SW_DATA_31__SI = 0x05A7; +constexpr unsigned int mmROM_SW_DATA_32__SI = 0x05A8; +constexpr unsigned int mmROM_SW_DATA_33__SI = 0x05A9; +constexpr unsigned int mmROM_SW_DATA_34__SI = 0x05AA; +constexpr unsigned int mmROM_SW_DATA_35__SI = 0x05AB; +constexpr unsigned int mmROM_SW_DATA_36__SI = 0x05AC; +constexpr unsigned int mmROM_SW_DATA_37__SI = 0x05AD; +constexpr unsigned int mmROM_SW_DATA_38__SI = 0x05AE; +constexpr unsigned int mmROM_SW_DATA_39__SI = 0x05AF; +constexpr unsigned int mmROM_SW_DATA_3__SI = 0x058B; +constexpr unsigned int mmROM_SW_DATA_40__SI = 0x05B0; +constexpr unsigned int mmROM_SW_DATA_41__SI = 0x05B1; +constexpr unsigned int mmROM_SW_DATA_42__SI = 0x05B2; +constexpr unsigned int mmROM_SW_DATA_43__SI = 0x05B3; +constexpr unsigned int mmROM_SW_DATA_44__SI = 0x05B4; +constexpr unsigned int mmROM_SW_DATA_45__SI = 0x05B5; +constexpr unsigned int mmROM_SW_DATA_46__SI = 0x05B6; +constexpr unsigned int mmROM_SW_DATA_47__SI = 0x05B7; +constexpr unsigned int mmROM_SW_DATA_48__SI = 0x05B8; +constexpr unsigned int mmROM_SW_DATA_49__SI = 0x05B9; +constexpr unsigned int mmROM_SW_DATA_4__SI = 0x058C; +constexpr unsigned int mmROM_SW_DATA_50__SI = 0x05BA; +constexpr unsigned int mmROM_SW_DATA_51__SI = 0x05BB; +constexpr unsigned int mmROM_SW_DATA_52__SI = 0x05BC; +constexpr unsigned int mmROM_SW_DATA_53__SI = 0x05BD; +constexpr unsigned int mmROM_SW_DATA_54__SI = 0x05BE; +constexpr unsigned int mmROM_SW_DATA_55__SI = 0x05BF; +constexpr unsigned int mmROM_SW_DATA_56__SI = 0x05C0; +constexpr unsigned int mmROM_SW_DATA_57__SI = 0x05C1; +constexpr unsigned int mmROM_SW_DATA_58__SI = 0x05C2; +constexpr unsigned int mmROM_SW_DATA_59__SI = 0x05C3; +constexpr unsigned int mmROM_SW_DATA_5__SI = 0x058D; +constexpr unsigned int mmROM_SW_DATA_60__SI = 0x05C4; +constexpr unsigned int mmROM_SW_DATA_61__SI = 0x05C5; +constexpr unsigned int mmROM_SW_DATA_62__SI = 0x05C6; +constexpr unsigned int mmROM_SW_DATA_63__SI = 0x05C7; +constexpr unsigned int mmROM_SW_DATA_64__SI = 0x05C8; +constexpr unsigned int mmROM_SW_DATA_6__SI = 0x058E; +constexpr unsigned int mmROM_SW_DATA_7__SI = 0x058F; +constexpr unsigned int mmROM_SW_DATA_8__SI = 0x0590; +constexpr unsigned int mmROM_SW_DATA_9__SI = 0x0591; +constexpr unsigned int mmROM_SW_STATUS__SI = 0x0587; +constexpr unsigned int mmSCL0_EXT_OVERSCAN_LEFT_RIGHT__SI__VI = 0x1B5E; +constexpr unsigned int mmSCL0_EXT_OVERSCAN_TOP_BOTTOM__SI__VI = 0x1B5F; +constexpr unsigned int mmSCL0_SCL_ALU_CONTROL__SI__VI = 0x1B54; +constexpr unsigned int mmSCL0_SCL_AUTOMATIC_MODE_CONTROL__SI__VI = 0x1B47; +constexpr unsigned int mmSCL0_SCL_BYPASS_CONTROL__SI__VI = 0x1B45; +constexpr unsigned int mmSCL0_SCL_COEF_RAM_CONFLICT_STATUS__SI__VI = 0x1B55; +constexpr unsigned int mmSCL0_SCL_COEF_RAM_SELECT__SI__VI = 0x1B40; +constexpr unsigned int mmSCL0_SCL_COEF_RAM_TAP_DATA__SI__VI = 0x1B41; +constexpr unsigned int mmSCL0_SCL_CONTROL__SI__VI = 0x1B44; +constexpr unsigned int mmSCL0_SCL_DEBUG__SI__VI = 0x1B6A; +constexpr unsigned int mmSCL0_SCL_F_SHARP_CONTROL__SI__VI = 0x1B53; +constexpr unsigned int mmSCL0_SCL_HORZ_FILTER_CONTROL__SI = 0x1B4A; +constexpr unsigned int mmSCL0_SCL_HORZ_FILTER_SCALE_RATIO__SI = 0x1B4B; +constexpr unsigned int mmSCL0_SCL_MANUAL_REPLICATE_CONTROL__SI__VI = 0x1B46; +constexpr unsigned int mmSCL0_SCL_MODE_CHANGE_DET1__SI__VI = 0x1B60; +constexpr unsigned int mmSCL0_SCL_MODE_CHANGE_DET2__SI__VI = 0x1B61; +constexpr unsigned int mmSCL0_SCL_MODE_CHANGE_DET3__SI__VI = 0x1B62; +constexpr unsigned int mmSCL0_SCL_MODE_CHANGE_MASK__SI__VI = 0x1B63; +constexpr unsigned int mmSCL0_SCL_TAP_CONTROL__SI__VI = 0x1B43; +constexpr unsigned int mmSCL0_SCL_TEST_DEBUG_DATA__SI__VI = 0x1B6C; +constexpr unsigned int mmSCL0_SCL_TEST_DEBUG_INDEX__SI__VI = 0x1B6B; +constexpr unsigned int mmSCL0_SCL_UPDATE__SI__VI = 0x1B51; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_CONTROL__SI = 0x1B4E; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_INIT_BOT__SI = 0x1B57; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_INIT__SI = 0x1B50; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_SCALE_RATIO__SI = 0x1B4F; +constexpr unsigned int mmSCL0_VIEWPORT_SIZE__SI__VI = 0x1B5D; +constexpr unsigned int mmSCL0_VIEWPORT_START__SI__VI = 0x1B5C; +constexpr unsigned int mmSCL1_EXT_OVERSCAN_LEFT_RIGHT__SI = 0x1E5E; +constexpr unsigned int mmSCL1_EXT_OVERSCAN_TOP_BOTTOM__SI = 0x1E5F; +constexpr unsigned int mmSCL1_SCL_ALU_CONTROL__SI = 0x1E54; +constexpr unsigned int mmSCL1_SCL_AUTOMATIC_MODE_CONTROL__SI = 0x1E47; +constexpr unsigned int mmSCL1_SCL_BYPASS_CONTROL__SI = 0x1E45; +constexpr unsigned int mmSCL1_SCL_COEF_RAM_CONFLICT_STATUS__SI = 0x1E55; +constexpr unsigned int mmSCL1_SCL_COEF_RAM_SELECT__SI = 0x1E40; +constexpr unsigned int mmSCL1_SCL_COEF_RAM_TAP_DATA__SI = 0x1E41; +constexpr unsigned int mmSCL1_SCL_CONTROL__SI = 0x1E44; +constexpr unsigned int mmSCL1_SCL_DEBUG__SI = 0x1E6A; +constexpr unsigned int mmSCL1_SCL_F_SHARP_CONTROL__SI = 0x1E53; +constexpr unsigned int mmSCL1_SCL_HORZ_FILTER_CONTROL__SI = 0x1E4A; +constexpr unsigned int mmSCL1_SCL_HORZ_FILTER_SCALE_RATIO__SI = 0x1E4B; +constexpr unsigned int mmSCL1_SCL_MANUAL_REPLICATE_CONTROL__SI = 0x1E46; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_DET1__SI = 0x1E60; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_DET2__SI = 0x1E61; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_DET3__SI = 0x1E62; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_MASK__SI = 0x1E63; +constexpr unsigned int mmSCL1_SCL_TAP_CONTROL__SI = 0x1E43; +constexpr unsigned int mmSCL1_SCL_TEST_DEBUG_DATA__SI = 0x1E6C; +constexpr unsigned int mmSCL1_SCL_TEST_DEBUG_INDEX__SI = 0x1E6B; +constexpr unsigned int mmSCL1_SCL_UPDATE__SI = 0x1E51; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_CONTROL__SI = 0x1E4E; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_INIT_BOT__SI = 0x1E57; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_INIT__SI = 0x1E50; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_SCALE_RATIO__SI = 0x1E4F; +constexpr unsigned int mmSCL1_VIEWPORT_SIZE__SI = 0x1E5D; +constexpr unsigned int mmSCL1_VIEWPORT_START__SI = 0x1E5C; +constexpr unsigned int mmSCL2_EXT_OVERSCAN_LEFT_RIGHT__SI = 0x415E; +constexpr unsigned int mmSCL2_EXT_OVERSCAN_TOP_BOTTOM__SI = 0x415F; +constexpr unsigned int mmSCL2_SCL_ALU_CONTROL__SI = 0x4154; +constexpr unsigned int mmSCL2_SCL_AUTOMATIC_MODE_CONTROL__SI = 0x4147; +constexpr unsigned int mmSCL2_SCL_BYPASS_CONTROL__SI = 0x4145; +constexpr unsigned int mmSCL2_SCL_COEF_RAM_CONFLICT_STATUS__SI = 0x4155; +constexpr unsigned int mmSCL2_SCL_COEF_RAM_SELECT__SI = 0x4140; +constexpr unsigned int mmSCL2_SCL_COEF_RAM_TAP_DATA__SI = 0x4141; +constexpr unsigned int mmSCL2_SCL_CONTROL__SI = 0x4144; +constexpr unsigned int mmSCL2_SCL_DEBUG__SI = 0x416A; +constexpr unsigned int mmSCL2_SCL_F_SHARP_CONTROL__SI = 0x4153; +constexpr unsigned int mmSCL2_SCL_HORZ_FILTER_CONTROL__SI = 0x414A; +constexpr unsigned int mmSCL2_SCL_HORZ_FILTER_SCALE_RATIO__SI = 0x414B; +constexpr unsigned int mmSCL2_SCL_MANUAL_REPLICATE_CONTROL__SI = 0x4146; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_DET1__SI = 0x4160; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_DET2__SI = 0x4161; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_DET3__SI = 0x4162; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_MASK__SI = 0x4163; +constexpr unsigned int mmSCL2_SCL_TAP_CONTROL__SI = 0x4143; +constexpr unsigned int mmSCL2_SCL_TEST_DEBUG_DATA__SI = 0x416C; +constexpr unsigned int mmSCL2_SCL_TEST_DEBUG_INDEX__SI = 0x416B; +constexpr unsigned int mmSCL2_SCL_UPDATE__SI = 0x4151; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_CONTROL__SI = 0x414E; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_INIT_BOT__SI = 0x4157; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_INIT__SI = 0x4150; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_SCALE_RATIO__SI = 0x414F; +constexpr unsigned int mmSCL2_VIEWPORT_SIZE__SI = 0x415D; +constexpr unsigned int mmSCL2_VIEWPORT_START__SI = 0x415C; +constexpr unsigned int mmSCL3_EXT_OVERSCAN_LEFT_RIGHT__SI = 0x445E; +constexpr unsigned int mmSCL3_EXT_OVERSCAN_TOP_BOTTOM__SI = 0x445F; +constexpr unsigned int mmSCL3_SCL_ALU_CONTROL__SI = 0x4454; +constexpr unsigned int mmSCL3_SCL_AUTOMATIC_MODE_CONTROL__SI = 0x4447; +constexpr unsigned int mmSCL3_SCL_BYPASS_CONTROL__SI = 0x4445; +constexpr unsigned int mmSCL3_SCL_COEF_RAM_CONFLICT_STATUS__SI = 0x4455; +constexpr unsigned int mmSCL3_SCL_COEF_RAM_SELECT__SI = 0x4440; +constexpr unsigned int mmSCL3_SCL_COEF_RAM_TAP_DATA__SI = 0x4441; +constexpr unsigned int mmSCL3_SCL_CONTROL__SI = 0x4444; +constexpr unsigned int mmSCL3_SCL_DEBUG__SI = 0x446A; +constexpr unsigned int mmSCL3_SCL_F_SHARP_CONTROL__SI = 0x4453; +constexpr unsigned int mmSCL3_SCL_HORZ_FILTER_CONTROL__SI = 0x444A; +constexpr unsigned int mmSCL3_SCL_HORZ_FILTER_SCALE_RATIO__SI = 0x444B; +constexpr unsigned int mmSCL3_SCL_MANUAL_REPLICATE_CONTROL__SI = 0x4446; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_DET1__SI = 0x4460; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_DET2__SI = 0x4461; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_DET3__SI = 0x4462; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_MASK__SI = 0x4463; +constexpr unsigned int mmSCL3_SCL_TAP_CONTROL__SI = 0x4443; +constexpr unsigned int mmSCL3_SCL_TEST_DEBUG_DATA__SI = 0x446C; +constexpr unsigned int mmSCL3_SCL_TEST_DEBUG_INDEX__SI = 0x446B; +constexpr unsigned int mmSCL3_SCL_UPDATE__SI = 0x4451; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_CONTROL__SI = 0x444E; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_INIT_BOT__SI = 0x4457; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_INIT__SI = 0x4450; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_SCALE_RATIO__SI = 0x444F; +constexpr unsigned int mmSCL3_VIEWPORT_SIZE__SI = 0x445D; +constexpr unsigned int mmSCL3_VIEWPORT_START__SI = 0x445C; +constexpr unsigned int mmSCL4_EXT_OVERSCAN_LEFT_RIGHT__SI = 0x475E; +constexpr unsigned int mmSCL4_EXT_OVERSCAN_TOP_BOTTOM__SI = 0x475F; +constexpr unsigned int mmSCL4_SCL_ALU_CONTROL__SI = 0x4754; +constexpr unsigned int mmSCL4_SCL_AUTOMATIC_MODE_CONTROL__SI = 0x4747; +constexpr unsigned int mmSCL4_SCL_BYPASS_CONTROL__SI = 0x4745; +constexpr unsigned int mmSCL4_SCL_COEF_RAM_CONFLICT_STATUS__SI = 0x4755; +constexpr unsigned int mmSCL4_SCL_COEF_RAM_SELECT__SI = 0x4740; +constexpr unsigned int mmSCL4_SCL_COEF_RAM_TAP_DATA__SI = 0x4741; +constexpr unsigned int mmSCL4_SCL_CONTROL__SI = 0x4744; +constexpr unsigned int mmSCL4_SCL_DEBUG__SI = 0x476A; +constexpr unsigned int mmSCL4_SCL_F_SHARP_CONTROL__SI = 0x4753; +constexpr unsigned int mmSCL4_SCL_HORZ_FILTER_CONTROL__SI = 0x474A; +constexpr unsigned int mmSCL4_SCL_HORZ_FILTER_SCALE_RATIO__SI = 0x474B; +constexpr unsigned int mmSCL4_SCL_MANUAL_REPLICATE_CONTROL__SI = 0x4746; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_DET1__SI = 0x4760; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_DET2__SI = 0x4761; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_DET3__SI = 0x4762; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_MASK__SI = 0x4763; +constexpr unsigned int mmSCL4_SCL_TAP_CONTROL__SI = 0x4743; +constexpr unsigned int mmSCL4_SCL_TEST_DEBUG_DATA__SI = 0x476C; +constexpr unsigned int mmSCL4_SCL_TEST_DEBUG_INDEX__SI = 0x476B; +constexpr unsigned int mmSCL4_SCL_UPDATE__SI = 0x4751; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_CONTROL__SI = 0x474E; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_INIT_BOT__SI = 0x4757; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_INIT__SI = 0x4750; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_SCALE_RATIO__SI = 0x474F; +constexpr unsigned int mmSCL4_VIEWPORT_SIZE__SI = 0x475D; +constexpr unsigned int mmSCL4_VIEWPORT_START__SI = 0x475C; +constexpr unsigned int mmSCL5_EXT_OVERSCAN_LEFT_RIGHT__SI = 0x4A5E; +constexpr unsigned int mmSCL5_EXT_OVERSCAN_TOP_BOTTOM__SI = 0x4A5F; +constexpr unsigned int mmSCL5_SCL_ALU_CONTROL__SI = 0x4A54; +constexpr unsigned int mmSCL5_SCL_AUTOMATIC_MODE_CONTROL__SI = 0x4A47; +constexpr unsigned int mmSCL5_SCL_BYPASS_CONTROL__SI = 0x4A45; +constexpr unsigned int mmSCL5_SCL_COEF_RAM_CONFLICT_STATUS__SI = 0x4A55; +constexpr unsigned int mmSCL5_SCL_COEF_RAM_SELECT__SI = 0x4A40; +constexpr unsigned int mmSCL5_SCL_COEF_RAM_TAP_DATA__SI = 0x4A41; +constexpr unsigned int mmSCL5_SCL_CONTROL__SI = 0x4A44; +constexpr unsigned int mmSCL5_SCL_DEBUG__SI = 0x4A6A; +constexpr unsigned int mmSCL5_SCL_F_SHARP_CONTROL__SI = 0x4A53; +constexpr unsigned int mmSCL5_SCL_HORZ_FILTER_CONTROL__SI = 0x4A4A; +constexpr unsigned int mmSCL5_SCL_HORZ_FILTER_SCALE_RATIO__SI = 0x4A4B; +constexpr unsigned int mmSCL5_SCL_MANUAL_REPLICATE_CONTROL__SI = 0x4A46; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_DET1__SI = 0x4A60; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_DET2__SI = 0x4A61; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_DET3__SI = 0x4A62; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_MASK__SI = 0x4A63; +constexpr unsigned int mmSCL5_SCL_TAP_CONTROL__SI = 0x4A43; +constexpr unsigned int mmSCL5_SCL_TEST_DEBUG_DATA__SI = 0x4A6C; +constexpr unsigned int mmSCL5_SCL_TEST_DEBUG_INDEX__SI = 0x4A6B; +constexpr unsigned int mmSCL5_SCL_UPDATE__SI = 0x4A51; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_CONTROL__SI = 0x4A4E; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_INIT_BOT__SI = 0x4A57; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_INIT__SI = 0x4A50; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_SCALE_RATIO__SI = 0x4A4F; +constexpr unsigned int mmSCL5_VIEWPORT_SIZE__SI = 0x4A5D; +constexpr unsigned int mmSCL5_VIEWPORT_START__SI = 0x4A5C; +constexpr unsigned int mmSCLK_CGTT_BLK_CTRL_REG__SI = 0x0129; +constexpr unsigned int mmSCLK_PWRMGT_CNTL__SI = 0x01E2; +constexpr unsigned int mmSCL_ALU_CONTROL__SI__VI = 0x1B54; +constexpr unsigned int mmSCL_AUTOMATIC_MODE_CONTROL__SI__VI = 0x1B47; +constexpr unsigned int mmSCL_BYPASS_CONTROL__SI__VI = 0x1B45; +constexpr unsigned int mmSCL_COEF_RAM_CONFLICT_STATUS__SI__VI = 0x1B55; +constexpr unsigned int mmSCL_COEF_RAM_SELECT__SI__VI = 0x1B40; +constexpr unsigned int mmSCL_COEF_RAM_TAP_DATA__SI__VI = 0x1B41; +constexpr unsigned int mmSCL_CONTROL__SI__VI = 0x1B44; +constexpr unsigned int mmSCL_DEBUG__SI__VI = 0x1B6A; +constexpr unsigned int mmSCL_F_SHARP_CONTROL__SI__VI = 0x1B53; +constexpr unsigned int mmSCL_HORZ_FILTER_CONTROL__SI = 0x1B4A; +constexpr unsigned int mmSCL_HORZ_FILTER_SCALE_RATIO__SI = 0x1B4B; +constexpr unsigned int mmSCL_MANUAL_REPLICATE_CONTROL__SI__VI = 0x1B46; +constexpr unsigned int mmSCL_MODE_CHANGE_DET1__SI__VI = 0x1B60; +constexpr unsigned int mmSCL_MODE_CHANGE_DET2__SI__VI = 0x1B61; +constexpr unsigned int mmSCL_MODE_CHANGE_DET3__SI__VI = 0x1B62; +constexpr unsigned int mmSCL_MODE_CHANGE_MASK__SI__VI = 0x1B63; +constexpr unsigned int mmSCL_TAP_CONTROL__SI__VI = 0x1B43; +constexpr unsigned int mmSCL_TEST_DEBUG_DATA__SI__VI = 0x1B6C; +constexpr unsigned int mmSCL_TEST_DEBUG_INDEX__SI__VI = 0x1B6B; +constexpr unsigned int mmSCL_UPDATE__SI__VI = 0x1B51; +constexpr unsigned int mmSCL_VERT_FILTER_CONTROL__SI = 0x1B4E; +constexpr unsigned int mmSCL_VERT_FILTER_INIT_BOT__SI = 0x1B57; +constexpr unsigned int mmSCL_VERT_FILTER_INIT__SI = 0x1B50; +constexpr unsigned int mmSCL_VERT_FILTER_SCALE_RATIO__SI = 0x1B4F; +constexpr unsigned int mmSCRATCH_ADDR__CI__VI = 0xC051; +constexpr unsigned int mmSCRATCH_ADDR__SI = 0x2151; +constexpr unsigned int mmSCRATCH_REG0__CI__VI = 0xC040; +constexpr unsigned int mmSCRATCH_REG0__SI = 0x2140; +constexpr unsigned int mmSCRATCH_REG1__CI__VI = 0xC041; +constexpr unsigned int mmSCRATCH_REG1__SI = 0x2141; +constexpr unsigned int mmSCRATCH_REG2__CI__VI = 0xC042; +constexpr unsigned int mmSCRATCH_REG2__SI = 0x2142; +constexpr unsigned int mmSCRATCH_REG3__CI__VI = 0xC043; +constexpr unsigned int mmSCRATCH_REG3__SI = 0x2143; +constexpr unsigned int mmSCRATCH_REG4__CI__VI = 0xC044; +constexpr unsigned int mmSCRATCH_REG4__SI = 0x2144; +constexpr unsigned int mmSCRATCH_REG5__CI__VI = 0xC045; +constexpr unsigned int mmSCRATCH_REG5__SI = 0x2145; +constexpr unsigned int mmSCRATCH_REG6__CI__VI = 0xC046; +constexpr unsigned int mmSCRATCH_REG6__SI = 0x2146; +constexpr unsigned int mmSCRATCH_REG7__CI__VI = 0xC047; +constexpr unsigned int mmSCRATCH_REG7__SI = 0x2147; +constexpr unsigned int mmSCRATCH_UMSK__CI__VI = 0xC050; +constexpr unsigned int mmSCRATCH_UMSK__SI = 0x2150; +constexpr unsigned int mmSDMA0_CHICKEN_BITS__CI__VI = 0x3405; +constexpr unsigned int mmSDMA0_CLK_CTRL__CI__VI = 0x3403; +constexpr unsigned int mmSDMA0_CNTL__CI__VI = 0x3404; +constexpr unsigned int mmSDMA0_F32_CNTL__CI__VI = 0x3412; +constexpr unsigned int mmSDMA0_FREEZE__CI__VI = 0x3413; +constexpr unsigned int mmSDMA0_GFX_APE1_CNTL__CI__VI = 0x34A8; +constexpr unsigned int mmSDMA0_GFX_CONTEXT_CNTL__CI__VI = 0x3493; +constexpr unsigned int mmSDMA0_GFX_CONTEXT_STATUS__CI__VI = 0x3491; +constexpr unsigned int mmSDMA0_GFX_IB_BASE_HI__CI__VI = 0x348E; +constexpr unsigned int mmSDMA0_GFX_IB_BASE_LO__CI__VI = 0x348D; +constexpr unsigned int mmSDMA0_GFX_IB_CNTL__CI__VI = 0x348A; +constexpr unsigned int mmSDMA0_GFX_IB_OFFSET__CI__VI = 0x348C; +constexpr unsigned int mmSDMA0_GFX_IB_RPTR__CI__VI = 0x348B; +constexpr unsigned int mmSDMA0_GFX_IB_SIZE__CI__VI = 0x348F; +constexpr unsigned int mmSDMA0_GFX_RB_BASE_HI__CI__VI = 0x3482; +constexpr unsigned int mmSDMA0_GFX_RB_BASE__CI__VI = 0x3481; +constexpr unsigned int mmSDMA0_GFX_RB_CNTL__CI__VI = 0x3480; +constexpr unsigned int mmSDMA0_GFX_RB_RPTR_ADDR_HI__CI__VI = 0x3488; +constexpr unsigned int mmSDMA0_GFX_RB_RPTR_ADDR_LO__CI__VI = 0x3489; +constexpr unsigned int mmSDMA0_GFX_RB_RPTR__CI__VI = 0x3483; +constexpr unsigned int mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI__CI__VI = 0x3486; +constexpr unsigned int mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO__CI__VI = 0x3487; +constexpr unsigned int mmSDMA0_GFX_RB_WPTR_POLL_CNTL__CI__VI = 0x3485; +constexpr unsigned int mmSDMA0_GFX_RB_WPTR__CI__VI = 0x3484; +constexpr unsigned int mmSDMA0_GFX_SKIP_CNTL__CI__VI = 0x3490; +constexpr unsigned int mmSDMA0_GFX_VIRTUAL_ADDR__CI__VI = 0x34A7; +constexpr unsigned int mmSDMA0_HASH__CI__VI = 0x3407; +constexpr unsigned int mmSDMA0_IB_OFFSET_FETCH__CI__VI = 0x340B; +constexpr unsigned int mmSDMA0_PERFCOUNTER0_RESULT__CI = 0x3410; +constexpr unsigned int mmSDMA0_PERFCOUNTER1_RESULT__CI = 0x3411; +constexpr unsigned int mmSDMA0_PERFMON_CNTL__CI = 0x340F; +constexpr unsigned int mmSDMA0_PHASE0_QUANTUM__CI__VI = 0x3414; +constexpr unsigned int mmSDMA0_PHASE1_QUANTUM__CI__VI = 0x3415; +constexpr unsigned int mmSDMA0_POWER_CNTL__CI__VI = 0x3402; +constexpr unsigned int mmSDMA0_PROGRAM__CI__VI = 0x340C; +constexpr unsigned int mmSDMA0_RB_RPTR_FETCH__CI__VI = 0x340A; +constexpr unsigned int mmSDMA0_RLC0_APE1_CNTL__CI__VI = 0x3528; +constexpr unsigned int mmSDMA0_RLC0_CONTEXT_STATUS__CI__VI = 0x3511; +constexpr unsigned int mmSDMA0_RLC0_DOORBELL_LOG__CI__VI = 0x3529; +constexpr unsigned int mmSDMA0_RLC0_DOORBELL__CI__VI = 0x3512; +constexpr unsigned int mmSDMA0_RLC0_IB_BASE_HI__CI__VI = 0x350E; +constexpr unsigned int mmSDMA0_RLC0_IB_BASE_LO__CI__VI = 0x350D; +constexpr unsigned int mmSDMA0_RLC0_IB_CNTL__CI__VI = 0x350A; +constexpr unsigned int mmSDMA0_RLC0_IB_OFFSET__CI__VI = 0x350C; +constexpr unsigned int mmSDMA0_RLC0_IB_RPTR__CI__VI = 0x350B; +constexpr unsigned int mmSDMA0_RLC0_IB_SIZE__CI__VI = 0x350F; +constexpr unsigned int mmSDMA0_RLC0_RB_BASE_HI__CI__VI = 0x3502; +constexpr unsigned int mmSDMA0_RLC0_RB_BASE__CI__VI = 0x3501; +constexpr unsigned int mmSDMA0_RLC0_RB_CNTL__CI__VI = 0x3500; +constexpr unsigned int mmSDMA0_RLC0_RB_RPTR_ADDR_HI__CI__VI = 0x3508; +constexpr unsigned int mmSDMA0_RLC0_RB_RPTR_ADDR_LO__CI__VI = 0x3509; +constexpr unsigned int mmSDMA0_RLC0_RB_RPTR__CI__VI = 0x3503; +constexpr unsigned int mmSDMA0_RLC0_RB_WPTR_POLL_ADDR_HI__CI__VI = 0x3506; +constexpr unsigned int mmSDMA0_RLC0_RB_WPTR_POLL_ADDR_LO__CI__VI = 0x3507; +constexpr unsigned int mmSDMA0_RLC0_RB_WPTR_POLL_CNTL__CI__VI = 0x3505; +constexpr unsigned int mmSDMA0_RLC0_RB_WPTR__CI__VI = 0x3504; +constexpr unsigned int mmSDMA0_RLC0_SKIP_CNTL__CI__VI = 0x3510; +constexpr unsigned int mmSDMA0_RLC0_VIRTUAL_ADDR__CI__VI = 0x3527; +constexpr unsigned int mmSDMA0_RLC1_APE1_CNTL__CI__VI = 0x35A8; +constexpr unsigned int mmSDMA0_RLC1_CONTEXT_STATUS__CI__VI = 0x3591; +constexpr unsigned int mmSDMA0_RLC1_DOORBELL_LOG__CI__VI = 0x35A9; +constexpr unsigned int mmSDMA0_RLC1_DOORBELL__CI__VI = 0x3592; +constexpr unsigned int mmSDMA0_RLC1_IB_BASE_HI__CI__VI = 0x358E; +constexpr unsigned int mmSDMA0_RLC1_IB_BASE_LO__CI__VI = 0x358D; +constexpr unsigned int mmSDMA0_RLC1_IB_CNTL__CI__VI = 0x358A; +constexpr unsigned int mmSDMA0_RLC1_IB_OFFSET__CI__VI = 0x358C; +constexpr unsigned int mmSDMA0_RLC1_IB_RPTR__CI__VI = 0x358B; +constexpr unsigned int mmSDMA0_RLC1_IB_SIZE__CI__VI = 0x358F; +constexpr unsigned int mmSDMA0_RLC1_RB_BASE_HI__CI__VI = 0x3582; +constexpr unsigned int mmSDMA0_RLC1_RB_BASE__CI__VI = 0x3581; +constexpr unsigned int mmSDMA0_RLC1_RB_CNTL__CI__VI = 0x3580; +constexpr unsigned int mmSDMA0_RLC1_RB_RPTR_ADDR_HI__CI__VI = 0x3588; +constexpr unsigned int mmSDMA0_RLC1_RB_RPTR_ADDR_LO__CI__VI = 0x3589; +constexpr unsigned int mmSDMA0_RLC1_RB_RPTR__CI__VI = 0x3583; +constexpr unsigned int mmSDMA0_RLC1_RB_WPTR_POLL_ADDR_HI__CI__VI = 0x3586; +constexpr unsigned int mmSDMA0_RLC1_RB_WPTR_POLL_ADDR_LO__CI__VI = 0x3587; +constexpr unsigned int mmSDMA0_RLC1_RB_WPTR_POLL_CNTL__CI__VI = 0x3585; +constexpr unsigned int mmSDMA0_RLC1_RB_WPTR__CI__VI = 0x3584; +constexpr unsigned int mmSDMA0_RLC1_SKIP_CNTL__CI__VI = 0x3590; +constexpr unsigned int mmSDMA0_RLC1_VIRTUAL_ADDR__CI__VI = 0x35A7; +constexpr unsigned int mmSDMA0_SEM_INCOMPLETE_TIMER_CNTL__CI = 0x3408; +constexpr unsigned int mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL__CI__VI = 0x3409; +constexpr unsigned int mmSDMA0_STATUS1_REG__CI__VI = 0x340E; +constexpr unsigned int mmSDMA0_STATUS_REG__CI__VI = 0x340D; +constexpr unsigned int mmSDMA0_TILING_CONFIG__CI__VI = 0x3406; +constexpr unsigned int mmSDMA0_UCODE_ADDR__CI__VI = 0x3400; +constexpr unsigned int mmSDMA0_UCODE_DATA__CI__VI = 0x3401; +constexpr unsigned int mmSDMA1_CHICKEN_BITS__CI__VI = 0x3605; +constexpr unsigned int mmSDMA1_CLK_CTRL__CI__VI = 0x3603; +constexpr unsigned int mmSDMA1_CNTL__CI__VI = 0x3604; +constexpr unsigned int mmSDMA1_CONFIG__CI__VI = 0x0F92; +constexpr unsigned int mmSDMA1_F32_CNTL__CI__VI = 0x3612; +constexpr unsigned int mmSDMA1_FREEZE__CI__VI = 0x3613; +constexpr unsigned int mmSDMA1_GFX_APE1_CNTL__CI__VI = 0x36A8; +constexpr unsigned int mmSDMA1_GFX_CONTEXT_CNTL__CI__VI = 0x3693; +constexpr unsigned int mmSDMA1_GFX_CONTEXT_STATUS__CI__VI = 0x3691; +constexpr unsigned int mmSDMA1_GFX_IB_BASE_HI__CI__VI = 0x368E; +constexpr unsigned int mmSDMA1_GFX_IB_BASE_LO__CI__VI = 0x368D; +constexpr unsigned int mmSDMA1_GFX_IB_CNTL__CI__VI = 0x368A; +constexpr unsigned int mmSDMA1_GFX_IB_OFFSET__CI__VI = 0x368C; +constexpr unsigned int mmSDMA1_GFX_IB_RPTR__CI__VI = 0x368B; +constexpr unsigned int mmSDMA1_GFX_IB_SIZE__CI__VI = 0x368F; +constexpr unsigned int mmSDMA1_GFX_RB_BASE_HI__CI__VI = 0x3682; +constexpr unsigned int mmSDMA1_GFX_RB_BASE__CI__VI = 0x3681; +constexpr unsigned int mmSDMA1_GFX_RB_CNTL__CI__VI = 0x3680; +constexpr unsigned int mmSDMA1_GFX_RB_RPTR_ADDR_HI__CI__VI = 0x3688; +constexpr unsigned int mmSDMA1_GFX_RB_RPTR_ADDR_LO__CI__VI = 0x3689; +constexpr unsigned int mmSDMA1_GFX_RB_RPTR__CI__VI = 0x3683; +constexpr unsigned int mmSDMA1_GFX_RB_WPTR_POLL_ADDR_HI__CI__VI = 0x3686; +constexpr unsigned int mmSDMA1_GFX_RB_WPTR_POLL_ADDR_LO__CI__VI = 0x3687; +constexpr unsigned int mmSDMA1_GFX_RB_WPTR_POLL_CNTL__CI__VI = 0x3685; +constexpr unsigned int mmSDMA1_GFX_RB_WPTR__CI__VI = 0x3684; +constexpr unsigned int mmSDMA1_GFX_SKIP_CNTL__CI__VI = 0x3690; +constexpr unsigned int mmSDMA1_GFX_VIRTUAL_ADDR__CI__VI = 0x36A7; +constexpr unsigned int mmSDMA1_HASH__CI__VI = 0x3607; +constexpr unsigned int mmSDMA1_IB_OFFSET_FETCH__CI__VI = 0x360B; +constexpr unsigned int mmSDMA1_PERFCOUNTER0_RESULT__CI = 0x3610; +constexpr unsigned int mmSDMA1_PERFCOUNTER1_RESULT__CI = 0x3611; +constexpr unsigned int mmSDMA1_PERFMON_CNTL__CI = 0x360F; +constexpr unsigned int mmSDMA1_PHASE0_QUANTUM__CI__VI = 0x3614; +constexpr unsigned int mmSDMA1_PHASE1_QUANTUM__CI__VI = 0x3615; +constexpr unsigned int mmSDMA1_POWER_CNTL__CI__VI = 0x3602; +constexpr unsigned int mmSDMA1_PROGRAM__CI__VI = 0x360C; +constexpr unsigned int mmSDMA1_RB_RPTR_FETCH__CI__VI = 0x360A; +constexpr unsigned int mmSDMA1_RLC0_APE1_CNTL__CI__VI = 0x3728; +constexpr unsigned int mmSDMA1_RLC0_CONTEXT_STATUS__CI__VI = 0x3711; +constexpr unsigned int mmSDMA1_RLC0_DOORBELL_LOG__CI__VI = 0x3729; +constexpr unsigned int mmSDMA1_RLC0_DOORBELL__CI__VI = 0x3712; +constexpr unsigned int mmSDMA1_RLC0_IB_BASE_HI__CI__VI = 0x370E; +constexpr unsigned int mmSDMA1_RLC0_IB_BASE_LO__CI__VI = 0x370D; +constexpr unsigned int mmSDMA1_RLC0_IB_CNTL__CI__VI = 0x370A; +constexpr unsigned int mmSDMA1_RLC0_IB_OFFSET__CI__VI = 0x370C; +constexpr unsigned int mmSDMA1_RLC0_IB_RPTR__CI__VI = 0x370B; +constexpr unsigned int mmSDMA1_RLC0_IB_SIZE__CI__VI = 0x370F; +constexpr unsigned int mmSDMA1_RLC0_RB_BASE_HI__CI__VI = 0x3702; +constexpr unsigned int mmSDMA1_RLC0_RB_BASE__CI__VI = 0x3701; +constexpr unsigned int mmSDMA1_RLC0_RB_CNTL__CI__VI = 0x3700; +constexpr unsigned int mmSDMA1_RLC0_RB_RPTR_ADDR_HI__CI__VI = 0x3708; +constexpr unsigned int mmSDMA1_RLC0_RB_RPTR_ADDR_LO__CI__VI = 0x3709; +constexpr unsigned int mmSDMA1_RLC0_RB_RPTR__CI__VI = 0x3703; +constexpr unsigned int mmSDMA1_RLC0_RB_WPTR_POLL_ADDR_HI__CI__VI = 0x3706; +constexpr unsigned int mmSDMA1_RLC0_RB_WPTR_POLL_ADDR_LO__CI__VI = 0x3707; +constexpr unsigned int mmSDMA1_RLC0_RB_WPTR_POLL_CNTL__CI__VI = 0x3705; +constexpr unsigned int mmSDMA1_RLC0_RB_WPTR__CI__VI = 0x3704; +constexpr unsigned int mmSDMA1_RLC0_SKIP_CNTL__CI__VI = 0x3710; +constexpr unsigned int mmSDMA1_RLC0_VIRTUAL_ADDR__CI__VI = 0x3727; +constexpr unsigned int mmSDMA1_RLC1_APE1_CNTL__CI__VI = 0x37A8; +constexpr unsigned int mmSDMA1_RLC1_CONTEXT_STATUS__CI__VI = 0x3791; +constexpr unsigned int mmSDMA1_RLC1_DOORBELL_LOG__CI__VI = 0x37A9; +constexpr unsigned int mmSDMA1_RLC1_DOORBELL__CI__VI = 0x3792; +constexpr unsigned int mmSDMA1_RLC1_IB_BASE_HI__CI__VI = 0x378E; +constexpr unsigned int mmSDMA1_RLC1_IB_BASE_LO__CI__VI = 0x378D; +constexpr unsigned int mmSDMA1_RLC1_IB_CNTL__CI__VI = 0x378A; +constexpr unsigned int mmSDMA1_RLC1_IB_OFFSET__CI__VI = 0x378C; +constexpr unsigned int mmSDMA1_RLC1_IB_RPTR__CI__VI = 0x378B; +constexpr unsigned int mmSDMA1_RLC1_IB_SIZE__CI__VI = 0x378F; +constexpr unsigned int mmSDMA1_RLC1_RB_BASE_HI__CI__VI = 0x3782; +constexpr unsigned int mmSDMA1_RLC1_RB_BASE__CI__VI = 0x3781; +constexpr unsigned int mmSDMA1_RLC1_RB_CNTL__CI__VI = 0x3780; +constexpr unsigned int mmSDMA1_RLC1_RB_RPTR_ADDR_HI__CI__VI = 0x3788; +constexpr unsigned int mmSDMA1_RLC1_RB_RPTR_ADDR_LO__CI__VI = 0x3789; +constexpr unsigned int mmSDMA1_RLC1_RB_RPTR__CI__VI = 0x3783; +constexpr unsigned int mmSDMA1_RLC1_RB_WPTR_POLL_ADDR_HI__CI__VI = 0x3786; +constexpr unsigned int mmSDMA1_RLC1_RB_WPTR_POLL_ADDR_LO__CI__VI = 0x3787; +constexpr unsigned int mmSDMA1_RLC1_RB_WPTR_POLL_CNTL__CI__VI = 0x3785; +constexpr unsigned int mmSDMA1_RLC1_RB_WPTR__CI__VI = 0x3784; +constexpr unsigned int mmSDMA1_RLC1_SKIP_CNTL__CI__VI = 0x3790; +constexpr unsigned int mmSDMA1_RLC1_VIRTUAL_ADDR__CI__VI = 0x37A7; +constexpr unsigned int mmSDMA1_SEM_INCOMPLETE_TIMER_CNTL__CI = 0x3608; +constexpr unsigned int mmSDMA1_SEM_WAIT_FAIL_TIMER_CNTL__CI__VI = 0x3609; +constexpr unsigned int mmSDMA1_STATUS1_REG__CI__VI = 0x360E; +constexpr unsigned int mmSDMA1_STATUS_REG__CI__VI = 0x360D; +constexpr unsigned int mmSDMA1_TILING_CONFIG__CI__VI = 0x3606; +constexpr unsigned int mmSDMA1_UCODE_ADDR__CI__VI = 0x3600; +constexpr unsigned int mmSDMA1_UCODE_DATA__CI__VI = 0x3601; +constexpr unsigned int mmSDMA_CONFIG__CI__VI = 0x0F91; +constexpr unsigned int mmSDMA_PGFSM_CONFIG__CI__VI = 0x3417; +constexpr unsigned int mmSDMA_PGFSM_READ__CI__VI = 0x3419; +constexpr unsigned int mmSDMA_PGFSM_WRITE__CI__VI = 0x3418; +constexpr unsigned int mmSDMA_POWER_GATING__CI__VI = 0x3416; +constexpr unsigned int mmSEM_CHICKEN_BITS__CI__VI = 0x0F9E; +constexpr unsigned int mmSEM_EDC_CONFIG__CI__VI = 0x0F9A; +constexpr unsigned int mmSEM_MAILBOX_CLIENTCONFIG__CI__VI = 0x0F9B; +constexpr unsigned int mmSEM_MAILBOX_CLIENTCONFIG__SI = 0x0F9A; +constexpr unsigned int mmSEM_MAILBOX_CONTROL__CI__VI = 0x0F9D; +constexpr unsigned int mmSEM_MAILBOX_CONTROL__SI = 0x0F9C; +constexpr unsigned int mmSEM_MAILBOX__CI__VI = 0x0F9C; +constexpr unsigned int mmSEM_MAILBOX__SI = 0x0F9B; +constexpr unsigned int mmSEM_MCIF_CONFIG = 0x0F90; +constexpr unsigned int mmSEM_STATUS__CI__VI = 0x0F99; +constexpr unsigned int mmSEQ8_DATA__SI__VI = 0x00F1; +constexpr unsigned int mmSEQ8_IDX__SI__VI = 0x00F1; +constexpr unsigned int mmSH_HIDDEN_PRIVATE_BASE_VMID__CI__VI = 0x2580; +constexpr unsigned int mmSH_MEM_APE1_BASE__CI__VI = 0x230B; +constexpr unsigned int mmSH_MEM_APE1_LIMIT__CI__VI = 0x230C; +constexpr unsigned int mmSH_MEM_BASES__CI__VI = 0x230A; +constexpr unsigned int mmSH_MEM_CONFIG__CI__VI = 0x230D; +constexpr unsigned int mmSH_STATIC_MEM_CONFIG__CI__VI = 0x2581; +constexpr unsigned int mmSLAVE_COMM_CMD_REG__SI__VI = 0x1624; +constexpr unsigned int mmSLAVE_COMM_CNTL_REG__SI__VI = 0x1625; +constexpr unsigned int mmSLAVE_COMM_DATA_REG1__SI__VI = 0x1621; +constexpr unsigned int mmSLAVE_COMM_DATA_REG2__SI__VI = 0x1622; +constexpr unsigned int mmSLAVE_COMM_DATA_REG3__SI__VI = 0x1623; +constexpr unsigned int mmSLAVE_HANG_ERROR = 0x153B; +constexpr unsigned int mmSLAVE_HANG_PROTECTION_CNTL = 0x1536; +constexpr unsigned int mmSLAVE_REQ_CREDIT_CNTL = 0x1517; +constexpr unsigned int mmSMBCLK_PAD_CNTL__CI = 0x1523; +constexpr unsigned int mmSMBDAT_PAD_CNTL__CI = 0x1522; +constexpr unsigned int mmSMBUS_SLV_CNTL__CI = 0x14FD; +constexpr unsigned int mmSMC_IND_ACCESS_CNTL__CI__VI = 0x0090; +constexpr unsigned int mmSMC_IND_ACCESS_CNTL__SI = 0x008A; +constexpr unsigned int mmSMC_IND_DATA = 0x0081; +constexpr unsigned int mmSMC_IND_DATA_0__CI__VI = 0x0081; +constexpr unsigned int mmSMC_IND_DATA_1__CI__VI = 0x0083; +constexpr unsigned int mmSMC_IND_DATA_2__CI__VI = 0x0085; +constexpr unsigned int mmSMC_IND_DATA_3__CI__VI = 0x0087; +constexpr unsigned int mmSMC_IND_DATA_4__CI__VI = 0x0089; +constexpr unsigned int mmSMC_IND_DATA_5__CI__VI = 0x008B; +constexpr unsigned int mmSMC_IND_DATA_6__CI__VI = 0x008D; +constexpr unsigned int mmSMC_IND_DATA_7__CI__VI = 0x008F; +constexpr unsigned int mmSMC_IND_INDEX = 0x0080; +constexpr unsigned int mmSMC_IND_INDEX_0__CI__VI = 0x0080; +constexpr unsigned int mmSMC_IND_INDEX_1__CI__VI = 0x0082; +constexpr unsigned int mmSMC_IND_INDEX_2__CI__VI = 0x0084; +constexpr unsigned int mmSMC_IND_INDEX_3__CI__VI = 0x0086; +constexpr unsigned int mmSMC_IND_INDEX_4__CI__VI = 0x0088; +constexpr unsigned int mmSMC_IND_INDEX_5__CI__VI = 0x008A; +constexpr unsigned int mmSMC_IND_INDEX_6__CI__VI = 0x008C; +constexpr unsigned int mmSMC_IND_INDEX_7__CI__VI = 0x008E; +constexpr unsigned int mmSMC_MESSAGE_0__CI__VI = 0x0094; +constexpr unsigned int mmSMC_MESSAGE_0__SI = 0x008B; +constexpr unsigned int mmSMC_MESSAGE_10__CI__VI = 0x00B9; +constexpr unsigned int mmSMC_MESSAGE_11__CI__VI = 0x00BB; +constexpr unsigned int mmSMC_MESSAGE_1__CI__VI = 0x0096; +constexpr unsigned int mmSMC_MESSAGE_1__SI = 0x008D; +constexpr unsigned int mmSMC_MESSAGE_2__CI__VI = 0x0098; +constexpr unsigned int mmSMC_MESSAGE_3__CI__VI = 0x009A; +constexpr unsigned int mmSMC_MESSAGE_4__CI__VI = 0x009C; +constexpr unsigned int mmSMC_MESSAGE_5__CI__VI = 0x009E; +constexpr unsigned int mmSMC_MESSAGE_6__CI__VI = 0x00A0; +constexpr unsigned int mmSMC_MESSAGE_7__CI__VI = 0x00A2; +constexpr unsigned int mmSMC_MESSAGE_8__CI__VI = 0x00B5; +constexpr unsigned int mmSMC_MESSAGE_9__CI__VI = 0x00B7; +constexpr unsigned int mmSMC_MSG_ARG_0__CI__VI = 0x00A4; +constexpr unsigned int mmSMC_MSG_ARG_10__CI__VI = 0x00BF; +constexpr unsigned int mmSMC_MSG_ARG_11__CI = 0x0091; +constexpr unsigned int mmSMC_MSG_ARG_1__CI__VI = 0x00A5; +constexpr unsigned int mmSMC_MSG_ARG_2__CI__VI = 0x00A6; +constexpr unsigned int mmSMC_MSG_ARG_3__CI__VI = 0x00A7; +constexpr unsigned int mmSMC_MSG_ARG_4__CI__VI = 0x00A8; +constexpr unsigned int mmSMC_MSG_ARG_5__CI__VI = 0x00A9; +constexpr unsigned int mmSMC_MSG_ARG_6__CI__VI = 0x00AA; +constexpr unsigned int mmSMC_MSG_ARG_7__CI__VI = 0x00AB; +constexpr unsigned int mmSMC_MSG_ARG_8__CI__VI = 0x00BD; +constexpr unsigned int mmSMC_MSG_ARG_9__CI__VI = 0x00BE; +constexpr unsigned int mmSMC_RESP_0__CI__VI = 0x0095; +constexpr unsigned int mmSMC_RESP_0__SI = 0x008C; +constexpr unsigned int mmSMC_RESP_10__CI__VI = 0x00BA; +constexpr unsigned int mmSMC_RESP_11__CI__VI = 0x00BC; +constexpr unsigned int mmSMC_RESP_1__CI__VI = 0x0097; +constexpr unsigned int mmSMC_RESP_1__SI = 0x008E; +constexpr unsigned int mmSMC_RESP_2__CI__VI = 0x0099; +constexpr unsigned int mmSMC_RESP_3__CI__VI = 0x009B; +constexpr unsigned int mmSMC_RESP_4__CI__VI = 0x009D; +constexpr unsigned int mmSMC_RESP_5__CI__VI = 0x009F; +constexpr unsigned int mmSMC_RESP_6__CI__VI = 0x00A1; +constexpr unsigned int mmSMC_RESP_7__CI__VI = 0x00A3; +constexpr unsigned int mmSMC_RESP_8__CI__VI = 0x00B6; +constexpr unsigned int mmSMC_RESP_9__CI__VI = 0x00B8; +constexpr unsigned int mmSMC_SCRATCH9__SI = 0x022A; +constexpr unsigned int mmSMU_SMC_IND_DATA__CI__VI = 0x0081; +constexpr unsigned int mmSMU_SMC_IND_INDEX__CI__VI = 0x0080; +constexpr unsigned int mmSPI_ARB_CYCLES_0__CI__VI = 0x31C1; +constexpr unsigned int mmSPI_ARB_CYCLES_0__SI = 0x243D; +constexpr unsigned int mmSPI_ARB_CYCLES_1__CI__VI = 0x31C2; +constexpr unsigned int mmSPI_ARB_CYCLES_1__SI = 0x243E; +constexpr unsigned int mmSPI_ARB_PRIORITY__CI__VI = 0x31C0; +constexpr unsigned int mmSPI_ARB_PRIORITY__SI = 0x243C; +constexpr unsigned int mmSPI_BARYC_CNTL = 0xA1B8; +constexpr unsigned int mmSPI_CDBG_SYS_CS0__CI__VI = 0x31C5; +constexpr unsigned int mmSPI_CDBG_SYS_CS1__CI__VI = 0x31C6; +constexpr unsigned int mmSPI_CDBG_SYS_GFX__CI__VI = 0x31C3; +constexpr unsigned int mmSPI_CDBG_SYS_HP3D__CI__VI = 0x31C4; +constexpr unsigned int mmSPI_COMPUTE_QUEUE_RESET__CI__VI = 0x31DB; +constexpr unsigned int mmSPI_CONFIG_CNTL = 0x2440; +constexpr unsigned int mmSPI_CONFIG_CNTL_1 = 0x244F; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_0__CI__VI = 0x24DC; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_1__CI__VI = 0x24DD; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_2__CI__VI = 0x24DE; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_3__CI__VI = 0x24DF; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_4__CI__VI = 0x24E0; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_5__CI__VI = 0x24E1; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_6__CI__VI = 0x24E2; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_COUNT_7__CI__VI = 0x24E3; +constexpr unsigned int mmSPI_CSQ_WF_ACTIVE_STATUS__CI__VI = 0x24DB; +constexpr unsigned int mmSPI_DEBUG_BUSY = 0x2450; +constexpr unsigned int mmSPI_DEBUG_CNTL = 0x2441; +constexpr unsigned int mmSPI_DEBUG_READ = 0x2442; +constexpr unsigned int mmSPI_GDBG_TBA_HI__CI__VI = 0x31D5; +constexpr unsigned int mmSPI_GDBG_TBA_LO__CI__VI = 0x31D4; +constexpr unsigned int mmSPI_GDBG_TMA_HI__CI__VI = 0x31D7; +constexpr unsigned int mmSPI_GDBG_TMA_LO__CI__VI = 0x31D6; +constexpr unsigned int mmSPI_GDBG_TRAP_CONFIG__CI__VI = 0x31D2; +constexpr unsigned int mmSPI_GDBG_TRAP_DATA0__CI__VI = 0x31D8; +constexpr unsigned int mmSPI_GDBG_TRAP_DATA1__CI__VI = 0x31D9; +constexpr unsigned int mmSPI_GDBG_TRAP_MASK__CI__VI = 0x31D3; +constexpr unsigned int mmSPI_GDBG_WAVE_CNTL__CI__VI = 0x31D1; +constexpr unsigned int mmSPI_GDS_CREDITS = 0x24D8; +constexpr unsigned int mmSPI_INTERP_CONTROL_0 = 0xA1B5; +constexpr unsigned int mmSPI_LB_CTR_CTRL = 0x24D4; +constexpr unsigned int mmSPI_LB_CU_MASK = 0x24D5; +constexpr unsigned int mmSPI_LB_DATA_REG = 0x24D6; +constexpr unsigned int mmSPI_P0_TRAP_SCREEN_GPR_MIN__CI__VI = 0x24F0; +constexpr unsigned int mmSPI_P0_TRAP_SCREEN_PSBA_HI__CI__VI = 0x24ED; +constexpr unsigned int mmSPI_P0_TRAP_SCREEN_PSBA_LO__CI__VI = 0x24EC; +constexpr unsigned int mmSPI_P0_TRAP_SCREEN_PSMA_HI__CI__VI = 0x24EF; +constexpr unsigned int mmSPI_P0_TRAP_SCREEN_PSMA_LO__CI__VI = 0x24EE; +constexpr unsigned int mmSPI_P1_TRAP_SCREEN_GPR_MIN__CI__VI = 0x24F5; +constexpr unsigned int mmSPI_P1_TRAP_SCREEN_PSBA_HI__CI__VI = 0x24F2; +constexpr unsigned int mmSPI_P1_TRAP_SCREEN_PSBA_LO__CI__VI = 0x24F1; +constexpr unsigned int mmSPI_P1_TRAP_SCREEN_PSMA_HI__CI__VI = 0x24F4; +constexpr unsigned int mmSPI_P1_TRAP_SCREEN_PSMA_LO__CI__VI = 0x24F3; +constexpr unsigned int mmSPI_PERFCOUNTER0_HI__CI__VI = 0xD180; +constexpr unsigned int mmSPI_PERFCOUNTER0_HI__SI = 0x2447; +constexpr unsigned int mmSPI_PERFCOUNTER0_LO__CI__VI = 0xD181; +constexpr unsigned int mmSPI_PERFCOUNTER0_LO__SI = 0x2448; +constexpr unsigned int mmSPI_PERFCOUNTER0_SELECT1__CI__VI = 0xD984; +constexpr unsigned int mmSPI_PERFCOUNTER0_SELECT__CI__VI = 0xD980; +constexpr unsigned int mmSPI_PERFCOUNTER0_SELECT__SI = 0x2443; +constexpr unsigned int mmSPI_PERFCOUNTER1_HI__CI__VI = 0xD182; +constexpr unsigned int mmSPI_PERFCOUNTER1_HI__SI = 0x2449; +constexpr unsigned int mmSPI_PERFCOUNTER1_LO__CI__VI = 0xD183; +constexpr unsigned int mmSPI_PERFCOUNTER1_LO__SI = 0x244A; +constexpr unsigned int mmSPI_PERFCOUNTER1_SELECT1__CI__VI = 0xD985; +constexpr unsigned int mmSPI_PERFCOUNTER1_SELECT__CI__VI = 0xD981; +constexpr unsigned int mmSPI_PERFCOUNTER1_SELECT__SI = 0x2444; +constexpr unsigned int mmSPI_PERFCOUNTER2_HI__CI__VI = 0xD184; +constexpr unsigned int mmSPI_PERFCOUNTER2_HI__SI = 0x244B; +constexpr unsigned int mmSPI_PERFCOUNTER2_LO__CI__VI = 0xD185; +constexpr unsigned int mmSPI_PERFCOUNTER2_LO__SI = 0x244C; +constexpr unsigned int mmSPI_PERFCOUNTER2_SELECT1__CI__VI = 0xD986; +constexpr unsigned int mmSPI_PERFCOUNTER2_SELECT__CI__VI = 0xD982; +constexpr unsigned int mmSPI_PERFCOUNTER2_SELECT__SI = 0x2445; +constexpr unsigned int mmSPI_PERFCOUNTER3_HI__CI__VI = 0xD186; +constexpr unsigned int mmSPI_PERFCOUNTER3_HI__SI = 0x244D; +constexpr unsigned int mmSPI_PERFCOUNTER3_LO__CI__VI = 0xD187; +constexpr unsigned int mmSPI_PERFCOUNTER3_LO__SI = 0x244E; +constexpr unsigned int mmSPI_PERFCOUNTER3_SELECT1__CI__VI = 0xD987; +constexpr unsigned int mmSPI_PERFCOUNTER3_SELECT__CI__VI = 0xD983; +constexpr unsigned int mmSPI_PERFCOUNTER3_SELECT__SI = 0x2446; +constexpr unsigned int mmSPI_PERFCOUNTER4_HI__CI__VI = 0xD188; +constexpr unsigned int mmSPI_PERFCOUNTER4_LO__CI__VI = 0xD189; +constexpr unsigned int mmSPI_PERFCOUNTER4_SELECT__CI__VI = 0xD988; +constexpr unsigned int mmSPI_PERFCOUNTER5_HI__CI__VI = 0xD18A; +constexpr unsigned int mmSPI_PERFCOUNTER5_LO__CI__VI = 0xD18B; +constexpr unsigned int mmSPI_PERFCOUNTER5_SELECT__CI__VI = 0xD989; +constexpr unsigned int mmSPI_PERFCOUNTER_BINS__CI__VI = 0xD98A; +constexpr unsigned int mmSPI_PERFCOUNTER_BINS__SI = 0x243F; +constexpr unsigned int mmSPI_PG_ENABLE_STATIC_CU_MASK = 0x24D7; +constexpr unsigned int mmSPI_PS_INPUT_ADDR = 0xA1B4; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_0 = 0xA191; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_1 = 0xA192; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_10 = 0xA19B; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_11 = 0xA19C; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_12 = 0xA19D; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_13 = 0xA19E; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_14 = 0xA19F; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_15 = 0xA1A0; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_16 = 0xA1A1; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_17 = 0xA1A2; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_18 = 0xA1A3; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_19 = 0xA1A4; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_2 = 0xA193; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_20 = 0xA1A5; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_21 = 0xA1A6; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_22 = 0xA1A7; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_23 = 0xA1A8; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_24 = 0xA1A9; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_25 = 0xA1AA; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_26 = 0xA1AB; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_27 = 0xA1AC; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_28 = 0xA1AD; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_29 = 0xA1AE; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_3 = 0xA194; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_30 = 0xA1AF; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_31 = 0xA1B0; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_4 = 0xA195; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_5 = 0xA196; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_6 = 0xA197; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_7 = 0xA198; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_8 = 0xA199; +constexpr unsigned int mmSPI_PS_INPUT_CNTL_9 = 0xA19A; +constexpr unsigned int mmSPI_PS_INPUT_ENA = 0xA1B3; +constexpr unsigned int mmSPI_PS_IN_CONTROL = 0xA1B6; +constexpr unsigned int mmSPI_PS_MAX_WAVE_ID__CI__VI = 0x243A; +constexpr unsigned int mmSPI_PS_MAX_WAVE_ID__SI = 0x243B; +constexpr unsigned int mmSPI_RESET_DEBUG__CI__VI = 0x31DA; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_0__CI__VI = 0x31DC; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_10__CI__VI = 0x31F0; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_11__CI__VI = 0x31F1; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_1__CI__VI = 0x31DD; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_2__CI__VI = 0x31DE; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_3__CI__VI = 0x31DF; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_4__CI__VI = 0x31E0; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_5__CI__VI = 0x31E1; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_6__CI__VI = 0x31E2; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_7__CI__VI = 0x31E3; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_8__CI__VI = 0x31E4; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_9__CI__VI = 0x31E5; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_0__CI__VI = 0x31E6; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_10__CI__VI = 0x31F2; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_11__CI__VI = 0x31F3; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_1__CI__VI = 0x31E7; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_2__CI__VI = 0x31E8; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_3__CI__VI = 0x31E9; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_4__CI__VI = 0x31EA; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_5__CI__VI = 0x31EB; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_6__CI__VI = 0x31EC; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_7__CI__VI = 0x31ED; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_8__CI__VI = 0x31EE; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_9__CI__VI = 0x31EF; +constexpr unsigned int mmSPI_SHADER_COL_FORMAT = 0xA1C5; +constexpr unsigned int mmSPI_SHADER_LATE_ALLOC_VS__CI__VI = 0x2C47; +constexpr unsigned int mmSPI_SHADER_PGM_HI_ES = 0x2CC9; +constexpr unsigned int mmSPI_SHADER_PGM_HI_GS = 0x2C89; +constexpr unsigned int mmSPI_SHADER_PGM_HI_HS = 0x2D09; +constexpr unsigned int mmSPI_SHADER_PGM_HI_LS = 0x2D49; +constexpr unsigned int mmSPI_SHADER_PGM_HI_PS = 0x2C09; +constexpr unsigned int mmSPI_SHADER_PGM_HI_VS = 0x2C49; +constexpr unsigned int mmSPI_SHADER_PGM_LO_ES = 0x2CC8; +constexpr unsigned int mmSPI_SHADER_PGM_LO_GS = 0x2C88; +constexpr unsigned int mmSPI_SHADER_PGM_LO_HS = 0x2D08; +constexpr unsigned int mmSPI_SHADER_PGM_LO_LS = 0x2D48; +constexpr unsigned int mmSPI_SHADER_PGM_LO_PS = 0x2C08; +constexpr unsigned int mmSPI_SHADER_PGM_LO_VS = 0x2C48; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC1_ES = 0x2CCA; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC1_GS = 0x2C8A; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC1_HS = 0x2D0A; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC1_LS = 0x2D4A; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC1_PS = 0x2C0A; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC1_VS = 0x2C4A; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_ES = 0x2CCB; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_ES_GS__CI__VI = 0x2CBC; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_ES_VS__CI__VI = 0x2C7C; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_GS = 0x2C8B; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_HS = 0x2D0B; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_LS = 0x2D4B; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_LS_ES__CI__VI = 0x2CFD; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_LS_HS__CI__VI = 0x2D3D; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_LS_VS__CI__VI = 0x2C7D; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_PS = 0x2C0B; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC2_VS = 0x2C4B; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC3_ES__CI__VI = 0x2CC7; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC3_GS__CI__VI = 0x2C87; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC3_HS__CI__VI = 0x2D07; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC3_LS__CI__VI = 0x2D47; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC3_PS__CI__VI = 0x2C07; +constexpr unsigned int mmSPI_SHADER_PGM_RSRC3_VS__CI__VI = 0x2C46; +constexpr unsigned int mmSPI_SHADER_POS_FORMAT = 0xA1C3; +constexpr unsigned int mmSPI_SHADER_TBA_HI_ES = 0x2CC1; +constexpr unsigned int mmSPI_SHADER_TBA_HI_GS = 0x2C81; +constexpr unsigned int mmSPI_SHADER_TBA_HI_HS = 0x2D01; +constexpr unsigned int mmSPI_SHADER_TBA_HI_LS = 0x2D41; +constexpr unsigned int mmSPI_SHADER_TBA_HI_PS = 0x2C01; +constexpr unsigned int mmSPI_SHADER_TBA_HI_VS = 0x2C41; +constexpr unsigned int mmSPI_SHADER_TBA_LO_ES = 0x2CC0; +constexpr unsigned int mmSPI_SHADER_TBA_LO_GS = 0x2C80; +constexpr unsigned int mmSPI_SHADER_TBA_LO_HS = 0x2D00; +constexpr unsigned int mmSPI_SHADER_TBA_LO_LS = 0x2D40; +constexpr unsigned int mmSPI_SHADER_TBA_LO_PS = 0x2C00; +constexpr unsigned int mmSPI_SHADER_TBA_LO_VS = 0x2C40; +constexpr unsigned int mmSPI_SHADER_TMA_HI_ES = 0x2CC3; +constexpr unsigned int mmSPI_SHADER_TMA_HI_GS = 0x2C83; +constexpr unsigned int mmSPI_SHADER_TMA_HI_HS = 0x2D03; +constexpr unsigned int mmSPI_SHADER_TMA_HI_LS = 0x2D43; +constexpr unsigned int mmSPI_SHADER_TMA_HI_PS = 0x2C03; +constexpr unsigned int mmSPI_SHADER_TMA_HI_VS = 0x2C43; +constexpr unsigned int mmSPI_SHADER_TMA_LO_ES = 0x2CC2; +constexpr unsigned int mmSPI_SHADER_TMA_LO_GS = 0x2C82; +constexpr unsigned int mmSPI_SHADER_TMA_LO_HS = 0x2D02; +constexpr unsigned int mmSPI_SHADER_TMA_LO_LS = 0x2D42; +constexpr unsigned int mmSPI_SHADER_TMA_LO_PS = 0x2C02; +constexpr unsigned int mmSPI_SHADER_TMA_LO_VS = 0x2C42; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_0 = 0x2CCC; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_1 = 0x2CCD; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_10 = 0x2CD6; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_11 = 0x2CD7; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_12 = 0x2CD8; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_13 = 0x2CD9; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_14 = 0x2CDA; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_15 = 0x2CDB; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_2 = 0x2CCE; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_3 = 0x2CCF; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_4 = 0x2CD0; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_5 = 0x2CD1; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_6 = 0x2CD2; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_7 = 0x2CD3; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_8 = 0x2CD4; +constexpr unsigned int mmSPI_SHADER_USER_DATA_ES_9 = 0x2CD5; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_0 = 0x2C8C; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_1 = 0x2C8D; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_10 = 0x2C96; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_11 = 0x2C97; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_12 = 0x2C98; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_13 = 0x2C99; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_14 = 0x2C9A; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_15 = 0x2C9B; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_2 = 0x2C8E; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_3 = 0x2C8F; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_4 = 0x2C90; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_5 = 0x2C91; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_6 = 0x2C92; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_7 = 0x2C93; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_8 = 0x2C94; +constexpr unsigned int mmSPI_SHADER_USER_DATA_GS_9 = 0x2C95; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_0 = 0x2D0C; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_1 = 0x2D0D; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_10 = 0x2D16; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_11 = 0x2D17; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_12 = 0x2D18; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_13 = 0x2D19; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_14 = 0x2D1A; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_15 = 0x2D1B; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_2 = 0x2D0E; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_3 = 0x2D0F; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_4 = 0x2D10; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_5 = 0x2D11; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_6 = 0x2D12; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_7 = 0x2D13; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_8 = 0x2D14; +constexpr unsigned int mmSPI_SHADER_USER_DATA_HS_9 = 0x2D15; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_0 = 0x2D4C; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_1 = 0x2D4D; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_10 = 0x2D56; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_11 = 0x2D57; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_12 = 0x2D58; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_13 = 0x2D59; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_14 = 0x2D5A; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_15 = 0x2D5B; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_2 = 0x2D4E; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_3 = 0x2D4F; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_4 = 0x2D50; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_5 = 0x2D51; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_6 = 0x2D52; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_7 = 0x2D53; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_8 = 0x2D54; +constexpr unsigned int mmSPI_SHADER_USER_DATA_LS_9 = 0x2D55; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_0 = 0x2C0C; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_1 = 0x2C0D; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_10 = 0x2C16; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_11 = 0x2C17; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_12 = 0x2C18; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_13 = 0x2C19; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_14 = 0x2C1A; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_15 = 0x2C1B; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_2 = 0x2C0E; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_3 = 0x2C0F; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_4 = 0x2C10; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_5 = 0x2C11; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_6 = 0x2C12; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_7 = 0x2C13; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_8 = 0x2C14; +constexpr unsigned int mmSPI_SHADER_USER_DATA_PS_9 = 0x2C15; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_0 = 0x2C4C; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_1 = 0x2C4D; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_10 = 0x2C56; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_11 = 0x2C57; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_12 = 0x2C58; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_13 = 0x2C59; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_14 = 0x2C5A; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_15 = 0x2C5B; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_2 = 0x2C4E; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_3 = 0x2C4F; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_4 = 0x2C50; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_5 = 0x2C51; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_6 = 0x2C52; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_7 = 0x2C53; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_8 = 0x2C54; +constexpr unsigned int mmSPI_SHADER_USER_DATA_VS_9 = 0x2C55; +constexpr unsigned int mmSPI_SHADER_Z_FORMAT = 0xA1C4; +constexpr unsigned int mmSPI_SLAVE_DEBUG_BUSY = 0x24D3; +constexpr unsigned int mmSPI_STATIC_THREAD_MGMT_3__SI = 0x243A; +constexpr unsigned int mmSPI_SX_EXPORT_BUFFER_SIZES = 0x24D9; +constexpr unsigned int mmSPI_SX_SCOREBOARD_BUFFER_SIZES = 0x24DA; +constexpr unsigned int mmSPI_TMPRING_SIZE = 0xA1BA; +constexpr unsigned int mmSPI_VS_OUT_CONFIG = 0xA1B1; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS0__CI__VI = 0x31C9; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS1__CI__VI = 0x31CA; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS2__CI__VI = 0x31CB; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS3__CI__VI = 0x31CC; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS4__CI__VI = 0x31CD; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS5__CI__VI = 0x31CE; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS6__CI__VI = 0x31CF; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_CS7__CI__VI = 0x31D0; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_GFX__CI__VI = 0x31C7; +constexpr unsigned int mmSPI_WCL_PIPE_PERCENT_HP3D__CI__VI = 0x31C8; +constexpr unsigned int mmSPI_WF_LIFETIME_CNTL__CI__VI = 0x24AA; +constexpr unsigned int mmSPI_WF_LIFETIME_DEBUG__CI__VI = 0x24CA; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_0__CI__VI = 0x24AB; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_1__CI__VI = 0x24AC; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_2__CI__VI = 0x24AD; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_3__CI__VI = 0x24AE; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_4__CI__VI = 0x24AF; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_5__CI__VI = 0x24B0; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_6__CI__VI = 0x24B1; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_7__CI__VI = 0x24B2; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_8__CI__VI = 0x24B3; +constexpr unsigned int mmSPI_WF_LIFETIME_LIMIT_9__CI__VI = 0x24B4; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_0__CI__VI = 0x24B5; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_10__CI__VI = 0x24BF; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_11__CI__VI = 0x24C0; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_12__CI__VI = 0x24C1; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_13__CI__VI = 0x24C2; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_14__CI__VI = 0x24C3; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_15__CI__VI = 0x24C4; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_16__CI__VI = 0x24C5; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_17__CI__VI = 0x24C6; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_18__CI__VI = 0x24C7; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_19__CI__VI = 0x24C8; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_1__CI__VI = 0x24B6; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_20__CI__VI = 0x24C9; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_2__CI__VI = 0x24B7; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_3__CI__VI = 0x24B8; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_4__CI__VI = 0x24B9; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_5__CI__VI = 0x24BA; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_6__CI__VI = 0x24BB; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_7__CI__VI = 0x24BC; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_8__CI__VI = 0x24BD; +constexpr unsigned int mmSPI_WF_LIFETIME_STATUS_9__CI__VI = 0x24BE; +constexpr unsigned int mmSPLL_CNTL_MODE__SI = 0x0186; +constexpr unsigned int mmSQC_CACHES__CI__VI = 0xC348; +constexpr unsigned int mmSQC_CACHES__SI = 0x2302; +constexpr unsigned int mmSQC_CONFIG = 0x2301; +constexpr unsigned int mmSQC_POLICY__CI = 0x230E; +constexpr unsigned int mmSQC_SECDED_CNT__SI__CI = 0x23A0; +constexpr unsigned int mmSQC_VOLATILE__CI = 0x230F; +constexpr unsigned int mmSQ_ALU_CLK_CTRL__CI__VI = 0xF08E; +constexpr unsigned int mmSQ_ALU_CLK_CTRL__SI = 0x2360; +constexpr unsigned int mmSQ_BUF_RSRC_WORD0 = 0x23C0; +constexpr unsigned int mmSQ_BUF_RSRC_WORD1 = 0x23C1; +constexpr unsigned int mmSQ_BUF_RSRC_WORD2 = 0x23C2; +constexpr unsigned int mmSQ_BUF_RSRC_WORD3 = 0x23C3; +constexpr unsigned int mmSQ_CMD_TIMESTAMP__CI__VI = 0x2375; +constexpr unsigned int mmSQ_CMD__CI__VI = 0x237B; +constexpr unsigned int mmSQ_CONFIG = 0x2300; +constexpr unsigned int mmSQ_DEBUG_STS_GLOBAL = 0x2309; +constexpr unsigned int mmSQ_DEBUG_STS_GLOBAL2__CI__VI = 0x2310; +constexpr unsigned int mmSQ_DEBUG_STS_GLOBAL3__CI__VI = 0x2311; +constexpr unsigned int mmSQ_DED_CNT__SI__CI = 0x23A2; +constexpr unsigned int mmSQ_DED_INFO__SI__CI = 0x23A3; +constexpr unsigned int mmSQ_DS_0 = 0x237F; +constexpr unsigned int mmSQ_DS_1 = 0x237F; +constexpr unsigned int mmSQ_EXP_0 = 0x237F; +constexpr unsigned int mmSQ_EXP_1 = 0x237F; +constexpr unsigned int mmSQ_FIFO_SIZES = 0x2305; +constexpr unsigned int mmSQ_FLAT_0__CI__VI = 0x237F; +constexpr unsigned int mmSQ_FLAT_1__CI__VI = 0x237F; +constexpr unsigned int mmSQ_FLAT_SCRATCH_WORD0__CI__VI = 0x23D0; +constexpr unsigned int mmSQ_FLAT_SCRATCH_WORD1__CI__VI = 0x23D1; +constexpr unsigned int mmSQ_HV_VMID_CTRL__CI__VI = 0xF840; +constexpr unsigned int mmSQ_IMG_RSRC_WORD0 = 0x23C4; +constexpr unsigned int mmSQ_IMG_RSRC_WORD1 = 0x23C5; +constexpr unsigned int mmSQ_IMG_RSRC_WORD2 = 0x23C6; +constexpr unsigned int mmSQ_IMG_RSRC_WORD3 = 0x23C7; +constexpr unsigned int mmSQ_IMG_RSRC_WORD4 = 0x23C8; +constexpr unsigned int mmSQ_IMG_RSRC_WORD5 = 0x23C9; +constexpr unsigned int mmSQ_IMG_RSRC_WORD6 = 0x23CA; +constexpr unsigned int mmSQ_IMG_RSRC_WORD7 = 0x23CB; +constexpr unsigned int mmSQ_IMG_SAMP_WORD0 = 0x23CC; +constexpr unsigned int mmSQ_IMG_SAMP_WORD1 = 0x23CD; +constexpr unsigned int mmSQ_IMG_SAMP_WORD2 = 0x23CE; +constexpr unsigned int mmSQ_IMG_SAMP_WORD3 = 0x23CF; +constexpr unsigned int mmSQ_IND_DATA = 0x2379; +constexpr unsigned int mmSQ_IND_INDEX = 0x2378; +constexpr unsigned int mmSQ_INST = 0x237F; +constexpr unsigned int mmSQ_INTERRUPT_AUTO_MASK__CI__VI = 0x2314; +constexpr unsigned int mmSQ_INTERRUPT_MSG_CTRL__CI__VI = 0x2315; +constexpr unsigned int mmSQ_LB_CTR_CTRL = 0x2398; +constexpr unsigned int mmSQ_LB_DATA_ALU_CYCLES = 0x2399; +constexpr unsigned int mmSQ_LB_DATA_ALU_STALLS = 0x239B; +constexpr unsigned int mmSQ_LB_DATA_TEX_CYCLES = 0x239A; +constexpr unsigned int mmSQ_LB_DATA_TEX_STALLS = 0x239C; +constexpr unsigned int mmSQ_LDS_CLK_CTRL__CI__VI = 0xF090; +constexpr unsigned int mmSQ_MIMG_0 = 0x237F; +constexpr unsigned int mmSQ_MIMG_1 = 0x237F; +constexpr unsigned int mmSQ_MTBUF_0 = 0x237F; +constexpr unsigned int mmSQ_MTBUF_1 = 0x237F; +constexpr unsigned int mmSQ_MUBUF_0 = 0x237F; +constexpr unsigned int mmSQ_MUBUF_1 = 0x237F; +constexpr unsigned int mmSQ_PERFCOUNTER0_HI__CI__VI = 0xD1C1; +constexpr unsigned int mmSQ_PERFCOUNTER0_HI__SI = 0x2321; +constexpr unsigned int mmSQ_PERFCOUNTER0_LO__CI__VI = 0xD1C0; +constexpr unsigned int mmSQ_PERFCOUNTER0_LO__SI = 0x2320; +constexpr unsigned int mmSQ_PERFCOUNTER0_SELECT__CI__VI = 0xD9C0; +constexpr unsigned int mmSQ_PERFCOUNTER0_SELECT__SI = 0x2340; +constexpr unsigned int mmSQ_PERFCOUNTER10_HI__CI__VI = 0xD1D5; +constexpr unsigned int mmSQ_PERFCOUNTER10_HI__SI = 0x2335; +constexpr unsigned int mmSQ_PERFCOUNTER10_LO__CI__VI = 0xD1D4; +constexpr unsigned int mmSQ_PERFCOUNTER10_LO__SI = 0x2334; +constexpr unsigned int mmSQ_PERFCOUNTER10_SELECT__CI__VI = 0xD9CA; +constexpr unsigned int mmSQ_PERFCOUNTER10_SELECT__SI = 0x234A; +constexpr unsigned int mmSQ_PERFCOUNTER11_HI__CI__VI = 0xD1D7; +constexpr unsigned int mmSQ_PERFCOUNTER11_HI__SI = 0x2337; +constexpr unsigned int mmSQ_PERFCOUNTER11_LO__CI__VI = 0xD1D6; +constexpr unsigned int mmSQ_PERFCOUNTER11_LO__SI = 0x2336; +constexpr unsigned int mmSQ_PERFCOUNTER11_SELECT__CI__VI = 0xD9CB; +constexpr unsigned int mmSQ_PERFCOUNTER11_SELECT__SI = 0x234B; +constexpr unsigned int mmSQ_PERFCOUNTER12_HI__CI__VI = 0xD1D9; +constexpr unsigned int mmSQ_PERFCOUNTER12_HI__SI = 0x2339; +constexpr unsigned int mmSQ_PERFCOUNTER12_LO__CI__VI = 0xD1D8; +constexpr unsigned int mmSQ_PERFCOUNTER12_LO__SI = 0x2338; +constexpr unsigned int mmSQ_PERFCOUNTER12_SELECT__CI__VI = 0xD9CC; +constexpr unsigned int mmSQ_PERFCOUNTER12_SELECT__SI = 0x234C; +constexpr unsigned int mmSQ_PERFCOUNTER13_HI__CI__VI = 0xD1DB; +constexpr unsigned int mmSQ_PERFCOUNTER13_HI__SI = 0x233B; +constexpr unsigned int mmSQ_PERFCOUNTER13_LO__CI__VI = 0xD1DA; +constexpr unsigned int mmSQ_PERFCOUNTER13_LO__SI = 0x233A; +constexpr unsigned int mmSQ_PERFCOUNTER13_SELECT__CI__VI = 0xD9CD; +constexpr unsigned int mmSQ_PERFCOUNTER13_SELECT__SI = 0x234D; +constexpr unsigned int mmSQ_PERFCOUNTER14_HI__CI__VI = 0xD1DD; +constexpr unsigned int mmSQ_PERFCOUNTER14_HI__SI = 0x233D; +constexpr unsigned int mmSQ_PERFCOUNTER14_LO__CI__VI = 0xD1DC; +constexpr unsigned int mmSQ_PERFCOUNTER14_LO__SI = 0x233C; +constexpr unsigned int mmSQ_PERFCOUNTER14_SELECT__CI__VI = 0xD9CE; +constexpr unsigned int mmSQ_PERFCOUNTER14_SELECT__SI = 0x234E; +constexpr unsigned int mmSQ_PERFCOUNTER15_HI__CI__VI = 0xD1DF; +constexpr unsigned int mmSQ_PERFCOUNTER15_HI__SI = 0x233F; +constexpr unsigned int mmSQ_PERFCOUNTER15_LO__CI__VI = 0xD1DE; +constexpr unsigned int mmSQ_PERFCOUNTER15_LO__SI = 0x233E; +constexpr unsigned int mmSQ_PERFCOUNTER15_SELECT__CI__VI = 0xD9CF; +constexpr unsigned int mmSQ_PERFCOUNTER15_SELECT__SI = 0x234F; +constexpr unsigned int mmSQ_PERFCOUNTER1_HI__CI__VI = 0xD1C3; +constexpr unsigned int mmSQ_PERFCOUNTER1_HI__SI = 0x2323; +constexpr unsigned int mmSQ_PERFCOUNTER1_LO__CI__VI = 0xD1C2; +constexpr unsigned int mmSQ_PERFCOUNTER1_LO__SI = 0x2322; +constexpr unsigned int mmSQ_PERFCOUNTER1_SELECT__CI__VI = 0xD9C1; +constexpr unsigned int mmSQ_PERFCOUNTER1_SELECT__SI = 0x2341; +constexpr unsigned int mmSQ_PERFCOUNTER2_HI__CI__VI = 0xD1C5; +constexpr unsigned int mmSQ_PERFCOUNTER2_HI__SI = 0x2325; +constexpr unsigned int mmSQ_PERFCOUNTER2_LO__CI__VI = 0xD1C4; +constexpr unsigned int mmSQ_PERFCOUNTER2_LO__SI = 0x2324; +constexpr unsigned int mmSQ_PERFCOUNTER2_SELECT__CI__VI = 0xD9C2; +constexpr unsigned int mmSQ_PERFCOUNTER2_SELECT__SI = 0x2342; +constexpr unsigned int mmSQ_PERFCOUNTER3_HI__CI__VI = 0xD1C7; +constexpr unsigned int mmSQ_PERFCOUNTER3_HI__SI = 0x2327; +constexpr unsigned int mmSQ_PERFCOUNTER3_LO__CI__VI = 0xD1C6; +constexpr unsigned int mmSQ_PERFCOUNTER3_LO__SI = 0x2326; +constexpr unsigned int mmSQ_PERFCOUNTER3_SELECT__CI__VI = 0xD9C3; +constexpr unsigned int mmSQ_PERFCOUNTER3_SELECT__SI = 0x2343; +constexpr unsigned int mmSQ_PERFCOUNTER4_HI__CI__VI = 0xD1C9; +constexpr unsigned int mmSQ_PERFCOUNTER4_HI__SI = 0x2329; +constexpr unsigned int mmSQ_PERFCOUNTER4_LO__CI__VI = 0xD1C8; +constexpr unsigned int mmSQ_PERFCOUNTER4_LO__SI = 0x2328; +constexpr unsigned int mmSQ_PERFCOUNTER4_SELECT__CI__VI = 0xD9C4; +constexpr unsigned int mmSQ_PERFCOUNTER4_SELECT__SI = 0x2344; +constexpr unsigned int mmSQ_PERFCOUNTER5_HI__CI__VI = 0xD1CB; +constexpr unsigned int mmSQ_PERFCOUNTER5_HI__SI = 0x232B; +constexpr unsigned int mmSQ_PERFCOUNTER5_LO__CI__VI = 0xD1CA; +constexpr unsigned int mmSQ_PERFCOUNTER5_LO__SI = 0x232A; +constexpr unsigned int mmSQ_PERFCOUNTER5_SELECT__CI__VI = 0xD9C5; +constexpr unsigned int mmSQ_PERFCOUNTER5_SELECT__SI = 0x2345; +constexpr unsigned int mmSQ_PERFCOUNTER6_HI__CI__VI = 0xD1CD; +constexpr unsigned int mmSQ_PERFCOUNTER6_HI__SI = 0x232D; +constexpr unsigned int mmSQ_PERFCOUNTER6_LO__CI__VI = 0xD1CC; +constexpr unsigned int mmSQ_PERFCOUNTER6_LO__SI = 0x232C; +constexpr unsigned int mmSQ_PERFCOUNTER6_SELECT__CI__VI = 0xD9C6; +constexpr unsigned int mmSQ_PERFCOUNTER6_SELECT__SI = 0x2346; +constexpr unsigned int mmSQ_PERFCOUNTER7_HI__CI__VI = 0xD1CF; +constexpr unsigned int mmSQ_PERFCOUNTER7_HI__SI = 0x232F; +constexpr unsigned int mmSQ_PERFCOUNTER7_LO__CI__VI = 0xD1CE; +constexpr unsigned int mmSQ_PERFCOUNTER7_LO__SI = 0x232E; +constexpr unsigned int mmSQ_PERFCOUNTER7_SELECT__CI__VI = 0xD9C7; +constexpr unsigned int mmSQ_PERFCOUNTER7_SELECT__SI = 0x2347; +constexpr unsigned int mmSQ_PERFCOUNTER8_HI__CI__VI = 0xD1D1; +constexpr unsigned int mmSQ_PERFCOUNTER8_HI__SI = 0x2331; +constexpr unsigned int mmSQ_PERFCOUNTER8_LO__CI__VI = 0xD1D0; +constexpr unsigned int mmSQ_PERFCOUNTER8_LO__SI = 0x2330; +constexpr unsigned int mmSQ_PERFCOUNTER8_SELECT__CI__VI = 0xD9C8; +constexpr unsigned int mmSQ_PERFCOUNTER8_SELECT__SI = 0x2348; +constexpr unsigned int mmSQ_PERFCOUNTER9_HI__CI__VI = 0xD1D3; +constexpr unsigned int mmSQ_PERFCOUNTER9_HI__SI = 0x2333; +constexpr unsigned int mmSQ_PERFCOUNTER9_LO__CI__VI = 0xD1D2; +constexpr unsigned int mmSQ_PERFCOUNTER9_LO__SI = 0x2332; +constexpr unsigned int mmSQ_PERFCOUNTER9_SELECT__CI__VI = 0xD9C9; +constexpr unsigned int mmSQ_PERFCOUNTER9_SELECT__SI = 0x2349; +constexpr unsigned int mmSQ_PERFCOUNTER_CTRL2__CI__VI = 0xD9E2; +constexpr unsigned int mmSQ_PERFCOUNTER_CTRL__CI__VI = 0xD9E0; +constexpr unsigned int mmSQ_PERFCOUNTER_CTRL__SI = 0x2306; +constexpr unsigned int mmSQ_PERFCOUNTER_MASK__CI__VI = 0xD9E1; +constexpr unsigned int mmSQ_POWER_THROTTLE2__CI__VI = 0xF092; +constexpr unsigned int mmSQ_POWER_THROTTLE2__SI = 0x2397; +constexpr unsigned int mmSQ_POWER_THROTTLE__CI__VI = 0xF091; +constexpr unsigned int mmSQ_POWER_THROTTLE__SI = 0x2396; +constexpr unsigned int mmSQ_RANDOM_WAVE_PRI = 0x2303; +constexpr unsigned int mmSQ_REG_CREDITS = 0x2304; +constexpr unsigned int mmSQ_REG_TIMESTAMP__CI__VI = 0x2374; +constexpr unsigned int mmSQ_SEC_CNT__SI__CI = 0x23A1; +constexpr unsigned int mmSQ_SMRD__SI__CI = 0x237F; +constexpr unsigned int mmSQ_SOP1 = 0x237F; +constexpr unsigned int mmSQ_SOP2 = 0x237F; +constexpr unsigned int mmSQ_SOPC = 0x237F; +constexpr unsigned int mmSQ_SOPK = 0x237F; +constexpr unsigned int mmSQ_SOPP = 0x237F; +constexpr unsigned int mmSQ_TEX_CLK_CTRL__CI__VI = 0xF08F; +constexpr unsigned int mmSQ_TEX_CLK_CTRL__SI = 0x2361; +constexpr unsigned int mmSQ_THREAD_TRACE_BASE2__CI = 0x2385; +constexpr unsigned int mmSQ_THREAD_TRACE_CNTR = 0x2390; +constexpr unsigned int mmSQ_THREAD_TRACE_TOKEN_MASK2__CI = 0x2386; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_0__CI__VI = 0xC340; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_0__SI = 0x2388; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_1__CI__VI = 0xC341; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_1__SI = 0x2389; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_2__CI__VI = 0xC342; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_2__SI = 0x238A; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_3__CI__VI = 0xC343; +constexpr unsigned int mmSQ_THREAD_TRACE_USERDATA_3__SI = 0x238B; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_CMN = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_EVENT = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_INST = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_INST_PC_1_OF_2 = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_INST_PC_2_OF_2 = 0x23B1; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_INST_USERDATA_1_OF_2 = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_INST_USERDATA_2_OF_2 = 0x23B1; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_ISSUE = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_MISC = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_PERF_1_OF_2 = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_PERF_2_OF_2 = 0x23B1; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_REG_1_OF_2 = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_REG_2_OF_2 = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_REG_CS_1_OF_2__CI__VI = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_REG_CS_2_OF_2__CI__VI = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_TIMESTAMP_1_OF_2 = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_TIMESTAMP_2_OF_2 = 0x23B1; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_TIME__SI = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_WAVE = 0x23B0; +constexpr unsigned int mmSQ_THREAD_TRACE_WORD_WAVE_START = 0x23B0; +constexpr unsigned int mmSQ_TIME_HI = 0x237C; +constexpr unsigned int mmSQ_TIME_LO = 0x237D; +constexpr unsigned int mmSQ_VINTRP = 0x237F; +constexpr unsigned int mmSQ_VOP1 = 0x237F; +constexpr unsigned int mmSQ_VOP2 = 0x237F; +constexpr unsigned int mmSQ_VOP3_0 = 0x237F; +constexpr unsigned int mmSQ_VOP3_0_SDST_ENC = 0x237F; +constexpr unsigned int mmSQ_VOP3_1 = 0x237F; +constexpr unsigned int mmSQ_VOPC = 0x237F; +constexpr unsigned int mmSRBM_CHIP_REVISION = 0x039B; +constexpr unsigned int mmSRBM_CNTL = 0x0390; +constexpr unsigned int mmSRBM_DEBUG = 0x03A4; +constexpr unsigned int mmSRBM_DEBUG_CNTL = 0x0399; +constexpr unsigned int mmSRBM_DEBUG_DATA = 0x039A; +constexpr unsigned int mmSRBM_DEBUG_SNAPSHOT = 0x03A5; +constexpr unsigned int mmSRBM_GFX_CNTL = 0x0391; +constexpr unsigned int mmSRBM_INT_ACK = 0x03AA; +constexpr unsigned int mmSRBM_INT_CNTL = 0x03A8; +constexpr unsigned int mmSRBM_INT_STATUS = 0x03A9; +constexpr unsigned int mmSRBM_MC_CLKEN_CNTL__CI__VI = 0x03B3; +constexpr unsigned int mmSRBM_READ_ERROR = 0x03A6; +constexpr unsigned int mmSRBM_SAM_CLKEN_CNTL__CI__VI = 0x03B8; +constexpr unsigned int mmSRBM_SDMA_CLKEN_CNTL__CI__VI = 0x03B7; +constexpr unsigned int mmSRBM_SOFT_RESET = 0x0398; +constexpr unsigned int mmSRBM_STATUS = 0x0394; +constexpr unsigned int mmSRBM_STATUS2 = 0x0393; +constexpr unsigned int mmSRBM_SYS_CLKEN_CNTL = 0x03B4; +constexpr unsigned int mmSRBM_UVD_CLKEN_CNTL = 0x03B6; +constexpr unsigned int mmSRBM_VCE_CLKEN_CNTL = 0x03B5; +constexpr unsigned int mmSX_DEBUG_1 = 0x2418; +constexpr unsigned int mmSX_DEBUG_BUSY = 0x2414; +constexpr unsigned int mmSX_DEBUG_BUSY_2 = 0x2415; +constexpr unsigned int mmSX_DEBUG_BUSY_3 = 0x2416; +constexpr unsigned int mmSX_DEBUG_BUSY_4 = 0x2417; +constexpr unsigned int mmSX_PERFCOUNTER0_HI__CI__VI = 0xD241; +constexpr unsigned int mmSX_PERFCOUNTER0_HI__SI = 0x2421; +constexpr unsigned int mmSX_PERFCOUNTER0_LO__CI__VI = 0xD240; +constexpr unsigned int mmSX_PERFCOUNTER0_LO__SI = 0x2420; +constexpr unsigned int mmSX_PERFCOUNTER0_SELECT1__CI__VI = 0xDA44; +constexpr unsigned int mmSX_PERFCOUNTER0_SELECT__CI__VI = 0xDA40; +constexpr unsigned int mmSX_PERFCOUNTER0_SELECT__SI = 0x241C; +constexpr unsigned int mmSX_PERFCOUNTER1_HI__CI__VI = 0xD243; +constexpr unsigned int mmSX_PERFCOUNTER1_HI__SI = 0x2423; +constexpr unsigned int mmSX_PERFCOUNTER1_LO__CI__VI = 0xD242; +constexpr unsigned int mmSX_PERFCOUNTER1_LO__SI = 0x2422; +constexpr unsigned int mmSX_PERFCOUNTER1_SELECT1__CI__VI = 0xDA45; +constexpr unsigned int mmSX_PERFCOUNTER1_SELECT__CI__VI = 0xDA41; +constexpr unsigned int mmSX_PERFCOUNTER1_SELECT__SI = 0x241D; +constexpr unsigned int mmSX_PERFCOUNTER2_HI__CI__VI = 0xD245; +constexpr unsigned int mmSX_PERFCOUNTER2_HI__SI = 0x2425; +constexpr unsigned int mmSX_PERFCOUNTER2_LO__CI__VI = 0xD244; +constexpr unsigned int mmSX_PERFCOUNTER2_LO__SI = 0x2424; +constexpr unsigned int mmSX_PERFCOUNTER2_SELECT__CI__VI = 0xDA42; +constexpr unsigned int mmSX_PERFCOUNTER2_SELECT__SI = 0x241E; +constexpr unsigned int mmSX_PERFCOUNTER3_HI__CI__VI = 0xD247; +constexpr unsigned int mmSX_PERFCOUNTER3_HI__SI = 0x2427; +constexpr unsigned int mmSX_PERFCOUNTER3_LO__CI__VI = 0xD246; +constexpr unsigned int mmSX_PERFCOUNTER3_LO__SI = 0x2426; +constexpr unsigned int mmSX_PERFCOUNTER3_SELECT__CI__VI = 0xDA43; +constexpr unsigned int mmSX_PERFCOUNTER3_SELECT__SI = 0x241F; +constexpr unsigned int mmTARGET_AND_CURRENT_PROFILE_INDEX_1__SI = 0x021D; +constexpr unsigned int mmTARGET_AND_CURRENT_PROFILE_INDEX__SI = 0x01E6; +constexpr unsigned int mmTA_BC_BASE_ADDR = 0xA020; +constexpr unsigned int mmTA_BC_BASE_ADDR_HI__CI__VI = 0xA021; +constexpr unsigned int mmTA_CGTT_CTRL__CI__VI = 0xF09D; +constexpr unsigned int mmTA_CGTT_CTRL__SI = 0x2544; +constexpr unsigned int mmTA_CNTL = 0x2541; +constexpr unsigned int mmTA_CNTL_AUX = 0x2542; +constexpr unsigned int mmTA_CS_BC_BASE_ADDR_HI__CI__VI = 0xC381; +constexpr unsigned int mmTA_CS_BC_BASE_ADDR__CI__VI = 0xC380; +constexpr unsigned int mmTA_CS_BC_BASE_ADDR__SI = 0x2543; +constexpr unsigned int mmTA_DEBUG_DATA = 0x254D; +constexpr unsigned int mmTA_DEBUG_INDEX = 0x254C; +constexpr unsigned int mmTA_PERFCOUNTER0_HI__CI__VI = 0xD2C1; +constexpr unsigned int mmTA_PERFCOUNTER0_HI__SI = 0x2556; +constexpr unsigned int mmTA_PERFCOUNTER0_LO__CI__VI = 0xD2C0; +constexpr unsigned int mmTA_PERFCOUNTER0_LO__SI = 0x2555; +constexpr unsigned int mmTA_PERFCOUNTER0_SELECT1__CI__VI = 0xDAC1; +constexpr unsigned int mmTA_PERFCOUNTER0_SELECT__CI__VI = 0xDAC0; +constexpr unsigned int mmTA_PERFCOUNTER0_SELECT__SI = 0x2554; +constexpr unsigned int mmTA_PERFCOUNTER1_HI__CI__VI = 0xD2C3; +constexpr unsigned int mmTA_PERFCOUNTER1_HI__SI = 0x2562; +constexpr unsigned int mmTA_PERFCOUNTER1_LO__CI__VI = 0xD2C2; +constexpr unsigned int mmTA_PERFCOUNTER1_LO__SI = 0x2561; +constexpr unsigned int mmTA_PERFCOUNTER1_SELECT__CI__VI = 0xDAC2; +constexpr unsigned int mmTA_PERFCOUNTER1_SELECT__SI = 0x2560; +constexpr unsigned int mmTA_RESERVED_010C__CI__VI = 0x2543; +constexpr unsigned int mmTA_SCRATCH = 0x2564; +constexpr unsigned int mmTA_STATUS = 0x2548; +constexpr unsigned int mmTCA_CGTT_SCLK_CTRL__CI__VI = 0xF0AD; +constexpr unsigned int mmTCA_CGTT_SCLK_CTRL__SI = 0x2BC1; +constexpr unsigned int mmTCA_CTRL = 0x2BC0; +constexpr unsigned int mmTCA_PERFCOUNTER0_HI__CI__VI = 0xD391; +constexpr unsigned int mmTCA_PERFCOUNTER0_HI__SI = 0x2BD2; +constexpr unsigned int mmTCA_PERFCOUNTER0_LO__CI__VI = 0xD390; +constexpr unsigned int mmTCA_PERFCOUNTER0_LO__SI = 0x2BD1; +constexpr unsigned int mmTCA_PERFCOUNTER0_SELECT1__CI__VI = 0xDB91; +constexpr unsigned int mmTCA_PERFCOUNTER0_SELECT__CI__VI = 0xDB90; +constexpr unsigned int mmTCA_PERFCOUNTER0_SELECT__SI = 0x2BD0; +constexpr unsigned int mmTCA_PERFCOUNTER1_HI__CI__VI = 0xD393; +constexpr unsigned int mmTCA_PERFCOUNTER1_HI__SI = 0x2BD5; +constexpr unsigned int mmTCA_PERFCOUNTER1_LO__CI__VI = 0xD392; +constexpr unsigned int mmTCA_PERFCOUNTER1_LO__SI = 0x2BD4; +constexpr unsigned int mmTCA_PERFCOUNTER1_SELECT1__CI__VI = 0xDB93; +constexpr unsigned int mmTCA_PERFCOUNTER1_SELECT__CI__VI = 0xDB92; +constexpr unsigned int mmTCA_PERFCOUNTER1_SELECT__SI = 0x2BD3; +constexpr unsigned int mmTCA_PERFCOUNTER2_HI__CI__VI = 0xD395; +constexpr unsigned int mmTCA_PERFCOUNTER2_HI__SI = 0x2BD8; +constexpr unsigned int mmTCA_PERFCOUNTER2_LO__CI__VI = 0xD394; +constexpr unsigned int mmTCA_PERFCOUNTER2_LO__SI = 0x2BD7; +constexpr unsigned int mmTCA_PERFCOUNTER2_SELECT__CI__VI = 0xDB94; +constexpr unsigned int mmTCA_PERFCOUNTER2_SELECT__SI = 0x2BD6; +constexpr unsigned int mmTCA_PERFCOUNTER3_HI__CI__VI = 0xD397; +constexpr unsigned int mmTCA_PERFCOUNTER3_HI__SI = 0x2BDB; +constexpr unsigned int mmTCA_PERFCOUNTER3_LO__CI__VI = 0xD396; +constexpr unsigned int mmTCA_PERFCOUNTER3_LO__SI = 0x2BDA; +constexpr unsigned int mmTCA_PERFCOUNTER3_SELECT__CI__VI = 0xDB95; +constexpr unsigned int mmTCA_PERFCOUNTER3_SELECT__SI = 0x2BD9; +constexpr unsigned int mmTCC_CGTT_SCLK_CTRL__CI__VI = 0xF0AC; +constexpr unsigned int mmTCC_CGTT_SCLK_CTRL__SI = 0x2B81; +constexpr unsigned int mmTCC_CTRL = 0x2B80; +constexpr unsigned int mmTCC_EDC_COUNTER__SI__CI = 0x2B82; +constexpr unsigned int mmTCC_PERFCOUNTER0_HI__CI__VI = 0xD381; +constexpr unsigned int mmTCC_PERFCOUNTER0_HI__SI = 0x2B92; +constexpr unsigned int mmTCC_PERFCOUNTER0_LO__CI__VI = 0xD380; +constexpr unsigned int mmTCC_PERFCOUNTER0_LO__SI = 0x2B91; +constexpr unsigned int mmTCC_PERFCOUNTER0_SELECT1__CI__VI = 0xDB81; +constexpr unsigned int mmTCC_PERFCOUNTER0_SELECT__CI__VI = 0xDB80; +constexpr unsigned int mmTCC_PERFCOUNTER0_SELECT__SI = 0x2B90; +constexpr unsigned int mmTCC_PERFCOUNTER1_HI__CI__VI = 0xD383; +constexpr unsigned int mmTCC_PERFCOUNTER1_HI__SI = 0x2B95; +constexpr unsigned int mmTCC_PERFCOUNTER1_LO__CI__VI = 0xD382; +constexpr unsigned int mmTCC_PERFCOUNTER1_LO__SI = 0x2B94; +constexpr unsigned int mmTCC_PERFCOUNTER1_SELECT1__CI__VI = 0xDB83; +constexpr unsigned int mmTCC_PERFCOUNTER1_SELECT__CI__VI = 0xDB82; +constexpr unsigned int mmTCC_PERFCOUNTER1_SELECT__SI = 0x2B93; +constexpr unsigned int mmTCC_PERFCOUNTER2_HI__CI__VI = 0xD385; +constexpr unsigned int mmTCC_PERFCOUNTER2_HI__SI = 0x2B98; +constexpr unsigned int mmTCC_PERFCOUNTER2_LO__CI__VI = 0xD384; +constexpr unsigned int mmTCC_PERFCOUNTER2_LO__SI = 0x2B97; +constexpr unsigned int mmTCC_PERFCOUNTER2_SELECT__CI__VI = 0xDB84; +constexpr unsigned int mmTCC_PERFCOUNTER2_SELECT__SI = 0x2B96; +constexpr unsigned int mmTCC_PERFCOUNTER3_HI__CI__VI = 0xD387; +constexpr unsigned int mmTCC_PERFCOUNTER3_HI__SI = 0x2B9B; +constexpr unsigned int mmTCC_PERFCOUNTER3_LO__CI__VI = 0xD386; +constexpr unsigned int mmTCC_PERFCOUNTER3_LO__SI = 0x2B9A; +constexpr unsigned int mmTCC_PERFCOUNTER3_SELECT__CI__VI = 0xDB85; +constexpr unsigned int mmTCC_PERFCOUNTER3_SELECT__SI = 0x2B99; +constexpr unsigned int mmTCC_REDUNDANCY__CI__VI = 0x2B83; +constexpr unsigned int mmTCI_CNTL_1 = 0x2B62; +constexpr unsigned int mmTCI_CNTL_2 = 0x2B63; +constexpr unsigned int mmTCI_STATUS = 0x2B61; +constexpr unsigned int mmTCP_ADDR_CONFIG = 0x2B05; +constexpr unsigned int mmTCP_BUFFER_ADDR_HASH_CNTL = 0x2B16; +constexpr unsigned int mmTCP_CHAN_STEER_HI = 0x2B04; +constexpr unsigned int mmTCP_CHAN_STEER_LO = 0x2B03; +constexpr unsigned int mmTCP_CNTL = 0x2B02; +constexpr unsigned int mmTCP_CREDIT = 0x2B06; +constexpr unsigned int mmTCP_EDC_COUNTER__SI__CI = 0x2B17; +constexpr unsigned int mmTCP_INVALIDATE = 0x2B00; +constexpr unsigned int mmTCP_PERFCOUNTER0_HI__CI__VI = 0xD341; +constexpr unsigned int mmTCP_PERFCOUNTER0_HI__SI = 0x2B0A; +constexpr unsigned int mmTCP_PERFCOUNTER0_LO__CI__VI = 0xD340; +constexpr unsigned int mmTCP_PERFCOUNTER0_LO__SI = 0x2B0B; +constexpr unsigned int mmTCP_PERFCOUNTER0_SELECT1__CI__VI = 0xDB41; +constexpr unsigned int mmTCP_PERFCOUNTER0_SELECT__CI__VI = 0xDB40; +constexpr unsigned int mmTCP_PERFCOUNTER0_SELECT__SI = 0x2B09; +constexpr unsigned int mmTCP_PERFCOUNTER1_HI__CI__VI = 0xD343; +constexpr unsigned int mmTCP_PERFCOUNTER1_HI__SI = 0x2B0D; +constexpr unsigned int mmTCP_PERFCOUNTER1_LO__CI__VI = 0xD342; +constexpr unsigned int mmTCP_PERFCOUNTER1_LO__SI = 0x2B0E; +constexpr unsigned int mmTCP_PERFCOUNTER1_SELECT1__CI__VI = 0xDB43; +constexpr unsigned int mmTCP_PERFCOUNTER1_SELECT__CI__VI = 0xDB42; +constexpr unsigned int mmTCP_PERFCOUNTER1_SELECT__SI = 0x2B0C; +constexpr unsigned int mmTCP_PERFCOUNTER2_HI__CI__VI = 0xD345; +constexpr unsigned int mmTCP_PERFCOUNTER2_HI__SI = 0x2B10; +constexpr unsigned int mmTCP_PERFCOUNTER2_LO__CI__VI = 0xD344; +constexpr unsigned int mmTCP_PERFCOUNTER2_LO__SI = 0x2B11; +constexpr unsigned int mmTCP_PERFCOUNTER2_SELECT__CI__VI = 0xDB44; +constexpr unsigned int mmTCP_PERFCOUNTER2_SELECT__SI = 0x2B0F; +constexpr unsigned int mmTCP_PERFCOUNTER3_HI__CI__VI = 0xD347; +constexpr unsigned int mmTCP_PERFCOUNTER3_HI__SI = 0x2B13; +constexpr unsigned int mmTCP_PERFCOUNTER3_LO__CI__VI = 0xD346; +constexpr unsigned int mmTCP_PERFCOUNTER3_LO__SI = 0x2B14; +constexpr unsigned int mmTCP_PERFCOUNTER3_SELECT__CI__VI = 0xDB45; +constexpr unsigned int mmTCP_PERFCOUNTER3_SELECT__SI = 0x2B12; +constexpr unsigned int mmTCP_STATUS = 0x2B01; +constexpr unsigned int mmTCP_WATCH0_ADDR_H__CI__VI = 0x32A0; +constexpr unsigned int mmTCP_WATCH0_ADDR_L__CI__VI = 0x32A1; +constexpr unsigned int mmTCP_WATCH0_CNTL__CI__VI = 0x32A2; +constexpr unsigned int mmTCP_WATCH1_ADDR_H__CI__VI = 0x32A3; +constexpr unsigned int mmTCP_WATCH1_ADDR_L__CI__VI = 0x32A4; +constexpr unsigned int mmTCP_WATCH1_CNTL__CI__VI = 0x32A5; +constexpr unsigned int mmTCP_WATCH2_ADDR_H__CI__VI = 0x32A6; +constexpr unsigned int mmTCP_WATCH2_ADDR_L__CI__VI = 0x32A7; +constexpr unsigned int mmTCP_WATCH2_CNTL__CI__VI = 0x32A8; +constexpr unsigned int mmTCP_WATCH3_ADDR_H__CI__VI = 0x32A9; +constexpr unsigned int mmTCP_WATCH3_ADDR_L__CI__VI = 0x32AA; +constexpr unsigned int mmTCP_WATCH3_CNTL__CI__VI = 0x32AB; +constexpr unsigned int mmTCS_CGTT_SCLK_CTRL__CI = 0xF0AE; +constexpr unsigned int mmTCS_CTRL__CI = 0x2BE0; +constexpr unsigned int mmTCS_PERFCOUNTER0_HI__CI = 0xD3A1; +constexpr unsigned int mmTCS_PERFCOUNTER0_LO__CI = 0xD3A0; +constexpr unsigned int mmTCS_PERFCOUNTER0_SELECT1__CI = 0xDBA1; +constexpr unsigned int mmTCS_PERFCOUNTER0_SELECT__CI = 0xDBA0; +constexpr unsigned int mmTCS_PERFCOUNTER1_HI__CI = 0xD3A3; +constexpr unsigned int mmTCS_PERFCOUNTER1_LO__CI = 0xD3A2; +constexpr unsigned int mmTCS_PERFCOUNTER1_SELECT__CI = 0xDBA2; +constexpr unsigned int mmTCS_PERFCOUNTER2_HI__CI = 0xD3A5; +constexpr unsigned int mmTCS_PERFCOUNTER2_LO__CI = 0xD3A4; +constexpr unsigned int mmTCS_PERFCOUNTER2_SELECT__CI = 0xDBA3; +constexpr unsigned int mmTCS_PERFCOUNTER3_HI__CI = 0xD3A7; +constexpr unsigned int mmTCS_PERFCOUNTER3_LO__CI = 0xD3A6; +constexpr unsigned int mmTCS_PERFCOUNTER3_SELECT__CI = 0xDBA4; +constexpr unsigned int mmTC_CFG_L1_LOAD_POLICY0__CI__VI = 0x2B1A; +constexpr unsigned int mmTC_CFG_L1_LOAD_POLICY1__CI__VI = 0x2B1B; +constexpr unsigned int mmTC_CFG_L1_STORE_POLICY__CI__VI = 0x2B1C; +constexpr unsigned int mmTC_CFG_L1_VOLATILE__CI__VI = 0x2B22; +constexpr unsigned int mmTC_CFG_L2_ATOMIC_POLICY__CI__VI = 0x2B21; +constexpr unsigned int mmTC_CFG_L2_LOAD_POLICY0__CI__VI = 0x2B1D; +constexpr unsigned int mmTC_CFG_L2_LOAD_POLICY1__CI__VI = 0x2B1E; +constexpr unsigned int mmTC_CFG_L2_STORE_POLICY0__CI__VI = 0x2B1F; +constexpr unsigned int mmTC_CFG_L2_STORE_POLICY1__CI__VI = 0x2B20; +constexpr unsigned int mmTC_CFG_L2_VOLATILE__CI__VI = 0x2B23; +constexpr unsigned int mmTD_CGTT_CTRL__CI__VI = 0xF09C; +constexpr unsigned int mmTD_CGTT_CTRL__SI = 0x2527; +constexpr unsigned int mmTD_CNTL = 0x2525; +constexpr unsigned int mmTD_DEBUG_DATA = 0x2529; +constexpr unsigned int mmTD_DEBUG_INDEX = 0x2528; +constexpr unsigned int mmTD_PERFCOUNTER0_HI__CI__VI = 0xD301; +constexpr unsigned int mmTD_PERFCOUNTER0_HI__SI = 0x252E; +constexpr unsigned int mmTD_PERFCOUNTER0_LO__CI__VI = 0xD300; +constexpr unsigned int mmTD_PERFCOUNTER0_LO__SI = 0x252D; +constexpr unsigned int mmTD_PERFCOUNTER0_SELECT1__CI__VI = 0xDB01; +constexpr unsigned int mmTD_PERFCOUNTER0_SELECT__CI__VI = 0xDB00; +constexpr unsigned int mmTD_PERFCOUNTER0_SELECT__SI = 0x252C; +constexpr unsigned int mmTD_PERFCOUNTER1_HI__CI__VI = 0xD303; +constexpr unsigned int mmTD_PERFCOUNTER1_LO__CI__VI = 0xD302; +constexpr unsigned int mmTD_PERFCOUNTER1_SELECT__CI__VI = 0xDB02; +constexpr unsigned int mmTD_SCRATCH__CI__VI = 0x2533; +constexpr unsigned int mmTD_SCRATCH__SI = 0x2530; +constexpr unsigned int mmTD_STATUS = 0x2526; +constexpr unsigned int mmTHM_CLK_CNTL__SI = 0x019A; +constexpr unsigned int mmTMDS_CNTL__SI = 0x1C7C; +constexpr unsigned int mmTMDS_CONTROL0_FEEDBACK__SI = 0x1C7E; +constexpr unsigned int mmTMDS_CONTROL_CHAR__SI = 0x1C7D; +constexpr unsigned int mmTMDS_CTL0_1_GEN_CNTL__SI = 0x1C86; +constexpr unsigned int mmTMDS_CTL2_3_GEN_CNTL__SI = 0x1C87; +constexpr unsigned int mmTMDS_CTL_BITS__SI = 0x1C83; +constexpr unsigned int mmTMDS_DCBALANCER_CONTROL__SI = 0x1C84; +constexpr unsigned int mmTMDS_DEBUG__SI = 0x1C82; +constexpr unsigned int mmTMDS_STEREOSYNC_CTL_SEL__SI = 0x1C7F; +constexpr unsigned int mmTMDS_SYNC_CHAR_PATTERN_0_1__SI = 0x1C80; +constexpr unsigned int mmTMDS_SYNC_CHAR_PATTERN_2_3__SI = 0x1C81; +constexpr unsigned int mmUNIPHY_DATA_SYNCHRONIZATION__SI = 0x1984; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKA__SI = 0x1947; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKB__SI = 0x1948; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKC__SI = 0x194D; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKD__SI = 0x194E; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKE__SI = 0x1950; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKF__SI = 0x1951; +constexpr unsigned int mmUNIPHY_IMPCAL_PERIOD__SI = 0x1949; +constexpr unsigned int mmUNIPHY_REG_TEST_OUTPUT__SI = 0x1986; +constexpr unsigned int mmUSER_SQC_BANK_DISABLE = 0x2308; +constexpr unsigned int mmUVD_CGC_CTRL__SI__VI = 0x3D2C; +constexpr unsigned int mmUVD_CGC_GATE__SI__VI = 0x3D2A; +constexpr unsigned int mmUVD_CGC_STATUS__SI__VI = 0x3D2B; +constexpr unsigned int mmUVD_CONFIG__CI__VI = 0x0F93; +constexpr unsigned int mmUVD_CONFIG__SI = 0x0F98; +constexpr unsigned int mmUVD_CONTEXT_ID__SI__VI = 0x3DBD; +constexpr unsigned int mmUVD_CTX_DATA__SI__VI = 0x3D29; +constexpr unsigned int mmUVD_CTX_INDEX__SI__VI = 0x3D28; +constexpr unsigned int mmUVD_ENGINE_CNTL__SI__VI = 0x3BC6; +constexpr unsigned int mmUVD_GPCOM_VCPU_CMD__SI__VI = 0x3BC3; +constexpr unsigned int mmUVD_GPCOM_VCPU_DATA0__SI__VI = 0x3BC4; +constexpr unsigned int mmUVD_GPCOM_VCPU_DATA1__SI__VI = 0x3BC5; +constexpr unsigned int mmUVD_LMI_ADDR_EXT__SI__VI = 0x3D65; +constexpr unsigned int mmUVD_LMI_CTRL2__SI__VI = 0x3D3D; +constexpr unsigned int mmUVD_LMI_CTRL__SI__VI = 0x3D66; +constexpr unsigned int mmUVD_LMI_EXT40_ADDR__SI__VI = 0x3D26; +constexpr unsigned int mmUVD_LMI_STATUS__SI__VI = 0x3D67; +constexpr unsigned int mmUVD_LMI_SWAP_CNTL__SI__VI = 0x3D6D; +constexpr unsigned int mmUVD_MASTINT_EN__SI__VI = 0x3D40; +constexpr unsigned int mmUVD_MPC_CNTL__SI__VI = 0x3D77; +constexpr unsigned int mmUVD_MPC_SET_ALU__SI__VI = 0x3D7E; +constexpr unsigned int mmUVD_MPC_SET_MUXA0__SI__VI = 0x3D79; +constexpr unsigned int mmUVD_MPC_SET_MUXA1__SI__VI = 0x3D7A; +constexpr unsigned int mmUVD_MPC_SET_MUXB0__SI__VI = 0x3D7B; +constexpr unsigned int mmUVD_MPC_SET_MUXB1__SI__VI = 0x3D7C; +constexpr unsigned int mmUVD_MPC_SET_MUX__SI__VI = 0x3D7D; +constexpr unsigned int mmUVD_MP_SWAP_CNTL__SI__VI = 0x3D6F; +constexpr unsigned int mmUVD_RBC_IB_BASE__SI = 0x3DA1; +constexpr unsigned int mmUVD_RBC_IB_SIZE__SI__VI = 0x3DA2; +constexpr unsigned int mmUVD_RBC_RB_BASE__SI = 0x3DA3; +constexpr unsigned int mmUVD_RBC_RB_CNTL__SI__VI = 0x3DA9; +constexpr unsigned int mmUVD_RBC_RB_RPTR_ADDR__SI__VI = 0x3DAA; +constexpr unsigned int mmUVD_RBC_RB_RPTR__SI__VI = 0x3DA4; +constexpr unsigned int mmUVD_RBC_RB_WPTR__SI__VI = 0x3DA5; +constexpr unsigned int mmUVD_SEMA_ADDR_HIGH__SI__VI = 0x3BC1; +constexpr unsigned int mmUVD_SEMA_ADDR_LOW__SI__VI = 0x3BC0; +constexpr unsigned int mmUVD_SEMA_CMD__SI__VI = 0x3BC2; +constexpr unsigned int mmUVD_SEMA_CNTL__SI__VI = 0x3D00; +constexpr unsigned int mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__SI__VI = 0x3DB3; +constexpr unsigned int mmUVD_SEMA_TIMEOUT_STATUS__SI__VI = 0x3DB0; +constexpr unsigned int mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__SI__VI = 0x3DB2; +constexpr unsigned int mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__SI__VI = 0x3DB1; +constexpr unsigned int mmUVD_SOFT_RESET__SI__VI = 0x3DA0; +constexpr unsigned int mmUVD_STATUS__SI__VI = 0x3DAF; +constexpr unsigned int mmUVD_VCPU_CACHE_OFFSET0__SI__VI = 0x3D82; +constexpr unsigned int mmUVD_VCPU_CACHE_OFFSET1__SI__VI = 0x3D84; +constexpr unsigned int mmUVD_VCPU_CACHE_OFFSET2__SI__VI = 0x3D86; +constexpr unsigned int mmUVD_VCPU_CACHE_SIZE0__SI__VI = 0x3D83; +constexpr unsigned int mmUVD_VCPU_CACHE_SIZE1__SI__VI = 0x3D85; +constexpr unsigned int mmUVD_VCPU_CACHE_SIZE2__SI__VI = 0x3D87; +constexpr unsigned int mmUVD_VCPU_CNTL__SI__VI = 0x3D98; +constexpr unsigned int mmVBLANK_STATUS__SI = 0x1AEF; +constexpr unsigned int mmVCE_CONFIG__CI__VI = 0x0F94; +constexpr unsigned int mmVGA25_PPLL_FB_DIV__SI = 0x00DE; +constexpr unsigned int mmVGA25_PPLL_POST_DIV__SI = 0x00E2; +constexpr unsigned int mmVGA25_PPLL_REF_DIV__SI = 0x00D9; +constexpr unsigned int mmVGA28_PPLL_FB_DIV__SI = 0x00DF; +constexpr unsigned int mmVGA28_PPLL_POST_DIV__SI = 0x00E4; +constexpr unsigned int mmVGA28_PPLL_REF_DIV__SI = 0x00DB; +constexpr unsigned int mmVGA41_PPLL_FB_DIV__SI = 0x00E0; +constexpr unsigned int mmVGA41_PPLL_POST_DIV__SI = 0x00E6; +constexpr unsigned int mmVGA41_PPLL_REF_DIV__SI = 0x00DD; +constexpr unsigned int mmVGA_CACHE_CONTROL__SI__VI = 0x00CB; +constexpr unsigned int mmVGA_DEBUG_READBACK_DATA__SI__VI = 0x00D7; +constexpr unsigned int mmVGA_DEBUG_READBACK_INDEX__SI__VI = 0x00D6; +constexpr unsigned int mmVGA_DISPBUF1_SURFACE_ADDR__SI__VI = 0x00C6; +constexpr unsigned int mmVGA_DISPBUF2_SURFACE_ADDR__SI__VI = 0x00C8; +constexpr unsigned int mmVGA_HDP_CONTROL__SI__VI = 0x00CA; +constexpr unsigned int mmVGA_HW_DEBUG__SI__VI = 0x00CF; +constexpr unsigned int mmVGA_INTERRUPT_CONTROL__SI__VI = 0x00D1; +constexpr unsigned int mmVGA_INTERRUPT_STATUS__SI__VI = 0x00D3; +constexpr unsigned int mmVGA_MAIN_CONTROL__SI__VI = 0x00D4; +constexpr unsigned int mmVGA_MEMORY_BASE_ADDRESS_HIGH__SI__VI = 0x00C9; +constexpr unsigned int mmVGA_MEMORY_BASE_ADDRESS__SI__VI = 0x00C4; +constexpr unsigned int mmVGA_MEM_READ_PAGE_ADDR__SI__VI = 0x0013; +constexpr unsigned int mmVGA_MEM_WRITE_PAGE_ADDR__SI__VI = 0x0012; +constexpr unsigned int mmVGA_MODE_CONTROL__SI__VI = 0x00C2; +constexpr unsigned int mmVGA_RENDER_CONTROL__SI__VI = 0x00C0; +constexpr unsigned int mmVGA_SEQUENCER_RESET_CONTROL__SI__VI = 0x00C1; +constexpr unsigned int mmVGA_SOURCE_SELECT__SI__VI = 0x00FC; +constexpr unsigned int mmVGA_STATUS_CLEAR__SI__VI = 0x00D2; +constexpr unsigned int mmVGA_STATUS__SI__VI = 0x00D0; +constexpr unsigned int mmVGA_SURFACE_PITCH_SELECT__SI__VI = 0x00C3; +constexpr unsigned int mmVGA_TEST_CONTROL__SI__VI = 0x00D5; +constexpr unsigned int mmVGA_TEST_DEBUG_DATA__SI__VI = 0x00C7; +constexpr unsigned int mmVGA_TEST_DEBUG_INDEX__SI__VI = 0x00C5; +constexpr unsigned int mmVGT_CACHE_INVALIDATION = 0x2231; +constexpr unsigned int mmVGT_CNTL_STATUS = 0x223C; +constexpr unsigned int mmVGT_DEBUG_CNTL = 0x2238; +constexpr unsigned int mmVGT_DEBUG_DATA = 0x2239; +constexpr unsigned int mmVGT_DMA_BASE = 0xA1FA; +constexpr unsigned int mmVGT_DMA_BASE_HI = 0xA1F9; +constexpr unsigned int mmVGT_DMA_CONTROL__CI__VI = 0x2272; +constexpr unsigned int mmVGT_DMA_DATA_FIFO_DEPTH = 0x222D; +constexpr unsigned int mmVGT_DMA_INDEX_TYPE = 0xA29F; +constexpr unsigned int mmVGT_DMA_LS_HS_CONFIG__CI__VI = 0x2273; +constexpr unsigned int mmVGT_DMA_MAX_SIZE = 0xA29E; +constexpr unsigned int mmVGT_DMA_NUM_INSTANCES = 0xA2A2; +constexpr unsigned int mmVGT_DMA_PRIMITIVE_TYPE__CI__VI = 0x2271; +constexpr unsigned int mmVGT_DMA_REQ_FIFO_DEPTH = 0x222E; +constexpr unsigned int mmVGT_DMA_SIZE = 0xA29D; +constexpr unsigned int mmVGT_DRAW_INITIATOR = 0xA1FC; +constexpr unsigned int mmVGT_DRAW_INIT_FIFO_DEPTH = 0x222F; +constexpr unsigned int mmVGT_ENHANCE = 0xA294; +constexpr unsigned int mmVGT_ESGS_RING_ITEMSIZE = 0xA2AB; +constexpr unsigned int mmVGT_ESGS_RING_SIZE__CI__VI = 0xC240; +constexpr unsigned int mmVGT_ESGS_RING_SIZE__SI = 0x2232; +constexpr unsigned int mmVGT_ES_PER_GS = 0xA296; +constexpr unsigned int mmVGT_EVENT_ADDRESS_REG = 0xA1FE; +constexpr unsigned int mmVGT_EVENT_INITIATOR = 0xA2A4; +constexpr unsigned int mmVGT_FIFO_DEPTHS = 0x2234; +constexpr unsigned int mmVGT_GROUP_DECR = 0xA28B; +constexpr unsigned int mmVGT_GROUP_FIRST_DECR = 0xA28A; +constexpr unsigned int mmVGT_GROUP_PRIM_TYPE = 0xA289; +constexpr unsigned int mmVGT_GROUP_VECT_0_CNTL = 0xA28C; +constexpr unsigned int mmVGT_GROUP_VECT_0_FMT_CNTL = 0xA28E; +constexpr unsigned int mmVGT_GROUP_VECT_1_CNTL = 0xA28D; +constexpr unsigned int mmVGT_GROUP_VECT_1_FMT_CNTL = 0xA28F; +constexpr unsigned int mmVGT_GSVS_RING_ITEMSIZE = 0xA2AC; +constexpr unsigned int mmVGT_GSVS_RING_OFFSET_1 = 0xA298; +constexpr unsigned int mmVGT_GSVS_RING_OFFSET_2 = 0xA299; +constexpr unsigned int mmVGT_GSVS_RING_OFFSET_3 = 0xA29A; +constexpr unsigned int mmVGT_GSVS_RING_SIZE__CI__VI = 0xC241; +constexpr unsigned int mmVGT_GSVS_RING_SIZE__SI = 0x2233; +constexpr unsigned int mmVGT_GS_INSTANCE_CNT = 0xA2E4; +constexpr unsigned int mmVGT_GS_MAX_VERT_OUT = 0xA2CE; +constexpr unsigned int mmVGT_GS_MODE = 0xA290; +constexpr unsigned int mmVGT_GS_ONCHIP_CNTL__CI__VI = 0xA291; +constexpr unsigned int mmVGT_GS_OUT_PRIM_TYPE = 0xA29B; +constexpr unsigned int mmVGT_GS_PER_ES = 0xA295; +constexpr unsigned int mmVGT_GS_PER_VS = 0xA297; +constexpr unsigned int mmVGT_GS_VERTEX_REUSE = 0x2235; +constexpr unsigned int mmVGT_GS_VERT_ITEMSIZE = 0xA2D7; +constexpr unsigned int mmVGT_GS_VERT_ITEMSIZE_1 = 0xA2D8; +constexpr unsigned int mmVGT_GS_VERT_ITEMSIZE_2 = 0xA2D9; +constexpr unsigned int mmVGT_GS_VERT_ITEMSIZE_3 = 0xA2DA; +constexpr unsigned int mmVGT_HOS_CNTL = 0xA285; +constexpr unsigned int mmVGT_HOS_MAX_TESS_LEVEL = 0xA286; +constexpr unsigned int mmVGT_HOS_MIN_TESS_LEVEL = 0xA287; +constexpr unsigned int mmVGT_HOS_REUSE_DEPTH = 0xA288; +constexpr unsigned int mmVGT_HS_OFFCHIP_PARAM__CI__VI = 0xC24F; +constexpr unsigned int mmVGT_HS_OFFCHIP_PARAM__SI = 0x226C; +constexpr unsigned int mmVGT_IMMED_DATA = 0xA1FD; +constexpr unsigned int mmVGT_INDEX_TYPE__CI__VI = 0xC243; +constexpr unsigned int mmVGT_INDEX_TYPE__SI = 0x2257; +constexpr unsigned int mmVGT_INDX_OFFSET = 0xA102; +constexpr unsigned int mmVGT_INSTANCE_STEP_RATE_0 = 0xA2A8; +constexpr unsigned int mmVGT_INSTANCE_STEP_RATE_1 = 0xA2A9; +constexpr unsigned int mmVGT_LAST_COPY_STATE = 0x2230; +constexpr unsigned int mmVGT_LS_HS_CONFIG = 0xA2D6; +constexpr unsigned int mmVGT_MAX_VTX_INDX = 0xA100; +constexpr unsigned int mmVGT_MC_LAT_CNTL = 0x2236; +constexpr unsigned int mmVGT_MIN_VTX_INDX = 0xA101; +constexpr unsigned int mmVGT_MULTI_PRIM_IB_RESET_EN = 0xA2A5; +constexpr unsigned int mmVGT_MULTI_PRIM_IB_RESET_INDX = 0xA103; +constexpr unsigned int mmVGT_NUM_INDICES__CI__VI = 0xC24C; +constexpr unsigned int mmVGT_NUM_INDICES__SI = 0x225C; +constexpr unsigned int mmVGT_NUM_INSTANCES__CI__VI = 0xC24D; +constexpr unsigned int mmVGT_NUM_INSTANCES__SI = 0x225D; +constexpr unsigned int mmVGT_OUTPUT_PATH_CNTL = 0xA284; +constexpr unsigned int mmVGT_OUT_DEALLOC_CNTL = 0xA317; +constexpr unsigned int mmVGT_PERFCOUNTER0_HI__CI__VI = 0xD091; +constexpr unsigned int mmVGT_PERFCOUNTER0_HI__SI = 0x224D; +constexpr unsigned int mmVGT_PERFCOUNTER0_LO__CI__VI = 0xD090; +constexpr unsigned int mmVGT_PERFCOUNTER0_LO__SI = 0x224C; +constexpr unsigned int mmVGT_PERFCOUNTER0_SELECT1__CI__VI = 0xD890; +constexpr unsigned int mmVGT_PERFCOUNTER0_SELECT__CI__VI = 0xD88C; +constexpr unsigned int mmVGT_PERFCOUNTER0_SELECT__SI = 0x2248; +constexpr unsigned int mmVGT_PERFCOUNTER1_HI__CI__VI = 0xD093; +constexpr unsigned int mmVGT_PERFCOUNTER1_HI__SI = 0x224F; +constexpr unsigned int mmVGT_PERFCOUNTER1_LO__CI__VI = 0xD092; +constexpr unsigned int mmVGT_PERFCOUNTER1_LO__SI = 0x224E; +constexpr unsigned int mmVGT_PERFCOUNTER1_SELECT1__CI__VI = 0xD891; +constexpr unsigned int mmVGT_PERFCOUNTER1_SELECT__CI__VI = 0xD88D; +constexpr unsigned int mmVGT_PERFCOUNTER1_SELECT__SI = 0x2249; +constexpr unsigned int mmVGT_PERFCOUNTER2_HI__CI__VI = 0xD095; +constexpr unsigned int mmVGT_PERFCOUNTER2_HI__SI = 0x2251; +constexpr unsigned int mmVGT_PERFCOUNTER2_LO__CI__VI = 0xD094; +constexpr unsigned int mmVGT_PERFCOUNTER2_LO__SI = 0x2250; +constexpr unsigned int mmVGT_PERFCOUNTER2_SELECT__CI__VI = 0xD88E; +constexpr unsigned int mmVGT_PERFCOUNTER2_SELECT__SI = 0x224A; +constexpr unsigned int mmVGT_PERFCOUNTER3_HI__CI__VI = 0xD097; +constexpr unsigned int mmVGT_PERFCOUNTER3_HI__SI = 0x2253; +constexpr unsigned int mmVGT_PERFCOUNTER3_LO__CI__VI = 0xD096; +constexpr unsigned int mmVGT_PERFCOUNTER3_LO__SI = 0x2252; +constexpr unsigned int mmVGT_PERFCOUNTER3_SELECT__CI__VI = 0xD88F; +constexpr unsigned int mmVGT_PERFCOUNTER3_SELECT__SI = 0x224B; +constexpr unsigned int mmVGT_PERFCOUNTER_SEID_MASK__CI__VI = 0xD894; +constexpr unsigned int mmVGT_PERFCOUNTER_SEID_MASK__SI = 0x2247; +constexpr unsigned int mmVGT_PRIMITIVEID_EN = 0xA2A1; +constexpr unsigned int mmVGT_PRIMITIVEID_RESET = 0xA2A3; +constexpr unsigned int mmVGT_PRIMITIVE_TYPE__CI__VI = 0xC242; +constexpr unsigned int mmVGT_PRIMITIVE_TYPE__SI = 0x2256; +constexpr unsigned int mmVGT_RESET_DEBUG__CI__VI = 0x2232; +constexpr unsigned int mmVGT_REUSE_OFF = 0xA2AD; +constexpr unsigned int mmVGT_SHADER_STAGES_EN = 0xA2D5; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_CONFIG = 0xA2E6; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_0__CI__VI = 0xC244; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_0__SI = 0x2258; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_1__CI__VI = 0xC245; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_1__SI = 0x2259; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_2__CI__VI = 0xC246; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_2__SI = 0x225A; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_3__CI__VI = 0xC247; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_FILLED_SIZE_3__SI = 0x225B; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_OFFSET_0 = 0xA2B7; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_OFFSET_1 = 0xA2BB; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_OFFSET_2 = 0xA2BF; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_OFFSET_3 = 0xA2C3; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_SIZE_0 = 0xA2B4; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_SIZE_1 = 0xA2B8; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_SIZE_2 = 0xA2BC; +constexpr unsigned int mmVGT_STRMOUT_BUFFER_SIZE_3 = 0xA2C0; +constexpr unsigned int mmVGT_STRMOUT_CONFIG = 0xA2E5; +constexpr unsigned int mmVGT_STRMOUT_DELAY__CI__VI = 0x2233; +constexpr unsigned int mmVGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE = 0xA2CB; +constexpr unsigned int mmVGT_STRMOUT_DRAW_OPAQUE_OFFSET = 0xA2CA; +constexpr unsigned int mmVGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE = 0xA2CC; +constexpr unsigned int mmVGT_STRMOUT_VTX_STRIDE_0 = 0xA2B5; +constexpr unsigned int mmVGT_STRMOUT_VTX_STRIDE_1 = 0xA2B9; +constexpr unsigned int mmVGT_STRMOUT_VTX_STRIDE_2 = 0xA2BD; +constexpr unsigned int mmVGT_STRMOUT_VTX_STRIDE_3 = 0xA2C1; +constexpr unsigned int mmVGT_SYS_CONFIG = 0x2263; +constexpr unsigned int mmVGT_TF_MEMORY_BASE__CI__VI = 0xC250; +constexpr unsigned int mmVGT_TF_MEMORY_BASE__SI = 0x226E; +constexpr unsigned int mmVGT_TF_PARAM = 0xA2DB; +constexpr unsigned int mmVGT_TF_RING_SIZE__CI__VI = 0xC24E; +constexpr unsigned int mmVGT_TF_RING_SIZE__SI = 0x2262; +constexpr unsigned int mmVGT_VERTEX_REUSE_BLOCK_CNTL = 0xA316; +constexpr unsigned int mmVGT_VS_MAX_WAVE_ID__CI__VI = 0x2268; +constexpr unsigned int mmVGT_VTX_CNT_EN = 0xA2AE; +constexpr unsigned int mmVGT_VTX_VECT_EJECT_REG = 0x222C; +constexpr unsigned int mmVIEWPORT_SIZE__SI__VI = 0x1B5D; +constexpr unsigned int mmVIEWPORT_START__SI__VI = 0x1B5C; +constexpr unsigned int mmVLINE_STATUS__SI = 0x1AEE; +constexpr unsigned int mmVM_CONTEXT0_CNTL = 0x0504; +constexpr unsigned int mmVM_CONTEXT0_CNTL2 = 0x050C; +constexpr unsigned int mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR = 0x054F; +constexpr unsigned int mmVM_CONTEXT0_PAGE_TABLE_END_ADDR = 0x055F; +constexpr unsigned int mmVM_CONTEXT0_PAGE_TABLE_START_ADDR = 0x0557; +constexpr unsigned int mmVM_CONTEXT0_PROTECTION_FAULT_ADDR = 0x053E; +constexpr unsigned int mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR = 0x0546; +constexpr unsigned int mmVM_CONTEXT0_PROTECTION_FAULT_MCCLIENT__CI__VI = 0x0538; +constexpr unsigned int mmVM_CONTEXT0_PROTECTION_FAULT_STATUS = 0x0536; +constexpr unsigned int mmVM_CONTEXT10_PAGE_TABLE_BASE_ADDR = 0x0510; +constexpr unsigned int mmVM_CONTEXT11_PAGE_TABLE_BASE_ADDR = 0x0511; +constexpr unsigned int mmVM_CONTEXT12_PAGE_TABLE_BASE_ADDR = 0x0512; +constexpr unsigned int mmVM_CONTEXT13_PAGE_TABLE_BASE_ADDR = 0x0513; +constexpr unsigned int mmVM_CONTEXT14_PAGE_TABLE_BASE_ADDR = 0x0514; +constexpr unsigned int mmVM_CONTEXT15_PAGE_TABLE_BASE_ADDR = 0x0515; +constexpr unsigned int mmVM_CONTEXT1_CNTL = 0x0505; +constexpr unsigned int mmVM_CONTEXT1_CNTL2 = 0x050D; +constexpr unsigned int mmVM_CONTEXT1_PAGE_TABLE_BASE_ADDR = 0x0550; +constexpr unsigned int mmVM_CONTEXT1_PAGE_TABLE_END_ADDR = 0x0560; +constexpr unsigned int mmVM_CONTEXT1_PAGE_TABLE_START_ADDR = 0x0558; +constexpr unsigned int mmVM_CONTEXT1_PROTECTION_FAULT_ADDR = 0x053F; +constexpr unsigned int mmVM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR = 0x0547; +constexpr unsigned int mmVM_CONTEXT1_PROTECTION_FAULT_MCCLIENT__CI__VI = 0x0539; +constexpr unsigned int mmVM_CONTEXT1_PROTECTION_FAULT_STATUS = 0x0537; +constexpr unsigned int mmVM_CONTEXT2_PAGE_TABLE_BASE_ADDR = 0x0551; +constexpr unsigned int mmVM_CONTEXT3_PAGE_TABLE_BASE_ADDR = 0x0552; +constexpr unsigned int mmVM_CONTEXT4_PAGE_TABLE_BASE_ADDR = 0x0553; +constexpr unsigned int mmVM_CONTEXT5_PAGE_TABLE_BASE_ADDR = 0x0554; +constexpr unsigned int mmVM_CONTEXT6_PAGE_TABLE_BASE_ADDR = 0x0555; +constexpr unsigned int mmVM_CONTEXT7_PAGE_TABLE_BASE_ADDR = 0x0556; +constexpr unsigned int mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR = 0x050E; +constexpr unsigned int mmVM_CONTEXT9_PAGE_TABLE_BASE_ADDR = 0x050F; +constexpr unsigned int mmVM_CONTEXTS_DISABLE = 0x0535; +constexpr unsigned int mmVM_DEBUG = 0x056F; +constexpr unsigned int mmVM_DUMMY_PAGE_FAULT_ADDR = 0x0507; +constexpr unsigned int mmVM_DUMMY_PAGE_FAULT_CNTL = 0x0506; +constexpr unsigned int mmVM_FAULT_CLIENT_ID = 0x054E; +constexpr unsigned int mmVM_INVALIDATE_REQUEST = 0x051E; +constexpr unsigned int mmVM_INVALIDATE_RESPONSE = 0x051F; +constexpr unsigned int mmVM_L2_BANK_SELECT_MASKA = 0x0572; +constexpr unsigned int mmVM_L2_BANK_SELECT_MASKB = 0x0573; +constexpr unsigned int mmVM_L2_CG = 0x0570; +constexpr unsigned int mmVM_L2_CNTL = 0x0500; +constexpr unsigned int mmVM_L2_CNTL2 = 0x0501; +constexpr unsigned int mmVM_L2_CNTL3 = 0x0502; +constexpr unsigned int mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR = 0x0576; +constexpr unsigned int mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR = 0x0575; +constexpr unsigned int mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET = 0x0577; +constexpr unsigned int mmVM_L2_STATUS = 0x0503; +constexpr unsigned int mmVM_PRT_APERTURE0_HIGH_ADDR = 0x0530; +constexpr unsigned int mmVM_PRT_APERTURE0_LOW_ADDR = 0x052C; +constexpr unsigned int mmVM_PRT_APERTURE1_HIGH_ADDR = 0x0531; +constexpr unsigned int mmVM_PRT_APERTURE1_LOW_ADDR = 0x052D; +constexpr unsigned int mmVM_PRT_APERTURE2_HIGH_ADDR = 0x0532; +constexpr unsigned int mmVM_PRT_APERTURE2_LOW_ADDR = 0x052E; +constexpr unsigned int mmVM_PRT_APERTURE3_HIGH_ADDR = 0x0533; +constexpr unsigned int mmVM_PRT_APERTURE3_LOW_ADDR = 0x052F; +constexpr unsigned int mmVM_PRT_CNTL = 0x0534; +constexpr unsigned int mmWD_CNTL_STATUS__CI__VI = 0x223F; +constexpr unsigned int mmWD_DEBUG_CNTL__CI__VI = 0x223D; +constexpr unsigned int mmWD_DEBUG_DATA__CI__VI = 0x223E; +constexpr unsigned int mmWD_ENHANCE__CI__VI = 0xA2A0; +constexpr unsigned int mmWD_PERFCOUNTER0_HI__CI__VI = 0xD081; +constexpr unsigned int mmWD_PERFCOUNTER0_LO__CI__VI = 0xD080; +constexpr unsigned int mmWD_PERFCOUNTER0_SELECT__CI__VI = 0xD880; +constexpr unsigned int mmWD_PERFCOUNTER1_HI__CI__VI = 0xD083; +constexpr unsigned int mmWD_PERFCOUNTER1_LO__CI__VI = 0xD082; +constexpr unsigned int mmWD_PERFCOUNTER1_SELECT__CI__VI = 0xD881; +constexpr unsigned int mmWD_PERFCOUNTER2_HI__CI__VI = 0xD085; +constexpr unsigned int mmWD_PERFCOUNTER2_LO__CI__VI = 0xD084; +constexpr unsigned int mmWD_PERFCOUNTER2_SELECT__CI__VI = 0xD882; +constexpr unsigned int mmWD_PERFCOUNTER3_HI__CI__VI = 0xD087; +constexpr unsigned int mmWD_PERFCOUNTER3_LO__CI__VI = 0xD086; +constexpr unsigned int mmWD_PERFCOUNTER3_SELECT__CI__VI = 0xD883; +constexpr unsigned int mmXDMA_SLV_FLIP_PENDING__CI__VI = 0x046C; +constexpr unsigned int mmXDMA_SLV_FLIP_PENDING__SI = 0x0407; +constexpr unsigned int pciADAPTER_ID = 0x000B; +constexpr unsigned int pciADAPTER_ID_W = 0x0013; +constexpr unsigned int pciBASE_ADDR_1 = 0x0004; +constexpr unsigned int pciBASE_ADDR_2 = 0x0005; +constexpr unsigned int pciBASE_ADDR_3 = 0x0006; +constexpr unsigned int pciBASE_ADDR_4 = 0x0007; +constexpr unsigned int pciBASE_ADDR_5 = 0x0008; +constexpr unsigned int pciBASE_ADDR_6 = 0x0009; +constexpr unsigned int pciBASE_CLASS = 0x0002; +constexpr unsigned int pciBIST = 0x0003; +constexpr unsigned int pciCACHE_LINE = 0x0003; +constexpr unsigned int pciCAP_PTR = 0x000D; +constexpr unsigned int pciCOMMAND = 0x0001; +constexpr unsigned int pciDEVICE_CAP = 0x0017; +constexpr unsigned int pciDEVICE_CAP2 = 0x001F; +constexpr unsigned int pciDEVICE_CNTL = 0x0018; +constexpr unsigned int pciDEVICE_CNTL2 = 0x0020; +constexpr unsigned int pciDEVICE_ID = 0x0000; +constexpr unsigned int pciDEVICE_STATUS = 0x0018; +constexpr unsigned int pciDEVICE_STATUS2 = 0x0020; +constexpr unsigned int pciHEADER = 0x0003; +constexpr unsigned int pciINTERRUPT_LINE = 0x000F; +constexpr unsigned int pciINTERRUPT_PIN = 0x000F; +constexpr unsigned int pciLATENCY = 0x0003; +constexpr unsigned int pciLINK_CAP = 0x0019; +constexpr unsigned int pciLINK_CAP2 = 0x0021; +constexpr unsigned int pciLINK_CNTL = 0x001A; +constexpr unsigned int pciLINK_CNTL2 = 0x0022; +constexpr unsigned int pciLINK_STATUS = 0x001A; +constexpr unsigned int pciLINK_STATUS2 = 0x0022; +constexpr unsigned int pciMAX_LATENCY = 0x000F; +constexpr unsigned int pciMIN_GRANT = 0x000F; +constexpr unsigned int pciMSI_CAP_LIST = 0x0028; +constexpr unsigned int pciMSI_MSG_ADDR_HI = 0x002A; +constexpr unsigned int pciMSI_MSG_ADDR_LO = 0x0029; +constexpr unsigned int pciMSI_MSG_CNTL = 0x0028; +constexpr unsigned int pciMSI_MSG_DATA = 0x002A; +constexpr unsigned int pciMSI_MSG_DATA_64 = 0x002B; +constexpr unsigned int pciPCIE_ACS_CAP__CI__VI = 0x00A9; +constexpr unsigned int pciPCIE_ACS_CNTL__CI__VI = 0x00A9; +constexpr unsigned int pciPCIE_ACS_ENH_CAP_LIST__CI__VI = 0x00A8; +constexpr unsigned int pciPCIE_ADV_ERR_CAP_CNTL = 0x005A; +constexpr unsigned int pciPCIE_ADV_ERR_RPT_ENH_CAP_LIST = 0x0054; +constexpr unsigned int pciPCIE_ATS_CAP__CI__VI = 0x00AD; +constexpr unsigned int pciPCIE_ATS_CNTL__CI__VI = 0x00AD; +constexpr unsigned int pciPCIE_ATS_ENH_CAP_LIST__CI__VI = 0x00AC; +constexpr unsigned int pciPCIE_BAR1_CAP__CI__VI = 0x0081; +constexpr unsigned int pciPCIE_BAR1_CNTL__CI__VI = 0x0082; +constexpr unsigned int pciPCIE_BAR2_CAP__CI__VI = 0x0083; +constexpr unsigned int pciPCIE_BAR2_CNTL__CI__VI = 0x0084; +constexpr unsigned int pciPCIE_BAR3_CAP__CI__VI = 0x0085; +constexpr unsigned int pciPCIE_BAR3_CNTL__CI__VI = 0x0086; +constexpr unsigned int pciPCIE_BAR4_CAP__CI__VI = 0x0087; +constexpr unsigned int pciPCIE_BAR4_CNTL__CI__VI = 0x0088; +constexpr unsigned int pciPCIE_BAR5_CAP__CI__VI = 0x0089; +constexpr unsigned int pciPCIE_BAR5_CNTL__CI__VI = 0x008A; +constexpr unsigned int pciPCIE_BAR6_CAP__CI__VI = 0x008B; +constexpr unsigned int pciPCIE_BAR6_CNTL__CI__VI = 0x008C; +constexpr unsigned int pciPCIE_BAR_ENH_CAP_LIST__CI__VI = 0x0080; +constexpr unsigned int pciPCIE_CAP = 0x0016; +constexpr unsigned int pciPCIE_CAP_LIST = 0x0016; +constexpr unsigned int pciPCIE_CORR_ERR_MASK = 0x0059; +constexpr unsigned int pciPCIE_CORR_ERR_STATUS = 0x0058; +constexpr unsigned int pciPCIE_DEV_SERIAL_NUM_DW1 = 0x0051; +constexpr unsigned int pciPCIE_DEV_SERIAL_NUM_DW2 = 0x0052; +constexpr unsigned int pciPCIE_DEV_SERIAL_NUM_ENH_CAP_LIST = 0x0050; +constexpr unsigned int pciPCIE_DPA_CAP__CI__VI = 0x0095; +constexpr unsigned int pciPCIE_DPA_CNTL__CI__VI = 0x0097; +constexpr unsigned int pciPCIE_DPA_ENH_CAP_LIST__CI__VI = 0x0094; +constexpr unsigned int pciPCIE_DPA_LATENCY_INDICATOR__CI__VI = 0x0096; +constexpr unsigned int pciPCIE_DPA_STATUS__CI__VI = 0x0097; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_0__CI__VI = 0x0098; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_1__CI__VI = 0x0098; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_2__CI__VI = 0x0098; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_3__CI__VI = 0x0098; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_4__CI__VI = 0x0099; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_5__CI__VI = 0x0099; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_6__CI__VI = 0x0099; +constexpr unsigned int pciPCIE_DPA_SUBSTATE_PWR_ALLOC_7__CI__VI = 0x0099; +constexpr unsigned int pciPCIE_HDR_LOG0 = 0x005B; +constexpr unsigned int pciPCIE_HDR_LOG1 = 0x005C; +constexpr unsigned int pciPCIE_HDR_LOG2 = 0x005D; +constexpr unsigned int pciPCIE_HDR_LOG3 = 0x005E; +constexpr unsigned int pciPCIE_LANE_0_EQUALIZATION_CNTL__CI__VI = 0x009F; +constexpr unsigned int pciPCIE_LANE_10_EQUALIZATION_CNTL__CI__VI = 0x00A4; +constexpr unsigned int pciPCIE_LANE_11_EQUALIZATION_CNTL__CI__VI = 0x00A4; +constexpr unsigned int pciPCIE_LANE_12_EQUALIZATION_CNTL__CI__VI = 0x00A5; +constexpr unsigned int pciPCIE_LANE_13_EQUALIZATION_CNTL__CI__VI = 0x00A5; +constexpr unsigned int pciPCIE_LANE_14_EQUALIZATION_CNTL__CI__VI = 0x00A6; +constexpr unsigned int pciPCIE_LANE_15_EQUALIZATION_CNTL__CI__VI = 0x00A6; +constexpr unsigned int pciPCIE_LANE_1_EQUALIZATION_CNTL__CI__VI = 0x009F; +constexpr unsigned int pciPCIE_LANE_2_EQUALIZATION_CNTL__CI__VI = 0x00A0; +constexpr unsigned int pciPCIE_LANE_3_EQUALIZATION_CNTL__CI__VI = 0x00A0; +constexpr unsigned int pciPCIE_LANE_4_EQUALIZATION_CNTL__CI__VI = 0x00A1; +constexpr unsigned int pciPCIE_LANE_5_EQUALIZATION_CNTL__CI__VI = 0x00A1; +constexpr unsigned int pciPCIE_LANE_6_EQUALIZATION_CNTL__CI__VI = 0x00A2; +constexpr unsigned int pciPCIE_LANE_7_EQUALIZATION_CNTL__CI__VI = 0x00A2; +constexpr unsigned int pciPCIE_LANE_8_EQUALIZATION_CNTL__CI__VI = 0x00A3; +constexpr unsigned int pciPCIE_LANE_9_EQUALIZATION_CNTL__CI__VI = 0x00A3; +constexpr unsigned int pciPCIE_LANE_ERROR_STATUS__CI__VI = 0x009E; +constexpr unsigned int pciPCIE_LINK_CNTL3__CI__VI = 0x009D; +constexpr unsigned int pciPCIE_OUTSTAND_PAGE_REQ_ALLOC__CI__VI = 0x00B3; +constexpr unsigned int pciPCIE_OUTSTAND_PAGE_REQ_CAPACITY__CI__VI = 0x00B2; +constexpr unsigned int pciPCIE_PAGE_REQ_CNTL__CI__VI = 0x00B1; +constexpr unsigned int pciPCIE_PAGE_REQ_ENH_CAP_LIST__CI__VI = 0x00B0; +constexpr unsigned int pciPCIE_PAGE_REQ_STATUS__CI__VI = 0x00B1; +constexpr unsigned int pciPCIE_PASID_CAP__CI__VI = 0x00B5; +constexpr unsigned int pciPCIE_PASID_CNTL__CI__VI = 0x00B5; +constexpr unsigned int pciPCIE_PASID_ENH_CAP_LIST__CI__VI = 0x00B4; +constexpr unsigned int pciPCIE_PORT_VC_CAP_REG1 = 0x0045; +constexpr unsigned int pciPCIE_PORT_VC_CAP_REG2 = 0x0046; +constexpr unsigned int pciPCIE_PORT_VC_CNTL = 0x0047; +constexpr unsigned int pciPCIE_PORT_VC_STATUS = 0x0047; +constexpr unsigned int pciPCIE_PWR_BUDGET_CAP__CI__VI = 0x0093; +constexpr unsigned int pciPCIE_PWR_BUDGET_DATA_SELECT__CI__VI = 0x0091; +constexpr unsigned int pciPCIE_PWR_BUDGET_DATA__CI__VI = 0x0092; +constexpr unsigned int pciPCIE_PWR_BUDGET_ENH_CAP_LIST__CI__VI = 0x0090; +constexpr unsigned int pciPCIE_SECONDARY_ENH_CAP_LIST__CI__VI = 0x009C; +constexpr unsigned int pciPCIE_TLP_PREFIX_LOG0__CI__VI = 0x0062; +constexpr unsigned int pciPCIE_TLP_PREFIX_LOG1__CI__VI = 0x0063; +constexpr unsigned int pciPCIE_TLP_PREFIX_LOG2__CI__VI = 0x0064; +constexpr unsigned int pciPCIE_TLP_PREFIX_LOG3__CI__VI = 0x0065; +constexpr unsigned int pciPCIE_UNCORR_ERR_MASK = 0x0056; +constexpr unsigned int pciPCIE_UNCORR_ERR_SEVERITY = 0x0057; +constexpr unsigned int pciPCIE_UNCORR_ERR_STATUS = 0x0055; +constexpr unsigned int pciPCIE_VC0_RESOURCE_CAP = 0x0048; +constexpr unsigned int pciPCIE_VC0_RESOURCE_CNTL = 0x0049; +constexpr unsigned int pciPCIE_VC0_RESOURCE_STATUS = 0x004A; +constexpr unsigned int pciPCIE_VC1_RESOURCE_CAP = 0x004B; +constexpr unsigned int pciPCIE_VC1_RESOURCE_CNTL = 0x004C; +constexpr unsigned int pciPCIE_VC1_RESOURCE_STATUS = 0x004D; +constexpr unsigned int pciPCIE_VC_ENH_CAP_LIST = 0x0044; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC1 = 0x0042; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC2 = 0x0043; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC_ENH_CAP_LIST = 0x0040; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC_HDR = 0x0041; +constexpr unsigned int pciPMI_CAP = 0x0014; +constexpr unsigned int pciPMI_CAP_LIST = 0x0014; +constexpr unsigned int pciPMI_STATUS_CNTL = 0x0015; +constexpr unsigned int pciPROG_INTERFACE = 0x0002; +constexpr unsigned int pciREVISION_ID = 0x0002; +constexpr unsigned int pciROM_BASE_ADDR = 0x000C; +constexpr unsigned int pciSTATUS = 0x0001; +constexpr unsigned int pciSUB_CLASS = 0x0002; +constexpr unsigned int pciVENDOR_CAP_LIST__CI__VI = 0x0012; +constexpr unsigned int pciVENDOR_ID = 0x0000; + +//Merged Defines + +constexpr unsigned int cfgMSI_MASK__VI = 0x002B; +constexpr unsigned int cfgMSI_MASK_64__VI = 0x002C; +constexpr unsigned int cfgMSI_PENDING__VI = 0x002C; +constexpr unsigned int cfgMSI_PENDING_64__VI = 0x002D; +constexpr unsigned int cfgPCIE_ARI_CAP__VI = 0x00CB; +constexpr unsigned int cfgPCIE_ARI_CNTL__VI = 0x00CB; +constexpr unsigned int cfgPCIE_ARI_ENH_CAP_LIST__VI = 0x00CA; +constexpr unsigned int cfgPCIE_LTR_CAP__VI = 0x00C9; +constexpr unsigned int cfgPCIE_LTR_ENH_CAP_LIST__VI = 0x00C8; +constexpr unsigned int cfgPCIE_MC_ADDR0__VI = 0x00BE; +constexpr unsigned int cfgPCIE_MC_ADDR1__VI = 0x00BF; +constexpr unsigned int cfgPCIE_MC_BLOCK_ALL0__VI = 0x00C2; +constexpr unsigned int cfgPCIE_MC_BLOCK_ALL1__VI = 0x00C3; +constexpr unsigned int cfgPCIE_MC_BLOCK_UNTRANSLATED_0__VI = 0x00C4; +constexpr unsigned int cfgPCIE_MC_BLOCK_UNTRANSLATED_1__VI = 0x00C5; +constexpr unsigned int cfgPCIE_MC_CAP__VI = 0x00BD; +constexpr unsigned int cfgPCIE_MC_CNTL__VI = 0x00BD; +constexpr unsigned int cfgPCIE_MC_ENH_CAP_LIST__VI = 0x00BC; +constexpr unsigned int cfgPCIE_MC_RCV0__VI = 0x00C0; +constexpr unsigned int cfgPCIE_MC_RCV1__VI = 0x00C1; +constexpr unsigned int cfgPCIE_SRIOV_CAP__VI = 0x00CD; +constexpr unsigned int cfgPCIE_SRIOV_CONTROL__VI = 0x00CE; +constexpr unsigned int cfgPCIE_SRIOV_ENH_CAP_LIST__VI = 0x00CC; +constexpr unsigned int cfgPCIE_SRIOV_FIRST_VF_OFFSET__VI = 0x00D1; +constexpr unsigned int cfgPCIE_SRIOV_FUNC_DEP_LINK__VI = 0x00D0; +constexpr unsigned int cfgPCIE_SRIOV_INITIAL_VFS__VI = 0x00CF; +constexpr unsigned int cfgPCIE_SRIOV_NUM_VFS__VI = 0x00D0; +constexpr unsigned int cfgPCIE_SRIOV_STATUS__VI = 0x00CE; +constexpr unsigned int cfgPCIE_SRIOV_SUPPORTED_PAGE_SIZE__VI = 0x00D3; +constexpr unsigned int cfgPCIE_SRIOV_SYSTEM_PAGE_SIZE__VI = 0x00D4; +constexpr unsigned int cfgPCIE_SRIOV_TOTAL_VFS__VI = 0x00CF; +constexpr unsigned int cfgPCIE_SRIOV_VF_BASE_ADDR_0__VI = 0x00D5; +constexpr unsigned int cfgPCIE_SRIOV_VF_BASE_ADDR_1__VI = 0x00D6; +constexpr unsigned int cfgPCIE_SRIOV_VF_BASE_ADDR_2__VI = 0x00D7; +constexpr unsigned int cfgPCIE_SRIOV_VF_BASE_ADDR_3__VI = 0x00D8; +constexpr unsigned int cfgPCIE_SRIOV_VF_BASE_ADDR_4__VI = 0x00D9; +constexpr unsigned int cfgPCIE_SRIOV_VF_BASE_ADDR_5__VI = 0x00DA; +constexpr unsigned int cfgPCIE_SRIOV_VF_DEVICE_ID__VI = 0x00D2; +constexpr unsigned int cfgPCIE_SRIOV_VF_MIGRATION_STATE_ARRAY_OFFSET__VI = 0x00DB; +constexpr unsigned int cfgPCIE_SRIOV_VF_STRIDE__VI = 0x00D1; +constexpr unsigned int cfgPCIE_TPH_REQR_CAP__VI = 0x00B9; +constexpr unsigned int cfgPCIE_TPH_REQR_CNTL__VI = 0x00BA; +constexpr unsigned int cfgPCIE_TPH_REQR_ENH_CAP_LIST__VI = 0x00B8; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC_ENH_CAP_LIST_GPUIOV__VI = 0x0100; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC_HDR_GPUIOV__VI = 0x0101; +constexpr unsigned int cfgPCIE_VENDOR_SPECIFIC_HDR_GPUIOV_RESET_CONTROL__VI = 0x0105; +constexpr unsigned int mmAFMT_60958_0__VI = 0x4A38; +constexpr unsigned int mmAFMT_60958_1__VI = 0x4A39; +constexpr unsigned int mmAFMT_60958_2__VI = 0x4A3F; +constexpr unsigned int mmAFMT_AUDIO_CRC_CONTROL__VI = 0x4A3A; +constexpr unsigned int mmAFMT_AUDIO_CRC_RESULT__VI = 0x4A40; +constexpr unsigned int mmAFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4A46; +constexpr unsigned int mmAFMT_AUDIO_INFO0__VI = 0x4A36; +constexpr unsigned int mmAFMT_AUDIO_INFO1__VI = 0x4A37; +constexpr unsigned int mmAFMT_AUDIO_PACKET_CONTROL__VI = 0x4A42; +constexpr unsigned int mmAFMT_AUDIO_PACKET_CONTROL2__VI = 0x4A14; +constexpr unsigned int mmAFMT_AUDIO_SRC_CONTROL__VI = 0x4A45; +constexpr unsigned int mmAFMT_AVI_INFO0__VI = 0x4A1E; +constexpr unsigned int mmAFMT_AVI_INFO1__VI = 0x4A1F; +constexpr unsigned int mmAFMT_AVI_INFO2__VI = 0x4A20; +constexpr unsigned int mmAFMT_AVI_INFO3__VI = 0x4A21; +constexpr unsigned int mmAFMT_GENERIC_0__VI = 0x4A25; +constexpr unsigned int mmAFMT_GENERIC_1__VI = 0x4A26; +constexpr unsigned int mmAFMT_GENERIC_2__VI = 0x4A27; +constexpr unsigned int mmAFMT_GENERIC_3__VI = 0x4A28; +constexpr unsigned int mmAFMT_GENERIC_4__VI = 0x4A29; +constexpr unsigned int mmAFMT_GENERIC_5__VI = 0x4A2A; +constexpr unsigned int mmAFMT_GENERIC_6__VI = 0x4A2B; +constexpr unsigned int mmAFMT_GENERIC_7__VI = 0x4A2C; +constexpr unsigned int mmAFMT_GENERIC_HDR__VI = 0x4A24; +constexpr unsigned int mmAFMT_INFOFRAME_CONTROL0__VI = 0x4A44; +constexpr unsigned int mmAFMT_ISRC1_0__VI = 0x4A15; +constexpr unsigned int mmAFMT_ISRC1_1__VI = 0x4A16; +constexpr unsigned int mmAFMT_ISRC1_2__VI = 0x4A17; +constexpr unsigned int mmAFMT_ISRC1_3__VI = 0x4A18; +constexpr unsigned int mmAFMT_ISRC1_4__VI = 0x4A19; +constexpr unsigned int mmAFMT_ISRC2_0__VI = 0x4A1A; +constexpr unsigned int mmAFMT_ISRC2_1__VI = 0x4A1B; +constexpr unsigned int mmAFMT_ISRC2_2__VI = 0x4A1C; +constexpr unsigned int mmAFMT_ISRC2_3__VI = 0x4A1D; +constexpr unsigned int mmAFMT_MPEG_INFO0__VI = 0x4A22; +constexpr unsigned int mmAFMT_MPEG_INFO1__VI = 0x4A23; +constexpr unsigned int mmAFMT_RAMP_CONTROL0__VI = 0x4A3B; +constexpr unsigned int mmAFMT_RAMP_CONTROL1__VI = 0x4A3C; +constexpr unsigned int mmAFMT_RAMP_CONTROL2__VI = 0x4A3D; +constexpr unsigned int mmAFMT_RAMP_CONTROL3__VI = 0x4A3E; +constexpr unsigned int mmAFMT_STATUS__VI = 0x4A41; +constexpr unsigned int mmAFMT_VBI_PACKET_CONTROL__VI = 0x4A43; +constexpr unsigned int mmALPHA_CONTROL__VI = 0x1ABC; +constexpr unsigned int mmATC_ATS_FAULT_STATUS_INFO2__VI = 0x0CD2; +constexpr unsigned int mmATC_ATS_SMU_STATUS__VI = 0x0D08; +constexpr unsigned int mmATC_ATS_VMID_STATUS__VI = 0x0D07; +constexpr unsigned int mmATC_L1RD_DEBUG2_TLB__VI = 0x0CE2; +constexpr unsigned int mmATC_L1WR_DEBUG2_TLB__VI = 0x0CE3; +constexpr unsigned int mmATC_L2_CACHE_DATA0__VI = 0x0CD9; +constexpr unsigned int mmATC_L2_CACHE_DATA1__VI = 0x0CDA; +constexpr unsigned int mmATC_L2_CACHE_DATA2__VI = 0x0CDB; +constexpr unsigned int mmATC_L2_CNTL3__VI = 0x0D08; +constexpr unsigned int mmATC_L2_STATUS__VI = 0x0D09; +constexpr unsigned int mmATC_L2_STATUS2__VI = 0x0D0A; +constexpr unsigned int mmAUXN_IMPCAL__VI = 0x483C; +constexpr unsigned int mmAUXP_IMPCAL__VI = 0x483B; +constexpr unsigned int mmAUX_ARB_CONTROL__VI = 0x5C02; +constexpr unsigned int mmAUX_CONTROL__VI = 0x5C00; +constexpr unsigned int mmAUX_DPHY_RX_CONTROL0__VI = 0x5C0A; +constexpr unsigned int mmAUX_DPHY_RX_CONTROL1__VI = 0x5C0B; +constexpr unsigned int mmAUX_DPHY_RX_STATUS__VI = 0x5C0D; +constexpr unsigned int mmAUX_DPHY_TX_CONTROL__VI = 0x5C09; +constexpr unsigned int mmAUX_DPHY_TX_REF_CONTROL__VI = 0x5C08; +constexpr unsigned int mmAUX_DPHY_TX_STATUS__VI = 0x5C0C; +constexpr unsigned int mmAUX_GTC_SYNC_CONTROL__VI = 0x5C0E; +constexpr unsigned int mmAUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C10; +constexpr unsigned int mmAUX_GTC_SYNC_DATA__VI = 0x5C12; +constexpr unsigned int mmAUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C0F; +constexpr unsigned int mmAUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C13; +constexpr unsigned int mmAUX_GTC_SYNC_STATUS__VI = 0x5C11; +constexpr unsigned int mmAUX_INTERRUPT_CONTROL__VI = 0x5C03; +constexpr unsigned int mmAUX_LS_DATA__VI = 0x5C07; +constexpr unsigned int mmAUX_LS_STATUS__VI = 0x5C05; +constexpr unsigned int mmAUX_SW_CONTROL__VI = 0x5C01; +constexpr unsigned int mmAUX_SW_DATA__VI = 0x5C06; +constexpr unsigned int mmAUX_SW_STATUS__VI = 0x5C04; +constexpr unsigned int mmAUX_TEST_DEBUG_DATA__VI = 0x5C15; +constexpr unsigned int mmAUX_TEST_DEBUG_INDEX__VI = 0x5C14; +constexpr unsigned int mmAVSYNC_COUNTER_CONTROL__VI = 0x012B; +constexpr unsigned int mmAVSYNC_COUNTER_READ__VI = 0x012F; +constexpr unsigned int mmAVSYNC_COUNTER_WRITE__VI = 0x012A; +constexpr unsigned int mmAZALIA_APPLICATION_POSITION_IN_CYCLIC_BUFFER__VI = 0x17F3; +constexpr unsigned int mmAZALIA_AUDIO_DTO__VI = 0x17E5; +constexpr unsigned int mmAZALIA_AUDIO_DTO_CONTROL__VI = 0x17E6; +constexpr unsigned int mmAZALIA_BDL_DMA_CONTROL__VI = 0x17EA; +constexpr unsigned int mmAZALIA_CONTROLLER_CLOCK_GATING__VI = 0x17E4; +constexpr unsigned int mmAZALIA_CONTROLLER_DEBUG__VI = 0x17F9; +constexpr unsigned int mmAZALIA_CORB_DMA_CONTROL__VI = 0x17EC; +constexpr unsigned int mmAZALIA_CRC0_CONTROL0__VI = 0x1805; +constexpr unsigned int mmAZALIA_CRC0_CONTROL1__VI = 0x1806; +constexpr unsigned int mmAZALIA_CRC0_CONTROL2__VI = 0x1807; +constexpr unsigned int mmAZALIA_CRC0_CONTROL3__VI = 0x1808; +constexpr unsigned int mmAZALIA_CRC0_RESULT__VI = 0x1809; +constexpr unsigned int mmAZALIA_CRC1_CONTROL0__VI = 0x180A; +constexpr unsigned int mmAZALIA_CRC1_CONTROL1__VI = 0x180B; +constexpr unsigned int mmAZALIA_CRC1_CONTROL2__VI = 0x180C; +constexpr unsigned int mmAZALIA_CRC1_CONTROL3__VI = 0x180D; +constexpr unsigned int mmAZALIA_CRC1_RESULT__VI = 0x180E; +constexpr unsigned int mmAZALIA_CYCLIC_BUFFER_SYNC__VI = 0x17F4; +constexpr unsigned int mmAZALIA_DATA_DMA_CONTROL__VI = 0x17E9; +constexpr unsigned int mmAZALIA_F0_CODEC_CHANNEL_COUNT_CONTROL__VI = 0x182A; +constexpr unsigned int mmAZALIA_F0_CODEC_DEBUG__VI = 0x1836; +constexpr unsigned int mmAZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17A9; +constexpr unsigned int mmAZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17A8; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION__VI = 0x1833; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__VI = 0x1830; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_RESET__VI = 0x1831; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__VI = 0x1832; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__VI = 0x182C; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__VI = 0x182F; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__VI = 0x182E; +constexpr unsigned int mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__VI = 0x182D; +constexpr unsigned int mmAZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59D5; +constexpr unsigned int mmAZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59D4; +constexpr unsigned int mmAZALIA_F0_CODEC_RESYNC_FIFO_CONTROL__VI = 0x182B; +constexpr unsigned int mmAZALIA_F0_CODEC_ROOT_PARAMETER_REVISION_ID__VI = 0x1829; +constexpr unsigned int mmAZALIA_F0_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__VI = 0x1828; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET0__VI = 0x1837; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET1__VI = 0x1838; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET2__VI = 0x1839; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET3__VI = 0x183A; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET4__VI = 0x183B; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET5__VI = 0x183C; +constexpr unsigned int mmAZALIA_F0_GTC_GROUP_OFFSET6__VI = 0x183D; +constexpr unsigned int mmAZALIA_GLOBAL_CAPABILITIES__VI = 0x17F5; +constexpr unsigned int mmAZALIA_INPUT_CRC0_CONTROL0__VI = 0x17FB; +constexpr unsigned int mmAZALIA_INPUT_CRC0_CONTROL1__VI = 0x17FC; +constexpr unsigned int mmAZALIA_INPUT_CRC0_CONTROL2__VI = 0x17FD; +constexpr unsigned int mmAZALIA_INPUT_CRC0_CONTROL3__VI = 0x17FE; +constexpr unsigned int mmAZALIA_INPUT_CRC0_RESULT__VI = 0x17FF; +constexpr unsigned int mmAZALIA_INPUT_CRC1_CONTROL0__VI = 0x1800; +constexpr unsigned int mmAZALIA_INPUT_CRC1_CONTROL1__VI = 0x1801; +constexpr unsigned int mmAZALIA_INPUT_CRC1_CONTROL2__VI = 0x1802; +constexpr unsigned int mmAZALIA_INPUT_CRC1_CONTROL3__VI = 0x1803; +constexpr unsigned int mmAZALIA_INPUT_CRC1_RESULT__VI = 0x1804; +constexpr unsigned int mmAZALIA_INPUT_PAYLOAD_CAPABILITY__VI = 0x17F8; +constexpr unsigned int mmAZALIA_MEM_PWR_CTRL__VI = 0x1810; +constexpr unsigned int mmAZALIA_MEM_PWR_STATUS__VI = 0x1811; +constexpr unsigned int mmAZALIA_OUTPUT_PAYLOAD_CAPABILITY__VI = 0x17F6; +constexpr unsigned int mmAZALIA_OUTPUT_STREAM_ARBITER_CONTROL__VI = 0x17F7; +constexpr unsigned int mmAZALIA_RIRB_AND_DP_CONTROL__VI = 0x17EB; +constexpr unsigned int mmAZALIA_SCLK_CONTROL__VI = 0x17E7; +constexpr unsigned int mmAZALIA_STREAM_DATA__VI = 0x1781; +constexpr unsigned int mmAZALIA_STREAM_INDEX__VI = 0x1780; +constexpr unsigned int mmAZALIA_UNDERFLOW_FILLER_SAMPLE__VI = 0x17E8; +constexpr unsigned int mmAZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17A9; +constexpr unsigned int mmAZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17A8; +constexpr unsigned int mmAZF0ENDPOINT1_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17AD; +constexpr unsigned int mmAZF0ENDPOINT1_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17AC; +constexpr unsigned int mmAZF0ENDPOINT2_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17B1; +constexpr unsigned int mmAZF0ENDPOINT2_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17B0; +constexpr unsigned int mmAZF0ENDPOINT3_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17B5; +constexpr unsigned int mmAZF0ENDPOINT3_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17B4; +constexpr unsigned int mmAZF0ENDPOINT4_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17B9; +constexpr unsigned int mmAZF0ENDPOINT4_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17B8; +constexpr unsigned int mmAZF0ENDPOINT5_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17BD; +constexpr unsigned int mmAZF0ENDPOINT5_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17BC; +constexpr unsigned int mmAZF0ENDPOINT6_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17C1; +constexpr unsigned int mmAZF0ENDPOINT6_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17C0; +constexpr unsigned int mmAZF0ENDPOINT7_AZALIA_F0_CODEC_ENDPOINT_DATA__VI = 0x17C5; +constexpr unsigned int mmAZF0ENDPOINT7_AZALIA_F0_CODEC_ENDPOINT_INDEX__VI = 0x17C4; +constexpr unsigned int mmAZF0INPUTENDPOINT0_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59D5; +constexpr unsigned int mmAZF0INPUTENDPOINT0_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59D4; +constexpr unsigned int mmAZF0INPUTENDPOINT1_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59D9; +constexpr unsigned int mmAZF0INPUTENDPOINT1_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59D8; +constexpr unsigned int mmAZF0INPUTENDPOINT2_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59DD; +constexpr unsigned int mmAZF0INPUTENDPOINT2_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59DC; +constexpr unsigned int mmAZF0INPUTENDPOINT3_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59E1; +constexpr unsigned int mmAZF0INPUTENDPOINT3_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59E0; +constexpr unsigned int mmAZF0INPUTENDPOINT4_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59E5; +constexpr unsigned int mmAZF0INPUTENDPOINT4_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59E4; +constexpr unsigned int mmAZF0INPUTENDPOINT5_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59E9; +constexpr unsigned int mmAZF0INPUTENDPOINT5_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59E8; +constexpr unsigned int mmAZF0INPUTENDPOINT6_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59ED; +constexpr unsigned int mmAZF0INPUTENDPOINT6_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59EC; +constexpr unsigned int mmAZF0INPUTENDPOINT7_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__VI = 0x59F1; +constexpr unsigned int mmAZF0INPUTENDPOINT7_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__VI = 0x59F0; +constexpr unsigned int mmAZF0STREAM0_AZALIA_STREAM_DATA__VI = 0x1781; +constexpr unsigned int mmAZF0STREAM0_AZALIA_STREAM_INDEX__VI = 0x1780; +constexpr unsigned int mmAZF0STREAM10_AZALIA_STREAM_DATA__VI = 0x59C5; +constexpr unsigned int mmAZF0STREAM10_AZALIA_STREAM_INDEX__VI = 0x59C4; +constexpr unsigned int mmAZF0STREAM11_AZALIA_STREAM_DATA__VI = 0x59C7; +constexpr unsigned int mmAZF0STREAM11_AZALIA_STREAM_INDEX__VI = 0x59C6; +constexpr unsigned int mmAZF0STREAM12_AZALIA_STREAM_DATA__VI = 0x59C9; +constexpr unsigned int mmAZF0STREAM12_AZALIA_STREAM_INDEX__VI = 0x59C8; +constexpr unsigned int mmAZF0STREAM13_AZALIA_STREAM_DATA__VI = 0x59CB; +constexpr unsigned int mmAZF0STREAM13_AZALIA_STREAM_INDEX__VI = 0x59CA; +constexpr unsigned int mmAZF0STREAM14_AZALIA_STREAM_DATA__VI = 0x59CD; +constexpr unsigned int mmAZF0STREAM14_AZALIA_STREAM_INDEX__VI = 0x59CC; +constexpr unsigned int mmAZF0STREAM15_AZALIA_STREAM_DATA__VI = 0x59CF; +constexpr unsigned int mmAZF0STREAM15_AZALIA_STREAM_INDEX__VI = 0x59CE; +constexpr unsigned int mmAZF0STREAM1_AZALIA_STREAM_DATA__VI = 0x1783; +constexpr unsigned int mmAZF0STREAM1_AZALIA_STREAM_INDEX__VI = 0x1782; +constexpr unsigned int mmAZF0STREAM2_AZALIA_STREAM_DATA__VI = 0x1785; +constexpr unsigned int mmAZF0STREAM2_AZALIA_STREAM_INDEX__VI = 0x1784; +constexpr unsigned int mmAZF0STREAM3_AZALIA_STREAM_DATA__VI = 0x1787; +constexpr unsigned int mmAZF0STREAM3_AZALIA_STREAM_INDEX__VI = 0x1786; +constexpr unsigned int mmAZF0STREAM4_AZALIA_STREAM_DATA__VI = 0x1789; +constexpr unsigned int mmAZF0STREAM4_AZALIA_STREAM_INDEX__VI = 0x1788; +constexpr unsigned int mmAZF0STREAM5_AZALIA_STREAM_DATA__VI = 0x178B; +constexpr unsigned int mmAZF0STREAM5_AZALIA_STREAM_INDEX__VI = 0x178A; +constexpr unsigned int mmAZF0STREAM6_AZALIA_STREAM_DATA__VI = 0x178D; +constexpr unsigned int mmAZF0STREAM6_AZALIA_STREAM_INDEX__VI = 0x178C; +constexpr unsigned int mmAZF0STREAM7_AZALIA_STREAM_DATA__VI = 0x178F; +constexpr unsigned int mmAZF0STREAM7_AZALIA_STREAM_INDEX__VI = 0x178E; +constexpr unsigned int mmAZF0STREAM8_AZALIA_STREAM_DATA__VI = 0x59C1; +constexpr unsigned int mmAZF0STREAM8_AZALIA_STREAM_INDEX__VI = 0x59C0; +constexpr unsigned int mmAZF0STREAM9_AZALIA_STREAM_DATA__VI = 0x59C3; +constexpr unsigned int mmAZF0STREAM9_AZALIA_STREAM_INDEX__VI = 0x59C2; +constexpr unsigned int mmAZ_TEST_DEBUG_DATA__VI = 0x1820; +constexpr unsigned int mmAZ_TEST_DEBUG_INDEX__VI = 0x181F; +constexpr unsigned int mmBF_ANA_ISO_CNTL__VI = 0x14C7; +constexpr unsigned int mmBIF_ATOMIC_ERR_LOG__VI = 0x1512; +constexpr unsigned int mmBIF_BME_STATUS__VI = 0x1511; +constexpr unsigned int mmBIF_CLK_CTRL__VI = 0x14C5; +constexpr unsigned int mmBIF_DOORBELL_APER_EN__VI = 0x1501; +constexpr unsigned int mmBIF_DOORBELL_GBLAPER1_LOWER__VI = 0x14FC; +constexpr unsigned int mmBIF_DOORBELL_GBLAPER1_UPPER__VI = 0x14FD; +constexpr unsigned int mmBIF_DOORBELL_GBLAPER2_LOWER__VI = 0x14FE; +constexpr unsigned int mmBIF_DOORBELL_GBLAPER2_UPPER__VI = 0x14FF; +constexpr unsigned int mmBIF_GPUIOV_FB_TOTAL_FB_INFO__VI = 0x14D8; +constexpr unsigned int mmBIF_GPUIOV_RESET_NOTIFICATION__VI = 0x14D5; +constexpr unsigned int mmBIF_GPUIOV_VM_INIT_STATUS__VI = 0x14D6; +constexpr unsigned int mmBIF_IOV_FUNC_IDENTIFIER__VI = 0x1503; +constexpr unsigned int mmBIF_MM_INDACCESS_CNTL__VI = 0x1500; +constexpr unsigned int mmBIF_MST_TRANS_PENDING__VI = 0x14EA; +constexpr unsigned int mmBIF_RB_BASE__VI = 0x1531; +constexpr unsigned int mmBIF_RB_CNTL__VI = 0x1530; +constexpr unsigned int mmBIF_RB_RPTR__VI = 0x1532; +constexpr unsigned int mmBIF_RB_WPTR__VI = 0x1533; +constexpr unsigned int mmBIF_RB_WPTR_ADDR_HI__VI = 0x1534; +constexpr unsigned int mmBIF_RB_WPTR_ADDR_LO__VI = 0x1535; +constexpr unsigned int mmBIF_RFE_MST_BX_CMDSTATUS__VI = 0x1449; +constexpr unsigned int mmBIF_RFE_MST_SMBUS_CMDSTATUS__VI = 0x1448; +constexpr unsigned int mmBIF_RFE_WARMRST_CNTL__VI = 0x1459; +constexpr unsigned int mmBIF_RLC_INTR_CNTL__VI = 0x1510; +constexpr unsigned int mmBIF_SLV_TRANS_PENDING__VI = 0x14E9; +constexpr unsigned int mmBIF_SMU_DATA__VI = 0x143E; +constexpr unsigned int mmBIF_SMU_INDEX__VI = 0x143D; +constexpr unsigned int mmBIF_VDDGFX_FB_CMP__VI = 0x143C; +constexpr unsigned int mmBIF_VDDGFX_GFX0_LOWER__VI = 0x1428; +constexpr unsigned int mmBIF_VDDGFX_GFX0_UPPER__VI = 0x1429; +constexpr unsigned int mmBIF_VDDGFX_GFX1_LOWER__VI = 0x142A; +constexpr unsigned int mmBIF_VDDGFX_GFX1_UPPER__VI = 0x142B; +constexpr unsigned int mmBIF_VDDGFX_GFX2_LOWER__VI = 0x142C; +constexpr unsigned int mmBIF_VDDGFX_GFX2_UPPER__VI = 0x142D; +constexpr unsigned int mmBIF_VDDGFX_GFX3_LOWER__VI = 0x142E; +constexpr unsigned int mmBIF_VDDGFX_GFX3_UPPER__VI = 0x142F; +constexpr unsigned int mmBIF_VDDGFX_GFX4_LOWER__VI = 0x1430; +constexpr unsigned int mmBIF_VDDGFX_GFX4_UPPER__VI = 0x1431; +constexpr unsigned int mmBIF_VDDGFX_GFX5_LOWER__VI = 0x1432; +constexpr unsigned int mmBIF_VDDGFX_GFX5_UPPER__VI = 0x1433; +constexpr unsigned int mmBIF_VDDGFX_RSV1_LOWER__VI = 0x1434; +constexpr unsigned int mmBIF_VDDGFX_RSV1_UPPER__VI = 0x1435; +constexpr unsigned int mmBIF_VDDGFX_RSV2_LOWER__VI = 0x1436; +constexpr unsigned int mmBIF_VDDGFX_RSV2_UPPER__VI = 0x1437; +constexpr unsigned int mmBIF_VDDGFX_RSV3_LOWER__VI = 0x1438; +constexpr unsigned int mmBIF_VDDGFX_RSV3_UPPER__VI = 0x1439; +constexpr unsigned int mmBIF_VDDGFX_RSV4_LOWER__VI = 0x143A; +constexpr unsigned int mmBIF_VDDGFX_RSV4_UPPER__VI = 0x143B; +constexpr unsigned int mmBIF_VIRT_RESET_REQ__VI = 0x14D2; +constexpr unsigned int mmBLND0_BLND_CONTROL__VI = 0x1B6D; +constexpr unsigned int mmBLND0_BLND_CONTROL2__VI = 0x1B6F; +constexpr unsigned int mmBLND0_BLND_DEBUG__VI = 0x1B74; +constexpr unsigned int mmBLND0_BLND_REG_UPDATE_STATUS__VI = 0x1B77; +constexpr unsigned int mmBLND0_BLND_TEST_DEBUG_DATA__VI = 0x1B76; +constexpr unsigned int mmBLND0_BLND_TEST_DEBUG_INDEX__VI = 0x1B75; +constexpr unsigned int mmBLND0_BLND_UNDERFLOW_INTERRUPT__VI = 0x1B71; +constexpr unsigned int mmBLND0_BLND_UPDATE__VI = 0x1B70; +constexpr unsigned int mmBLND0_BLND_V_UPDATE_LOCK__VI = 0x1B73; +constexpr unsigned int mmBLND0_SM_CONTROL2__VI = 0x1B6E; +constexpr unsigned int mmBLND1_BLND_CONTROL__VI = 0x1D6D; +constexpr unsigned int mmBLND1_BLND_CONTROL2__VI = 0x1D6F; +constexpr unsigned int mmBLND1_BLND_DEBUG__VI = 0x1D74; +constexpr unsigned int mmBLND1_BLND_REG_UPDATE_STATUS__VI = 0x1D77; +constexpr unsigned int mmBLND1_BLND_TEST_DEBUG_DATA__VI = 0x1D76; +constexpr unsigned int mmBLND1_BLND_TEST_DEBUG_INDEX__VI = 0x1D75; +constexpr unsigned int mmBLND1_BLND_UNDERFLOW_INTERRUPT__VI = 0x1D71; +constexpr unsigned int mmBLND1_BLND_UPDATE__VI = 0x1D70; +constexpr unsigned int mmBLND1_BLND_V_UPDATE_LOCK__VI = 0x1D73; +constexpr unsigned int mmBLND1_SM_CONTROL2__VI = 0x1D6E; +constexpr unsigned int mmBLND2_BLND_CONTROL__VI = 0x1F6D; +constexpr unsigned int mmBLND2_BLND_CONTROL2__VI = 0x1F6F; +constexpr unsigned int mmBLND2_BLND_DEBUG__VI = 0x1F74; +constexpr unsigned int mmBLND2_BLND_REG_UPDATE_STATUS__VI = 0x1F77; +constexpr unsigned int mmBLND2_BLND_TEST_DEBUG_DATA__VI = 0x1F76; +constexpr unsigned int mmBLND2_BLND_TEST_DEBUG_INDEX__VI = 0x1F75; +constexpr unsigned int mmBLND2_BLND_UNDERFLOW_INTERRUPT__VI = 0x1F71; +constexpr unsigned int mmBLND2_BLND_UPDATE__VI = 0x1F70; +constexpr unsigned int mmBLND2_BLND_V_UPDATE_LOCK__VI = 0x1F73; +constexpr unsigned int mmBLND2_SM_CONTROL2__VI = 0x1F6E; +constexpr unsigned int mmBLND3_BLND_CONTROL__VI = 0x416D; +constexpr unsigned int mmBLND3_BLND_CONTROL2__VI = 0x416F; +constexpr unsigned int mmBLND3_BLND_DEBUG__VI = 0x4174; +constexpr unsigned int mmBLND3_BLND_REG_UPDATE_STATUS__VI = 0x4177; +constexpr unsigned int mmBLND3_BLND_TEST_DEBUG_DATA__VI = 0x4176; +constexpr unsigned int mmBLND3_BLND_TEST_DEBUG_INDEX__VI = 0x4175; +constexpr unsigned int mmBLND3_BLND_UNDERFLOW_INTERRUPT__VI = 0x4171; +constexpr unsigned int mmBLND3_BLND_UPDATE__VI = 0x4170; +constexpr unsigned int mmBLND3_BLND_V_UPDATE_LOCK__VI = 0x4173; +constexpr unsigned int mmBLND3_SM_CONTROL2__VI = 0x416E; +constexpr unsigned int mmBLND4_BLND_CONTROL__VI = 0x436D; +constexpr unsigned int mmBLND4_BLND_CONTROL2__VI = 0x436F; +constexpr unsigned int mmBLND4_BLND_DEBUG__VI = 0x4374; +constexpr unsigned int mmBLND4_BLND_REG_UPDATE_STATUS__VI = 0x4377; +constexpr unsigned int mmBLND4_BLND_TEST_DEBUG_DATA__VI = 0x4376; +constexpr unsigned int mmBLND4_BLND_TEST_DEBUG_INDEX__VI = 0x4375; +constexpr unsigned int mmBLND4_BLND_UNDERFLOW_INTERRUPT__VI = 0x4371; +constexpr unsigned int mmBLND4_BLND_UPDATE__VI = 0x4370; +constexpr unsigned int mmBLND4_BLND_V_UPDATE_LOCK__VI = 0x4373; +constexpr unsigned int mmBLND4_SM_CONTROL2__VI = 0x436E; +constexpr unsigned int mmBLND5_BLND_CONTROL__VI = 0x456D; +constexpr unsigned int mmBLND5_BLND_CONTROL2__VI = 0x456F; +constexpr unsigned int mmBLND5_BLND_DEBUG__VI = 0x4574; +constexpr unsigned int mmBLND5_BLND_REG_UPDATE_STATUS__VI = 0x4577; +constexpr unsigned int mmBLND5_BLND_TEST_DEBUG_DATA__VI = 0x4576; +constexpr unsigned int mmBLND5_BLND_TEST_DEBUG_INDEX__VI = 0x4575; +constexpr unsigned int mmBLND5_BLND_UNDERFLOW_INTERRUPT__VI = 0x4571; +constexpr unsigned int mmBLND5_BLND_UPDATE__VI = 0x4570; +constexpr unsigned int mmBLND5_BLND_V_UPDATE_LOCK__VI = 0x4573; +constexpr unsigned int mmBLND5_SM_CONTROL2__VI = 0x456E; +constexpr unsigned int mmBLND6_BLND_CONTROL__VI = 0x476D; +constexpr unsigned int mmBLND6_BLND_CONTROL2__VI = 0x476F; +constexpr unsigned int mmBLND6_BLND_DEBUG__VI = 0x4774; +constexpr unsigned int mmBLND6_BLND_REG_UPDATE_STATUS__VI = 0x4777; +constexpr unsigned int mmBLND6_BLND_TEST_DEBUG_DATA__VI = 0x4776; +constexpr unsigned int mmBLND6_BLND_TEST_DEBUG_INDEX__VI = 0x4775; +constexpr unsigned int mmBLND6_BLND_UNDERFLOW_INTERRUPT__VI = 0x4771; +constexpr unsigned int mmBLND6_BLND_UPDATE__VI = 0x4770; +constexpr unsigned int mmBLND6_BLND_V_UPDATE_LOCK__VI = 0x4773; +constexpr unsigned int mmBLND6_SM_CONTROL2__VI = 0x476E; +constexpr unsigned int mmBLND_CONTROL__VI = 0x1B6D; +constexpr unsigned int mmBLND_CONTROL2__VI = 0x1B6F; +constexpr unsigned int mmBLND_DEBUG__VI = 0x1B74; +constexpr unsigned int mmBLND_REG_UPDATE_STATUS__VI = 0x1B77; +constexpr unsigned int mmBLND_TEST_DEBUG_DATA__VI = 0x1B76; +constexpr unsigned int mmBLND_TEST_DEBUG_INDEX__VI = 0x1B75; +constexpr unsigned int mmBLND_UNDERFLOW_INTERRUPT__VI = 0x1B71; +constexpr unsigned int mmBLND_UPDATE__VI = 0x1B70; +constexpr unsigned int mmBLND_V_UPDATE_LOCK__VI = 0x1B73; +constexpr unsigned int mmBL_PWM_CNTL__VI = 0x4820; +constexpr unsigned int mmBL_PWM_CNTL2__VI = 0x4821; +constexpr unsigned int mmBL_PWM_GRP1_REG_LOCK__VI = 0x4823; +constexpr unsigned int mmBL_PWM_PERIOD_CNTL__VI = 0x4822; +constexpr unsigned int mmBPHYC_DAC_AUTO_CALIB_CONTROL__VI = 0x48BA; +constexpr unsigned int mmBPHYC_DAC_MACRO_CNTL__VI = 0x48B9; +constexpr unsigned int mmBPHYC_PLL0_DISPPLL_BG_CNTL__VI = 0x171E; +constexpr unsigned int mmBPHYC_PLL0_PLL_ANALOG__VI = 0x1708; +constexpr unsigned int mmBPHYC_PLL0_PLL_ANALOG_CNTL__VI = 0x1711; +constexpr unsigned int mmBPHYC_PLL0_PLL_CNTL__VI = 0x1707; +constexpr unsigned int mmBPHYC_PLL0_PLL_DEBUG_CNTL__VI = 0x170B; +constexpr unsigned int mmBPHYC_PLL0_PLL_DS_CNTL__VI = 0x1705; +constexpr unsigned int mmBPHYC_PLL0_PLL_FB_DIV__VI = 0x1701; +constexpr unsigned int mmBPHYC_PLL0_PLL_IDCLK_CNTL__VI = 0x1706; +constexpr unsigned int mmBPHYC_PLL0_PLL_POST_DIV__VI = 0x1702; +constexpr unsigned int mmBPHYC_PLL0_PLL_REF_DIV__VI = 0x1700; +constexpr unsigned int mmBPHYC_PLL0_PLL_SS_AMOUNT_DSFRAC__VI = 0x1703; +constexpr unsigned int mmBPHYC_PLL0_PLL_SS_CNTL__VI = 0x1704; +constexpr unsigned int mmBPHYC_PLL0_PLL_UNLOCK_DETECT_CNTL__VI = 0x170A; +constexpr unsigned int mmBPHYC_PLL0_PLL_UPDATE_CNTL__VI = 0x170D; +constexpr unsigned int mmBPHYC_PLL0_PLL_UPDATE_LOCK__VI = 0x170C; +constexpr unsigned int mmBPHYC_PLL0_PLL_VREG_CNTL__VI = 0x1709; +constexpr unsigned int mmBPHYC_PLL0_PLL_XOR_LOCK__VI = 0x1710; +constexpr unsigned int mmBPHYC_PLL0_PPLL_DEBUG_MUX_CNTL__VI = 0x1721; +constexpr unsigned int mmBPHYC_PLL0_PPLL_DIV_UPDATE_DEBUG__VI = 0x171F; +constexpr unsigned int mmBPHYC_PLL0_PPLL_SPARE0__VI = 0x1722; +constexpr unsigned int mmBPHYC_PLL0_PPLL_SPARE1__VI = 0x1723; +constexpr unsigned int mmBPHYC_PLL0_PPLL_STATUS_DEBUG__VI = 0x1720; +constexpr unsigned int mmBPHYC_PLL0_VGA25_PPLL_ANALOG__VI = 0x171B; +constexpr unsigned int mmBPHYC_PLL0_VGA25_PPLL_FB_DIV__VI = 0x1715; +constexpr unsigned int mmBPHYC_PLL0_VGA25_PPLL_POST_DIV__VI = 0x1718; +constexpr unsigned int mmBPHYC_PLL0_VGA25_PPLL_REF_DIV__VI = 0x1712; +constexpr unsigned int mmBPHYC_PLL0_VGA28_PPLL_ANALOG__VI = 0x171C; +constexpr unsigned int mmBPHYC_PLL0_VGA28_PPLL_FB_DIV__VI = 0x1716; +constexpr unsigned int mmBPHYC_PLL0_VGA28_PPLL_POST_DIV__VI = 0x1719; +constexpr unsigned int mmBPHYC_PLL0_VGA28_PPLL_REF_DIV__VI = 0x1713; +constexpr unsigned int mmBPHYC_PLL0_VGA41_PPLL_ANALOG__VI = 0x171D; +constexpr unsigned int mmBPHYC_PLL0_VGA41_PPLL_FB_DIV__VI = 0x1717; +constexpr unsigned int mmBPHYC_PLL0_VGA41_PPLL_POST_DIV__VI = 0x171A; +constexpr unsigned int mmBPHYC_PLL0_VGA41_PPLL_REF_DIV__VI = 0x1714; +constexpr unsigned int mmBPHYC_PLL1_DISPPLL_BG_CNTL__VI = 0x1748; +constexpr unsigned int mmBPHYC_PLL1_PLL_ANALOG__VI = 0x1732; +constexpr unsigned int mmBPHYC_PLL1_PLL_ANALOG_CNTL__VI = 0x173B; +constexpr unsigned int mmBPHYC_PLL1_PLL_CNTL__VI = 0x1731; +constexpr unsigned int mmBPHYC_PLL1_PLL_DEBUG_CNTL__VI = 0x1735; +constexpr unsigned int mmBPHYC_PLL1_PLL_DS_CNTL__VI = 0x172F; +constexpr unsigned int mmBPHYC_PLL1_PLL_FB_DIV__VI = 0x172B; +constexpr unsigned int mmBPHYC_PLL1_PLL_IDCLK_CNTL__VI = 0x1730; +constexpr unsigned int mmBPHYC_PLL1_PLL_POST_DIV__VI = 0x172C; +constexpr unsigned int mmBPHYC_PLL1_PLL_REF_DIV__VI = 0x172A; +constexpr unsigned int mmBPHYC_PLL1_PLL_SS_AMOUNT_DSFRAC__VI = 0x172D; +constexpr unsigned int mmBPHYC_PLL1_PLL_SS_CNTL__VI = 0x172E; +constexpr unsigned int mmBPHYC_PLL1_PLL_UNLOCK_DETECT_CNTL__VI = 0x1734; +constexpr unsigned int mmBPHYC_PLL1_PLL_UPDATE_CNTL__VI = 0x1737; +constexpr unsigned int mmBPHYC_PLL1_PLL_UPDATE_LOCK__VI = 0x1736; +constexpr unsigned int mmBPHYC_PLL1_PLL_VREG_CNTL__VI = 0x1733; +constexpr unsigned int mmBPHYC_PLL1_PLL_XOR_LOCK__VI = 0x173A; +constexpr unsigned int mmBPHYC_PLL1_PPLL_DEBUG_MUX_CNTL__VI = 0x174B; +constexpr unsigned int mmBPHYC_PLL1_PPLL_DIV_UPDATE_DEBUG__VI = 0x1749; +constexpr unsigned int mmBPHYC_PLL1_PPLL_SPARE0__VI = 0x174C; +constexpr unsigned int mmBPHYC_PLL1_PPLL_SPARE1__VI = 0x174D; +constexpr unsigned int mmBPHYC_PLL1_PPLL_STATUS_DEBUG__VI = 0x174A; +constexpr unsigned int mmBPHYC_PLL1_VGA25_PPLL_ANALOG__VI = 0x1745; +constexpr unsigned int mmBPHYC_PLL1_VGA25_PPLL_FB_DIV__VI = 0x173F; +constexpr unsigned int mmBPHYC_PLL1_VGA25_PPLL_POST_DIV__VI = 0x1742; +constexpr unsigned int mmBPHYC_PLL1_VGA25_PPLL_REF_DIV__VI = 0x173C; +constexpr unsigned int mmBPHYC_PLL1_VGA28_PPLL_ANALOG__VI = 0x1746; +constexpr unsigned int mmBPHYC_PLL1_VGA28_PPLL_FB_DIV__VI = 0x1740; +constexpr unsigned int mmBPHYC_PLL1_VGA28_PPLL_POST_DIV__VI = 0x1743; +constexpr unsigned int mmBPHYC_PLL1_VGA28_PPLL_REF_DIV__VI = 0x173D; +constexpr unsigned int mmBPHYC_PLL1_VGA41_PPLL_ANALOG__VI = 0x1747; +constexpr unsigned int mmBPHYC_PLL1_VGA41_PPLL_FB_DIV__VI = 0x1741; +constexpr unsigned int mmBPHYC_PLL1_VGA41_PPLL_POST_DIV__VI = 0x1744; +constexpr unsigned int mmBPHYC_PLL1_VGA41_PPLL_REF_DIV__VI = 0x173E; +constexpr unsigned int mmBPHYC_PLL2_DISPPLL_BG_CNTL__VI = 0x1772; +constexpr unsigned int mmBPHYC_PLL2_PLL_ANALOG__VI = 0x175C; +constexpr unsigned int mmBPHYC_PLL2_PLL_ANALOG_CNTL__VI = 0x1765; +constexpr unsigned int mmBPHYC_PLL2_PLL_CNTL__VI = 0x175B; +constexpr unsigned int mmBPHYC_PLL2_PLL_DEBUG_CNTL__VI = 0x175F; +constexpr unsigned int mmBPHYC_PLL2_PLL_DS_CNTL__VI = 0x1759; +constexpr unsigned int mmBPHYC_PLL2_PLL_FB_DIV__VI = 0x1755; +constexpr unsigned int mmBPHYC_PLL2_PLL_IDCLK_CNTL__VI = 0x175A; +constexpr unsigned int mmBPHYC_PLL2_PLL_POST_DIV__VI = 0x1756; +constexpr unsigned int mmBPHYC_PLL2_PLL_REF_DIV__VI = 0x1754; +constexpr unsigned int mmBPHYC_PLL2_PLL_SS_AMOUNT_DSFRAC__VI = 0x1757; +constexpr unsigned int mmBPHYC_PLL2_PLL_SS_CNTL__VI = 0x1758; +constexpr unsigned int mmBPHYC_PLL2_PLL_UNLOCK_DETECT_CNTL__VI = 0x175E; +constexpr unsigned int mmBPHYC_PLL2_PLL_UPDATE_CNTL__VI = 0x1761; +constexpr unsigned int mmBPHYC_PLL2_PLL_UPDATE_LOCK__VI = 0x1760; +constexpr unsigned int mmBPHYC_PLL2_PLL_VREG_CNTL__VI = 0x175D; +constexpr unsigned int mmBPHYC_PLL2_PLL_XOR_LOCK__VI = 0x1764; +constexpr unsigned int mmBPHYC_PLL2_PPLL_DEBUG_MUX_CNTL__VI = 0x1775; +constexpr unsigned int mmBPHYC_PLL2_PPLL_DIV_UPDATE_DEBUG__VI = 0x1773; +constexpr unsigned int mmBPHYC_PLL2_PPLL_SPARE0__VI = 0x1776; +constexpr unsigned int mmBPHYC_PLL2_PPLL_SPARE1__VI = 0x1777; +constexpr unsigned int mmBPHYC_PLL2_PPLL_STATUS_DEBUG__VI = 0x1774; +constexpr unsigned int mmBPHYC_PLL2_VGA25_PPLL_ANALOG__VI = 0x176F; +constexpr unsigned int mmBPHYC_PLL2_VGA25_PPLL_FB_DIV__VI = 0x1769; +constexpr unsigned int mmBPHYC_PLL2_VGA25_PPLL_POST_DIV__VI = 0x176C; +constexpr unsigned int mmBPHYC_PLL2_VGA25_PPLL_REF_DIV__VI = 0x1766; +constexpr unsigned int mmBPHYC_PLL2_VGA28_PPLL_ANALOG__VI = 0x1770; +constexpr unsigned int mmBPHYC_PLL2_VGA28_PPLL_FB_DIV__VI = 0x176A; +constexpr unsigned int mmBPHYC_PLL2_VGA28_PPLL_POST_DIV__VI = 0x176D; +constexpr unsigned int mmBPHYC_PLL2_VGA28_PPLL_REF_DIV__VI = 0x1767; +constexpr unsigned int mmBPHYC_PLL2_VGA41_PPLL_ANALOG__VI = 0x1771; +constexpr unsigned int mmBPHYC_PLL2_VGA41_PPLL_FB_DIV__VI = 0x176B; +constexpr unsigned int mmBPHYC_PLL2_VGA41_PPLL_POST_DIV__VI = 0x176E; +constexpr unsigned int mmBPHYC_PLL2_VGA41_PPLL_REF_DIV__VI = 0x1768; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_ANG_BIST_CNTL__VI = 0x48CC; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x48CA; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_DEBUG__VI = 0x48D6; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_PLL_CONTROL1__VI = 0x48C6; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_PLL_CONTROL2__VI = 0x48C7; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_PLL_FBDIV__VI = 0x48C5; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_PLL_SS_CNTL__VI = 0x48C9; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x48C8; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_POWER_CONTROL__VI = 0x48C4; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_REG_TEST_OUTPUT__VI = 0x48CB; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_REG_TEST_OUTPUT2__VI = 0x48CD; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_TPG_CONTROL__VI = 0x48D4; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_TPG_SEED__VI = 0x48D5; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_TX_CONTROL1__VI = 0x48C0; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_TX_CONTROL2__VI = 0x48C1; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_TX_CONTROL3__VI = 0x48C2; +constexpr unsigned int mmBPHYC_UNIPHY0_UNIPHY_TX_CONTROL4__VI = 0x48C3; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_ANG_BIST_CNTL__VI = 0x48EC; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x48EA; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_DEBUG__VI = 0x48F6; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_PLL_CONTROL1__VI = 0x48E6; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_PLL_CONTROL2__VI = 0x48E7; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_PLL_FBDIV__VI = 0x48E5; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_PLL_SS_CNTL__VI = 0x48E9; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x48E8; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_POWER_CONTROL__VI = 0x48E4; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_REG_TEST_OUTPUT__VI = 0x48EB; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_REG_TEST_OUTPUT2__VI = 0x48ED; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_TPG_CONTROL__VI = 0x48F4; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_TPG_SEED__VI = 0x48F5; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_TX_CONTROL1__VI = 0x48E0; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_TX_CONTROL2__VI = 0x48E1; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_TX_CONTROL3__VI = 0x48E2; +constexpr unsigned int mmBPHYC_UNIPHY1_UNIPHY_TX_CONTROL4__VI = 0x48E3; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_ANG_BIST_CNTL__VI = 0x490C; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x490A; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_DEBUG__VI = 0x4916; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_PLL_CONTROL1__VI = 0x4906; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_PLL_CONTROL2__VI = 0x4907; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_PLL_FBDIV__VI = 0x4905; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_PLL_SS_CNTL__VI = 0x4909; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x4908; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_POWER_CONTROL__VI = 0x4904; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_REG_TEST_OUTPUT__VI = 0x490B; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_REG_TEST_OUTPUT2__VI = 0x490D; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_TPG_CONTROL__VI = 0x4914; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_TPG_SEED__VI = 0x4915; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_TX_CONTROL1__VI = 0x4900; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_TX_CONTROL2__VI = 0x4901; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_TX_CONTROL3__VI = 0x4902; +constexpr unsigned int mmBPHYC_UNIPHY2_UNIPHY_TX_CONTROL4__VI = 0x4903; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_ANG_BIST_CNTL__VI = 0x492C; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x492A; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_DEBUG__VI = 0x4936; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_PLL_CONTROL1__VI = 0x4926; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_PLL_CONTROL2__VI = 0x4927; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_PLL_FBDIV__VI = 0x4925; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_PLL_SS_CNTL__VI = 0x4929; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x4928; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_POWER_CONTROL__VI = 0x4924; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_REG_TEST_OUTPUT__VI = 0x492B; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_REG_TEST_OUTPUT2__VI = 0x492D; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_TPG_CONTROL__VI = 0x4934; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_TPG_SEED__VI = 0x4935; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_TX_CONTROL1__VI = 0x4920; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_TX_CONTROL2__VI = 0x4921; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_TX_CONTROL3__VI = 0x4922; +constexpr unsigned int mmBPHYC_UNIPHY3_UNIPHY_TX_CONTROL4__VI = 0x4923; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_ANG_BIST_CNTL__VI = 0x494C; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x494A; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_DEBUG__VI = 0x4956; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_PLL_CONTROL1__VI = 0x4946; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_PLL_CONTROL2__VI = 0x4947; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_PLL_FBDIV__VI = 0x4945; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_PLL_SS_CNTL__VI = 0x4949; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x4948; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_POWER_CONTROL__VI = 0x4944; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_REG_TEST_OUTPUT__VI = 0x494B; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_REG_TEST_OUTPUT2__VI = 0x494D; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_TPG_CONTROL__VI = 0x4954; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_TPG_SEED__VI = 0x4955; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_TX_CONTROL1__VI = 0x4940; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_TX_CONTROL2__VI = 0x4941; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_TX_CONTROL3__VI = 0x4942; +constexpr unsigned int mmBPHYC_UNIPHY4_UNIPHY_TX_CONTROL4__VI = 0x4943; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_ANG_BIST_CNTL__VI = 0x496C; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x496A; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_DEBUG__VI = 0x4976; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_PLL_CONTROL1__VI = 0x4966; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_PLL_CONTROL2__VI = 0x4967; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_PLL_FBDIV__VI = 0x4965; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_PLL_SS_CNTL__VI = 0x4969; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x4968; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_POWER_CONTROL__VI = 0x4964; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_REG_TEST_OUTPUT__VI = 0x496B; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_REG_TEST_OUTPUT2__VI = 0x496D; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_TPG_CONTROL__VI = 0x4974; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_TPG_SEED__VI = 0x4975; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_TX_CONTROL1__VI = 0x4960; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_TX_CONTROL2__VI = 0x4961; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_TX_CONTROL3__VI = 0x4962; +constexpr unsigned int mmBPHYC_UNIPHY5_UNIPHY_TX_CONTROL4__VI = 0x4963; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_ANG_BIST_CNTL__VI = 0x498C; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_DATA_SYNCHRONIZATION__VI = 0x498A; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_DEBUG__VI = 0x4996; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_PLL_CONTROL1__VI = 0x4986; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_PLL_CONTROL2__VI = 0x4987; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_PLL_FBDIV__VI = 0x4985; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_PLL_SS_CNTL__VI = 0x4989; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_PLL_SS_STEP_SIZE__VI = 0x4988; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_POWER_CONTROL__VI = 0x4984; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_REG_TEST_OUTPUT__VI = 0x498B; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_REG_TEST_OUTPUT2__VI = 0x498D; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_TPG_CONTROL__VI = 0x4994; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_TPG_SEED__VI = 0x4995; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_TX_CONTROL1__VI = 0x4980; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_TX_CONTROL2__VI = 0x4981; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_TX_CONTROL3__VI = 0x4982; +constexpr unsigned int mmBPHYC_UNIPHY6_UNIPHY_TX_CONTROL4__VI = 0x4983; +constexpr unsigned int mmBX_RESET_CNTL__VI = 0x1518; +constexpr unsigned int mmCB_COLOR0_DCC_BASE__VI = 0xA325; +constexpr unsigned int mmCB_COLOR0_DCC_CONTROL__VI = 0xA31E; +constexpr unsigned int mmCB_COLOR1_DCC_BASE__VI = 0xA334; +constexpr unsigned int mmCB_COLOR1_DCC_CONTROL__VI = 0xA32D; +constexpr unsigned int mmCB_COLOR2_DCC_BASE__VI = 0xA343; +constexpr unsigned int mmCB_COLOR2_DCC_CONTROL__VI = 0xA33C; +constexpr unsigned int mmCB_COLOR3_DCC_BASE__VI = 0xA352; +constexpr unsigned int mmCB_COLOR3_DCC_CONTROL__VI = 0xA34B; +constexpr unsigned int mmCB_COLOR4_DCC_BASE__VI = 0xA361; +constexpr unsigned int mmCB_COLOR4_DCC_CONTROL__VI = 0xA35A; +constexpr unsigned int mmCB_COLOR5_DCC_BASE__VI = 0xA370; +constexpr unsigned int mmCB_COLOR5_DCC_CONTROL__VI = 0xA369; +constexpr unsigned int mmCB_COLOR6_DCC_BASE__VI = 0xA37F; +constexpr unsigned int mmCB_COLOR6_DCC_CONTROL__VI = 0xA378; +constexpr unsigned int mmCB_COLOR7_DCC_BASE__VI = 0xA38E; +constexpr unsigned int mmCB_COLOR7_DCC_CONTROL__VI = 0xA387; +constexpr unsigned int mmCB_DCC_CONFIG__VI = 0x2687; +constexpr unsigned int mmCB_DCC_CONTROL__VI = 0xA109; +constexpr unsigned int mmCB_DEBUG_BUS_19__VI = 0x26AB; +constexpr unsigned int mmCB_DEBUG_BUS_20__VI = 0x26AC; +constexpr unsigned int mmCB_DEBUG_BUS_21__VI = 0x26AD; +constexpr unsigned int mmCB_DEBUG_BUS_22__VI = 0x26AE; +constexpr unsigned int mmCC_DC_PIPE_DIS__VI = 0x0312; +constexpr unsigned int mmCC_GC_SHADER_RATE_CONFIG__VI = 0x2312; +constexpr unsigned int mmCC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY__VI = 0x1835; +constexpr unsigned int mmCC_RCU_DC_AUDIO_PORT_CONNECTIVITY__VI = 0x1834; +constexpr unsigned int mmCG_FPS_CNT__VI = 0x01B6; +constexpr unsigned int mmCLKREQB_PERF_COUNTER__VI = 0x1522; +constexpr unsigned int mmCNV_CSC_C11_C12__VI = 0x5E20; +constexpr unsigned int mmCNV_CSC_C13_C14__VI = 0x5E21; +constexpr unsigned int mmCNV_CSC_C21_C22__VI = 0x5E22; +constexpr unsigned int mmCNV_CSC_C23_C24__VI = 0x5E23; +constexpr unsigned int mmCNV_CSC_C31_C32__VI = 0x5E24; +constexpr unsigned int mmCNV_CSC_C33_C34__VI = 0x5E25; +constexpr unsigned int mmCNV_CSC_CLAMP_B__VI = 0x5E2B; +constexpr unsigned int mmCNV_CSC_CLAMP_G__VI = 0x5E2A; +constexpr unsigned int mmCNV_CSC_CLAMP_R__VI = 0x5E29; +constexpr unsigned int mmCNV_CSC_CONTROL__VI = 0x5E1F; +constexpr unsigned int mmCNV_CSC_ROUND_OFFSET_B__VI = 0x5E28; +constexpr unsigned int mmCNV_CSC_ROUND_OFFSET_G__VI = 0x5E27; +constexpr unsigned int mmCNV_CSC_ROUND_OFFSET_R__VI = 0x5E26; +constexpr unsigned int mmCNV_INPUT_SELECT__VI = 0x5E33; +constexpr unsigned int mmCNV_MODE__VI = 0x5E1A; +constexpr unsigned int mmCNV_SOURCE_SIZE__VI = 0x5E1E; +constexpr unsigned int mmCNV_TEST_CNTL__VI = 0x5E2C; +constexpr unsigned int mmCNV_TEST_CRC_BLUE__VI = 0x5E2F; +constexpr unsigned int mmCNV_TEST_CRC_GREEN__VI = 0x5E2E; +constexpr unsigned int mmCNV_TEST_CRC_RED__VI = 0x5E2D; +constexpr unsigned int mmCNV_TEST_DEBUG_DATA__VI = 0x5E35; +constexpr unsigned int mmCNV_TEST_DEBUG_INDEX__VI = 0x5E34; +constexpr unsigned int mmCNV_UPDATE__VI = 0x5E1D; +constexpr unsigned int mmCNV_WINDOW_SIZE__VI = 0x5E1C; +constexpr unsigned int mmCNV_WINDOW_START__VI = 0x5E1B; +constexpr unsigned int mmCOL_MAN_DEBUG_CONTROL__VI = 0x46E6; +constexpr unsigned int mmCOL_MAN_FP_CONVERTED_FIELD__VI = 0x46C7; +constexpr unsigned int mmCOL_MAN_INPUT_CSC_CONTROL__VI = 0x46A5; +constexpr unsigned int mmCOL_MAN_OUTPUT_CSC_CONTROL__VI = 0x46B6; +constexpr unsigned int mmCOL_MAN_TEST_DEBUG_DATA__VI = 0x46E5; +constexpr unsigned int mmCOL_MAN_TEST_DEBUG_INDEX__VI = 0x46E4; +constexpr unsigned int mmCOL_MAN_UPDATE__VI = 0x46A4; +constexpr unsigned int mmCOMM_MATRIXA_TRANS_C11_C12__VI = 0x1A43; +constexpr unsigned int mmCOMM_MATRIXA_TRANS_C13_C14__VI = 0x1A44; +constexpr unsigned int mmCOMM_MATRIXA_TRANS_C21_C22__VI = 0x1A45; +constexpr unsigned int mmCOMM_MATRIXA_TRANS_C23_C24__VI = 0x1A46; +constexpr unsigned int mmCOMM_MATRIXA_TRANS_C31_C32__VI = 0x1A47; +constexpr unsigned int mmCOMM_MATRIXA_TRANS_C33_C34__VI = 0x1A48; +constexpr unsigned int mmCOMM_MATRIXB_TRANS_C11_C12__VI = 0x1A49; +constexpr unsigned int mmCOMM_MATRIXB_TRANS_C13_C14__VI = 0x1A4A; +constexpr unsigned int mmCOMM_MATRIXB_TRANS_C21_C22__VI = 0x1A4B; +constexpr unsigned int mmCOMM_MATRIXB_TRANS_C23_C24__VI = 0x1A4C; +constexpr unsigned int mmCOMM_MATRIXB_TRANS_C31_C32__VI = 0x1A4D; +constexpr unsigned int mmCOMM_MATRIXB_TRANS_C33_C34__VI = 0x1A4E; +constexpr unsigned int mmCOMPUTE_DISPATCH_ID__VI = 0x2E20; +constexpr unsigned int mmCOMPUTE_NOWHERE__VI = 0x2E7F; +constexpr unsigned int mmCOMPUTE_RELAUNCH__VI = 0x2E22; +constexpr unsigned int mmCOMPUTE_THREADGROUP_ID__VI = 0x2E21; +constexpr unsigned int mmCOMPUTE_WAVE_RESTORE_ADDR_HI__VI = 0x2E24; +constexpr unsigned int mmCOMPUTE_WAVE_RESTORE_ADDR_LO__VI = 0x2E23; +constexpr unsigned int mmCOMPUTE_WAVE_RESTORE_CONTROL__VI = 0x2E25; +constexpr unsigned int mmCONFIG_RESERVED__VI = 0x1502; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED0__VI = 0x5FD0; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED1__VI = 0x5FD1; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED10__VI = 0x5FDA; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED11__VI = 0x5FDB; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED2__VI = 0x5FD2; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED3__VI = 0x5FD3; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED4__VI = 0x5FD4; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED5__VI = 0x5FD5; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED6__VI = 0x5FD6; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED7__VI = 0x5FD7; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED8__VI = 0x5FD8; +constexpr unsigned int mmCPLL_MACRO_CNTL_RESERVED9__VI = 0x5FD9; +constexpr unsigned int mmCPM_CONTROL__VI = 0x14B8; +constexpr unsigned int mmCP_CE_COMPLETION_STATUS__VI = 0xC0ED; +constexpr unsigned int mmCP_CE_METADATA_BASE_ADDR__VI = 0xC0F2; +constexpr unsigned int mmCP_CE_METADATA_BASE_ADDR_HI__VI = 0xC0F3; +constexpr unsigned int mmCP_CE_RB_OFFSET__VI = 0xC09B; +constexpr unsigned int mmCP_CE_UCODE_ADDR__SI__CI = 0x305A; +constexpr unsigned int mmCP_CE_UCODE_ADDR__VI = 0xF818; +constexpr unsigned int mmCP_CE_UCODE_DATA__SI__CI = 0x305B; +constexpr unsigned int mmCP_CE_UCODE_DATA__VI = 0xF819; +constexpr unsigned int mmCP_CONFIG__VI = 0x0F96; +constexpr unsigned int mmCP_CPC_IC_BASE_CNTL__VI = 0x30BB; +constexpr unsigned int mmCP_CPC_IC_BASE_HI__VI = 0x30BA; +constexpr unsigned int mmCP_CPC_IC_BASE_LO__VI = 0x30B9; +constexpr unsigned int mmCP_CPC_IC_OP_CNTL__VI = 0x30BC; +constexpr unsigned int mmCP_CPC_MGCG_SYNC_CNTL__VI = 0x3036; +constexpr unsigned int mmCP_DFY_CMD__VI = 0x3034; +constexpr unsigned int mmCP_DISPATCH_INDR_ADDR__VI = 0xC0F6; +constexpr unsigned int mmCP_DISPATCH_INDR_ADDR_HI__VI = 0xC0F7; +constexpr unsigned int mmCP_DRAW_INDX_INDR_ADDR__VI = 0xC0F4; +constexpr unsigned int mmCP_DRAW_INDX_INDR_ADDR_HI__VI = 0xC0F5; +constexpr unsigned int mmCP_DRAW_OBJECT__VI = 0xD810; +constexpr unsigned int mmCP_DRAW_OBJECT_COUNTER__VI = 0xD811; +constexpr unsigned int mmCP_DRAW_WINDOW_CNTL__VI = 0xD815; +constexpr unsigned int mmCP_DRAW_WINDOW_HI__VI = 0xD813; +constexpr unsigned int mmCP_DRAW_WINDOW_LO__VI = 0xD814; +constexpr unsigned int mmCP_DRAW_WINDOW_MASK_HI__VI = 0xD812; +constexpr unsigned int mmCP_EOP_DONE_CNTX_ID__VI = 0xC0D7; +constexpr unsigned int mmCP_GDS_BKUP_ADDR__VI = 0xC0FB; +constexpr unsigned int mmCP_GDS_BKUP_ADDR_HI__VI = 0xC0FC; +constexpr unsigned int mmCP_HPD_STATUS0__VI = 0x3241; +constexpr unsigned int mmCP_HQD_CNTL_STACK_OFFSET__VI = 0x3273; +constexpr unsigned int mmCP_HQD_CNTL_STACK_SIZE__VI = 0x3274; +constexpr unsigned int mmCP_HQD_CTX_SAVE_BASE_ADDR_HI__VI = 0x3271; +constexpr unsigned int mmCP_HQD_CTX_SAVE_BASE_ADDR_LO__VI = 0x3270; +constexpr unsigned int mmCP_HQD_CTX_SAVE_CONTROL__VI = 0x3272; +constexpr unsigned int mmCP_HQD_CTX_SAVE_SIZE__VI = 0x3276; +constexpr unsigned int mmCP_HQD_EOP_BASE_ADDR__VI = 0x326A; +constexpr unsigned int mmCP_HQD_EOP_BASE_ADDR_HI__VI = 0x326B; +constexpr unsigned int mmCP_HQD_EOP_CONTROL__VI = 0x326C; +constexpr unsigned int mmCP_HQD_EOP_DONES__VI = 0x327A; +constexpr unsigned int mmCP_HQD_EOP_EVENTS__VI = 0x326F; +constexpr unsigned int mmCP_HQD_EOP_RPTR__VI = 0x326D; +constexpr unsigned int mmCP_HQD_EOP_WPTR__VI = 0x326E; +constexpr unsigned int mmCP_HQD_EOP_WPTR_MEM__VI = 0x3279; +constexpr unsigned int mmCP_HQD_ERROR__VI = 0x3278; +constexpr unsigned int mmCP_HQD_GDS_RESOURCE_STATE__VI = 0x3277; +constexpr unsigned int mmCP_HQD_HQ_CONTROL0__VI = 0x3266; +constexpr unsigned int mmCP_HQD_HQ_CONTROL1__VI = 0x3269; +constexpr unsigned int mmCP_HQD_HQ_STATUS0__VI = 0x3265; +constexpr unsigned int mmCP_HQD_HQ_STATUS1__VI = 0x3268; +constexpr unsigned int mmCP_HQD_OFFLOAD__VI = 0x325E; +constexpr unsigned int mmCP_HQD_WG_STATE_OFFSET__VI = 0x3275; +constexpr unsigned int mmCP_INDEX_BASE_ADDR__VI = 0xC0F8; +constexpr unsigned int mmCP_INDEX_BASE_ADDR_HI__VI = 0xC0F9; +constexpr unsigned int mmCP_INDEX_TYPE__VI = 0xC0FA; +constexpr unsigned int mmCP_MEC1_F32_INT_DIS__VI = 0x30BD; +constexpr unsigned int mmCP_MEC2_F32_INT_DIS__VI = 0x30BE; +constexpr unsigned int mmCP_MEC_DOORBELL_RANGE_LOWER__VI = 0x305C; +constexpr unsigned int mmCP_MEC_DOORBELL_RANGE_UPPER__VI = 0x305D; +constexpr unsigned int mmCP_MEC_ME1_UCODE_ADDR__VI = 0xF81A; +constexpr unsigned int mmCP_MEC_ME1_UCODE_DATA__VI = 0xF81B; +constexpr unsigned int mmCP_MEC_ME2_UCODE_ADDR__VI = 0xF81C; +constexpr unsigned int mmCP_MEC_ME2_UCODE_DATA__VI = 0xF81D; +constexpr unsigned int mmCP_ME_RAM_DATA__SI__CI = 0x3058; +constexpr unsigned int mmCP_ME_RAM_DATA__VI = 0xF817; +constexpr unsigned int mmCP_ME_RAM_RADDR__SI__CI = 0x3056; +constexpr unsigned int mmCP_ME_RAM_RADDR__VI = 0xF816; +constexpr unsigned int mmCP_ME_RAM_WADDR__SI__CI = 0x3057; +constexpr unsigned int mmCP_ME_RAM_WADDR__VI = 0xF816; +constexpr unsigned int mmCP_PFP_COMPLETION_STATUS__VI = 0xC0EC; +constexpr unsigned int mmCP_PFP_METADATA_BASE_ADDR__VI = 0xC0F0; +constexpr unsigned int mmCP_PFP_METADATA_BASE_ADDR_HI__VI = 0xC0F1; +constexpr unsigned int mmCP_PFP_UCODE_ADDR__SI__CI = 0x3054; +constexpr unsigned int mmCP_PFP_UCODE_ADDR__VI = 0xF814; +constexpr unsigned int mmCP_PFP_UCODE_DATA__SI__CI = 0x3055; +constexpr unsigned int mmCP_PFP_UCODE_DATA__VI = 0xF815; +constexpr unsigned int mmCP_PIPE_STATS_CONTROL__VI = 0xC03D; +constexpr unsigned int mmCP_PQ_STATUS__VI = 0x30B8; +constexpr unsigned int mmCP_PRED_NOT_VISIBLE__VI = 0xC0EE; +constexpr unsigned int mmCP_RB_DOORBELL_CONTROL__VI = 0x3059; +constexpr unsigned int mmCP_RB_DOORBELL_RANGE_LOWER__VI = 0x305A; +constexpr unsigned int mmCP_RB_DOORBELL_RANGE_UPPER__VI = 0x305B; +constexpr unsigned int mmCP_SAMPLE_STATUS__VI = 0xC0FD; +constexpr unsigned int mmCP_STREAM_OUT_CONTROL__VI = 0xC03E; +constexpr unsigned int mmCP_VIRT_STATUS__VI = 0x3038; +constexpr unsigned int mmCP_VMID_STATUS__VI = 0x30BF; +constexpr unsigned int mmCRTC0_CRTC_3D_STRUCTURE_CONTROL__VI = 0x1B78; +constexpr unsigned int mmCRTC0_CRTC_AVSYNC_COUNTER__VI = 0x1B9B; +constexpr unsigned int mmCRTC0_CRTC_BLACK_COLOR__VI = 0x1BCC; +constexpr unsigned int mmCRTC0_CRTC_BLACK_COLOR_EXT__VI = 0x1BCD; +constexpr unsigned int mmCRTC0_CRTC_BLANK_DATA_COLOR__VI = 0x1BCA; +constexpr unsigned int mmCRTC0_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x1BCB; +constexpr unsigned int mmCRTC0_CRTC_CRC0_DATA_B__VI = 0x1BDA; +constexpr unsigned int mmCRTC0_CRTC_CRC0_DATA_RG__VI = 0x1BD9; +constexpr unsigned int mmCRTC0_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x1BD5; +constexpr unsigned int mmCRTC0_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x1BD6; +constexpr unsigned int mmCRTC0_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x1BD7; +constexpr unsigned int mmCRTC0_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x1BD8; +constexpr unsigned int mmCRTC0_CRTC_CRC1_DATA_B__VI = 0x1BE0; +constexpr unsigned int mmCRTC0_CRTC_CRC1_DATA_RG__VI = 0x1BDF; +constexpr unsigned int mmCRTC0_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x1BDB; +constexpr unsigned int mmCRTC0_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x1BDC; +constexpr unsigned int mmCRTC0_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x1BDD; +constexpr unsigned int mmCRTC0_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x1BDE; +constexpr unsigned int mmCRTC0_CRTC_CRC_CNTL__VI = 0x1BD4; +constexpr unsigned int mmCRTC0_CRTC_DCFE_CLOCK_CONTROL__VI = 0x1B7C; +constexpr unsigned int mmCRTC0_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x1BE1; +constexpr unsigned int mmCRTC0_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x1BE5; +constexpr unsigned int mmCRTC0_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x1BE4; +constexpr unsigned int mmCRTC0_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x1BE6; +constexpr unsigned int mmCRTC0_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x1BE3; +constexpr unsigned int mmCRTC0_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x1BE2; +constexpr unsigned int mmCRTC0_CRTC_FIELD_INDICATION_CONTROL__VI = 0x1BA0; +constexpr unsigned int mmCRTC0_CRTC_GSL_CONTROL__VI = 0x1B7B; +constexpr unsigned int mmCRTC0_CRTC_GSL_VSYNC_GAP__VI = 0x1B79; +constexpr unsigned int mmCRTC0_CRTC_GSL_WINDOW__VI = 0x1B7A; +constexpr unsigned int mmCRTC0_CRTC_H_BLANK_EARLY_NUM__VI = 0x1B7D; +constexpr unsigned int mmCRTC0_CRTC_OVERSCAN_COLOR__VI = 0x1BC8; +constexpr unsigned int mmCRTC0_CRTC_OVERSCAN_COLOR_EXT__VI = 0x1BC9; +constexpr unsigned int mmCRTC0_CRTC_PIXEL_DATA_READBACK0__VI = 0x1BA1; +constexpr unsigned int mmCRTC0_CRTC_PIXEL_DATA_READBACK1__VI = 0x1BA2; +constexpr unsigned int mmCRTC0_CRTC_STATIC_SCREEN_CONTROL__VI = 0x1BE7; +constexpr unsigned int mmCRTC0_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x1B9A; +constexpr unsigned int mmCRTC0_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x1BCF; +constexpr unsigned int mmCRTC0_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x1BCE; +constexpr unsigned int mmCRTC0_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x1BD1; +constexpr unsigned int mmCRTC0_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x1BD0; +constexpr unsigned int mmCRTC0_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x1BD3; +constexpr unsigned int mmCRTC0_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x1BD2; +constexpr unsigned int mmCRTC0_DCFE_DBG_SEL__VI = 0x1B7E; +constexpr unsigned int mmCRTC0_DCFE_MEM_PWR_CTRL__VI = 0x1B7F; +constexpr unsigned int mmCRTC0_DCFE_MEM_PWR_CTRL2__VI = 0x1BB8; +constexpr unsigned int mmCRTC0_DCFE_MEM_PWR_STATUS__VI = 0x1BB9; +constexpr unsigned int mmCRTC0_PIXEL_RATE_CNTL__VI = 0x0140; +constexpr unsigned int mmCRTC1_CRTC_3D_STRUCTURE_CONTROL__VI = 0x1D78; +constexpr unsigned int mmCRTC1_CRTC_ALLOW_STOP_OFF_V_CNT__VI = 0x1DC3; +constexpr unsigned int mmCRTC1_CRTC_AVSYNC_COUNTER__VI = 0x1D9B; +constexpr unsigned int mmCRTC1_CRTC_BLACK_COLOR__VI = 0x1DCC; +constexpr unsigned int mmCRTC1_CRTC_BLACK_COLOR_EXT__VI = 0x1DCD; +constexpr unsigned int mmCRTC1_CRTC_BLANK_CONTROL__SI__CI = 0x1E9D; +constexpr unsigned int mmCRTC1_CRTC_BLANK_CONTROL__VI = 0x1D9D; +constexpr unsigned int mmCRTC1_CRTC_BLANK_DATA_COLOR__VI = 0x1DCA; +constexpr unsigned int mmCRTC1_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x1DCB; +constexpr unsigned int mmCRTC1_CRTC_CONTROL__VI = 0x1D9C; +constexpr unsigned int mmCRTC1_CRTC_COUNT_CONTROL__VI = 0x1DA9; +constexpr unsigned int mmCRTC1_CRTC_COUNT_RESET__VI = 0x1DAA; +constexpr unsigned int mmCRTC1_CRTC_CRC0_DATA_B__VI = 0x1DDA; +constexpr unsigned int mmCRTC1_CRTC_CRC0_DATA_RG__VI = 0x1DD9; +constexpr unsigned int mmCRTC1_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x1DD5; +constexpr unsigned int mmCRTC1_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x1DD6; +constexpr unsigned int mmCRTC1_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x1DD7; +constexpr unsigned int mmCRTC1_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x1DD8; +constexpr unsigned int mmCRTC1_CRTC_CRC1_DATA_B__VI = 0x1DE0; +constexpr unsigned int mmCRTC1_CRTC_CRC1_DATA_RG__VI = 0x1DDF; +constexpr unsigned int mmCRTC1_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x1DDB; +constexpr unsigned int mmCRTC1_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x1DDC; +constexpr unsigned int mmCRTC1_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x1DDD; +constexpr unsigned int mmCRTC1_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x1DDE; +constexpr unsigned int mmCRTC1_CRTC_CRC_CNTL__VI = 0x1DD4; +constexpr unsigned int mmCRTC1_CRTC_DCFE_CLOCK_CONTROL__VI = 0x1D7C; +constexpr unsigned int mmCRTC1_CRTC_DOUBLE_BUFFER_CONTROL__VI = 0x1DB6; +constexpr unsigned int mmCRTC1_CRTC_DTMTEST_CNTL__VI = 0x1D92; +constexpr unsigned int mmCRTC1_CRTC_DTMTEST_STATUS_POSITION__VI = 0x1D93; +constexpr unsigned int mmCRTC1_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x1DE1; +constexpr unsigned int mmCRTC1_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x1DE5; +constexpr unsigned int mmCRTC1_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x1DE4; +constexpr unsigned int mmCRTC1_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x1DE6; +constexpr unsigned int mmCRTC1_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x1DE3; +constexpr unsigned int mmCRTC1_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x1DE2; +constexpr unsigned int mmCRTC1_CRTC_FIELD_INDICATION_CONTROL__VI = 0x1DA0; +constexpr unsigned int mmCRTC1_CRTC_FLOW_CONTROL__VI = 0x1D99; +constexpr unsigned int mmCRTC1_CRTC_FORCE_COUNT_NOW_CNTL__VI = 0x1D98; +constexpr unsigned int mmCRTC1_CRTC_GSL_CONTROL__VI = 0x1D7B; +constexpr unsigned int mmCRTC1_CRTC_GSL_VSYNC_GAP__VI = 0x1D79; +constexpr unsigned int mmCRTC1_CRTC_GSL_WINDOW__VI = 0x1D7A; +constexpr unsigned int mmCRTC1_CRTC_H_BLANK_EARLY_NUM__VI = 0x1D7D; +constexpr unsigned int mmCRTC1_CRTC_H_BLANK_START_END__VI = 0x1D81; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_A__VI = 0x1D82; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_A_CNTL__VI = 0x1D83; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_B__VI = 0x1D84; +constexpr unsigned int mmCRTC1_CRTC_H_SYNC_B_CNTL__VI = 0x1D85; +constexpr unsigned int mmCRTC1_CRTC_H_TOTAL__VI = 0x1D80; +constexpr unsigned int mmCRTC1_CRTC_INTERLACE_CONTROL__VI = 0x1D9E; +constexpr unsigned int mmCRTC1_CRTC_INTERLACE_STATUS__VI = 0x1D9F; +constexpr unsigned int mmCRTC1_CRTC_INTERRUPT_CONTROL__VI = 0x1DB4; +constexpr unsigned int mmCRTC1_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__VI = 0x1DAB; +constexpr unsigned int mmCRTC1_CRTC_MASTER_EN__VI = 0x1DC2; +constexpr unsigned int mmCRTC1_CRTC_MVP_INBAND_CNTL_INSERT__VI = 0x1DBF; +constexpr unsigned int mmCRTC1_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__VI = 0x1DC0; +constexpr unsigned int mmCRTC1_CRTC_MVP_STATUS__VI = 0x1DC1; +constexpr unsigned int mmCRTC1_CRTC_NOM_VERT_POSITION__VI = 0x1DA5; +constexpr unsigned int mmCRTC1_CRTC_OVERSCAN_COLOR__VI = 0x1DC8; +constexpr unsigned int mmCRTC1_CRTC_OVERSCAN_COLOR_EXT__VI = 0x1DC9; +constexpr unsigned int mmCRTC1_CRTC_PIXEL_DATA_READBACK0__VI = 0x1DA1; +constexpr unsigned int mmCRTC1_CRTC_PIXEL_DATA_READBACK1__VI = 0x1DA2; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_CONTROL__VI = 0x1DB0; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_FRAME__VI = 0x1DB2; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_POSITION__VI = 0x1DB1; +constexpr unsigned int mmCRTC1_CRTC_SNAPSHOT_STATUS__VI = 0x1DAF; +constexpr unsigned int mmCRTC1_CRTC_START_LINE_CONTROL__VI = 0x1DB3; +constexpr unsigned int mmCRTC1_CRTC_STATIC_SCREEN_CONTROL__VI = 0x1DE7; +constexpr unsigned int mmCRTC1_CRTC_STATUS__SI__CI = 0x1EA3; +constexpr unsigned int mmCRTC1_CRTC_STATUS__VI = 0x1DA3; +constexpr unsigned int mmCRTC1_CRTC_STATUS_FRAME_COUNT__VI = 0x1DA6; +constexpr unsigned int mmCRTC1_CRTC_STATUS_HV_COUNT__VI = 0x1DA8; +constexpr unsigned int mmCRTC1_CRTC_STATUS_POSITION__SI__CI = 0x1EA4; +constexpr unsigned int mmCRTC1_CRTC_STATUS_POSITION__VI = 0x1DA4; +constexpr unsigned int mmCRTC1_CRTC_STATUS_VF_COUNT__VI = 0x1DA7; +constexpr unsigned int mmCRTC1_CRTC_STEREO_CONTROL__VI = 0x1DAE; +constexpr unsigned int mmCRTC1_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x1D9A; +constexpr unsigned int mmCRTC1_CRTC_STEREO_STATUS__VI = 0x1DAD; +constexpr unsigned int mmCRTC1_CRTC_TEST_DEBUG_DATA__VI = 0x1DC7; +constexpr unsigned int mmCRTC1_CRTC_TEST_DEBUG_INDEX__VI = 0x1DC6; +constexpr unsigned int mmCRTC1_CRTC_TEST_PATTERN_COLOR__VI = 0x1DBC; +constexpr unsigned int mmCRTC1_CRTC_TEST_PATTERN_CONTROL__VI = 0x1DBA; +constexpr unsigned int mmCRTC1_CRTC_TEST_PATTERN_PARAMETERS__VI = 0x1DBB; +constexpr unsigned int mmCRTC1_CRTC_TRIGA_CNTL__VI = 0x1D94; +constexpr unsigned int mmCRTC1_CRTC_TRIGA_MANUAL_TRIG__VI = 0x1D95; +constexpr unsigned int mmCRTC1_CRTC_TRIGB_CNTL__VI = 0x1D96; +constexpr unsigned int mmCRTC1_CRTC_TRIGB_MANUAL_TRIG__VI = 0x1D97; +constexpr unsigned int mmCRTC1_CRTC_UPDATE_LOCK__VI = 0x1DB5; +constexpr unsigned int mmCRTC1_CRTC_VBI_END__VI = 0x1D86; +constexpr unsigned int mmCRTC1_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x1DCF; +constexpr unsigned int mmCRTC1_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x1DCE; +constexpr unsigned int mmCRTC1_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x1DD1; +constexpr unsigned int mmCRTC1_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x1DD0; +constexpr unsigned int mmCRTC1_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x1DD3; +constexpr unsigned int mmCRTC1_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x1DD2; +constexpr unsigned int mmCRTC1_CRTC_VERT_SYNC_CONTROL__VI = 0x1DAC; +constexpr unsigned int mmCRTC1_CRTC_VGA_PARAMETER_CAPTURE_MODE__VI = 0x1DB7; +constexpr unsigned int mmCRTC1_CRTC_VSYNC_NOM_INT_STATUS__VI = 0x1D8C; +constexpr unsigned int mmCRTC1_CRTC_V_BLANK_START_END__VI = 0x1D8D; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_A__VI = 0x1D8E; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_A_CNTL__VI = 0x1D8F; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_B__VI = 0x1D90; +constexpr unsigned int mmCRTC1_CRTC_V_SYNC_B_CNTL__VI = 0x1D91; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL__VI = 0x1D87; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_CONTROL__VI = 0x1D8A; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_INT_STATUS__VI = 0x1D8B; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_MAX__VI = 0x1D89; +constexpr unsigned int mmCRTC1_CRTC_V_TOTAL_MIN__VI = 0x1D88; +constexpr unsigned int mmCRTC1_CRTC_V_UPDATE_INT_STATUS__VI = 0x1DC4; +constexpr unsigned int mmCRTC1_DCFE_DBG_SEL__VI = 0x1D7E; +constexpr unsigned int mmCRTC1_DCFE_MEM_PWR_CTRL__VI = 0x1D7F; +constexpr unsigned int mmCRTC1_DCFE_MEM_PWR_CTRL2__VI = 0x1DB8; +constexpr unsigned int mmCRTC1_DCFE_MEM_PWR_STATUS__VI = 0x1DB9; +constexpr unsigned int mmCRTC1_MASTER_UPDATE_LOCK__VI = 0x1DBD; +constexpr unsigned int mmCRTC1_MASTER_UPDATE_MODE__SI__CI = 0x1EBE; +constexpr unsigned int mmCRTC1_MASTER_UPDATE_MODE__VI = 0x1DBE; +constexpr unsigned int mmCRTC1_PIXEL_RATE_CNTL__VI = 0x0144; +constexpr unsigned int mmCRTC2_CRTC_3D_STRUCTURE_CONTROL__VI = 0x1F78; +constexpr unsigned int mmCRTC2_CRTC_ALLOW_STOP_OFF_V_CNT__VI = 0x1FC3; +constexpr unsigned int mmCRTC2_CRTC_AVSYNC_COUNTER__VI = 0x1F9B; +constexpr unsigned int mmCRTC2_CRTC_BLACK_COLOR__VI = 0x1FCC; +constexpr unsigned int mmCRTC2_CRTC_BLACK_COLOR_EXT__VI = 0x1FCD; +constexpr unsigned int mmCRTC2_CRTC_BLANK_CONTROL__SI__CI = 0x419D; +constexpr unsigned int mmCRTC2_CRTC_BLANK_CONTROL__VI = 0x1F9D; +constexpr unsigned int mmCRTC2_CRTC_BLANK_DATA_COLOR__VI = 0x1FCA; +constexpr unsigned int mmCRTC2_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x1FCB; +constexpr unsigned int mmCRTC2_CRTC_CONTROL__VI = 0x1F9C; +constexpr unsigned int mmCRTC2_CRTC_COUNT_CONTROL__VI = 0x1FA9; +constexpr unsigned int mmCRTC2_CRTC_COUNT_RESET__VI = 0x1FAA; +constexpr unsigned int mmCRTC2_CRTC_CRC0_DATA_B__VI = 0x1FDA; +constexpr unsigned int mmCRTC2_CRTC_CRC0_DATA_RG__VI = 0x1FD9; +constexpr unsigned int mmCRTC2_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x1FD5; +constexpr unsigned int mmCRTC2_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x1FD6; +constexpr unsigned int mmCRTC2_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x1FD7; +constexpr unsigned int mmCRTC2_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x1FD8; +constexpr unsigned int mmCRTC2_CRTC_CRC1_DATA_B__VI = 0x1FE0; +constexpr unsigned int mmCRTC2_CRTC_CRC1_DATA_RG__VI = 0x1FDF; +constexpr unsigned int mmCRTC2_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x1FDB; +constexpr unsigned int mmCRTC2_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x1FDC; +constexpr unsigned int mmCRTC2_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x1FDD; +constexpr unsigned int mmCRTC2_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x1FDE; +constexpr unsigned int mmCRTC2_CRTC_CRC_CNTL__VI = 0x1FD4; +constexpr unsigned int mmCRTC2_CRTC_DCFE_CLOCK_CONTROL__VI = 0x1F7C; +constexpr unsigned int mmCRTC2_CRTC_DOUBLE_BUFFER_CONTROL__VI = 0x1FB6; +constexpr unsigned int mmCRTC2_CRTC_DTMTEST_CNTL__VI = 0x1F92; +constexpr unsigned int mmCRTC2_CRTC_DTMTEST_STATUS_POSITION__VI = 0x1F93; +constexpr unsigned int mmCRTC2_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x1FE1; +constexpr unsigned int mmCRTC2_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x1FE5; +constexpr unsigned int mmCRTC2_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x1FE4; +constexpr unsigned int mmCRTC2_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x1FE6; +constexpr unsigned int mmCRTC2_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x1FE3; +constexpr unsigned int mmCRTC2_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x1FE2; +constexpr unsigned int mmCRTC2_CRTC_FIELD_INDICATION_CONTROL__VI = 0x1FA0; +constexpr unsigned int mmCRTC2_CRTC_FLOW_CONTROL__VI = 0x1F99; +constexpr unsigned int mmCRTC2_CRTC_FORCE_COUNT_NOW_CNTL__VI = 0x1F98; +constexpr unsigned int mmCRTC2_CRTC_GSL_CONTROL__VI = 0x1F7B; +constexpr unsigned int mmCRTC2_CRTC_GSL_VSYNC_GAP__VI = 0x1F79; +constexpr unsigned int mmCRTC2_CRTC_GSL_WINDOW__VI = 0x1F7A; +constexpr unsigned int mmCRTC2_CRTC_H_BLANK_EARLY_NUM__VI = 0x1F7D; +constexpr unsigned int mmCRTC2_CRTC_H_BLANK_START_END__VI = 0x1F81; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_A__VI = 0x1F82; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_A_CNTL__VI = 0x1F83; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_B__VI = 0x1F84; +constexpr unsigned int mmCRTC2_CRTC_H_SYNC_B_CNTL__VI = 0x1F85; +constexpr unsigned int mmCRTC2_CRTC_H_TOTAL__VI = 0x1F80; +constexpr unsigned int mmCRTC2_CRTC_INTERLACE_CONTROL__VI = 0x1F9E; +constexpr unsigned int mmCRTC2_CRTC_INTERLACE_STATUS__VI = 0x1F9F; +constexpr unsigned int mmCRTC2_CRTC_INTERRUPT_CONTROL__VI = 0x1FB4; +constexpr unsigned int mmCRTC2_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__VI = 0x1FAB; +constexpr unsigned int mmCRTC2_CRTC_MASTER_EN__VI = 0x1FC2; +constexpr unsigned int mmCRTC2_CRTC_MVP_INBAND_CNTL_INSERT__VI = 0x1FBF; +constexpr unsigned int mmCRTC2_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__VI = 0x1FC0; +constexpr unsigned int mmCRTC2_CRTC_MVP_STATUS__VI = 0x1FC1; +constexpr unsigned int mmCRTC2_CRTC_NOM_VERT_POSITION__VI = 0x1FA5; +constexpr unsigned int mmCRTC2_CRTC_OVERSCAN_COLOR__VI = 0x1FC8; +constexpr unsigned int mmCRTC2_CRTC_OVERSCAN_COLOR_EXT__VI = 0x1FC9; +constexpr unsigned int mmCRTC2_CRTC_PIXEL_DATA_READBACK0__VI = 0x1FA1; +constexpr unsigned int mmCRTC2_CRTC_PIXEL_DATA_READBACK1__VI = 0x1FA2; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_CONTROL__VI = 0x1FB0; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_FRAME__VI = 0x1FB2; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_POSITION__VI = 0x1FB1; +constexpr unsigned int mmCRTC2_CRTC_SNAPSHOT_STATUS__VI = 0x1FAF; +constexpr unsigned int mmCRTC2_CRTC_START_LINE_CONTROL__VI = 0x1FB3; +constexpr unsigned int mmCRTC2_CRTC_STATIC_SCREEN_CONTROL__VI = 0x1FE7; +constexpr unsigned int mmCRTC2_CRTC_STATUS__SI__CI = 0x41A3; +constexpr unsigned int mmCRTC2_CRTC_STATUS__VI = 0x1FA3; +constexpr unsigned int mmCRTC2_CRTC_STATUS_FRAME_COUNT__VI = 0x1FA6; +constexpr unsigned int mmCRTC2_CRTC_STATUS_HV_COUNT__VI = 0x1FA8; +constexpr unsigned int mmCRTC2_CRTC_STATUS_POSITION__SI__CI = 0x41A4; +constexpr unsigned int mmCRTC2_CRTC_STATUS_POSITION__VI = 0x1FA4; +constexpr unsigned int mmCRTC2_CRTC_STATUS_VF_COUNT__VI = 0x1FA7; +constexpr unsigned int mmCRTC2_CRTC_STEREO_CONTROL__VI = 0x1FAE; +constexpr unsigned int mmCRTC2_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x1F9A; +constexpr unsigned int mmCRTC2_CRTC_STEREO_STATUS__VI = 0x1FAD; +constexpr unsigned int mmCRTC2_CRTC_TEST_DEBUG_DATA__VI = 0x1FC7; +constexpr unsigned int mmCRTC2_CRTC_TEST_DEBUG_INDEX__VI = 0x1FC6; +constexpr unsigned int mmCRTC2_CRTC_TEST_PATTERN_COLOR__VI = 0x1FBC; +constexpr unsigned int mmCRTC2_CRTC_TEST_PATTERN_CONTROL__VI = 0x1FBA; +constexpr unsigned int mmCRTC2_CRTC_TEST_PATTERN_PARAMETERS__VI = 0x1FBB; +constexpr unsigned int mmCRTC2_CRTC_TRIGA_CNTL__VI = 0x1F94; +constexpr unsigned int mmCRTC2_CRTC_TRIGA_MANUAL_TRIG__VI = 0x1F95; +constexpr unsigned int mmCRTC2_CRTC_TRIGB_CNTL__VI = 0x1F96; +constexpr unsigned int mmCRTC2_CRTC_TRIGB_MANUAL_TRIG__VI = 0x1F97; +constexpr unsigned int mmCRTC2_CRTC_UPDATE_LOCK__VI = 0x1FB5; +constexpr unsigned int mmCRTC2_CRTC_VBI_END__VI = 0x1F86; +constexpr unsigned int mmCRTC2_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x1FCF; +constexpr unsigned int mmCRTC2_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x1FCE; +constexpr unsigned int mmCRTC2_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x1FD1; +constexpr unsigned int mmCRTC2_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x1FD0; +constexpr unsigned int mmCRTC2_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x1FD3; +constexpr unsigned int mmCRTC2_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x1FD2; +constexpr unsigned int mmCRTC2_CRTC_VERT_SYNC_CONTROL__VI = 0x1FAC; +constexpr unsigned int mmCRTC2_CRTC_VGA_PARAMETER_CAPTURE_MODE__VI = 0x1FB7; +constexpr unsigned int mmCRTC2_CRTC_VSYNC_NOM_INT_STATUS__VI = 0x1F8C; +constexpr unsigned int mmCRTC2_CRTC_V_BLANK_START_END__VI = 0x1F8D; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_A__VI = 0x1F8E; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_A_CNTL__VI = 0x1F8F; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_B__VI = 0x1F90; +constexpr unsigned int mmCRTC2_CRTC_V_SYNC_B_CNTL__VI = 0x1F91; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL__VI = 0x1F87; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_CONTROL__VI = 0x1F8A; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_INT_STATUS__VI = 0x1F8B; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_MAX__VI = 0x1F89; +constexpr unsigned int mmCRTC2_CRTC_V_TOTAL_MIN__VI = 0x1F88; +constexpr unsigned int mmCRTC2_CRTC_V_UPDATE_INT_STATUS__VI = 0x1FC4; +constexpr unsigned int mmCRTC2_DCFE_DBG_SEL__VI = 0x1F7E; +constexpr unsigned int mmCRTC2_DCFE_MEM_PWR_CTRL__VI = 0x1F7F; +constexpr unsigned int mmCRTC2_DCFE_MEM_PWR_CTRL2__VI = 0x1FB8; +constexpr unsigned int mmCRTC2_DCFE_MEM_PWR_STATUS__VI = 0x1FB9; +constexpr unsigned int mmCRTC2_MASTER_UPDATE_LOCK__VI = 0x1FBD; +constexpr unsigned int mmCRTC2_MASTER_UPDATE_MODE__SI__CI = 0x41BE; +constexpr unsigned int mmCRTC2_MASTER_UPDATE_MODE__VI = 0x1FBE; +constexpr unsigned int mmCRTC2_PIXEL_RATE_CNTL__VI = 0x0148; +constexpr unsigned int mmCRTC3_CRTC_3D_STRUCTURE_CONTROL__VI = 0x4178; +constexpr unsigned int mmCRTC3_CRTC_ALLOW_STOP_OFF_V_CNT__VI = 0x41C3; +constexpr unsigned int mmCRTC3_CRTC_AVSYNC_COUNTER__VI = 0x419B; +constexpr unsigned int mmCRTC3_CRTC_BLACK_COLOR__VI = 0x41CC; +constexpr unsigned int mmCRTC3_CRTC_BLACK_COLOR_EXT__VI = 0x41CD; +constexpr unsigned int mmCRTC3_CRTC_BLANK_CONTROL__SI__CI = 0x449D; +constexpr unsigned int mmCRTC3_CRTC_BLANK_CONTROL__VI = 0x419D; +constexpr unsigned int mmCRTC3_CRTC_BLANK_DATA_COLOR__VI = 0x41CA; +constexpr unsigned int mmCRTC3_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x41CB; +constexpr unsigned int mmCRTC3_CRTC_CONTROL__VI = 0x419C; +constexpr unsigned int mmCRTC3_CRTC_COUNT_CONTROL__VI = 0x41A9; +constexpr unsigned int mmCRTC3_CRTC_COUNT_RESET__VI = 0x41AA; +constexpr unsigned int mmCRTC3_CRTC_CRC0_DATA_B__VI = 0x41DA; +constexpr unsigned int mmCRTC3_CRTC_CRC0_DATA_RG__VI = 0x41D9; +constexpr unsigned int mmCRTC3_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x41D5; +constexpr unsigned int mmCRTC3_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x41D6; +constexpr unsigned int mmCRTC3_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x41D7; +constexpr unsigned int mmCRTC3_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x41D8; +constexpr unsigned int mmCRTC3_CRTC_CRC1_DATA_B__VI = 0x41E0; +constexpr unsigned int mmCRTC3_CRTC_CRC1_DATA_RG__VI = 0x41DF; +constexpr unsigned int mmCRTC3_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x41DB; +constexpr unsigned int mmCRTC3_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x41DC; +constexpr unsigned int mmCRTC3_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x41DD; +constexpr unsigned int mmCRTC3_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x41DE; +constexpr unsigned int mmCRTC3_CRTC_CRC_CNTL__VI = 0x41D4; +constexpr unsigned int mmCRTC3_CRTC_DCFE_CLOCK_CONTROL__VI = 0x417C; +constexpr unsigned int mmCRTC3_CRTC_DOUBLE_BUFFER_CONTROL__VI = 0x41B6; +constexpr unsigned int mmCRTC3_CRTC_DTMTEST_CNTL__VI = 0x4192; +constexpr unsigned int mmCRTC3_CRTC_DTMTEST_STATUS_POSITION__VI = 0x4193; +constexpr unsigned int mmCRTC3_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x41E1; +constexpr unsigned int mmCRTC3_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x41E5; +constexpr unsigned int mmCRTC3_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x41E4; +constexpr unsigned int mmCRTC3_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x41E6; +constexpr unsigned int mmCRTC3_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x41E3; +constexpr unsigned int mmCRTC3_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x41E2; +constexpr unsigned int mmCRTC3_CRTC_FIELD_INDICATION_CONTROL__VI = 0x41A0; +constexpr unsigned int mmCRTC3_CRTC_FLOW_CONTROL__VI = 0x4199; +constexpr unsigned int mmCRTC3_CRTC_FORCE_COUNT_NOW_CNTL__VI = 0x4198; +constexpr unsigned int mmCRTC3_CRTC_GSL_CONTROL__VI = 0x417B; +constexpr unsigned int mmCRTC3_CRTC_GSL_VSYNC_GAP__VI = 0x4179; +constexpr unsigned int mmCRTC3_CRTC_GSL_WINDOW__VI = 0x417A; +constexpr unsigned int mmCRTC3_CRTC_H_BLANK_EARLY_NUM__VI = 0x417D; +constexpr unsigned int mmCRTC3_CRTC_H_BLANK_START_END__VI = 0x4181; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_A__VI = 0x4182; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_A_CNTL__VI = 0x4183; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_B__VI = 0x4184; +constexpr unsigned int mmCRTC3_CRTC_H_SYNC_B_CNTL__VI = 0x4185; +constexpr unsigned int mmCRTC3_CRTC_H_TOTAL__VI = 0x4180; +constexpr unsigned int mmCRTC3_CRTC_INTERLACE_CONTROL__VI = 0x419E; +constexpr unsigned int mmCRTC3_CRTC_INTERLACE_STATUS__VI = 0x419F; +constexpr unsigned int mmCRTC3_CRTC_INTERRUPT_CONTROL__VI = 0x41B4; +constexpr unsigned int mmCRTC3_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__VI = 0x41AB; +constexpr unsigned int mmCRTC3_CRTC_MASTER_EN__VI = 0x41C2; +constexpr unsigned int mmCRTC3_CRTC_MVP_INBAND_CNTL_INSERT__VI = 0x41BF; +constexpr unsigned int mmCRTC3_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__VI = 0x41C0; +constexpr unsigned int mmCRTC3_CRTC_MVP_STATUS__VI = 0x41C1; +constexpr unsigned int mmCRTC3_CRTC_NOM_VERT_POSITION__VI = 0x41A5; +constexpr unsigned int mmCRTC3_CRTC_OVERSCAN_COLOR__VI = 0x41C8; +constexpr unsigned int mmCRTC3_CRTC_OVERSCAN_COLOR_EXT__VI = 0x41C9; +constexpr unsigned int mmCRTC3_CRTC_PIXEL_DATA_READBACK0__VI = 0x41A1; +constexpr unsigned int mmCRTC3_CRTC_PIXEL_DATA_READBACK1__VI = 0x41A2; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_CONTROL__VI = 0x41B0; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_FRAME__VI = 0x41B2; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_POSITION__VI = 0x41B1; +constexpr unsigned int mmCRTC3_CRTC_SNAPSHOT_STATUS__VI = 0x41AF; +constexpr unsigned int mmCRTC3_CRTC_START_LINE_CONTROL__VI = 0x41B3; +constexpr unsigned int mmCRTC3_CRTC_STATIC_SCREEN_CONTROL__VI = 0x41E7; +constexpr unsigned int mmCRTC3_CRTC_STATUS__SI__CI = 0x44A3; +constexpr unsigned int mmCRTC3_CRTC_STATUS__VI = 0x41A3; +constexpr unsigned int mmCRTC3_CRTC_STATUS_FRAME_COUNT__VI = 0x41A6; +constexpr unsigned int mmCRTC3_CRTC_STATUS_HV_COUNT__VI = 0x41A8; +constexpr unsigned int mmCRTC3_CRTC_STATUS_POSITION__SI__CI = 0x44A4; +constexpr unsigned int mmCRTC3_CRTC_STATUS_POSITION__VI = 0x41A4; +constexpr unsigned int mmCRTC3_CRTC_STATUS_VF_COUNT__VI = 0x41A7; +constexpr unsigned int mmCRTC3_CRTC_STEREO_CONTROL__VI = 0x41AE; +constexpr unsigned int mmCRTC3_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x419A; +constexpr unsigned int mmCRTC3_CRTC_STEREO_STATUS__VI = 0x41AD; +constexpr unsigned int mmCRTC3_CRTC_TEST_DEBUG_DATA__VI = 0x41C7; +constexpr unsigned int mmCRTC3_CRTC_TEST_DEBUG_INDEX__VI = 0x41C6; +constexpr unsigned int mmCRTC3_CRTC_TEST_PATTERN_COLOR__VI = 0x41BC; +constexpr unsigned int mmCRTC3_CRTC_TEST_PATTERN_CONTROL__VI = 0x41BA; +constexpr unsigned int mmCRTC3_CRTC_TEST_PATTERN_PARAMETERS__VI = 0x41BB; +constexpr unsigned int mmCRTC3_CRTC_TRIGA_CNTL__VI = 0x4194; +constexpr unsigned int mmCRTC3_CRTC_TRIGA_MANUAL_TRIG__VI = 0x4195; +constexpr unsigned int mmCRTC3_CRTC_TRIGB_CNTL__VI = 0x4196; +constexpr unsigned int mmCRTC3_CRTC_TRIGB_MANUAL_TRIG__VI = 0x4197; +constexpr unsigned int mmCRTC3_CRTC_UPDATE_LOCK__VI = 0x41B5; +constexpr unsigned int mmCRTC3_CRTC_VBI_END__VI = 0x4186; +constexpr unsigned int mmCRTC3_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x41CF; +constexpr unsigned int mmCRTC3_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x41CE; +constexpr unsigned int mmCRTC3_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x41D1; +constexpr unsigned int mmCRTC3_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x41D0; +constexpr unsigned int mmCRTC3_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x41D3; +constexpr unsigned int mmCRTC3_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x41D2; +constexpr unsigned int mmCRTC3_CRTC_VERT_SYNC_CONTROL__VI = 0x41AC; +constexpr unsigned int mmCRTC3_CRTC_VGA_PARAMETER_CAPTURE_MODE__VI = 0x41B7; +constexpr unsigned int mmCRTC3_CRTC_VSYNC_NOM_INT_STATUS__VI = 0x418C; +constexpr unsigned int mmCRTC3_CRTC_V_BLANK_START_END__VI = 0x418D; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_A__VI = 0x418E; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_A_CNTL__VI = 0x418F; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_B__VI = 0x4190; +constexpr unsigned int mmCRTC3_CRTC_V_SYNC_B_CNTL__VI = 0x4191; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL__VI = 0x4187; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_CONTROL__VI = 0x418A; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_INT_STATUS__VI = 0x418B; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_MAX__VI = 0x4189; +constexpr unsigned int mmCRTC3_CRTC_V_TOTAL_MIN__VI = 0x4188; +constexpr unsigned int mmCRTC3_CRTC_V_UPDATE_INT_STATUS__VI = 0x41C4; +constexpr unsigned int mmCRTC3_DCFE_DBG_SEL__VI = 0x417E; +constexpr unsigned int mmCRTC3_DCFE_MEM_PWR_CTRL__VI = 0x417F; +constexpr unsigned int mmCRTC3_DCFE_MEM_PWR_CTRL2__VI = 0x41B8; +constexpr unsigned int mmCRTC3_DCFE_MEM_PWR_STATUS__VI = 0x41B9; +constexpr unsigned int mmCRTC3_MASTER_UPDATE_LOCK__VI = 0x41BD; +constexpr unsigned int mmCRTC3_MASTER_UPDATE_MODE__SI__CI = 0x44BE; +constexpr unsigned int mmCRTC3_MASTER_UPDATE_MODE__VI = 0x41BE; +constexpr unsigned int mmCRTC3_PIXEL_RATE_CNTL__VI = 0x014C; +constexpr unsigned int mmCRTC4_CRTC_3D_STRUCTURE_CONTROL__VI = 0x4378; +constexpr unsigned int mmCRTC4_CRTC_ALLOW_STOP_OFF_V_CNT__VI = 0x43C3; +constexpr unsigned int mmCRTC4_CRTC_AVSYNC_COUNTER__VI = 0x439B; +constexpr unsigned int mmCRTC4_CRTC_BLACK_COLOR__VI = 0x43CC; +constexpr unsigned int mmCRTC4_CRTC_BLACK_COLOR_EXT__VI = 0x43CD; +constexpr unsigned int mmCRTC4_CRTC_BLANK_CONTROL__SI__CI = 0x479D; +constexpr unsigned int mmCRTC4_CRTC_BLANK_CONTROL__VI = 0x439D; +constexpr unsigned int mmCRTC4_CRTC_BLANK_DATA_COLOR__VI = 0x43CA; +constexpr unsigned int mmCRTC4_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x43CB; +constexpr unsigned int mmCRTC4_CRTC_CONTROL__VI = 0x439C; +constexpr unsigned int mmCRTC4_CRTC_COUNT_CONTROL__VI = 0x43A9; +constexpr unsigned int mmCRTC4_CRTC_COUNT_RESET__VI = 0x43AA; +constexpr unsigned int mmCRTC4_CRTC_CRC0_DATA_B__VI = 0x43DA; +constexpr unsigned int mmCRTC4_CRTC_CRC0_DATA_RG__VI = 0x43D9; +constexpr unsigned int mmCRTC4_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x43D5; +constexpr unsigned int mmCRTC4_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x43D6; +constexpr unsigned int mmCRTC4_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x43D7; +constexpr unsigned int mmCRTC4_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x43D8; +constexpr unsigned int mmCRTC4_CRTC_CRC1_DATA_B__VI = 0x43E0; +constexpr unsigned int mmCRTC4_CRTC_CRC1_DATA_RG__VI = 0x43DF; +constexpr unsigned int mmCRTC4_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x43DB; +constexpr unsigned int mmCRTC4_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x43DC; +constexpr unsigned int mmCRTC4_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x43DD; +constexpr unsigned int mmCRTC4_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x43DE; +constexpr unsigned int mmCRTC4_CRTC_CRC_CNTL__VI = 0x43D4; +constexpr unsigned int mmCRTC4_CRTC_DCFE_CLOCK_CONTROL__VI = 0x437C; +constexpr unsigned int mmCRTC4_CRTC_DOUBLE_BUFFER_CONTROL__VI = 0x43B6; +constexpr unsigned int mmCRTC4_CRTC_DTMTEST_CNTL__VI = 0x4392; +constexpr unsigned int mmCRTC4_CRTC_DTMTEST_STATUS_POSITION__VI = 0x4393; +constexpr unsigned int mmCRTC4_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x43E1; +constexpr unsigned int mmCRTC4_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x43E5; +constexpr unsigned int mmCRTC4_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x43E4; +constexpr unsigned int mmCRTC4_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x43E6; +constexpr unsigned int mmCRTC4_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x43E3; +constexpr unsigned int mmCRTC4_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x43E2; +constexpr unsigned int mmCRTC4_CRTC_FIELD_INDICATION_CONTROL__VI = 0x43A0; +constexpr unsigned int mmCRTC4_CRTC_FLOW_CONTROL__VI = 0x4399; +constexpr unsigned int mmCRTC4_CRTC_FORCE_COUNT_NOW_CNTL__VI = 0x4398; +constexpr unsigned int mmCRTC4_CRTC_GSL_CONTROL__VI = 0x437B; +constexpr unsigned int mmCRTC4_CRTC_GSL_VSYNC_GAP__VI = 0x4379; +constexpr unsigned int mmCRTC4_CRTC_GSL_WINDOW__VI = 0x437A; +constexpr unsigned int mmCRTC4_CRTC_H_BLANK_EARLY_NUM__VI = 0x437D; +constexpr unsigned int mmCRTC4_CRTC_H_BLANK_START_END__VI = 0x4381; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_A__VI = 0x4382; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_A_CNTL__VI = 0x4383; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_B__VI = 0x4384; +constexpr unsigned int mmCRTC4_CRTC_H_SYNC_B_CNTL__VI = 0x4385; +constexpr unsigned int mmCRTC4_CRTC_H_TOTAL__VI = 0x4380; +constexpr unsigned int mmCRTC4_CRTC_INTERLACE_CONTROL__VI = 0x439E; +constexpr unsigned int mmCRTC4_CRTC_INTERLACE_STATUS__VI = 0x439F; +constexpr unsigned int mmCRTC4_CRTC_INTERRUPT_CONTROL__VI = 0x43B4; +constexpr unsigned int mmCRTC4_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__VI = 0x43AB; +constexpr unsigned int mmCRTC4_CRTC_MASTER_EN__VI = 0x43C2; +constexpr unsigned int mmCRTC4_CRTC_MVP_INBAND_CNTL_INSERT__VI = 0x43BF; +constexpr unsigned int mmCRTC4_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__VI = 0x43C0; +constexpr unsigned int mmCRTC4_CRTC_MVP_STATUS__VI = 0x43C1; +constexpr unsigned int mmCRTC4_CRTC_NOM_VERT_POSITION__VI = 0x43A5; +constexpr unsigned int mmCRTC4_CRTC_OVERSCAN_COLOR__VI = 0x43C8; +constexpr unsigned int mmCRTC4_CRTC_OVERSCAN_COLOR_EXT__VI = 0x43C9; +constexpr unsigned int mmCRTC4_CRTC_PIXEL_DATA_READBACK0__VI = 0x43A1; +constexpr unsigned int mmCRTC4_CRTC_PIXEL_DATA_READBACK1__VI = 0x43A2; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_CONTROL__VI = 0x43B0; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_FRAME__VI = 0x43B2; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_POSITION__VI = 0x43B1; +constexpr unsigned int mmCRTC4_CRTC_SNAPSHOT_STATUS__VI = 0x43AF; +constexpr unsigned int mmCRTC4_CRTC_START_LINE_CONTROL__VI = 0x43B3; +constexpr unsigned int mmCRTC4_CRTC_STATIC_SCREEN_CONTROL__VI = 0x43E7; +constexpr unsigned int mmCRTC4_CRTC_STATUS__SI__CI = 0x47A3; +constexpr unsigned int mmCRTC4_CRTC_STATUS__VI = 0x43A3; +constexpr unsigned int mmCRTC4_CRTC_STATUS_FRAME_COUNT__VI = 0x43A6; +constexpr unsigned int mmCRTC4_CRTC_STATUS_HV_COUNT__VI = 0x43A8; +constexpr unsigned int mmCRTC4_CRTC_STATUS_POSITION__SI__CI = 0x47A4; +constexpr unsigned int mmCRTC4_CRTC_STATUS_POSITION__VI = 0x43A4; +constexpr unsigned int mmCRTC4_CRTC_STATUS_VF_COUNT__VI = 0x43A7; +constexpr unsigned int mmCRTC4_CRTC_STEREO_CONTROL__VI = 0x43AE; +constexpr unsigned int mmCRTC4_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x439A; +constexpr unsigned int mmCRTC4_CRTC_STEREO_STATUS__VI = 0x43AD; +constexpr unsigned int mmCRTC4_CRTC_TEST_DEBUG_DATA__VI = 0x43C7; +constexpr unsigned int mmCRTC4_CRTC_TEST_DEBUG_INDEX__VI = 0x43C6; +constexpr unsigned int mmCRTC4_CRTC_TEST_PATTERN_COLOR__VI = 0x43BC; +constexpr unsigned int mmCRTC4_CRTC_TEST_PATTERN_CONTROL__VI = 0x43BA; +constexpr unsigned int mmCRTC4_CRTC_TEST_PATTERN_PARAMETERS__VI = 0x43BB; +constexpr unsigned int mmCRTC4_CRTC_TRIGA_CNTL__VI = 0x4394; +constexpr unsigned int mmCRTC4_CRTC_TRIGA_MANUAL_TRIG__VI = 0x4395; +constexpr unsigned int mmCRTC4_CRTC_TRIGB_CNTL__VI = 0x4396; +constexpr unsigned int mmCRTC4_CRTC_TRIGB_MANUAL_TRIG__VI = 0x4397; +constexpr unsigned int mmCRTC4_CRTC_UPDATE_LOCK__VI = 0x43B5; +constexpr unsigned int mmCRTC4_CRTC_VBI_END__VI = 0x4386; +constexpr unsigned int mmCRTC4_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x43CF; +constexpr unsigned int mmCRTC4_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x43CE; +constexpr unsigned int mmCRTC4_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x43D1; +constexpr unsigned int mmCRTC4_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x43D0; +constexpr unsigned int mmCRTC4_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x43D3; +constexpr unsigned int mmCRTC4_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x43D2; +constexpr unsigned int mmCRTC4_CRTC_VERT_SYNC_CONTROL__VI = 0x43AC; +constexpr unsigned int mmCRTC4_CRTC_VGA_PARAMETER_CAPTURE_MODE__VI = 0x43B7; +constexpr unsigned int mmCRTC4_CRTC_VSYNC_NOM_INT_STATUS__VI = 0x438C; +constexpr unsigned int mmCRTC4_CRTC_V_BLANK_START_END__VI = 0x438D; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_A__VI = 0x438E; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_A_CNTL__VI = 0x438F; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_B__VI = 0x4390; +constexpr unsigned int mmCRTC4_CRTC_V_SYNC_B_CNTL__VI = 0x4391; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL__VI = 0x4387; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_CONTROL__VI = 0x438A; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_INT_STATUS__VI = 0x438B; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_MAX__VI = 0x4389; +constexpr unsigned int mmCRTC4_CRTC_V_TOTAL_MIN__VI = 0x4388; +constexpr unsigned int mmCRTC4_CRTC_V_UPDATE_INT_STATUS__VI = 0x43C4; +constexpr unsigned int mmCRTC4_DCFE_DBG_SEL__VI = 0x437E; +constexpr unsigned int mmCRTC4_DCFE_MEM_PWR_CTRL__VI = 0x437F; +constexpr unsigned int mmCRTC4_DCFE_MEM_PWR_CTRL2__VI = 0x43B8; +constexpr unsigned int mmCRTC4_DCFE_MEM_PWR_STATUS__VI = 0x43B9; +constexpr unsigned int mmCRTC4_MASTER_UPDATE_LOCK__VI = 0x43BD; +constexpr unsigned int mmCRTC4_MASTER_UPDATE_MODE__SI__CI = 0x47BE; +constexpr unsigned int mmCRTC4_MASTER_UPDATE_MODE__VI = 0x43BE; +constexpr unsigned int mmCRTC4_PIXEL_RATE_CNTL__VI = 0x0150; +constexpr unsigned int mmCRTC5_CRTC_3D_STRUCTURE_CONTROL__VI = 0x4578; +constexpr unsigned int mmCRTC5_CRTC_ALLOW_STOP_OFF_V_CNT__VI = 0x45C3; +constexpr unsigned int mmCRTC5_CRTC_AVSYNC_COUNTER__VI = 0x459B; +constexpr unsigned int mmCRTC5_CRTC_BLACK_COLOR__VI = 0x45CC; +constexpr unsigned int mmCRTC5_CRTC_BLACK_COLOR_EXT__VI = 0x45CD; +constexpr unsigned int mmCRTC5_CRTC_BLANK_CONTROL__SI__CI = 0x4A9D; +constexpr unsigned int mmCRTC5_CRTC_BLANK_CONTROL__VI = 0x459D; +constexpr unsigned int mmCRTC5_CRTC_BLANK_DATA_COLOR__VI = 0x45CA; +constexpr unsigned int mmCRTC5_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x45CB; +constexpr unsigned int mmCRTC5_CRTC_CONTROL__VI = 0x459C; +constexpr unsigned int mmCRTC5_CRTC_COUNT_CONTROL__VI = 0x45A9; +constexpr unsigned int mmCRTC5_CRTC_COUNT_RESET__VI = 0x45AA; +constexpr unsigned int mmCRTC5_CRTC_CRC0_DATA_B__VI = 0x45DA; +constexpr unsigned int mmCRTC5_CRTC_CRC0_DATA_RG__VI = 0x45D9; +constexpr unsigned int mmCRTC5_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x45D5; +constexpr unsigned int mmCRTC5_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x45D6; +constexpr unsigned int mmCRTC5_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x45D7; +constexpr unsigned int mmCRTC5_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x45D8; +constexpr unsigned int mmCRTC5_CRTC_CRC1_DATA_B__VI = 0x45E0; +constexpr unsigned int mmCRTC5_CRTC_CRC1_DATA_RG__VI = 0x45DF; +constexpr unsigned int mmCRTC5_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x45DB; +constexpr unsigned int mmCRTC5_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x45DC; +constexpr unsigned int mmCRTC5_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x45DD; +constexpr unsigned int mmCRTC5_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x45DE; +constexpr unsigned int mmCRTC5_CRTC_CRC_CNTL__VI = 0x45D4; +constexpr unsigned int mmCRTC5_CRTC_DCFE_CLOCK_CONTROL__VI = 0x457C; +constexpr unsigned int mmCRTC5_CRTC_DOUBLE_BUFFER_CONTROL__VI = 0x45B6; +constexpr unsigned int mmCRTC5_CRTC_DTMTEST_CNTL__VI = 0x4592; +constexpr unsigned int mmCRTC5_CRTC_DTMTEST_STATUS_POSITION__VI = 0x4593; +constexpr unsigned int mmCRTC5_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x45E1; +constexpr unsigned int mmCRTC5_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x45E5; +constexpr unsigned int mmCRTC5_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x45E4; +constexpr unsigned int mmCRTC5_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x45E6; +constexpr unsigned int mmCRTC5_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x45E3; +constexpr unsigned int mmCRTC5_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x45E2; +constexpr unsigned int mmCRTC5_CRTC_FIELD_INDICATION_CONTROL__VI = 0x45A0; +constexpr unsigned int mmCRTC5_CRTC_FLOW_CONTROL__VI = 0x4599; +constexpr unsigned int mmCRTC5_CRTC_FORCE_COUNT_NOW_CNTL__VI = 0x4598; +constexpr unsigned int mmCRTC5_CRTC_GSL_CONTROL__VI = 0x457B; +constexpr unsigned int mmCRTC5_CRTC_GSL_VSYNC_GAP__VI = 0x4579; +constexpr unsigned int mmCRTC5_CRTC_GSL_WINDOW__VI = 0x457A; +constexpr unsigned int mmCRTC5_CRTC_H_BLANK_EARLY_NUM__VI = 0x457D; +constexpr unsigned int mmCRTC5_CRTC_H_BLANK_START_END__VI = 0x4581; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_A__VI = 0x4582; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_A_CNTL__VI = 0x4583; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_B__VI = 0x4584; +constexpr unsigned int mmCRTC5_CRTC_H_SYNC_B_CNTL__VI = 0x4585; +constexpr unsigned int mmCRTC5_CRTC_H_TOTAL__VI = 0x4580; +constexpr unsigned int mmCRTC5_CRTC_INTERLACE_CONTROL__VI = 0x459E; +constexpr unsigned int mmCRTC5_CRTC_INTERLACE_STATUS__VI = 0x459F; +constexpr unsigned int mmCRTC5_CRTC_INTERRUPT_CONTROL__VI = 0x45B4; +constexpr unsigned int mmCRTC5_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__VI = 0x45AB; +constexpr unsigned int mmCRTC5_CRTC_MASTER_EN__VI = 0x45C2; +constexpr unsigned int mmCRTC5_CRTC_MVP_INBAND_CNTL_INSERT__VI = 0x45BF; +constexpr unsigned int mmCRTC5_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__VI = 0x45C0; +constexpr unsigned int mmCRTC5_CRTC_MVP_STATUS__VI = 0x45C1; +constexpr unsigned int mmCRTC5_CRTC_NOM_VERT_POSITION__VI = 0x45A5; +constexpr unsigned int mmCRTC5_CRTC_OVERSCAN_COLOR__VI = 0x45C8; +constexpr unsigned int mmCRTC5_CRTC_OVERSCAN_COLOR_EXT__VI = 0x45C9; +constexpr unsigned int mmCRTC5_CRTC_PIXEL_DATA_READBACK0__VI = 0x45A1; +constexpr unsigned int mmCRTC5_CRTC_PIXEL_DATA_READBACK1__VI = 0x45A2; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_CONTROL__VI = 0x45B0; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_FRAME__VI = 0x45B2; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_POSITION__VI = 0x45B1; +constexpr unsigned int mmCRTC5_CRTC_SNAPSHOT_STATUS__VI = 0x45AF; +constexpr unsigned int mmCRTC5_CRTC_START_LINE_CONTROL__VI = 0x45B3; +constexpr unsigned int mmCRTC5_CRTC_STATIC_SCREEN_CONTROL__VI = 0x45E7; +constexpr unsigned int mmCRTC5_CRTC_STATUS__SI__CI = 0x4AA3; +constexpr unsigned int mmCRTC5_CRTC_STATUS__VI = 0x45A3; +constexpr unsigned int mmCRTC5_CRTC_STATUS_FRAME_COUNT__VI = 0x45A6; +constexpr unsigned int mmCRTC5_CRTC_STATUS_HV_COUNT__VI = 0x45A8; +constexpr unsigned int mmCRTC5_CRTC_STATUS_POSITION__SI__CI = 0x4AA4; +constexpr unsigned int mmCRTC5_CRTC_STATUS_POSITION__VI = 0x45A4; +constexpr unsigned int mmCRTC5_CRTC_STATUS_VF_COUNT__VI = 0x45A7; +constexpr unsigned int mmCRTC5_CRTC_STEREO_CONTROL__VI = 0x45AE; +constexpr unsigned int mmCRTC5_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x459A; +constexpr unsigned int mmCRTC5_CRTC_STEREO_STATUS__VI = 0x45AD; +constexpr unsigned int mmCRTC5_CRTC_TEST_DEBUG_DATA__VI = 0x45C7; +constexpr unsigned int mmCRTC5_CRTC_TEST_DEBUG_INDEX__VI = 0x45C6; +constexpr unsigned int mmCRTC5_CRTC_TEST_PATTERN_COLOR__VI = 0x45BC; +constexpr unsigned int mmCRTC5_CRTC_TEST_PATTERN_CONTROL__VI = 0x45BA; +constexpr unsigned int mmCRTC5_CRTC_TEST_PATTERN_PARAMETERS__VI = 0x45BB; +constexpr unsigned int mmCRTC5_CRTC_TRIGA_CNTL__VI = 0x4594; +constexpr unsigned int mmCRTC5_CRTC_TRIGA_MANUAL_TRIG__VI = 0x4595; +constexpr unsigned int mmCRTC5_CRTC_TRIGB_CNTL__VI = 0x4596; +constexpr unsigned int mmCRTC5_CRTC_TRIGB_MANUAL_TRIG__VI = 0x4597; +constexpr unsigned int mmCRTC5_CRTC_UPDATE_LOCK__VI = 0x45B5; +constexpr unsigned int mmCRTC5_CRTC_VBI_END__VI = 0x4586; +constexpr unsigned int mmCRTC5_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x45CF; +constexpr unsigned int mmCRTC5_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x45CE; +constexpr unsigned int mmCRTC5_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x45D1; +constexpr unsigned int mmCRTC5_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x45D0; +constexpr unsigned int mmCRTC5_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x45D3; +constexpr unsigned int mmCRTC5_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x45D2; +constexpr unsigned int mmCRTC5_CRTC_VERT_SYNC_CONTROL__VI = 0x45AC; +constexpr unsigned int mmCRTC5_CRTC_VGA_PARAMETER_CAPTURE_MODE__VI = 0x45B7; +constexpr unsigned int mmCRTC5_CRTC_VSYNC_NOM_INT_STATUS__VI = 0x458C; +constexpr unsigned int mmCRTC5_CRTC_V_BLANK_START_END__VI = 0x458D; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_A__VI = 0x458E; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_A_CNTL__VI = 0x458F; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_B__VI = 0x4590; +constexpr unsigned int mmCRTC5_CRTC_V_SYNC_B_CNTL__VI = 0x4591; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL__VI = 0x4587; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_CONTROL__VI = 0x458A; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_INT_STATUS__VI = 0x458B; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_MAX__VI = 0x4589; +constexpr unsigned int mmCRTC5_CRTC_V_TOTAL_MIN__VI = 0x4588; +constexpr unsigned int mmCRTC5_CRTC_V_UPDATE_INT_STATUS__VI = 0x45C4; +constexpr unsigned int mmCRTC5_DCFE_DBG_SEL__VI = 0x457E; +constexpr unsigned int mmCRTC5_DCFE_MEM_PWR_CTRL__VI = 0x457F; +constexpr unsigned int mmCRTC5_DCFE_MEM_PWR_CTRL2__VI = 0x45B8; +constexpr unsigned int mmCRTC5_DCFE_MEM_PWR_STATUS__VI = 0x45B9; +constexpr unsigned int mmCRTC5_MASTER_UPDATE_LOCK__VI = 0x45BD; +constexpr unsigned int mmCRTC5_MASTER_UPDATE_MODE__SI__CI = 0x4ABE; +constexpr unsigned int mmCRTC5_MASTER_UPDATE_MODE__VI = 0x45BE; +constexpr unsigned int mmCRTC5_PIXEL_RATE_CNTL__VI = 0x0154; +constexpr unsigned int mmCRTC6_CRTC_3D_STRUCTURE_CONTROL__VI = 0x4778; +constexpr unsigned int mmCRTC6_CRTC_ALLOW_STOP_OFF_V_CNT__VI = 0x47C3; +constexpr unsigned int mmCRTC6_CRTC_AVSYNC_COUNTER__VI = 0x479B; +constexpr unsigned int mmCRTC6_CRTC_BLACK_COLOR__VI = 0x47CC; +constexpr unsigned int mmCRTC6_CRTC_BLACK_COLOR_EXT__VI = 0x47CD; +constexpr unsigned int mmCRTC6_CRTC_BLANK_CONTROL__VI = 0x479D; +constexpr unsigned int mmCRTC6_CRTC_BLANK_DATA_COLOR__VI = 0x47CA; +constexpr unsigned int mmCRTC6_CRTC_BLANK_DATA_COLOR_EXT__VI = 0x47CB; +constexpr unsigned int mmCRTC6_CRTC_CONTROL__VI = 0x479C; +constexpr unsigned int mmCRTC6_CRTC_COUNT_CONTROL__VI = 0x47A9; +constexpr unsigned int mmCRTC6_CRTC_COUNT_RESET__VI = 0x47AA; +constexpr unsigned int mmCRTC6_CRTC_CRC0_DATA_B__VI = 0x47DA; +constexpr unsigned int mmCRTC6_CRTC_CRC0_DATA_RG__VI = 0x47D9; +constexpr unsigned int mmCRTC6_CRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x47D5; +constexpr unsigned int mmCRTC6_CRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x47D6; +constexpr unsigned int mmCRTC6_CRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x47D7; +constexpr unsigned int mmCRTC6_CRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x47D8; +constexpr unsigned int mmCRTC6_CRTC_CRC1_DATA_B__VI = 0x47E0; +constexpr unsigned int mmCRTC6_CRTC_CRC1_DATA_RG__VI = 0x47DF; +constexpr unsigned int mmCRTC6_CRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x47DB; +constexpr unsigned int mmCRTC6_CRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x47DC; +constexpr unsigned int mmCRTC6_CRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x47DD; +constexpr unsigned int mmCRTC6_CRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x47DE; +constexpr unsigned int mmCRTC6_CRTC_CRC_CNTL__VI = 0x47D4; +constexpr unsigned int mmCRTC6_CRTC_DCFE_CLOCK_CONTROL__VI = 0x477C; +constexpr unsigned int mmCRTC6_CRTC_DOUBLE_BUFFER_CONTROL__VI = 0x47B6; +constexpr unsigned int mmCRTC6_CRTC_DTMTEST_CNTL__VI = 0x4792; +constexpr unsigned int mmCRTC6_CRTC_DTMTEST_STATUS_POSITION__VI = 0x4793; +constexpr unsigned int mmCRTC6_CRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x47E1; +constexpr unsigned int mmCRTC6_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x47E5; +constexpr unsigned int mmCRTC6_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x47E4; +constexpr unsigned int mmCRTC6_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x47E6; +constexpr unsigned int mmCRTC6_CRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x47E3; +constexpr unsigned int mmCRTC6_CRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x47E2; +constexpr unsigned int mmCRTC6_CRTC_FIELD_INDICATION_CONTROL__VI = 0x47A0; +constexpr unsigned int mmCRTC6_CRTC_FLOW_CONTROL__VI = 0x4799; +constexpr unsigned int mmCRTC6_CRTC_FORCE_COUNT_NOW_CNTL__VI = 0x4798; +constexpr unsigned int mmCRTC6_CRTC_GSL_CONTROL__VI = 0x477B; +constexpr unsigned int mmCRTC6_CRTC_GSL_VSYNC_GAP__VI = 0x4779; +constexpr unsigned int mmCRTC6_CRTC_GSL_WINDOW__VI = 0x477A; +constexpr unsigned int mmCRTC6_CRTC_H_BLANK_EARLY_NUM__VI = 0x477D; +constexpr unsigned int mmCRTC6_CRTC_H_BLANK_START_END__VI = 0x4781; +constexpr unsigned int mmCRTC6_CRTC_H_SYNC_A__VI = 0x4782; +constexpr unsigned int mmCRTC6_CRTC_H_SYNC_A_CNTL__VI = 0x4783; +constexpr unsigned int mmCRTC6_CRTC_H_SYNC_B__VI = 0x4784; +constexpr unsigned int mmCRTC6_CRTC_H_SYNC_B_CNTL__VI = 0x4785; +constexpr unsigned int mmCRTC6_CRTC_H_TOTAL__VI = 0x4780; +constexpr unsigned int mmCRTC6_CRTC_INTERLACE_CONTROL__VI = 0x479E; +constexpr unsigned int mmCRTC6_CRTC_INTERLACE_STATUS__VI = 0x479F; +constexpr unsigned int mmCRTC6_CRTC_INTERRUPT_CONTROL__VI = 0x47B4; +constexpr unsigned int mmCRTC6_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__VI = 0x47AB; +constexpr unsigned int mmCRTC6_CRTC_MASTER_EN__VI = 0x47C2; +constexpr unsigned int mmCRTC6_CRTC_MVP_INBAND_CNTL_INSERT__VI = 0x47BF; +constexpr unsigned int mmCRTC6_CRTC_MVP_INBAND_CNTL_INSERT_TIMER__VI = 0x47C0; +constexpr unsigned int mmCRTC6_CRTC_MVP_STATUS__VI = 0x47C1; +constexpr unsigned int mmCRTC6_CRTC_NOM_VERT_POSITION__VI = 0x47A5; +constexpr unsigned int mmCRTC6_CRTC_OVERSCAN_COLOR__VI = 0x47C8; +constexpr unsigned int mmCRTC6_CRTC_OVERSCAN_COLOR_EXT__VI = 0x47C9; +constexpr unsigned int mmCRTC6_CRTC_PIXEL_DATA_READBACK0__VI = 0x47A1; +constexpr unsigned int mmCRTC6_CRTC_PIXEL_DATA_READBACK1__VI = 0x47A2; +constexpr unsigned int mmCRTC6_CRTC_SNAPSHOT_CONTROL__VI = 0x47B0; +constexpr unsigned int mmCRTC6_CRTC_SNAPSHOT_FRAME__VI = 0x47B2; +constexpr unsigned int mmCRTC6_CRTC_SNAPSHOT_POSITION__VI = 0x47B1; +constexpr unsigned int mmCRTC6_CRTC_SNAPSHOT_STATUS__VI = 0x47AF; +constexpr unsigned int mmCRTC6_CRTC_START_LINE_CONTROL__VI = 0x47B3; +constexpr unsigned int mmCRTC6_CRTC_STATIC_SCREEN_CONTROL__VI = 0x47E7; +constexpr unsigned int mmCRTC6_CRTC_STATUS__VI = 0x47A3; +constexpr unsigned int mmCRTC6_CRTC_STATUS_FRAME_COUNT__VI = 0x47A6; +constexpr unsigned int mmCRTC6_CRTC_STATUS_HV_COUNT__VI = 0x47A8; +constexpr unsigned int mmCRTC6_CRTC_STATUS_POSITION__VI = 0x47A4; +constexpr unsigned int mmCRTC6_CRTC_STATUS_VF_COUNT__VI = 0x47A7; +constexpr unsigned int mmCRTC6_CRTC_STEREO_CONTROL__VI = 0x47AE; +constexpr unsigned int mmCRTC6_CRTC_STEREO_FORCE_NEXT_EYE__VI = 0x479A; +constexpr unsigned int mmCRTC6_CRTC_STEREO_STATUS__VI = 0x47AD; +constexpr unsigned int mmCRTC6_CRTC_TEST_DEBUG_DATA__VI = 0x47C7; +constexpr unsigned int mmCRTC6_CRTC_TEST_DEBUG_INDEX__VI = 0x47C6; +constexpr unsigned int mmCRTC6_CRTC_TEST_PATTERN_COLOR__VI = 0x47BC; +constexpr unsigned int mmCRTC6_CRTC_TEST_PATTERN_CONTROL__VI = 0x47BA; +constexpr unsigned int mmCRTC6_CRTC_TEST_PATTERN_PARAMETERS__VI = 0x47BB; +constexpr unsigned int mmCRTC6_CRTC_TRIGA_CNTL__VI = 0x4794; +constexpr unsigned int mmCRTC6_CRTC_TRIGA_MANUAL_TRIG__VI = 0x4795; +constexpr unsigned int mmCRTC6_CRTC_TRIGB_CNTL__VI = 0x4796; +constexpr unsigned int mmCRTC6_CRTC_TRIGB_MANUAL_TRIG__VI = 0x4797; +constexpr unsigned int mmCRTC6_CRTC_UPDATE_LOCK__VI = 0x47B5; +constexpr unsigned int mmCRTC6_CRTC_VBI_END__VI = 0x4786; +constexpr unsigned int mmCRTC6_CRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x47CF; +constexpr unsigned int mmCRTC6_CRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x47CE; +constexpr unsigned int mmCRTC6_CRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x47D1; +constexpr unsigned int mmCRTC6_CRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x47D0; +constexpr unsigned int mmCRTC6_CRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x47D3; +constexpr unsigned int mmCRTC6_CRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x47D2; +constexpr unsigned int mmCRTC6_CRTC_VERT_SYNC_CONTROL__VI = 0x47AC; +constexpr unsigned int mmCRTC6_CRTC_VGA_PARAMETER_CAPTURE_MODE__VI = 0x47B7; +constexpr unsigned int mmCRTC6_CRTC_VSYNC_NOM_INT_STATUS__VI = 0x478C; +constexpr unsigned int mmCRTC6_CRTC_V_BLANK_START_END__VI = 0x478D; +constexpr unsigned int mmCRTC6_CRTC_V_SYNC_A__VI = 0x478E; +constexpr unsigned int mmCRTC6_CRTC_V_SYNC_A_CNTL__VI = 0x478F; +constexpr unsigned int mmCRTC6_CRTC_V_SYNC_B__VI = 0x4790; +constexpr unsigned int mmCRTC6_CRTC_V_SYNC_B_CNTL__VI = 0x4791; +constexpr unsigned int mmCRTC6_CRTC_V_TOTAL__VI = 0x4787; +constexpr unsigned int mmCRTC6_CRTC_V_TOTAL_CONTROL__VI = 0x478A; +constexpr unsigned int mmCRTC6_CRTC_V_TOTAL_INT_STATUS__VI = 0x478B; +constexpr unsigned int mmCRTC6_CRTC_V_TOTAL_MAX__VI = 0x4789; +constexpr unsigned int mmCRTC6_CRTC_V_TOTAL_MIN__VI = 0x4788; +constexpr unsigned int mmCRTC6_CRTC_V_UPDATE_INT_STATUS__VI = 0x47C4; +constexpr unsigned int mmCRTC6_DCFE_DBG_SEL__VI = 0x477E; +constexpr unsigned int mmCRTC6_DCFE_MEM_PWR_CTRL__VI = 0x477F; +constexpr unsigned int mmCRTC6_DCFE_MEM_PWR_CTRL2__VI = 0x47B8; +constexpr unsigned int mmCRTC6_DCFE_MEM_PWR_STATUS__VI = 0x47B9; +constexpr unsigned int mmCRTC6_MASTER_UPDATE_LOCK__VI = 0x47BD; +constexpr unsigned int mmCRTC6_MASTER_UPDATE_MODE__VI = 0x47BE; +constexpr unsigned int mmCRTC_3D_STRUCTURE_CONTROL__VI = 0x1B78; +constexpr unsigned int mmCRTC_AVSYNC_COUNTER__VI = 0x1B9B; +constexpr unsigned int mmCRTC_BLACK_COLOR__VI = 0x1BCC; +constexpr unsigned int mmCRTC_BLACK_COLOR_EXT__VI = 0x1BCD; +constexpr unsigned int mmCRTC_BLANK_DATA_COLOR__VI = 0x1BCA; +constexpr unsigned int mmCRTC_BLANK_DATA_COLOR_EXT__VI = 0x1BCB; +constexpr unsigned int mmCRTC_CRC0_DATA_B__VI = 0x1BDA; +constexpr unsigned int mmCRTC_CRC0_DATA_RG__VI = 0x1BD9; +constexpr unsigned int mmCRTC_CRC0_WINDOWA_X_CONTROL__VI = 0x1BD5; +constexpr unsigned int mmCRTC_CRC0_WINDOWA_Y_CONTROL__VI = 0x1BD6; +constexpr unsigned int mmCRTC_CRC0_WINDOWB_X_CONTROL__VI = 0x1BD7; +constexpr unsigned int mmCRTC_CRC0_WINDOWB_Y_CONTROL__VI = 0x1BD8; +constexpr unsigned int mmCRTC_CRC1_DATA_B__VI = 0x1BE0; +constexpr unsigned int mmCRTC_CRC1_DATA_RG__VI = 0x1BDF; +constexpr unsigned int mmCRTC_CRC1_WINDOWA_X_CONTROL__VI = 0x1BDB; +constexpr unsigned int mmCRTC_CRC1_WINDOWA_Y_CONTROL__VI = 0x1BDC; +constexpr unsigned int mmCRTC_CRC1_WINDOWB_X_CONTROL__VI = 0x1BDD; +constexpr unsigned int mmCRTC_CRC1_WINDOWB_Y_CONTROL__VI = 0x1BDE; +constexpr unsigned int mmCRTC_CRC_CNTL__VI = 0x1BD4; +constexpr unsigned int mmCRTC_DCFE_CLOCK_CONTROL__VI = 0x1B7C; +constexpr unsigned int mmCRTC_EXT_TIMING_SYNC_CONTROL__VI = 0x1BE1; +constexpr unsigned int mmCRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__VI = 0x1BE5; +constexpr unsigned int mmCRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__VI = 0x1BE4; +constexpr unsigned int mmCRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__VI = 0x1BE6; +constexpr unsigned int mmCRTC_EXT_TIMING_SYNC_WINDOW_END__VI = 0x1BE3; +constexpr unsigned int mmCRTC_EXT_TIMING_SYNC_WINDOW_START__VI = 0x1BE2; +constexpr unsigned int mmCRTC_FIELD_INDICATION_CONTROL__VI = 0x1BA0; +constexpr unsigned int mmCRTC_GSL_CONTROL__VI = 0x1B7B; +constexpr unsigned int mmCRTC_GSL_VSYNC_GAP__VI = 0x1B79; +constexpr unsigned int mmCRTC_GSL_WINDOW__VI = 0x1B7A; +constexpr unsigned int mmCRTC_H_BLANK_EARLY_NUM__VI = 0x1B7D; +constexpr unsigned int mmCRTC_OVERSCAN_COLOR__VI = 0x1BC8; +constexpr unsigned int mmCRTC_OVERSCAN_COLOR_EXT__VI = 0x1BC9; +constexpr unsigned int mmCRTC_PIXEL_DATA_READBACK0__VI = 0x1BA1; +constexpr unsigned int mmCRTC_PIXEL_DATA_READBACK1__VI = 0x1BA2; +constexpr unsigned int mmCRTC_STATIC_SCREEN_CONTROL__VI = 0x1BE7; +constexpr unsigned int mmCRTC_STEREO_FORCE_NEXT_EYE__VI = 0x1B9A; +constexpr unsigned int mmCRTC_VERTICAL_INTERRUPT0_CONTROL__VI = 0x1BCF; +constexpr unsigned int mmCRTC_VERTICAL_INTERRUPT0_POSITION__VI = 0x1BCE; +constexpr unsigned int mmCRTC_VERTICAL_INTERRUPT1_CONTROL__VI = 0x1BD1; +constexpr unsigned int mmCRTC_VERTICAL_INTERRUPT1_POSITION__VI = 0x1BD0; +constexpr unsigned int mmCRTC_VERTICAL_INTERRUPT2_CONTROL__VI = 0x1BD3; +constexpr unsigned int mmCRTC_VERTICAL_INTERRUPT2_POSITION__VI = 0x1BD2; +constexpr unsigned int mmCUR2_COLOR1__VI = 0x1A75; +constexpr unsigned int mmCUR2_COLOR2__VI = 0x1A76; +constexpr unsigned int mmCUR2_CONTROL__VI = 0x1A6F; +constexpr unsigned int mmCUR2_HOT_SPOT__VI = 0x1A74; +constexpr unsigned int mmCUR2_POSITION__VI = 0x1A73; +constexpr unsigned int mmCUR2_SIZE__VI = 0x1A71; +constexpr unsigned int mmCUR2_STEREO_CONTROL__VI = 0x1A9B; +constexpr unsigned int mmCUR2_SURFACE_ADDRESS__VI = 0x1A70; +constexpr unsigned int mmCUR2_SURFACE_ADDRESS_HIGH__VI = 0x1A72; +constexpr unsigned int mmCUR2_UPDATE__VI = 0x1A77; +constexpr unsigned int mmCUR_REQUEST_FILTER_CNTL__VI = 0x1A99; +constexpr unsigned int mmCUR_STEREO_CONTROL__VI = 0x1A9A; +constexpr unsigned int mmDAC_AUTODETECT_CONTROL__VI = 0x16B4; +constexpr unsigned int mmDAC_AUTODETECT_CONTROL2__VI = 0x16B5; +constexpr unsigned int mmDAC_AUTODETECT_CONTROL3__VI = 0x16B6; +constexpr unsigned int mmDAC_AUTODETECT_INT_CONTROL__VI = 0x16B8; +constexpr unsigned int mmDAC_AUTODETECT_STATUS__VI = 0x16B7; +constexpr unsigned int mmDAC_CLK_ENABLE__VI = 0x0128; +constexpr unsigned int mmDAC_COMPARATOR_ENABLE__VI = 0x16BD; +constexpr unsigned int mmDAC_COMPARATOR_OUTPUT__VI = 0x16BE; +constexpr unsigned int mmDAC_CONTROL__VI = 0x16BC; +constexpr unsigned int mmDAC_CRC_CONTROL__VI = 0x16AD; +constexpr unsigned int mmDAC_CRC_EN__VI = 0x16AC; +constexpr unsigned int mmDAC_CRC_SIG_CONTROL__VI = 0x16B1; +constexpr unsigned int mmDAC_CRC_SIG_CONTROL_MASK__VI = 0x16AF; +constexpr unsigned int mmDAC_CRC_SIG_RGB__VI = 0x16B0; +constexpr unsigned int mmDAC_CRC_SIG_RGB_MASK__VI = 0x16AE; +constexpr unsigned int mmDAC_DFT_CONFIG__VI = 0x16C0; +constexpr unsigned int mmDAC_ENABLE__VI = 0x16AA; +constexpr unsigned int mmDAC_FIFO_STATUS__VI = 0x16C1; +constexpr unsigned int mmDAC_FORCE_DATA__VI = 0x16BA; +constexpr unsigned int mmDAC_FORCE_OUTPUT_CNTL__VI = 0x16B9; +constexpr unsigned int mmDAC_MACRO_CNTL_RESERVED0__VI = 0x48B8; +constexpr unsigned int mmDAC_MACRO_CNTL_RESERVED1__VI = 0x48B9; +constexpr unsigned int mmDAC_MACRO_CNTL_RESERVED2__VI = 0x48BA; +constexpr unsigned int mmDAC_MACRO_CNTL_RESERVED3__VI = 0x48BB; +constexpr unsigned int mmDAC_POWERDOWN__VI = 0x16BB; +constexpr unsigned int mmDAC_PWR_CNTL__VI = 0x16BF; +constexpr unsigned int mmDAC_SOURCE_SELECT__VI = 0x16AB; +constexpr unsigned int mmDAC_STEREOSYNC_SELECT__VI = 0x16B3; +constexpr unsigned int mmDAC_SYNC_TRISTATE_CONTROL__VI = 0x16B2; +constexpr unsigned int mmDAC_TEST_DEBUG_DATA__VI = 0x16C3; +constexpr unsigned int mmDAC_TEST_DEBUG_INDEX__VI = 0x16C2; +constexpr unsigned int mmDBG_OUT_CNTL__VI = 0x4834; +constexpr unsigned int mmDBG_SMB_BYPASS_SRBM_ACCESS__VI = 0x14EB; +constexpr unsigned int mmDCCG_AUDIO_DTO0_MODULE__VI = 0x016D; +constexpr unsigned int mmDCCG_AUDIO_DTO0_PHASE__VI = 0x016C; +constexpr unsigned int mmDCCG_AUDIO_DTO1_MODULE__VI = 0x016F; +constexpr unsigned int mmDCCG_AUDIO_DTO1_PHASE__VI = 0x016E; +constexpr unsigned int mmDCCG_AUDIO_DTO_SOURCE__VI = 0x016B; +constexpr unsigned int mmDCCG_CAC_STATUS__VI = 0x0137; +constexpr unsigned int mmDCCG_CBUS_WRCMD_DELAY__VI = 0x0110; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED0__VI = 0x5FD0; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED1__VI = 0x5FD1; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED10__VI = 0x5FDA; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED11__VI = 0x5FDB; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED2__VI = 0x5FD2; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED3__VI = 0x5FD3; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED4__VI = 0x5FD4; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED5__VI = 0x5FD5; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED6__VI = 0x5FD6; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED7__VI = 0x5FD7; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED8__VI = 0x5FD8; +constexpr unsigned int mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED9__VI = 0x5FD9; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED0__VI = 0x5FDC; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED1__VI = 0x5FDD; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED10__VI = 0x5FE6; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED11__VI = 0x5FE7; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED2__VI = 0x5FDE; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED3__VI = 0x5FDF; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED4__VI = 0x5FE0; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED5__VI = 0x5FE1; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED6__VI = 0x5FE2; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED7__VI = 0x5FE3; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED8__VI = 0x5FE4; +constexpr unsigned int mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED9__VI = 0x5FE5; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED0__VI = 0x5FE8; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED1__VI = 0x5FE9; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED10__VI = 0x5FF2; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED11__VI = 0x5FF3; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED2__VI = 0x5FEA; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED3__VI = 0x5FEB; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED4__VI = 0x5FEC; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED5__VI = 0x5FED; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED6__VI = 0x5FEE; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED7__VI = 0x5FEF; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED8__VI = 0x5FF0; +constexpr unsigned int mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED9__VI = 0x5FF1; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED0__VI = 0x5FF4; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED1__VI = 0x5FF5; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED10__VI = 0x5FFE; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED11__VI = 0x5FFF; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED2__VI = 0x5FF6; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED3__VI = 0x5FF7; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED4__VI = 0x5FF8; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED5__VI = 0x5FF9; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED6__VI = 0x5FFA; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED7__VI = 0x5FFB; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED8__VI = 0x5FFC; +constexpr unsigned int mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED9__VI = 0x5FFD; +constexpr unsigned int mmDCCG_DISP_CNTL_REG__VI = 0x013F; +constexpr unsigned int mmDCCG_DS_CNTL__VI = 0x0115; +constexpr unsigned int mmDCCG_DS_DEBUG_CNTL__VI = 0x0112; +constexpr unsigned int mmDCCG_DS_DTO_INCR__VI = 0x0113; +constexpr unsigned int mmDCCG_DS_DTO_MODULO__VI = 0x0114; +constexpr unsigned int mmDCCG_DS_HW_CAL_INTERVAL__VI = 0x0116; +constexpr unsigned int mmDCCG_GATE_DISABLE_CNTL__VI = 0x0134; +constexpr unsigned int mmDCCG_GTC_CNTL__VI = 0x0120; +constexpr unsigned int mmDCCG_GTC_CURRENT__VI = 0x0123; +constexpr unsigned int mmDCCG_GTC_DTO_INCR__VI = 0x0121; +constexpr unsigned int mmDCCG_GTC_DTO_MODULO__VI = 0x0122; +constexpr unsigned int mmDCCG_PERFMON_CNTL__VI = 0x0133; +constexpr unsigned int mmDCCG_PERFMON_CNTL2__VI = 0x010E; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED0__VI = 0x1700; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED1__VI = 0x1701; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED10__VI = 0x170A; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED11__VI = 0x170B; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED12__VI = 0x170C; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED13__VI = 0x170D; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED14__VI = 0x170E; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED15__VI = 0x170F; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED16__VI = 0x1710; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED17__VI = 0x1711; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED18__VI = 0x1712; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED19__VI = 0x1713; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED2__VI = 0x1702; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED20__VI = 0x1714; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED21__VI = 0x1715; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED22__VI = 0x1716; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED23__VI = 0x1717; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED24__VI = 0x1718; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED25__VI = 0x1719; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED26__VI = 0x171A; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED27__VI = 0x171B; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED28__VI = 0x171C; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED29__VI = 0x171D; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED3__VI = 0x1703; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED30__VI = 0x171E; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED31__VI = 0x171F; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED32__VI = 0x1720; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED33__VI = 0x1721; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED34__VI = 0x1722; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED35__VI = 0x1723; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED36__VI = 0x1724; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED37__VI = 0x1725; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED38__VI = 0x1726; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED39__VI = 0x1727; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED4__VI = 0x1704; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED40__VI = 0x1728; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED41__VI = 0x1729; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED5__VI = 0x1705; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED6__VI = 0x1706; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED7__VI = 0x1707; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED8__VI = 0x1708; +constexpr unsigned int mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED9__VI = 0x1709; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED0__VI = 0x172A; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED1__VI = 0x172B; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED10__VI = 0x1734; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED11__VI = 0x1735; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED12__VI = 0x1736; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED13__VI = 0x1737; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED14__VI = 0x1738; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED15__VI = 0x1739; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED16__VI = 0x173A; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED17__VI = 0x173B; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED18__VI = 0x173C; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED19__VI = 0x173D; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED2__VI = 0x172C; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED20__VI = 0x173E; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED21__VI = 0x173F; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED22__VI = 0x1740; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED23__VI = 0x1741; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED24__VI = 0x1742; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED25__VI = 0x1743; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED26__VI = 0x1744; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED27__VI = 0x1745; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED28__VI = 0x1746; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED29__VI = 0x1747; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED3__VI = 0x172D; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED30__VI = 0x1748; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED31__VI = 0x1749; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED32__VI = 0x174A; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED33__VI = 0x174B; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED34__VI = 0x174C; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED35__VI = 0x174D; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED36__VI = 0x174E; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED37__VI = 0x174F; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED38__VI = 0x1750; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED39__VI = 0x1751; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED4__VI = 0x172E; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED40__VI = 0x1752; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED41__VI = 0x1753; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED5__VI = 0x172F; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED6__VI = 0x1730; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED7__VI = 0x1731; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED8__VI = 0x1732; +constexpr unsigned int mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED9__VI = 0x1733; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED0__VI = 0x1754; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED1__VI = 0x1755; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED10__VI = 0x175E; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED11__VI = 0x175F; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED12__VI = 0x1760; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED13__VI = 0x1761; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED14__VI = 0x1762; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED15__VI = 0x1763; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED16__VI = 0x1764; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED17__VI = 0x1765; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED18__VI = 0x1766; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED19__VI = 0x1767; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED2__VI = 0x1756; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED20__VI = 0x1768; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED21__VI = 0x1769; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED22__VI = 0x176A; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED23__VI = 0x176B; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED24__VI = 0x176C; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED25__VI = 0x176D; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED26__VI = 0x176E; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED27__VI = 0x176F; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED28__VI = 0x1770; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED29__VI = 0x1771; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED3__VI = 0x1757; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED30__VI = 0x1772; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED31__VI = 0x1773; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED32__VI = 0x1774; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED33__VI = 0x1775; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED34__VI = 0x1776; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED35__VI = 0x1777; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED36__VI = 0x1778; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED37__VI = 0x1779; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED38__VI = 0x177A; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED39__VI = 0x177B; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED4__VI = 0x1758; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED40__VI = 0x177C; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED41__VI = 0x177D; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED5__VI = 0x1759; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED6__VI = 0x175A; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED7__VI = 0x175B; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED8__VI = 0x175C; +constexpr unsigned int mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED9__VI = 0x175D; +constexpr unsigned int mmDCCG_SOFT_RESET__VI = 0x015F; +constexpr unsigned int mmDCCG_TEST_CLK_SEL__VI = 0x017E; +constexpr unsigned int mmDCCG_TEST_DEBUG_DATA__VI = 0x017D; +constexpr unsigned int mmDCCG_TEST_DEBUG_INDEX__VI = 0x017C; +constexpr unsigned int mmDCDEBUG_BUS_CLK1_SEL__VI = 0x16C4; +constexpr unsigned int mmDCDEBUG_BUS_CLK2_SEL__VI = 0x16C5; +constexpr unsigned int mmDCDEBUG_BUS_CLK3_SEL__VI = 0x16C6; +constexpr unsigned int mmDCDEBUG_BUS_CLK4_SEL__VI = 0x16C7; +constexpr unsigned int mmDCDEBUG_BUS_CLK5_SEL__VI = 0x16C8; +constexpr unsigned int mmDCDEBUG_OUT_CNTL__VI = 0x16CA; +constexpr unsigned int mmDCDEBUG_OUT_DATA__VI = 0x16CB; +constexpr unsigned int mmDCDEBUG_OUT_PIN_OVERRIDE__VI = 0x16C9; +constexpr unsigned int mmDCE_VCE_CONTROL__VI = 0x1856; +constexpr unsigned int mmDCFE0_DCFE_CLOCK_CONTROL__VI = 0x1B00; +constexpr unsigned int mmDCFE0_DCFE_DBG_CONFIG__VI = 0x1B02; +constexpr unsigned int mmDCFE0_DCFE_SOFT_RESET__VI = 0x1B01; +constexpr unsigned int mmDCFE1_DCFE_CLOCK_CONTROL__VI = 0x1D00; +constexpr unsigned int mmDCFE1_DCFE_DBG_CONFIG__VI = 0x1D02; +constexpr unsigned int mmDCFE1_DCFE_SOFT_RESET__VI = 0x1D01; +constexpr unsigned int mmDCFE2_DCFE_CLOCK_CONTROL__VI = 0x1F00; +constexpr unsigned int mmDCFE2_DCFE_DBG_CONFIG__VI = 0x1F02; +constexpr unsigned int mmDCFE2_DCFE_SOFT_RESET__VI = 0x1F01; +constexpr unsigned int mmDCFE3_DCFE_CLOCK_CONTROL__VI = 0x4100; +constexpr unsigned int mmDCFE3_DCFE_DBG_CONFIG__VI = 0x4102; +constexpr unsigned int mmDCFE3_DCFE_SOFT_RESET__VI = 0x4101; +constexpr unsigned int mmDCFE4_DCFE_CLOCK_CONTROL__VI = 0x4300; +constexpr unsigned int mmDCFE4_DCFE_DBG_CONFIG__VI = 0x4302; +constexpr unsigned int mmDCFE4_DCFE_SOFT_RESET__VI = 0x4301; +constexpr unsigned int mmDCFE5_DCFE_CLOCK_CONTROL__VI = 0x4500; +constexpr unsigned int mmDCFE5_DCFE_DBG_CONFIG__VI = 0x4502; +constexpr unsigned int mmDCFE5_DCFE_SOFT_RESET__VI = 0x4501; +constexpr unsigned int mmDCFEV0_CRTC_PIXEL_RATE_CNTL__VI = 0x0104; +constexpr unsigned int mmDCFEV0_PG_CONFIG__VI = 0x02DB; +constexpr unsigned int mmDCFEV0_PG_ENABLE__VI = 0x02DC; +constexpr unsigned int mmDCFEV0_PG_STATUS__VI = 0x02DD; +constexpr unsigned int mmDCFEV_CLOCK_CONTROL__VI = 0x46F4; +constexpr unsigned int mmDCFEV_DBG_CONFIG__VI = 0x46F7; +constexpr unsigned int mmDCFEV_DMIFV_CLOCK_CONTROL__VI = 0x46F6; +constexpr unsigned int mmDCFEV_DMIFV_MEM_PWR_CTRL__VI = 0x46F8; +constexpr unsigned int mmDCFEV_DMIFV_MEM_PWR_STATUS__VI = 0x46F9; +constexpr unsigned int mmDCFEV_SOFT_RESET__VI = 0x46F5; +constexpr unsigned int mmDCFE_CLOCK_CONTROL__VI = 0x1B00; +constexpr unsigned int mmDCFE_DBG_CONFIG__VI = 0x1B02; +constexpr unsigned int mmDCFE_DBG_SEL__VI = 0x1B7E; +constexpr unsigned int mmDCFE_MEM_PWR_CTRL__VI = 0x1B7F; +constexpr unsigned int mmDCFE_MEM_PWR_CTRL2__VI = 0x1BB8; +constexpr unsigned int mmDCFE_MEM_PWR_STATUS__VI = 0x1BB9; +constexpr unsigned int mmDCFE_SOFT_RESET__VI = 0x1B01; +constexpr unsigned int mmDCIO_CLOCK_CNTL__VI = 0x482D; +constexpr unsigned int mmDCIO_DEBUG__VI = 0x482F; +constexpr unsigned int mmDCIO_DEBUG_CONFIG__VI = 0x4835; +constexpr unsigned int mmDCIO_DPHY_SEL__VI = 0x4837; +constexpr unsigned int mmDCIO_GSL0_CNTL__VI = 0x4826; +constexpr unsigned int mmDCIO_GSL1_CNTL__VI = 0x4827; +constexpr unsigned int mmDCIO_GSL2_CNTL__VI = 0x4828; +constexpr unsigned int mmDCIO_GSL_GENLK_PAD_CNTL__VI = 0x4824; +constexpr unsigned int mmDCIO_GSL_SWAPLOCK_PAD_CNTL__VI = 0x4825; +constexpr unsigned int mmDCIO_IMPCAL_CNTL__VI = 0x483D; +constexpr unsigned int mmDCIO_IMPCAL_CNTL_CD__VI = 0x4841; +constexpr unsigned int mmDCIO_IMPCAL_CNTL_EF__VI = 0x4845; +constexpr unsigned int mmDCIO_SOFT_RESET__VI = 0x4836; +constexpr unsigned int mmDCIO_TEST_DEBUG_DATA__VI = 0x4832; +constexpr unsigned int mmDCIO_TEST_DEBUG_INDEX__VI = 0x4831; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x48C0; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x48C1; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x48CA; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x48CB; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x48CC; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x48CD; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x48CE; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x48CF; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x48D0; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x48D1; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x48D2; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x48D3; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x48C2; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x48D4; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x48D5; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x48D6; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x48D7; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x48D8; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x48D9; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x48DA; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x48DB; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x48DC; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x48DD; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x48C3; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x48DE; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x48DF; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x48C4; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x48C5; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x48C6; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x48C7; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x48C8; +constexpr unsigned int mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x48C9; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x48E0; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x48E1; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x48EA; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x48EB; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x48EC; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x48ED; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x48EE; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x48EF; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x48F0; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x48F1; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x48F2; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x48F3; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x48E2; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x48F4; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x48F5; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x48F6; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x48F7; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x48F8; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x48F9; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x48FA; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x48FB; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x48FC; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x48FD; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x48E3; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x48FE; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x48FF; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x48E4; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x48E5; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x48E6; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x48E7; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x48E8; +constexpr unsigned int mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x48E9; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x4900; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x4901; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x490A; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x490B; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x490C; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x490D; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x490E; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x490F; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x4910; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x4911; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x4912; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x4913; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x4902; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x4914; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x4915; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x4916; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x4917; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x4918; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x4919; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x491A; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x491B; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x491C; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x491D; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x4903; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x491E; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x491F; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x4904; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x4905; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x4906; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x4907; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x4908; +constexpr unsigned int mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x4909; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x4920; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x4921; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x492A; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x492B; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x492C; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x492D; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x492E; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x492F; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x4930; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x4931; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x4932; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x4933; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x4922; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x4934; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x4935; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x4936; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x4937; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x4938; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x4939; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x493A; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x493B; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x493C; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x493D; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x4923; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x493E; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x493F; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x4924; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x4925; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x4926; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x4927; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x4928; +constexpr unsigned int mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x4929; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x4940; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x4941; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x494A; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x494B; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x494C; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x494D; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x494E; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x494F; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x4950; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x4951; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x4952; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x4953; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x4942; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x4954; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x4955; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x4956; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x4957; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x4958; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x4959; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x495A; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x495B; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x495C; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x495D; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x4943; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x495E; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x495F; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x4944; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x4945; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x4946; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x4947; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x4948; +constexpr unsigned int mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x4949; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x4960; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x4961; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x496A; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x496B; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x496C; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x496D; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x496E; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x496F; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x4970; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x4971; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x4972; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x4973; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x4962; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x4974; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x4975; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x4976; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x4977; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x4978; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x4979; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x497A; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x497B; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x497C; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x497D; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x4963; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x497E; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x497F; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x4964; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x4965; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x4966; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x4967; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x4968; +constexpr unsigned int mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x4969; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED0__VI = 0x4980; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED1__VI = 0x4981; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED10__VI = 0x498A; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED11__VI = 0x498B; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED12__VI = 0x498C; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED13__VI = 0x498D; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED14__VI = 0x498E; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED15__VI = 0x498F; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED16__VI = 0x4990; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED17__VI = 0x4991; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED18__VI = 0x4992; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED19__VI = 0x4993; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED2__VI = 0x4982; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED20__VI = 0x4994; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED21__VI = 0x4995; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED22__VI = 0x4996; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED23__VI = 0x4997; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED24__VI = 0x4998; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED25__VI = 0x4999; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED26__VI = 0x499A; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED27__VI = 0x499B; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED28__VI = 0x499C; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED29__VI = 0x499D; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED3__VI = 0x4983; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED30__VI = 0x499E; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED31__VI = 0x499F; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED4__VI = 0x4984; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED5__VI = 0x4985; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED6__VI = 0x4986; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED7__VI = 0x4987; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED8__VI = 0x4988; +constexpr unsigned int mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED9__VI = 0x4989; +constexpr unsigned int mmDCIO_WRCMD_DELAY__VI = 0x4816; +constexpr unsigned int mmDCI_CLK_CNTL__VI = 0x0319; +constexpr unsigned int mmDCI_CLK_RAMP_CNTL__VI = 0x031A; +constexpr unsigned int mmDCI_DEBUG_CONFIG__VI = 0x0320; +constexpr unsigned int mmDCI_MEM_PWR_CNTL__VI = 0x031B; +constexpr unsigned int mmDCI_MEM_PWR_CNTL2__VI = 0x031C; +constexpr unsigned int mmDCI_MEM_PWR_CNTL3__VI = 0x031D; +constexpr unsigned int mmDCI_MEM_PWR_STATUS__VI = 0x0317; +constexpr unsigned int mmDCI_MEM_PWR_STATUS2__VI = 0x0318; +constexpr unsigned int mmDCI_PG_DEBUG_CONFIG__VI = 0x1812; +constexpr unsigned int mmDCI_SOFT_RESET__VI = 0x0328; +constexpr unsigned int mmDCI_TEST_DEBUG_DATA__VI = 0x031F; +constexpr unsigned int mmDCI_TEST_DEBUG_INDEX__VI = 0x031E; +constexpr unsigned int mmDCO_CLK_CNTL__VI = 0x1864; +constexpr unsigned int mmDCO_CLK_RAMP_CNTL__VI = 0x1865; +constexpr unsigned int mmDCO_DCFE_EXT_VSYNC_CNTL__VI = 0x4830; +constexpr unsigned int mmDCO_MEM_PWR_CTRL__VI = 0x1862; +constexpr unsigned int mmDCO_MEM_PWR_CTRL2__VI = 0x1863; +constexpr unsigned int mmDCO_MEM_PWR_STATUS__VI = 0x1861; +constexpr unsigned int mmDCO_POWER_MANAGEMENT_CNTL__VI = 0x1868; +constexpr unsigned int mmDCO_SCRATCH0__VI = 0x184E; +constexpr unsigned int mmDCO_SCRATCH1__VI = 0x184F; +constexpr unsigned int mmDCO_SCRATCH2__VI = 0x1850; +constexpr unsigned int mmDCO_SCRATCH3__VI = 0x1851; +constexpr unsigned int mmDCO_SCRATCH4__VI = 0x1852; +constexpr unsigned int mmDCO_SCRATCH5__VI = 0x1853; +constexpr unsigned int mmDCO_SCRATCH6__VI = 0x1854; +constexpr unsigned int mmDCO_SCRATCH7__VI = 0x1855; +constexpr unsigned int mmDCO_SOFT_RESET__VI = 0x1871; +constexpr unsigned int mmDCO_STEREOSYNC_SEL__VI = 0x186E; +constexpr unsigned int mmDCO_TEST_DEBUG_DATA__VI = 0x1870; +constexpr unsigned int mmDCO_TEST_DEBUG_INDEX__VI = 0x186F; +constexpr unsigned int mmDCP0_ALPHA_CONTROL__VI = 0x1ABC; +constexpr unsigned int mmDCP0_COMM_MATRIXA_TRANS_C11_C12__VI = 0x1A43; +constexpr unsigned int mmDCP0_COMM_MATRIXA_TRANS_C13_C14__VI = 0x1A44; +constexpr unsigned int mmDCP0_COMM_MATRIXA_TRANS_C21_C22__VI = 0x1A45; +constexpr unsigned int mmDCP0_COMM_MATRIXA_TRANS_C23_C24__VI = 0x1A46; +constexpr unsigned int mmDCP0_COMM_MATRIXA_TRANS_C31_C32__VI = 0x1A47; +constexpr unsigned int mmDCP0_COMM_MATRIXA_TRANS_C33_C34__VI = 0x1A48; +constexpr unsigned int mmDCP0_COMM_MATRIXB_TRANS_C11_C12__VI = 0x1A49; +constexpr unsigned int mmDCP0_COMM_MATRIXB_TRANS_C13_C14__VI = 0x1A4A; +constexpr unsigned int mmDCP0_COMM_MATRIXB_TRANS_C21_C22__VI = 0x1A4B; +constexpr unsigned int mmDCP0_COMM_MATRIXB_TRANS_C23_C24__VI = 0x1A4C; +constexpr unsigned int mmDCP0_COMM_MATRIXB_TRANS_C31_C32__VI = 0x1A4D; +constexpr unsigned int mmDCP0_COMM_MATRIXB_TRANS_C33_C34__VI = 0x1A4E; +constexpr unsigned int mmDCP0_CUR2_COLOR1__VI = 0x1A75; +constexpr unsigned int mmDCP0_CUR2_COLOR2__VI = 0x1A76; +constexpr unsigned int mmDCP0_CUR2_CONTROL__VI = 0x1A6F; +constexpr unsigned int mmDCP0_CUR2_HOT_SPOT__VI = 0x1A74; +constexpr unsigned int mmDCP0_CUR2_POSITION__VI = 0x1A73; +constexpr unsigned int mmDCP0_CUR2_SIZE__VI = 0x1A71; +constexpr unsigned int mmDCP0_CUR2_STEREO_CONTROL__VI = 0x1A9B; +constexpr unsigned int mmDCP0_CUR2_SURFACE_ADDRESS__VI = 0x1A70; +constexpr unsigned int mmDCP0_CUR2_SURFACE_ADDRESS_HIGH__VI = 0x1A72; +constexpr unsigned int mmDCP0_CUR2_UPDATE__VI = 0x1A77; +constexpr unsigned int mmDCP0_CUR_REQUEST_FILTER_CNTL__VI = 0x1A99; +constexpr unsigned int mmDCP0_CUR_STEREO_CONTROL__VI = 0x1A9A; +constexpr unsigned int mmDCP0_DCP_DEBUG2__VI = 0x1A98; +constexpr unsigned int mmDCP0_DCP_FP_CONVERTED_FIELD__VI = 0x1A65; +constexpr unsigned int mmDCP0_DCP_GSL_CONTROL__VI = 0x1A90; +constexpr unsigned int mmDCP0_DCP_RANDOM_SEEDS__VI = 0x1A61; +constexpr unsigned int mmDCP0_DCP_SPATIAL_DITHER_CNTL__VI = 0x1A60; +constexpr unsigned int mmDCP0_DC_LUT_VGA_ACCESS_ENABLE__VI = 0x1A7D; +constexpr unsigned int mmDCP0_DEGAMMA_CONTROL__VI = 0x1A58; +constexpr unsigned int mmDCP0_DENORM_CONTROL__VI = 0x1A50; +constexpr unsigned int mmDCP0_GAMUT_REMAP_C11_C12__VI = 0x1A5A; +constexpr unsigned int mmDCP0_GAMUT_REMAP_C13_C14__VI = 0x1A5B; +constexpr unsigned int mmDCP0_GAMUT_REMAP_C21_C22__VI = 0x1A5C; +constexpr unsigned int mmDCP0_GAMUT_REMAP_C23_C24__VI = 0x1A5D; +constexpr unsigned int mmDCP0_GAMUT_REMAP_C31_C32__VI = 0x1A5E; +constexpr unsigned int mmDCP0_GAMUT_REMAP_C33_C34__VI = 0x1A5F; +constexpr unsigned int mmDCP0_GAMUT_REMAP_CONTROL__VI = 0x1A59; +constexpr unsigned int mmDCP0_GRPH_FLIP_RATE_CNTL__VI = 0x1A8E; +constexpr unsigned int mmDCP0_GRPH_STEREOSYNC_FLIP__VI = 0x1A97; +constexpr unsigned int mmDCP0_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x1A9F; +constexpr unsigned int mmDCP0_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x1ABF; +constexpr unsigned int mmDCP0_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x1ABD; +constexpr unsigned int mmDCP0_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x1ABE; +constexpr unsigned int mmDCP0_HW_ROTATION__VI = 0x1A9E; +constexpr unsigned int mmDCP0_INPUT_CSC_C11_C12__VI = 0x1A36; +constexpr unsigned int mmDCP0_INPUT_CSC_C13_C14__VI = 0x1A37; +constexpr unsigned int mmDCP0_INPUT_CSC_C21_C22__VI = 0x1A38; +constexpr unsigned int mmDCP0_INPUT_CSC_C23_C24__VI = 0x1A39; +constexpr unsigned int mmDCP0_INPUT_CSC_C31_C32__VI = 0x1A3A; +constexpr unsigned int mmDCP0_INPUT_CSC_C33_C34__VI = 0x1A3B; +constexpr unsigned int mmDCP0_INPUT_CSC_CONTROL__VI = 0x1A35; +constexpr unsigned int mmDCP0_INPUT_GAMMA_CONTROL__VI = 0x1A10; +constexpr unsigned int mmDCP0_KEY_CONTROL__VI = 0x1A53; +constexpr unsigned int mmDCP0_KEY_RANGE_ALPHA__VI = 0x1A54; +constexpr unsigned int mmDCP0_KEY_RANGE_BLUE__VI = 0x1A57; +constexpr unsigned int mmDCP0_KEY_RANGE_GREEN__VI = 0x1A56; +constexpr unsigned int mmDCP0_KEY_RANGE_RED__VI = 0x1A55; +constexpr unsigned int mmDCP0_OUTPUT_CSC_C11_C12__VI = 0x1A3D; +constexpr unsigned int mmDCP0_OUTPUT_CSC_C13_C14__VI = 0x1A3E; +constexpr unsigned int mmDCP0_OUTPUT_CSC_C21_C22__VI = 0x1A3F; +constexpr unsigned int mmDCP0_OUTPUT_CSC_C23_C24__VI = 0x1A40; +constexpr unsigned int mmDCP0_OUTPUT_CSC_C31_C32__VI = 0x1A41; +constexpr unsigned int mmDCP0_OUTPUT_CSC_C33_C34__VI = 0x1A42; +constexpr unsigned int mmDCP0_OUTPUT_CSC_CONTROL__VI = 0x1A3C; +constexpr unsigned int mmDCP0_OUT_CLAMP_CONTROL_B_CB__VI = 0x1A9D; +constexpr unsigned int mmDCP0_OUT_CLAMP_CONTROL_G_Y__VI = 0x1A9C; +constexpr unsigned int mmDCP0_OUT_CLAMP_CONTROL_R_CR__VI = 0x1A52; +constexpr unsigned int mmDCP0_OUT_ROUND_CONTROL__VI = 0x1A51; +constexpr unsigned int mmDCP0_OVL_SECONDARY_SURFACE_ADDRESS__VI = 0x1A92; +constexpr unsigned int mmDCP0_OVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x1A94; +constexpr unsigned int mmDCP0_OVL_STEREOSYNC_FLIP__VI = 0x1A93; +constexpr unsigned int mmDCP0_PRESCALE_GRPH_CONTROL__VI = 0x1A2D; +constexpr unsigned int mmDCP0_PRESCALE_OVL_CONTROL__VI = 0x1A31; +constexpr unsigned int mmDCP0_PRESCALE_VALUES_GRPH_B__VI = 0x1A30; +constexpr unsigned int mmDCP0_PRESCALE_VALUES_GRPH_G__VI = 0x1A2F; +constexpr unsigned int mmDCP0_PRESCALE_VALUES_GRPH_R__VI = 0x1A2E; +constexpr unsigned int mmDCP0_PRESCALE_VALUES_OVL_CB__VI = 0x1A32; +constexpr unsigned int mmDCP0_PRESCALE_VALUES_OVL_CR__VI = 0x1A34; +constexpr unsigned int mmDCP0_PRESCALE_VALUES_OVL_Y__VI = 0x1A33; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_END_CNTL1__VI = 0x1AA6; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_END_CNTL2__VI = 0x1AA7; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_0_1__VI = 0x1AA8; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_10_11__VI = 0x1AAD; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_12_13__VI = 0x1AAE; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_14_15__VI = 0x1AAF; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_2_3__VI = 0x1AA9; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_4_5__VI = 0x1AAA; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_6_7__VI = 0x1AAB; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_REGION_8_9__VI = 0x1AAC; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_SLOPE_CNTL__VI = 0x1AA5; +constexpr unsigned int mmDCP0_REGAMMA_CNTLA_START_CNTL__VI = 0x1AA4; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_END_CNTL1__VI = 0x1AB2; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_END_CNTL2__VI = 0x1AB3; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_0_1__VI = 0x1AB4; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_10_11__VI = 0x1AB9; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_12_13__VI = 0x1ABA; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_14_15__VI = 0x1ABB; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_2_3__VI = 0x1AB5; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_4_5__VI = 0x1AB6; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_6_7__VI = 0x1AB7; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_REGION_8_9__VI = 0x1AB8; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_SLOPE_CNTL__VI = 0x1AB1; +constexpr unsigned int mmDCP0_REGAMMA_CNTLB_START_CNTL__VI = 0x1AB0; +constexpr unsigned int mmDCP0_REGAMMA_CONTROL__VI = 0x1AA0; +constexpr unsigned int mmDCP0_REGAMMA_LUT_DATA__VI = 0x1AA2; +constexpr unsigned int mmDCP0_REGAMMA_LUT_INDEX__VI = 0x1AA1; +constexpr unsigned int mmDCP0_REGAMMA_LUT_WRITE_EN_MASK__VI = 0x1AA3; +constexpr unsigned int mmDCP1_ALPHA_CONTROL__VI = 0x1CBC; +constexpr unsigned int mmDCP1_COMM_MATRIXA_TRANS_C11_C12__VI = 0x1C43; +constexpr unsigned int mmDCP1_COMM_MATRIXA_TRANS_C13_C14__VI = 0x1C44; +constexpr unsigned int mmDCP1_COMM_MATRIXA_TRANS_C21_C22__VI = 0x1C45; +constexpr unsigned int mmDCP1_COMM_MATRIXA_TRANS_C23_C24__VI = 0x1C46; +constexpr unsigned int mmDCP1_COMM_MATRIXA_TRANS_C31_C32__VI = 0x1C47; +constexpr unsigned int mmDCP1_COMM_MATRIXA_TRANS_C33_C34__VI = 0x1C48; +constexpr unsigned int mmDCP1_COMM_MATRIXB_TRANS_C11_C12__VI = 0x1C49; +constexpr unsigned int mmDCP1_COMM_MATRIXB_TRANS_C13_C14__VI = 0x1C4A; +constexpr unsigned int mmDCP1_COMM_MATRIXB_TRANS_C21_C22__VI = 0x1C4B; +constexpr unsigned int mmDCP1_COMM_MATRIXB_TRANS_C23_C24__VI = 0x1C4C; +constexpr unsigned int mmDCP1_COMM_MATRIXB_TRANS_C31_C32__VI = 0x1C4D; +constexpr unsigned int mmDCP1_COMM_MATRIXB_TRANS_C33_C34__VI = 0x1C4E; +constexpr unsigned int mmDCP1_CUR2_COLOR1__VI = 0x1C75; +constexpr unsigned int mmDCP1_CUR2_COLOR2__VI = 0x1C76; +constexpr unsigned int mmDCP1_CUR2_CONTROL__VI = 0x1C6F; +constexpr unsigned int mmDCP1_CUR2_HOT_SPOT__VI = 0x1C74; +constexpr unsigned int mmDCP1_CUR2_POSITION__VI = 0x1C73; +constexpr unsigned int mmDCP1_CUR2_SIZE__VI = 0x1C71; +constexpr unsigned int mmDCP1_CUR2_STEREO_CONTROL__VI = 0x1C9B; +constexpr unsigned int mmDCP1_CUR2_SURFACE_ADDRESS__VI = 0x1C70; +constexpr unsigned int mmDCP1_CUR2_SURFACE_ADDRESS_HIGH__VI = 0x1C72; +constexpr unsigned int mmDCP1_CUR2_UPDATE__VI = 0x1C77; +constexpr unsigned int mmDCP1_CUR_COLOR1__VI = 0x1C6C; +constexpr unsigned int mmDCP1_CUR_COLOR2__VI = 0x1C6D; +constexpr unsigned int mmDCP1_CUR_CONTROL__VI = 0x1C66; +constexpr unsigned int mmDCP1_CUR_HOT_SPOT__VI = 0x1C6B; +constexpr unsigned int mmDCP1_CUR_POSITION__VI = 0x1C6A; +constexpr unsigned int mmDCP1_CUR_REQUEST_FILTER_CNTL__VI = 0x1C99; +constexpr unsigned int mmDCP1_CUR_SIZE__VI = 0x1C68; +constexpr unsigned int mmDCP1_CUR_STEREO_CONTROL__VI = 0x1C9A; +constexpr unsigned int mmDCP1_CUR_SURFACE_ADDRESS__VI = 0x1C67; +constexpr unsigned int mmDCP1_CUR_SURFACE_ADDRESS_HIGH__VI = 0x1C69; +constexpr unsigned int mmDCP1_CUR_UPDATE__VI = 0x1C6E; +constexpr unsigned int mmDCP1_DCP_CRC_CONTROL__VI = 0x1C87; +constexpr unsigned int mmDCP1_DCP_CRC_CURRENT__VI = 0x1C89; +constexpr unsigned int mmDCP1_DCP_CRC_LAST__VI = 0x1C8B; +constexpr unsigned int mmDCP1_DCP_CRC_MASK__VI = 0x1C88; +constexpr unsigned int mmDCP1_DCP_DEBUG__VI = 0x1C8D; +constexpr unsigned int mmDCP1_DCP_DEBUG2__VI = 0x1C98; +constexpr unsigned int mmDCP1_DCP_FP_CONVERTED_FIELD__VI = 0x1C65; +constexpr unsigned int mmDCP1_DCP_GSL_CONTROL__VI = 0x1C90; +constexpr unsigned int mmDCP1_DCP_LB_DATA_GAP_BETWEEN_CHUNK__VI = 0x1C91; +constexpr unsigned int mmDCP1_DCP_RANDOM_SEEDS__VI = 0x1C61; +constexpr unsigned int mmDCP1_DCP_SPATIAL_DITHER_CNTL__VI = 0x1C60; +constexpr unsigned int mmDCP1_DCP_TEST_DEBUG_DATA__VI = 0x1C96; +constexpr unsigned int mmDCP1_DCP_TEST_DEBUG_INDEX__VI = 0x1C95; +constexpr unsigned int mmDCP1_DC_LUT_30_COLOR__VI = 0x1C7C; +constexpr unsigned int mmDCP1_DC_LUT_AUTOFILL__VI = 0x1C7F; +constexpr unsigned int mmDCP1_DC_LUT_BLACK_OFFSET_BLUE__VI = 0x1C81; +constexpr unsigned int mmDCP1_DC_LUT_BLACK_OFFSET_GREEN__VI = 0x1C82; +constexpr unsigned int mmDCP1_DC_LUT_BLACK_OFFSET_RED__VI = 0x1C83; +constexpr unsigned int mmDCP1_DC_LUT_CONTROL__VI = 0x1C80; +constexpr unsigned int mmDCP1_DC_LUT_PWL_DATA__VI = 0x1C7B; +constexpr unsigned int mmDCP1_DC_LUT_RW_INDEX__VI = 0x1C79; +constexpr unsigned int mmDCP1_DC_LUT_RW_MODE__VI = 0x1C78; +constexpr unsigned int mmDCP1_DC_LUT_SEQ_COLOR__VI = 0x1C7A; +constexpr unsigned int mmDCP1_DC_LUT_VGA_ACCESS_ENABLE__VI = 0x1C7D; +constexpr unsigned int mmDCP1_DC_LUT_WHITE_OFFSET_BLUE__VI = 0x1C84; +constexpr unsigned int mmDCP1_DC_LUT_WHITE_OFFSET_GREEN__VI = 0x1C85; +constexpr unsigned int mmDCP1_DC_LUT_WHITE_OFFSET_RED__VI = 0x1C86; +constexpr unsigned int mmDCP1_DC_LUT_WRITE_EN_MASK__VI = 0x1C7E; +constexpr unsigned int mmDCP1_DEGAMMA_CONTROL__VI = 0x1C58; +constexpr unsigned int mmDCP1_DENORM_CONTROL__VI = 0x1C50; +constexpr unsigned int mmDCP1_GAMUT_REMAP_C11_C12__VI = 0x1C5A; +constexpr unsigned int mmDCP1_GAMUT_REMAP_C13_C14__VI = 0x1C5B; +constexpr unsigned int mmDCP1_GAMUT_REMAP_C21_C22__VI = 0x1C5C; +constexpr unsigned int mmDCP1_GAMUT_REMAP_C23_C24__VI = 0x1C5D; +constexpr unsigned int mmDCP1_GAMUT_REMAP_C31_C32__VI = 0x1C5E; +constexpr unsigned int mmDCP1_GAMUT_REMAP_C33_C34__VI = 0x1C5F; +constexpr unsigned int mmDCP1_GAMUT_REMAP_CONTROL__VI = 0x1C59; +constexpr unsigned int mmDCP1_GRPH_COMPRESS_PITCH__VI = 0x1C1A; +constexpr unsigned int mmDCP1_GRPH_COMPRESS_SURFACE_ADDRESS__VI = 0x1C19; +constexpr unsigned int mmDCP1_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__VI = 0x1C1B; +constexpr unsigned int mmDCP1_GRPH_CONTROL__SI__CI = 0x1D01; +constexpr unsigned int mmDCP1_GRPH_CONTROL__VI = 0x1C01; +constexpr unsigned int mmDCP1_GRPH_DFQ_CONTROL__VI = 0x1C14; +constexpr unsigned int mmDCP1_GRPH_DFQ_STATUS__VI = 0x1C15; +constexpr unsigned int mmDCP1_GRPH_ENABLE__VI = 0x1C00; +constexpr unsigned int mmDCP1_GRPH_FLIP_CONTROL__SI__CI = 0x1D12; +constexpr unsigned int mmDCP1_GRPH_FLIP_CONTROL__VI = 0x1C12; +constexpr unsigned int mmDCP1_GRPH_FLIP_RATE_CNTL__VI = 0x1C8E; +constexpr unsigned int mmDCP1_GRPH_INTERRUPT_CONTROL__VI = 0x1C17; +constexpr unsigned int mmDCP1_GRPH_INTERRUPT_STATUS__VI = 0x1C16; +constexpr unsigned int mmDCP1_GRPH_LUT_10BIT_BYPASS__VI = 0x1C02; +constexpr unsigned int mmDCP1_GRPH_PITCH__SI__CI = 0x1D06; +constexpr unsigned int mmDCP1_GRPH_PITCH__VI = 0x1C06; +constexpr unsigned int mmDCP1_GRPH_PRIMARY_SURFACE_ADDRESS__SI__CI = 0x1D04; +constexpr unsigned int mmDCP1_GRPH_PRIMARY_SURFACE_ADDRESS__VI = 0x1C04; +constexpr unsigned int mmDCP1_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__VI = 0x1C07; +constexpr unsigned int mmDCP1_GRPH_SECONDARY_SURFACE_ADDRESS__VI = 0x1C05; +constexpr unsigned int mmDCP1_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x1C08; +constexpr unsigned int mmDCP1_GRPH_STEREOSYNC_FLIP__VI = 0x1C97; +constexpr unsigned int mmDCP1_GRPH_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x1C18; +constexpr unsigned int mmDCP1_GRPH_SURFACE_ADDRESS_INUSE__VI = 0x1C13; +constexpr unsigned int mmDCP1_GRPH_SURFACE_OFFSET_X__VI = 0x1C09; +constexpr unsigned int mmDCP1_GRPH_SURFACE_OFFSET_Y__VI = 0x1C0A; +constexpr unsigned int mmDCP1_GRPH_SWAP_CNTL__VI = 0x1C03; +constexpr unsigned int mmDCP1_GRPH_UPDATE__SI__CI = 0x1D11; +constexpr unsigned int mmDCP1_GRPH_UPDATE__VI = 0x1C11; +constexpr unsigned int mmDCP1_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x1C9F; +constexpr unsigned int mmDCP1_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x1CBF; +constexpr unsigned int mmDCP1_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x1CBD; +constexpr unsigned int mmDCP1_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x1CBE; +constexpr unsigned int mmDCP1_GRPH_X_END__VI = 0x1C0D; +constexpr unsigned int mmDCP1_GRPH_X_START__VI = 0x1C0B; +constexpr unsigned int mmDCP1_GRPH_Y_END__VI = 0x1C0E; +constexpr unsigned int mmDCP1_GRPH_Y_START__VI = 0x1C0C; +constexpr unsigned int mmDCP1_HW_ROTATION__VI = 0x1C9E; +constexpr unsigned int mmDCP1_INPUT_CSC_C11_C12__VI = 0x1C36; +constexpr unsigned int mmDCP1_INPUT_CSC_C13_C14__VI = 0x1C37; +constexpr unsigned int mmDCP1_INPUT_CSC_C21_C22__VI = 0x1C38; +constexpr unsigned int mmDCP1_INPUT_CSC_C23_C24__VI = 0x1C39; +constexpr unsigned int mmDCP1_INPUT_CSC_C31_C32__VI = 0x1C3A; +constexpr unsigned int mmDCP1_INPUT_CSC_C33_C34__VI = 0x1C3B; +constexpr unsigned int mmDCP1_INPUT_CSC_CONTROL__VI = 0x1C35; +constexpr unsigned int mmDCP1_INPUT_GAMMA_CONTROL__VI = 0x1C10; +constexpr unsigned int mmDCP1_KEY_CONTROL__VI = 0x1C53; +constexpr unsigned int mmDCP1_KEY_RANGE_ALPHA__VI = 0x1C54; +constexpr unsigned int mmDCP1_KEY_RANGE_BLUE__VI = 0x1C57; +constexpr unsigned int mmDCP1_KEY_RANGE_GREEN__VI = 0x1C56; +constexpr unsigned int mmDCP1_KEY_RANGE_RED__VI = 0x1C55; +constexpr unsigned int mmDCP1_OUTPUT_CSC_C11_C12__VI = 0x1C3D; +constexpr unsigned int mmDCP1_OUTPUT_CSC_C13_C14__VI = 0x1C3E; +constexpr unsigned int mmDCP1_OUTPUT_CSC_C21_C22__VI = 0x1C3F; +constexpr unsigned int mmDCP1_OUTPUT_CSC_C23_C24__VI = 0x1C40; +constexpr unsigned int mmDCP1_OUTPUT_CSC_C31_C32__VI = 0x1C41; +constexpr unsigned int mmDCP1_OUTPUT_CSC_C33_C34__VI = 0x1C42; +constexpr unsigned int mmDCP1_OUTPUT_CSC_CONTROL__VI = 0x1C3C; +constexpr unsigned int mmDCP1_OUT_CLAMP_CONTROL_B_CB__VI = 0x1C9D; +constexpr unsigned int mmDCP1_OUT_CLAMP_CONTROL_G_Y__VI = 0x1C9C; +constexpr unsigned int mmDCP1_OUT_CLAMP_CONTROL_R_CR__VI = 0x1C52; +constexpr unsigned int mmDCP1_OUT_ROUND_CONTROL__VI = 0x1C51; +constexpr unsigned int mmDCP1_OVLSCL_EDGE_PIXEL_CNTL__VI = 0x1C2C; +constexpr unsigned int mmDCP1_OVL_CONTROL1__VI = 0x1C1D; +constexpr unsigned int mmDCP1_OVL_CONTROL2__VI = 0x1C1E; +constexpr unsigned int mmDCP1_OVL_DFQ_CONTROL__VI = 0x1C29; +constexpr unsigned int mmDCP1_OVL_DFQ_STATUS__VI = 0x1C2A; +constexpr unsigned int mmDCP1_OVL_ENABLE__VI = 0x1C1C; +constexpr unsigned int mmDCP1_OVL_END__VI = 0x1C26; +constexpr unsigned int mmDCP1_OVL_PITCH__VI = 0x1C21; +constexpr unsigned int mmDCP1_OVL_SECONDARY_SURFACE_ADDRESS__VI = 0x1C92; +constexpr unsigned int mmDCP1_OVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x1C94; +constexpr unsigned int mmDCP1_OVL_START__VI = 0x1C25; +constexpr unsigned int mmDCP1_OVL_STEREOSYNC_FLIP__VI = 0x1C93; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS__SI__CI = 0x1D20; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS__VI = 0x1C20; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS_HIGH__VI = 0x1C22; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x1C2B; +constexpr unsigned int mmDCP1_OVL_SURFACE_ADDRESS_INUSE__VI = 0x1C28; +constexpr unsigned int mmDCP1_OVL_SURFACE_OFFSET_X__VI = 0x1C23; +constexpr unsigned int mmDCP1_OVL_SURFACE_OFFSET_Y__VI = 0x1C24; +constexpr unsigned int mmDCP1_OVL_SWAP_CNTL__VI = 0x1C1F; +constexpr unsigned int mmDCP1_OVL_UPDATE__VI = 0x1C27; +constexpr unsigned int mmDCP1_PRESCALE_GRPH_CONTROL__VI = 0x1C2D; +constexpr unsigned int mmDCP1_PRESCALE_OVL_CONTROL__VI = 0x1C31; +constexpr unsigned int mmDCP1_PRESCALE_VALUES_GRPH_B__VI = 0x1C30; +constexpr unsigned int mmDCP1_PRESCALE_VALUES_GRPH_G__VI = 0x1C2F; +constexpr unsigned int mmDCP1_PRESCALE_VALUES_GRPH_R__VI = 0x1C2E; +constexpr unsigned int mmDCP1_PRESCALE_VALUES_OVL_CB__VI = 0x1C32; +constexpr unsigned int mmDCP1_PRESCALE_VALUES_OVL_CR__VI = 0x1C34; +constexpr unsigned int mmDCP1_PRESCALE_VALUES_OVL_Y__VI = 0x1C33; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_END_CNTL1__VI = 0x1CA6; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_END_CNTL2__VI = 0x1CA7; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_0_1__VI = 0x1CA8; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_10_11__VI = 0x1CAD; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_12_13__VI = 0x1CAE; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_14_15__VI = 0x1CAF; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_2_3__VI = 0x1CA9; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_4_5__VI = 0x1CAA; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_6_7__VI = 0x1CAB; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_REGION_8_9__VI = 0x1CAC; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_SLOPE_CNTL__VI = 0x1CA5; +constexpr unsigned int mmDCP1_REGAMMA_CNTLA_START_CNTL__VI = 0x1CA4; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_END_CNTL1__VI = 0x1CB2; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_END_CNTL2__VI = 0x1CB3; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_0_1__VI = 0x1CB4; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_10_11__VI = 0x1CB9; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_12_13__VI = 0x1CBA; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_14_15__VI = 0x1CBB; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_2_3__VI = 0x1CB5; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_4_5__VI = 0x1CB6; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_6_7__VI = 0x1CB7; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_REGION_8_9__VI = 0x1CB8; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_SLOPE_CNTL__VI = 0x1CB1; +constexpr unsigned int mmDCP1_REGAMMA_CNTLB_START_CNTL__VI = 0x1CB0; +constexpr unsigned int mmDCP1_REGAMMA_CONTROL__VI = 0x1CA0; +constexpr unsigned int mmDCP1_REGAMMA_LUT_DATA__VI = 0x1CA2; +constexpr unsigned int mmDCP1_REGAMMA_LUT_INDEX__VI = 0x1CA1; +constexpr unsigned int mmDCP1_REGAMMA_LUT_WRITE_EN_MASK__VI = 0x1CA3; +constexpr unsigned int mmDCP2_ALPHA_CONTROL__VI = 0x1EBC; +constexpr unsigned int mmDCP2_COMM_MATRIXA_TRANS_C11_C12__VI = 0x1E43; +constexpr unsigned int mmDCP2_COMM_MATRIXA_TRANS_C13_C14__VI = 0x1E44; +constexpr unsigned int mmDCP2_COMM_MATRIXA_TRANS_C21_C22__VI = 0x1E45; +constexpr unsigned int mmDCP2_COMM_MATRIXA_TRANS_C23_C24__VI = 0x1E46; +constexpr unsigned int mmDCP2_COMM_MATRIXA_TRANS_C31_C32__VI = 0x1E47; +constexpr unsigned int mmDCP2_COMM_MATRIXA_TRANS_C33_C34__VI = 0x1E48; +constexpr unsigned int mmDCP2_COMM_MATRIXB_TRANS_C11_C12__VI = 0x1E49; +constexpr unsigned int mmDCP2_COMM_MATRIXB_TRANS_C13_C14__VI = 0x1E4A; +constexpr unsigned int mmDCP2_COMM_MATRIXB_TRANS_C21_C22__VI = 0x1E4B; +constexpr unsigned int mmDCP2_COMM_MATRIXB_TRANS_C23_C24__VI = 0x1E4C; +constexpr unsigned int mmDCP2_COMM_MATRIXB_TRANS_C31_C32__VI = 0x1E4D; +constexpr unsigned int mmDCP2_COMM_MATRIXB_TRANS_C33_C34__VI = 0x1E4E; +constexpr unsigned int mmDCP2_CUR2_COLOR1__VI = 0x1E75; +constexpr unsigned int mmDCP2_CUR2_COLOR2__VI = 0x1E76; +constexpr unsigned int mmDCP2_CUR2_CONTROL__VI = 0x1E6F; +constexpr unsigned int mmDCP2_CUR2_HOT_SPOT__VI = 0x1E74; +constexpr unsigned int mmDCP2_CUR2_POSITION__VI = 0x1E73; +constexpr unsigned int mmDCP2_CUR2_SIZE__VI = 0x1E71; +constexpr unsigned int mmDCP2_CUR2_STEREO_CONTROL__VI = 0x1E9B; +constexpr unsigned int mmDCP2_CUR2_SURFACE_ADDRESS__VI = 0x1E70; +constexpr unsigned int mmDCP2_CUR2_SURFACE_ADDRESS_HIGH__VI = 0x1E72; +constexpr unsigned int mmDCP2_CUR2_UPDATE__VI = 0x1E77; +constexpr unsigned int mmDCP2_CUR_COLOR1__VI = 0x1E6C; +constexpr unsigned int mmDCP2_CUR_COLOR2__VI = 0x1E6D; +constexpr unsigned int mmDCP2_CUR_CONTROL__VI = 0x1E66; +constexpr unsigned int mmDCP2_CUR_HOT_SPOT__VI = 0x1E6B; +constexpr unsigned int mmDCP2_CUR_POSITION__VI = 0x1E6A; +constexpr unsigned int mmDCP2_CUR_REQUEST_FILTER_CNTL__VI = 0x1E99; +constexpr unsigned int mmDCP2_CUR_SIZE__VI = 0x1E68; +constexpr unsigned int mmDCP2_CUR_STEREO_CONTROL__VI = 0x1E9A; +constexpr unsigned int mmDCP2_CUR_SURFACE_ADDRESS__VI = 0x1E67; +constexpr unsigned int mmDCP2_CUR_SURFACE_ADDRESS_HIGH__VI = 0x1E69; +constexpr unsigned int mmDCP2_CUR_UPDATE__VI = 0x1E6E; +constexpr unsigned int mmDCP2_DCP_CRC_CONTROL__VI = 0x1E87; +constexpr unsigned int mmDCP2_DCP_CRC_CURRENT__VI = 0x1E89; +constexpr unsigned int mmDCP2_DCP_CRC_LAST__VI = 0x1E8B; +constexpr unsigned int mmDCP2_DCP_CRC_MASK__VI = 0x1E88; +constexpr unsigned int mmDCP2_DCP_DEBUG__VI = 0x1E8D; +constexpr unsigned int mmDCP2_DCP_DEBUG2__VI = 0x1E98; +constexpr unsigned int mmDCP2_DCP_FP_CONVERTED_FIELD__VI = 0x1E65; +constexpr unsigned int mmDCP2_DCP_GSL_CONTROL__VI = 0x1E90; +constexpr unsigned int mmDCP2_DCP_LB_DATA_GAP_BETWEEN_CHUNK__VI = 0x1E91; +constexpr unsigned int mmDCP2_DCP_RANDOM_SEEDS__VI = 0x1E61; +constexpr unsigned int mmDCP2_DCP_SPATIAL_DITHER_CNTL__VI = 0x1E60; +constexpr unsigned int mmDCP2_DCP_TEST_DEBUG_DATA__VI = 0x1E96; +constexpr unsigned int mmDCP2_DCP_TEST_DEBUG_INDEX__VI = 0x1E95; +constexpr unsigned int mmDCP2_DC_LUT_30_COLOR__VI = 0x1E7C; +constexpr unsigned int mmDCP2_DC_LUT_AUTOFILL__VI = 0x1E7F; +constexpr unsigned int mmDCP2_DC_LUT_BLACK_OFFSET_BLUE__VI = 0x1E81; +constexpr unsigned int mmDCP2_DC_LUT_BLACK_OFFSET_GREEN__VI = 0x1E82; +constexpr unsigned int mmDCP2_DC_LUT_BLACK_OFFSET_RED__VI = 0x1E83; +constexpr unsigned int mmDCP2_DC_LUT_CONTROL__VI = 0x1E80; +constexpr unsigned int mmDCP2_DC_LUT_PWL_DATA__VI = 0x1E7B; +constexpr unsigned int mmDCP2_DC_LUT_RW_INDEX__VI = 0x1E79; +constexpr unsigned int mmDCP2_DC_LUT_RW_MODE__VI = 0x1E78; +constexpr unsigned int mmDCP2_DC_LUT_SEQ_COLOR__VI = 0x1E7A; +constexpr unsigned int mmDCP2_DC_LUT_VGA_ACCESS_ENABLE__VI = 0x1E7D; +constexpr unsigned int mmDCP2_DC_LUT_WHITE_OFFSET_BLUE__VI = 0x1E84; +constexpr unsigned int mmDCP2_DC_LUT_WHITE_OFFSET_GREEN__VI = 0x1E85; +constexpr unsigned int mmDCP2_DC_LUT_WHITE_OFFSET_RED__VI = 0x1E86; +constexpr unsigned int mmDCP2_DC_LUT_WRITE_EN_MASK__VI = 0x1E7E; +constexpr unsigned int mmDCP2_DEGAMMA_CONTROL__VI = 0x1E58; +constexpr unsigned int mmDCP2_DENORM_CONTROL__VI = 0x1E50; +constexpr unsigned int mmDCP2_GAMUT_REMAP_C11_C12__VI = 0x1E5A; +constexpr unsigned int mmDCP2_GAMUT_REMAP_C13_C14__VI = 0x1E5B; +constexpr unsigned int mmDCP2_GAMUT_REMAP_C21_C22__VI = 0x1E5C; +constexpr unsigned int mmDCP2_GAMUT_REMAP_C23_C24__VI = 0x1E5D; +constexpr unsigned int mmDCP2_GAMUT_REMAP_C31_C32__VI = 0x1E5E; +constexpr unsigned int mmDCP2_GAMUT_REMAP_C33_C34__VI = 0x1E5F; +constexpr unsigned int mmDCP2_GAMUT_REMAP_CONTROL__VI = 0x1E59; +constexpr unsigned int mmDCP2_GRPH_COMPRESS_PITCH__VI = 0x1E1A; +constexpr unsigned int mmDCP2_GRPH_COMPRESS_SURFACE_ADDRESS__VI = 0x1E19; +constexpr unsigned int mmDCP2_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__VI = 0x1E1B; +constexpr unsigned int mmDCP2_GRPH_CONTROL__SI__CI = 0x4001; +constexpr unsigned int mmDCP2_GRPH_CONTROL__VI = 0x1E01; +constexpr unsigned int mmDCP2_GRPH_DFQ_CONTROL__VI = 0x1E14; +constexpr unsigned int mmDCP2_GRPH_DFQ_STATUS__VI = 0x1E15; +constexpr unsigned int mmDCP2_GRPH_ENABLE__VI = 0x1E00; +constexpr unsigned int mmDCP2_GRPH_FLIP_CONTROL__SI__CI = 0x4012; +constexpr unsigned int mmDCP2_GRPH_FLIP_CONTROL__VI = 0x1E12; +constexpr unsigned int mmDCP2_GRPH_FLIP_RATE_CNTL__VI = 0x1E8E; +constexpr unsigned int mmDCP2_GRPH_INTERRUPT_CONTROL__VI = 0x1E17; +constexpr unsigned int mmDCP2_GRPH_INTERRUPT_STATUS__VI = 0x1E16; +constexpr unsigned int mmDCP2_GRPH_LUT_10BIT_BYPASS__VI = 0x1E02; +constexpr unsigned int mmDCP2_GRPH_PITCH__SI__CI = 0x4006; +constexpr unsigned int mmDCP2_GRPH_PITCH__VI = 0x1E06; +constexpr unsigned int mmDCP2_GRPH_PRIMARY_SURFACE_ADDRESS__SI__CI = 0x4004; +constexpr unsigned int mmDCP2_GRPH_PRIMARY_SURFACE_ADDRESS__VI = 0x1E04; +constexpr unsigned int mmDCP2_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__VI = 0x1E07; +constexpr unsigned int mmDCP2_GRPH_SECONDARY_SURFACE_ADDRESS__VI = 0x1E05; +constexpr unsigned int mmDCP2_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x1E08; +constexpr unsigned int mmDCP2_GRPH_STEREOSYNC_FLIP__VI = 0x1E97; +constexpr unsigned int mmDCP2_GRPH_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x1E18; +constexpr unsigned int mmDCP2_GRPH_SURFACE_ADDRESS_INUSE__VI = 0x1E13; +constexpr unsigned int mmDCP2_GRPH_SURFACE_OFFSET_X__VI = 0x1E09; +constexpr unsigned int mmDCP2_GRPH_SURFACE_OFFSET_Y__VI = 0x1E0A; +constexpr unsigned int mmDCP2_GRPH_SWAP_CNTL__VI = 0x1E03; +constexpr unsigned int mmDCP2_GRPH_UPDATE__SI__CI = 0x4011; +constexpr unsigned int mmDCP2_GRPH_UPDATE__VI = 0x1E11; +constexpr unsigned int mmDCP2_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x1E9F; +constexpr unsigned int mmDCP2_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x1EBF; +constexpr unsigned int mmDCP2_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x1EBD; +constexpr unsigned int mmDCP2_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x1EBE; +constexpr unsigned int mmDCP2_GRPH_X_END__VI = 0x1E0D; +constexpr unsigned int mmDCP2_GRPH_X_START__VI = 0x1E0B; +constexpr unsigned int mmDCP2_GRPH_Y_END__VI = 0x1E0E; +constexpr unsigned int mmDCP2_GRPH_Y_START__VI = 0x1E0C; +constexpr unsigned int mmDCP2_HW_ROTATION__VI = 0x1E9E; +constexpr unsigned int mmDCP2_INPUT_CSC_C11_C12__VI = 0x1E36; +constexpr unsigned int mmDCP2_INPUT_CSC_C13_C14__VI = 0x1E37; +constexpr unsigned int mmDCP2_INPUT_CSC_C21_C22__VI = 0x1E38; +constexpr unsigned int mmDCP2_INPUT_CSC_C23_C24__VI = 0x1E39; +constexpr unsigned int mmDCP2_INPUT_CSC_C31_C32__VI = 0x1E3A; +constexpr unsigned int mmDCP2_INPUT_CSC_C33_C34__VI = 0x1E3B; +constexpr unsigned int mmDCP2_INPUT_CSC_CONTROL__VI = 0x1E35; +constexpr unsigned int mmDCP2_INPUT_GAMMA_CONTROL__VI = 0x1E10; +constexpr unsigned int mmDCP2_KEY_CONTROL__VI = 0x1E53; +constexpr unsigned int mmDCP2_KEY_RANGE_ALPHA__VI = 0x1E54; +constexpr unsigned int mmDCP2_KEY_RANGE_BLUE__VI = 0x1E57; +constexpr unsigned int mmDCP2_KEY_RANGE_GREEN__VI = 0x1E56; +constexpr unsigned int mmDCP2_KEY_RANGE_RED__VI = 0x1E55; +constexpr unsigned int mmDCP2_OUTPUT_CSC_C11_C12__VI = 0x1E3D; +constexpr unsigned int mmDCP2_OUTPUT_CSC_C13_C14__VI = 0x1E3E; +constexpr unsigned int mmDCP2_OUTPUT_CSC_C21_C22__VI = 0x1E3F; +constexpr unsigned int mmDCP2_OUTPUT_CSC_C23_C24__VI = 0x1E40; +constexpr unsigned int mmDCP2_OUTPUT_CSC_C31_C32__VI = 0x1E41; +constexpr unsigned int mmDCP2_OUTPUT_CSC_C33_C34__VI = 0x1E42; +constexpr unsigned int mmDCP2_OUTPUT_CSC_CONTROL__VI = 0x1E3C; +constexpr unsigned int mmDCP2_OUT_CLAMP_CONTROL_B_CB__VI = 0x1E9D; +constexpr unsigned int mmDCP2_OUT_CLAMP_CONTROL_G_Y__VI = 0x1E9C; +constexpr unsigned int mmDCP2_OUT_CLAMP_CONTROL_R_CR__VI = 0x1E52; +constexpr unsigned int mmDCP2_OUT_ROUND_CONTROL__VI = 0x1E51; +constexpr unsigned int mmDCP2_OVLSCL_EDGE_PIXEL_CNTL__VI = 0x1E2C; +constexpr unsigned int mmDCP2_OVL_CONTROL1__VI = 0x1E1D; +constexpr unsigned int mmDCP2_OVL_CONTROL2__VI = 0x1E1E; +constexpr unsigned int mmDCP2_OVL_DFQ_CONTROL__VI = 0x1E29; +constexpr unsigned int mmDCP2_OVL_DFQ_STATUS__VI = 0x1E2A; +constexpr unsigned int mmDCP2_OVL_ENABLE__VI = 0x1E1C; +constexpr unsigned int mmDCP2_OVL_END__VI = 0x1E26; +constexpr unsigned int mmDCP2_OVL_PITCH__VI = 0x1E21; +constexpr unsigned int mmDCP2_OVL_SECONDARY_SURFACE_ADDRESS__VI = 0x1E92; +constexpr unsigned int mmDCP2_OVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x1E94; +constexpr unsigned int mmDCP2_OVL_START__VI = 0x1E25; +constexpr unsigned int mmDCP2_OVL_STEREOSYNC_FLIP__VI = 0x1E93; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS__SI__CI = 0x4020; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS__VI = 0x1E20; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS_HIGH__VI = 0x1E22; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x1E2B; +constexpr unsigned int mmDCP2_OVL_SURFACE_ADDRESS_INUSE__VI = 0x1E28; +constexpr unsigned int mmDCP2_OVL_SURFACE_OFFSET_X__VI = 0x1E23; +constexpr unsigned int mmDCP2_OVL_SURFACE_OFFSET_Y__VI = 0x1E24; +constexpr unsigned int mmDCP2_OVL_SWAP_CNTL__VI = 0x1E1F; +constexpr unsigned int mmDCP2_OVL_UPDATE__VI = 0x1E27; +constexpr unsigned int mmDCP2_PRESCALE_GRPH_CONTROL__VI = 0x1E2D; +constexpr unsigned int mmDCP2_PRESCALE_OVL_CONTROL__VI = 0x1E31; +constexpr unsigned int mmDCP2_PRESCALE_VALUES_GRPH_B__VI = 0x1E30; +constexpr unsigned int mmDCP2_PRESCALE_VALUES_GRPH_G__VI = 0x1E2F; +constexpr unsigned int mmDCP2_PRESCALE_VALUES_GRPH_R__VI = 0x1E2E; +constexpr unsigned int mmDCP2_PRESCALE_VALUES_OVL_CB__VI = 0x1E32; +constexpr unsigned int mmDCP2_PRESCALE_VALUES_OVL_CR__VI = 0x1E34; +constexpr unsigned int mmDCP2_PRESCALE_VALUES_OVL_Y__VI = 0x1E33; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_END_CNTL1__VI = 0x1EA6; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_END_CNTL2__VI = 0x1EA7; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_0_1__VI = 0x1EA8; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_10_11__VI = 0x1EAD; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_12_13__VI = 0x1EAE; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_14_15__VI = 0x1EAF; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_2_3__VI = 0x1EA9; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_4_5__VI = 0x1EAA; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_6_7__VI = 0x1EAB; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_REGION_8_9__VI = 0x1EAC; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_SLOPE_CNTL__VI = 0x1EA5; +constexpr unsigned int mmDCP2_REGAMMA_CNTLA_START_CNTL__VI = 0x1EA4; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_END_CNTL1__VI = 0x1EB2; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_END_CNTL2__VI = 0x1EB3; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_0_1__VI = 0x1EB4; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_10_11__VI = 0x1EB9; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_12_13__VI = 0x1EBA; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_14_15__VI = 0x1EBB; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_2_3__VI = 0x1EB5; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_4_5__VI = 0x1EB6; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_6_7__VI = 0x1EB7; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_REGION_8_9__VI = 0x1EB8; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_SLOPE_CNTL__VI = 0x1EB1; +constexpr unsigned int mmDCP2_REGAMMA_CNTLB_START_CNTL__VI = 0x1EB0; +constexpr unsigned int mmDCP2_REGAMMA_CONTROL__VI = 0x1EA0; +constexpr unsigned int mmDCP2_REGAMMA_LUT_DATA__VI = 0x1EA2; +constexpr unsigned int mmDCP2_REGAMMA_LUT_INDEX__VI = 0x1EA1; +constexpr unsigned int mmDCP2_REGAMMA_LUT_WRITE_EN_MASK__VI = 0x1EA3; +constexpr unsigned int mmDCP3_ALPHA_CONTROL__VI = 0x40BC; +constexpr unsigned int mmDCP3_COMM_MATRIXA_TRANS_C11_C12__VI = 0x4043; +constexpr unsigned int mmDCP3_COMM_MATRIXA_TRANS_C13_C14__VI = 0x4044; +constexpr unsigned int mmDCP3_COMM_MATRIXA_TRANS_C21_C22__VI = 0x4045; +constexpr unsigned int mmDCP3_COMM_MATRIXA_TRANS_C23_C24__VI = 0x4046; +constexpr unsigned int mmDCP3_COMM_MATRIXA_TRANS_C31_C32__VI = 0x4047; +constexpr unsigned int mmDCP3_COMM_MATRIXA_TRANS_C33_C34__VI = 0x4048; +constexpr unsigned int mmDCP3_COMM_MATRIXB_TRANS_C11_C12__VI = 0x4049; +constexpr unsigned int mmDCP3_COMM_MATRIXB_TRANS_C13_C14__VI = 0x404A; +constexpr unsigned int mmDCP3_COMM_MATRIXB_TRANS_C21_C22__VI = 0x404B; +constexpr unsigned int mmDCP3_COMM_MATRIXB_TRANS_C23_C24__VI = 0x404C; +constexpr unsigned int mmDCP3_COMM_MATRIXB_TRANS_C31_C32__VI = 0x404D; +constexpr unsigned int mmDCP3_COMM_MATRIXB_TRANS_C33_C34__VI = 0x404E; +constexpr unsigned int mmDCP3_CUR2_COLOR1__VI = 0x4075; +constexpr unsigned int mmDCP3_CUR2_COLOR2__VI = 0x4076; +constexpr unsigned int mmDCP3_CUR2_CONTROL__VI = 0x406F; +constexpr unsigned int mmDCP3_CUR2_HOT_SPOT__VI = 0x4074; +constexpr unsigned int mmDCP3_CUR2_POSITION__VI = 0x4073; +constexpr unsigned int mmDCP3_CUR2_SIZE__VI = 0x4071; +constexpr unsigned int mmDCP3_CUR2_STEREO_CONTROL__VI = 0x409B; +constexpr unsigned int mmDCP3_CUR2_SURFACE_ADDRESS__VI = 0x4070; +constexpr unsigned int mmDCP3_CUR2_SURFACE_ADDRESS_HIGH__VI = 0x4072; +constexpr unsigned int mmDCP3_CUR2_UPDATE__VI = 0x4077; +constexpr unsigned int mmDCP3_CUR_COLOR1__VI = 0x406C; +constexpr unsigned int mmDCP3_CUR_COLOR2__VI = 0x406D; +constexpr unsigned int mmDCP3_CUR_CONTROL__VI = 0x4066; +constexpr unsigned int mmDCP3_CUR_HOT_SPOT__VI = 0x406B; +constexpr unsigned int mmDCP3_CUR_POSITION__VI = 0x406A; +constexpr unsigned int mmDCP3_CUR_REQUEST_FILTER_CNTL__VI = 0x4099; +constexpr unsigned int mmDCP3_CUR_SIZE__VI = 0x4068; +constexpr unsigned int mmDCP3_CUR_STEREO_CONTROL__VI = 0x409A; +constexpr unsigned int mmDCP3_CUR_SURFACE_ADDRESS__VI = 0x4067; +constexpr unsigned int mmDCP3_CUR_SURFACE_ADDRESS_HIGH__VI = 0x4069; +constexpr unsigned int mmDCP3_CUR_UPDATE__VI = 0x406E; +constexpr unsigned int mmDCP3_DCP_CRC_CONTROL__VI = 0x4087; +constexpr unsigned int mmDCP3_DCP_CRC_CURRENT__VI = 0x4089; +constexpr unsigned int mmDCP3_DCP_CRC_LAST__VI = 0x408B; +constexpr unsigned int mmDCP3_DCP_CRC_MASK__VI = 0x4088; +constexpr unsigned int mmDCP3_DCP_DEBUG__VI = 0x408D; +constexpr unsigned int mmDCP3_DCP_DEBUG2__VI = 0x4098; +constexpr unsigned int mmDCP3_DCP_FP_CONVERTED_FIELD__VI = 0x4065; +constexpr unsigned int mmDCP3_DCP_GSL_CONTROL__VI = 0x4090; +constexpr unsigned int mmDCP3_DCP_LB_DATA_GAP_BETWEEN_CHUNK__VI = 0x4091; +constexpr unsigned int mmDCP3_DCP_RANDOM_SEEDS__VI = 0x4061; +constexpr unsigned int mmDCP3_DCP_SPATIAL_DITHER_CNTL__VI = 0x4060; +constexpr unsigned int mmDCP3_DCP_TEST_DEBUG_DATA__VI = 0x4096; +constexpr unsigned int mmDCP3_DCP_TEST_DEBUG_INDEX__VI = 0x4095; +constexpr unsigned int mmDCP3_DC_LUT_30_COLOR__VI = 0x407C; +constexpr unsigned int mmDCP3_DC_LUT_AUTOFILL__VI = 0x407F; +constexpr unsigned int mmDCP3_DC_LUT_BLACK_OFFSET_BLUE__VI = 0x4081; +constexpr unsigned int mmDCP3_DC_LUT_BLACK_OFFSET_GREEN__VI = 0x4082; +constexpr unsigned int mmDCP3_DC_LUT_BLACK_OFFSET_RED__VI = 0x4083; +constexpr unsigned int mmDCP3_DC_LUT_CONTROL__VI = 0x4080; +constexpr unsigned int mmDCP3_DC_LUT_PWL_DATA__VI = 0x407B; +constexpr unsigned int mmDCP3_DC_LUT_RW_INDEX__VI = 0x4079; +constexpr unsigned int mmDCP3_DC_LUT_RW_MODE__VI = 0x4078; +constexpr unsigned int mmDCP3_DC_LUT_SEQ_COLOR__VI = 0x407A; +constexpr unsigned int mmDCP3_DC_LUT_VGA_ACCESS_ENABLE__VI = 0x407D; +constexpr unsigned int mmDCP3_DC_LUT_WHITE_OFFSET_BLUE__VI = 0x4084; +constexpr unsigned int mmDCP3_DC_LUT_WHITE_OFFSET_GREEN__VI = 0x4085; +constexpr unsigned int mmDCP3_DC_LUT_WHITE_OFFSET_RED__VI = 0x4086; +constexpr unsigned int mmDCP3_DC_LUT_WRITE_EN_MASK__VI = 0x407E; +constexpr unsigned int mmDCP3_DEGAMMA_CONTROL__VI = 0x4058; +constexpr unsigned int mmDCP3_DENORM_CONTROL__VI = 0x4050; +constexpr unsigned int mmDCP3_GAMUT_REMAP_C11_C12__VI = 0x405A; +constexpr unsigned int mmDCP3_GAMUT_REMAP_C13_C14__VI = 0x405B; +constexpr unsigned int mmDCP3_GAMUT_REMAP_C21_C22__VI = 0x405C; +constexpr unsigned int mmDCP3_GAMUT_REMAP_C23_C24__VI = 0x405D; +constexpr unsigned int mmDCP3_GAMUT_REMAP_C31_C32__VI = 0x405E; +constexpr unsigned int mmDCP3_GAMUT_REMAP_C33_C34__VI = 0x405F; +constexpr unsigned int mmDCP3_GAMUT_REMAP_CONTROL__VI = 0x4059; +constexpr unsigned int mmDCP3_GRPH_COMPRESS_PITCH__VI = 0x401A; +constexpr unsigned int mmDCP3_GRPH_COMPRESS_SURFACE_ADDRESS__VI = 0x4019; +constexpr unsigned int mmDCP3_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__VI = 0x401B; +constexpr unsigned int mmDCP3_GRPH_CONTROL__SI__CI = 0x4301; +constexpr unsigned int mmDCP3_GRPH_CONTROL__VI = 0x4001; +constexpr unsigned int mmDCP3_GRPH_DFQ_CONTROL__VI = 0x4014; +constexpr unsigned int mmDCP3_GRPH_DFQ_STATUS__VI = 0x4015; +constexpr unsigned int mmDCP3_GRPH_ENABLE__VI = 0x4000; +constexpr unsigned int mmDCP3_GRPH_FLIP_CONTROL__SI__CI = 0x4312; +constexpr unsigned int mmDCP3_GRPH_FLIP_CONTROL__VI = 0x4012; +constexpr unsigned int mmDCP3_GRPH_FLIP_RATE_CNTL__VI = 0x408E; +constexpr unsigned int mmDCP3_GRPH_INTERRUPT_CONTROL__VI = 0x4017; +constexpr unsigned int mmDCP3_GRPH_INTERRUPT_STATUS__VI = 0x4016; +constexpr unsigned int mmDCP3_GRPH_LUT_10BIT_BYPASS__VI = 0x4002; +constexpr unsigned int mmDCP3_GRPH_PITCH__SI__CI = 0x4306; +constexpr unsigned int mmDCP3_GRPH_PITCH__VI = 0x4006; +constexpr unsigned int mmDCP3_GRPH_PRIMARY_SURFACE_ADDRESS__SI__CI = 0x4304; +constexpr unsigned int mmDCP3_GRPH_PRIMARY_SURFACE_ADDRESS__VI = 0x4004; +constexpr unsigned int mmDCP3_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__VI = 0x4007; +constexpr unsigned int mmDCP3_GRPH_SECONDARY_SURFACE_ADDRESS__VI = 0x4005; +constexpr unsigned int mmDCP3_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x4008; +constexpr unsigned int mmDCP3_GRPH_STEREOSYNC_FLIP__VI = 0x4097; +constexpr unsigned int mmDCP3_GRPH_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x4018; +constexpr unsigned int mmDCP3_GRPH_SURFACE_ADDRESS_INUSE__VI = 0x4013; +constexpr unsigned int mmDCP3_GRPH_SURFACE_OFFSET_X__VI = 0x4009; +constexpr unsigned int mmDCP3_GRPH_SURFACE_OFFSET_Y__VI = 0x400A; +constexpr unsigned int mmDCP3_GRPH_SWAP_CNTL__VI = 0x4003; +constexpr unsigned int mmDCP3_GRPH_UPDATE__SI__CI = 0x4311; +constexpr unsigned int mmDCP3_GRPH_UPDATE__VI = 0x4011; +constexpr unsigned int mmDCP3_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x409F; +constexpr unsigned int mmDCP3_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x40BF; +constexpr unsigned int mmDCP3_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x40BD; +constexpr unsigned int mmDCP3_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x40BE; +constexpr unsigned int mmDCP3_GRPH_X_END__VI = 0x400D; +constexpr unsigned int mmDCP3_GRPH_X_START__VI = 0x400B; +constexpr unsigned int mmDCP3_GRPH_Y_END__VI = 0x400E; +constexpr unsigned int mmDCP3_GRPH_Y_START__VI = 0x400C; +constexpr unsigned int mmDCP3_HW_ROTATION__VI = 0x409E; +constexpr unsigned int mmDCP3_INPUT_CSC_C11_C12__VI = 0x4036; +constexpr unsigned int mmDCP3_INPUT_CSC_C13_C14__VI = 0x4037; +constexpr unsigned int mmDCP3_INPUT_CSC_C21_C22__VI = 0x4038; +constexpr unsigned int mmDCP3_INPUT_CSC_C23_C24__VI = 0x4039; +constexpr unsigned int mmDCP3_INPUT_CSC_C31_C32__VI = 0x403A; +constexpr unsigned int mmDCP3_INPUT_CSC_C33_C34__VI = 0x403B; +constexpr unsigned int mmDCP3_INPUT_CSC_CONTROL__VI = 0x4035; +constexpr unsigned int mmDCP3_INPUT_GAMMA_CONTROL__VI = 0x4010; +constexpr unsigned int mmDCP3_KEY_CONTROL__VI = 0x4053; +constexpr unsigned int mmDCP3_KEY_RANGE_ALPHA__VI = 0x4054; +constexpr unsigned int mmDCP3_KEY_RANGE_BLUE__VI = 0x4057; +constexpr unsigned int mmDCP3_KEY_RANGE_GREEN__VI = 0x4056; +constexpr unsigned int mmDCP3_KEY_RANGE_RED__VI = 0x4055; +constexpr unsigned int mmDCP3_OUTPUT_CSC_C11_C12__VI = 0x403D; +constexpr unsigned int mmDCP3_OUTPUT_CSC_C13_C14__VI = 0x403E; +constexpr unsigned int mmDCP3_OUTPUT_CSC_C21_C22__VI = 0x403F; +constexpr unsigned int mmDCP3_OUTPUT_CSC_C23_C24__VI = 0x4040; +constexpr unsigned int mmDCP3_OUTPUT_CSC_C31_C32__VI = 0x4041; +constexpr unsigned int mmDCP3_OUTPUT_CSC_C33_C34__VI = 0x4042; +constexpr unsigned int mmDCP3_OUTPUT_CSC_CONTROL__VI = 0x403C; +constexpr unsigned int mmDCP3_OUT_CLAMP_CONTROL_B_CB__VI = 0x409D; +constexpr unsigned int mmDCP3_OUT_CLAMP_CONTROL_G_Y__VI = 0x409C; +constexpr unsigned int mmDCP3_OUT_CLAMP_CONTROL_R_CR__VI = 0x4052; +constexpr unsigned int mmDCP3_OUT_ROUND_CONTROL__VI = 0x4051; +constexpr unsigned int mmDCP3_OVLSCL_EDGE_PIXEL_CNTL__VI = 0x402C; +constexpr unsigned int mmDCP3_OVL_CONTROL1__VI = 0x401D; +constexpr unsigned int mmDCP3_OVL_CONTROL2__VI = 0x401E; +constexpr unsigned int mmDCP3_OVL_DFQ_CONTROL__VI = 0x4029; +constexpr unsigned int mmDCP3_OVL_DFQ_STATUS__VI = 0x402A; +constexpr unsigned int mmDCP3_OVL_ENABLE__VI = 0x401C; +constexpr unsigned int mmDCP3_OVL_END__VI = 0x4026; +constexpr unsigned int mmDCP3_OVL_PITCH__VI = 0x4021; +constexpr unsigned int mmDCP3_OVL_SECONDARY_SURFACE_ADDRESS__VI = 0x4092; +constexpr unsigned int mmDCP3_OVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x4094; +constexpr unsigned int mmDCP3_OVL_START__VI = 0x4025; +constexpr unsigned int mmDCP3_OVL_STEREOSYNC_FLIP__VI = 0x4093; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS__SI__CI = 0x4320; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS__VI = 0x4020; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS_HIGH__VI = 0x4022; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x402B; +constexpr unsigned int mmDCP3_OVL_SURFACE_ADDRESS_INUSE__VI = 0x4028; +constexpr unsigned int mmDCP3_OVL_SURFACE_OFFSET_X__VI = 0x4023; +constexpr unsigned int mmDCP3_OVL_SURFACE_OFFSET_Y__VI = 0x4024; +constexpr unsigned int mmDCP3_OVL_SWAP_CNTL__VI = 0x401F; +constexpr unsigned int mmDCP3_OVL_UPDATE__VI = 0x4027; +constexpr unsigned int mmDCP3_PRESCALE_GRPH_CONTROL__VI = 0x402D; +constexpr unsigned int mmDCP3_PRESCALE_OVL_CONTROL__VI = 0x4031; +constexpr unsigned int mmDCP3_PRESCALE_VALUES_GRPH_B__VI = 0x4030; +constexpr unsigned int mmDCP3_PRESCALE_VALUES_GRPH_G__VI = 0x402F; +constexpr unsigned int mmDCP3_PRESCALE_VALUES_GRPH_R__VI = 0x402E; +constexpr unsigned int mmDCP3_PRESCALE_VALUES_OVL_CB__VI = 0x4032; +constexpr unsigned int mmDCP3_PRESCALE_VALUES_OVL_CR__VI = 0x4034; +constexpr unsigned int mmDCP3_PRESCALE_VALUES_OVL_Y__VI = 0x4033; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_END_CNTL1__VI = 0x40A6; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_END_CNTL2__VI = 0x40A7; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_0_1__VI = 0x40A8; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_10_11__VI = 0x40AD; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_12_13__VI = 0x40AE; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_14_15__VI = 0x40AF; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_2_3__VI = 0x40A9; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_4_5__VI = 0x40AA; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_6_7__VI = 0x40AB; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_REGION_8_9__VI = 0x40AC; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_SLOPE_CNTL__VI = 0x40A5; +constexpr unsigned int mmDCP3_REGAMMA_CNTLA_START_CNTL__VI = 0x40A4; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_END_CNTL1__VI = 0x40B2; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_END_CNTL2__VI = 0x40B3; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_0_1__VI = 0x40B4; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_10_11__VI = 0x40B9; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_12_13__VI = 0x40BA; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_14_15__VI = 0x40BB; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_2_3__VI = 0x40B5; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_4_5__VI = 0x40B6; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_6_7__VI = 0x40B7; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_REGION_8_9__VI = 0x40B8; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_SLOPE_CNTL__VI = 0x40B1; +constexpr unsigned int mmDCP3_REGAMMA_CNTLB_START_CNTL__VI = 0x40B0; +constexpr unsigned int mmDCP3_REGAMMA_CONTROL__VI = 0x40A0; +constexpr unsigned int mmDCP3_REGAMMA_LUT_DATA__VI = 0x40A2; +constexpr unsigned int mmDCP3_REGAMMA_LUT_INDEX__VI = 0x40A1; +constexpr unsigned int mmDCP3_REGAMMA_LUT_WRITE_EN_MASK__VI = 0x40A3; +constexpr unsigned int mmDCP4_ALPHA_CONTROL__VI = 0x42BC; +constexpr unsigned int mmDCP4_COMM_MATRIXA_TRANS_C11_C12__VI = 0x4243; +constexpr unsigned int mmDCP4_COMM_MATRIXA_TRANS_C13_C14__VI = 0x4244; +constexpr unsigned int mmDCP4_COMM_MATRIXA_TRANS_C21_C22__VI = 0x4245; +constexpr unsigned int mmDCP4_COMM_MATRIXA_TRANS_C23_C24__VI = 0x4246; +constexpr unsigned int mmDCP4_COMM_MATRIXA_TRANS_C31_C32__VI = 0x4247; +constexpr unsigned int mmDCP4_COMM_MATRIXA_TRANS_C33_C34__VI = 0x4248; +constexpr unsigned int mmDCP4_COMM_MATRIXB_TRANS_C11_C12__VI = 0x4249; +constexpr unsigned int mmDCP4_COMM_MATRIXB_TRANS_C13_C14__VI = 0x424A; +constexpr unsigned int mmDCP4_COMM_MATRIXB_TRANS_C21_C22__VI = 0x424B; +constexpr unsigned int mmDCP4_COMM_MATRIXB_TRANS_C23_C24__VI = 0x424C; +constexpr unsigned int mmDCP4_COMM_MATRIXB_TRANS_C31_C32__VI = 0x424D; +constexpr unsigned int mmDCP4_COMM_MATRIXB_TRANS_C33_C34__VI = 0x424E; +constexpr unsigned int mmDCP4_CUR2_COLOR1__VI = 0x4275; +constexpr unsigned int mmDCP4_CUR2_COLOR2__VI = 0x4276; +constexpr unsigned int mmDCP4_CUR2_CONTROL__VI = 0x426F; +constexpr unsigned int mmDCP4_CUR2_HOT_SPOT__VI = 0x4274; +constexpr unsigned int mmDCP4_CUR2_POSITION__VI = 0x4273; +constexpr unsigned int mmDCP4_CUR2_SIZE__VI = 0x4271; +constexpr unsigned int mmDCP4_CUR2_STEREO_CONTROL__VI = 0x429B; +constexpr unsigned int mmDCP4_CUR2_SURFACE_ADDRESS__VI = 0x4270; +constexpr unsigned int mmDCP4_CUR2_SURFACE_ADDRESS_HIGH__VI = 0x4272; +constexpr unsigned int mmDCP4_CUR2_UPDATE__VI = 0x4277; +constexpr unsigned int mmDCP4_CUR_COLOR1__VI = 0x426C; +constexpr unsigned int mmDCP4_CUR_COLOR2__VI = 0x426D; +constexpr unsigned int mmDCP4_CUR_CONTROL__VI = 0x4266; +constexpr unsigned int mmDCP4_CUR_HOT_SPOT__VI = 0x426B; +constexpr unsigned int mmDCP4_CUR_POSITION__VI = 0x426A; +constexpr unsigned int mmDCP4_CUR_REQUEST_FILTER_CNTL__VI = 0x4299; +constexpr unsigned int mmDCP4_CUR_SIZE__VI = 0x4268; +constexpr unsigned int mmDCP4_CUR_STEREO_CONTROL__VI = 0x429A; +constexpr unsigned int mmDCP4_CUR_SURFACE_ADDRESS__VI = 0x4267; +constexpr unsigned int mmDCP4_CUR_SURFACE_ADDRESS_HIGH__VI = 0x4269; +constexpr unsigned int mmDCP4_CUR_UPDATE__VI = 0x426E; +constexpr unsigned int mmDCP4_DCP_CRC_CONTROL__VI = 0x4287; +constexpr unsigned int mmDCP4_DCP_CRC_CURRENT__VI = 0x4289; +constexpr unsigned int mmDCP4_DCP_CRC_LAST__VI = 0x428B; +constexpr unsigned int mmDCP4_DCP_CRC_MASK__VI = 0x4288; +constexpr unsigned int mmDCP4_DCP_DEBUG__VI = 0x428D; +constexpr unsigned int mmDCP4_DCP_DEBUG2__VI = 0x4298; +constexpr unsigned int mmDCP4_DCP_FP_CONVERTED_FIELD__VI = 0x4265; +constexpr unsigned int mmDCP4_DCP_GSL_CONTROL__VI = 0x4290; +constexpr unsigned int mmDCP4_DCP_LB_DATA_GAP_BETWEEN_CHUNK__VI = 0x4291; +constexpr unsigned int mmDCP4_DCP_RANDOM_SEEDS__VI = 0x4261; +constexpr unsigned int mmDCP4_DCP_SPATIAL_DITHER_CNTL__VI = 0x4260; +constexpr unsigned int mmDCP4_DCP_TEST_DEBUG_DATA__VI = 0x4296; +constexpr unsigned int mmDCP4_DCP_TEST_DEBUG_INDEX__VI = 0x4295; +constexpr unsigned int mmDCP4_DC_LUT_30_COLOR__VI = 0x427C; +constexpr unsigned int mmDCP4_DC_LUT_AUTOFILL__VI = 0x427F; +constexpr unsigned int mmDCP4_DC_LUT_BLACK_OFFSET_BLUE__VI = 0x4281; +constexpr unsigned int mmDCP4_DC_LUT_BLACK_OFFSET_GREEN__VI = 0x4282; +constexpr unsigned int mmDCP4_DC_LUT_BLACK_OFFSET_RED__VI = 0x4283; +constexpr unsigned int mmDCP4_DC_LUT_CONTROL__VI = 0x4280; +constexpr unsigned int mmDCP4_DC_LUT_PWL_DATA__VI = 0x427B; +constexpr unsigned int mmDCP4_DC_LUT_RW_INDEX__VI = 0x4279; +constexpr unsigned int mmDCP4_DC_LUT_RW_MODE__VI = 0x4278; +constexpr unsigned int mmDCP4_DC_LUT_SEQ_COLOR__VI = 0x427A; +constexpr unsigned int mmDCP4_DC_LUT_VGA_ACCESS_ENABLE__VI = 0x427D; +constexpr unsigned int mmDCP4_DC_LUT_WHITE_OFFSET_BLUE__VI = 0x4284; +constexpr unsigned int mmDCP4_DC_LUT_WHITE_OFFSET_GREEN__VI = 0x4285; +constexpr unsigned int mmDCP4_DC_LUT_WHITE_OFFSET_RED__VI = 0x4286; +constexpr unsigned int mmDCP4_DC_LUT_WRITE_EN_MASK__VI = 0x427E; +constexpr unsigned int mmDCP4_DEGAMMA_CONTROL__VI = 0x4258; +constexpr unsigned int mmDCP4_DENORM_CONTROL__VI = 0x4250; +constexpr unsigned int mmDCP4_GAMUT_REMAP_C11_C12__VI = 0x425A; +constexpr unsigned int mmDCP4_GAMUT_REMAP_C13_C14__VI = 0x425B; +constexpr unsigned int mmDCP4_GAMUT_REMAP_C21_C22__VI = 0x425C; +constexpr unsigned int mmDCP4_GAMUT_REMAP_C23_C24__VI = 0x425D; +constexpr unsigned int mmDCP4_GAMUT_REMAP_C31_C32__VI = 0x425E; +constexpr unsigned int mmDCP4_GAMUT_REMAP_C33_C34__VI = 0x425F; +constexpr unsigned int mmDCP4_GAMUT_REMAP_CONTROL__VI = 0x4259; +constexpr unsigned int mmDCP4_GRPH_COMPRESS_PITCH__VI = 0x421A; +constexpr unsigned int mmDCP4_GRPH_COMPRESS_SURFACE_ADDRESS__VI = 0x4219; +constexpr unsigned int mmDCP4_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__VI = 0x421B; +constexpr unsigned int mmDCP4_GRPH_CONTROL__SI__CI = 0x4601; +constexpr unsigned int mmDCP4_GRPH_CONTROL__VI = 0x4201; +constexpr unsigned int mmDCP4_GRPH_DFQ_CONTROL__VI = 0x4214; +constexpr unsigned int mmDCP4_GRPH_DFQ_STATUS__VI = 0x4215; +constexpr unsigned int mmDCP4_GRPH_ENABLE__VI = 0x4200; +constexpr unsigned int mmDCP4_GRPH_FLIP_CONTROL__SI__CI = 0x4612; +constexpr unsigned int mmDCP4_GRPH_FLIP_CONTROL__VI = 0x4212; +constexpr unsigned int mmDCP4_GRPH_FLIP_RATE_CNTL__VI = 0x428E; +constexpr unsigned int mmDCP4_GRPH_INTERRUPT_CONTROL__VI = 0x4217; +constexpr unsigned int mmDCP4_GRPH_INTERRUPT_STATUS__VI = 0x4216; +constexpr unsigned int mmDCP4_GRPH_LUT_10BIT_BYPASS__VI = 0x4202; +constexpr unsigned int mmDCP4_GRPH_PITCH__SI__CI = 0x4606; +constexpr unsigned int mmDCP4_GRPH_PITCH__VI = 0x4206; +constexpr unsigned int mmDCP4_GRPH_PRIMARY_SURFACE_ADDRESS__SI__CI = 0x4604; +constexpr unsigned int mmDCP4_GRPH_PRIMARY_SURFACE_ADDRESS__VI = 0x4204; +constexpr unsigned int mmDCP4_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__VI = 0x4207; +constexpr unsigned int mmDCP4_GRPH_SECONDARY_SURFACE_ADDRESS__VI = 0x4205; +constexpr unsigned int mmDCP4_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x4208; +constexpr unsigned int mmDCP4_GRPH_STEREOSYNC_FLIP__VI = 0x4297; +constexpr unsigned int mmDCP4_GRPH_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x4218; +constexpr unsigned int mmDCP4_GRPH_SURFACE_ADDRESS_INUSE__VI = 0x4213; +constexpr unsigned int mmDCP4_GRPH_SURFACE_OFFSET_X__VI = 0x4209; +constexpr unsigned int mmDCP4_GRPH_SURFACE_OFFSET_Y__VI = 0x420A; +constexpr unsigned int mmDCP4_GRPH_SWAP_CNTL__VI = 0x4203; +constexpr unsigned int mmDCP4_GRPH_UPDATE__SI__CI = 0x4611; +constexpr unsigned int mmDCP4_GRPH_UPDATE__VI = 0x4211; +constexpr unsigned int mmDCP4_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x429F; +constexpr unsigned int mmDCP4_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x42BF; +constexpr unsigned int mmDCP4_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x42BD; +constexpr unsigned int mmDCP4_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x42BE; +constexpr unsigned int mmDCP4_GRPH_X_END__VI = 0x420D; +constexpr unsigned int mmDCP4_GRPH_X_START__VI = 0x420B; +constexpr unsigned int mmDCP4_GRPH_Y_END__VI = 0x420E; +constexpr unsigned int mmDCP4_GRPH_Y_START__VI = 0x420C; +constexpr unsigned int mmDCP4_HW_ROTATION__VI = 0x429E; +constexpr unsigned int mmDCP4_INPUT_CSC_C11_C12__VI = 0x4236; +constexpr unsigned int mmDCP4_INPUT_CSC_C13_C14__VI = 0x4237; +constexpr unsigned int mmDCP4_INPUT_CSC_C21_C22__VI = 0x4238; +constexpr unsigned int mmDCP4_INPUT_CSC_C23_C24__VI = 0x4239; +constexpr unsigned int mmDCP4_INPUT_CSC_C31_C32__VI = 0x423A; +constexpr unsigned int mmDCP4_INPUT_CSC_C33_C34__VI = 0x423B; +constexpr unsigned int mmDCP4_INPUT_CSC_CONTROL__VI = 0x4235; +constexpr unsigned int mmDCP4_INPUT_GAMMA_CONTROL__VI = 0x4210; +constexpr unsigned int mmDCP4_KEY_CONTROL__VI = 0x4253; +constexpr unsigned int mmDCP4_KEY_RANGE_ALPHA__VI = 0x4254; +constexpr unsigned int mmDCP4_KEY_RANGE_BLUE__VI = 0x4257; +constexpr unsigned int mmDCP4_KEY_RANGE_GREEN__VI = 0x4256; +constexpr unsigned int mmDCP4_KEY_RANGE_RED__VI = 0x4255; +constexpr unsigned int mmDCP4_OUTPUT_CSC_C11_C12__VI = 0x423D; +constexpr unsigned int mmDCP4_OUTPUT_CSC_C13_C14__VI = 0x423E; +constexpr unsigned int mmDCP4_OUTPUT_CSC_C21_C22__VI = 0x423F; +constexpr unsigned int mmDCP4_OUTPUT_CSC_C23_C24__VI = 0x4240; +constexpr unsigned int mmDCP4_OUTPUT_CSC_C31_C32__VI = 0x4241; +constexpr unsigned int mmDCP4_OUTPUT_CSC_C33_C34__VI = 0x4242; +constexpr unsigned int mmDCP4_OUTPUT_CSC_CONTROL__VI = 0x423C; +constexpr unsigned int mmDCP4_OUT_CLAMP_CONTROL_B_CB__VI = 0x429D; +constexpr unsigned int mmDCP4_OUT_CLAMP_CONTROL_G_Y__VI = 0x429C; +constexpr unsigned int mmDCP4_OUT_CLAMP_CONTROL_R_CR__VI = 0x4252; +constexpr unsigned int mmDCP4_OUT_ROUND_CONTROL__VI = 0x4251; +constexpr unsigned int mmDCP4_OVLSCL_EDGE_PIXEL_CNTL__VI = 0x422C; +constexpr unsigned int mmDCP4_OVL_CONTROL1__VI = 0x421D; +constexpr unsigned int mmDCP4_OVL_CONTROL2__VI = 0x421E; +constexpr unsigned int mmDCP4_OVL_DFQ_CONTROL__VI = 0x4229; +constexpr unsigned int mmDCP4_OVL_DFQ_STATUS__VI = 0x422A; +constexpr unsigned int mmDCP4_OVL_ENABLE__VI = 0x421C; +constexpr unsigned int mmDCP4_OVL_END__VI = 0x4226; +constexpr unsigned int mmDCP4_OVL_PITCH__VI = 0x4221; +constexpr unsigned int mmDCP4_OVL_SECONDARY_SURFACE_ADDRESS__VI = 0x4292; +constexpr unsigned int mmDCP4_OVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x4294; +constexpr unsigned int mmDCP4_OVL_START__VI = 0x4225; +constexpr unsigned int mmDCP4_OVL_STEREOSYNC_FLIP__VI = 0x4293; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS__SI__CI = 0x4620; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS__VI = 0x4220; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS_HIGH__VI = 0x4222; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x422B; +constexpr unsigned int mmDCP4_OVL_SURFACE_ADDRESS_INUSE__VI = 0x4228; +constexpr unsigned int mmDCP4_OVL_SURFACE_OFFSET_X__VI = 0x4223; +constexpr unsigned int mmDCP4_OVL_SURFACE_OFFSET_Y__VI = 0x4224; +constexpr unsigned int mmDCP4_OVL_SWAP_CNTL__VI = 0x421F; +constexpr unsigned int mmDCP4_OVL_UPDATE__VI = 0x4227; +constexpr unsigned int mmDCP4_PRESCALE_GRPH_CONTROL__VI = 0x422D; +constexpr unsigned int mmDCP4_PRESCALE_OVL_CONTROL__VI = 0x4231; +constexpr unsigned int mmDCP4_PRESCALE_VALUES_GRPH_B__VI = 0x4230; +constexpr unsigned int mmDCP4_PRESCALE_VALUES_GRPH_G__VI = 0x422F; +constexpr unsigned int mmDCP4_PRESCALE_VALUES_GRPH_R__VI = 0x422E; +constexpr unsigned int mmDCP4_PRESCALE_VALUES_OVL_CB__VI = 0x4232; +constexpr unsigned int mmDCP4_PRESCALE_VALUES_OVL_CR__VI = 0x4234; +constexpr unsigned int mmDCP4_PRESCALE_VALUES_OVL_Y__VI = 0x4233; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_END_CNTL1__VI = 0x42A6; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_END_CNTL2__VI = 0x42A7; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_0_1__VI = 0x42A8; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_10_11__VI = 0x42AD; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_12_13__VI = 0x42AE; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_14_15__VI = 0x42AF; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_2_3__VI = 0x42A9; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_4_5__VI = 0x42AA; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_6_7__VI = 0x42AB; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_REGION_8_9__VI = 0x42AC; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_SLOPE_CNTL__VI = 0x42A5; +constexpr unsigned int mmDCP4_REGAMMA_CNTLA_START_CNTL__VI = 0x42A4; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_END_CNTL1__VI = 0x42B2; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_END_CNTL2__VI = 0x42B3; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_0_1__VI = 0x42B4; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_10_11__VI = 0x42B9; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_12_13__VI = 0x42BA; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_14_15__VI = 0x42BB; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_2_3__VI = 0x42B5; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_4_5__VI = 0x42B6; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_6_7__VI = 0x42B7; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_REGION_8_9__VI = 0x42B8; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_SLOPE_CNTL__VI = 0x42B1; +constexpr unsigned int mmDCP4_REGAMMA_CNTLB_START_CNTL__VI = 0x42B0; +constexpr unsigned int mmDCP4_REGAMMA_CONTROL__VI = 0x42A0; +constexpr unsigned int mmDCP4_REGAMMA_LUT_DATA__VI = 0x42A2; +constexpr unsigned int mmDCP4_REGAMMA_LUT_INDEX__VI = 0x42A1; +constexpr unsigned int mmDCP4_REGAMMA_LUT_WRITE_EN_MASK__VI = 0x42A3; +constexpr unsigned int mmDCP5_ALPHA_CONTROL__VI = 0x44BC; +constexpr unsigned int mmDCP5_COMM_MATRIXA_TRANS_C11_C12__VI = 0x4443; +constexpr unsigned int mmDCP5_COMM_MATRIXA_TRANS_C13_C14__VI = 0x4444; +constexpr unsigned int mmDCP5_COMM_MATRIXA_TRANS_C21_C22__VI = 0x4445; +constexpr unsigned int mmDCP5_COMM_MATRIXA_TRANS_C23_C24__VI = 0x4446; +constexpr unsigned int mmDCP5_COMM_MATRIXA_TRANS_C31_C32__VI = 0x4447; +constexpr unsigned int mmDCP5_COMM_MATRIXA_TRANS_C33_C34__VI = 0x4448; +constexpr unsigned int mmDCP5_COMM_MATRIXB_TRANS_C11_C12__VI = 0x4449; +constexpr unsigned int mmDCP5_COMM_MATRIXB_TRANS_C13_C14__VI = 0x444A; +constexpr unsigned int mmDCP5_COMM_MATRIXB_TRANS_C21_C22__VI = 0x444B; +constexpr unsigned int mmDCP5_COMM_MATRIXB_TRANS_C23_C24__VI = 0x444C; +constexpr unsigned int mmDCP5_COMM_MATRIXB_TRANS_C31_C32__VI = 0x444D; +constexpr unsigned int mmDCP5_COMM_MATRIXB_TRANS_C33_C34__VI = 0x444E; +constexpr unsigned int mmDCP5_CUR2_COLOR1__VI = 0x4475; +constexpr unsigned int mmDCP5_CUR2_COLOR2__VI = 0x4476; +constexpr unsigned int mmDCP5_CUR2_CONTROL__VI = 0x446F; +constexpr unsigned int mmDCP5_CUR2_HOT_SPOT__VI = 0x4474; +constexpr unsigned int mmDCP5_CUR2_POSITION__VI = 0x4473; +constexpr unsigned int mmDCP5_CUR2_SIZE__VI = 0x4471; +constexpr unsigned int mmDCP5_CUR2_STEREO_CONTROL__VI = 0x449B; +constexpr unsigned int mmDCP5_CUR2_SURFACE_ADDRESS__VI = 0x4470; +constexpr unsigned int mmDCP5_CUR2_SURFACE_ADDRESS_HIGH__VI = 0x4472; +constexpr unsigned int mmDCP5_CUR2_UPDATE__VI = 0x4477; +constexpr unsigned int mmDCP5_CUR_COLOR1__VI = 0x446C; +constexpr unsigned int mmDCP5_CUR_COLOR2__VI = 0x446D; +constexpr unsigned int mmDCP5_CUR_CONTROL__VI = 0x4466; +constexpr unsigned int mmDCP5_CUR_HOT_SPOT__VI = 0x446B; +constexpr unsigned int mmDCP5_CUR_POSITION__VI = 0x446A; +constexpr unsigned int mmDCP5_CUR_REQUEST_FILTER_CNTL__VI = 0x4499; +constexpr unsigned int mmDCP5_CUR_SIZE__VI = 0x4468; +constexpr unsigned int mmDCP5_CUR_STEREO_CONTROL__VI = 0x449A; +constexpr unsigned int mmDCP5_CUR_SURFACE_ADDRESS__VI = 0x4467; +constexpr unsigned int mmDCP5_CUR_SURFACE_ADDRESS_HIGH__VI = 0x4469; +constexpr unsigned int mmDCP5_CUR_UPDATE__VI = 0x446E; +constexpr unsigned int mmDCP5_DCP_CRC_CONTROL__VI = 0x4487; +constexpr unsigned int mmDCP5_DCP_CRC_CURRENT__VI = 0x4489; +constexpr unsigned int mmDCP5_DCP_CRC_LAST__VI = 0x448B; +constexpr unsigned int mmDCP5_DCP_CRC_MASK__VI = 0x4488; +constexpr unsigned int mmDCP5_DCP_DEBUG__VI = 0x448D; +constexpr unsigned int mmDCP5_DCP_DEBUG2__VI = 0x4498; +constexpr unsigned int mmDCP5_DCP_FP_CONVERTED_FIELD__VI = 0x4465; +constexpr unsigned int mmDCP5_DCP_GSL_CONTROL__VI = 0x4490; +constexpr unsigned int mmDCP5_DCP_LB_DATA_GAP_BETWEEN_CHUNK__VI = 0x4491; +constexpr unsigned int mmDCP5_DCP_RANDOM_SEEDS__VI = 0x4461; +constexpr unsigned int mmDCP5_DCP_SPATIAL_DITHER_CNTL__VI = 0x4460; +constexpr unsigned int mmDCP5_DCP_TEST_DEBUG_DATA__VI = 0x4496; +constexpr unsigned int mmDCP5_DCP_TEST_DEBUG_INDEX__VI = 0x4495; +constexpr unsigned int mmDCP5_DC_LUT_30_COLOR__VI = 0x447C; +constexpr unsigned int mmDCP5_DC_LUT_AUTOFILL__VI = 0x447F; +constexpr unsigned int mmDCP5_DC_LUT_BLACK_OFFSET_BLUE__VI = 0x4481; +constexpr unsigned int mmDCP5_DC_LUT_BLACK_OFFSET_GREEN__VI = 0x4482; +constexpr unsigned int mmDCP5_DC_LUT_BLACK_OFFSET_RED__VI = 0x4483; +constexpr unsigned int mmDCP5_DC_LUT_CONTROL__VI = 0x4480; +constexpr unsigned int mmDCP5_DC_LUT_PWL_DATA__VI = 0x447B; +constexpr unsigned int mmDCP5_DC_LUT_RW_INDEX__VI = 0x4479; +constexpr unsigned int mmDCP5_DC_LUT_RW_MODE__VI = 0x4478; +constexpr unsigned int mmDCP5_DC_LUT_SEQ_COLOR__VI = 0x447A; +constexpr unsigned int mmDCP5_DC_LUT_VGA_ACCESS_ENABLE__VI = 0x447D; +constexpr unsigned int mmDCP5_DC_LUT_WHITE_OFFSET_BLUE__VI = 0x4484; +constexpr unsigned int mmDCP5_DC_LUT_WHITE_OFFSET_GREEN__VI = 0x4485; +constexpr unsigned int mmDCP5_DC_LUT_WHITE_OFFSET_RED__VI = 0x4486; +constexpr unsigned int mmDCP5_DC_LUT_WRITE_EN_MASK__VI = 0x447E; +constexpr unsigned int mmDCP5_DEGAMMA_CONTROL__VI = 0x4458; +constexpr unsigned int mmDCP5_DENORM_CONTROL__VI = 0x4450; +constexpr unsigned int mmDCP5_GAMUT_REMAP_C11_C12__VI = 0x445A; +constexpr unsigned int mmDCP5_GAMUT_REMAP_C13_C14__VI = 0x445B; +constexpr unsigned int mmDCP5_GAMUT_REMAP_C21_C22__VI = 0x445C; +constexpr unsigned int mmDCP5_GAMUT_REMAP_C23_C24__VI = 0x445D; +constexpr unsigned int mmDCP5_GAMUT_REMAP_C31_C32__VI = 0x445E; +constexpr unsigned int mmDCP5_GAMUT_REMAP_C33_C34__VI = 0x445F; +constexpr unsigned int mmDCP5_GAMUT_REMAP_CONTROL__VI = 0x4459; +constexpr unsigned int mmDCP5_GRPH_COMPRESS_PITCH__VI = 0x441A; +constexpr unsigned int mmDCP5_GRPH_COMPRESS_SURFACE_ADDRESS__VI = 0x4419; +constexpr unsigned int mmDCP5_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__VI = 0x441B; +constexpr unsigned int mmDCP5_GRPH_CONTROL__SI__CI = 0x4901; +constexpr unsigned int mmDCP5_GRPH_CONTROL__VI = 0x4401; +constexpr unsigned int mmDCP5_GRPH_DFQ_CONTROL__VI = 0x4414; +constexpr unsigned int mmDCP5_GRPH_DFQ_STATUS__VI = 0x4415; +constexpr unsigned int mmDCP5_GRPH_ENABLE__VI = 0x4400; +constexpr unsigned int mmDCP5_GRPH_FLIP_CONTROL__SI__CI = 0x4912; +constexpr unsigned int mmDCP5_GRPH_FLIP_CONTROL__VI = 0x4412; +constexpr unsigned int mmDCP5_GRPH_FLIP_RATE_CNTL__VI = 0x448E; +constexpr unsigned int mmDCP5_GRPH_INTERRUPT_CONTROL__VI = 0x4417; +constexpr unsigned int mmDCP5_GRPH_INTERRUPT_STATUS__VI = 0x4416; +constexpr unsigned int mmDCP5_GRPH_LUT_10BIT_BYPASS__VI = 0x4402; +constexpr unsigned int mmDCP5_GRPH_PITCH__SI__CI = 0x4906; +constexpr unsigned int mmDCP5_GRPH_PITCH__VI = 0x4406; +constexpr unsigned int mmDCP5_GRPH_PRIMARY_SURFACE_ADDRESS__SI__CI = 0x4904; +constexpr unsigned int mmDCP5_GRPH_PRIMARY_SURFACE_ADDRESS__VI = 0x4404; +constexpr unsigned int mmDCP5_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__VI = 0x4407; +constexpr unsigned int mmDCP5_GRPH_SECONDARY_SURFACE_ADDRESS__VI = 0x4405; +constexpr unsigned int mmDCP5_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x4408; +constexpr unsigned int mmDCP5_GRPH_STEREOSYNC_FLIP__VI = 0x4497; +constexpr unsigned int mmDCP5_GRPH_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x4418; +constexpr unsigned int mmDCP5_GRPH_SURFACE_ADDRESS_INUSE__VI = 0x4413; +constexpr unsigned int mmDCP5_GRPH_SURFACE_OFFSET_X__VI = 0x4409; +constexpr unsigned int mmDCP5_GRPH_SURFACE_OFFSET_Y__VI = 0x440A; +constexpr unsigned int mmDCP5_GRPH_SWAP_CNTL__VI = 0x4403; +constexpr unsigned int mmDCP5_GRPH_UPDATE__SI__CI = 0x4911; +constexpr unsigned int mmDCP5_GRPH_UPDATE__VI = 0x4411; +constexpr unsigned int mmDCP5_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x449F; +constexpr unsigned int mmDCP5_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x44BF; +constexpr unsigned int mmDCP5_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x44BD; +constexpr unsigned int mmDCP5_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x44BE; +constexpr unsigned int mmDCP5_GRPH_X_END__VI = 0x440D; +constexpr unsigned int mmDCP5_GRPH_X_START__VI = 0x440B; +constexpr unsigned int mmDCP5_GRPH_Y_END__VI = 0x440E; +constexpr unsigned int mmDCP5_GRPH_Y_START__VI = 0x440C; +constexpr unsigned int mmDCP5_HW_ROTATION__VI = 0x449E; +constexpr unsigned int mmDCP5_INPUT_CSC_C11_C12__VI = 0x4436; +constexpr unsigned int mmDCP5_INPUT_CSC_C13_C14__VI = 0x4437; +constexpr unsigned int mmDCP5_INPUT_CSC_C21_C22__VI = 0x4438; +constexpr unsigned int mmDCP5_INPUT_CSC_C23_C24__VI = 0x4439; +constexpr unsigned int mmDCP5_INPUT_CSC_C31_C32__VI = 0x443A; +constexpr unsigned int mmDCP5_INPUT_CSC_C33_C34__VI = 0x443B; +constexpr unsigned int mmDCP5_INPUT_CSC_CONTROL__VI = 0x4435; +constexpr unsigned int mmDCP5_INPUT_GAMMA_CONTROL__VI = 0x4410; +constexpr unsigned int mmDCP5_KEY_CONTROL__VI = 0x4453; +constexpr unsigned int mmDCP5_KEY_RANGE_ALPHA__VI = 0x4454; +constexpr unsigned int mmDCP5_KEY_RANGE_BLUE__VI = 0x4457; +constexpr unsigned int mmDCP5_KEY_RANGE_GREEN__VI = 0x4456; +constexpr unsigned int mmDCP5_KEY_RANGE_RED__VI = 0x4455; +constexpr unsigned int mmDCP5_OUTPUT_CSC_C11_C12__VI = 0x443D; +constexpr unsigned int mmDCP5_OUTPUT_CSC_C13_C14__VI = 0x443E; +constexpr unsigned int mmDCP5_OUTPUT_CSC_C21_C22__VI = 0x443F; +constexpr unsigned int mmDCP5_OUTPUT_CSC_C23_C24__VI = 0x4440; +constexpr unsigned int mmDCP5_OUTPUT_CSC_C31_C32__VI = 0x4441; +constexpr unsigned int mmDCP5_OUTPUT_CSC_C33_C34__VI = 0x4442; +constexpr unsigned int mmDCP5_OUTPUT_CSC_CONTROL__VI = 0x443C; +constexpr unsigned int mmDCP5_OUT_CLAMP_CONTROL_B_CB__VI = 0x449D; +constexpr unsigned int mmDCP5_OUT_CLAMP_CONTROL_G_Y__VI = 0x449C; +constexpr unsigned int mmDCP5_OUT_CLAMP_CONTROL_R_CR__VI = 0x4452; +constexpr unsigned int mmDCP5_OUT_ROUND_CONTROL__VI = 0x4451; +constexpr unsigned int mmDCP5_OVLSCL_EDGE_PIXEL_CNTL__VI = 0x442C; +constexpr unsigned int mmDCP5_OVL_CONTROL1__VI = 0x441D; +constexpr unsigned int mmDCP5_OVL_CONTROL2__VI = 0x441E; +constexpr unsigned int mmDCP5_OVL_DFQ_CONTROL__VI = 0x4429; +constexpr unsigned int mmDCP5_OVL_DFQ_STATUS__VI = 0x442A; +constexpr unsigned int mmDCP5_OVL_ENABLE__VI = 0x441C; +constexpr unsigned int mmDCP5_OVL_END__VI = 0x4426; +constexpr unsigned int mmDCP5_OVL_PITCH__VI = 0x4421; +constexpr unsigned int mmDCP5_OVL_SECONDARY_SURFACE_ADDRESS__VI = 0x4492; +constexpr unsigned int mmDCP5_OVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x4494; +constexpr unsigned int mmDCP5_OVL_START__VI = 0x4425; +constexpr unsigned int mmDCP5_OVL_STEREOSYNC_FLIP__VI = 0x4493; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS__SI__CI = 0x4920; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS__VI = 0x4420; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS_HIGH__VI = 0x4422; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS_HIGH_INUSE__VI = 0x442B; +constexpr unsigned int mmDCP5_OVL_SURFACE_ADDRESS_INUSE__VI = 0x4428; +constexpr unsigned int mmDCP5_OVL_SURFACE_OFFSET_X__VI = 0x4423; +constexpr unsigned int mmDCP5_OVL_SURFACE_OFFSET_Y__VI = 0x4424; +constexpr unsigned int mmDCP5_OVL_SWAP_CNTL__VI = 0x441F; +constexpr unsigned int mmDCP5_OVL_UPDATE__VI = 0x4427; +constexpr unsigned int mmDCP5_PRESCALE_GRPH_CONTROL__VI = 0x442D; +constexpr unsigned int mmDCP5_PRESCALE_OVL_CONTROL__VI = 0x4431; +constexpr unsigned int mmDCP5_PRESCALE_VALUES_GRPH_B__VI = 0x4430; +constexpr unsigned int mmDCP5_PRESCALE_VALUES_GRPH_G__VI = 0x442F; +constexpr unsigned int mmDCP5_PRESCALE_VALUES_GRPH_R__VI = 0x442E; +constexpr unsigned int mmDCP5_PRESCALE_VALUES_OVL_CB__VI = 0x4432; +constexpr unsigned int mmDCP5_PRESCALE_VALUES_OVL_CR__VI = 0x4434; +constexpr unsigned int mmDCP5_PRESCALE_VALUES_OVL_Y__VI = 0x4433; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_END_CNTL1__VI = 0x44A6; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_END_CNTL2__VI = 0x44A7; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_0_1__VI = 0x44A8; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_10_11__VI = 0x44AD; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_12_13__VI = 0x44AE; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_14_15__VI = 0x44AF; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_2_3__VI = 0x44A9; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_4_5__VI = 0x44AA; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_6_7__VI = 0x44AB; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_REGION_8_9__VI = 0x44AC; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_SLOPE_CNTL__VI = 0x44A5; +constexpr unsigned int mmDCP5_REGAMMA_CNTLA_START_CNTL__VI = 0x44A4; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_END_CNTL1__VI = 0x44B2; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_END_CNTL2__VI = 0x44B3; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_0_1__VI = 0x44B4; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_10_11__VI = 0x44B9; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_12_13__VI = 0x44BA; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_14_15__VI = 0x44BB; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_2_3__VI = 0x44B5; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_4_5__VI = 0x44B6; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_6_7__VI = 0x44B7; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_REGION_8_9__VI = 0x44B8; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_SLOPE_CNTL__VI = 0x44B1; +constexpr unsigned int mmDCP5_REGAMMA_CNTLB_START_CNTL__VI = 0x44B0; +constexpr unsigned int mmDCP5_REGAMMA_CONTROL__VI = 0x44A0; +constexpr unsigned int mmDCP5_REGAMMA_LUT_DATA__VI = 0x44A2; +constexpr unsigned int mmDCP5_REGAMMA_LUT_INDEX__VI = 0x44A1; +constexpr unsigned int mmDCP5_REGAMMA_LUT_WRITE_EN_MASK__VI = 0x44A3; +constexpr unsigned int mmDCPG_TEST_DEBUG_DATA__VI = 0x02D7; +constexpr unsigned int mmDCPG_TEST_DEBUG_INDEX__VI = 0x02D6; +constexpr unsigned int mmDCP_DEBUG2__VI = 0x1A98; +constexpr unsigned int mmDCP_FP_CONVERTED_FIELD__VI = 0x1A65; +constexpr unsigned int mmDCP_GSL_CONTROL__VI = 0x1A90; +constexpr unsigned int mmDCP_RANDOM_SEEDS__VI = 0x1A61; +constexpr unsigned int mmDCP_SPATIAL_DITHER_CNTL__VI = 0x1A60; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED0__VI = 0x5A84; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED1__VI = 0x5A85; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED10__VI = 0x5A8E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED100__VI = 0x5AE8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED101__VI = 0x5AE9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED102__VI = 0x5AEA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED103__VI = 0x5AEB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED104__VI = 0x5AEC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED105__VI = 0x5AED; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED106__VI = 0x5AEE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED107__VI = 0x5AEF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED108__VI = 0x5AF0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED109__VI = 0x5AF1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED11__VI = 0x5A8F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED110__VI = 0x5AF2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED111__VI = 0x5AF3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED112__VI = 0x5AF4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED113__VI = 0x5AF5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED114__VI = 0x5AF6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED115__VI = 0x5AF7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED116__VI = 0x5AF8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED117__VI = 0x5AF9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED118__VI = 0x5AFA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED119__VI = 0x5AFB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED12__VI = 0x5A90; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED120__VI = 0x5AFC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED121__VI = 0x5AFD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED122__VI = 0x5AFE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED123__VI = 0x5AFF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED124__VI = 0x5B00; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED125__VI = 0x5B01; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED126__VI = 0x5B02; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED127__VI = 0x5B03; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED128__VI = 0x5B04; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED129__VI = 0x5B05; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED13__VI = 0x5A91; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED130__VI = 0x5B06; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED131__VI = 0x5B07; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED132__VI = 0x5B08; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED133__VI = 0x5B09; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED134__VI = 0x5B0A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED135__VI = 0x5B0B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED136__VI = 0x5B0C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED137__VI = 0x5B0D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED138__VI = 0x5B0E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED139__VI = 0x5B0F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED14__VI = 0x5A92; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED140__VI = 0x5B10; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED141__VI = 0x5B11; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED142__VI = 0x5B12; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED143__VI = 0x5B13; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED144__VI = 0x5B14; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED145__VI = 0x5B15; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED146__VI = 0x5B16; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED147__VI = 0x5B17; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED148__VI = 0x5B18; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED149__VI = 0x5B19; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED15__VI = 0x5A93; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED150__VI = 0x5B1A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED151__VI = 0x5B1B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED152__VI = 0x5B1C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED153__VI = 0x5B1D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED154__VI = 0x5B1E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED155__VI = 0x5B1F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED156__VI = 0x5B20; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED157__VI = 0x5B21; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED158__VI = 0x5B22; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED159__VI = 0x5B23; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED16__VI = 0x5A94; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED160__VI = 0x5B24; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED161__VI = 0x5B25; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED162__VI = 0x5B26; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED163__VI = 0x5B27; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED164__VI = 0x5B28; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED165__VI = 0x5B29; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED166__VI = 0x5B2A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED167__VI = 0x5B2B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED168__VI = 0x5B2C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED169__VI = 0x5B2D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED17__VI = 0x5A95; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED170__VI = 0x5B2E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED171__VI = 0x5B2F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED172__VI = 0x5B30; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED173__VI = 0x5B31; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED174__VI = 0x5B32; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED175__VI = 0x5B33; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED176__VI = 0x5B34; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED177__VI = 0x5B35; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED178__VI = 0x5B36; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED179__VI = 0x5B37; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED18__VI = 0x5A96; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED180__VI = 0x5B38; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED181__VI = 0x5B39; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED182__VI = 0x5B3A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED183__VI = 0x5B3B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED184__VI = 0x5B3C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED185__VI = 0x5B3D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED186__VI = 0x5B3E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED187__VI = 0x5B3F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED188__VI = 0x5B40; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED189__VI = 0x5B41; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED19__VI = 0x5A97; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED190__VI = 0x5B42; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED191__VI = 0x5B43; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED192__VI = 0x5B44; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED193__VI = 0x5B45; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED194__VI = 0x5B46; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED195__VI = 0x5B47; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED196__VI = 0x5B48; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED197__VI = 0x5B49; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED198__VI = 0x5B4A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED199__VI = 0x5B4B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED2__VI = 0x5A86; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED20__VI = 0x5A98; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED200__VI = 0x5B4C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED201__VI = 0x5B4D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED202__VI = 0x5B4E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED203__VI = 0x5B4F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED204__VI = 0x5B50; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED205__VI = 0x5B51; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED206__VI = 0x5B52; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED207__VI = 0x5B53; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED208__VI = 0x5B54; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED209__VI = 0x5B55; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED21__VI = 0x5A99; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED210__VI = 0x5B56; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED211__VI = 0x5B57; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED212__VI = 0x5B58; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED213__VI = 0x5B59; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED214__VI = 0x5B5A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED215__VI = 0x5B5B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED216__VI = 0x5B5C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED217__VI = 0x5B5D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED218__VI = 0x5B5E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED219__VI = 0x5B5F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED22__VI = 0x5A9A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED220__VI = 0x5B60; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED221__VI = 0x5B61; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED222__VI = 0x5B62; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED223__VI = 0x5B63; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED224__VI = 0x5B64; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED225__VI = 0x5B65; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED226__VI = 0x5B66; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED227__VI = 0x5B67; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED228__VI = 0x5B68; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED229__VI = 0x5B69; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED23__VI = 0x5A9B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED230__VI = 0x5B6A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED231__VI = 0x5B6B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED232__VI = 0x5B6C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED233__VI = 0x5B6D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED234__VI = 0x5B6E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED235__VI = 0x5B6F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED236__VI = 0x5B70; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED237__VI = 0x5B71; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED238__VI = 0x5B72; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED239__VI = 0x5B73; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED24__VI = 0x5A9C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED240__VI = 0x5B74; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED241__VI = 0x5B75; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED242__VI = 0x5B76; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED243__VI = 0x5B77; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED244__VI = 0x5B78; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED245__VI = 0x5B79; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED246__VI = 0x5B7A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED247__VI = 0x5B7B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED248__VI = 0x5B7C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED249__VI = 0x5B7D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED25__VI = 0x5A9D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED250__VI = 0x5B7E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED251__VI = 0x5B7F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED252__VI = 0x5B80; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED253__VI = 0x5B81; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED254__VI = 0x5B82; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED255__VI = 0x5B83; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED256__VI = 0x5B84; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED257__VI = 0x5B85; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED258__VI = 0x5B86; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED259__VI = 0x5B87; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED26__VI = 0x5A9E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED260__VI = 0x5B88; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED261__VI = 0x5B89; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED262__VI = 0x5B8A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED263__VI = 0x5B8B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED264__VI = 0x5B8C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED265__VI = 0x5B8D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED266__VI = 0x5B8E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED267__VI = 0x5B8F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED268__VI = 0x5B90; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED269__VI = 0x5B91; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED27__VI = 0x5A9F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED270__VI = 0x5B92; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED271__VI = 0x5B93; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED272__VI = 0x5B94; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED273__VI = 0x5B95; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED274__VI = 0x5B96; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED275__VI = 0x5B97; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED276__VI = 0x5B98; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED277__VI = 0x5B99; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED278__VI = 0x5B9A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED279__VI = 0x5B9B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED28__VI = 0x5AA0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED280__VI = 0x5B9C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED281__VI = 0x5B9D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED282__VI = 0x5B9E; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED283__VI = 0x5B9F; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED284__VI = 0x5BA0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED285__VI = 0x5BA1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED286__VI = 0x5BA2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED287__VI = 0x5BA3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED288__VI = 0x5BA4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED289__VI = 0x5BA5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED29__VI = 0x5AA1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED290__VI = 0x5BA6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED291__VI = 0x5BA7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED292__VI = 0x5BA8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED293__VI = 0x5BA9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED294__VI = 0x5BAA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED295__VI = 0x5BAB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED296__VI = 0x5BAC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED297__VI = 0x5BAD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED298__VI = 0x5BAE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED299__VI = 0x5BAF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED3__VI = 0x5A87; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED30__VI = 0x5AA2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED300__VI = 0x5BB0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED301__VI = 0x5BB1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED302__VI = 0x5BB2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED303__VI = 0x5BB3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED304__VI = 0x5BB4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED305__VI = 0x5BB5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED306__VI = 0x5BB6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED307__VI = 0x5BB7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED308__VI = 0x5BB8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED309__VI = 0x5BB9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED31__VI = 0x5AA3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED310__VI = 0x5BBA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED311__VI = 0x5BBB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED312__VI = 0x5BBC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED313__VI = 0x5BBD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED314__VI = 0x5BBE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED315__VI = 0x5BBF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED316__VI = 0x5BC0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED317__VI = 0x5BC1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED318__VI = 0x5BC2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED319__VI = 0x5BC3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED32__VI = 0x5AA4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED320__VI = 0x5BC4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED321__VI = 0x5BC5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED322__VI = 0x5BC6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED323__VI = 0x5BC7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED324__VI = 0x5BC8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED325__VI = 0x5BC9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED326__VI = 0x5BCA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED327__VI = 0x5BCB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED328__VI = 0x5BCC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED329__VI = 0x5BCD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED33__VI = 0x5AA5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED330__VI = 0x5BCE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED331__VI = 0x5BCF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED332__VI = 0x5BD0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED333__VI = 0x5BD1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED334__VI = 0x5BD2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED335__VI = 0x5BD3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED336__VI = 0x5BD4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED337__VI = 0x5BD5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED338__VI = 0x5BD6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED339__VI = 0x5BD7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED34__VI = 0x5AA6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED340__VI = 0x5BD8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED341__VI = 0x5BD9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED342__VI = 0x5BDA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED343__VI = 0x5BDB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED344__VI = 0x5BDC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED345__VI = 0x5BDD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED346__VI = 0x5BDE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED347__VI = 0x5BDF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED348__VI = 0x5BE0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED349__VI = 0x5BE1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED35__VI = 0x5AA7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED350__VI = 0x5BE2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED351__VI = 0x5BE3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED352__VI = 0x5BE4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED353__VI = 0x5BE5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED354__VI = 0x5BE6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED355__VI = 0x5BE7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED356__VI = 0x5BE8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED357__VI = 0x5BE9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED358__VI = 0x5BEA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED359__VI = 0x5BEB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED36__VI = 0x5AA8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED360__VI = 0x5BEC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED361__VI = 0x5BED; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED362__VI = 0x5BEE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED363__VI = 0x5BEF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED364__VI = 0x5BF0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED365__VI = 0x5BF1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED366__VI = 0x5BF2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED367__VI = 0x5BF3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED368__VI = 0x5BF4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED369__VI = 0x5BF5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED37__VI = 0x5AA9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED370__VI = 0x5BF6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED371__VI = 0x5BF7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED372__VI = 0x5BF8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED373__VI = 0x5BF9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED374__VI = 0x5BFA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED375__VI = 0x5BFB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED376__VI = 0x5BFC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED377__VI = 0x5BFD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED378__VI = 0x5BFE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED379__VI = 0x5BFF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED38__VI = 0x5AAA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED39__VI = 0x5AAB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED4__VI = 0x5A88; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED40__VI = 0x5AAC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED41__VI = 0x5AAD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED42__VI = 0x5AAE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED43__VI = 0x5AAF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED44__VI = 0x5AB0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED45__VI = 0x5AB1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED46__VI = 0x5AB2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED47__VI = 0x5AB3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED48__VI = 0x5AB4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED49__VI = 0x5AB5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED5__VI = 0x5A89; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED50__VI = 0x5AB6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED51__VI = 0x5AB7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED52__VI = 0x5AB8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED53__VI = 0x5AB9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED54__VI = 0x5ABA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED55__VI = 0x5ABB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED56__VI = 0x5ABC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED57__VI = 0x5ABD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED58__VI = 0x5ABE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED59__VI = 0x5ABF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED6__VI = 0x5A8A; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED60__VI = 0x5AC0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED61__VI = 0x5AC1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED62__VI = 0x5AC2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED63__VI = 0x5AC3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED64__VI = 0x5AC4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED65__VI = 0x5AC5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED66__VI = 0x5AC6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED67__VI = 0x5AC7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED68__VI = 0x5AC8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED69__VI = 0x5AC9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED7__VI = 0x5A8B; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED70__VI = 0x5ACA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED71__VI = 0x5ACB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED72__VI = 0x5ACC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED73__VI = 0x5ACD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED74__VI = 0x5ACE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED75__VI = 0x5ACF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED76__VI = 0x5AD0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED77__VI = 0x5AD1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED78__VI = 0x5AD2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED79__VI = 0x5AD3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED8__VI = 0x5A8C; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED80__VI = 0x5AD4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED81__VI = 0x5AD5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED82__VI = 0x5AD6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED83__VI = 0x5AD7; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED84__VI = 0x5AD8; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED85__VI = 0x5AD9; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED86__VI = 0x5ADA; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED87__VI = 0x5ADB; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED88__VI = 0x5ADC; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED89__VI = 0x5ADD; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED9__VI = 0x5A8D; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED90__VI = 0x5ADE; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED91__VI = 0x5ADF; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED92__VI = 0x5AE0; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED93__VI = 0x5AE1; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED94__VI = 0x5AE2; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED95__VI = 0x5AE3; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED96__VI = 0x5AE4; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED97__VI = 0x5AE5; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED98__VI = 0x5AE6; +constexpr unsigned int mmDCRX_PHY_MACRO_CNTL_RESERVED99__VI = 0x5AE7; +constexpr unsigned int mmDC_ABM1_OVERSCAN_PIXEL_VALUE__VI = 0x169B; +constexpr unsigned int mmDC_DVODATA_CONFIG__VI = 0x481A; +constexpr unsigned int mmDC_GENERICA__VI = 0x4800; +constexpr unsigned int mmDC_GENERICB__VI = 0x4801; +constexpr unsigned int mmDC_GPIO_DDC1_A__VI = 0x4869; +constexpr unsigned int mmDC_GPIO_DDC1_EN__VI = 0x486A; +constexpr unsigned int mmDC_GPIO_DDC1_MASK__VI = 0x4868; +constexpr unsigned int mmDC_GPIO_DDC1_Y__VI = 0x486B; +constexpr unsigned int mmDC_GPIO_DDC2_A__VI = 0x486D; +constexpr unsigned int mmDC_GPIO_DDC2_EN__VI = 0x486E; +constexpr unsigned int mmDC_GPIO_DDC2_MASK__VI = 0x486C; +constexpr unsigned int mmDC_GPIO_DDC2_Y__VI = 0x486F; +constexpr unsigned int mmDC_GPIO_DDC3_A__VI = 0x4871; +constexpr unsigned int mmDC_GPIO_DDC3_EN__VI = 0x4872; +constexpr unsigned int mmDC_GPIO_DDC3_MASK__VI = 0x4870; +constexpr unsigned int mmDC_GPIO_DDC3_Y__VI = 0x4873; +constexpr unsigned int mmDC_GPIO_DDC4_A__VI = 0x4875; +constexpr unsigned int mmDC_GPIO_DDC4_EN__VI = 0x4876; +constexpr unsigned int mmDC_GPIO_DDC4_MASK__VI = 0x4874; +constexpr unsigned int mmDC_GPIO_DDC4_Y__VI = 0x4877; +constexpr unsigned int mmDC_GPIO_DDC5_A__VI = 0x4879; +constexpr unsigned int mmDC_GPIO_DDC5_EN__VI = 0x487A; +constexpr unsigned int mmDC_GPIO_DDC5_MASK__VI = 0x4878; +constexpr unsigned int mmDC_GPIO_DDC5_Y__VI = 0x487B; +constexpr unsigned int mmDC_GPIO_DDC6_A__VI = 0x487D; +constexpr unsigned int mmDC_GPIO_DDC6_EN__VI = 0x487E; +constexpr unsigned int mmDC_GPIO_DDC6_MASK__VI = 0x487C; +constexpr unsigned int mmDC_GPIO_DDC6_Y__VI = 0x487F; +constexpr unsigned int mmDC_GPIO_DDCVGA_A__VI = 0x4881; +constexpr unsigned int mmDC_GPIO_DDCVGA_EN__VI = 0x4882; +constexpr unsigned int mmDC_GPIO_DDCVGA_MASK__VI = 0x4880; +constexpr unsigned int mmDC_GPIO_DDCVGA_Y__VI = 0x4883; +constexpr unsigned int mmDC_GPIO_DEBUG__VI = 0x4804; +constexpr unsigned int mmDC_GPIO_DVODATA_A__VI = 0x4865; +constexpr unsigned int mmDC_GPIO_DVODATA_EN__VI = 0x4866; +constexpr unsigned int mmDC_GPIO_DVODATA_MASK__VI = 0x4864; +constexpr unsigned int mmDC_GPIO_DVODATA_Y__VI = 0x4867; +constexpr unsigned int mmDC_GPIO_GENERIC_A__VI = 0x4861; +constexpr unsigned int mmDC_GPIO_GENERIC_EN__VI = 0x4862; +constexpr unsigned int mmDC_GPIO_GENERIC_MASK__VI = 0x4860; +constexpr unsigned int mmDC_GPIO_GENERIC_Y__VI = 0x4863; +constexpr unsigned int mmDC_GPIO_GENLK_A__VI = 0x4889; +constexpr unsigned int mmDC_GPIO_GENLK_EN__VI = 0x488A; +constexpr unsigned int mmDC_GPIO_GENLK_MASK__VI = 0x4888; +constexpr unsigned int mmDC_GPIO_GENLK_Y__VI = 0x488B; +constexpr unsigned int mmDC_GPIO_HPD_A__VI = 0x488D; +constexpr unsigned int mmDC_GPIO_HPD_EN__VI = 0x488E; +constexpr unsigned int mmDC_GPIO_HPD_MASK__VI = 0x488C; +constexpr unsigned int mmDC_GPIO_HPD_Y__VI = 0x488F; +constexpr unsigned int mmDC_GPIO_I2CPAD_A__VI = 0x4899; +constexpr unsigned int mmDC_GPIO_I2CPAD_EN__VI = 0x489A; +constexpr unsigned int mmDC_GPIO_I2CPAD_MASK__VI = 0x4898; +constexpr unsigned int mmDC_GPIO_I2CPAD_STRENGTH__VI = 0x489C; +constexpr unsigned int mmDC_GPIO_I2CPAD_Y__VI = 0x489B; +constexpr unsigned int mmDC_GPIO_PAD_STRENGTH_1__VI = 0x4894; +constexpr unsigned int mmDC_GPIO_PAD_STRENGTH_2__VI = 0x4895; +constexpr unsigned int mmDC_GPIO_PWRSEQ_A__VI = 0x4891; +constexpr unsigned int mmDC_GPIO_PWRSEQ_EN__VI = 0x4892; +constexpr unsigned int mmDC_GPIO_PWRSEQ_MASK__VI = 0x4890; +constexpr unsigned int mmDC_GPIO_PWRSEQ_Y__VI = 0x4893; +constexpr unsigned int mmDC_GPIO_SYNCA_A__VI = 0x4885; +constexpr unsigned int mmDC_GPIO_SYNCA_EN__VI = 0x4886; +constexpr unsigned int mmDC_GPIO_SYNCA_MASK__VI = 0x4884; +constexpr unsigned int mmDC_GPIO_SYNCA_Y__VI = 0x4887; +constexpr unsigned int mmDC_GPU_TIMER_READ__VI = 0x482B; +constexpr unsigned int mmDC_GPU_TIMER_READ_CNTL__VI = 0x482C; +constexpr unsigned int mmDC_GPU_TIMER_START_POSITION_P_FLIP__VI = 0x482A; +constexpr unsigned int mmDC_GPU_TIMER_START_POSITION_V_UPDATE__VI = 0x4829; +constexpr unsigned int mmDC_HPD_CONTROL__VI = 0x189A; +constexpr unsigned int mmDC_HPD_FAST_TRAIN_CNTL__VI = 0x189B; +constexpr unsigned int mmDC_HPD_INT_CONTROL__VI = 0x1899; +constexpr unsigned int mmDC_HPD_INT_STATUS__VI = 0x1898; +constexpr unsigned int mmDC_HPD_TOGGLE_FILT_CNTL__VI = 0x189C; +constexpr unsigned int mmDC_I2C_ARBITRATION__VI = 0x16D5; +constexpr unsigned int mmDC_I2C_CONTROL__VI = 0x16D4; +constexpr unsigned int mmDC_I2C_DATA__VI = 0x16EE; +constexpr unsigned int mmDC_I2C_DDC1_HW_STATUS__VI = 0x16D8; +constexpr unsigned int mmDC_I2C_DDC1_SETUP__VI = 0x16DF; +constexpr unsigned int mmDC_I2C_DDC1_SPEED__VI = 0x16DE; +constexpr unsigned int mmDC_I2C_DDC2_HW_STATUS__VI = 0x16D9; +constexpr unsigned int mmDC_I2C_DDC2_SETUP__VI = 0x16E1; +constexpr unsigned int mmDC_I2C_DDC2_SPEED__VI = 0x16E0; +constexpr unsigned int mmDC_I2C_DDC3_HW_STATUS__VI = 0x16DA; +constexpr unsigned int mmDC_I2C_DDC3_SETUP__VI = 0x16E3; +constexpr unsigned int mmDC_I2C_DDC3_SPEED__VI = 0x16E2; +constexpr unsigned int mmDC_I2C_DDC4_HW_STATUS__VI = 0x16DB; +constexpr unsigned int mmDC_I2C_DDC4_SETUP__VI = 0x16E5; +constexpr unsigned int mmDC_I2C_DDC4_SPEED__VI = 0x16E4; +constexpr unsigned int mmDC_I2C_DDC5_HW_STATUS__VI = 0x16DC; +constexpr unsigned int mmDC_I2C_DDC5_SETUP__VI = 0x16E7; +constexpr unsigned int mmDC_I2C_DDC5_SPEED__VI = 0x16E6; +constexpr unsigned int mmDC_I2C_DDC6_HW_STATUS__VI = 0x16DD; +constexpr unsigned int mmDC_I2C_DDC6_SETUP__VI = 0x16E9; +constexpr unsigned int mmDC_I2C_DDC6_SPEED__VI = 0x16E8; +constexpr unsigned int mmDC_I2C_DDCVGA_HW_STATUS__VI = 0x16EF; +constexpr unsigned int mmDC_I2C_DDCVGA_SETUP__VI = 0x16F1; +constexpr unsigned int mmDC_I2C_DDCVGA_SPEED__VI = 0x16F0; +constexpr unsigned int mmDC_I2C_EDID_DETECT_CTRL__VI = 0x16F2; +constexpr unsigned int mmDC_I2C_INTERRUPT_CONTROL__VI = 0x16D6; +constexpr unsigned int mmDC_I2C_SW_STATUS__VI = 0x16D7; +constexpr unsigned int mmDC_I2C_TRANSACTION0__VI = 0x16EA; +constexpr unsigned int mmDC_I2C_TRANSACTION1__VI = 0x16EB; +constexpr unsigned int mmDC_I2C_TRANSACTION2__VI = 0x16EC; +constexpr unsigned int mmDC_I2C_TRANSACTION3__VI = 0x16ED; +constexpr unsigned int mmDC_IP_REQUEST_CNTL__VI = 0x02D2; +constexpr unsigned int mmDC_LUT_VGA_ACCESS_ENABLE__VI = 0x1A7D; +constexpr unsigned int mmDC_MEM_GLOBAL_PWR_REQ_CNTL__VI = 0x0132; +constexpr unsigned int mmDC_MVP_LB_CONTROL__VI = 0x1AE3; +constexpr unsigned int mmDC_PAD_EXTERN_SIG__VI = 0x4802; +constexpr unsigned int mmDC_PERFMON0_PERFCOUNTER_CNTL__VI = 0x0170; +constexpr unsigned int mmDC_PERFMON0_PERFCOUNTER_STATE__VI = 0x0171; +constexpr unsigned int mmDC_PERFMON0_PERFMON_CNTL__VI = 0x0173; +constexpr unsigned int mmDC_PERFMON0_PERFMON_CNTL2__VI = 0x017A; +constexpr unsigned int mmDC_PERFMON0_PERFMON_CVALUE_INT_MISC__VI = 0x0172; +constexpr unsigned int mmDC_PERFMON0_PERFMON_CVALUE_LOW__VI = 0x0174; +constexpr unsigned int mmDC_PERFMON0_PERFMON_HI__VI = 0x0175; +constexpr unsigned int mmDC_PERFMON0_PERFMON_LOW__VI = 0x0176; +constexpr unsigned int mmDC_PERFMON0_PERFMON_TEST_DEBUG_DATA__VI = 0x0178; +constexpr unsigned int mmDC_PERFMON0_PERFMON_TEST_DEBUG_INDEX__VI = 0x0177; +constexpr unsigned int mmDC_PERFMON10_PERFCOUNTER_CNTL__VI = 0x59A0; +constexpr unsigned int mmDC_PERFMON10_PERFCOUNTER_STATE__VI = 0x59A1; +constexpr unsigned int mmDC_PERFMON10_PERFMON_CNTL__VI = 0x59A3; +constexpr unsigned int mmDC_PERFMON10_PERFMON_CNTL2__VI = 0x59AA; +constexpr unsigned int mmDC_PERFMON10_PERFMON_CVALUE_INT_MISC__VI = 0x59A2; +constexpr unsigned int mmDC_PERFMON10_PERFMON_CVALUE_LOW__VI = 0x59A4; +constexpr unsigned int mmDC_PERFMON10_PERFMON_HI__VI = 0x59A5; +constexpr unsigned int mmDC_PERFMON10_PERFMON_LOW__VI = 0x59A6; +constexpr unsigned int mmDC_PERFMON10_PERFMON_TEST_DEBUG_DATA__VI = 0x59A8; +constexpr unsigned int mmDC_PERFMON10_PERFMON_TEST_DEBUG_INDEX__VI = 0x59A7; +constexpr unsigned int mmDC_PERFMON11_PERFCOUNTER_CNTL__VI = 0x4724; +constexpr unsigned int mmDC_PERFMON11_PERFCOUNTER_STATE__VI = 0x4725; +constexpr unsigned int mmDC_PERFMON11_PERFMON_CNTL__VI = 0x4727; +constexpr unsigned int mmDC_PERFMON11_PERFMON_CNTL2__VI = 0x472E; +constexpr unsigned int mmDC_PERFMON11_PERFMON_CVALUE_INT_MISC__VI = 0x4726; +constexpr unsigned int mmDC_PERFMON11_PERFMON_CVALUE_LOW__VI = 0x4728; +constexpr unsigned int mmDC_PERFMON11_PERFMON_HI__VI = 0x4729; +constexpr unsigned int mmDC_PERFMON11_PERFMON_LOW__VI = 0x472A; +constexpr unsigned int mmDC_PERFMON11_PERFMON_TEST_DEBUG_DATA__VI = 0x472C; +constexpr unsigned int mmDC_PERFMON11_PERFMON_TEST_DEBUG_INDEX__VI = 0x472B; +constexpr unsigned int mmDC_PERFMON1_PERFCOUNTER_CNTL__VI = 0x0364; +constexpr unsigned int mmDC_PERFMON1_PERFCOUNTER_STATE__VI = 0x0365; +constexpr unsigned int mmDC_PERFMON1_PERFMON_CNTL__VI = 0x0367; +constexpr unsigned int mmDC_PERFMON1_PERFMON_CNTL2__VI = 0x036E; +constexpr unsigned int mmDC_PERFMON1_PERFMON_CVALUE_INT_MISC__VI = 0x0366; +constexpr unsigned int mmDC_PERFMON1_PERFMON_CVALUE_LOW__VI = 0x0368; +constexpr unsigned int mmDC_PERFMON1_PERFMON_HI__VI = 0x0369; +constexpr unsigned int mmDC_PERFMON1_PERFMON_LOW__VI = 0x036A; +constexpr unsigned int mmDC_PERFMON1_PERFMON_TEST_DEBUG_DATA__VI = 0x036C; +constexpr unsigned int mmDC_PERFMON1_PERFMON_TEST_DEBUG_INDEX__VI = 0x036B; +constexpr unsigned int mmDC_PERFMON2_PERFCOUNTER_CNTL__VI = 0x18C8; +constexpr unsigned int mmDC_PERFMON2_PERFCOUNTER_STATE__VI = 0x18C9; +constexpr unsigned int mmDC_PERFMON2_PERFMON_CNTL__VI = 0x18CB; +constexpr unsigned int mmDC_PERFMON2_PERFMON_CNTL2__VI = 0x18D2; +constexpr unsigned int mmDC_PERFMON2_PERFMON_CVALUE_INT_MISC__VI = 0x18CA; +constexpr unsigned int mmDC_PERFMON2_PERFMON_CVALUE_LOW__VI = 0x18CC; +constexpr unsigned int mmDC_PERFMON2_PERFMON_HI__VI = 0x18CD; +constexpr unsigned int mmDC_PERFMON2_PERFMON_LOW__VI = 0x18CE; +constexpr unsigned int mmDC_PERFMON2_PERFMON_TEST_DEBUG_DATA__VI = 0x18D0; +constexpr unsigned int mmDC_PERFMON2_PERFMON_TEST_DEBUG_INDEX__VI = 0x18CF; +constexpr unsigned int mmDC_PERFMON3_PERFCOUNTER_CNTL__VI = 0x1B24; +constexpr unsigned int mmDC_PERFMON3_PERFCOUNTER_STATE__VI = 0x1B25; +constexpr unsigned int mmDC_PERFMON3_PERFMON_CNTL__VI = 0x1B27; +constexpr unsigned int mmDC_PERFMON3_PERFMON_CNTL2__VI = 0x1B2E; +constexpr unsigned int mmDC_PERFMON3_PERFMON_CVALUE_INT_MISC__VI = 0x1B26; +constexpr unsigned int mmDC_PERFMON3_PERFMON_CVALUE_LOW__VI = 0x1B28; +constexpr unsigned int mmDC_PERFMON3_PERFMON_HI__VI = 0x1B29; +constexpr unsigned int mmDC_PERFMON3_PERFMON_LOW__VI = 0x1B2A; +constexpr unsigned int mmDC_PERFMON3_PERFMON_TEST_DEBUG_DATA__VI = 0x1B2C; +constexpr unsigned int mmDC_PERFMON3_PERFMON_TEST_DEBUG_INDEX__VI = 0x1B2B; +constexpr unsigned int mmDC_PERFMON4_PERFCOUNTER_CNTL__VI = 0x1D24; +constexpr unsigned int mmDC_PERFMON4_PERFCOUNTER_STATE__VI = 0x1D25; +constexpr unsigned int mmDC_PERFMON4_PERFMON_CNTL__VI = 0x1D27; +constexpr unsigned int mmDC_PERFMON4_PERFMON_CNTL2__VI = 0x1D2E; +constexpr unsigned int mmDC_PERFMON4_PERFMON_CVALUE_INT_MISC__VI = 0x1D26; +constexpr unsigned int mmDC_PERFMON4_PERFMON_CVALUE_LOW__VI = 0x1D28; +constexpr unsigned int mmDC_PERFMON4_PERFMON_HI__VI = 0x1D29; +constexpr unsigned int mmDC_PERFMON4_PERFMON_LOW__VI = 0x1D2A; +constexpr unsigned int mmDC_PERFMON4_PERFMON_TEST_DEBUG_DATA__VI = 0x1D2C; +constexpr unsigned int mmDC_PERFMON4_PERFMON_TEST_DEBUG_INDEX__VI = 0x1D2B; +constexpr unsigned int mmDC_PERFMON5_PERFCOUNTER_CNTL__VI = 0x1F24; +constexpr unsigned int mmDC_PERFMON5_PERFCOUNTER_STATE__VI = 0x1F25; +constexpr unsigned int mmDC_PERFMON5_PERFMON_CNTL__VI = 0x1F27; +constexpr unsigned int mmDC_PERFMON5_PERFMON_CNTL2__VI = 0x1F2E; +constexpr unsigned int mmDC_PERFMON5_PERFMON_CVALUE_INT_MISC__VI = 0x1F26; +constexpr unsigned int mmDC_PERFMON5_PERFMON_CVALUE_LOW__VI = 0x1F28; +constexpr unsigned int mmDC_PERFMON5_PERFMON_HI__VI = 0x1F29; +constexpr unsigned int mmDC_PERFMON5_PERFMON_LOW__VI = 0x1F2A; +constexpr unsigned int mmDC_PERFMON5_PERFMON_TEST_DEBUG_DATA__VI = 0x1F2C; +constexpr unsigned int mmDC_PERFMON5_PERFMON_TEST_DEBUG_INDEX__VI = 0x1F2B; +constexpr unsigned int mmDC_PERFMON6_PERFCOUNTER_CNTL__VI = 0x4124; +constexpr unsigned int mmDC_PERFMON6_PERFCOUNTER_STATE__VI = 0x4125; +constexpr unsigned int mmDC_PERFMON6_PERFMON_CNTL__VI = 0x4127; +constexpr unsigned int mmDC_PERFMON6_PERFMON_CNTL2__VI = 0x412E; +constexpr unsigned int mmDC_PERFMON6_PERFMON_CVALUE_INT_MISC__VI = 0x4126; +constexpr unsigned int mmDC_PERFMON6_PERFMON_CVALUE_LOW__VI = 0x4128; +constexpr unsigned int mmDC_PERFMON6_PERFMON_HI__VI = 0x4129; +constexpr unsigned int mmDC_PERFMON6_PERFMON_LOW__VI = 0x412A; +constexpr unsigned int mmDC_PERFMON6_PERFMON_TEST_DEBUG_DATA__VI = 0x412C; +constexpr unsigned int mmDC_PERFMON6_PERFMON_TEST_DEBUG_INDEX__VI = 0x412B; +constexpr unsigned int mmDC_PERFMON7_PERFCOUNTER_CNTL__VI = 0x4324; +constexpr unsigned int mmDC_PERFMON7_PERFCOUNTER_STATE__VI = 0x4325; +constexpr unsigned int mmDC_PERFMON7_PERFMON_CNTL__VI = 0x4327; +constexpr unsigned int mmDC_PERFMON7_PERFMON_CNTL2__VI = 0x432E; +constexpr unsigned int mmDC_PERFMON7_PERFMON_CVALUE_INT_MISC__VI = 0x4326; +constexpr unsigned int mmDC_PERFMON7_PERFMON_CVALUE_LOW__VI = 0x4328; +constexpr unsigned int mmDC_PERFMON7_PERFMON_HI__VI = 0x4329; +constexpr unsigned int mmDC_PERFMON7_PERFMON_LOW__VI = 0x432A; +constexpr unsigned int mmDC_PERFMON7_PERFMON_TEST_DEBUG_DATA__VI = 0x432C; +constexpr unsigned int mmDC_PERFMON7_PERFMON_TEST_DEBUG_INDEX__VI = 0x432B; +constexpr unsigned int mmDC_PERFMON8_PERFCOUNTER_CNTL__VI = 0x4524; +constexpr unsigned int mmDC_PERFMON8_PERFCOUNTER_STATE__VI = 0x4525; +constexpr unsigned int mmDC_PERFMON8_PERFMON_CNTL__VI = 0x4527; +constexpr unsigned int mmDC_PERFMON8_PERFMON_CNTL2__VI = 0x452E; +constexpr unsigned int mmDC_PERFMON8_PERFMON_CVALUE_INT_MISC__VI = 0x4526; +constexpr unsigned int mmDC_PERFMON8_PERFMON_CVALUE_LOW__VI = 0x4528; +constexpr unsigned int mmDC_PERFMON8_PERFMON_HI__VI = 0x4529; +constexpr unsigned int mmDC_PERFMON8_PERFMON_LOW__VI = 0x452A; +constexpr unsigned int mmDC_PERFMON8_PERFMON_TEST_DEBUG_DATA__VI = 0x452C; +constexpr unsigned int mmDC_PERFMON8_PERFMON_TEST_DEBUG_INDEX__VI = 0x452B; +constexpr unsigned int mmDC_PERFMON9_PERFCOUNTER_CNTL__VI = 0x5F68; +constexpr unsigned int mmDC_PERFMON9_PERFCOUNTER_STATE__VI = 0x5F69; +constexpr unsigned int mmDC_PERFMON9_PERFMON_CNTL__VI = 0x5F6B; +constexpr unsigned int mmDC_PERFMON9_PERFMON_CNTL2__VI = 0x5F72; +constexpr unsigned int mmDC_PERFMON9_PERFMON_CVALUE_INT_MISC__VI = 0x5F6A; +constexpr unsigned int mmDC_PERFMON9_PERFMON_CVALUE_LOW__VI = 0x5F6C; +constexpr unsigned int mmDC_PERFMON9_PERFMON_HI__VI = 0x5F6D; +constexpr unsigned int mmDC_PERFMON9_PERFMON_LOW__VI = 0x5F6E; +constexpr unsigned int mmDC_PERFMON9_PERFMON_TEST_DEBUG_DATA__VI = 0x5F70; +constexpr unsigned int mmDC_PERFMON9_PERFMON_TEST_DEBUG_INDEX__VI = 0x5F6F; +constexpr unsigned int mmDC_PGCNTL_STATUS_REG__VI = 0x02D5; +constexpr unsigned int mmDC_PGFSM_CONFIG_REG__VI = 0x02D3; +constexpr unsigned int mmDC_PGFSM_WRITE_REG__VI = 0x02D4; +constexpr unsigned int mmDC_PINSTRAPS__VI = 0x4818; +constexpr unsigned int mmDC_REF_CLK_CNTL__VI = 0x4803; +constexpr unsigned int mmDC_TEST_DEBUG_DATA__VI = 0x157D; +constexpr unsigned int mmDC_TEST_DEBUG_INDEX__VI = 0x157C; +constexpr unsigned int mmDEGAMMA_CONTROL__VI = 0x1A58; +constexpr unsigned int mmDENORM_CLAMP_CONTROL__VI = 0x46C3; +constexpr unsigned int mmDENORM_CLAMP_RANGE_B_CB__VI = 0x46C6; +constexpr unsigned int mmDENORM_CLAMP_RANGE_G_Y__VI = 0x46C5; +constexpr unsigned int mmDENORM_CLAMP_RANGE_R_CR__VI = 0x46C4; +constexpr unsigned int mmDENORM_CONTROL__VI = 0x1A50; +constexpr unsigned int mmDENTIST_DISPCLK_CNTL__VI = 0x0124; +constexpr unsigned int mmDIG0_AFMT_60958_0__VI = 0x4A38; +constexpr unsigned int mmDIG0_AFMT_60958_1__VI = 0x4A39; +constexpr unsigned int mmDIG0_AFMT_60958_2__VI = 0x4A3F; +constexpr unsigned int mmDIG0_AFMT_AUDIO_CRC_CONTROL__VI = 0x4A3A; +constexpr unsigned int mmDIG0_AFMT_AUDIO_CRC_RESULT__VI = 0x4A40; +constexpr unsigned int mmDIG0_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4A46; +constexpr unsigned int mmDIG0_AFMT_AUDIO_INFO0__VI = 0x4A36; +constexpr unsigned int mmDIG0_AFMT_AUDIO_INFO1__VI = 0x4A37; +constexpr unsigned int mmDIG0_AFMT_AUDIO_PACKET_CONTROL__VI = 0x4A42; +constexpr unsigned int mmDIG0_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x4A14; +constexpr unsigned int mmDIG0_AFMT_AUDIO_SRC_CONTROL__VI = 0x4A45; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO0__VI = 0x4A1E; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO1__VI = 0x4A1F; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO2__VI = 0x4A20; +constexpr unsigned int mmDIG0_AFMT_AVI_INFO3__VI = 0x4A21; +constexpr unsigned int mmDIG0_AFMT_GENERIC_0__VI = 0x4A25; +constexpr unsigned int mmDIG0_AFMT_GENERIC_1__VI = 0x4A26; +constexpr unsigned int mmDIG0_AFMT_GENERIC_2__VI = 0x4A27; +constexpr unsigned int mmDIG0_AFMT_GENERIC_3__VI = 0x4A28; +constexpr unsigned int mmDIG0_AFMT_GENERIC_4__VI = 0x4A29; +constexpr unsigned int mmDIG0_AFMT_GENERIC_5__VI = 0x4A2A; +constexpr unsigned int mmDIG0_AFMT_GENERIC_6__VI = 0x4A2B; +constexpr unsigned int mmDIG0_AFMT_GENERIC_7__VI = 0x4A2C; +constexpr unsigned int mmDIG0_AFMT_GENERIC_HDR__VI = 0x4A24; +constexpr unsigned int mmDIG0_AFMT_INFOFRAME_CONTROL0__VI = 0x4A44; +constexpr unsigned int mmDIG0_AFMT_ISRC1_0__VI = 0x4A15; +constexpr unsigned int mmDIG0_AFMT_ISRC1_1__VI = 0x4A16; +constexpr unsigned int mmDIG0_AFMT_ISRC1_2__VI = 0x4A17; +constexpr unsigned int mmDIG0_AFMT_ISRC1_3__VI = 0x4A18; +constexpr unsigned int mmDIG0_AFMT_ISRC1_4__VI = 0x4A19; +constexpr unsigned int mmDIG0_AFMT_ISRC2_0__VI = 0x4A1A; +constexpr unsigned int mmDIG0_AFMT_ISRC2_1__VI = 0x4A1B; +constexpr unsigned int mmDIG0_AFMT_ISRC2_2__VI = 0x4A1C; +constexpr unsigned int mmDIG0_AFMT_ISRC2_3__VI = 0x4A1D; +constexpr unsigned int mmDIG0_AFMT_MPEG_INFO0__VI = 0x4A22; +constexpr unsigned int mmDIG0_AFMT_MPEG_INFO1__VI = 0x4A23; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL0__VI = 0x4A3B; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL1__VI = 0x4A3C; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL2__VI = 0x4A3D; +constexpr unsigned int mmDIG0_AFMT_RAMP_CONTROL3__VI = 0x4A3E; +constexpr unsigned int mmDIG0_AFMT_STATUS__VI = 0x4A41; +constexpr unsigned int mmDIG0_AFMT_VBI_PACKET_CONTROL__VI = 0x4A43; +constexpr unsigned int mmDIG0_DIG_BE_CNTL__VI = 0x4A47; +constexpr unsigned int mmDIG0_DIG_BE_EN_CNTL__VI = 0x4A48; +constexpr unsigned int mmDIG0_DIG_CLOCK_PATTERN__VI = 0x4A03; +constexpr unsigned int mmDIG0_DIG_DISPCLK_SWITCH_CNTL__VI = 0x4A07; +constexpr unsigned int mmDIG0_DIG_DISPCLK_SWITCH_STATUS__VI = 0x4A08; +constexpr unsigned int mmDIG0_DIG_FE_CNTL__VI = 0x4A00; +constexpr unsigned int mmDIG0_DIG_FE_TEST_DEBUG_DATA__VI = 0x4A7D; +constexpr unsigned int mmDIG0_DIG_FE_TEST_DEBUG_INDEX__VI = 0x4A7C; +constexpr unsigned int mmDIG0_DIG_FIFO_STATUS__VI = 0x4A06; +constexpr unsigned int mmDIG0_DIG_LANE_ENABLE__VI = 0x4A79; +constexpr unsigned int mmDIG0_DIG_OUTPUT_CRC_CNTL__VI = 0x4A01; +constexpr unsigned int mmDIG0_DIG_OUTPUT_CRC_RESULT__VI = 0x4A02; +constexpr unsigned int mmDIG0_DIG_RANDOM_PATTERN_SEED__VI = 0x4A05; +constexpr unsigned int mmDIG0_DIG_TEST_DEBUG_DATA__VI = 0x4A7B; +constexpr unsigned int mmDIG0_DIG_TEST_DEBUG_INDEX__VI = 0x4A7A; +constexpr unsigned int mmDIG0_DIG_TEST_PATTERN__VI = 0x4A04; +constexpr unsigned int mmDIG0_HDMI_ACR_32_0__VI = 0x4A2E; +constexpr unsigned int mmDIG0_HDMI_ACR_32_1__VI = 0x4A2F; +constexpr unsigned int mmDIG0_HDMI_ACR_44_0__VI = 0x4A30; +constexpr unsigned int mmDIG0_HDMI_ACR_44_1__VI = 0x4A31; +constexpr unsigned int mmDIG0_HDMI_ACR_48_0__VI = 0x4A32; +constexpr unsigned int mmDIG0_HDMI_ACR_48_1__VI = 0x4A33; +constexpr unsigned int mmDIG0_HDMI_ACR_PACKET_CONTROL__VI = 0x4A0C; +constexpr unsigned int mmDIG0_HDMI_ACR_STATUS_0__VI = 0x4A34; +constexpr unsigned int mmDIG0_HDMI_ACR_STATUS_1__VI = 0x4A35; +constexpr unsigned int mmDIG0_HDMI_AUDIO_PACKET_CONTROL__VI = 0x4A0B; +constexpr unsigned int mmDIG0_HDMI_CONTROL__VI = 0x4A09; +constexpr unsigned int mmDIG0_HDMI_GC__VI = 0x4A13; +constexpr unsigned int mmDIG0_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x4A10; +constexpr unsigned int mmDIG0_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x4A2D; +constexpr unsigned int mmDIG0_HDMI_INFOFRAME_CONTROL0__VI = 0x4A0E; +constexpr unsigned int mmDIG0_HDMI_INFOFRAME_CONTROL1__VI = 0x4A0F; +constexpr unsigned int mmDIG0_HDMI_STATUS__VI = 0x4A0A; +constexpr unsigned int mmDIG0_HDMI_VBI_PACKET_CONTROL__VI = 0x4A0D; +constexpr unsigned int mmDIG0_LVDS_DATA_CNTL__VI = 0x4A78; +constexpr unsigned int mmDIG0_TMDS_CNTL__VI = 0x4A6B; +constexpr unsigned int mmDIG0_TMDS_CONTROL0_FEEDBACK__VI = 0x4A6D; +constexpr unsigned int mmDIG0_TMDS_CONTROL_CHAR__VI = 0x4A6C; +constexpr unsigned int mmDIG0_TMDS_CTL0_1_GEN_CNTL__VI = 0x4A75; +constexpr unsigned int mmDIG0_TMDS_CTL2_3_GEN_CNTL__VI = 0x4A76; +constexpr unsigned int mmDIG0_TMDS_CTL_BITS__VI = 0x4A72; +constexpr unsigned int mmDIG0_TMDS_DCBALANCER_CONTROL__VI = 0x4A73; +constexpr unsigned int mmDIG0_TMDS_DEBUG__VI = 0x4A71; +constexpr unsigned int mmDIG0_TMDS_STEREOSYNC_CTL_SEL__VI = 0x4A6E; +constexpr unsigned int mmDIG0_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4A6F; +constexpr unsigned int mmDIG0_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4A70; +constexpr unsigned int mmDIG1_AFMT_60958_0__VI = 0x4B38; +constexpr unsigned int mmDIG1_AFMT_60958_1__VI = 0x4B39; +constexpr unsigned int mmDIG1_AFMT_60958_2__VI = 0x4B3F; +constexpr unsigned int mmDIG1_AFMT_AUDIO_CRC_CONTROL__VI = 0x4B3A; +constexpr unsigned int mmDIG1_AFMT_AUDIO_CRC_RESULT__VI = 0x4B40; +constexpr unsigned int mmDIG1_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4B46; +constexpr unsigned int mmDIG1_AFMT_AUDIO_INFO0__VI = 0x4B36; +constexpr unsigned int mmDIG1_AFMT_AUDIO_INFO1__VI = 0x4B37; +constexpr unsigned int mmDIG1_AFMT_AUDIO_PACKET_CONTROL__VI = 0x4B42; +constexpr unsigned int mmDIG1_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x4B14; +constexpr unsigned int mmDIG1_AFMT_AUDIO_SRC_CONTROL__VI = 0x4B45; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO0__VI = 0x4B1E; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO1__VI = 0x4B1F; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO2__VI = 0x4B20; +constexpr unsigned int mmDIG1_AFMT_AVI_INFO3__VI = 0x4B21; +constexpr unsigned int mmDIG1_AFMT_GENERIC_0__VI = 0x4B25; +constexpr unsigned int mmDIG1_AFMT_GENERIC_1__VI = 0x4B26; +constexpr unsigned int mmDIG1_AFMT_GENERIC_2__VI = 0x4B27; +constexpr unsigned int mmDIG1_AFMT_GENERIC_3__VI = 0x4B28; +constexpr unsigned int mmDIG1_AFMT_GENERIC_4__VI = 0x4B29; +constexpr unsigned int mmDIG1_AFMT_GENERIC_5__VI = 0x4B2A; +constexpr unsigned int mmDIG1_AFMT_GENERIC_6__VI = 0x4B2B; +constexpr unsigned int mmDIG1_AFMT_GENERIC_7__VI = 0x4B2C; +constexpr unsigned int mmDIG1_AFMT_GENERIC_HDR__VI = 0x4B24; +constexpr unsigned int mmDIG1_AFMT_INFOFRAME_CONTROL0__VI = 0x4B44; +constexpr unsigned int mmDIG1_AFMT_ISRC1_0__VI = 0x4B15; +constexpr unsigned int mmDIG1_AFMT_ISRC1_1__VI = 0x4B16; +constexpr unsigned int mmDIG1_AFMT_ISRC1_2__VI = 0x4B17; +constexpr unsigned int mmDIG1_AFMT_ISRC1_3__VI = 0x4B18; +constexpr unsigned int mmDIG1_AFMT_ISRC1_4__VI = 0x4B19; +constexpr unsigned int mmDIG1_AFMT_ISRC2_0__VI = 0x4B1A; +constexpr unsigned int mmDIG1_AFMT_ISRC2_1__VI = 0x4B1B; +constexpr unsigned int mmDIG1_AFMT_ISRC2_2__VI = 0x4B1C; +constexpr unsigned int mmDIG1_AFMT_ISRC2_3__VI = 0x4B1D; +constexpr unsigned int mmDIG1_AFMT_MPEG_INFO0__VI = 0x4B22; +constexpr unsigned int mmDIG1_AFMT_MPEG_INFO1__VI = 0x4B23; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL0__VI = 0x4B3B; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL1__VI = 0x4B3C; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL2__VI = 0x4B3D; +constexpr unsigned int mmDIG1_AFMT_RAMP_CONTROL3__VI = 0x4B3E; +constexpr unsigned int mmDIG1_AFMT_STATUS__VI = 0x4B41; +constexpr unsigned int mmDIG1_AFMT_VBI_PACKET_CONTROL__VI = 0x4B43; +constexpr unsigned int mmDIG1_DIG_BE_CNTL__VI = 0x4B47; +constexpr unsigned int mmDIG1_DIG_BE_EN_CNTL__VI = 0x4B48; +constexpr unsigned int mmDIG1_DIG_CLOCK_PATTERN__VI = 0x4B03; +constexpr unsigned int mmDIG1_DIG_DISPCLK_SWITCH_CNTL__VI = 0x4B07; +constexpr unsigned int mmDIG1_DIG_DISPCLK_SWITCH_STATUS__VI = 0x4B08; +constexpr unsigned int mmDIG1_DIG_FE_CNTL__VI = 0x4B00; +constexpr unsigned int mmDIG1_DIG_FE_TEST_DEBUG_DATA__VI = 0x4B7D; +constexpr unsigned int mmDIG1_DIG_FE_TEST_DEBUG_INDEX__VI = 0x4B7C; +constexpr unsigned int mmDIG1_DIG_FIFO_STATUS__VI = 0x4B06; +constexpr unsigned int mmDIG1_DIG_LANE_ENABLE__VI = 0x4B79; +constexpr unsigned int mmDIG1_DIG_OUTPUT_CRC_CNTL__VI = 0x4B01; +constexpr unsigned int mmDIG1_DIG_OUTPUT_CRC_RESULT__VI = 0x4B02; +constexpr unsigned int mmDIG1_DIG_RANDOM_PATTERN_SEED__VI = 0x4B05; +constexpr unsigned int mmDIG1_DIG_TEST_DEBUG_DATA__VI = 0x4B7B; +constexpr unsigned int mmDIG1_DIG_TEST_DEBUG_INDEX__VI = 0x4B7A; +constexpr unsigned int mmDIG1_DIG_TEST_PATTERN__VI = 0x4B04; +constexpr unsigned int mmDIG1_HDMI_ACR_32_0__VI = 0x4B2E; +constexpr unsigned int mmDIG1_HDMI_ACR_32_1__VI = 0x4B2F; +constexpr unsigned int mmDIG1_HDMI_ACR_44_0__VI = 0x4B30; +constexpr unsigned int mmDIG1_HDMI_ACR_44_1__VI = 0x4B31; +constexpr unsigned int mmDIG1_HDMI_ACR_48_0__VI = 0x4B32; +constexpr unsigned int mmDIG1_HDMI_ACR_48_1__VI = 0x4B33; +constexpr unsigned int mmDIG1_HDMI_ACR_PACKET_CONTROL__VI = 0x4B0C; +constexpr unsigned int mmDIG1_HDMI_ACR_STATUS_0__VI = 0x4B34; +constexpr unsigned int mmDIG1_HDMI_ACR_STATUS_1__VI = 0x4B35; +constexpr unsigned int mmDIG1_HDMI_AUDIO_PACKET_CONTROL__VI = 0x4B0B; +constexpr unsigned int mmDIG1_HDMI_CONTROL__VI = 0x4B09; +constexpr unsigned int mmDIG1_HDMI_GC__VI = 0x4B13; +constexpr unsigned int mmDIG1_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x4B10; +constexpr unsigned int mmDIG1_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x4B2D; +constexpr unsigned int mmDIG1_HDMI_INFOFRAME_CONTROL0__VI = 0x4B0E; +constexpr unsigned int mmDIG1_HDMI_INFOFRAME_CONTROL1__VI = 0x4B0F; +constexpr unsigned int mmDIG1_HDMI_STATUS__VI = 0x4B0A; +constexpr unsigned int mmDIG1_HDMI_VBI_PACKET_CONTROL__VI = 0x4B0D; +constexpr unsigned int mmDIG1_LVDS_DATA_CNTL__VI = 0x4B78; +constexpr unsigned int mmDIG1_TMDS_CNTL__VI = 0x4B6B; +constexpr unsigned int mmDIG1_TMDS_CONTROL0_FEEDBACK__VI = 0x4B6D; +constexpr unsigned int mmDIG1_TMDS_CONTROL_CHAR__VI = 0x4B6C; +constexpr unsigned int mmDIG1_TMDS_CTL0_1_GEN_CNTL__VI = 0x4B75; +constexpr unsigned int mmDIG1_TMDS_CTL2_3_GEN_CNTL__VI = 0x4B76; +constexpr unsigned int mmDIG1_TMDS_CTL_BITS__VI = 0x4B72; +constexpr unsigned int mmDIG1_TMDS_DCBALANCER_CONTROL__VI = 0x4B73; +constexpr unsigned int mmDIG1_TMDS_DEBUG__VI = 0x4B71; +constexpr unsigned int mmDIG1_TMDS_STEREOSYNC_CTL_SEL__VI = 0x4B6E; +constexpr unsigned int mmDIG1_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4B6F; +constexpr unsigned int mmDIG1_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4B70; +constexpr unsigned int mmDIG2_AFMT_60958_0__VI = 0x4C38; +constexpr unsigned int mmDIG2_AFMT_60958_1__VI = 0x4C39; +constexpr unsigned int mmDIG2_AFMT_60958_2__VI = 0x4C3F; +constexpr unsigned int mmDIG2_AFMT_AUDIO_CRC_CONTROL__VI = 0x4C3A; +constexpr unsigned int mmDIG2_AFMT_AUDIO_CRC_RESULT__VI = 0x4C40; +constexpr unsigned int mmDIG2_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4C46; +constexpr unsigned int mmDIG2_AFMT_AUDIO_INFO0__VI = 0x4C36; +constexpr unsigned int mmDIG2_AFMT_AUDIO_INFO1__VI = 0x4C37; +constexpr unsigned int mmDIG2_AFMT_AUDIO_PACKET_CONTROL__VI = 0x4C42; +constexpr unsigned int mmDIG2_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x4C14; +constexpr unsigned int mmDIG2_AFMT_AUDIO_SRC_CONTROL__VI = 0x4C45; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO0__VI = 0x4C1E; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO1__VI = 0x4C1F; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO2__VI = 0x4C20; +constexpr unsigned int mmDIG2_AFMT_AVI_INFO3__VI = 0x4C21; +constexpr unsigned int mmDIG2_AFMT_GENERIC_0__VI = 0x4C25; +constexpr unsigned int mmDIG2_AFMT_GENERIC_1__VI = 0x4C26; +constexpr unsigned int mmDIG2_AFMT_GENERIC_2__VI = 0x4C27; +constexpr unsigned int mmDIG2_AFMT_GENERIC_3__VI = 0x4C28; +constexpr unsigned int mmDIG2_AFMT_GENERIC_4__VI = 0x4C29; +constexpr unsigned int mmDIG2_AFMT_GENERIC_5__VI = 0x4C2A; +constexpr unsigned int mmDIG2_AFMT_GENERIC_6__VI = 0x4C2B; +constexpr unsigned int mmDIG2_AFMT_GENERIC_7__VI = 0x4C2C; +constexpr unsigned int mmDIG2_AFMT_GENERIC_HDR__VI = 0x4C24; +constexpr unsigned int mmDIG2_AFMT_INFOFRAME_CONTROL0__VI = 0x4C44; +constexpr unsigned int mmDIG2_AFMT_ISRC1_0__VI = 0x4C15; +constexpr unsigned int mmDIG2_AFMT_ISRC1_1__VI = 0x4C16; +constexpr unsigned int mmDIG2_AFMT_ISRC1_2__VI = 0x4C17; +constexpr unsigned int mmDIG2_AFMT_ISRC1_3__VI = 0x4C18; +constexpr unsigned int mmDIG2_AFMT_ISRC1_4__VI = 0x4C19; +constexpr unsigned int mmDIG2_AFMT_ISRC2_0__VI = 0x4C1A; +constexpr unsigned int mmDIG2_AFMT_ISRC2_1__VI = 0x4C1B; +constexpr unsigned int mmDIG2_AFMT_ISRC2_2__VI = 0x4C1C; +constexpr unsigned int mmDIG2_AFMT_ISRC2_3__VI = 0x4C1D; +constexpr unsigned int mmDIG2_AFMT_MPEG_INFO0__VI = 0x4C22; +constexpr unsigned int mmDIG2_AFMT_MPEG_INFO1__VI = 0x4C23; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL0__VI = 0x4C3B; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL1__VI = 0x4C3C; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL2__VI = 0x4C3D; +constexpr unsigned int mmDIG2_AFMT_RAMP_CONTROL3__VI = 0x4C3E; +constexpr unsigned int mmDIG2_AFMT_STATUS__VI = 0x4C41; +constexpr unsigned int mmDIG2_AFMT_VBI_PACKET_CONTROL__VI = 0x4C43; +constexpr unsigned int mmDIG2_DIG_BE_CNTL__VI = 0x4C47; +constexpr unsigned int mmDIG2_DIG_BE_EN_CNTL__VI = 0x4C48; +constexpr unsigned int mmDIG2_DIG_CLOCK_PATTERN__VI = 0x4C03; +constexpr unsigned int mmDIG2_DIG_DISPCLK_SWITCH_CNTL__VI = 0x4C07; +constexpr unsigned int mmDIG2_DIG_DISPCLK_SWITCH_STATUS__VI = 0x4C08; +constexpr unsigned int mmDIG2_DIG_FE_CNTL__VI = 0x4C00; +constexpr unsigned int mmDIG2_DIG_FE_TEST_DEBUG_DATA__VI = 0x4C7D; +constexpr unsigned int mmDIG2_DIG_FE_TEST_DEBUG_INDEX__VI = 0x4C7C; +constexpr unsigned int mmDIG2_DIG_FIFO_STATUS__VI = 0x4C06; +constexpr unsigned int mmDIG2_DIG_LANE_ENABLE__VI = 0x4C79; +constexpr unsigned int mmDIG2_DIG_OUTPUT_CRC_CNTL__VI = 0x4C01; +constexpr unsigned int mmDIG2_DIG_OUTPUT_CRC_RESULT__VI = 0x4C02; +constexpr unsigned int mmDIG2_DIG_RANDOM_PATTERN_SEED__VI = 0x4C05; +constexpr unsigned int mmDIG2_DIG_TEST_DEBUG_DATA__VI = 0x4C7B; +constexpr unsigned int mmDIG2_DIG_TEST_DEBUG_INDEX__VI = 0x4C7A; +constexpr unsigned int mmDIG2_DIG_TEST_PATTERN__VI = 0x4C04; +constexpr unsigned int mmDIG2_HDMI_ACR_32_0__VI = 0x4C2E; +constexpr unsigned int mmDIG2_HDMI_ACR_32_1__VI = 0x4C2F; +constexpr unsigned int mmDIG2_HDMI_ACR_44_0__VI = 0x4C30; +constexpr unsigned int mmDIG2_HDMI_ACR_44_1__VI = 0x4C31; +constexpr unsigned int mmDIG2_HDMI_ACR_48_0__VI = 0x4C32; +constexpr unsigned int mmDIG2_HDMI_ACR_48_1__VI = 0x4C33; +constexpr unsigned int mmDIG2_HDMI_ACR_PACKET_CONTROL__VI = 0x4C0C; +constexpr unsigned int mmDIG2_HDMI_ACR_STATUS_0__VI = 0x4C34; +constexpr unsigned int mmDIG2_HDMI_ACR_STATUS_1__VI = 0x4C35; +constexpr unsigned int mmDIG2_HDMI_AUDIO_PACKET_CONTROL__VI = 0x4C0B; +constexpr unsigned int mmDIG2_HDMI_CONTROL__VI = 0x4C09; +constexpr unsigned int mmDIG2_HDMI_GC__VI = 0x4C13; +constexpr unsigned int mmDIG2_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x4C10; +constexpr unsigned int mmDIG2_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x4C2D; +constexpr unsigned int mmDIG2_HDMI_INFOFRAME_CONTROL0__VI = 0x4C0E; +constexpr unsigned int mmDIG2_HDMI_INFOFRAME_CONTROL1__VI = 0x4C0F; +constexpr unsigned int mmDIG2_HDMI_STATUS__VI = 0x4C0A; +constexpr unsigned int mmDIG2_HDMI_VBI_PACKET_CONTROL__VI = 0x4C0D; +constexpr unsigned int mmDIG2_LVDS_DATA_CNTL__VI = 0x4C78; +constexpr unsigned int mmDIG2_TMDS_CNTL__VI = 0x4C6B; +constexpr unsigned int mmDIG2_TMDS_CONTROL0_FEEDBACK__VI = 0x4C6D; +constexpr unsigned int mmDIG2_TMDS_CONTROL_CHAR__VI = 0x4C6C; +constexpr unsigned int mmDIG2_TMDS_CTL0_1_GEN_CNTL__VI = 0x4C75; +constexpr unsigned int mmDIG2_TMDS_CTL2_3_GEN_CNTL__VI = 0x4C76; +constexpr unsigned int mmDIG2_TMDS_CTL_BITS__VI = 0x4C72; +constexpr unsigned int mmDIG2_TMDS_DCBALANCER_CONTROL__VI = 0x4C73; +constexpr unsigned int mmDIG2_TMDS_DEBUG__VI = 0x4C71; +constexpr unsigned int mmDIG2_TMDS_STEREOSYNC_CTL_SEL__VI = 0x4C6E; +constexpr unsigned int mmDIG2_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4C6F; +constexpr unsigned int mmDIG2_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4C70; +constexpr unsigned int mmDIG3_AFMT_60958_0__VI = 0x4D38; +constexpr unsigned int mmDIG3_AFMT_60958_1__VI = 0x4D39; +constexpr unsigned int mmDIG3_AFMT_60958_2__VI = 0x4D3F; +constexpr unsigned int mmDIG3_AFMT_AUDIO_CRC_CONTROL__VI = 0x4D3A; +constexpr unsigned int mmDIG3_AFMT_AUDIO_CRC_RESULT__VI = 0x4D40; +constexpr unsigned int mmDIG3_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4D46; +constexpr unsigned int mmDIG3_AFMT_AUDIO_INFO0__VI = 0x4D36; +constexpr unsigned int mmDIG3_AFMT_AUDIO_INFO1__VI = 0x4D37; +constexpr unsigned int mmDIG3_AFMT_AUDIO_PACKET_CONTROL__VI = 0x4D42; +constexpr unsigned int mmDIG3_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x4D14; +constexpr unsigned int mmDIG3_AFMT_AUDIO_SRC_CONTROL__VI = 0x4D45; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO0__VI = 0x4D1E; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO1__VI = 0x4D1F; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO2__VI = 0x4D20; +constexpr unsigned int mmDIG3_AFMT_AVI_INFO3__VI = 0x4D21; +constexpr unsigned int mmDIG3_AFMT_GENERIC_0__VI = 0x4D25; +constexpr unsigned int mmDIG3_AFMT_GENERIC_1__VI = 0x4D26; +constexpr unsigned int mmDIG3_AFMT_GENERIC_2__VI = 0x4D27; +constexpr unsigned int mmDIG3_AFMT_GENERIC_3__VI = 0x4D28; +constexpr unsigned int mmDIG3_AFMT_GENERIC_4__VI = 0x4D29; +constexpr unsigned int mmDIG3_AFMT_GENERIC_5__VI = 0x4D2A; +constexpr unsigned int mmDIG3_AFMT_GENERIC_6__VI = 0x4D2B; +constexpr unsigned int mmDIG3_AFMT_GENERIC_7__VI = 0x4D2C; +constexpr unsigned int mmDIG3_AFMT_GENERIC_HDR__VI = 0x4D24; +constexpr unsigned int mmDIG3_AFMT_INFOFRAME_CONTROL0__VI = 0x4D44; +constexpr unsigned int mmDIG3_AFMT_ISRC1_0__VI = 0x4D15; +constexpr unsigned int mmDIG3_AFMT_ISRC1_1__VI = 0x4D16; +constexpr unsigned int mmDIG3_AFMT_ISRC1_2__VI = 0x4D17; +constexpr unsigned int mmDIG3_AFMT_ISRC1_3__VI = 0x4D18; +constexpr unsigned int mmDIG3_AFMT_ISRC1_4__VI = 0x4D19; +constexpr unsigned int mmDIG3_AFMT_ISRC2_0__VI = 0x4D1A; +constexpr unsigned int mmDIG3_AFMT_ISRC2_1__VI = 0x4D1B; +constexpr unsigned int mmDIG3_AFMT_ISRC2_2__VI = 0x4D1C; +constexpr unsigned int mmDIG3_AFMT_ISRC2_3__VI = 0x4D1D; +constexpr unsigned int mmDIG3_AFMT_MPEG_INFO0__VI = 0x4D22; +constexpr unsigned int mmDIG3_AFMT_MPEG_INFO1__VI = 0x4D23; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL0__VI = 0x4D3B; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL1__VI = 0x4D3C; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL2__VI = 0x4D3D; +constexpr unsigned int mmDIG3_AFMT_RAMP_CONTROL3__VI = 0x4D3E; +constexpr unsigned int mmDIG3_AFMT_STATUS__VI = 0x4D41; +constexpr unsigned int mmDIG3_AFMT_VBI_PACKET_CONTROL__VI = 0x4D43; +constexpr unsigned int mmDIG3_DIG_BE_CNTL__VI = 0x4D47; +constexpr unsigned int mmDIG3_DIG_BE_EN_CNTL__VI = 0x4D48; +constexpr unsigned int mmDIG3_DIG_CLOCK_PATTERN__VI = 0x4D03; +constexpr unsigned int mmDIG3_DIG_DISPCLK_SWITCH_CNTL__VI = 0x4D07; +constexpr unsigned int mmDIG3_DIG_DISPCLK_SWITCH_STATUS__VI = 0x4D08; +constexpr unsigned int mmDIG3_DIG_FE_CNTL__VI = 0x4D00; +constexpr unsigned int mmDIG3_DIG_FE_TEST_DEBUG_DATA__VI = 0x4D7D; +constexpr unsigned int mmDIG3_DIG_FE_TEST_DEBUG_INDEX__VI = 0x4D7C; +constexpr unsigned int mmDIG3_DIG_FIFO_STATUS__VI = 0x4D06; +constexpr unsigned int mmDIG3_DIG_LANE_ENABLE__VI = 0x4D79; +constexpr unsigned int mmDIG3_DIG_OUTPUT_CRC_CNTL__VI = 0x4D01; +constexpr unsigned int mmDIG3_DIG_OUTPUT_CRC_RESULT__VI = 0x4D02; +constexpr unsigned int mmDIG3_DIG_RANDOM_PATTERN_SEED__VI = 0x4D05; +constexpr unsigned int mmDIG3_DIG_TEST_DEBUG_DATA__VI = 0x4D7B; +constexpr unsigned int mmDIG3_DIG_TEST_DEBUG_INDEX__VI = 0x4D7A; +constexpr unsigned int mmDIG3_DIG_TEST_PATTERN__VI = 0x4D04; +constexpr unsigned int mmDIG3_HDMI_ACR_32_0__VI = 0x4D2E; +constexpr unsigned int mmDIG3_HDMI_ACR_32_1__VI = 0x4D2F; +constexpr unsigned int mmDIG3_HDMI_ACR_44_0__VI = 0x4D30; +constexpr unsigned int mmDIG3_HDMI_ACR_44_1__VI = 0x4D31; +constexpr unsigned int mmDIG3_HDMI_ACR_48_0__VI = 0x4D32; +constexpr unsigned int mmDIG3_HDMI_ACR_48_1__VI = 0x4D33; +constexpr unsigned int mmDIG3_HDMI_ACR_PACKET_CONTROL__VI = 0x4D0C; +constexpr unsigned int mmDIG3_HDMI_ACR_STATUS_0__VI = 0x4D34; +constexpr unsigned int mmDIG3_HDMI_ACR_STATUS_1__VI = 0x4D35; +constexpr unsigned int mmDIG3_HDMI_AUDIO_PACKET_CONTROL__VI = 0x4D0B; +constexpr unsigned int mmDIG3_HDMI_CONTROL__VI = 0x4D09; +constexpr unsigned int mmDIG3_HDMI_GC__VI = 0x4D13; +constexpr unsigned int mmDIG3_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x4D10; +constexpr unsigned int mmDIG3_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x4D2D; +constexpr unsigned int mmDIG3_HDMI_INFOFRAME_CONTROL0__VI = 0x4D0E; +constexpr unsigned int mmDIG3_HDMI_INFOFRAME_CONTROL1__VI = 0x4D0F; +constexpr unsigned int mmDIG3_HDMI_STATUS__VI = 0x4D0A; +constexpr unsigned int mmDIG3_HDMI_VBI_PACKET_CONTROL__VI = 0x4D0D; +constexpr unsigned int mmDIG3_LVDS_DATA_CNTL__VI = 0x4D78; +constexpr unsigned int mmDIG3_TMDS_CNTL__VI = 0x4D6B; +constexpr unsigned int mmDIG3_TMDS_CONTROL0_FEEDBACK__VI = 0x4D6D; +constexpr unsigned int mmDIG3_TMDS_CONTROL_CHAR__VI = 0x4D6C; +constexpr unsigned int mmDIG3_TMDS_CTL0_1_GEN_CNTL__VI = 0x4D75; +constexpr unsigned int mmDIG3_TMDS_CTL2_3_GEN_CNTL__VI = 0x4D76; +constexpr unsigned int mmDIG3_TMDS_CTL_BITS__VI = 0x4D72; +constexpr unsigned int mmDIG3_TMDS_DCBALANCER_CONTROL__VI = 0x4D73; +constexpr unsigned int mmDIG3_TMDS_DEBUG__VI = 0x4D71; +constexpr unsigned int mmDIG3_TMDS_STEREOSYNC_CTL_SEL__VI = 0x4D6E; +constexpr unsigned int mmDIG3_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4D6F; +constexpr unsigned int mmDIG3_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4D70; +constexpr unsigned int mmDIG4_AFMT_60958_0__VI = 0x4E38; +constexpr unsigned int mmDIG4_AFMT_60958_1__VI = 0x4E39; +constexpr unsigned int mmDIG4_AFMT_60958_2__VI = 0x4E3F; +constexpr unsigned int mmDIG4_AFMT_AUDIO_CRC_CONTROL__VI = 0x4E3A; +constexpr unsigned int mmDIG4_AFMT_AUDIO_CRC_RESULT__VI = 0x4E40; +constexpr unsigned int mmDIG4_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4E46; +constexpr unsigned int mmDIG4_AFMT_AUDIO_INFO0__VI = 0x4E36; +constexpr unsigned int mmDIG4_AFMT_AUDIO_INFO1__VI = 0x4E37; +constexpr unsigned int mmDIG4_AFMT_AUDIO_PACKET_CONTROL__VI = 0x4E42; +constexpr unsigned int mmDIG4_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x4E14; +constexpr unsigned int mmDIG4_AFMT_AUDIO_SRC_CONTROL__VI = 0x4E45; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO0__VI = 0x4E1E; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO1__VI = 0x4E1F; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO2__VI = 0x4E20; +constexpr unsigned int mmDIG4_AFMT_AVI_INFO3__VI = 0x4E21; +constexpr unsigned int mmDIG4_AFMT_GENERIC_0__VI = 0x4E25; +constexpr unsigned int mmDIG4_AFMT_GENERIC_1__VI = 0x4E26; +constexpr unsigned int mmDIG4_AFMT_GENERIC_2__VI = 0x4E27; +constexpr unsigned int mmDIG4_AFMT_GENERIC_3__VI = 0x4E28; +constexpr unsigned int mmDIG4_AFMT_GENERIC_4__VI = 0x4E29; +constexpr unsigned int mmDIG4_AFMT_GENERIC_5__VI = 0x4E2A; +constexpr unsigned int mmDIG4_AFMT_GENERIC_6__VI = 0x4E2B; +constexpr unsigned int mmDIG4_AFMT_GENERIC_7__VI = 0x4E2C; +constexpr unsigned int mmDIG4_AFMT_GENERIC_HDR__VI = 0x4E24; +constexpr unsigned int mmDIG4_AFMT_INFOFRAME_CONTROL0__VI = 0x4E44; +constexpr unsigned int mmDIG4_AFMT_ISRC1_0__VI = 0x4E15; +constexpr unsigned int mmDIG4_AFMT_ISRC1_1__VI = 0x4E16; +constexpr unsigned int mmDIG4_AFMT_ISRC1_2__VI = 0x4E17; +constexpr unsigned int mmDIG4_AFMT_ISRC1_3__VI = 0x4E18; +constexpr unsigned int mmDIG4_AFMT_ISRC1_4__VI = 0x4E19; +constexpr unsigned int mmDIG4_AFMT_ISRC2_0__VI = 0x4E1A; +constexpr unsigned int mmDIG4_AFMT_ISRC2_1__VI = 0x4E1B; +constexpr unsigned int mmDIG4_AFMT_ISRC2_2__VI = 0x4E1C; +constexpr unsigned int mmDIG4_AFMT_ISRC2_3__VI = 0x4E1D; +constexpr unsigned int mmDIG4_AFMT_MPEG_INFO0__VI = 0x4E22; +constexpr unsigned int mmDIG4_AFMT_MPEG_INFO1__VI = 0x4E23; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL0__VI = 0x4E3B; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL1__VI = 0x4E3C; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL2__VI = 0x4E3D; +constexpr unsigned int mmDIG4_AFMT_RAMP_CONTROL3__VI = 0x4E3E; +constexpr unsigned int mmDIG4_AFMT_STATUS__VI = 0x4E41; +constexpr unsigned int mmDIG4_AFMT_VBI_PACKET_CONTROL__VI = 0x4E43; +constexpr unsigned int mmDIG4_DIG_BE_CNTL__VI = 0x4E47; +constexpr unsigned int mmDIG4_DIG_BE_EN_CNTL__VI = 0x4E48; +constexpr unsigned int mmDIG4_DIG_CLOCK_PATTERN__VI = 0x4E03; +constexpr unsigned int mmDIG4_DIG_DISPCLK_SWITCH_CNTL__VI = 0x4E07; +constexpr unsigned int mmDIG4_DIG_DISPCLK_SWITCH_STATUS__VI = 0x4E08; +constexpr unsigned int mmDIG4_DIG_FE_CNTL__VI = 0x4E00; +constexpr unsigned int mmDIG4_DIG_FE_TEST_DEBUG_DATA__VI = 0x4E7D; +constexpr unsigned int mmDIG4_DIG_FE_TEST_DEBUG_INDEX__VI = 0x4E7C; +constexpr unsigned int mmDIG4_DIG_FIFO_STATUS__VI = 0x4E06; +constexpr unsigned int mmDIG4_DIG_LANE_ENABLE__VI = 0x4E79; +constexpr unsigned int mmDIG4_DIG_OUTPUT_CRC_CNTL__VI = 0x4E01; +constexpr unsigned int mmDIG4_DIG_OUTPUT_CRC_RESULT__VI = 0x4E02; +constexpr unsigned int mmDIG4_DIG_RANDOM_PATTERN_SEED__VI = 0x4E05; +constexpr unsigned int mmDIG4_DIG_TEST_DEBUG_DATA__VI = 0x4E7B; +constexpr unsigned int mmDIG4_DIG_TEST_DEBUG_INDEX__VI = 0x4E7A; +constexpr unsigned int mmDIG4_DIG_TEST_PATTERN__VI = 0x4E04; +constexpr unsigned int mmDIG4_HDMI_ACR_32_0__VI = 0x4E2E; +constexpr unsigned int mmDIG4_HDMI_ACR_32_1__VI = 0x4E2F; +constexpr unsigned int mmDIG4_HDMI_ACR_44_0__VI = 0x4E30; +constexpr unsigned int mmDIG4_HDMI_ACR_44_1__VI = 0x4E31; +constexpr unsigned int mmDIG4_HDMI_ACR_48_0__VI = 0x4E32; +constexpr unsigned int mmDIG4_HDMI_ACR_48_1__VI = 0x4E33; +constexpr unsigned int mmDIG4_HDMI_ACR_PACKET_CONTROL__VI = 0x4E0C; +constexpr unsigned int mmDIG4_HDMI_ACR_STATUS_0__VI = 0x4E34; +constexpr unsigned int mmDIG4_HDMI_ACR_STATUS_1__VI = 0x4E35; +constexpr unsigned int mmDIG4_HDMI_AUDIO_PACKET_CONTROL__VI = 0x4E0B; +constexpr unsigned int mmDIG4_HDMI_CONTROL__VI = 0x4E09; +constexpr unsigned int mmDIG4_HDMI_GC__VI = 0x4E13; +constexpr unsigned int mmDIG4_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x4E10; +constexpr unsigned int mmDIG4_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x4E2D; +constexpr unsigned int mmDIG4_HDMI_INFOFRAME_CONTROL0__VI = 0x4E0E; +constexpr unsigned int mmDIG4_HDMI_INFOFRAME_CONTROL1__VI = 0x4E0F; +constexpr unsigned int mmDIG4_HDMI_STATUS__VI = 0x4E0A; +constexpr unsigned int mmDIG4_HDMI_VBI_PACKET_CONTROL__VI = 0x4E0D; +constexpr unsigned int mmDIG4_LVDS_DATA_CNTL__VI = 0x4E78; +constexpr unsigned int mmDIG4_TMDS_CNTL__VI = 0x4E6B; +constexpr unsigned int mmDIG4_TMDS_CONTROL0_FEEDBACK__VI = 0x4E6D; +constexpr unsigned int mmDIG4_TMDS_CONTROL_CHAR__VI = 0x4E6C; +constexpr unsigned int mmDIG4_TMDS_CTL0_1_GEN_CNTL__VI = 0x4E75; +constexpr unsigned int mmDIG4_TMDS_CTL2_3_GEN_CNTL__VI = 0x4E76; +constexpr unsigned int mmDIG4_TMDS_CTL_BITS__VI = 0x4E72; +constexpr unsigned int mmDIG4_TMDS_DCBALANCER_CONTROL__VI = 0x4E73; +constexpr unsigned int mmDIG4_TMDS_DEBUG__VI = 0x4E71; +constexpr unsigned int mmDIG4_TMDS_STEREOSYNC_CTL_SEL__VI = 0x4E6E; +constexpr unsigned int mmDIG4_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4E6F; +constexpr unsigned int mmDIG4_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4E70; +constexpr unsigned int mmDIG5_AFMT_60958_0__VI = 0x4F38; +constexpr unsigned int mmDIG5_AFMT_60958_1__VI = 0x4F39; +constexpr unsigned int mmDIG5_AFMT_60958_2__VI = 0x4F3F; +constexpr unsigned int mmDIG5_AFMT_AUDIO_CRC_CONTROL__VI = 0x4F3A; +constexpr unsigned int mmDIG5_AFMT_AUDIO_CRC_RESULT__VI = 0x4F40; +constexpr unsigned int mmDIG5_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x4F46; +constexpr unsigned int mmDIG5_AFMT_AUDIO_INFO0__VI = 0x4F36; +constexpr unsigned int mmDIG5_AFMT_AUDIO_INFO1__VI = 0x4F37; +constexpr unsigned int mmDIG5_AFMT_AUDIO_PACKET_CONTROL__VI = 0x4F42; +constexpr unsigned int mmDIG5_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x4F14; +constexpr unsigned int mmDIG5_AFMT_AUDIO_SRC_CONTROL__VI = 0x4F45; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO0__VI = 0x4F1E; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO1__VI = 0x4F1F; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO2__VI = 0x4F20; +constexpr unsigned int mmDIG5_AFMT_AVI_INFO3__VI = 0x4F21; +constexpr unsigned int mmDIG5_AFMT_GENERIC_0__VI = 0x4F25; +constexpr unsigned int mmDIG5_AFMT_GENERIC_1__VI = 0x4F26; +constexpr unsigned int mmDIG5_AFMT_GENERIC_2__VI = 0x4F27; +constexpr unsigned int mmDIG5_AFMT_GENERIC_3__VI = 0x4F28; +constexpr unsigned int mmDIG5_AFMT_GENERIC_4__VI = 0x4F29; +constexpr unsigned int mmDIG5_AFMT_GENERIC_5__VI = 0x4F2A; +constexpr unsigned int mmDIG5_AFMT_GENERIC_6__VI = 0x4F2B; +constexpr unsigned int mmDIG5_AFMT_GENERIC_7__VI = 0x4F2C; +constexpr unsigned int mmDIG5_AFMT_GENERIC_HDR__VI = 0x4F24; +constexpr unsigned int mmDIG5_AFMT_INFOFRAME_CONTROL0__VI = 0x4F44; +constexpr unsigned int mmDIG5_AFMT_ISRC1_0__VI = 0x4F15; +constexpr unsigned int mmDIG5_AFMT_ISRC1_1__VI = 0x4F16; +constexpr unsigned int mmDIG5_AFMT_ISRC1_2__VI = 0x4F17; +constexpr unsigned int mmDIG5_AFMT_ISRC1_3__VI = 0x4F18; +constexpr unsigned int mmDIG5_AFMT_ISRC1_4__VI = 0x4F19; +constexpr unsigned int mmDIG5_AFMT_ISRC2_0__VI = 0x4F1A; +constexpr unsigned int mmDIG5_AFMT_ISRC2_1__VI = 0x4F1B; +constexpr unsigned int mmDIG5_AFMT_ISRC2_2__VI = 0x4F1C; +constexpr unsigned int mmDIG5_AFMT_ISRC2_3__VI = 0x4F1D; +constexpr unsigned int mmDIG5_AFMT_MPEG_INFO0__VI = 0x4F22; +constexpr unsigned int mmDIG5_AFMT_MPEG_INFO1__VI = 0x4F23; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL0__VI = 0x4F3B; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL1__VI = 0x4F3C; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL2__VI = 0x4F3D; +constexpr unsigned int mmDIG5_AFMT_RAMP_CONTROL3__VI = 0x4F3E; +constexpr unsigned int mmDIG5_AFMT_STATUS__VI = 0x4F41; +constexpr unsigned int mmDIG5_AFMT_VBI_PACKET_CONTROL__VI = 0x4F43; +constexpr unsigned int mmDIG5_DIG_BE_CNTL__VI = 0x4F47; +constexpr unsigned int mmDIG5_DIG_BE_EN_CNTL__VI = 0x4F48; +constexpr unsigned int mmDIG5_DIG_CLOCK_PATTERN__VI = 0x4F03; +constexpr unsigned int mmDIG5_DIG_DISPCLK_SWITCH_CNTL__VI = 0x4F07; +constexpr unsigned int mmDIG5_DIG_DISPCLK_SWITCH_STATUS__VI = 0x4F08; +constexpr unsigned int mmDIG5_DIG_FE_CNTL__VI = 0x4F00; +constexpr unsigned int mmDIG5_DIG_FE_TEST_DEBUG_DATA__VI = 0x4F7D; +constexpr unsigned int mmDIG5_DIG_FE_TEST_DEBUG_INDEX__VI = 0x4F7C; +constexpr unsigned int mmDIG5_DIG_FIFO_STATUS__VI = 0x4F06; +constexpr unsigned int mmDIG5_DIG_LANE_ENABLE__VI = 0x4F79; +constexpr unsigned int mmDIG5_DIG_OUTPUT_CRC_CNTL__VI = 0x4F01; +constexpr unsigned int mmDIG5_DIG_OUTPUT_CRC_RESULT__VI = 0x4F02; +constexpr unsigned int mmDIG5_DIG_RANDOM_PATTERN_SEED__VI = 0x4F05; +constexpr unsigned int mmDIG5_DIG_TEST_DEBUG_DATA__VI = 0x4F7B; +constexpr unsigned int mmDIG5_DIG_TEST_DEBUG_INDEX__VI = 0x4F7A; +constexpr unsigned int mmDIG5_DIG_TEST_PATTERN__VI = 0x4F04; +constexpr unsigned int mmDIG5_HDMI_ACR_32_0__VI = 0x4F2E; +constexpr unsigned int mmDIG5_HDMI_ACR_32_1__VI = 0x4F2F; +constexpr unsigned int mmDIG5_HDMI_ACR_44_0__VI = 0x4F30; +constexpr unsigned int mmDIG5_HDMI_ACR_44_1__VI = 0x4F31; +constexpr unsigned int mmDIG5_HDMI_ACR_48_0__VI = 0x4F32; +constexpr unsigned int mmDIG5_HDMI_ACR_48_1__VI = 0x4F33; +constexpr unsigned int mmDIG5_HDMI_ACR_PACKET_CONTROL__VI = 0x4F0C; +constexpr unsigned int mmDIG5_HDMI_ACR_STATUS_0__VI = 0x4F34; +constexpr unsigned int mmDIG5_HDMI_ACR_STATUS_1__VI = 0x4F35; +constexpr unsigned int mmDIG5_HDMI_AUDIO_PACKET_CONTROL__VI = 0x4F0B; +constexpr unsigned int mmDIG5_HDMI_CONTROL__VI = 0x4F09; +constexpr unsigned int mmDIG5_HDMI_GC__VI = 0x4F13; +constexpr unsigned int mmDIG5_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x4F10; +constexpr unsigned int mmDIG5_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x4F2D; +constexpr unsigned int mmDIG5_HDMI_INFOFRAME_CONTROL0__VI = 0x4F0E; +constexpr unsigned int mmDIG5_HDMI_INFOFRAME_CONTROL1__VI = 0x4F0F; +constexpr unsigned int mmDIG5_HDMI_STATUS__VI = 0x4F0A; +constexpr unsigned int mmDIG5_HDMI_VBI_PACKET_CONTROL__VI = 0x4F0D; +constexpr unsigned int mmDIG5_LVDS_DATA_CNTL__VI = 0x4F78; +constexpr unsigned int mmDIG5_TMDS_CNTL__VI = 0x4F6B; +constexpr unsigned int mmDIG5_TMDS_CONTROL0_FEEDBACK__VI = 0x4F6D; +constexpr unsigned int mmDIG5_TMDS_CONTROL_CHAR__VI = 0x4F6C; +constexpr unsigned int mmDIG5_TMDS_CTL0_1_GEN_CNTL__VI = 0x4F75; +constexpr unsigned int mmDIG5_TMDS_CTL2_3_GEN_CNTL__VI = 0x4F76; +constexpr unsigned int mmDIG5_TMDS_CTL_BITS__VI = 0x4F72; +constexpr unsigned int mmDIG5_TMDS_DCBALANCER_CONTROL__VI = 0x4F73; +constexpr unsigned int mmDIG5_TMDS_DEBUG__VI = 0x4F71; +constexpr unsigned int mmDIG5_TMDS_STEREOSYNC_CTL_SEL__VI = 0x4F6E; +constexpr unsigned int mmDIG5_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4F6F; +constexpr unsigned int mmDIG5_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4F70; +constexpr unsigned int mmDIG6_AFMT_60958_0__VI = 0x5438; +constexpr unsigned int mmDIG6_AFMT_60958_1__VI = 0x5439; +constexpr unsigned int mmDIG6_AFMT_60958_2__VI = 0x543F; +constexpr unsigned int mmDIG6_AFMT_AUDIO_CRC_CONTROL__VI = 0x543A; +constexpr unsigned int mmDIG6_AFMT_AUDIO_CRC_RESULT__VI = 0x5440; +constexpr unsigned int mmDIG6_AFMT_AUDIO_DBG_DTO_CNTL__VI = 0x5446; +constexpr unsigned int mmDIG6_AFMT_AUDIO_INFO0__VI = 0x5436; +constexpr unsigned int mmDIG6_AFMT_AUDIO_INFO1__VI = 0x5437; +constexpr unsigned int mmDIG6_AFMT_AUDIO_PACKET_CONTROL__VI = 0x5442; +constexpr unsigned int mmDIG6_AFMT_AUDIO_PACKET_CONTROL2__VI = 0x5414; +constexpr unsigned int mmDIG6_AFMT_AUDIO_SRC_CONTROL__VI = 0x5445; +constexpr unsigned int mmDIG6_AFMT_AVI_INFO0__VI = 0x541E; +constexpr unsigned int mmDIG6_AFMT_AVI_INFO1__VI = 0x541F; +constexpr unsigned int mmDIG6_AFMT_AVI_INFO2__VI = 0x5420; +constexpr unsigned int mmDIG6_AFMT_AVI_INFO3__VI = 0x5421; +constexpr unsigned int mmDIG6_AFMT_GENERIC_0__VI = 0x5425; +constexpr unsigned int mmDIG6_AFMT_GENERIC_1__VI = 0x5426; +constexpr unsigned int mmDIG6_AFMT_GENERIC_2__VI = 0x5427; +constexpr unsigned int mmDIG6_AFMT_GENERIC_3__VI = 0x5428; +constexpr unsigned int mmDIG6_AFMT_GENERIC_4__VI = 0x5429; +constexpr unsigned int mmDIG6_AFMT_GENERIC_5__VI = 0x542A; +constexpr unsigned int mmDIG6_AFMT_GENERIC_6__VI = 0x542B; +constexpr unsigned int mmDIG6_AFMT_GENERIC_7__VI = 0x542C; +constexpr unsigned int mmDIG6_AFMT_GENERIC_HDR__VI = 0x5424; +constexpr unsigned int mmDIG6_AFMT_INFOFRAME_CONTROL0__VI = 0x5444; +constexpr unsigned int mmDIG6_AFMT_ISRC1_0__VI = 0x5415; +constexpr unsigned int mmDIG6_AFMT_ISRC1_1__VI = 0x5416; +constexpr unsigned int mmDIG6_AFMT_ISRC1_2__VI = 0x5417; +constexpr unsigned int mmDIG6_AFMT_ISRC1_3__VI = 0x5418; +constexpr unsigned int mmDIG6_AFMT_ISRC1_4__VI = 0x5419; +constexpr unsigned int mmDIG6_AFMT_ISRC2_0__VI = 0x541A; +constexpr unsigned int mmDIG6_AFMT_ISRC2_1__VI = 0x541B; +constexpr unsigned int mmDIG6_AFMT_ISRC2_2__VI = 0x541C; +constexpr unsigned int mmDIG6_AFMT_ISRC2_3__VI = 0x541D; +constexpr unsigned int mmDIG6_AFMT_MPEG_INFO0__VI = 0x5422; +constexpr unsigned int mmDIG6_AFMT_MPEG_INFO1__VI = 0x5423; +constexpr unsigned int mmDIG6_AFMT_RAMP_CONTROL0__VI = 0x543B; +constexpr unsigned int mmDIG6_AFMT_RAMP_CONTROL1__VI = 0x543C; +constexpr unsigned int mmDIG6_AFMT_RAMP_CONTROL2__VI = 0x543D; +constexpr unsigned int mmDIG6_AFMT_RAMP_CONTROL3__VI = 0x543E; +constexpr unsigned int mmDIG6_AFMT_STATUS__VI = 0x5441; +constexpr unsigned int mmDIG6_AFMT_VBI_PACKET_CONTROL__VI = 0x5443; +constexpr unsigned int mmDIG6_DIG_BE_CNTL__VI = 0x5447; +constexpr unsigned int mmDIG6_DIG_BE_EN_CNTL__VI = 0x5448; +constexpr unsigned int mmDIG6_DIG_CLOCK_PATTERN__VI = 0x5403; +constexpr unsigned int mmDIG6_DIG_DISPCLK_SWITCH_CNTL__VI = 0x5407; +constexpr unsigned int mmDIG6_DIG_DISPCLK_SWITCH_STATUS__VI = 0x5408; +constexpr unsigned int mmDIG6_DIG_FE_CNTL__VI = 0x5400; +constexpr unsigned int mmDIG6_DIG_FE_TEST_DEBUG_DATA__VI = 0x547D; +constexpr unsigned int mmDIG6_DIG_FE_TEST_DEBUG_INDEX__VI = 0x547C; +constexpr unsigned int mmDIG6_DIG_FIFO_STATUS__VI = 0x5406; +constexpr unsigned int mmDIG6_DIG_LANE_ENABLE__VI = 0x5479; +constexpr unsigned int mmDIG6_DIG_OUTPUT_CRC_CNTL__VI = 0x5401; +constexpr unsigned int mmDIG6_DIG_OUTPUT_CRC_RESULT__VI = 0x5402; +constexpr unsigned int mmDIG6_DIG_RANDOM_PATTERN_SEED__VI = 0x5405; +constexpr unsigned int mmDIG6_DIG_TEST_DEBUG_DATA__VI = 0x547B; +constexpr unsigned int mmDIG6_DIG_TEST_DEBUG_INDEX__VI = 0x547A; +constexpr unsigned int mmDIG6_DIG_TEST_PATTERN__VI = 0x5404; +constexpr unsigned int mmDIG6_HDMI_ACR_32_0__VI = 0x542E; +constexpr unsigned int mmDIG6_HDMI_ACR_32_1__VI = 0x542F; +constexpr unsigned int mmDIG6_HDMI_ACR_44_0__VI = 0x5430; +constexpr unsigned int mmDIG6_HDMI_ACR_44_1__VI = 0x5431; +constexpr unsigned int mmDIG6_HDMI_ACR_48_0__VI = 0x5432; +constexpr unsigned int mmDIG6_HDMI_ACR_48_1__VI = 0x5433; +constexpr unsigned int mmDIG6_HDMI_ACR_PACKET_CONTROL__VI = 0x540C; +constexpr unsigned int mmDIG6_HDMI_ACR_STATUS_0__VI = 0x5434; +constexpr unsigned int mmDIG6_HDMI_ACR_STATUS_1__VI = 0x5435; +constexpr unsigned int mmDIG6_HDMI_AUDIO_PACKET_CONTROL__VI = 0x540B; +constexpr unsigned int mmDIG6_HDMI_CONTROL__VI = 0x5409; +constexpr unsigned int mmDIG6_HDMI_GC__VI = 0x5413; +constexpr unsigned int mmDIG6_HDMI_GENERIC_PACKET_CONTROL0__VI = 0x5410; +constexpr unsigned int mmDIG6_HDMI_GENERIC_PACKET_CONTROL1__VI = 0x542D; +constexpr unsigned int mmDIG6_HDMI_INFOFRAME_CONTROL0__VI = 0x540E; +constexpr unsigned int mmDIG6_HDMI_INFOFRAME_CONTROL1__VI = 0x540F; +constexpr unsigned int mmDIG6_HDMI_STATUS__VI = 0x540A; +constexpr unsigned int mmDIG6_HDMI_VBI_PACKET_CONTROL__VI = 0x540D; +constexpr unsigned int mmDIG6_LVDS_DATA_CNTL__VI = 0x5478; +constexpr unsigned int mmDIG6_TMDS_CNTL__VI = 0x546B; +constexpr unsigned int mmDIG6_TMDS_CONTROL0_FEEDBACK__VI = 0x546D; +constexpr unsigned int mmDIG6_TMDS_CONTROL_CHAR__VI = 0x546C; +constexpr unsigned int mmDIG6_TMDS_CTL0_1_GEN_CNTL__VI = 0x5475; +constexpr unsigned int mmDIG6_TMDS_CTL2_3_GEN_CNTL__VI = 0x5476; +constexpr unsigned int mmDIG6_TMDS_CTL_BITS__VI = 0x5472; +constexpr unsigned int mmDIG6_TMDS_DCBALANCER_CONTROL__VI = 0x5473; +constexpr unsigned int mmDIG6_TMDS_DEBUG__VI = 0x5471; +constexpr unsigned int mmDIG6_TMDS_STEREOSYNC_CTL_SEL__VI = 0x546E; +constexpr unsigned int mmDIG6_TMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x546F; +constexpr unsigned int mmDIG6_TMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x5470; +constexpr unsigned int mmDIG_BE_CNTL__VI = 0x4A47; +constexpr unsigned int mmDIG_BE_EN_CNTL__VI = 0x4A48; +constexpr unsigned int mmDIG_CLOCK_PATTERN__VI = 0x4A03; +constexpr unsigned int mmDIG_DISPCLK_SWITCH_CNTL__VI = 0x4A07; +constexpr unsigned int mmDIG_DISPCLK_SWITCH_STATUS__VI = 0x4A08; +constexpr unsigned int mmDIG_FE_CNTL__VI = 0x4A00; +constexpr unsigned int mmDIG_FE_TEST_DEBUG_DATA__VI = 0x4A7D; +constexpr unsigned int mmDIG_FE_TEST_DEBUG_INDEX__VI = 0x4A7C; +constexpr unsigned int mmDIG_FIFO_STATUS__VI = 0x4A06; +constexpr unsigned int mmDIG_LANE_ENABLE__VI = 0x4A79; +constexpr unsigned int mmDIG_OUTPUT_CRC_CNTL__VI = 0x4A01; +constexpr unsigned int mmDIG_OUTPUT_CRC_RESULT__VI = 0x4A02; +constexpr unsigned int mmDIG_RANDOM_PATTERN_SEED__VI = 0x4A05; +constexpr unsigned int mmDIG_SOFT_RESET__VI = 0x1872; +constexpr unsigned int mmDIG_TEST_DEBUG_DATA__VI = 0x4A7B; +constexpr unsigned int mmDIG_TEST_DEBUG_INDEX__VI = 0x4A7A; +constexpr unsigned int mmDIG_TEST_PATTERN__VI = 0x4A04; +constexpr unsigned int mmDISPCLK_CGTT_BLK_CTRL_REG__VI = 0x0135; +constexpr unsigned int mmDISPCLK_FREQ_CHANGE_CNTL__VI = 0x0131; +constexpr unsigned int mmDISPPLL_BG_CNTL__VI = 0x171E; +constexpr unsigned int mmDISP_INTERRUPT_STATUS__VI = 0x1857; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE__VI = 0x1858; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE2__VI = 0x1859; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE3__VI = 0x185A; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE4__VI = 0x185B; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE5__VI = 0x185C; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE6__VI = 0x185D; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE7__VI = 0x185E; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE8__VI = 0x185F; +constexpr unsigned int mmDISP_INTERRUPT_STATUS_CONTINUE9__VI = 0x1860; +constexpr unsigned int mmDMCU_DPRX_INTERRUPT_STATUS1__VI = 0x1634; +constexpr unsigned int mmDMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__VI = 0x1635; +constexpr unsigned int mmDMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__VI = 0x1636; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_STATUS1__VI = 0x1644; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_STATUS2__VI = 0x1645; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_STATUS3__VI = 0x1646; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_STATUS4__VI = 0x1647; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_STATUS5__VI = 0x1642; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_HOST_EN_MASK1__VI = 0x167C; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_HOST_EN_MASK2__VI = 0x167D; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_HOST_EN_MASK3__VI = 0x167E; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_HOST_EN_MASK4__VI = 0x167F; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_HOST_EN_MASK5__VI = 0x1633; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__VI = 0x1674; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__VI = 0x1675; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__VI = 0x1676; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__VI = 0x1677; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__VI = 0x1643; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__VI = 0x1678; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__VI = 0x1679; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__VI = 0x167A; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__VI = 0x167B; +constexpr unsigned int mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__VI = 0x1673; +constexpr unsigned int mmDMCU_SMU_INTERRUPT_CNTL__VI = 0x012C; +constexpr unsigned int mmDMCU_SS_INTERRUPT_CNTL_STATUS__VI = 0x1613; +constexpr unsigned int mmDMCU_UC_CLK_GATING_CNTL__VI = 0x161B; +constexpr unsigned int mmDMIF_ADDR_CALC__VI = 0x0303; +constexpr unsigned int mmDMIF_ADDR_CONFIG__VI = 0x02F5; +constexpr unsigned int mmDMIF_PG0_DPG_HW_DEBUG_11__VI = 0x1B3D; +constexpr unsigned int mmDMIF_PG0_DPG_HW_DEBUG_A__VI = 0x1B3B; +constexpr unsigned int mmDMIF_PG0_DPG_HW_DEBUG_B__VI = 0x1B3C; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x1B30; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x1B31; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_DPM_CONTROL__VI = 0x1B34; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x1B36; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_STUTTER_CONTROL__VI = 0x1B35; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x1B37; +constexpr unsigned int mmDMIF_PG0_DPG_PIPE_URGENCY_CONTROL__VI = 0x1B33; +constexpr unsigned int mmDMIF_PG0_DPG_REPEATER_PROGRAM__VI = 0x1B3A; +constexpr unsigned int mmDMIF_PG0_DPG_TEST_DEBUG_DATA__VI = 0x1B39; +constexpr unsigned int mmDMIF_PG0_DPG_TEST_DEBUG_INDEX__VI = 0x1B38; +constexpr unsigned int mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL__VI = 0x1B32; +constexpr unsigned int mmDMIF_PG1_DPG_HW_DEBUG_11__VI = 0x1D3D; +constexpr unsigned int mmDMIF_PG1_DPG_HW_DEBUG_A__VI = 0x1D3B; +constexpr unsigned int mmDMIF_PG1_DPG_HW_DEBUG_B__VI = 0x1D3C; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x1D30; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x1D31; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_DPM_CONTROL__VI = 0x1D34; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x1D36; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_STUTTER_CONTROL__VI = 0x1D35; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x1D37; +constexpr unsigned int mmDMIF_PG1_DPG_PIPE_URGENCY_CONTROL__VI = 0x1D33; +constexpr unsigned int mmDMIF_PG1_DPG_REPEATER_PROGRAM__VI = 0x1D3A; +constexpr unsigned int mmDMIF_PG1_DPG_TEST_DEBUG_DATA__VI = 0x1D39; +constexpr unsigned int mmDMIF_PG1_DPG_TEST_DEBUG_INDEX__VI = 0x1D38; +constexpr unsigned int mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL__VI = 0x1D32; +constexpr unsigned int mmDMIF_PG2_DPG_HW_DEBUG_11__VI = 0x1F3D; +constexpr unsigned int mmDMIF_PG2_DPG_HW_DEBUG_A__VI = 0x1F3B; +constexpr unsigned int mmDMIF_PG2_DPG_HW_DEBUG_B__VI = 0x1F3C; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x1F30; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x1F31; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_DPM_CONTROL__VI = 0x1F34; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x1F36; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_STUTTER_CONTROL__VI = 0x1F35; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x1F37; +constexpr unsigned int mmDMIF_PG2_DPG_PIPE_URGENCY_CONTROL__VI = 0x1F33; +constexpr unsigned int mmDMIF_PG2_DPG_REPEATER_PROGRAM__VI = 0x1F3A; +constexpr unsigned int mmDMIF_PG2_DPG_TEST_DEBUG_DATA__VI = 0x1F39; +constexpr unsigned int mmDMIF_PG2_DPG_TEST_DEBUG_INDEX__VI = 0x1F38; +constexpr unsigned int mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL__VI = 0x1F32; +constexpr unsigned int mmDMIF_PG3_DPG_HW_DEBUG_11__VI = 0x413D; +constexpr unsigned int mmDMIF_PG3_DPG_HW_DEBUG_A__VI = 0x413B; +constexpr unsigned int mmDMIF_PG3_DPG_HW_DEBUG_B__VI = 0x413C; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x4130; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x4131; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_DPM_CONTROL__VI = 0x4134; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x4136; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_STUTTER_CONTROL__VI = 0x4135; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x4137; +constexpr unsigned int mmDMIF_PG3_DPG_PIPE_URGENCY_CONTROL__VI = 0x4133; +constexpr unsigned int mmDMIF_PG3_DPG_REPEATER_PROGRAM__VI = 0x413A; +constexpr unsigned int mmDMIF_PG3_DPG_TEST_DEBUG_DATA__VI = 0x4139; +constexpr unsigned int mmDMIF_PG3_DPG_TEST_DEBUG_INDEX__VI = 0x4138; +constexpr unsigned int mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL__VI = 0x4132; +constexpr unsigned int mmDMIF_PG4_DPG_HW_DEBUG_11__VI = 0x433D; +constexpr unsigned int mmDMIF_PG4_DPG_HW_DEBUG_A__VI = 0x433B; +constexpr unsigned int mmDMIF_PG4_DPG_HW_DEBUG_B__VI = 0x433C; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x4330; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x4331; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_DPM_CONTROL__VI = 0x4334; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x4336; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_STUTTER_CONTROL__VI = 0x4335; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x4337; +constexpr unsigned int mmDMIF_PG4_DPG_PIPE_URGENCY_CONTROL__VI = 0x4333; +constexpr unsigned int mmDMIF_PG4_DPG_REPEATER_PROGRAM__VI = 0x433A; +constexpr unsigned int mmDMIF_PG4_DPG_TEST_DEBUG_DATA__VI = 0x4339; +constexpr unsigned int mmDMIF_PG4_DPG_TEST_DEBUG_INDEX__VI = 0x4338; +constexpr unsigned int mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL__VI = 0x4332; +constexpr unsigned int mmDMIF_PG5_DPG_HW_DEBUG_11__VI = 0x453D; +constexpr unsigned int mmDMIF_PG5_DPG_HW_DEBUG_A__VI = 0x453B; +constexpr unsigned int mmDMIF_PG5_DPG_HW_DEBUG_B__VI = 0x453C; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x4530; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x4531; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_DPM_CONTROL__VI = 0x4534; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x4536; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_STUTTER_CONTROL__VI = 0x4535; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x4537; +constexpr unsigned int mmDMIF_PG5_DPG_PIPE_URGENCY_CONTROL__VI = 0x4533; +constexpr unsigned int mmDMIF_PG5_DPG_REPEATER_PROGRAM__VI = 0x453A; +constexpr unsigned int mmDMIF_PG5_DPG_TEST_DEBUG_DATA__VI = 0x4539; +constexpr unsigned int mmDMIF_PG5_DPG_TEST_DEBUG_INDEX__VI = 0x4538; +constexpr unsigned int mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL__VI = 0x4532; +constexpr unsigned int mmDMIF_PG6_DPG_HW_DEBUG_11__VI = 0x473D; +constexpr unsigned int mmDMIF_PG6_DPG_HW_DEBUG_A__VI = 0x473B; +constexpr unsigned int mmDMIF_PG6_DPG_HW_DEBUG_B__VI = 0x473C; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_ARBITRATION_CONTROL1__VI = 0x4730; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_ARBITRATION_CONTROL2__VI = 0x4731; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_DPM_CONTROL__VI = 0x4734; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x4736; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_STUTTER_CONTROL__VI = 0x4735; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x4737; +constexpr unsigned int mmDMIF_PG6_DPG_PIPE_URGENCY_CONTROL__VI = 0x4733; +constexpr unsigned int mmDMIF_PG6_DPG_REPEATER_PROGRAM__VI = 0x473A; +constexpr unsigned int mmDMIF_PG6_DPG_TEST_DEBUG_DATA__VI = 0x4739; +constexpr unsigned int mmDMIF_PG6_DPG_TEST_DEBUG_INDEX__VI = 0x4738; +constexpr unsigned int mmDMIF_PG6_DPG_WATERMARK_MASK_CONTROL__VI = 0x4732; +constexpr unsigned int mmDMIF_P_VMID__VI = 0x0300; +constexpr unsigned int mmDMIF_STATUS2__VI = 0x0304; +constexpr unsigned int mmDMIF_TEST_DEBUG_DATA__VI = 0x0302; +constexpr unsigned int mmDMIF_TEST_DEBUG_INDEX__VI = 0x0301; +constexpr unsigned int mmDMIF_URG_OVERRIDE__VI = 0x0329; +constexpr unsigned int mmDP0_DP_CONFIG__VI = 0x4AA3; +constexpr unsigned int mmDP0_DP_DPHY_8B10B_CNTL__VI = 0x4AB4; +constexpr unsigned int mmDP0_DP_DPHY_CNTL__VI = 0x4AAF; +constexpr unsigned int mmDP0_DP_DPHY_CRC_CNTL__VI = 0x4AB8; +constexpr unsigned int mmDP0_DP_DPHY_CRC_EN__VI = 0x4AB7; +constexpr unsigned int mmDP0_DP_DPHY_CRC_MST_CNTL__VI = 0x4ABA; +constexpr unsigned int mmDP0_DP_DPHY_CRC_MST_STATUS__VI = 0x4ABB; +constexpr unsigned int mmDP0_DP_DPHY_CRC_RESULT__VI = 0x4AB9; +constexpr unsigned int mmDP0_DP_DPHY_FAST_TRAINING__VI = 0x4ABC; +constexpr unsigned int mmDP0_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x4ABD; +constexpr unsigned int mmDP0_DP_DPHY_PRBS_CNTL__VI = 0x4AB5; +constexpr unsigned int mmDP0_DP_DPHY_SYM0__VI = 0x4AB1; +constexpr unsigned int mmDP0_DP_DPHY_SYM1__VI = 0x4AB2; +constexpr unsigned int mmDP0_DP_DPHY_SYM2__VI = 0x4AB3; +constexpr unsigned int mmDP0_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4AB0; +constexpr unsigned int mmDP0_DP_FE_TEST_DEBUG_DATA__VI = 0x4ADB; +constexpr unsigned int mmDP0_DP_FE_TEST_DEBUG_INDEX__VI = 0x4ADA; +constexpr unsigned int mmDP0_DP_HBR2_EYE_PATTERN__VI = 0x4AAC; +constexpr unsigned int mmDP0_DP_LINK_CNTL__VI = 0x4AA0; +constexpr unsigned int mmDP0_DP_LINK_FRAMING_CNTL__VI = 0x4AAB; +constexpr unsigned int mmDP0_DP_MSA_COLORIMETRY__VI = 0x4AA2; +constexpr unsigned int mmDP0_DP_MSA_MISC__VI = 0x4AA6; +constexpr unsigned int mmDP0_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x4ABE; +constexpr unsigned int mmDP0_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x4ABF; +constexpr unsigned int mmDP0_DP_MSE_LINK_TIMING__VI = 0x4AD6; +constexpr unsigned int mmDP0_DP_MSE_MISC_CNTL__VI = 0x4AD7; +constexpr unsigned int mmDP0_DP_MSE_RATE_CNTL__VI = 0x4ACF; +constexpr unsigned int mmDP0_DP_MSE_RATE_UPDATE__VI = 0x4AD1; +constexpr unsigned int mmDP0_DP_MSE_SAT0__VI = 0x4AD2; +constexpr unsigned int mmDP0_DP_MSE_SAT1__VI = 0x4AD3; +constexpr unsigned int mmDP0_DP_MSE_SAT2__VI = 0x4AD4; +constexpr unsigned int mmDP0_DP_MSE_SAT_UPDATE__VI = 0x4AD5; +constexpr unsigned int mmDP0_DP_PIXEL_FORMAT__VI = 0x4AA1; +constexpr unsigned int mmDP0_DP_SEC_AUD_M__VI = 0x4ACB; +constexpr unsigned int mmDP0_DP_SEC_AUD_M_READBACK__VI = 0x4ACC; +constexpr unsigned int mmDP0_DP_SEC_AUD_N__VI = 0x4AC9; +constexpr unsigned int mmDP0_DP_SEC_AUD_N_READBACK__VI = 0x4ACA; +constexpr unsigned int mmDP0_DP_SEC_CNTL__VI = 0x4AC3; +constexpr unsigned int mmDP0_DP_SEC_CNTL1__VI = 0x4AC4; +constexpr unsigned int mmDP0_DP_SEC_FRAMING1__VI = 0x4AC5; +constexpr unsigned int mmDP0_DP_SEC_FRAMING2__VI = 0x4AC6; +constexpr unsigned int mmDP0_DP_SEC_FRAMING3__VI = 0x4AC7; +constexpr unsigned int mmDP0_DP_SEC_FRAMING4__VI = 0x4AC8; +constexpr unsigned int mmDP0_DP_SEC_PACKET_CNTL__VI = 0x4ACE; +constexpr unsigned int mmDP0_DP_SEC_TIMESTAMP__VI = 0x4ACD; +constexpr unsigned int mmDP0_DP_STEER_FIFO__VI = 0x4AA5; +constexpr unsigned int mmDP0_DP_TEST_DEBUG_DATA__VI = 0x4AD9; +constexpr unsigned int mmDP0_DP_TEST_DEBUG_INDEX__VI = 0x4AD8; +constexpr unsigned int mmDP0_DP_VID_INTERRUPT_CNTL__VI = 0x4AAE; +constexpr unsigned int mmDP0_DP_VID_M__VI = 0x4AAA; +constexpr unsigned int mmDP0_DP_VID_MSA_VBID__VI = 0x4AAD; +constexpr unsigned int mmDP0_DP_VID_N__VI = 0x4AA9; +constexpr unsigned int mmDP0_DP_VID_STREAM_CNTL__VI = 0x4AA4; +constexpr unsigned int mmDP0_DP_VID_TIMING__VI = 0x4AA8; +constexpr unsigned int mmDP1_DP_CONFIG__VI = 0x4BA3; +constexpr unsigned int mmDP1_DP_DPHY_8B10B_CNTL__VI = 0x4BB4; +constexpr unsigned int mmDP1_DP_DPHY_CNTL__VI = 0x4BAF; +constexpr unsigned int mmDP1_DP_DPHY_CRC_CNTL__VI = 0x4BB8; +constexpr unsigned int mmDP1_DP_DPHY_CRC_EN__VI = 0x4BB7; +constexpr unsigned int mmDP1_DP_DPHY_CRC_MST_CNTL__VI = 0x4BBA; +constexpr unsigned int mmDP1_DP_DPHY_CRC_MST_STATUS__VI = 0x4BBB; +constexpr unsigned int mmDP1_DP_DPHY_CRC_RESULT__VI = 0x4BB9; +constexpr unsigned int mmDP1_DP_DPHY_FAST_TRAINING__VI = 0x4BBC; +constexpr unsigned int mmDP1_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x4BBD; +constexpr unsigned int mmDP1_DP_DPHY_PRBS_CNTL__VI = 0x4BB5; +constexpr unsigned int mmDP1_DP_DPHY_SYM0__VI = 0x4BB1; +constexpr unsigned int mmDP1_DP_DPHY_SYM1__VI = 0x4BB2; +constexpr unsigned int mmDP1_DP_DPHY_SYM2__VI = 0x4BB3; +constexpr unsigned int mmDP1_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4BB0; +constexpr unsigned int mmDP1_DP_FE_TEST_DEBUG_DATA__VI = 0x4BDB; +constexpr unsigned int mmDP1_DP_FE_TEST_DEBUG_INDEX__VI = 0x4BDA; +constexpr unsigned int mmDP1_DP_HBR2_EYE_PATTERN__VI = 0x4BAC; +constexpr unsigned int mmDP1_DP_LINK_CNTL__VI = 0x4BA0; +constexpr unsigned int mmDP1_DP_LINK_FRAMING_CNTL__VI = 0x4BAB; +constexpr unsigned int mmDP1_DP_MSA_COLORIMETRY__VI = 0x4BA2; +constexpr unsigned int mmDP1_DP_MSA_MISC__VI = 0x4BA6; +constexpr unsigned int mmDP1_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x4BBE; +constexpr unsigned int mmDP1_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x4BBF; +constexpr unsigned int mmDP1_DP_MSE_LINK_TIMING__VI = 0x4BD6; +constexpr unsigned int mmDP1_DP_MSE_MISC_CNTL__VI = 0x4BD7; +constexpr unsigned int mmDP1_DP_MSE_RATE_CNTL__VI = 0x4BCF; +constexpr unsigned int mmDP1_DP_MSE_RATE_UPDATE__VI = 0x4BD1; +constexpr unsigned int mmDP1_DP_MSE_SAT0__VI = 0x4BD2; +constexpr unsigned int mmDP1_DP_MSE_SAT1__VI = 0x4BD3; +constexpr unsigned int mmDP1_DP_MSE_SAT2__VI = 0x4BD4; +constexpr unsigned int mmDP1_DP_MSE_SAT_UPDATE__VI = 0x4BD5; +constexpr unsigned int mmDP1_DP_PIXEL_FORMAT__VI = 0x4BA1; +constexpr unsigned int mmDP1_DP_SEC_AUD_M__VI = 0x4BCB; +constexpr unsigned int mmDP1_DP_SEC_AUD_M_READBACK__VI = 0x4BCC; +constexpr unsigned int mmDP1_DP_SEC_AUD_N__VI = 0x4BC9; +constexpr unsigned int mmDP1_DP_SEC_AUD_N_READBACK__VI = 0x4BCA; +constexpr unsigned int mmDP1_DP_SEC_CNTL__VI = 0x4BC3; +constexpr unsigned int mmDP1_DP_SEC_CNTL1__VI = 0x4BC4; +constexpr unsigned int mmDP1_DP_SEC_FRAMING1__VI = 0x4BC5; +constexpr unsigned int mmDP1_DP_SEC_FRAMING2__VI = 0x4BC6; +constexpr unsigned int mmDP1_DP_SEC_FRAMING3__VI = 0x4BC7; +constexpr unsigned int mmDP1_DP_SEC_FRAMING4__VI = 0x4BC8; +constexpr unsigned int mmDP1_DP_SEC_PACKET_CNTL__VI = 0x4BCE; +constexpr unsigned int mmDP1_DP_SEC_TIMESTAMP__VI = 0x4BCD; +constexpr unsigned int mmDP1_DP_STEER_FIFO__VI = 0x4BA5; +constexpr unsigned int mmDP1_DP_TEST_DEBUG_DATA__VI = 0x4BD9; +constexpr unsigned int mmDP1_DP_TEST_DEBUG_INDEX__VI = 0x4BD8; +constexpr unsigned int mmDP1_DP_VID_INTERRUPT_CNTL__VI = 0x4BAE; +constexpr unsigned int mmDP1_DP_VID_M__VI = 0x4BAA; +constexpr unsigned int mmDP1_DP_VID_MSA_VBID__VI = 0x4BAD; +constexpr unsigned int mmDP1_DP_VID_N__VI = 0x4BA9; +constexpr unsigned int mmDP1_DP_VID_STREAM_CNTL__VI = 0x4BA4; +constexpr unsigned int mmDP1_DP_VID_TIMING__VI = 0x4BA8; +constexpr unsigned int mmDP2_DP_CONFIG__VI = 0x4CA3; +constexpr unsigned int mmDP2_DP_DPHY_8B10B_CNTL__VI = 0x4CB4; +constexpr unsigned int mmDP2_DP_DPHY_CNTL__VI = 0x4CAF; +constexpr unsigned int mmDP2_DP_DPHY_CRC_CNTL__VI = 0x4CB8; +constexpr unsigned int mmDP2_DP_DPHY_CRC_EN__VI = 0x4CB7; +constexpr unsigned int mmDP2_DP_DPHY_CRC_MST_CNTL__VI = 0x4CBA; +constexpr unsigned int mmDP2_DP_DPHY_CRC_MST_STATUS__VI = 0x4CBB; +constexpr unsigned int mmDP2_DP_DPHY_CRC_RESULT__VI = 0x4CB9; +constexpr unsigned int mmDP2_DP_DPHY_FAST_TRAINING__VI = 0x4CBC; +constexpr unsigned int mmDP2_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x4CBD; +constexpr unsigned int mmDP2_DP_DPHY_PRBS_CNTL__VI = 0x4CB5; +constexpr unsigned int mmDP2_DP_DPHY_SYM0__VI = 0x4CB1; +constexpr unsigned int mmDP2_DP_DPHY_SYM1__VI = 0x4CB2; +constexpr unsigned int mmDP2_DP_DPHY_SYM2__VI = 0x4CB3; +constexpr unsigned int mmDP2_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4CB0; +constexpr unsigned int mmDP2_DP_FE_TEST_DEBUG_DATA__VI = 0x4CDB; +constexpr unsigned int mmDP2_DP_FE_TEST_DEBUG_INDEX__VI = 0x4CDA; +constexpr unsigned int mmDP2_DP_HBR2_EYE_PATTERN__VI = 0x4CAC; +constexpr unsigned int mmDP2_DP_LINK_CNTL__VI = 0x4CA0; +constexpr unsigned int mmDP2_DP_LINK_FRAMING_CNTL__VI = 0x4CAB; +constexpr unsigned int mmDP2_DP_MSA_COLORIMETRY__VI = 0x4CA2; +constexpr unsigned int mmDP2_DP_MSA_MISC__VI = 0x4CA6; +constexpr unsigned int mmDP2_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x4CBE; +constexpr unsigned int mmDP2_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x4CBF; +constexpr unsigned int mmDP2_DP_MSE_LINK_TIMING__VI = 0x4CD6; +constexpr unsigned int mmDP2_DP_MSE_MISC_CNTL__VI = 0x4CD7; +constexpr unsigned int mmDP2_DP_MSE_RATE_CNTL__VI = 0x4CCF; +constexpr unsigned int mmDP2_DP_MSE_RATE_UPDATE__VI = 0x4CD1; +constexpr unsigned int mmDP2_DP_MSE_SAT0__VI = 0x4CD2; +constexpr unsigned int mmDP2_DP_MSE_SAT1__VI = 0x4CD3; +constexpr unsigned int mmDP2_DP_MSE_SAT2__VI = 0x4CD4; +constexpr unsigned int mmDP2_DP_MSE_SAT_UPDATE__VI = 0x4CD5; +constexpr unsigned int mmDP2_DP_PIXEL_FORMAT__VI = 0x4CA1; +constexpr unsigned int mmDP2_DP_SEC_AUD_M__VI = 0x4CCB; +constexpr unsigned int mmDP2_DP_SEC_AUD_M_READBACK__VI = 0x4CCC; +constexpr unsigned int mmDP2_DP_SEC_AUD_N__VI = 0x4CC9; +constexpr unsigned int mmDP2_DP_SEC_AUD_N_READBACK__VI = 0x4CCA; +constexpr unsigned int mmDP2_DP_SEC_CNTL__VI = 0x4CC3; +constexpr unsigned int mmDP2_DP_SEC_CNTL1__VI = 0x4CC4; +constexpr unsigned int mmDP2_DP_SEC_FRAMING1__VI = 0x4CC5; +constexpr unsigned int mmDP2_DP_SEC_FRAMING2__VI = 0x4CC6; +constexpr unsigned int mmDP2_DP_SEC_FRAMING3__VI = 0x4CC7; +constexpr unsigned int mmDP2_DP_SEC_FRAMING4__VI = 0x4CC8; +constexpr unsigned int mmDP2_DP_SEC_PACKET_CNTL__VI = 0x4CCE; +constexpr unsigned int mmDP2_DP_SEC_TIMESTAMP__VI = 0x4CCD; +constexpr unsigned int mmDP2_DP_STEER_FIFO__VI = 0x4CA5; +constexpr unsigned int mmDP2_DP_TEST_DEBUG_DATA__VI = 0x4CD9; +constexpr unsigned int mmDP2_DP_TEST_DEBUG_INDEX__VI = 0x4CD8; +constexpr unsigned int mmDP2_DP_VID_INTERRUPT_CNTL__VI = 0x4CAE; +constexpr unsigned int mmDP2_DP_VID_M__VI = 0x4CAA; +constexpr unsigned int mmDP2_DP_VID_MSA_VBID__VI = 0x4CAD; +constexpr unsigned int mmDP2_DP_VID_N__VI = 0x4CA9; +constexpr unsigned int mmDP2_DP_VID_STREAM_CNTL__VI = 0x4CA4; +constexpr unsigned int mmDP2_DP_VID_TIMING__VI = 0x4CA8; +constexpr unsigned int mmDP3_DP_CONFIG__VI = 0x4DA3; +constexpr unsigned int mmDP3_DP_DPHY_8B10B_CNTL__VI = 0x4DB4; +constexpr unsigned int mmDP3_DP_DPHY_CNTL__VI = 0x4DAF; +constexpr unsigned int mmDP3_DP_DPHY_CRC_CNTL__VI = 0x4DB8; +constexpr unsigned int mmDP3_DP_DPHY_CRC_EN__VI = 0x4DB7; +constexpr unsigned int mmDP3_DP_DPHY_CRC_MST_CNTL__VI = 0x4DBA; +constexpr unsigned int mmDP3_DP_DPHY_CRC_MST_STATUS__VI = 0x4DBB; +constexpr unsigned int mmDP3_DP_DPHY_CRC_RESULT__VI = 0x4DB9; +constexpr unsigned int mmDP3_DP_DPHY_FAST_TRAINING__VI = 0x4DBC; +constexpr unsigned int mmDP3_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x4DBD; +constexpr unsigned int mmDP3_DP_DPHY_PRBS_CNTL__VI = 0x4DB5; +constexpr unsigned int mmDP3_DP_DPHY_SYM0__VI = 0x4DB1; +constexpr unsigned int mmDP3_DP_DPHY_SYM1__VI = 0x4DB2; +constexpr unsigned int mmDP3_DP_DPHY_SYM2__VI = 0x4DB3; +constexpr unsigned int mmDP3_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4DB0; +constexpr unsigned int mmDP3_DP_FE_TEST_DEBUG_DATA__VI = 0x4DDB; +constexpr unsigned int mmDP3_DP_FE_TEST_DEBUG_INDEX__VI = 0x4DDA; +constexpr unsigned int mmDP3_DP_HBR2_EYE_PATTERN__VI = 0x4DAC; +constexpr unsigned int mmDP3_DP_LINK_CNTL__VI = 0x4DA0; +constexpr unsigned int mmDP3_DP_LINK_FRAMING_CNTL__VI = 0x4DAB; +constexpr unsigned int mmDP3_DP_MSA_COLORIMETRY__VI = 0x4DA2; +constexpr unsigned int mmDP3_DP_MSA_MISC__VI = 0x4DA6; +constexpr unsigned int mmDP3_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x4DBE; +constexpr unsigned int mmDP3_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x4DBF; +constexpr unsigned int mmDP3_DP_MSE_LINK_TIMING__VI = 0x4DD6; +constexpr unsigned int mmDP3_DP_MSE_MISC_CNTL__VI = 0x4DD7; +constexpr unsigned int mmDP3_DP_MSE_RATE_CNTL__VI = 0x4DCF; +constexpr unsigned int mmDP3_DP_MSE_RATE_UPDATE__VI = 0x4DD1; +constexpr unsigned int mmDP3_DP_MSE_SAT0__VI = 0x4DD2; +constexpr unsigned int mmDP3_DP_MSE_SAT1__VI = 0x4DD3; +constexpr unsigned int mmDP3_DP_MSE_SAT2__VI = 0x4DD4; +constexpr unsigned int mmDP3_DP_MSE_SAT_UPDATE__VI = 0x4DD5; +constexpr unsigned int mmDP3_DP_PIXEL_FORMAT__VI = 0x4DA1; +constexpr unsigned int mmDP3_DP_SEC_AUD_M__VI = 0x4DCB; +constexpr unsigned int mmDP3_DP_SEC_AUD_M_READBACK__VI = 0x4DCC; +constexpr unsigned int mmDP3_DP_SEC_AUD_N__VI = 0x4DC9; +constexpr unsigned int mmDP3_DP_SEC_AUD_N_READBACK__VI = 0x4DCA; +constexpr unsigned int mmDP3_DP_SEC_CNTL__VI = 0x4DC3; +constexpr unsigned int mmDP3_DP_SEC_CNTL1__VI = 0x4DC4; +constexpr unsigned int mmDP3_DP_SEC_FRAMING1__VI = 0x4DC5; +constexpr unsigned int mmDP3_DP_SEC_FRAMING2__VI = 0x4DC6; +constexpr unsigned int mmDP3_DP_SEC_FRAMING3__VI = 0x4DC7; +constexpr unsigned int mmDP3_DP_SEC_FRAMING4__VI = 0x4DC8; +constexpr unsigned int mmDP3_DP_SEC_PACKET_CNTL__VI = 0x4DCE; +constexpr unsigned int mmDP3_DP_SEC_TIMESTAMP__VI = 0x4DCD; +constexpr unsigned int mmDP3_DP_STEER_FIFO__VI = 0x4DA5; +constexpr unsigned int mmDP3_DP_TEST_DEBUG_DATA__VI = 0x4DD9; +constexpr unsigned int mmDP3_DP_TEST_DEBUG_INDEX__VI = 0x4DD8; +constexpr unsigned int mmDP3_DP_VID_INTERRUPT_CNTL__VI = 0x4DAE; +constexpr unsigned int mmDP3_DP_VID_M__VI = 0x4DAA; +constexpr unsigned int mmDP3_DP_VID_MSA_VBID__VI = 0x4DAD; +constexpr unsigned int mmDP3_DP_VID_N__VI = 0x4DA9; +constexpr unsigned int mmDP3_DP_VID_STREAM_CNTL__VI = 0x4DA4; +constexpr unsigned int mmDP3_DP_VID_TIMING__VI = 0x4DA8; +constexpr unsigned int mmDP4_DP_CONFIG__VI = 0x4EA3; +constexpr unsigned int mmDP4_DP_DPHY_8B10B_CNTL__VI = 0x4EB4; +constexpr unsigned int mmDP4_DP_DPHY_CNTL__VI = 0x4EAF; +constexpr unsigned int mmDP4_DP_DPHY_CRC_CNTL__VI = 0x4EB8; +constexpr unsigned int mmDP4_DP_DPHY_CRC_EN__VI = 0x4EB7; +constexpr unsigned int mmDP4_DP_DPHY_CRC_MST_CNTL__VI = 0x4EBA; +constexpr unsigned int mmDP4_DP_DPHY_CRC_MST_STATUS__VI = 0x4EBB; +constexpr unsigned int mmDP4_DP_DPHY_CRC_RESULT__VI = 0x4EB9; +constexpr unsigned int mmDP4_DP_DPHY_FAST_TRAINING__VI = 0x4EBC; +constexpr unsigned int mmDP4_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x4EBD; +constexpr unsigned int mmDP4_DP_DPHY_PRBS_CNTL__VI = 0x4EB5; +constexpr unsigned int mmDP4_DP_DPHY_SYM0__VI = 0x4EB1; +constexpr unsigned int mmDP4_DP_DPHY_SYM1__VI = 0x4EB2; +constexpr unsigned int mmDP4_DP_DPHY_SYM2__VI = 0x4EB3; +constexpr unsigned int mmDP4_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4EB0; +constexpr unsigned int mmDP4_DP_FE_TEST_DEBUG_DATA__VI = 0x4EDB; +constexpr unsigned int mmDP4_DP_FE_TEST_DEBUG_INDEX__VI = 0x4EDA; +constexpr unsigned int mmDP4_DP_HBR2_EYE_PATTERN__VI = 0x4EAC; +constexpr unsigned int mmDP4_DP_LINK_CNTL__VI = 0x4EA0; +constexpr unsigned int mmDP4_DP_LINK_FRAMING_CNTL__VI = 0x4EAB; +constexpr unsigned int mmDP4_DP_MSA_COLORIMETRY__VI = 0x4EA2; +constexpr unsigned int mmDP4_DP_MSA_MISC__VI = 0x4EA6; +constexpr unsigned int mmDP4_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x4EBE; +constexpr unsigned int mmDP4_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x4EBF; +constexpr unsigned int mmDP4_DP_MSE_LINK_TIMING__VI = 0x4ED6; +constexpr unsigned int mmDP4_DP_MSE_MISC_CNTL__VI = 0x4ED7; +constexpr unsigned int mmDP4_DP_MSE_RATE_CNTL__VI = 0x4ECF; +constexpr unsigned int mmDP4_DP_MSE_RATE_UPDATE__VI = 0x4ED1; +constexpr unsigned int mmDP4_DP_MSE_SAT0__VI = 0x4ED2; +constexpr unsigned int mmDP4_DP_MSE_SAT1__VI = 0x4ED3; +constexpr unsigned int mmDP4_DP_MSE_SAT2__VI = 0x4ED4; +constexpr unsigned int mmDP4_DP_MSE_SAT_UPDATE__VI = 0x4ED5; +constexpr unsigned int mmDP4_DP_PIXEL_FORMAT__VI = 0x4EA1; +constexpr unsigned int mmDP4_DP_SEC_AUD_M__VI = 0x4ECB; +constexpr unsigned int mmDP4_DP_SEC_AUD_M_READBACK__VI = 0x4ECC; +constexpr unsigned int mmDP4_DP_SEC_AUD_N__VI = 0x4EC9; +constexpr unsigned int mmDP4_DP_SEC_AUD_N_READBACK__VI = 0x4ECA; +constexpr unsigned int mmDP4_DP_SEC_CNTL__VI = 0x4EC3; +constexpr unsigned int mmDP4_DP_SEC_CNTL1__VI = 0x4EC4; +constexpr unsigned int mmDP4_DP_SEC_FRAMING1__VI = 0x4EC5; +constexpr unsigned int mmDP4_DP_SEC_FRAMING2__VI = 0x4EC6; +constexpr unsigned int mmDP4_DP_SEC_FRAMING3__VI = 0x4EC7; +constexpr unsigned int mmDP4_DP_SEC_FRAMING4__VI = 0x4EC8; +constexpr unsigned int mmDP4_DP_SEC_PACKET_CNTL__VI = 0x4ECE; +constexpr unsigned int mmDP4_DP_SEC_TIMESTAMP__VI = 0x4ECD; +constexpr unsigned int mmDP4_DP_STEER_FIFO__VI = 0x4EA5; +constexpr unsigned int mmDP4_DP_TEST_DEBUG_DATA__VI = 0x4ED9; +constexpr unsigned int mmDP4_DP_TEST_DEBUG_INDEX__VI = 0x4ED8; +constexpr unsigned int mmDP4_DP_VID_INTERRUPT_CNTL__VI = 0x4EAE; +constexpr unsigned int mmDP4_DP_VID_M__VI = 0x4EAA; +constexpr unsigned int mmDP4_DP_VID_MSA_VBID__VI = 0x4EAD; +constexpr unsigned int mmDP4_DP_VID_N__VI = 0x4EA9; +constexpr unsigned int mmDP4_DP_VID_STREAM_CNTL__VI = 0x4EA4; +constexpr unsigned int mmDP4_DP_VID_TIMING__VI = 0x4EA8; +constexpr unsigned int mmDP5_DP_CONFIG__VI = 0x4FA3; +constexpr unsigned int mmDP5_DP_DPHY_8B10B_CNTL__VI = 0x4FB4; +constexpr unsigned int mmDP5_DP_DPHY_CNTL__VI = 0x4FAF; +constexpr unsigned int mmDP5_DP_DPHY_CRC_CNTL__VI = 0x4FB8; +constexpr unsigned int mmDP5_DP_DPHY_CRC_EN__VI = 0x4FB7; +constexpr unsigned int mmDP5_DP_DPHY_CRC_MST_CNTL__VI = 0x4FBA; +constexpr unsigned int mmDP5_DP_DPHY_CRC_MST_STATUS__VI = 0x4FBB; +constexpr unsigned int mmDP5_DP_DPHY_CRC_RESULT__VI = 0x4FB9; +constexpr unsigned int mmDP5_DP_DPHY_FAST_TRAINING__VI = 0x4FBC; +constexpr unsigned int mmDP5_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x4FBD; +constexpr unsigned int mmDP5_DP_DPHY_PRBS_CNTL__VI = 0x4FB5; +constexpr unsigned int mmDP5_DP_DPHY_SYM0__VI = 0x4FB1; +constexpr unsigned int mmDP5_DP_DPHY_SYM1__VI = 0x4FB2; +constexpr unsigned int mmDP5_DP_DPHY_SYM2__VI = 0x4FB3; +constexpr unsigned int mmDP5_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4FB0; +constexpr unsigned int mmDP5_DP_FE_TEST_DEBUG_DATA__VI = 0x4FDB; +constexpr unsigned int mmDP5_DP_FE_TEST_DEBUG_INDEX__VI = 0x4FDA; +constexpr unsigned int mmDP5_DP_HBR2_EYE_PATTERN__VI = 0x4FAC; +constexpr unsigned int mmDP5_DP_LINK_CNTL__VI = 0x4FA0; +constexpr unsigned int mmDP5_DP_LINK_FRAMING_CNTL__VI = 0x4FAB; +constexpr unsigned int mmDP5_DP_MSA_COLORIMETRY__VI = 0x4FA2; +constexpr unsigned int mmDP5_DP_MSA_MISC__VI = 0x4FA6; +constexpr unsigned int mmDP5_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x4FBE; +constexpr unsigned int mmDP5_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x4FBF; +constexpr unsigned int mmDP5_DP_MSE_LINK_TIMING__VI = 0x4FD6; +constexpr unsigned int mmDP5_DP_MSE_MISC_CNTL__VI = 0x4FD7; +constexpr unsigned int mmDP5_DP_MSE_RATE_CNTL__VI = 0x4FCF; +constexpr unsigned int mmDP5_DP_MSE_RATE_UPDATE__VI = 0x4FD1; +constexpr unsigned int mmDP5_DP_MSE_SAT0__VI = 0x4FD2; +constexpr unsigned int mmDP5_DP_MSE_SAT1__VI = 0x4FD3; +constexpr unsigned int mmDP5_DP_MSE_SAT2__VI = 0x4FD4; +constexpr unsigned int mmDP5_DP_MSE_SAT_UPDATE__VI = 0x4FD5; +constexpr unsigned int mmDP5_DP_PIXEL_FORMAT__VI = 0x4FA1; +constexpr unsigned int mmDP5_DP_SEC_AUD_M__VI = 0x4FCB; +constexpr unsigned int mmDP5_DP_SEC_AUD_M_READBACK__VI = 0x4FCC; +constexpr unsigned int mmDP5_DP_SEC_AUD_N__VI = 0x4FC9; +constexpr unsigned int mmDP5_DP_SEC_AUD_N_READBACK__VI = 0x4FCA; +constexpr unsigned int mmDP5_DP_SEC_CNTL__VI = 0x4FC3; +constexpr unsigned int mmDP5_DP_SEC_CNTL1__VI = 0x4FC4; +constexpr unsigned int mmDP5_DP_SEC_FRAMING1__VI = 0x4FC5; +constexpr unsigned int mmDP5_DP_SEC_FRAMING2__VI = 0x4FC6; +constexpr unsigned int mmDP5_DP_SEC_FRAMING3__VI = 0x4FC7; +constexpr unsigned int mmDP5_DP_SEC_FRAMING4__VI = 0x4FC8; +constexpr unsigned int mmDP5_DP_SEC_PACKET_CNTL__VI = 0x4FCE; +constexpr unsigned int mmDP5_DP_SEC_TIMESTAMP__VI = 0x4FCD; +constexpr unsigned int mmDP5_DP_STEER_FIFO__VI = 0x4FA5; +constexpr unsigned int mmDP5_DP_TEST_DEBUG_DATA__VI = 0x4FD9; +constexpr unsigned int mmDP5_DP_TEST_DEBUG_INDEX__VI = 0x4FD8; +constexpr unsigned int mmDP5_DP_VID_INTERRUPT_CNTL__VI = 0x4FAE; +constexpr unsigned int mmDP5_DP_VID_M__VI = 0x4FAA; +constexpr unsigned int mmDP5_DP_VID_MSA_VBID__VI = 0x4FAD; +constexpr unsigned int mmDP5_DP_VID_N__VI = 0x4FA9; +constexpr unsigned int mmDP5_DP_VID_STREAM_CNTL__VI = 0x4FA4; +constexpr unsigned int mmDP5_DP_VID_TIMING__VI = 0x4FA8; +constexpr unsigned int mmDP6_DP_CONFIG__VI = 0x54A3; +constexpr unsigned int mmDP6_DP_DPHY_8B10B_CNTL__VI = 0x54B4; +constexpr unsigned int mmDP6_DP_DPHY_CNTL__VI = 0x54AF; +constexpr unsigned int mmDP6_DP_DPHY_CRC_CNTL__VI = 0x54B8; +constexpr unsigned int mmDP6_DP_DPHY_CRC_EN__VI = 0x54B7; +constexpr unsigned int mmDP6_DP_DPHY_CRC_MST_CNTL__VI = 0x54BA; +constexpr unsigned int mmDP6_DP_DPHY_CRC_MST_STATUS__VI = 0x54BB; +constexpr unsigned int mmDP6_DP_DPHY_CRC_RESULT__VI = 0x54B9; +constexpr unsigned int mmDP6_DP_DPHY_FAST_TRAINING__VI = 0x54BC; +constexpr unsigned int mmDP6_DP_DPHY_FAST_TRAINING_STATUS__VI = 0x54BD; +constexpr unsigned int mmDP6_DP_DPHY_PRBS_CNTL__VI = 0x54B5; +constexpr unsigned int mmDP6_DP_DPHY_SYM0__VI = 0x54B1; +constexpr unsigned int mmDP6_DP_DPHY_SYM1__VI = 0x54B2; +constexpr unsigned int mmDP6_DP_DPHY_SYM2__VI = 0x54B3; +constexpr unsigned int mmDP6_DP_DPHY_TRAINING_PATTERN_SEL__VI = 0x54B0; +constexpr unsigned int mmDP6_DP_FE_TEST_DEBUG_DATA__VI = 0x54DB; +constexpr unsigned int mmDP6_DP_FE_TEST_DEBUG_INDEX__VI = 0x54DA; +constexpr unsigned int mmDP6_DP_HBR2_EYE_PATTERN__VI = 0x54AC; +constexpr unsigned int mmDP6_DP_LINK_CNTL__VI = 0x54A0; +constexpr unsigned int mmDP6_DP_LINK_FRAMING_CNTL__VI = 0x54AB; +constexpr unsigned int mmDP6_DP_MSA_COLORIMETRY__VI = 0x54A2; +constexpr unsigned int mmDP6_DP_MSA_MISC__VI = 0x54A6; +constexpr unsigned int mmDP6_DP_MSA_V_TIMING_OVERRIDE1__VI = 0x54BE; +constexpr unsigned int mmDP6_DP_MSA_V_TIMING_OVERRIDE2__VI = 0x54BF; +constexpr unsigned int mmDP6_DP_MSE_LINK_TIMING__VI = 0x54D6; +constexpr unsigned int mmDP6_DP_MSE_MISC_CNTL__VI = 0x54D7; +constexpr unsigned int mmDP6_DP_MSE_RATE_CNTL__VI = 0x54CF; +constexpr unsigned int mmDP6_DP_MSE_RATE_UPDATE__VI = 0x54D1; +constexpr unsigned int mmDP6_DP_MSE_SAT0__VI = 0x54D2; +constexpr unsigned int mmDP6_DP_MSE_SAT1__VI = 0x54D3; +constexpr unsigned int mmDP6_DP_MSE_SAT2__VI = 0x54D4; +constexpr unsigned int mmDP6_DP_MSE_SAT_UPDATE__VI = 0x54D5; +constexpr unsigned int mmDP6_DP_PIXEL_FORMAT__VI = 0x54A1; +constexpr unsigned int mmDP6_DP_SEC_AUD_M__VI = 0x54CB; +constexpr unsigned int mmDP6_DP_SEC_AUD_M_READBACK__VI = 0x54CC; +constexpr unsigned int mmDP6_DP_SEC_AUD_N__VI = 0x54C9; +constexpr unsigned int mmDP6_DP_SEC_AUD_N_READBACK__VI = 0x54CA; +constexpr unsigned int mmDP6_DP_SEC_CNTL__VI = 0x54C3; +constexpr unsigned int mmDP6_DP_SEC_CNTL1__VI = 0x54C4; +constexpr unsigned int mmDP6_DP_SEC_FRAMING1__VI = 0x54C5; +constexpr unsigned int mmDP6_DP_SEC_FRAMING2__VI = 0x54C6; +constexpr unsigned int mmDP6_DP_SEC_FRAMING3__VI = 0x54C7; +constexpr unsigned int mmDP6_DP_SEC_FRAMING4__VI = 0x54C8; +constexpr unsigned int mmDP6_DP_SEC_PACKET_CNTL__VI = 0x54CE; +constexpr unsigned int mmDP6_DP_SEC_TIMESTAMP__VI = 0x54CD; +constexpr unsigned int mmDP6_DP_STEER_FIFO__VI = 0x54A5; +constexpr unsigned int mmDP6_DP_TEST_DEBUG_DATA__VI = 0x54D9; +constexpr unsigned int mmDP6_DP_TEST_DEBUG_INDEX__VI = 0x54D8; +constexpr unsigned int mmDP6_DP_VID_INTERRUPT_CNTL__VI = 0x54AE; +constexpr unsigned int mmDP6_DP_VID_M__VI = 0x54AA; +constexpr unsigned int mmDP6_DP_VID_MSA_VBID__VI = 0x54AD; +constexpr unsigned int mmDP6_DP_VID_N__VI = 0x54A9; +constexpr unsigned int mmDP6_DP_VID_STREAM_CNTL__VI = 0x54A4; +constexpr unsigned int mmDP6_DP_VID_TIMING__VI = 0x54A8; +constexpr unsigned int mmDPDBG_CLK_FORCE_CONTROL__VI = 0x010D; +constexpr unsigned int mmDPDBG_CNTL__VI = 0x1866; +constexpr unsigned int mmDPDBG_INTERRUPT__VI = 0x1867; +constexpr unsigned int mmDPG_HW_DEBUG_11__VI = 0x1B3D; +constexpr unsigned int mmDPG_HW_DEBUG_A__VI = 0x1B3B; +constexpr unsigned int mmDPG_HW_DEBUG_B__VI = 0x1B3C; +constexpr unsigned int mmDPG_PIPE_ARBITRATION_CONTROL1__VI = 0x1B30; +constexpr unsigned int mmDPG_PIPE_ARBITRATION_CONTROL2__VI = 0x1B31; +constexpr unsigned int mmDPG_PIPE_DPM_CONTROL__VI = 0x1B34; +constexpr unsigned int mmDPG_PIPE_NB_PSTATE_CHANGE_CONTROL__VI = 0x1B36; +constexpr unsigned int mmDPG_PIPE_STUTTER_CONTROL__VI = 0x1B35; +constexpr unsigned int mmDPG_PIPE_STUTTER_CONTROL_NONLPTCH__VI = 0x1B37; +constexpr unsigned int mmDPG_PIPE_URGENCY_CONTROL__VI = 0x1B33; +constexpr unsigned int mmDPG_REPEATER_PROGRAM__VI = 0x1B3A; +constexpr unsigned int mmDPG_TEST_DEBUG_DATA__VI = 0x1B39; +constexpr unsigned int mmDPG_TEST_DEBUG_INDEX__VI = 0x1B38; +constexpr unsigned int mmDPG_WATERMARK_MASK_CONTROL__VI = 0x1B32; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED0__VI = 0x5D98; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED1__VI = 0x5D99; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED10__VI = 0x5DA2; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED11__VI = 0x5DA3; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED12__VI = 0x5DA4; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED13__VI = 0x5DA5; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED14__VI = 0x5DA6; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED15__VI = 0x5DA7; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED16__VI = 0x5DA8; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED17__VI = 0x5DA9; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED18__VI = 0x5DAA; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED19__VI = 0x5DAB; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED2__VI = 0x5D9A; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED20__VI = 0x5DAC; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED21__VI = 0x5DAD; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED22__VI = 0x5DAE; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED23__VI = 0x5DAF; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED24__VI = 0x5DB0; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED25__VI = 0x5DB1; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED26__VI = 0x5DB2; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED27__VI = 0x5DB3; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED28__VI = 0x5DB4; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED29__VI = 0x5DB5; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED3__VI = 0x5D9B; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED30__VI = 0x5DB6; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED31__VI = 0x5DB7; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED32__VI = 0x5DB8; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED33__VI = 0x5DB9; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED34__VI = 0x5DBA; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED35__VI = 0x5DBB; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED36__VI = 0x5DBC; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED37__VI = 0x5DBD; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED38__VI = 0x5DBE; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED39__VI = 0x5DBF; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED4__VI = 0x5D9C; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED40__VI = 0x5DC0; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED41__VI = 0x5DC1; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED42__VI = 0x5DC2; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED43__VI = 0x5DC3; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED44__VI = 0x5DC4; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED45__VI = 0x5DC5; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED46__VI = 0x5DC6; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED47__VI = 0x5DC7; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED48__VI = 0x5DC8; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED49__VI = 0x5DC9; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED5__VI = 0x5D9D; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED50__VI = 0x5DCA; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED51__VI = 0x5DCB; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED52__VI = 0x5DCC; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED53__VI = 0x5DCD; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED54__VI = 0x5DCE; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED55__VI = 0x5DCF; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED56__VI = 0x5DD0; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED57__VI = 0x5DD1; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED58__VI = 0x5DD2; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED59__VI = 0x5DD3; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED6__VI = 0x5D9E; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED60__VI = 0x5DD4; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED61__VI = 0x5DD5; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED62__VI = 0x5DD6; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED63__VI = 0x5DD7; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED7__VI = 0x5D9F; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED8__VI = 0x5DA0; +constexpr unsigned int mmDPHY_MACRO_CNTL_RESERVED9__VI = 0x5DA1; +constexpr unsigned int mmDPREFCLK_CGTT_BLK_CTRL_REG__VI = 0x0108; +constexpr unsigned int mmDPREFCLK_CNTL__VI = 0x0118; +constexpr unsigned int mmDP_AUX0_AUX_ARB_CONTROL__VI = 0x5C02; +constexpr unsigned int mmDP_AUX0_AUX_CONTROL__VI = 0x5C00; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_RX_CONTROL0__VI = 0x5C0A; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_RX_CONTROL1__VI = 0x5C0B; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_RX_STATUS__VI = 0x5C0D; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_TX_CONTROL__VI = 0x5C09; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_TX_REF_CONTROL__VI = 0x5C08; +constexpr unsigned int mmDP_AUX0_AUX_DPHY_TX_STATUS__VI = 0x5C0C; +constexpr unsigned int mmDP_AUX0_AUX_GTC_SYNC_CONTROL__VI = 0x5C0E; +constexpr unsigned int mmDP_AUX0_AUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C10; +constexpr unsigned int mmDP_AUX0_AUX_GTC_SYNC_DATA__VI = 0x5C12; +constexpr unsigned int mmDP_AUX0_AUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C0F; +constexpr unsigned int mmDP_AUX0_AUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C13; +constexpr unsigned int mmDP_AUX0_AUX_GTC_SYNC_STATUS__VI = 0x5C11; +constexpr unsigned int mmDP_AUX0_AUX_INTERRUPT_CONTROL__VI = 0x5C03; +constexpr unsigned int mmDP_AUX0_AUX_LS_DATA__VI = 0x5C07; +constexpr unsigned int mmDP_AUX0_AUX_LS_STATUS__VI = 0x5C05; +constexpr unsigned int mmDP_AUX0_AUX_SW_CONTROL__VI = 0x5C01; +constexpr unsigned int mmDP_AUX0_AUX_SW_DATA__VI = 0x5C06; +constexpr unsigned int mmDP_AUX0_AUX_SW_STATUS__VI = 0x5C04; +constexpr unsigned int mmDP_AUX0_AUX_TEST_DEBUG_DATA__VI = 0x5C15; +constexpr unsigned int mmDP_AUX0_AUX_TEST_DEBUG_INDEX__VI = 0x5C14; +constexpr unsigned int mmDP_AUX1_AUX_ARB_CONTROL__VI = 0x5C1E; +constexpr unsigned int mmDP_AUX1_AUX_CONTROL__VI = 0x5C1C; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_RX_CONTROL0__VI = 0x5C26; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_RX_CONTROL1__VI = 0x5C27; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_RX_STATUS__VI = 0x5C29; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_TX_CONTROL__VI = 0x5C25; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_TX_REF_CONTROL__VI = 0x5C24; +constexpr unsigned int mmDP_AUX1_AUX_DPHY_TX_STATUS__VI = 0x5C28; +constexpr unsigned int mmDP_AUX1_AUX_GTC_SYNC_CONTROL__VI = 0x5C2A; +constexpr unsigned int mmDP_AUX1_AUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C2C; +constexpr unsigned int mmDP_AUX1_AUX_GTC_SYNC_DATA__VI = 0x5C2E; +constexpr unsigned int mmDP_AUX1_AUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C2B; +constexpr unsigned int mmDP_AUX1_AUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C2F; +constexpr unsigned int mmDP_AUX1_AUX_GTC_SYNC_STATUS__VI = 0x5C2D; +constexpr unsigned int mmDP_AUX1_AUX_INTERRUPT_CONTROL__VI = 0x5C1F; +constexpr unsigned int mmDP_AUX1_AUX_LS_DATA__VI = 0x5C23; +constexpr unsigned int mmDP_AUX1_AUX_LS_STATUS__VI = 0x5C21; +constexpr unsigned int mmDP_AUX1_AUX_SW_CONTROL__VI = 0x5C1D; +constexpr unsigned int mmDP_AUX1_AUX_SW_DATA__VI = 0x5C22; +constexpr unsigned int mmDP_AUX1_AUX_SW_STATUS__VI = 0x5C20; +constexpr unsigned int mmDP_AUX1_AUX_TEST_DEBUG_DATA__VI = 0x5C31; +constexpr unsigned int mmDP_AUX1_AUX_TEST_DEBUG_INDEX__VI = 0x5C30; +constexpr unsigned int mmDP_AUX2_AUX_ARB_CONTROL__VI = 0x5C3A; +constexpr unsigned int mmDP_AUX2_AUX_CONTROL__VI = 0x5C38; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_RX_CONTROL0__VI = 0x5C42; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_RX_CONTROL1__VI = 0x5C43; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_RX_STATUS__VI = 0x5C45; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_TX_CONTROL__VI = 0x5C41; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_TX_REF_CONTROL__VI = 0x5C40; +constexpr unsigned int mmDP_AUX2_AUX_DPHY_TX_STATUS__VI = 0x5C44; +constexpr unsigned int mmDP_AUX2_AUX_GTC_SYNC_CONTROL__VI = 0x5C46; +constexpr unsigned int mmDP_AUX2_AUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C48; +constexpr unsigned int mmDP_AUX2_AUX_GTC_SYNC_DATA__VI = 0x5C4A; +constexpr unsigned int mmDP_AUX2_AUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C47; +constexpr unsigned int mmDP_AUX2_AUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C4B; +constexpr unsigned int mmDP_AUX2_AUX_GTC_SYNC_STATUS__VI = 0x5C49; +constexpr unsigned int mmDP_AUX2_AUX_INTERRUPT_CONTROL__VI = 0x5C3B; +constexpr unsigned int mmDP_AUX2_AUX_LS_DATA__VI = 0x5C3F; +constexpr unsigned int mmDP_AUX2_AUX_LS_STATUS__VI = 0x5C3D; +constexpr unsigned int mmDP_AUX2_AUX_SW_CONTROL__VI = 0x5C39; +constexpr unsigned int mmDP_AUX2_AUX_SW_DATA__VI = 0x5C3E; +constexpr unsigned int mmDP_AUX2_AUX_SW_STATUS__VI = 0x5C3C; +constexpr unsigned int mmDP_AUX2_AUX_TEST_DEBUG_DATA__VI = 0x5C4D; +constexpr unsigned int mmDP_AUX2_AUX_TEST_DEBUG_INDEX__VI = 0x5C4C; +constexpr unsigned int mmDP_AUX3_AUX_ARB_CONTROL__VI = 0x5C56; +constexpr unsigned int mmDP_AUX3_AUX_CONTROL__VI = 0x5C54; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_RX_CONTROL0__VI = 0x5C5E; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_RX_CONTROL1__VI = 0x5C5F; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_RX_STATUS__VI = 0x5C61; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_TX_CONTROL__VI = 0x5C5D; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_TX_REF_CONTROL__VI = 0x5C5C; +constexpr unsigned int mmDP_AUX3_AUX_DPHY_TX_STATUS__VI = 0x5C60; +constexpr unsigned int mmDP_AUX3_AUX_GTC_SYNC_CONTROL__VI = 0x5C62; +constexpr unsigned int mmDP_AUX3_AUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C64; +constexpr unsigned int mmDP_AUX3_AUX_GTC_SYNC_DATA__VI = 0x5C66; +constexpr unsigned int mmDP_AUX3_AUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C63; +constexpr unsigned int mmDP_AUX3_AUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C67; +constexpr unsigned int mmDP_AUX3_AUX_GTC_SYNC_STATUS__VI = 0x5C65; +constexpr unsigned int mmDP_AUX3_AUX_INTERRUPT_CONTROL__VI = 0x5C57; +constexpr unsigned int mmDP_AUX3_AUX_LS_DATA__VI = 0x5C5B; +constexpr unsigned int mmDP_AUX3_AUX_LS_STATUS__VI = 0x5C59; +constexpr unsigned int mmDP_AUX3_AUX_SW_CONTROL__VI = 0x5C55; +constexpr unsigned int mmDP_AUX3_AUX_SW_DATA__VI = 0x5C5A; +constexpr unsigned int mmDP_AUX3_AUX_SW_STATUS__VI = 0x5C58; +constexpr unsigned int mmDP_AUX3_AUX_TEST_DEBUG_DATA__VI = 0x5C69; +constexpr unsigned int mmDP_AUX3_AUX_TEST_DEBUG_INDEX__VI = 0x5C68; +constexpr unsigned int mmDP_AUX4_AUX_ARB_CONTROL__VI = 0x5C72; +constexpr unsigned int mmDP_AUX4_AUX_CONTROL__VI = 0x5C70; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_RX_CONTROL0__VI = 0x5C7A; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_RX_CONTROL1__VI = 0x5C7B; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_RX_STATUS__VI = 0x5C7D; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_TX_CONTROL__VI = 0x5C79; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_TX_REF_CONTROL__VI = 0x5C78; +constexpr unsigned int mmDP_AUX4_AUX_DPHY_TX_STATUS__VI = 0x5C7C; +constexpr unsigned int mmDP_AUX4_AUX_GTC_SYNC_CONTROL__VI = 0x5C7E; +constexpr unsigned int mmDP_AUX4_AUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C80; +constexpr unsigned int mmDP_AUX4_AUX_GTC_SYNC_DATA__VI = 0x5C82; +constexpr unsigned int mmDP_AUX4_AUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C7F; +constexpr unsigned int mmDP_AUX4_AUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C83; +constexpr unsigned int mmDP_AUX4_AUX_GTC_SYNC_STATUS__VI = 0x5C81; +constexpr unsigned int mmDP_AUX4_AUX_INTERRUPT_CONTROL__VI = 0x5C73; +constexpr unsigned int mmDP_AUX4_AUX_LS_DATA__VI = 0x5C77; +constexpr unsigned int mmDP_AUX4_AUX_LS_STATUS__VI = 0x5C75; +constexpr unsigned int mmDP_AUX4_AUX_SW_CONTROL__VI = 0x5C71; +constexpr unsigned int mmDP_AUX4_AUX_SW_DATA__VI = 0x5C76; +constexpr unsigned int mmDP_AUX4_AUX_SW_STATUS__VI = 0x5C74; +constexpr unsigned int mmDP_AUX4_AUX_TEST_DEBUG_DATA__VI = 0x5C85; +constexpr unsigned int mmDP_AUX4_AUX_TEST_DEBUG_INDEX__VI = 0x5C84; +constexpr unsigned int mmDP_AUX5_AUX_ARB_CONTROL__VI = 0x5C8E; +constexpr unsigned int mmDP_AUX5_AUX_CONTROL__VI = 0x5C8C; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_RX_CONTROL0__VI = 0x5C96; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_RX_CONTROL1__VI = 0x5C97; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_RX_STATUS__VI = 0x5C99; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_TX_CONTROL__VI = 0x5C95; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_TX_REF_CONTROL__VI = 0x5C94; +constexpr unsigned int mmDP_AUX5_AUX_DPHY_TX_STATUS__VI = 0x5C98; +constexpr unsigned int mmDP_AUX5_AUX_GTC_SYNC_CONTROL__VI = 0x5C9A; +constexpr unsigned int mmDP_AUX5_AUX_GTC_SYNC_CONTROLLER_STATUS__VI = 0x5C9C; +constexpr unsigned int mmDP_AUX5_AUX_GTC_SYNC_DATA__VI = 0x5C9E; +constexpr unsigned int mmDP_AUX5_AUX_GTC_SYNC_ERROR_CONTROL__VI = 0x5C9B; +constexpr unsigned int mmDP_AUX5_AUX_GTC_SYNC_PHASE_OFFSET_OVERRIDE__VI = 0x5C9F; +constexpr unsigned int mmDP_AUX5_AUX_GTC_SYNC_STATUS__VI = 0x5C9D; +constexpr unsigned int mmDP_AUX5_AUX_INTERRUPT_CONTROL__VI = 0x5C8F; +constexpr unsigned int mmDP_AUX5_AUX_LS_DATA__VI = 0x5C93; +constexpr unsigned int mmDP_AUX5_AUX_LS_STATUS__VI = 0x5C91; +constexpr unsigned int mmDP_AUX5_AUX_SW_CONTROL__VI = 0x5C8D; +constexpr unsigned int mmDP_AUX5_AUX_SW_DATA__VI = 0x5C92; +constexpr unsigned int mmDP_AUX5_AUX_SW_STATUS__VI = 0x5C90; +constexpr unsigned int mmDP_AUX5_AUX_TEST_DEBUG_DATA__VI = 0x5CA1; +constexpr unsigned int mmDP_AUX5_AUX_TEST_DEBUG_INDEX__VI = 0x5CA0; +constexpr unsigned int mmDP_CONFIG__VI = 0x4AA3; +constexpr unsigned int mmDP_DPHY_8B10B_CNTL__VI = 0x4AB4; +constexpr unsigned int mmDP_DPHY_CNTL__VI = 0x4AAF; +constexpr unsigned int mmDP_DPHY_CRC_CNTL__VI = 0x4AB8; +constexpr unsigned int mmDP_DPHY_CRC_EN__VI = 0x4AB7; +constexpr unsigned int mmDP_DPHY_CRC_MST_CNTL__VI = 0x4ABA; +constexpr unsigned int mmDP_DPHY_CRC_MST_STATUS__VI = 0x4ABB; +constexpr unsigned int mmDP_DPHY_CRC_RESULT__VI = 0x4AB9; +constexpr unsigned int mmDP_DPHY_FAST_TRAINING__VI = 0x4ABC; +constexpr unsigned int mmDP_DPHY_FAST_TRAINING_STATUS__VI = 0x4ABD; +constexpr unsigned int mmDP_DPHY_PRBS_CNTL__VI = 0x4AB5; +constexpr unsigned int mmDP_DPHY_SYM0__VI = 0x4AB1; +constexpr unsigned int mmDP_DPHY_SYM1__VI = 0x4AB2; +constexpr unsigned int mmDP_DPHY_SYM2__VI = 0x4AB3; +constexpr unsigned int mmDP_DPHY_TRAINING_PATTERN_SEL__VI = 0x4AB0; +constexpr unsigned int mmDP_DTO0_MODULO__VI = 0x0142; +constexpr unsigned int mmDP_DTO0_PHASE__VI = 0x0141; +constexpr unsigned int mmDP_DTO1_MODULO__VI = 0x0146; +constexpr unsigned int mmDP_DTO1_PHASE__VI = 0x0145; +constexpr unsigned int mmDP_DTO2_MODULO__VI = 0x014A; +constexpr unsigned int mmDP_DTO2_PHASE__VI = 0x0149; +constexpr unsigned int mmDP_DTO3_MODULO__VI = 0x014E; +constexpr unsigned int mmDP_DTO3_PHASE__VI = 0x014D; +constexpr unsigned int mmDP_DTO4_MODULO__VI = 0x0152; +constexpr unsigned int mmDP_DTO4_PHASE__VI = 0x0151; +constexpr unsigned int mmDP_DTO5_MODULO__VI = 0x0156; +constexpr unsigned int mmDP_DTO5_PHASE__VI = 0x0155; +constexpr unsigned int mmDP_FE_TEST_DEBUG_DATA__VI = 0x4ADB; +constexpr unsigned int mmDP_FE_TEST_DEBUG_INDEX__VI = 0x4ADA; +constexpr unsigned int mmDP_HBR2_EYE_PATTERN__VI = 0x4AAC; +constexpr unsigned int mmDP_LINK_CNTL__VI = 0x4AA0; +constexpr unsigned int mmDP_LINK_FRAMING_CNTL__VI = 0x4AAB; +constexpr unsigned int mmDP_MSA_COLORIMETRY__VI = 0x4AA2; +constexpr unsigned int mmDP_MSA_MISC__VI = 0x4AA6; +constexpr unsigned int mmDP_MSA_V_TIMING_OVERRIDE1__VI = 0x4ABE; +constexpr unsigned int mmDP_MSA_V_TIMING_OVERRIDE2__VI = 0x4ABF; +constexpr unsigned int mmDP_MSE_LINK_TIMING__VI = 0x4AD6; +constexpr unsigned int mmDP_MSE_MISC_CNTL__VI = 0x4AD7; +constexpr unsigned int mmDP_MSE_RATE_CNTL__VI = 0x4ACF; +constexpr unsigned int mmDP_MSE_RATE_UPDATE__VI = 0x4AD1; +constexpr unsigned int mmDP_MSE_SAT0__VI = 0x4AD2; +constexpr unsigned int mmDP_MSE_SAT1__VI = 0x4AD3; +constexpr unsigned int mmDP_MSE_SAT2__VI = 0x4AD4; +constexpr unsigned int mmDP_MSE_SAT_UPDATE__VI = 0x4AD5; +constexpr unsigned int mmDP_PIXEL_FORMAT__VI = 0x4AA1; +constexpr unsigned int mmDP_SEC_AUD_M__VI = 0x4ACB; +constexpr unsigned int mmDP_SEC_AUD_M_READBACK__VI = 0x4ACC; +constexpr unsigned int mmDP_SEC_AUD_N__VI = 0x4AC9; +constexpr unsigned int mmDP_SEC_AUD_N_READBACK__VI = 0x4ACA; +constexpr unsigned int mmDP_SEC_CNTL__VI = 0x4AC3; +constexpr unsigned int mmDP_SEC_CNTL1__VI = 0x4AC4; +constexpr unsigned int mmDP_SEC_FRAMING1__VI = 0x4AC5; +constexpr unsigned int mmDP_SEC_FRAMING2__VI = 0x4AC6; +constexpr unsigned int mmDP_SEC_FRAMING3__VI = 0x4AC7; +constexpr unsigned int mmDP_SEC_FRAMING4__VI = 0x4AC8; +constexpr unsigned int mmDP_SEC_PACKET_CNTL__VI = 0x4ACE; +constexpr unsigned int mmDP_SEC_TIMESTAMP__VI = 0x4ACD; +constexpr unsigned int mmDP_STEER_FIFO__VI = 0x4AA5; +constexpr unsigned int mmDP_TEST_DEBUG_DATA__VI = 0x4AD9; +constexpr unsigned int mmDP_TEST_DEBUG_INDEX__VI = 0x4AD8; +constexpr unsigned int mmDP_VID_INTERRUPT_CNTL__VI = 0x4AAE; +constexpr unsigned int mmDP_VID_M__VI = 0x4AAA; +constexpr unsigned int mmDP_VID_MSA_VBID__VI = 0x4AAD; +constexpr unsigned int mmDP_VID_N__VI = 0x4AA9; +constexpr unsigned int mmDP_VID_STREAM_CNTL__VI = 0x4AA4; +constexpr unsigned int mmDP_VID_TIMING__VI = 0x4AA8; +constexpr unsigned int mmDVOACLKC_CNTL__VI = 0x016A; +constexpr unsigned int mmDVOACLKC_MVP_CNTL__VI = 0x0169; +constexpr unsigned int mmDVOACLKD_CNTL__VI = 0x0168; +constexpr unsigned int mmDVO_CLK_ENABLE__VI = 0x0129; +constexpr unsigned int mmDVO_CONTROL__VI = 0x16A3; +constexpr unsigned int mmDVO_CRC2_SIG_MASK__VI = 0x16A5; +constexpr unsigned int mmDVO_CRC2_SIG_RESULT__VI = 0x16A6; +constexpr unsigned int mmDVO_CRC_EN__VI = 0x16A4; +constexpr unsigned int mmDVO_ENABLE__VI = 0x16A0; +constexpr unsigned int mmDVO_FIFO_ERROR_STATUS__VI = 0x16A7; +constexpr unsigned int mmDVO_OUTPUT__VI = 0x16A2; +constexpr unsigned int mmDVO_SKEW_ADJUST__VI = 0x489F; +constexpr unsigned int mmDVO_SOURCE_SELECT__VI = 0x16A1; +constexpr unsigned int mmDVO_STRENGTH_CONTROL__VI = 0x489D; +constexpr unsigned int mmDVO_TEST_DEBUG_DATA__VI = 0x16A9; +constexpr unsigned int mmDVO_TEST_DEBUG_INDEX__VI = 0x16A8; +constexpr unsigned int mmDVO_VREF_CONTROL__VI = 0x489E; +constexpr unsigned int mmFBC_CLIENT_REGION_MASK__VI = 0x029B; +constexpr unsigned int mmFBC_CNTL__VI = 0x0280; +constexpr unsigned int mmFBC_COMP_CNTL__VI = 0x0284; +constexpr unsigned int mmFBC_COMP_MODE__VI = 0x0285; +constexpr unsigned int mmFBC_CSM_REGION_OFFSET_01__VI = 0x0299; +constexpr unsigned int mmFBC_CSM_REGION_OFFSET_23__VI = 0x029A; +constexpr unsigned int mmFBC_DEBUG0__VI = 0x0286; +constexpr unsigned int mmFBC_DEBUG1__VI = 0x0287; +constexpr unsigned int mmFBC_DEBUG2__VI = 0x0288; +constexpr unsigned int mmFBC_DEBUG_COMP__VI = 0x029C; +constexpr unsigned int mmFBC_DEBUG_CSR__VI = 0x029D; +constexpr unsigned int mmFBC_DEBUG_CSR_RDATA__VI = 0x029E; +constexpr unsigned int mmFBC_DEBUG_CSR_RDATA_HI__VI = 0x02A0; +constexpr unsigned int mmFBC_DEBUG_CSR_WDATA__VI = 0x029F; +constexpr unsigned int mmFBC_DEBUG_CSR_WDATA_HI__VI = 0x02A1; +constexpr unsigned int mmFBC_IDLE_FORCE_CLEAR_MASK__VI = 0x0282; +constexpr unsigned int mmFBC_IDLE_MASK__VI = 0x0281; +constexpr unsigned int mmFBC_IND_LUT0__VI = 0x0289; +constexpr unsigned int mmFBC_IND_LUT1__VI = 0x028A; +constexpr unsigned int mmFBC_IND_LUT10__VI = 0x0293; +constexpr unsigned int mmFBC_IND_LUT11__VI = 0x0294; +constexpr unsigned int mmFBC_IND_LUT12__VI = 0x0295; +constexpr unsigned int mmFBC_IND_LUT13__VI = 0x0296; +constexpr unsigned int mmFBC_IND_LUT14__VI = 0x0297; +constexpr unsigned int mmFBC_IND_LUT15__VI = 0x0298; +constexpr unsigned int mmFBC_IND_LUT2__VI = 0x028B; +constexpr unsigned int mmFBC_IND_LUT3__VI = 0x028C; +constexpr unsigned int mmFBC_IND_LUT4__VI = 0x028D; +constexpr unsigned int mmFBC_IND_LUT5__VI = 0x028E; +constexpr unsigned int mmFBC_IND_LUT6__VI = 0x028F; +constexpr unsigned int mmFBC_IND_LUT7__VI = 0x0290; +constexpr unsigned int mmFBC_IND_LUT8__VI = 0x0291; +constexpr unsigned int mmFBC_IND_LUT9__VI = 0x0292; +constexpr unsigned int mmFBC_MISC__VI = 0x02A2; +constexpr unsigned int mmFBC_START_STOP_DELAY__VI = 0x0283; +constexpr unsigned int mmFBC_STATUS__VI = 0x02A3; +constexpr unsigned int mmFBC_TEST_DEBUG_DATA__VI = 0x02A5; +constexpr unsigned int mmFBC_TEST_DEBUG_INDEX__VI = 0x02A4; +constexpr unsigned int mmFMT0_FMT_CLAMP_COMPONENT_B__VI = 0x1BEA; +constexpr unsigned int mmFMT0_FMT_CLAMP_COMPONENT_G__VI = 0x1BE9; +constexpr unsigned int mmFMT0_FMT_CLAMP_COMPONENT_R__VI = 0x1BE8; +constexpr unsigned int mmFMT0_FMT_TEST_DEBUG_DATA__VI = 0x1BEC; +constexpr unsigned int mmFMT0_FMT_TEST_DEBUG_INDEX__VI = 0x1BEB; +constexpr unsigned int mmFMT1_FMT_BIT_DEPTH_CONTROL__VI = 0x1DF2; +constexpr unsigned int mmFMT1_FMT_CLAMP_CNTL__VI = 0x1DF9; +constexpr unsigned int mmFMT1_FMT_CLAMP_COMPONENT_B__VI = 0x1DEA; +constexpr unsigned int mmFMT1_FMT_CLAMP_COMPONENT_G__VI = 0x1DE9; +constexpr unsigned int mmFMT1_FMT_CLAMP_COMPONENT_R__VI = 0x1DE8; +constexpr unsigned int mmFMT1_FMT_CONTROL__VI = 0x1DEE; +constexpr unsigned int mmFMT1_FMT_CRC_CNTL__VI = 0x1DFA; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_BLUE_CONTROL__VI = 0x1DFE; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_BLUE_CONTROL_MASK__VI = 0x1DFC; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_RED_GREEN__VI = 0x1DFD; +constexpr unsigned int mmFMT1_FMT_CRC_SIG_RED_GREEN_MASK__VI = 0x1DFB; +constexpr unsigned int mmFMT1_FMT_DEBUG_CNTL__VI = 0x1DFF; +constexpr unsigned int mmFMT1_FMT_DITHER_RAND_B_SEED__VI = 0x1DF5; +constexpr unsigned int mmFMT1_FMT_DITHER_RAND_G_SEED__VI = 0x1DF4; +constexpr unsigned int mmFMT1_FMT_DITHER_RAND_R_SEED__VI = 0x1DF3; +constexpr unsigned int mmFMT1_FMT_DYNAMIC_EXP_CNTL__VI = 0x1DED; +constexpr unsigned int mmFMT1_FMT_FORCE_DATA_0_1__VI = 0x1DF0; +constexpr unsigned int mmFMT1_FMT_FORCE_DATA_2_3__VI = 0x1DF1; +constexpr unsigned int mmFMT1_FMT_FORCE_OUTPUT_CNTL__VI = 0x1DEF; +constexpr unsigned int mmFMT1_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__VI = 0x1DF6; +constexpr unsigned int mmFMT1_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__VI = 0x1DF7; +constexpr unsigned int mmFMT1_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__VI = 0x1DF8; +constexpr unsigned int mmFMT1_FMT_TEST_DEBUG_DATA__VI = 0x1DEC; +constexpr unsigned int mmFMT1_FMT_TEST_DEBUG_INDEX__VI = 0x1DEB; +constexpr unsigned int mmFMT2_FMT_BIT_DEPTH_CONTROL__VI = 0x1FF2; +constexpr unsigned int mmFMT2_FMT_CLAMP_CNTL__VI = 0x1FF9; +constexpr unsigned int mmFMT2_FMT_CLAMP_COMPONENT_B__VI = 0x1FEA; +constexpr unsigned int mmFMT2_FMT_CLAMP_COMPONENT_G__VI = 0x1FE9; +constexpr unsigned int mmFMT2_FMT_CLAMP_COMPONENT_R__VI = 0x1FE8; +constexpr unsigned int mmFMT2_FMT_CONTROL__VI = 0x1FEE; +constexpr unsigned int mmFMT2_FMT_CRC_CNTL__VI = 0x1FFA; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_BLUE_CONTROL__VI = 0x1FFE; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_BLUE_CONTROL_MASK__VI = 0x1FFC; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_RED_GREEN__VI = 0x1FFD; +constexpr unsigned int mmFMT2_FMT_CRC_SIG_RED_GREEN_MASK__VI = 0x1FFB; +constexpr unsigned int mmFMT2_FMT_DEBUG_CNTL__VI = 0x1FFF; +constexpr unsigned int mmFMT2_FMT_DITHER_RAND_B_SEED__VI = 0x1FF5; +constexpr unsigned int mmFMT2_FMT_DITHER_RAND_G_SEED__VI = 0x1FF4; +constexpr unsigned int mmFMT2_FMT_DITHER_RAND_R_SEED__VI = 0x1FF3; +constexpr unsigned int mmFMT2_FMT_DYNAMIC_EXP_CNTL__VI = 0x1FED; +constexpr unsigned int mmFMT2_FMT_FORCE_DATA_0_1__VI = 0x1FF0; +constexpr unsigned int mmFMT2_FMT_FORCE_DATA_2_3__VI = 0x1FF1; +constexpr unsigned int mmFMT2_FMT_FORCE_OUTPUT_CNTL__VI = 0x1FEF; +constexpr unsigned int mmFMT2_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__VI = 0x1FF6; +constexpr unsigned int mmFMT2_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__VI = 0x1FF7; +constexpr unsigned int mmFMT2_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__VI = 0x1FF8; +constexpr unsigned int mmFMT2_FMT_TEST_DEBUG_DATA__VI = 0x1FEC; +constexpr unsigned int mmFMT2_FMT_TEST_DEBUG_INDEX__VI = 0x1FEB; +constexpr unsigned int mmFMT3_FMT_BIT_DEPTH_CONTROL__VI = 0x41F2; +constexpr unsigned int mmFMT3_FMT_CLAMP_CNTL__VI = 0x41F9; +constexpr unsigned int mmFMT3_FMT_CLAMP_COMPONENT_B__VI = 0x41EA; +constexpr unsigned int mmFMT3_FMT_CLAMP_COMPONENT_G__VI = 0x41E9; +constexpr unsigned int mmFMT3_FMT_CLAMP_COMPONENT_R__VI = 0x41E8; +constexpr unsigned int mmFMT3_FMT_CONTROL__VI = 0x41EE; +constexpr unsigned int mmFMT3_FMT_CRC_CNTL__VI = 0x41FA; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_BLUE_CONTROL__VI = 0x41FE; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_BLUE_CONTROL_MASK__VI = 0x41FC; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_RED_GREEN__VI = 0x41FD; +constexpr unsigned int mmFMT3_FMT_CRC_SIG_RED_GREEN_MASK__VI = 0x41FB; +constexpr unsigned int mmFMT3_FMT_DEBUG_CNTL__VI = 0x41FF; +constexpr unsigned int mmFMT3_FMT_DITHER_RAND_B_SEED__VI = 0x41F5; +constexpr unsigned int mmFMT3_FMT_DITHER_RAND_G_SEED__VI = 0x41F4; +constexpr unsigned int mmFMT3_FMT_DITHER_RAND_R_SEED__VI = 0x41F3; +constexpr unsigned int mmFMT3_FMT_DYNAMIC_EXP_CNTL__VI = 0x41ED; +constexpr unsigned int mmFMT3_FMT_FORCE_DATA_0_1__VI = 0x41F0; +constexpr unsigned int mmFMT3_FMT_FORCE_DATA_2_3__VI = 0x41F1; +constexpr unsigned int mmFMT3_FMT_FORCE_OUTPUT_CNTL__VI = 0x41EF; +constexpr unsigned int mmFMT3_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__VI = 0x41F6; +constexpr unsigned int mmFMT3_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__VI = 0x41F7; +constexpr unsigned int mmFMT3_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__VI = 0x41F8; +constexpr unsigned int mmFMT3_FMT_TEST_DEBUG_DATA__VI = 0x41EC; +constexpr unsigned int mmFMT3_FMT_TEST_DEBUG_INDEX__VI = 0x41EB; +constexpr unsigned int mmFMT4_FMT_BIT_DEPTH_CONTROL__VI = 0x43F2; +constexpr unsigned int mmFMT4_FMT_CLAMP_CNTL__VI = 0x43F9; +constexpr unsigned int mmFMT4_FMT_CLAMP_COMPONENT_B__VI = 0x43EA; +constexpr unsigned int mmFMT4_FMT_CLAMP_COMPONENT_G__VI = 0x43E9; +constexpr unsigned int mmFMT4_FMT_CLAMP_COMPONENT_R__VI = 0x43E8; +constexpr unsigned int mmFMT4_FMT_CONTROL__VI = 0x43EE; +constexpr unsigned int mmFMT4_FMT_CRC_CNTL__VI = 0x43FA; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_BLUE_CONTROL__VI = 0x43FE; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_BLUE_CONTROL_MASK__VI = 0x43FC; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_RED_GREEN__VI = 0x43FD; +constexpr unsigned int mmFMT4_FMT_CRC_SIG_RED_GREEN_MASK__VI = 0x43FB; +constexpr unsigned int mmFMT4_FMT_DEBUG_CNTL__VI = 0x43FF; +constexpr unsigned int mmFMT4_FMT_DITHER_RAND_B_SEED__VI = 0x43F5; +constexpr unsigned int mmFMT4_FMT_DITHER_RAND_G_SEED__VI = 0x43F4; +constexpr unsigned int mmFMT4_FMT_DITHER_RAND_R_SEED__VI = 0x43F3; +constexpr unsigned int mmFMT4_FMT_DYNAMIC_EXP_CNTL__VI = 0x43ED; +constexpr unsigned int mmFMT4_FMT_FORCE_DATA_0_1__VI = 0x43F0; +constexpr unsigned int mmFMT4_FMT_FORCE_DATA_2_3__VI = 0x43F1; +constexpr unsigned int mmFMT4_FMT_FORCE_OUTPUT_CNTL__VI = 0x43EF; +constexpr unsigned int mmFMT4_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__VI = 0x43F6; +constexpr unsigned int mmFMT4_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__VI = 0x43F7; +constexpr unsigned int mmFMT4_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__VI = 0x43F8; +constexpr unsigned int mmFMT4_FMT_TEST_DEBUG_DATA__VI = 0x43EC; +constexpr unsigned int mmFMT4_FMT_TEST_DEBUG_INDEX__VI = 0x43EB; +constexpr unsigned int mmFMT5_FMT_BIT_DEPTH_CONTROL__VI = 0x45F2; +constexpr unsigned int mmFMT5_FMT_CLAMP_CNTL__VI = 0x45F9; +constexpr unsigned int mmFMT5_FMT_CLAMP_COMPONENT_B__VI = 0x45EA; +constexpr unsigned int mmFMT5_FMT_CLAMP_COMPONENT_G__VI = 0x45E9; +constexpr unsigned int mmFMT5_FMT_CLAMP_COMPONENT_R__VI = 0x45E8; +constexpr unsigned int mmFMT5_FMT_CONTROL__VI = 0x45EE; +constexpr unsigned int mmFMT5_FMT_CRC_CNTL__VI = 0x45FA; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_BLUE_CONTROL__VI = 0x45FE; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_BLUE_CONTROL_MASK__VI = 0x45FC; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_RED_GREEN__VI = 0x45FD; +constexpr unsigned int mmFMT5_FMT_CRC_SIG_RED_GREEN_MASK__VI = 0x45FB; +constexpr unsigned int mmFMT5_FMT_DEBUG_CNTL__VI = 0x45FF; +constexpr unsigned int mmFMT5_FMT_DITHER_RAND_B_SEED__VI = 0x45F5; +constexpr unsigned int mmFMT5_FMT_DITHER_RAND_G_SEED__VI = 0x45F4; +constexpr unsigned int mmFMT5_FMT_DITHER_RAND_R_SEED__VI = 0x45F3; +constexpr unsigned int mmFMT5_FMT_DYNAMIC_EXP_CNTL__VI = 0x45ED; +constexpr unsigned int mmFMT5_FMT_FORCE_DATA_0_1__VI = 0x45F0; +constexpr unsigned int mmFMT5_FMT_FORCE_DATA_2_3__VI = 0x45F1; +constexpr unsigned int mmFMT5_FMT_FORCE_OUTPUT_CNTL__VI = 0x45EF; +constexpr unsigned int mmFMT5_FMT_TEMPORAL_DITHER_PATTERN_CONTROL__VI = 0x45F6; +constexpr unsigned int mmFMT5_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX__VI = 0x45F7; +constexpr unsigned int mmFMT5_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX__VI = 0x45F8; +constexpr unsigned int mmFMT5_FMT_TEST_DEBUG_DATA__VI = 0x45EC; +constexpr unsigned int mmFMT5_FMT_TEST_DEBUG_INDEX__VI = 0x45EB; +constexpr unsigned int mmFMT_CLAMP_COMPONENT_B__VI = 0x1BEA; +constexpr unsigned int mmFMT_CLAMP_COMPONENT_G__VI = 0x1BE9; +constexpr unsigned int mmFMT_CLAMP_COMPONENT_R__VI = 0x1BE8; +constexpr unsigned int mmFMT_TEST_DEBUG_DATA__VI = 0x1BEC; +constexpr unsigned int mmFMT_TEST_DEBUG_INDEX__VI = 0x1BEB; +constexpr unsigned int mmGAMMA_CORR_CNTLA_END_CNTL1__VI = 0x46CE; +constexpr unsigned int mmGAMMA_CORR_CNTLA_END_CNTL2__VI = 0x46CF; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_0_1__VI = 0x46D0; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_10_11__VI = 0x46D5; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_12_13__VI = 0x46D6; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_14_15__VI = 0x46D7; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_2_3__VI = 0x46D1; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_4_5__VI = 0x46D2; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_6_7__VI = 0x46D3; +constexpr unsigned int mmGAMMA_CORR_CNTLA_REGION_8_9__VI = 0x46D4; +constexpr unsigned int mmGAMMA_CORR_CNTLA_SLOPE_CNTL__VI = 0x46CD; +constexpr unsigned int mmGAMMA_CORR_CNTLA_START_CNTL__VI = 0x46CC; +constexpr unsigned int mmGAMMA_CORR_CNTLB_END_CNTL1__VI = 0x46DA; +constexpr unsigned int mmGAMMA_CORR_CNTLB_END_CNTL2__VI = 0x46DB; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_0_1__VI = 0x46DC; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_10_11__VI = 0x46E1; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_12_13__VI = 0x46E2; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_14_15__VI = 0x46E3; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_2_3__VI = 0x46DD; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_4_5__VI = 0x46DE; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_6_7__VI = 0x46DF; +constexpr unsigned int mmGAMMA_CORR_CNTLB_REGION_8_9__VI = 0x46E0; +constexpr unsigned int mmGAMMA_CORR_CNTLB_SLOPE_CNTL__VI = 0x46D9; +constexpr unsigned int mmGAMMA_CORR_CNTLB_START_CNTL__VI = 0x46D8; +constexpr unsigned int mmGAMMA_CORR_CONTROL__VI = 0x46C8; +constexpr unsigned int mmGAMMA_CORR_LUT_DATA__VI = 0x46CA; +constexpr unsigned int mmGAMMA_CORR_LUT_INDEX__VI = 0x46C9; +constexpr unsigned int mmGAMMA_CORR_LUT_WRITE_EN_MASK__VI = 0x46CB; +constexpr unsigned int mmGAMUT_REMAP_C11_C12__VI = 0x1A5A; +constexpr unsigned int mmGAMUT_REMAP_C13_C14__VI = 0x1A5B; +constexpr unsigned int mmGAMUT_REMAP_C21_C22__VI = 0x1A5C; +constexpr unsigned int mmGAMUT_REMAP_C23_C24__VI = 0x1A5D; +constexpr unsigned int mmGAMUT_REMAP_C31_C32__VI = 0x1A5E; +constexpr unsigned int mmGAMUT_REMAP_C33_C34__VI = 0x1A5F; +constexpr unsigned int mmGAMUT_REMAP_CONTROL__VI = 0x1A59; +constexpr unsigned int mmGARLIC_COHE_CP_DMA_ME_COMMAND__VI = 0x141B; +constexpr unsigned int mmGARLIC_COHE_CP_DMA_PFP_COMMAND__VI = 0x141C; +constexpr unsigned int mmGARLIC_COHE_CP_DMA_PIO_COMMAND__VI = 0x1424; +constexpr unsigned int mmGARLIC_COHE_CP_RB0_WPTR__VI = 0x1415; +constexpr unsigned int mmGARLIC_COHE_CP_RB1_WPTR__VI = 0x1416; +constexpr unsigned int mmGARLIC_COHE_CP_RB2_WPTR__VI = 0x1417; +constexpr unsigned int mmGARLIC_COHE_GARLIC_FLUSH_REQ__VI = 0x1425; +constexpr unsigned int mmGARLIC_COHE_SAM_SAB_RBI_WPTR__VI = 0x141D; +constexpr unsigned int mmGARLIC_COHE_SAM_SAB_RBO_WPTR__VI = 0x141E; +constexpr unsigned int mmGARLIC_COHE_SDMA0_GFX_RB_WPTR__VI = 0x1419; +constexpr unsigned int mmGARLIC_COHE_SDMA1_GFX_RB_WPTR__VI = 0x141A; +constexpr unsigned int mmGARLIC_COHE_SDMA2_GFX_RB_WPTR__VI = 0x1422; +constexpr unsigned int mmGARLIC_COHE_SDMA3_GFX_RB_WPTR__VI = 0x1423; +constexpr unsigned int mmGARLIC_COHE_UVD_RBC_RB_WPTR__VI = 0x1418; +constexpr unsigned int mmGARLIC_COHE_VCE_OUT_RB_WPTR__VI = 0x141F; +constexpr unsigned int mmGARLIC_COHE_VCE_RB_WPTR__VI = 0x1421; +constexpr unsigned int mmGARLIC_COHE_VCE_RB_WPTR2__VI = 0x1420; +constexpr unsigned int mmGC_CAC_CGTT_CLK_CTRL__VI = 0x3292; +constexpr unsigned int mmGC_CAC_LKG_AGGR_LOWER__VI = 0x3296; +constexpr unsigned int mmGC_CAC_LKG_AGGR_UPPER__VI = 0x3297; +constexpr unsigned int mmGC_USER_SHADER_RATE_CONFIG__VI = 0x2313; +constexpr unsigned int mmGDS_CS_CTXSW_CNT0__VI = 0x334E; +constexpr unsigned int mmGDS_CS_CTXSW_CNT1__VI = 0x334F; +constexpr unsigned int mmGDS_CS_CTXSW_CNT2__VI = 0x3350; +constexpr unsigned int mmGDS_CS_CTXSW_CNT3__VI = 0x3351; +constexpr unsigned int mmGDS_CS_CTXSW_STATUS__VI = 0x334D; +constexpr unsigned int mmGDS_DSM_CNTL__VI = 0x25CA; +constexpr unsigned int mmGDS_EDC_CNT__VI = 0x25C5; +constexpr unsigned int mmGDS_EDC_GRBM_CNT__VI = 0x25C6; +constexpr unsigned int mmGDS_EDC_OA_DED__VI = 0x25C7; +constexpr unsigned int mmGDS_GFX_CTXSW_STATUS__VI = 0x3352; +constexpr unsigned int mmGDS_PS0_CTXSW_CNT0__VI = 0x3357; +constexpr unsigned int mmGDS_PS0_CTXSW_CNT1__VI = 0x3358; +constexpr unsigned int mmGDS_PS0_CTXSW_CNT2__VI = 0x3359; +constexpr unsigned int mmGDS_PS0_CTXSW_CNT3__VI = 0x335A; +constexpr unsigned int mmGDS_PS1_CTXSW_CNT0__VI = 0x335B; +constexpr unsigned int mmGDS_PS1_CTXSW_CNT1__VI = 0x335C; +constexpr unsigned int mmGDS_PS1_CTXSW_CNT2__VI = 0x335D; +constexpr unsigned int mmGDS_PS1_CTXSW_CNT3__VI = 0x335E; +constexpr unsigned int mmGDS_PS2_CTXSW_CNT0__VI = 0x335F; +constexpr unsigned int mmGDS_PS2_CTXSW_CNT1__VI = 0x3360; +constexpr unsigned int mmGDS_PS2_CTXSW_CNT2__VI = 0x3361; +constexpr unsigned int mmGDS_PS2_CTXSW_CNT3__VI = 0x3362; +constexpr unsigned int mmGDS_PS3_CTXSW_CNT0__VI = 0x3363; +constexpr unsigned int mmGDS_PS3_CTXSW_CNT1__VI = 0x3364; +constexpr unsigned int mmGDS_PS3_CTXSW_CNT2__VI = 0x3365; +constexpr unsigned int mmGDS_PS3_CTXSW_CNT3__VI = 0x3366; +constexpr unsigned int mmGDS_PS4_CTXSW_CNT0__VI = 0x3367; +constexpr unsigned int mmGDS_PS4_CTXSW_CNT1__VI = 0x3368; +constexpr unsigned int mmGDS_PS4_CTXSW_CNT2__VI = 0x3369; +constexpr unsigned int mmGDS_PS4_CTXSW_CNT3__VI = 0x336A; +constexpr unsigned int mmGDS_PS5_CTXSW_CNT0__VI = 0x336B; +constexpr unsigned int mmGDS_PS5_CTXSW_CNT1__VI = 0x336C; +constexpr unsigned int mmGDS_PS5_CTXSW_CNT2__VI = 0x336D; +constexpr unsigned int mmGDS_PS5_CTXSW_CNT3__VI = 0x336E; +constexpr unsigned int mmGDS_PS6_CTXSW_CNT0__VI = 0x336F; +constexpr unsigned int mmGDS_PS6_CTXSW_CNT1__VI = 0x3370; +constexpr unsigned int mmGDS_PS6_CTXSW_CNT2__VI = 0x3371; +constexpr unsigned int mmGDS_PS6_CTXSW_CNT3__VI = 0x3372; +constexpr unsigned int mmGDS_PS7_CTXSW_CNT0__VI = 0x3373; +constexpr unsigned int mmGDS_PS7_CTXSW_CNT1__VI = 0x3374; +constexpr unsigned int mmGDS_PS7_CTXSW_CNT2__VI = 0x3375; +constexpr unsigned int mmGDS_PS7_CTXSW_CNT3__VI = 0x3376; +constexpr unsigned int mmGDS_VS_CTXSW_CNT0__VI = 0x3353; +constexpr unsigned int mmGDS_VS_CTXSW_CNT1__VI = 0x3354; +constexpr unsigned int mmGDS_VS_CTXSW_CNT2__VI = 0x3355; +constexpr unsigned int mmGDS_VS_CTXSW_CNT3__VI = 0x3356; +constexpr unsigned int mmGENERIC_I2C_CONTROL__VI = 0x16F4; +constexpr unsigned int mmGENERIC_I2C_DATA__VI = 0x16FA; +constexpr unsigned int mmGENERIC_I2C_INTERRUPT_CONTROL__VI = 0x16F5; +constexpr unsigned int mmGENERIC_I2C_PIN_DEBUG__VI = 0x16FC; +constexpr unsigned int mmGENERIC_I2C_PIN_SELECTION__VI = 0x16FB; +constexpr unsigned int mmGENERIC_I2C_SETUP__VI = 0x16F8; +constexpr unsigned int mmGENERIC_I2C_SPEED__VI = 0x16F7; +constexpr unsigned int mmGENERIC_I2C_STATUS__VI = 0x16F6; +constexpr unsigned int mmGENERIC_I2C_TRANSACTION__VI = 0x16F9; +constexpr unsigned int mmGMCON_LPT_TARGET__VI = 0x0D53; +constexpr unsigned int mmGPU_BIST_CONTROL__VI = 0xF835; +constexpr unsigned int mmGRBM_CAM_DATA__SI__CI = 0x3001; +constexpr unsigned int mmGRBM_CAM_DATA__VI = 0xF83F; +constexpr unsigned int mmGRBM_CAM_INDEX__SI__CI = 0x3000; +constexpr unsigned int mmGRBM_CAM_INDEX__VI = 0xF83E; +constexpr unsigned int mmGRBM_DSM_BYPASS__VI = 0x201E; +constexpr unsigned int mmGRBM_HYP_CAM_DATA__VI = 0xF83F; +constexpr unsigned int mmGRBM_HYP_CAM_INDEX__VI = 0xF83E; +constexpr unsigned int mmGRBM_TRAP_ADDR__VI = 0x201A; +constexpr unsigned int mmGRBM_TRAP_ADDR_MSK__VI = 0x201B; +constexpr unsigned int mmGRBM_TRAP_OP__VI = 0x2019; +constexpr unsigned int mmGRBM_TRAP_WD__VI = 0x201C; +constexpr unsigned int mmGRBM_TRAP_WD_MSK__VI = 0x201D; +constexpr unsigned int mmGRBM_WRITE_ERROR__VI = 0x201F; +constexpr unsigned int mmGRPH_FLIP_RATE_CNTL__VI = 0x1A8E; +constexpr unsigned int mmGRPH_STEREOSYNC_FLIP__VI = 0x1A97; +constexpr unsigned int mmGRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__VI = 0x1A9F; +constexpr unsigned int mmGRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__VI = 0x1ABF; +constexpr unsigned int mmGRPH_XDMA_RECOVERY_SURFACE_ADDRESS__VI = 0x1ABD; +constexpr unsigned int mmGRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__VI = 0x1ABE; +constexpr unsigned int mmGSKT_CONTROL__VI = 0x14BF; +constexpr unsigned int mmHDMI_ACR_32_0__VI = 0x4A2E; +constexpr unsigned int mmHDMI_ACR_32_1__VI = 0x4A2F; +constexpr unsigned int mmHDMI_ACR_44_0__VI = 0x4A30; +constexpr unsigned int mmHDMI_ACR_44_1__VI = 0x4A31; +constexpr unsigned int mmHDMI_ACR_48_0__VI = 0x4A32; +constexpr unsigned int mmHDMI_ACR_48_1__VI = 0x4A33; +constexpr unsigned int mmHDMI_ACR_PACKET_CONTROL__VI = 0x4A0C; +constexpr unsigned int mmHDMI_ACR_STATUS_0__VI = 0x4A34; +constexpr unsigned int mmHDMI_ACR_STATUS_1__VI = 0x4A35; +constexpr unsigned int mmHDMI_AUDIO_PACKET_CONTROL__VI = 0x4A0B; +constexpr unsigned int mmHDMI_CONTROL__VI = 0x4A09; +constexpr unsigned int mmHDMI_GC__VI = 0x4A13; +constexpr unsigned int mmHDMI_GENERIC_PACKET_CONTROL0__VI = 0x4A10; +constexpr unsigned int mmHDMI_GENERIC_PACKET_CONTROL1__VI = 0x4A2D; +constexpr unsigned int mmHDMI_INFOFRAME_CONTROL0__VI = 0x4A0E; +constexpr unsigned int mmHDMI_INFOFRAME_CONTROL1__VI = 0x4A0F; +constexpr unsigned int mmHDMI_STATUS__VI = 0x4A0A; +constexpr unsigned int mmHDMI_VBI_PACKET_CONTROL__VI = 0x4A0D; +constexpr unsigned int mmHDP_ADDR_CONFIG__VI = 0x0BD2; +constexpr unsigned int mmHDP_MEMIO_ADDR__VI = 0x0BF7; +constexpr unsigned int mmHDP_MEMIO_CNTL__VI = 0x0BF6; +constexpr unsigned int mmHDP_MEMIO_RD_DATA__VI = 0x0BFA; +constexpr unsigned int mmHDP_MEMIO_STATUS__VI = 0x0BF8; +constexpr unsigned int mmHDP_MEMIO_WR_DATA__VI = 0x0BF9; +constexpr unsigned int mmHDP_MEM_POWER_LS__VI = 0x0BD4; +constexpr unsigned int mmHDP_MISC_CNTL__VI = 0x0BD3; +constexpr unsigned int mmHDP_NONSURFACE_PREFETCH__VI = 0x0BD5; +constexpr unsigned int mmHDP_VF_ENABLE__VI = 0x0BFB; +constexpr unsigned int mmHDP_XDP_BARS_ADDR_39_36__VI = 0x0C44; +constexpr unsigned int mmHPD0_DC_HPD_CONTROL__VI = 0x189A; +constexpr unsigned int mmHPD0_DC_HPD_FAST_TRAIN_CNTL__VI = 0x189B; +constexpr unsigned int mmHPD0_DC_HPD_INT_CONTROL__VI = 0x1899; +constexpr unsigned int mmHPD0_DC_HPD_INT_STATUS__VI = 0x1898; +constexpr unsigned int mmHPD0_DC_HPD_TOGGLE_FILT_CNTL__VI = 0x189C; +constexpr unsigned int mmHPD1_DC_HPD_CONTROL__VI = 0x18A2; +constexpr unsigned int mmHPD1_DC_HPD_FAST_TRAIN_CNTL__VI = 0x18A3; +constexpr unsigned int mmHPD1_DC_HPD_INT_CONTROL__VI = 0x18A1; +constexpr unsigned int mmHPD1_DC_HPD_INT_STATUS__VI = 0x18A0; +constexpr unsigned int mmHPD1_DC_HPD_TOGGLE_FILT_CNTL__VI = 0x18A4; +constexpr unsigned int mmHPD2_DC_HPD_CONTROL__VI = 0x18AA; +constexpr unsigned int mmHPD2_DC_HPD_FAST_TRAIN_CNTL__VI = 0x18AB; +constexpr unsigned int mmHPD2_DC_HPD_INT_CONTROL__VI = 0x18A9; +constexpr unsigned int mmHPD2_DC_HPD_INT_STATUS__VI = 0x18A8; +constexpr unsigned int mmHPD2_DC_HPD_TOGGLE_FILT_CNTL__VI = 0x18AC; +constexpr unsigned int mmHPD3_DC_HPD_CONTROL__VI = 0x18B2; +constexpr unsigned int mmHPD3_DC_HPD_FAST_TRAIN_CNTL__VI = 0x18B3; +constexpr unsigned int mmHPD3_DC_HPD_INT_CONTROL__VI = 0x18B1; +constexpr unsigned int mmHPD3_DC_HPD_INT_STATUS__VI = 0x18B0; +constexpr unsigned int mmHPD3_DC_HPD_TOGGLE_FILT_CNTL__VI = 0x18B4; +constexpr unsigned int mmHPD4_DC_HPD_CONTROL__VI = 0x18BA; +constexpr unsigned int mmHPD4_DC_HPD_FAST_TRAIN_CNTL__VI = 0x18BB; +constexpr unsigned int mmHPD4_DC_HPD_INT_CONTROL__VI = 0x18B9; +constexpr unsigned int mmHPD4_DC_HPD_INT_STATUS__VI = 0x18B8; +constexpr unsigned int mmHPD4_DC_HPD_TOGGLE_FILT_CNTL__VI = 0x18BC; +constexpr unsigned int mmHPD5_DC_HPD_CONTROL__VI = 0x18C2; +constexpr unsigned int mmHPD5_DC_HPD_FAST_TRAIN_CNTL__VI = 0x18C3; +constexpr unsigned int mmHPD5_DC_HPD_INT_CONTROL__VI = 0x18C1; +constexpr unsigned int mmHPD5_DC_HPD_INT_STATUS__VI = 0x18C0; +constexpr unsigned int mmHPD5_DC_HPD_TOGGLE_FILT_CNTL__VI = 0x18C4; +constexpr unsigned int mmHW_ROTATION__VI = 0x1A9E; +constexpr unsigned int mmIH_ACTIVE_FCN_ID__VI = 0x0E43; +constexpr unsigned int mmIH_CLIENT_MAY_SEND_INCOMPLETE_INT__VI = 0x0E4B; +constexpr unsigned int mmIH_CNTL__SI__CI = 0x0F86; +constexpr unsigned int mmIH_CNTL__VI = 0x0E36; +constexpr unsigned int mmIH_DEBUG__VI = 0x0E3C; +constexpr unsigned int mmIH_DOORBELL_RPTR__VI = 0x0E42; +constexpr unsigned int mmIH_DSM_MATCH_DATA_CONTROL__VI = 0x0E41; +constexpr unsigned int mmIH_DSM_MATCH_FIELD_CONTROL__VI = 0x0E40; +constexpr unsigned int mmIH_DSM_MATCH_VALUE_BIT_31_0__VI = 0x0E3D; +constexpr unsigned int mmIH_DSM_MATCH_VALUE_BIT_63_32__VI = 0x0E3E; +constexpr unsigned int mmIH_DSM_MATCH_VALUE_BIT_95_64__VI = 0x0E3F; +constexpr unsigned int mmIH_LEVEL_INTR_MASK__VI = 0x0E49; +constexpr unsigned int mmIH_LEVEL_STATUS__SI__CI = 0x0F87; +constexpr unsigned int mmIH_LEVEL_STATUS__VI = 0x0E37; +constexpr unsigned int mmIH_PERFCOUNTER0_RESULT__VI = 0x0E3A; +constexpr unsigned int mmIH_PERFCOUNTER1_RESULT__VI = 0x0E3B; +constexpr unsigned int mmIH_PERFMON_CNTL__VI = 0x0E39; +constexpr unsigned int mmIH_RB_BASE__SI__CI = 0x0F81; +constexpr unsigned int mmIH_RB_BASE__VI = 0x0E31; +constexpr unsigned int mmIH_RB_CNTL__SI__CI = 0x0F80; +constexpr unsigned int mmIH_RB_CNTL__VI = 0x0E30; +constexpr unsigned int mmIH_RB_RPTR__SI__CI = 0x0F82; +constexpr unsigned int mmIH_RB_RPTR__VI = 0x0E32; +constexpr unsigned int mmIH_RB_WPTR__SI__CI = 0x0F83; +constexpr unsigned int mmIH_RB_WPTR__VI = 0x0E33; +constexpr unsigned int mmIH_RB_WPTR_ADDR_HI__SI__CI = 0x0F84; +constexpr unsigned int mmIH_RB_WPTR_ADDR_HI__VI = 0x0E34; +constexpr unsigned int mmIH_RB_WPTR_ADDR_LO__SI__CI = 0x0F85; +constexpr unsigned int mmIH_RB_WPTR_ADDR_LO__VI = 0x0E35; +constexpr unsigned int mmIH_RESET_INCOMPLETE_INT_CNTL__VI = 0x0E4A; +constexpr unsigned int mmIH_STATUS__SI__CI = 0x0F88; +constexpr unsigned int mmIH_STATUS__VI = 0x0E38; +constexpr unsigned int mmIH_VERSION__VI = 0x0E48; +constexpr unsigned int mmIH_VF_ENABLE__VI = 0x0E45; +constexpr unsigned int mmIH_VF_RB_BIF_STATUS__VI = 0x0E47; +constexpr unsigned int mmIH_VF_RB_STATUS__VI = 0x0E44; +constexpr unsigned int mmIH_VIRT_RESET_REQ__VI = 0x0E46; +constexpr unsigned int mmIH_VMID_0_LUT__VI = 0x0E00; +constexpr unsigned int mmIH_VMID_10_LUT__VI = 0x0E0A; +constexpr unsigned int mmIH_VMID_11_LUT__VI = 0x0E0B; +constexpr unsigned int mmIH_VMID_12_LUT__VI = 0x0E0C; +constexpr unsigned int mmIH_VMID_13_LUT__VI = 0x0E0D; +constexpr unsigned int mmIH_VMID_14_LUT__VI = 0x0E0E; +constexpr unsigned int mmIH_VMID_15_LUT__VI = 0x0E0F; +constexpr unsigned int mmIH_VMID_1_LUT__VI = 0x0E01; +constexpr unsigned int mmIH_VMID_2_LUT__VI = 0x0E02; +constexpr unsigned int mmIH_VMID_3_LUT__VI = 0x0E03; +constexpr unsigned int mmIH_VMID_4_LUT__VI = 0x0E04; +constexpr unsigned int mmIH_VMID_5_LUT__VI = 0x0E05; +constexpr unsigned int mmIH_VMID_6_LUT__VI = 0x0E06; +constexpr unsigned int mmIH_VMID_7_LUT__VI = 0x0E07; +constexpr unsigned int mmIH_VMID_8_LUT__VI = 0x0E08; +constexpr unsigned int mmIH_VMID_9_LUT__VI = 0x0E09; +constexpr unsigned int mmINPUT_CSC_C11_C12__VI = 0x1A36; +constexpr unsigned int mmINPUT_CSC_C11_C12_A__VI = 0x46A6; +constexpr unsigned int mmINPUT_CSC_C11_C12_B__VI = 0x46AC; +constexpr unsigned int mmINPUT_CSC_C13_C14__VI = 0x1A37; +constexpr unsigned int mmINPUT_CSC_C13_C14_A__VI = 0x46A7; +constexpr unsigned int mmINPUT_CSC_C13_C14_B__VI = 0x46AD; +constexpr unsigned int mmINPUT_CSC_C21_C22__VI = 0x1A38; +constexpr unsigned int mmINPUT_CSC_C21_C22_A__VI = 0x46A8; +constexpr unsigned int mmINPUT_CSC_C21_C22_B__VI = 0x46AE; +constexpr unsigned int mmINPUT_CSC_C23_C24__VI = 0x1A39; +constexpr unsigned int mmINPUT_CSC_C23_C24_A__VI = 0x46A9; +constexpr unsigned int mmINPUT_CSC_C23_C24_B__VI = 0x46AF; +constexpr unsigned int mmINPUT_CSC_C31_C32__VI = 0x1A3A; +constexpr unsigned int mmINPUT_CSC_C31_C32_A__VI = 0x46AA; +constexpr unsigned int mmINPUT_CSC_C31_C32_B__VI = 0x46B0; +constexpr unsigned int mmINPUT_CSC_C33_C34__VI = 0x1A3B; +constexpr unsigned int mmINPUT_CSC_C33_C34_A__VI = 0x46AB; +constexpr unsigned int mmINPUT_CSC_C33_C34_B__VI = 0x46B1; +constexpr unsigned int mmINPUT_CSC_CONTROL__VI = 0x1A35; +constexpr unsigned int mmINPUT_GAMMA_CONTROL__VI = 0x1A10; +constexpr unsigned int mmKEY_CONTROL__VI = 0x1A53; +constexpr unsigned int mmKEY_RANGE_ALPHA__VI = 0x1A54; +constexpr unsigned int mmKEY_RANGE_BLUE__VI = 0x1A57; +constexpr unsigned int mmKEY_RANGE_GREEN__VI = 0x1A56; +constexpr unsigned int mmKEY_RANGE_RED__VI = 0x1A55; +constexpr unsigned int mmLB0_DC_MVP_LB_CONTROL__VI = 0x1AE3; +constexpr unsigned int mmLB0_LB_BLACK_KEYER_B_CB__VI = 0x1ACF; +constexpr unsigned int mmLB0_LB_BLACK_KEYER_G_Y__VI = 0x1ACE; +constexpr unsigned int mmLB0_LB_BLACK_KEYER_R_CR__VI = 0x1ACD; +constexpr unsigned int mmLB0_LB_BUFFER_LEVEL_STATUS__VI = 0x1AD7; +constexpr unsigned int mmLB0_LB_BUFFER_STATUS__VI = 0x1ADA; +constexpr unsigned int mmLB0_LB_BUFFER_URGENCY_CTRL__VI = 0x1AD8; +constexpr unsigned int mmLB0_LB_BUFFER_URGENCY_STATUS__VI = 0x1AD9; +constexpr unsigned int mmLB0_LB_DATA_FORMAT__VI = 0x1AC0; +constexpr unsigned int mmLB0_LB_DEBUG__VI = 0x1AE4; +constexpr unsigned int mmLB0_LB_DEBUG2__VI = 0x1AE5; +constexpr unsigned int mmLB0_LB_DEBUG3__VI = 0x1AE6; +constexpr unsigned int mmLB0_LB_DESKTOP_HEIGHT__VI = 0x1AC3; +constexpr unsigned int mmLB0_LB_INTERRUPT_MASK__VI = 0x1AC8; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_B_CB__VI = 0x1AD3; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_CTRL__VI = 0x1AD0; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_G_Y__VI = 0x1AD2; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_REP_B_CB__VI = 0x1AD6; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_REP_G_Y__VI = 0x1AD5; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_REP_R_CR__VI = 0x1AD4; +constexpr unsigned int mmLB0_LB_KEYER_COLOR_R_CR__VI = 0x1AD1; +constexpr unsigned int mmLB0_LB_MEMORY_CTRL__VI = 0x1AC1; +constexpr unsigned int mmLB0_LB_MEMORY_SIZE_STATUS__VI = 0x1AC2; +constexpr unsigned int mmLB0_LB_NO_OUTSTANDING_REQ_STATUS__VI = 0x1ADC; +constexpr unsigned int mmLB0_LB_SNAPSHOT_V_COUNTER__VI = 0x1AC7; +constexpr unsigned int mmLB0_LB_SYNC_RESET_SEL__VI = 0x1ACC; +constexpr unsigned int mmLB0_LB_VBLANK_STATUS__VI = 0x1ACB; +constexpr unsigned int mmLB0_LB_VLINE2_START_END__VI = 0x1AC5; +constexpr unsigned int mmLB0_LB_VLINE2_STATUS__VI = 0x1ACA; +constexpr unsigned int mmLB0_LB_VLINE_START_END__VI = 0x1AC4; +constexpr unsigned int mmLB0_LB_VLINE_STATUS__VI = 0x1AC9; +constexpr unsigned int mmLB0_LB_V_COUNTER__VI = 0x1AC6; +constexpr unsigned int mmLB0_MVP_AFR_FLIP_FIFO_CNTL__VI = 0x1AE1; +constexpr unsigned int mmLB0_MVP_AFR_FLIP_MODE__VI = 0x1AE0; +constexpr unsigned int mmLB0_MVP_FLIP_LINE_NUM_INSERT__VI = 0x1AE2; +constexpr unsigned int mmLB1_DC_MVP_LB_CONTROL__VI = 0x1CE3; +constexpr unsigned int mmLB1_LB_BLACK_KEYER_B_CB__VI = 0x1CCF; +constexpr unsigned int mmLB1_LB_BLACK_KEYER_G_Y__VI = 0x1CCE; +constexpr unsigned int mmLB1_LB_BLACK_KEYER_R_CR__VI = 0x1CCD; +constexpr unsigned int mmLB1_LB_BUFFER_LEVEL_STATUS__VI = 0x1CD7; +constexpr unsigned int mmLB1_LB_BUFFER_STATUS__VI = 0x1CDA; +constexpr unsigned int mmLB1_LB_BUFFER_URGENCY_CTRL__VI = 0x1CD8; +constexpr unsigned int mmLB1_LB_BUFFER_URGENCY_STATUS__VI = 0x1CD9; +constexpr unsigned int mmLB1_LB_DATA_FORMAT__VI = 0x1CC0; +constexpr unsigned int mmLB1_LB_DEBUG__VI = 0x1CE4; +constexpr unsigned int mmLB1_LB_DEBUG2__VI = 0x1CE5; +constexpr unsigned int mmLB1_LB_DEBUG3__VI = 0x1CE6; +constexpr unsigned int mmLB1_LB_DESKTOP_HEIGHT__VI = 0x1CC3; +constexpr unsigned int mmLB1_LB_INTERRUPT_MASK__VI = 0x1CC8; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_B_CB__VI = 0x1CD3; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_CTRL__VI = 0x1CD0; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_G_Y__VI = 0x1CD2; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_REP_B_CB__VI = 0x1CD6; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_REP_G_Y__VI = 0x1CD5; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_REP_R_CR__VI = 0x1CD4; +constexpr unsigned int mmLB1_LB_KEYER_COLOR_R_CR__VI = 0x1CD1; +constexpr unsigned int mmLB1_LB_MEMORY_CTRL__VI = 0x1CC1; +constexpr unsigned int mmLB1_LB_MEMORY_SIZE_STATUS__VI = 0x1CC2; +constexpr unsigned int mmLB1_LB_NO_OUTSTANDING_REQ_STATUS__VI = 0x1CDC; +constexpr unsigned int mmLB1_LB_SNAPSHOT_V_COUNTER__VI = 0x1CC7; +constexpr unsigned int mmLB1_LB_SYNC_RESET_SEL__VI = 0x1CCC; +constexpr unsigned int mmLB1_LB_TEST_DEBUG_DATA__VI = 0x1CFF; +constexpr unsigned int mmLB1_LB_TEST_DEBUG_INDEX__VI = 0x1CFE; +constexpr unsigned int mmLB1_LB_VBLANK_STATUS__VI = 0x1CCB; +constexpr unsigned int mmLB1_LB_VLINE2_START_END__VI = 0x1CC5; +constexpr unsigned int mmLB1_LB_VLINE2_STATUS__VI = 0x1CCA; +constexpr unsigned int mmLB1_LB_VLINE_START_END__VI = 0x1CC4; +constexpr unsigned int mmLB1_LB_VLINE_STATUS__VI = 0x1CC9; +constexpr unsigned int mmLB1_LB_V_COUNTER__VI = 0x1CC6; +constexpr unsigned int mmLB1_MVP_AFR_FLIP_FIFO_CNTL__VI = 0x1CE1; +constexpr unsigned int mmLB1_MVP_AFR_FLIP_MODE__VI = 0x1CE0; +constexpr unsigned int mmLB1_MVP_FLIP_LINE_NUM_INSERT__VI = 0x1CE2; +constexpr unsigned int mmLB2_DC_MVP_LB_CONTROL__VI = 0x1EE3; +constexpr unsigned int mmLB2_LB_BLACK_KEYER_B_CB__VI = 0x1ECF; +constexpr unsigned int mmLB2_LB_BLACK_KEYER_G_Y__VI = 0x1ECE; +constexpr unsigned int mmLB2_LB_BLACK_KEYER_R_CR__VI = 0x1ECD; +constexpr unsigned int mmLB2_LB_BUFFER_LEVEL_STATUS__VI = 0x1ED7; +constexpr unsigned int mmLB2_LB_BUFFER_STATUS__VI = 0x1EDA; +constexpr unsigned int mmLB2_LB_BUFFER_URGENCY_CTRL__VI = 0x1ED8; +constexpr unsigned int mmLB2_LB_BUFFER_URGENCY_STATUS__VI = 0x1ED9; +constexpr unsigned int mmLB2_LB_DATA_FORMAT__VI = 0x1EC0; +constexpr unsigned int mmLB2_LB_DEBUG__VI = 0x1EE4; +constexpr unsigned int mmLB2_LB_DEBUG2__VI = 0x1EE5; +constexpr unsigned int mmLB2_LB_DEBUG3__VI = 0x1EE6; +constexpr unsigned int mmLB2_LB_DESKTOP_HEIGHT__VI = 0x1EC3; +constexpr unsigned int mmLB2_LB_INTERRUPT_MASK__VI = 0x1EC8; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_B_CB__VI = 0x1ED3; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_CTRL__VI = 0x1ED0; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_G_Y__VI = 0x1ED2; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_REP_B_CB__VI = 0x1ED6; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_REP_G_Y__VI = 0x1ED5; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_REP_R_CR__VI = 0x1ED4; +constexpr unsigned int mmLB2_LB_KEYER_COLOR_R_CR__VI = 0x1ED1; +constexpr unsigned int mmLB2_LB_MEMORY_CTRL__VI = 0x1EC1; +constexpr unsigned int mmLB2_LB_MEMORY_SIZE_STATUS__VI = 0x1EC2; +constexpr unsigned int mmLB2_LB_NO_OUTSTANDING_REQ_STATUS__VI = 0x1EDC; +constexpr unsigned int mmLB2_LB_SNAPSHOT_V_COUNTER__VI = 0x1EC7; +constexpr unsigned int mmLB2_LB_SYNC_RESET_SEL__VI = 0x1ECC; +constexpr unsigned int mmLB2_LB_TEST_DEBUG_DATA__VI = 0x1EFF; +constexpr unsigned int mmLB2_LB_TEST_DEBUG_INDEX__VI = 0x1EFE; +constexpr unsigned int mmLB2_LB_VBLANK_STATUS__VI = 0x1ECB; +constexpr unsigned int mmLB2_LB_VLINE2_START_END__VI = 0x1EC5; +constexpr unsigned int mmLB2_LB_VLINE2_STATUS__VI = 0x1ECA; +constexpr unsigned int mmLB2_LB_VLINE_START_END__VI = 0x1EC4; +constexpr unsigned int mmLB2_LB_VLINE_STATUS__VI = 0x1EC9; +constexpr unsigned int mmLB2_LB_V_COUNTER__VI = 0x1EC6; +constexpr unsigned int mmLB2_MVP_AFR_FLIP_FIFO_CNTL__VI = 0x1EE1; +constexpr unsigned int mmLB2_MVP_AFR_FLIP_MODE__VI = 0x1EE0; +constexpr unsigned int mmLB2_MVP_FLIP_LINE_NUM_INSERT__VI = 0x1EE2; +constexpr unsigned int mmLB3_DC_MVP_LB_CONTROL__VI = 0x40E3; +constexpr unsigned int mmLB3_LB_BLACK_KEYER_B_CB__VI = 0x40CF; +constexpr unsigned int mmLB3_LB_BLACK_KEYER_G_Y__VI = 0x40CE; +constexpr unsigned int mmLB3_LB_BLACK_KEYER_R_CR__VI = 0x40CD; +constexpr unsigned int mmLB3_LB_BUFFER_LEVEL_STATUS__VI = 0x40D7; +constexpr unsigned int mmLB3_LB_BUFFER_STATUS__VI = 0x40DA; +constexpr unsigned int mmLB3_LB_BUFFER_URGENCY_CTRL__VI = 0x40D8; +constexpr unsigned int mmLB3_LB_BUFFER_URGENCY_STATUS__VI = 0x40D9; +constexpr unsigned int mmLB3_LB_DATA_FORMAT__VI = 0x40C0; +constexpr unsigned int mmLB3_LB_DEBUG__VI = 0x40E4; +constexpr unsigned int mmLB3_LB_DEBUG2__VI = 0x40E5; +constexpr unsigned int mmLB3_LB_DEBUG3__VI = 0x40E6; +constexpr unsigned int mmLB3_LB_DESKTOP_HEIGHT__VI = 0x40C3; +constexpr unsigned int mmLB3_LB_INTERRUPT_MASK__VI = 0x40C8; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_B_CB__VI = 0x40D3; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_CTRL__VI = 0x40D0; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_G_Y__VI = 0x40D2; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_REP_B_CB__VI = 0x40D6; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_REP_G_Y__VI = 0x40D5; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_REP_R_CR__VI = 0x40D4; +constexpr unsigned int mmLB3_LB_KEYER_COLOR_R_CR__VI = 0x40D1; +constexpr unsigned int mmLB3_LB_MEMORY_CTRL__VI = 0x40C1; +constexpr unsigned int mmLB3_LB_MEMORY_SIZE_STATUS__VI = 0x40C2; +constexpr unsigned int mmLB3_LB_NO_OUTSTANDING_REQ_STATUS__VI = 0x40DC; +constexpr unsigned int mmLB3_LB_SNAPSHOT_V_COUNTER__VI = 0x40C7; +constexpr unsigned int mmLB3_LB_SYNC_RESET_SEL__VI = 0x40CC; +constexpr unsigned int mmLB3_LB_TEST_DEBUG_DATA__VI = 0x40FF; +constexpr unsigned int mmLB3_LB_TEST_DEBUG_INDEX__VI = 0x40FE; +constexpr unsigned int mmLB3_LB_VBLANK_STATUS__VI = 0x40CB; +constexpr unsigned int mmLB3_LB_VLINE2_START_END__VI = 0x40C5; +constexpr unsigned int mmLB3_LB_VLINE2_STATUS__VI = 0x40CA; +constexpr unsigned int mmLB3_LB_VLINE_START_END__VI = 0x40C4; +constexpr unsigned int mmLB3_LB_VLINE_STATUS__VI = 0x40C9; +constexpr unsigned int mmLB3_LB_V_COUNTER__VI = 0x40C6; +constexpr unsigned int mmLB3_MVP_AFR_FLIP_FIFO_CNTL__VI = 0x40E1; +constexpr unsigned int mmLB3_MVP_AFR_FLIP_MODE__VI = 0x40E0; +constexpr unsigned int mmLB3_MVP_FLIP_LINE_NUM_INSERT__VI = 0x40E2; +constexpr unsigned int mmLB4_DC_MVP_LB_CONTROL__VI = 0x42E3; +constexpr unsigned int mmLB4_LB_BLACK_KEYER_B_CB__VI = 0x42CF; +constexpr unsigned int mmLB4_LB_BLACK_KEYER_G_Y__VI = 0x42CE; +constexpr unsigned int mmLB4_LB_BLACK_KEYER_R_CR__VI = 0x42CD; +constexpr unsigned int mmLB4_LB_BUFFER_LEVEL_STATUS__VI = 0x42D7; +constexpr unsigned int mmLB4_LB_BUFFER_STATUS__VI = 0x42DA; +constexpr unsigned int mmLB4_LB_BUFFER_URGENCY_CTRL__VI = 0x42D8; +constexpr unsigned int mmLB4_LB_BUFFER_URGENCY_STATUS__VI = 0x42D9; +constexpr unsigned int mmLB4_LB_DATA_FORMAT__VI = 0x42C0; +constexpr unsigned int mmLB4_LB_DEBUG__VI = 0x42E4; +constexpr unsigned int mmLB4_LB_DEBUG2__VI = 0x42E5; +constexpr unsigned int mmLB4_LB_DEBUG3__VI = 0x42E6; +constexpr unsigned int mmLB4_LB_DESKTOP_HEIGHT__VI = 0x42C3; +constexpr unsigned int mmLB4_LB_INTERRUPT_MASK__VI = 0x42C8; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_B_CB__VI = 0x42D3; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_CTRL__VI = 0x42D0; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_G_Y__VI = 0x42D2; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_REP_B_CB__VI = 0x42D6; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_REP_G_Y__VI = 0x42D5; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_REP_R_CR__VI = 0x42D4; +constexpr unsigned int mmLB4_LB_KEYER_COLOR_R_CR__VI = 0x42D1; +constexpr unsigned int mmLB4_LB_MEMORY_CTRL__VI = 0x42C1; +constexpr unsigned int mmLB4_LB_MEMORY_SIZE_STATUS__VI = 0x42C2; +constexpr unsigned int mmLB4_LB_NO_OUTSTANDING_REQ_STATUS__VI = 0x42DC; +constexpr unsigned int mmLB4_LB_SNAPSHOT_V_COUNTER__VI = 0x42C7; +constexpr unsigned int mmLB4_LB_SYNC_RESET_SEL__VI = 0x42CC; +constexpr unsigned int mmLB4_LB_TEST_DEBUG_DATA__VI = 0x42FF; +constexpr unsigned int mmLB4_LB_TEST_DEBUG_INDEX__VI = 0x42FE; +constexpr unsigned int mmLB4_LB_VBLANK_STATUS__VI = 0x42CB; +constexpr unsigned int mmLB4_LB_VLINE2_START_END__VI = 0x42C5; +constexpr unsigned int mmLB4_LB_VLINE2_STATUS__VI = 0x42CA; +constexpr unsigned int mmLB4_LB_VLINE_START_END__VI = 0x42C4; +constexpr unsigned int mmLB4_LB_VLINE_STATUS__VI = 0x42C9; +constexpr unsigned int mmLB4_LB_V_COUNTER__VI = 0x42C6; +constexpr unsigned int mmLB4_MVP_AFR_FLIP_FIFO_CNTL__VI = 0x42E1; +constexpr unsigned int mmLB4_MVP_AFR_FLIP_MODE__VI = 0x42E0; +constexpr unsigned int mmLB4_MVP_FLIP_LINE_NUM_INSERT__VI = 0x42E2; +constexpr unsigned int mmLB5_DC_MVP_LB_CONTROL__VI = 0x44E3; +constexpr unsigned int mmLB5_LB_BLACK_KEYER_B_CB__VI = 0x44CF; +constexpr unsigned int mmLB5_LB_BLACK_KEYER_G_Y__VI = 0x44CE; +constexpr unsigned int mmLB5_LB_BLACK_KEYER_R_CR__VI = 0x44CD; +constexpr unsigned int mmLB5_LB_BUFFER_LEVEL_STATUS__VI = 0x44D7; +constexpr unsigned int mmLB5_LB_BUFFER_STATUS__VI = 0x44DA; +constexpr unsigned int mmLB5_LB_BUFFER_URGENCY_CTRL__VI = 0x44D8; +constexpr unsigned int mmLB5_LB_BUFFER_URGENCY_STATUS__VI = 0x44D9; +constexpr unsigned int mmLB5_LB_DATA_FORMAT__VI = 0x44C0; +constexpr unsigned int mmLB5_LB_DEBUG__VI = 0x44E4; +constexpr unsigned int mmLB5_LB_DEBUG2__VI = 0x44E5; +constexpr unsigned int mmLB5_LB_DEBUG3__VI = 0x44E6; +constexpr unsigned int mmLB5_LB_DESKTOP_HEIGHT__VI = 0x44C3; +constexpr unsigned int mmLB5_LB_INTERRUPT_MASK__VI = 0x44C8; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_B_CB__VI = 0x44D3; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_CTRL__VI = 0x44D0; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_G_Y__VI = 0x44D2; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_REP_B_CB__VI = 0x44D6; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_REP_G_Y__VI = 0x44D5; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_REP_R_CR__VI = 0x44D4; +constexpr unsigned int mmLB5_LB_KEYER_COLOR_R_CR__VI = 0x44D1; +constexpr unsigned int mmLB5_LB_MEMORY_CTRL__VI = 0x44C1; +constexpr unsigned int mmLB5_LB_MEMORY_SIZE_STATUS__VI = 0x44C2; +constexpr unsigned int mmLB5_LB_NO_OUTSTANDING_REQ_STATUS__VI = 0x44DC; +constexpr unsigned int mmLB5_LB_SNAPSHOT_V_COUNTER__VI = 0x44C7; +constexpr unsigned int mmLB5_LB_SYNC_RESET_SEL__VI = 0x44CC; +constexpr unsigned int mmLB5_LB_TEST_DEBUG_DATA__VI = 0x44FF; +constexpr unsigned int mmLB5_LB_TEST_DEBUG_INDEX__VI = 0x44FE; +constexpr unsigned int mmLB5_LB_VBLANK_STATUS__VI = 0x44CB; +constexpr unsigned int mmLB5_LB_VLINE2_START_END__VI = 0x44C5; +constexpr unsigned int mmLB5_LB_VLINE2_STATUS__VI = 0x44CA; +constexpr unsigned int mmLB5_LB_VLINE_START_END__VI = 0x44C4; +constexpr unsigned int mmLB5_LB_VLINE_STATUS__VI = 0x44C9; +constexpr unsigned int mmLB5_LB_V_COUNTER__VI = 0x44C6; +constexpr unsigned int mmLB5_MVP_AFR_FLIP_FIFO_CNTL__VI = 0x44E1; +constexpr unsigned int mmLB5_MVP_AFR_FLIP_MODE__VI = 0x44E0; +constexpr unsigned int mmLB5_MVP_FLIP_LINE_NUM_INSERT__VI = 0x44E2; +constexpr unsigned int mmLBV_BLACK_KEYER_B_CB__VI = 0x464D; +constexpr unsigned int mmLBV_BLACK_KEYER_G_Y__VI = 0x464C; +constexpr unsigned int mmLBV_BLACK_KEYER_R_CR__VI = 0x464B; +constexpr unsigned int mmLBV_BUFFER_LEVEL_STATUS__VI = 0x4655; +constexpr unsigned int mmLBV_BUFFER_STATUS__VI = 0x4658; +constexpr unsigned int mmLBV_BUFFER_URGENCY_CTRL__VI = 0x4656; +constexpr unsigned int mmLBV_BUFFER_URGENCY_STATUS__VI = 0x4657; +constexpr unsigned int mmLBV_DATA_FORMAT__VI = 0x463C; +constexpr unsigned int mmLBV_DEBUG__VI = 0x465A; +constexpr unsigned int mmLBV_DEBUG2__VI = 0x465B; +constexpr unsigned int mmLBV_DEBUG3__VI = 0x465C; +constexpr unsigned int mmLBV_DESKTOP_HEIGHT__VI = 0x463F; +constexpr unsigned int mmLBV_INTERRUPT_MASK__VI = 0x4646; +constexpr unsigned int mmLBV_KEYER_COLOR_B_CB__VI = 0x4651; +constexpr unsigned int mmLBV_KEYER_COLOR_CTRL__VI = 0x464E; +constexpr unsigned int mmLBV_KEYER_COLOR_G_Y__VI = 0x4650; +constexpr unsigned int mmLBV_KEYER_COLOR_REP_B_CB__VI = 0x4654; +constexpr unsigned int mmLBV_KEYER_COLOR_REP_G_Y__VI = 0x4653; +constexpr unsigned int mmLBV_KEYER_COLOR_REP_R_CR__VI = 0x4652; +constexpr unsigned int mmLBV_KEYER_COLOR_R_CR__VI = 0x464F; +constexpr unsigned int mmLBV_MEMORY_CTRL__VI = 0x463D; +constexpr unsigned int mmLBV_MEMORY_SIZE_STATUS__VI = 0x463E; +constexpr unsigned int mmLBV_NO_OUTSTANDING_REQ_STATUS__VI = 0x4659; +constexpr unsigned int mmLBV_SNAPSHOT_V_COUNTER__VI = 0x4643; +constexpr unsigned int mmLBV_SNAPSHOT_V_COUNTER_CHROMA__VI = 0x4645; +constexpr unsigned int mmLBV_SYNC_RESET_SEL__VI = 0x464A; +constexpr unsigned int mmLBV_TEST_DEBUG_DATA__VI = 0x4667; +constexpr unsigned int mmLBV_TEST_DEBUG_INDEX__VI = 0x4666; +constexpr unsigned int mmLBV_VBLANK_STATUS__VI = 0x4649; +constexpr unsigned int mmLBV_VLINE2_START_END__VI = 0x4641; +constexpr unsigned int mmLBV_VLINE2_STATUS__VI = 0x4648; +constexpr unsigned int mmLBV_VLINE_START_END__VI = 0x4640; +constexpr unsigned int mmLBV_VLINE_STATUS__VI = 0x4647; +constexpr unsigned int mmLBV_V_COUNTER__VI = 0x4642; +constexpr unsigned int mmLBV_V_COUNTER_CHROMA__VI = 0x4644; +constexpr unsigned int mmLB_BLACK_KEYER_B_CB__VI = 0x1ACF; +constexpr unsigned int mmLB_BLACK_KEYER_G_Y__VI = 0x1ACE; +constexpr unsigned int mmLB_BLACK_KEYER_R_CR__VI = 0x1ACD; +constexpr unsigned int mmLB_BUFFER_LEVEL_STATUS__VI = 0x1AD7; +constexpr unsigned int mmLB_BUFFER_STATUS__VI = 0x1ADA; +constexpr unsigned int mmLB_BUFFER_URGENCY_CTRL__VI = 0x1AD8; +constexpr unsigned int mmLB_BUFFER_URGENCY_STATUS__VI = 0x1AD9; +constexpr unsigned int mmLB_DATA_FORMAT__VI = 0x1AC0; +constexpr unsigned int mmLB_DEBUG__VI = 0x1AE4; +constexpr unsigned int mmLB_DEBUG2__VI = 0x1AE5; +constexpr unsigned int mmLB_DEBUG3__VI = 0x1AE6; +constexpr unsigned int mmLB_DESKTOP_HEIGHT__VI = 0x1AC3; +constexpr unsigned int mmLB_INTERRUPT_MASK__VI = 0x1AC8; +constexpr unsigned int mmLB_KEYER_COLOR_B_CB__VI = 0x1AD3; +constexpr unsigned int mmLB_KEYER_COLOR_CTRL__VI = 0x1AD0; +constexpr unsigned int mmLB_KEYER_COLOR_G_Y__VI = 0x1AD2; +constexpr unsigned int mmLB_KEYER_COLOR_REP_B_CB__VI = 0x1AD6; +constexpr unsigned int mmLB_KEYER_COLOR_REP_G_Y__VI = 0x1AD5; +constexpr unsigned int mmLB_KEYER_COLOR_REP_R_CR__VI = 0x1AD4; +constexpr unsigned int mmLB_KEYER_COLOR_R_CR__VI = 0x1AD1; +constexpr unsigned int mmLB_MEMORY_CTRL__VI = 0x1AC1; +constexpr unsigned int mmLB_MEMORY_SIZE_STATUS__VI = 0x1AC2; +constexpr unsigned int mmLB_NO_OUTSTANDING_REQ_STATUS__VI = 0x1ADC; +constexpr unsigned int mmLB_SNAPSHOT_V_COUNTER__VI = 0x1AC7; +constexpr unsigned int mmLB_SYNC_RESET_SEL__VI = 0x1ACC; +constexpr unsigned int mmLB_VBLANK_STATUS__VI = 0x1ACB; +constexpr unsigned int mmLB_VLINE2_START_END__VI = 0x1AC5; +constexpr unsigned int mmLB_VLINE2_STATUS__VI = 0x1ACA; +constexpr unsigned int mmLB_VLINE_START_END__VI = 0x1AC4; +constexpr unsigned int mmLB_VLINE_STATUS__VI = 0x1AC9; +constexpr unsigned int mmLB_V_COUNTER__VI = 0x1AC6; +constexpr unsigned int mmLOW_POWER_TILING_CONTROL__VI = 0x030B; +constexpr unsigned int mmLVDS_DATA_CNTL__VI = 0x4A78; +constexpr unsigned int mmLVTMA_PWRSEQ_CNTL__VI = 0x481B; +constexpr unsigned int mmLVTMA_PWRSEQ_DELAY1__VI = 0x481E; +constexpr unsigned int mmLVTMA_PWRSEQ_DELAY2__VI = 0x481F; +constexpr unsigned int mmLVTMA_PWRSEQ_REF_DIV__VI = 0x481D; +constexpr unsigned int mmLVTMA_PWRSEQ_STATE__VI = 0x481C; +constexpr unsigned int mmMAILBOX_CONTROL__VI = 0x14D0; +constexpr unsigned int mmMAILBOX_INDEX__VI = 0x14C6; +constexpr unsigned int mmMAILBOX_INT_CNTL__VI = 0x14D1; +constexpr unsigned int mmMAILBOX_MSGBUF_RCV_DW0__VI = 0x14CC; +constexpr unsigned int mmMAILBOX_MSGBUF_RCV_DW1__VI = 0x14CD; +constexpr unsigned int mmMAILBOX_MSGBUF_RCV_DW2__VI = 0x14CE; +constexpr unsigned int mmMAILBOX_MSGBUF_RCV_DW3__VI = 0x14CF; +constexpr unsigned int mmMAILBOX_MSGBUF_TRN_DW0__VI = 0x14C8; +constexpr unsigned int mmMAILBOX_MSGBUF_TRN_DW1__VI = 0x14C9; +constexpr unsigned int mmMAILBOX_MSGBUF_TRN_DW2__VI = 0x14CA; +constexpr unsigned int mmMAILBOX_MSGBUF_TRN_DW3__VI = 0x14CB; +constexpr unsigned int mmMCIF_CONTROL__VI = 0x030C; +constexpr unsigned int mmMCIF_MEM_CONTROL__VI = 0x0311; +constexpr unsigned int mmMCIF_TEST_DEBUG_DATA__VI = 0x030F; +constexpr unsigned int mmMCIF_TEST_DEBUG_INDEX__VI = 0x030E; +constexpr unsigned int mmMCIF_VMID__VI = 0x0310; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_ARBITRATION_CONTROL__VI = 0x5E84; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUFMGR_CUR_LINE_R__VI = 0x5E79; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUFMGR_STATUS__VI = 0x5E7A; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUFMGR_SW_CONTROL__VI = 0x5E78; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUFMGR_VCE_CONTROL__VI = 0x5E98; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_1_ADDR_C__VI = 0x5E8A; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_1_ADDR_C_OFFSET__VI = 0x5E8B; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_1_ADDR_Y__VI = 0x5E88; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_1_ADDR_Y_OFFSET__VI = 0x5E89; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_1_STATUS__VI = 0x5E7C; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_1_STATUS2__VI = 0x5E7D; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_2_ADDR_C__VI = 0x5E8E; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_2_ADDR_C_OFFSET__VI = 0x5E8F; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_2_ADDR_Y__VI = 0x5E8C; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_2_ADDR_Y_OFFSET__VI = 0x5E8D; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_2_STATUS__VI = 0x5E7E; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_2_STATUS2__VI = 0x5E7F; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_3_ADDR_C__VI = 0x5E92; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_3_ADDR_C_OFFSET__VI = 0x5E93; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_3_ADDR_Y__VI = 0x5E90; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_3_ADDR_Y_OFFSET__VI = 0x5E91; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_3_STATUS__VI = 0x5E80; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_3_STATUS2__VI = 0x5E81; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_4_ADDR_C__VI = 0x5E96; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_4_ADDR_C_OFFSET__VI = 0x5E97; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_4_ADDR_Y__VI = 0x5E94; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_4_ADDR_Y_OFFSET__VI = 0x5E95; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_4_STATUS__VI = 0x5E82; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_4_STATUS2__VI = 0x5E83; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_BUF_PITCH__VI = 0x5E7B; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_HVVMID_CONTROL__VI = 0x5E99; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_TEST_DEBUG_DATA__VI = 0x5E87; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_TEST_DEBUG_INDEX__VI = 0x5E86; +constexpr unsigned int mmMCIF_WB0_MCIF_WB_URGENCY_WATERMARK__VI = 0x5E85; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_ARBITRATION_CONTROL__VI = 0x5EC4; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUFMGR_CUR_LINE_R__VI = 0x5EB9; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUFMGR_STATUS__VI = 0x5EBA; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUFMGR_SW_CONTROL__VI = 0x5EB8; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUFMGR_VCE_CONTROL__VI = 0x5ED8; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_1_ADDR_C__VI = 0x5ECA; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_1_ADDR_C_OFFSET__VI = 0x5ECB; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_1_ADDR_Y__VI = 0x5EC8; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_1_ADDR_Y_OFFSET__VI = 0x5EC9; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_1_STATUS__VI = 0x5EBC; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_1_STATUS2__VI = 0x5EBD; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_2_ADDR_C__VI = 0x5ECE; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_2_ADDR_C_OFFSET__VI = 0x5ECF; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_2_ADDR_Y__VI = 0x5ECC; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_2_ADDR_Y_OFFSET__VI = 0x5ECD; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_2_STATUS__VI = 0x5EBE; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_2_STATUS2__VI = 0x5EBF; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_3_ADDR_C__VI = 0x5ED2; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_3_ADDR_C_OFFSET__VI = 0x5ED3; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_3_ADDR_Y__VI = 0x5ED0; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_3_ADDR_Y_OFFSET__VI = 0x5ED1; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_3_STATUS__VI = 0x5EC0; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_3_STATUS2__VI = 0x5EC1; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_4_ADDR_C__VI = 0x5ED6; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_4_ADDR_C_OFFSET__VI = 0x5ED7; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_4_ADDR_Y__VI = 0x5ED4; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_4_ADDR_Y_OFFSET__VI = 0x5ED5; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_4_STATUS__VI = 0x5EC2; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_4_STATUS2__VI = 0x5EC3; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_BUF_PITCH__VI = 0x5EBB; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_HVVMID_CONTROL__VI = 0x5ED9; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_TEST_DEBUG_DATA__VI = 0x5EC7; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_TEST_DEBUG_INDEX__VI = 0x5EC6; +constexpr unsigned int mmMCIF_WB1_MCIF_WB_URGENCY_WATERMARK__VI = 0x5EC5; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_ARBITRATION_CONTROL__VI = 0x5F04; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUFMGR_CUR_LINE_R__VI = 0x5EF9; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUFMGR_STATUS__VI = 0x5EFA; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUFMGR_SW_CONTROL__VI = 0x5EF8; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUFMGR_VCE_CONTROL__VI = 0x5F18; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_1_ADDR_C__VI = 0x5F0A; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_1_ADDR_C_OFFSET__VI = 0x5F0B; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_1_ADDR_Y__VI = 0x5F08; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_1_ADDR_Y_OFFSET__VI = 0x5F09; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_1_STATUS__VI = 0x5EFC; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_1_STATUS2__VI = 0x5EFD; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_2_ADDR_C__VI = 0x5F0E; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_2_ADDR_C_OFFSET__VI = 0x5F0F; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_2_ADDR_Y__VI = 0x5F0C; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_2_ADDR_Y_OFFSET__VI = 0x5F0D; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_2_STATUS__VI = 0x5EFE; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_2_STATUS2__VI = 0x5EFF; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_3_ADDR_C__VI = 0x5F12; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_3_ADDR_C_OFFSET__VI = 0x5F13; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_3_ADDR_Y__VI = 0x5F10; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_3_ADDR_Y_OFFSET__VI = 0x5F11; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_3_STATUS__VI = 0x5F00; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_3_STATUS2__VI = 0x5F01; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_4_ADDR_C__VI = 0x5F16; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_4_ADDR_C_OFFSET__VI = 0x5F17; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_4_ADDR_Y__VI = 0x5F14; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_4_ADDR_Y_OFFSET__VI = 0x5F15; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_4_STATUS__VI = 0x5F02; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_4_STATUS2__VI = 0x5F03; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_BUF_PITCH__VI = 0x5EFB; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_HVVMID_CONTROL__VI = 0x5F19; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_TEST_DEBUG_DATA__VI = 0x5F07; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_TEST_DEBUG_INDEX__VI = 0x5F06; +constexpr unsigned int mmMCIF_WB2_MCIF_WB_URGENCY_WATERMARK__VI = 0x5F05; +constexpr unsigned int mmMCIF_WB_ARBITRATION_CONTROL__VI = 0x5E84; +constexpr unsigned int mmMCIF_WB_BUFMGR_CUR_LINE_R__VI = 0x5E79; +constexpr unsigned int mmMCIF_WB_BUFMGR_STATUS__VI = 0x5E7A; +constexpr unsigned int mmMCIF_WB_BUFMGR_SW_CONTROL__VI = 0x5E78; +constexpr unsigned int mmMCIF_WB_BUFMGR_VCE_CONTROL__VI = 0x5E98; +constexpr unsigned int mmMCIF_WB_BUF_1_ADDR_C__VI = 0x5E8A; +constexpr unsigned int mmMCIF_WB_BUF_1_ADDR_C_OFFSET__VI = 0x5E8B; +constexpr unsigned int mmMCIF_WB_BUF_1_ADDR_Y__VI = 0x5E88; +constexpr unsigned int mmMCIF_WB_BUF_1_ADDR_Y_OFFSET__VI = 0x5E89; +constexpr unsigned int mmMCIF_WB_BUF_1_STATUS__VI = 0x5E7C; +constexpr unsigned int mmMCIF_WB_BUF_1_STATUS2__VI = 0x5E7D; +constexpr unsigned int mmMCIF_WB_BUF_2_ADDR_C__VI = 0x5E8E; +constexpr unsigned int mmMCIF_WB_BUF_2_ADDR_C_OFFSET__VI = 0x5E8F; +constexpr unsigned int mmMCIF_WB_BUF_2_ADDR_Y__VI = 0x5E8C; +constexpr unsigned int mmMCIF_WB_BUF_2_ADDR_Y_OFFSET__VI = 0x5E8D; +constexpr unsigned int mmMCIF_WB_BUF_2_STATUS__VI = 0x5E7E; +constexpr unsigned int mmMCIF_WB_BUF_2_STATUS2__VI = 0x5E7F; +constexpr unsigned int mmMCIF_WB_BUF_3_ADDR_C__VI = 0x5E92; +constexpr unsigned int mmMCIF_WB_BUF_3_ADDR_C_OFFSET__VI = 0x5E93; +constexpr unsigned int mmMCIF_WB_BUF_3_ADDR_Y__VI = 0x5E90; +constexpr unsigned int mmMCIF_WB_BUF_3_ADDR_Y_OFFSET__VI = 0x5E91; +constexpr unsigned int mmMCIF_WB_BUF_3_STATUS__VI = 0x5E80; +constexpr unsigned int mmMCIF_WB_BUF_3_STATUS2__VI = 0x5E81; +constexpr unsigned int mmMCIF_WB_BUF_4_ADDR_C__VI = 0x5E96; +constexpr unsigned int mmMCIF_WB_BUF_4_ADDR_C_OFFSET__VI = 0x5E97; +constexpr unsigned int mmMCIF_WB_BUF_4_ADDR_Y__VI = 0x5E94; +constexpr unsigned int mmMCIF_WB_BUF_4_ADDR_Y_OFFSET__VI = 0x5E95; +constexpr unsigned int mmMCIF_WB_BUF_4_STATUS__VI = 0x5E82; +constexpr unsigned int mmMCIF_WB_BUF_4_STATUS2__VI = 0x5E83; +constexpr unsigned int mmMCIF_WB_BUF_PITCH__VI = 0x5E7B; +constexpr unsigned int mmMCIF_WB_HVVMID_CONTROL__VI = 0x5E99; +constexpr unsigned int mmMCIF_WB_TEST_DEBUG_DATA__VI = 0x5E87; +constexpr unsigned int mmMCIF_WB_TEST_DEBUG_INDEX__VI = 0x5E86; +constexpr unsigned int mmMCIF_WB_URGENCY_WATERMARK__VI = 0x5E85; +constexpr unsigned int mmMCIF_WRITE_COMBINE_CONTROL__VI = 0x030D; +constexpr unsigned int mmMC_ARB_ATOMIC__VI = 0x09BE; +constexpr unsigned int mmMC_ARB_GRUB__VI = 0x09C8; +constexpr unsigned int mmMC_ARB_GRUB2__VI = 0x0A01; +constexpr unsigned int mmMC_ARB_GRUB_PRIORITY1_RD__VI = 0x0DD8; +constexpr unsigned int mmMC_ARB_GRUB_PRIORITY1_WR__VI = 0x0DD9; +constexpr unsigned int mmMC_ARB_GRUB_PRIORITY2_RD__VI = 0x0DDA; +constexpr unsigned int mmMC_ARB_GRUB_PRIORITY2_WR__VI = 0x0DDB; +constexpr unsigned int mmMC_ARB_GRUB_PROMOTE__VI = 0x09CE; +constexpr unsigned int mmMC_ARB_GRUB_REALTIME_RD__VI = 0x09F9; +constexpr unsigned int mmMC_ARB_GRUB_REALTIME_WR__VI = 0x09FB; +constexpr unsigned int mmMC_ARB_PERF_CID__VI = 0x09C6; +constexpr unsigned int mmMC_ARB_SNOOP__VI = 0x09C7; +constexpr unsigned int mmMC_BIST_CMD__VI = 0x0A85; +constexpr unsigned int mmMC_BIST_CNTL__SI__CI = 0x0A05; +constexpr unsigned int mmMC_BIST_CNTL__VI = 0x0A84; +constexpr unsigned int mmMC_BIST_DAT__VI = 0x0A86; +constexpr unsigned int mmMC_BIST_DATA_WORD0__SI__CI = 0x0A0A; +constexpr unsigned int mmMC_BIST_DATA_WORD0__VI = 0x0A8A; +constexpr unsigned int mmMC_BIST_DATA_WORD1__SI__CI = 0x0A0B; +constexpr unsigned int mmMC_BIST_DATA_WORD1__VI = 0x0A8B; +constexpr unsigned int mmMC_BIST_DATA_WORD2__SI__CI = 0x0A0C; +constexpr unsigned int mmMC_BIST_DATA_WORD2__VI = 0x0A8C; +constexpr unsigned int mmMC_BIST_DATA_WORD3__SI__CI = 0x0A0D; +constexpr unsigned int mmMC_BIST_DATA_WORD3__VI = 0x0A8D; +constexpr unsigned int mmMC_BIST_DATA_WORD4__SI__CI = 0x0A0E; +constexpr unsigned int mmMC_BIST_DATA_WORD4__VI = 0x0A8E; +constexpr unsigned int mmMC_BIST_DATA_WORD5__SI__CI = 0x0A0F; +constexpr unsigned int mmMC_BIST_DATA_WORD5__VI = 0x0A8F; +constexpr unsigned int mmMC_BIST_DATA_WORD6__SI__CI = 0x0A10; +constexpr unsigned int mmMC_BIST_DATA_WORD6__VI = 0x0A90; +constexpr unsigned int mmMC_BIST_DATA_WORD7__SI__CI = 0x0A11; +constexpr unsigned int mmMC_BIST_DATA_WORD7__VI = 0x0A91; +constexpr unsigned int mmMC_BIST_MISMATCH_ADDR__SI__CI = 0x0A13; +constexpr unsigned int mmMC_BIST_MISMATCH_ADDR__VI = 0x0A93; +constexpr unsigned int mmMC_BIST_RDATA_WORD0__SI__CI = 0x0A14; +constexpr unsigned int mmMC_BIST_RDATA_WORD0__VI = 0x0A94; +constexpr unsigned int mmMC_BIST_RDATA_WORD1__SI__CI = 0x0A15; +constexpr unsigned int mmMC_BIST_RDATA_WORD1__VI = 0x0A95; +constexpr unsigned int mmMC_BIST_RDATA_WORD2__SI__CI = 0x0A16; +constexpr unsigned int mmMC_BIST_RDATA_WORD2__VI = 0x0A96; +constexpr unsigned int mmMC_BIST_RDATA_WORD3__SI__CI = 0x0A17; +constexpr unsigned int mmMC_BIST_RDATA_WORD3__VI = 0x0A97; +constexpr unsigned int mmMC_BIST_RDATA_WORD4__SI__CI = 0x0A18; +constexpr unsigned int mmMC_BIST_RDATA_WORD4__VI = 0x0A98; +constexpr unsigned int mmMC_BIST_RDATA_WORD5__SI__CI = 0x0A19; +constexpr unsigned int mmMC_BIST_RDATA_WORD5__VI = 0x0A99; +constexpr unsigned int mmMC_BIST_RDATA_WORD6__SI__CI = 0x0A1A; +constexpr unsigned int mmMC_BIST_RDATA_WORD6__VI = 0x0A9A; +constexpr unsigned int mmMC_BIST_RDATA_WORD7__SI__CI = 0x0A1B; +constexpr unsigned int mmMC_BIST_RDATA_WORD7__VI = 0x0A9B; +constexpr unsigned int mmMC_CG_DATAPORT__SI__CI = 0x0A21; +constexpr unsigned int mmMC_CG_DATAPORT__VI = 0x0A32; +constexpr unsigned int mmMC_CITF_CREDITS_ARB_RD2__VI = 0x097E; +constexpr unsigned int mmMC_DC_INTERFACE_NACK_STATUS__VI = 0x0313; +constexpr unsigned int mmMC_FUS_ARB_GARLIC_CNTL__VI = 0x0A20; +constexpr unsigned int mmMC_FUS_ARB_GARLIC_ISOC_PRI__VI = 0x0A1F; +constexpr unsigned int mmMC_FUS_ARB_GARLIC_WR_PRI__VI = 0x0A21; +constexpr unsigned int mmMC_FUS_ARB_GARLIC_WR_PRI2__VI = 0x0A22; +constexpr unsigned int mmMC_FUS_DRAM0_BANK_ADDR_MAPPING__VI = 0x0A11; +constexpr unsigned int mmMC_FUS_DRAM0_CS0_BASE__VI = 0x0A05; +constexpr unsigned int mmMC_FUS_DRAM0_CS1_BASE__VI = 0x0A07; +constexpr unsigned int mmMC_FUS_DRAM0_CS2_BASE__VI = 0x0A09; +constexpr unsigned int mmMC_FUS_DRAM0_CS3_BASE__VI = 0x0A0B; +constexpr unsigned int mmMC_FUS_DRAM0_CTL_BASE__VI = 0x0A13; +constexpr unsigned int mmMC_FUS_DRAM0_CTL_LIMIT__VI = 0x0A15; +constexpr unsigned int mmMC_FUS_DRAM1_BANK_ADDR_MAPPING__VI = 0x0A12; +constexpr unsigned int mmMC_FUS_DRAM1_CS0_BASE__VI = 0x0A06; +constexpr unsigned int mmMC_FUS_DRAM1_CS1_BASE__VI = 0x0A08; +constexpr unsigned int mmMC_FUS_DRAM1_CS2_BASE__VI = 0x0A0A; +constexpr unsigned int mmMC_FUS_DRAM1_CS3_BASE__VI = 0x0A0C; +constexpr unsigned int mmMC_FUS_DRAM1_CTL_BASE__VI = 0x0A14; +constexpr unsigned int mmMC_FUS_DRAM1_CTL_LIMIT__VI = 0x0A16; +constexpr unsigned int mmMC_FUS_DRAM_APER_BASE__VI = 0x0A1A; +constexpr unsigned int mmMC_FUS_DRAM_APER_DEF__VI = 0x0A1E; +constexpr unsigned int mmMC_FUS_DRAM_APER_TOP__VI = 0x0A1B; +constexpr unsigned int mmMC_FUS_DRAM_CTL_HIGH_01__VI = 0x0A17; +constexpr unsigned int mmMC_FUS_DRAM_CTL_HIGH_23__VI = 0x0A18; +constexpr unsigned int mmMC_FUS_DRAM_MODE__VI = 0x0A19; +constexpr unsigned int mmMC_GRUB_FEATURES__VI = 0x0A36; +constexpr unsigned int mmMC_GRUB_PERFCOUNTER0_CFG__VI = 0x07E6; +constexpr unsigned int mmMC_GRUB_PERFCOUNTER1_CFG__VI = 0x07E7; +constexpr unsigned int mmMC_GRUB_PERFCOUNTER_HI__VI = 0x07E5; +constexpr unsigned int mmMC_GRUB_PERFCOUNTER_LO__VI = 0x07E4; +constexpr unsigned int mmMC_GRUB_PERFCOUNTER_RSLT_CNTL__VI = 0x07E8; +constexpr unsigned int mmMC_GRUB_POST_PROBE_DELAY__VI = 0x0A34; +constexpr unsigned int mmMC_GRUB_PROBE_CREDITS__VI = 0x0A35; +constexpr unsigned int mmMC_GRUB_PROBE_MAP__VI = 0x0A33; +constexpr unsigned int mmMC_GRUB_TCB_DATA_HI__VI = 0x0A3A; +constexpr unsigned int mmMC_GRUB_TCB_DATA_LO__VI = 0x0A39; +constexpr unsigned int mmMC_GRUB_TCB_INDEX__VI = 0x0A38; +constexpr unsigned int mmMC_GRUB_TX_CREDITS__VI = 0x0A37; +constexpr unsigned int mmMC_HUB_MISC_ATOMIC_IDLE_STATUS__VI = 0x084F; +constexpr unsigned int mmMC_HUB_RDREQ_ACPG__VI = 0x0881; +constexpr unsigned int mmMC_HUB_RDREQ_ACPO__VI = 0x0882; +constexpr unsigned int mmMC_HUB_RDREQ_BYPASS_GBL0__VI = 0x084C; +constexpr unsigned int mmMC_HUB_RDREQ_DMIF__VI = 0x0862; +constexpr unsigned int mmMC_HUB_RDREQ_HDP__VI = 0x085A; +constexpr unsigned int mmMC_HUB_RDREQ_ISP_CCPU__VI = 0x0DE2; +constexpr unsigned int mmMC_HUB_RDREQ_ISP_MPM__VI = 0x0DE1; +constexpr unsigned int mmMC_HUB_RDREQ_ISP_SPM__VI = 0x0DE0; +constexpr unsigned int mmMC_HUB_RDREQ_MCDS__VI = 0x0DE7; +constexpr unsigned int mmMC_HUB_RDREQ_MCDT__VI = 0x0DE8; +constexpr unsigned int mmMC_HUB_RDREQ_MCDU__VI = 0x0DE9; +constexpr unsigned int mmMC_HUB_RDREQ_MCDV__VI = 0x0DEA; +constexpr unsigned int mmMC_HUB_RDREQ_MCIF__VI = 0x0863; +constexpr unsigned int mmMC_HUB_RDREQ_RLC__VI = 0x085C; +constexpr unsigned int mmMC_HUB_RDREQ_SAMMSP__VI = 0x0883; +constexpr unsigned int mmMC_HUB_RDREQ_SDMA0__VI = 0x0859; +constexpr unsigned int mmMC_HUB_RDREQ_SDMA1__VI = 0x085B; +constexpr unsigned int mmMC_HUB_RDREQ_SEM__VI = 0x085D; +constexpr unsigned int mmMC_HUB_RDREQ_TLS__VI = 0x0861; +constexpr unsigned int mmMC_HUB_RDREQ_UMC__VI = 0x085F; +constexpr unsigned int mmMC_HUB_RDREQ_UVD__VI = 0x0860; +constexpr unsigned int mmMC_HUB_RDREQ_VCE0__VI = 0x085E; +constexpr unsigned int mmMC_HUB_RDREQ_VCE1__VI = 0x0DFC; +constexpr unsigned int mmMC_HUB_RDREQ_VCEU0__VI = 0x0865; +constexpr unsigned int mmMC_HUB_RDREQ_VCEU1__VI = 0x0DFD; +constexpr unsigned int mmMC_HUB_RDREQ_VMC__VI = 0x0864; +constexpr unsigned int mmMC_HUB_RDREQ_VP8__VI = 0x0884; +constexpr unsigned int mmMC_HUB_RDREQ_VP8U__VI = 0x0885; +constexpr unsigned int mmMC_HUB_RDREQ_XDMAM__VI = 0x0880; +constexpr unsigned int mmMC_HUB_WDP_ACPG__VI = 0x0885; +constexpr unsigned int mmMC_HUB_WDP_ACPO__VI = 0x0886; +constexpr unsigned int mmMC_HUB_WDP_BP2__VI = 0x0DFB; +constexpr unsigned int mmMC_HUB_WDP_BYPASS_GBL0__VI = 0x084A; +constexpr unsigned int mmMC_HUB_WDP_BYPASS_GBL1__VI = 0x084B; +constexpr unsigned int mmMC_HUB_WDP_CREDITS2__VI = 0x0840; +constexpr unsigned int mmMC_HUB_WDP_CREDITS3__VI = 0x0843; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDS__VI = 0x0DF7; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDT__VI = 0x0DF8; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDU__VI = 0x0DF9; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDV__VI = 0x0DFA; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDW__VI = 0x0DF3; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDX__VI = 0x0DF4; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDY__VI = 0x0DF5; +constexpr unsigned int mmMC_HUB_WDP_CREDITS_MCDZ__VI = 0x0DF6; +constexpr unsigned int mmMC_HUB_WDP_HDP__VI = 0x0877; +constexpr unsigned int mmMC_HUB_WDP_IH__VI = 0x0870; +constexpr unsigned int mmMC_HUB_WDP_ISP_CCPU__VI = 0x0DE6; +constexpr unsigned int mmMC_HUB_WDP_ISP_MPM__VI = 0x0DE5; +constexpr unsigned int mmMC_HUB_WDP_ISP_MPS__VI = 0x0DE4; +constexpr unsigned int mmMC_HUB_WDP_ISP_SPM__VI = 0x0DE3; +constexpr unsigned int mmMC_HUB_WDP_MCDS__VI = 0x0DEB; +constexpr unsigned int mmMC_HUB_WDP_MCDT__VI = 0x0DEC; +constexpr unsigned int mmMC_HUB_WDP_MCDU__VI = 0x0DED; +constexpr unsigned int mmMC_HUB_WDP_MCDV__VI = 0x0DEE; +constexpr unsigned int mmMC_HUB_WDP_MCDW__VI = 0x0866; +constexpr unsigned int mmMC_HUB_WDP_MCDX__VI = 0x0867; +constexpr unsigned int mmMC_HUB_WDP_MCDY__VI = 0x0868; +constexpr unsigned int mmMC_HUB_WDP_MCDZ__VI = 0x0869; +constexpr unsigned int mmMC_HUB_WDP_MCIF__VI = 0x086D; +constexpr unsigned int mmMC_HUB_WDP_RLC__VI = 0x0871; +constexpr unsigned int mmMC_HUB_WDP_SAMMSP__VI = 0x0887; +constexpr unsigned int mmMC_HUB_WDP_SDMA0__VI = 0x0878; +constexpr unsigned int mmMC_HUB_WDP_SDMA1__VI = 0x086B; +constexpr unsigned int mmMC_HUB_WDP_SEM__VI = 0x0872; +constexpr unsigned int mmMC_HUB_WDP_SH0__VI = 0x086C; +constexpr unsigned int mmMC_HUB_WDP_SH1__VI = 0x0874; +constexpr unsigned int mmMC_HUB_WDP_SIP__VI = 0x086A; +constexpr unsigned int mmMC_HUB_WDP_SMU__VI = 0x0873; +constexpr unsigned int mmMC_HUB_WDP_UMC__VI = 0x0875; +constexpr unsigned int mmMC_HUB_WDP_UVD__VI = 0x0876; +constexpr unsigned int mmMC_HUB_WDP_VCE0__VI = 0x086E; +constexpr unsigned int mmMC_HUB_WDP_VCE1__VI = 0x0DFE; +constexpr unsigned int mmMC_HUB_WDP_VCEU0__VI = 0x087D; +constexpr unsigned int mmMC_HUB_WDP_VCEU1__VI = 0x0DFF; +constexpr unsigned int mmMC_HUB_WDP_VIN0__VI = 0x0850; +constexpr unsigned int mmMC_HUB_WDP_VP8__VI = 0x0888; +constexpr unsigned int mmMC_HUB_WDP_VP8U__VI = 0x088A; +constexpr unsigned int mmMC_HUB_WDP_XDMA__VI = 0x087F; +constexpr unsigned int mmMC_HUB_WDP_XDMAM__VI = 0x087E; +constexpr unsigned int mmMC_HUB_WDP_XDP__VI = 0x086F; +constexpr unsigned int mmMC_HUB_WRRET_MCDS__VI = 0x0DEF; +constexpr unsigned int mmMC_HUB_WRRET_MCDT__VI = 0x0DF0; +constexpr unsigned int mmMC_HUB_WRRET_MCDU__VI = 0x0DF1; +constexpr unsigned int mmMC_HUB_WRRET_MCDV__VI = 0x0DF2; +constexpr unsigned int mmMC_HUB_WRRET_MCDW__VI = 0x0879; +constexpr unsigned int mmMC_HUB_WRRET_MCDX__VI = 0x087A; +constexpr unsigned int mmMC_HUB_WRRET_MCDY__VI = 0x087B; +constexpr unsigned int mmMC_HUB_WRRET_MCDZ__VI = 0x087C; +constexpr unsigned int mmMC_PMG_CFG__SI__CI = 0x0A84; +constexpr unsigned int mmMC_PMG_CFG__VI = 0x0A54; +constexpr unsigned int mmMC_PMG_CMD_EMRS__SI__CI = 0x0A83; +constexpr unsigned int mmMC_PMG_CMD_EMRS__VI = 0x0A4A; +constexpr unsigned int mmMC_PMG_CMD_MRS__SI__CI = 0x0AAB; +constexpr unsigned int mmMC_PMG_CMD_MRS__VI = 0x0A4C; +constexpr unsigned int mmMC_PMG_CMD_MRS1__SI__CI = 0x0AD1; +constexpr unsigned int mmMC_PMG_CMD_MRS1__VI = 0x0A4E; +constexpr unsigned int mmMC_PMG_CMD_MRS2__SI__CI = 0x0AD7; +constexpr unsigned int mmMC_PMG_CMD_MRS2__VI = 0x0A50; +constexpr unsigned int mmMC_RPB_TCI_CNTL__VI = 0x095C; +constexpr unsigned int mmMC_RPB_TCI_CNTL2__VI = 0x095D; +constexpr unsigned int mmMC_SEQ_CAS_TIMING__SI__CI = 0x0A29; +constexpr unsigned int mmMC_SEQ_CAS_TIMING__VI = 0x0A2B; +constexpr unsigned int mmMC_SEQ_CAS_TIMING_LP__SI__CI = 0x0A9C; +constexpr unsigned int mmMC_SEQ_CAS_TIMING_LP__VI = 0x0A2C; +constexpr unsigned int mmMC_SEQ_CG__SI__CI = 0x0A9A; +constexpr unsigned int mmMC_SEQ_CG__VI = 0x0A7B; +constexpr unsigned int mmMC_SEQ_CMD__SI__CI = 0x0A31; +constexpr unsigned int mmMC_SEQ_CMD__VI = 0x0A47; +constexpr unsigned int mmMC_SEQ_CNTL__SI__CI = 0x0A25; +constexpr unsigned int mmMC_SEQ_CNTL__VI = 0x0A24; +constexpr unsigned int mmMC_SEQ_CNTL_2__SI__CI = 0x0AD4; +constexpr unsigned int mmMC_SEQ_CNTL_2__VI = 0x0A25; +constexpr unsigned int mmMC_SEQ_CNTL_3__VI = 0x0A26; +constexpr unsigned int mmMC_SEQ_DRAM__SI__CI = 0x0A26; +constexpr unsigned int mmMC_SEQ_DRAM__VI = 0x0A27; +constexpr unsigned int mmMC_SEQ_DRAM_2__SI__CI = 0x0A27; +constexpr unsigned int mmMC_SEQ_DRAM_2__VI = 0x0A28; +constexpr unsigned int mmMC_SEQ_FIFO_CTL__SI__CI = 0x0A57; +constexpr unsigned int mmMC_SEQ_FIFO_CTL__VI = 0x0A5D; +constexpr unsigned int mmMC_SEQ_IO_DEBUG_DATA__SI__CI = 0x0A92; +constexpr unsigned int mmMC_SEQ_IO_DEBUG_DATA__VI = 0x0ABD; +constexpr unsigned int mmMC_SEQ_IO_DEBUG_INDEX__SI__CI = 0x0A91; +constexpr unsigned int mmMC_SEQ_IO_DEBUG_INDEX__VI = 0x0ABC; +constexpr unsigned int mmMC_SEQ_IO_RESERVE__VI = 0x0A61; +constexpr unsigned int mmMC_SEQ_MISC0__SI__CI = 0x0A80; +constexpr unsigned int mmMC_SEQ_MISC0__VI = 0x0A71; +constexpr unsigned int mmMC_SEQ_MISC1__SI__CI = 0x0A81; +constexpr unsigned int mmMC_SEQ_MISC1__VI = 0x0A72; +constexpr unsigned int mmMC_SEQ_MISC3__SI__CI = 0x0A8B; +constexpr unsigned int mmMC_SEQ_MISC3__VI = 0x0A74; +constexpr unsigned int mmMC_SEQ_MISC4__SI__CI = 0x0A8C; +constexpr unsigned int mmMC_SEQ_MISC4__VI = 0x0A75; +constexpr unsigned int mmMC_SEQ_MISC5__SI__CI = 0x0A95; +constexpr unsigned int mmMC_SEQ_MISC5__VI = 0x0A76; +constexpr unsigned int mmMC_SEQ_MISC6__SI__CI = 0x0A96; +constexpr unsigned int mmMC_SEQ_MISC6__VI = 0x0A77; +constexpr unsigned int mmMC_SEQ_MISC7__SI__CI = 0x0A99; +constexpr unsigned int mmMC_SEQ_MISC7__VI = 0x0A78; +constexpr unsigned int mmMC_SEQ_MISC8__SI__CI = 0x0A5F; +constexpr unsigned int mmMC_SEQ_MISC8__VI = 0x0A79; +constexpr unsigned int mmMC_SEQ_MISC9__SI__CI = 0x0AE7; +constexpr unsigned int mmMC_SEQ_MISC9__VI = 0x0A7A; +constexpr unsigned int mmMC_SEQ_MISC_TIMING__SI__CI = 0x0A2A; +constexpr unsigned int mmMC_SEQ_MISC_TIMING__VI = 0x0A2D; +constexpr unsigned int mmMC_SEQ_MISC_TIMING2__SI__CI = 0x0A2B; +constexpr unsigned int mmMC_SEQ_MISC_TIMING2__VI = 0x0A2F; +constexpr unsigned int mmMC_SEQ_MISC_TIMING2_LP__SI__CI = 0x0A9E; +constexpr unsigned int mmMC_SEQ_MISC_TIMING2_LP__VI = 0x0A30; +constexpr unsigned int mmMC_SEQ_MISC_TIMING_LP__SI__CI = 0x0A9D; +constexpr unsigned int mmMC_SEQ_MISC_TIMING_LP__VI = 0x0A2E; +constexpr unsigned int mmMC_SEQ_PMG_TIMING__SI__CI = 0x0A2C; +constexpr unsigned int mmMC_SEQ_PMG_TIMING__VI = 0x0A31; +constexpr unsigned int mmMC_SEQ_PMG_TIMING_LP__SI__CI = 0x0AD3; +constexpr unsigned int mmMC_SEQ_PMG_TIMING_LP__VI = 0x0A32; +constexpr unsigned int mmMC_SEQ_RAS_TIMING__SI__CI = 0x0A28; +constexpr unsigned int mmMC_SEQ_RAS_TIMING__VI = 0x0A29; +constexpr unsigned int mmMC_SEQ_RAS_TIMING_LP__SI__CI = 0x0A9B; +constexpr unsigned int mmMC_SEQ_RAS_TIMING_LP__VI = 0x0A2A; +constexpr unsigned int mmMC_SEQ_RD_CTL_D0__SI__CI = 0x0A2D; +constexpr unsigned int mmMC_SEQ_RD_CTL_D0__VI = 0x0A33; +constexpr unsigned int mmMC_SEQ_RD_CTL_D0_LP__SI__CI = 0x0AC7; +constexpr unsigned int mmMC_SEQ_RD_CTL_D0_LP__VI = 0x0A34; +constexpr unsigned int mmMC_SEQ_RD_CTL_D1__SI__CI = 0x0A2E; +constexpr unsigned int mmMC_SEQ_RD_CTL_D1__VI = 0x0A35; +constexpr unsigned int mmMC_SEQ_RD_CTL_D1_LP__SI__CI = 0x0AC8; +constexpr unsigned int mmMC_SEQ_RD_CTL_D1_LP__VI = 0x0A36; +constexpr unsigned int mmMC_SEQ_RESERVE_0_S__SI__CI = 0x0A1E; +constexpr unsigned int mmMC_SEQ_RESERVE_0_S__VI = 0x0A07; +constexpr unsigned int mmMC_SEQ_RESERVE_1_S__SI__CI = 0x0A1F; +constexpr unsigned int mmMC_SEQ_RESERVE_1_S__VI = 0x0A08; +constexpr unsigned int mmMC_SEQ_RESERVE_M__SI__CI = 0x0A82; +constexpr unsigned int mmMC_SEQ_RESERVE_M__VI = 0x0A60; +constexpr unsigned int mmMC_SEQ_SREG_READ__VI = 0x0A7F; +constexpr unsigned int mmMC_SEQ_SREG_STATUS__VI = 0x0A80; +constexpr unsigned int mmMC_SEQ_STATUS_M__SI__CI = 0x0A7D; +constexpr unsigned int mmMC_SEQ_STATUS_M__VI = 0x0A5E; +constexpr unsigned int mmMC_SEQ_STATUS_S__SI__CI = 0x0A20; +constexpr unsigned int mmMC_SEQ_STATUS_S__VI = 0x0A05; +constexpr unsigned int mmMC_SEQ_SUP_CNTL__SI__CI = 0x0A32; +constexpr unsigned int mmMC_SEQ_SUP_CNTL__VI = 0x0A63; +constexpr unsigned int mmMC_SEQ_SUP_DEC_STAT__SI__CI = 0x0A88; +constexpr unsigned int mmMC_SEQ_SUP_DEC_STAT__VI = 0x0A6A; +constexpr unsigned int mmMC_SEQ_SUP_GP0_STAT__SI__CI = 0x0A8F; +constexpr unsigned int mmMC_SEQ_SUP_GP0_STAT__VI = 0x0A65; +constexpr unsigned int mmMC_SEQ_SUP_GP1_STAT__SI__CI = 0x0A90; +constexpr unsigned int mmMC_SEQ_SUP_GP1_STAT__VI = 0x0A66; +constexpr unsigned int mmMC_SEQ_SUP_GP2_STAT__SI__CI = 0x0A85; +constexpr unsigned int mmMC_SEQ_SUP_GP2_STAT__VI = 0x0A67; +constexpr unsigned int mmMC_SEQ_SUP_GP3_STAT__SI__CI = 0x0A86; +constexpr unsigned int mmMC_SEQ_SUP_GP3_STAT__VI = 0x0A68; +constexpr unsigned int mmMC_SEQ_SUP_IR_STAT__SI__CI = 0x0A87; +constexpr unsigned int mmMC_SEQ_SUP_IR_STAT__VI = 0x0A69; +constexpr unsigned int mmMC_SEQ_SUP_PGM__SI__CI = 0x0A33; +constexpr unsigned int mmMC_SEQ_SUP_PGM__VI = 0x0A64; +constexpr unsigned int mmMC_SEQ_SUP_PGM_STAT__SI__CI = 0x0A89; +constexpr unsigned int mmMC_SEQ_SUP_PGM_STAT__VI = 0x0A6B; +constexpr unsigned int mmMC_SEQ_SUP_R_PGM__SI__CI = 0x0A8A; +constexpr unsigned int mmMC_SEQ_SUP_R_PGM__VI = 0x0A6C; +constexpr unsigned int mmMC_SEQ_TIMER_RD__SI__CI = 0x0ACA; +constexpr unsigned int mmMC_SEQ_TIMER_RD__VI = 0x0A7D; +constexpr unsigned int mmMC_SEQ_TIMER_WR__SI__CI = 0x0AC9; +constexpr unsigned int mmMC_SEQ_TIMER_WR__VI = 0x0A7C; +constexpr unsigned int mmMC_SEQ_TRAIN_CAPTURE__SI__CI = 0x0A3E; +constexpr unsigned int mmMC_SEQ_TRAIN_CAPTURE__VI = 0x0A5B; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_CLEAR__SI__CI = 0x0A3F; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_CLEAR__VI = 0x0A5C; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_CNTL__SI__CI = 0x0A3A; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_CNTL__VI = 0x0A57; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_EDGE__SI__CI = 0x0A3C; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_EDGE__VI = 0x0A58; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_MASK__SI__CI = 0x0A3D; +constexpr unsigned int mmMC_SEQ_TRAIN_WAKEUP_MASK__VI = 0x0A59; +constexpr unsigned int mmMC_SEQ_WR_CTL_D0__SI__CI = 0x0A2F; +constexpr unsigned int mmMC_SEQ_WR_CTL_D0__VI = 0x0A3B; +constexpr unsigned int mmMC_SEQ_WR_CTL_D0_LP__SI__CI = 0x0A9F; +constexpr unsigned int mmMC_SEQ_WR_CTL_D0_LP__VI = 0x0A3C; +constexpr unsigned int mmMC_SEQ_WR_CTL_D1__SI__CI = 0x0A30; +constexpr unsigned int mmMC_SEQ_WR_CTL_D1__VI = 0x0A3D; +constexpr unsigned int mmMC_SEQ_WR_CTL_D1_LP__SI__CI = 0x0AA0; +constexpr unsigned int mmMC_SEQ_WR_CTL_D1_LP__VI = 0x0A3E; +constexpr unsigned int mmMC_SHARED_ACTIVE_FCN_ID__VI = 0x081F; +constexpr unsigned int mmMC_SHARED_CHREMAP2__VI = 0x081C; +constexpr unsigned int mmMC_SHARED_VF_ENABLE__VI = 0x081D; +constexpr unsigned int mmMC_SHARED_VIRT_RESET_REQ__VI = 0x081E; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF0__VI = 0xF980; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF1__VI = 0xF981; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF10__VI = 0xF98A; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF11__VI = 0xF98B; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF12__VI = 0xF98C; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF13__VI = 0xF98D; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF14__VI = 0xF98E; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF15__VI = 0xF98F; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF2__VI = 0xF982; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF3__VI = 0xF983; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF4__VI = 0xF984; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF5__VI = 0xF985; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF6__VI = 0xF986; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF7__VI = 0xF987; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF8__VI = 0xF988; +constexpr unsigned int mmMC_VM_FB_SIZE_OFFSET_VF9__VI = 0xF989; +constexpr unsigned int mmMC_VM_MARC_BASE_HI_0__VI = 0xF999; +constexpr unsigned int mmMC_VM_MARC_BASE_HI_1__VI = 0xF99F; +constexpr unsigned int mmMC_VM_MARC_BASE_HI_2__VI = 0xF9A5; +constexpr unsigned int mmMC_VM_MARC_BASE_HI_3__VI = 0xF9AB; +constexpr unsigned int mmMC_VM_MARC_BASE_LO_0__VI = 0xF998; +constexpr unsigned int mmMC_VM_MARC_BASE_LO_1__VI = 0xF99E; +constexpr unsigned int mmMC_VM_MARC_BASE_LO_2__VI = 0xF9A4; +constexpr unsigned int mmMC_VM_MARC_BASE_LO_3__VI = 0xF9AA; +constexpr unsigned int mmMC_VM_MARC_CNTL__VI = 0xF9B0; +constexpr unsigned int mmMC_VM_MARC_LEN_HI_0__VI = 0xF99D; +constexpr unsigned int mmMC_VM_MARC_LEN_HI_1__VI = 0xF9A3; +constexpr unsigned int mmMC_VM_MARC_LEN_HI_2__VI = 0xF9A9; +constexpr unsigned int mmMC_VM_MARC_LEN_HI_3__VI = 0xF9AF; +constexpr unsigned int mmMC_VM_MARC_LEN_LO_0__VI = 0xF99C; +constexpr unsigned int mmMC_VM_MARC_LEN_LO_1__VI = 0xF9A2; +constexpr unsigned int mmMC_VM_MARC_LEN_LO_2__VI = 0xF9A8; +constexpr unsigned int mmMC_VM_MARC_LEN_LO_3__VI = 0xF9AE; +constexpr unsigned int mmMC_VM_MARC_RELOC_HI_0__VI = 0xF99B; +constexpr unsigned int mmMC_VM_MARC_RELOC_HI_1__VI = 0xF9A1; +constexpr unsigned int mmMC_VM_MARC_RELOC_HI_2__VI = 0xF9A7; +constexpr unsigned int mmMC_VM_MARC_RELOC_HI_3__VI = 0xF9AD; +constexpr unsigned int mmMC_VM_MARC_RELOC_LO_0__VI = 0xF99A; +constexpr unsigned int mmMC_VM_MARC_RELOC_LO_1__VI = 0xF9A0; +constexpr unsigned int mmMC_VM_MARC_RELOC_LO_2__VI = 0xF9A6; +constexpr unsigned int mmMC_VM_MARC_RELOC_LO_3__VI = 0xF9AC; +constexpr unsigned int mmMC_VM_MB_L1_TLB1_DEBUG__VI = 0x0892; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL0__VI = 0xF9B1; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL1__VI = 0xF9B4; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL2__VI = 0xF9B7; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL3__VI = 0xF9BA; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL4__VI = 0xF9BD; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL5__VI = 0xF9C0; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL6__VI = 0xF9C3; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL7__VI = 0xF9C6; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_CNTL8__VI = 0xF9C9; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR0__VI = 0xF9B3; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR1__VI = 0xF9B6; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR2__VI = 0xF9B9; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR3__VI = 0xF9BC; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR4__VI = 0xF9BF; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR5__VI = 0xF9C2; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR6__VI = 0xF9C5; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR7__VI = 0xF9C8; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_END_ADDR8__VI = 0xF9CB; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_PROTECTION_FAULT_ADDR__VI = 0xF9CD; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_PROTECTION_FAULT_STATUS__VI = 0xF9CC; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR0__VI = 0xF9B2; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR1__VI = 0xF9B5; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR2__VI = 0xF9B8; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR3__VI = 0xF9BB; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR4__VI = 0xF9BE; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR5__VI = 0xF9C1; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR6__VI = 0xF9C4; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR7__VI = 0xF9C7; +constexpr unsigned int mmMC_VM_MB_L1_TLS0_START_ADDR8__VI = 0xF9CA; +constexpr unsigned int mmMC_VM_NB_LOWER_TOP_OF_DRAM2__VI = 0xF995; +constexpr unsigned int mmMC_VM_NB_MMIOBASE__VI = 0xF990; +constexpr unsigned int mmMC_VM_NB_MMIOLIMIT__VI = 0xF991; +constexpr unsigned int mmMC_VM_NB_PCI_ARB__VI = 0xF993; +constexpr unsigned int mmMC_VM_NB_PCI_CTRL__VI = 0xF992; +constexpr unsigned int mmMC_VM_NB_TOP_OF_DRAM3__VI = 0xF997; +constexpr unsigned int mmMC_VM_NB_TOP_OF_DRAM_SLOT1__VI = 0xF994; +constexpr unsigned int mmMC_VM_NB_UPPER_TOP_OF_DRAM2__VI = 0xF996; +constexpr unsigned int mmMC_XBAR_FIFO_MON_CNTL0__VI = 0x0C8F; +constexpr unsigned int mmMC_XBAR_FIFO_MON_CNTL1__VI = 0x0C90; +constexpr unsigned int mmMC_XBAR_FIFO_MON_CNTL2__VI = 0x0C91; +constexpr unsigned int mmMC_XBAR_FIFO_MON_MAX_THSH__VI = 0x0C96; +constexpr unsigned int mmMC_XBAR_FIFO_MON_RSLT0__VI = 0x0C92; +constexpr unsigned int mmMC_XBAR_FIFO_MON_RSLT1__VI = 0x0C93; +constexpr unsigned int mmMC_XBAR_FIFO_MON_RSLT2__VI = 0x0C94; +constexpr unsigned int mmMC_XBAR_FIFO_MON_RSLT3__VI = 0x0C95; +constexpr unsigned int mmMICROSECOND_TIME_BASE_DIV__VI = 0x013B; +constexpr unsigned int mmMILLISECOND_TIME_BASE_DIV__VI = 0x0130; +constexpr unsigned int mmMP_FPS_CNT__VI = 0x0235; +constexpr unsigned int mmMVP_AFR_FLIP_FIFO_CNTL__VI = 0x1AE1; +constexpr unsigned int mmMVP_AFR_FLIP_MODE__VI = 0x1AE0; +constexpr unsigned int mmMVP_BLACK_KEYER__VI = 0x02B2; +constexpr unsigned int mmMVP_CONTROL1__VI = 0x02AC; +constexpr unsigned int mmMVP_CONTROL2__VI = 0x02AD; +constexpr unsigned int mmMVP_CONTROL3__VI = 0x02B6; +constexpr unsigned int mmMVP_CRC_CNTL__VI = 0x02B3; +constexpr unsigned int mmMVP_CRC_RESULT_BLUE_GREEN__VI = 0x02B4; +constexpr unsigned int mmMVP_CRC_RESULT_RED__VI = 0x02B5; +constexpr unsigned int mmMVP_DEBUG__VI = 0x02BB; +constexpr unsigned int mmMVP_FIFO_CONTROL__VI = 0x02AE; +constexpr unsigned int mmMVP_FIFO_STATUS__VI = 0x02AF; +constexpr unsigned int mmMVP_FLIP_LINE_NUM_INSERT__VI = 0x1AE2; +constexpr unsigned int mmMVP_INBAND_CNTL_CAP__VI = 0x02B1; +constexpr unsigned int mmMVP_RECEIVE_CNT_CNTL1__VI = 0x02B7; +constexpr unsigned int mmMVP_RECEIVE_CNT_CNTL2__VI = 0x02B8; +constexpr unsigned int mmMVP_SLAVE_STATUS__VI = 0x02B0; +constexpr unsigned int mmMVP_TEST_DEBUG_DATA__VI = 0x02BA; +constexpr unsigned int mmMVP_TEST_DEBUG_INDEX__VI = 0x02B9; +constexpr unsigned int mmOUTPUT_CSC_C11_C12__VI = 0x1A3D; +constexpr unsigned int mmOUTPUT_CSC_C11_C12_A__VI = 0x46B7; +constexpr unsigned int mmOUTPUT_CSC_C11_C12_B__VI = 0x46BD; +constexpr unsigned int mmOUTPUT_CSC_C13_C14__VI = 0x1A3E; +constexpr unsigned int mmOUTPUT_CSC_C13_C14_A__VI = 0x46B8; +constexpr unsigned int mmOUTPUT_CSC_C13_C14_B__VI = 0x46BE; +constexpr unsigned int mmOUTPUT_CSC_C21_C22__VI = 0x1A3F; +constexpr unsigned int mmOUTPUT_CSC_C21_C22_A__VI = 0x46B9; +constexpr unsigned int mmOUTPUT_CSC_C21_C22_B__VI = 0x46BF; +constexpr unsigned int mmOUTPUT_CSC_C23_C24__VI = 0x1A40; +constexpr unsigned int mmOUTPUT_CSC_C23_C24_A__VI = 0x46BA; +constexpr unsigned int mmOUTPUT_CSC_C23_C24_B__VI = 0x46C0; +constexpr unsigned int mmOUTPUT_CSC_C31_C32__VI = 0x1A41; +constexpr unsigned int mmOUTPUT_CSC_C31_C32_A__VI = 0x46BB; +constexpr unsigned int mmOUTPUT_CSC_C31_C32_B__VI = 0x46C1; +constexpr unsigned int mmOUTPUT_CSC_C33_C34__VI = 0x1A42; +constexpr unsigned int mmOUTPUT_CSC_C33_C34_A__VI = 0x46BC; +constexpr unsigned int mmOUTPUT_CSC_C33_C34_B__VI = 0x46C2; +constexpr unsigned int mmOUTPUT_CSC_CONTROL__VI = 0x1A3C; +constexpr unsigned int mmOUT_CLAMP_CONTROL_B_CB__VI = 0x1A9D; +constexpr unsigned int mmOUT_CLAMP_CONTROL_G_Y__VI = 0x1A9C; +constexpr unsigned int mmOUT_CLAMP_CONTROL_R_CR__VI = 0x1A52; +constexpr unsigned int mmOUT_ROUND_CONTROL__VI = 0x1A51; +constexpr unsigned int mmOVL_SECONDARY_SURFACE_ADDRESS__VI = 0x1A92; +constexpr unsigned int mmOVL_SECONDARY_SURFACE_ADDRESS_HIGH__VI = 0x1A94; +constexpr unsigned int mmOVL_STEREOSYNC_FLIP__VI = 0x1A93; +constexpr unsigned int mmPCIE_EFUSE__VI = 0x0FC0; +constexpr unsigned int mmPCIE_EFUSE2__VI = 0x0FC1; +constexpr unsigned int mmPCIE_EFUSE3__VI = 0x0FC2; +constexpr unsigned int mmPCIE_EFUSE4__VI = 0x0FC3; +constexpr unsigned int mmPCIE_EFUSE5__VI = 0x0FC4; +constexpr unsigned int mmPCIE_EFUSE6__VI = 0x0FC5; +constexpr unsigned int mmPCIE_EFUSE7__VI = 0x0FC6; +constexpr unsigned int mmPERFCOUNTER_CNTL__VI = 0x0170; +constexpr unsigned int mmPERFCOUNTER_STATE__VI = 0x0171; +constexpr unsigned int mmPERFMON_CNTL__VI = 0x0173; +constexpr unsigned int mmPERFMON_CNTL2__VI = 0x017A; +constexpr unsigned int mmPERFMON_CVALUE_INT_MISC__VI = 0x0172; +constexpr unsigned int mmPERFMON_CVALUE_LOW__VI = 0x0174; +constexpr unsigned int mmPERFMON_HI__VI = 0x0175; +constexpr unsigned int mmPERFMON_LOW__VI = 0x0176; +constexpr unsigned int mmPERFMON_TEST_DEBUG_DATA__VI = 0x0178; +constexpr unsigned int mmPERFMON_TEST_DEBUG_INDEX__VI = 0x0177; +constexpr unsigned int mmPHY_AUX_CNTL__VI = 0x4897; +constexpr unsigned int mmPIPE0_ARBITRATION_CONTROL3__VI = 0x02FA; +constexpr unsigned int mmPIPE0_DMIF_BUFFER_CONTROL__VI = 0x0321; +constexpr unsigned int mmPIPE0_MAX_REQUESTS__VI = 0x0305; +constexpr unsigned int mmPIPE0_PG_CONFIG__VI = 0x02C0; +constexpr unsigned int mmPIPE0_PG_ENABLE__VI = 0x02C1; +constexpr unsigned int mmPIPE0_PG_STATUS__VI = 0x02C2; +constexpr unsigned int mmPIPE1_ARBITRATION_CONTROL3__VI = 0x02FB; +constexpr unsigned int mmPIPE1_DMIF_BUFFER_CONTROL__VI = 0x0322; +constexpr unsigned int mmPIPE1_MAX_REQUESTS__VI = 0x0306; +constexpr unsigned int mmPIPE1_PG_CONFIG__VI = 0x02C3; +constexpr unsigned int mmPIPE1_PG_ENABLE__VI = 0x02C4; +constexpr unsigned int mmPIPE1_PG_STATUS__VI = 0x02C5; +constexpr unsigned int mmPIPE2_ARBITRATION_CONTROL3__VI = 0x02FC; +constexpr unsigned int mmPIPE2_DMIF_BUFFER_CONTROL__VI = 0x0323; +constexpr unsigned int mmPIPE2_MAX_REQUESTS__VI = 0x0307; +constexpr unsigned int mmPIPE2_PG_CONFIG__VI = 0x02C6; +constexpr unsigned int mmPIPE2_PG_ENABLE__VI = 0x02C7; +constexpr unsigned int mmPIPE2_PG_STATUS__VI = 0x02C8; +constexpr unsigned int mmPIPE3_ARBITRATION_CONTROL3__VI = 0x02FD; +constexpr unsigned int mmPIPE3_DMIF_BUFFER_CONTROL__VI = 0x0324; +constexpr unsigned int mmPIPE3_MAX_REQUESTS__VI = 0x0308; +constexpr unsigned int mmPIPE3_PG_CONFIG__VI = 0x02C9; +constexpr unsigned int mmPIPE3_PG_ENABLE__VI = 0x02CA; +constexpr unsigned int mmPIPE3_PG_STATUS__VI = 0x02CB; +constexpr unsigned int mmPIPE4_ARBITRATION_CONTROL3__VI = 0x02FE; +constexpr unsigned int mmPIPE4_DMIF_BUFFER_CONTROL__VI = 0x0325; +constexpr unsigned int mmPIPE4_MAX_REQUESTS__VI = 0x0309; +constexpr unsigned int mmPIPE4_PG_CONFIG__VI = 0x02CC; +constexpr unsigned int mmPIPE4_PG_ENABLE__VI = 0x02CD; +constexpr unsigned int mmPIPE4_PG_STATUS__VI = 0x02CE; +constexpr unsigned int mmPIPE5_ARBITRATION_CONTROL3__VI = 0x02FF; +constexpr unsigned int mmPIPE5_DMIF_BUFFER_CONTROL__VI = 0x0326; +constexpr unsigned int mmPIPE5_MAX_REQUESTS__VI = 0x030A; +constexpr unsigned int mmPIPE5_PG_CONFIG__VI = 0x02CF; +constexpr unsigned int mmPIPE5_PG_ENABLE__VI = 0x02D0; +constexpr unsigned int mmPIPE5_PG_STATUS__VI = 0x02D1; +constexpr unsigned int mmPIPE6_ARBITRATION_CONTROL3__VI = 0x032A; +constexpr unsigned int mmPIPE6_MAX_REQUESTS__VI = 0x032C; +constexpr unsigned int mmPIPE7_ARBITRATION_CONTROL3__VI = 0x032B; +constexpr unsigned int mmPIPE7_MAX_REQUESTS__VI = 0x032D; +constexpr unsigned int mmPIXCLK0_RESYNC_CNTL__VI = 0x013A; +constexpr unsigned int mmPIXCLK1_RESYNC_CNTL__VI = 0x0138; +constexpr unsigned int mmPIXCLK2_RESYNC_CNTL__VI = 0x0139; +constexpr unsigned int mmPLL_ANALOG__VI = 0x1708; +constexpr unsigned int mmPLL_ANALOG_CNTL__VI = 0x1711; +constexpr unsigned int mmPLL_CNTL__VI = 0x1707; +constexpr unsigned int mmPLL_DEBUG_CNTL__VI = 0x170B; +constexpr unsigned int mmPLL_DS_CNTL__VI = 0x1705; +constexpr unsigned int mmPLL_FB_DIV__VI = 0x1701; +constexpr unsigned int mmPLL_IDCLK_CNTL__VI = 0x1706; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED0__VI = 0x1700; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED1__VI = 0x1701; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED10__VI = 0x170A; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED11__VI = 0x170B; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED12__VI = 0x170C; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED13__VI = 0x170D; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED14__VI = 0x170E; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED15__VI = 0x170F; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED16__VI = 0x1710; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED17__VI = 0x1711; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED18__VI = 0x1712; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED19__VI = 0x1713; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED2__VI = 0x1702; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED20__VI = 0x1714; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED21__VI = 0x1715; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED22__VI = 0x1716; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED23__VI = 0x1717; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED24__VI = 0x1718; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED25__VI = 0x1719; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED26__VI = 0x171A; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED27__VI = 0x171B; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED28__VI = 0x171C; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED29__VI = 0x171D; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED3__VI = 0x1703; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED30__VI = 0x171E; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED31__VI = 0x171F; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED32__VI = 0x1720; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED33__VI = 0x1721; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED34__VI = 0x1722; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED35__VI = 0x1723; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED36__VI = 0x1724; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED37__VI = 0x1725; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED38__VI = 0x1726; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED39__VI = 0x1727; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED4__VI = 0x1704; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED40__VI = 0x1728; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED41__VI = 0x1729; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED5__VI = 0x1705; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED6__VI = 0x1706; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED7__VI = 0x1707; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED8__VI = 0x1708; +constexpr unsigned int mmPLL_MACRO_CNTL_RESERVED9__VI = 0x1709; +constexpr unsigned int mmPLL_POST_DIV__VI = 0x1702; +constexpr unsigned int mmPLL_REF_DIV__VI = 0x1700; +constexpr unsigned int mmPLL_SS_AMOUNT_DSFRAC__VI = 0x1703; +constexpr unsigned int mmPLL_SS_CNTL__VI = 0x1704; +constexpr unsigned int mmPLL_UNLOCK_DETECT_CNTL__VI = 0x170A; +constexpr unsigned int mmPLL_UPDATE_CNTL__VI = 0x170D; +constexpr unsigned int mmPLL_UPDATE_LOCK__VI = 0x170C; +constexpr unsigned int mmPLL_VREG_CNTL__VI = 0x1709; +constexpr unsigned int mmPLL_XOR_LOCK__VI = 0x1710; +constexpr unsigned int mmPPLL_DEBUG_MUX_CNTL__VI = 0x1721; +constexpr unsigned int mmPPLL_DIV_UPDATE_DEBUG__VI = 0x171F; +constexpr unsigned int mmPPLL_SPARE0__VI = 0x1722; +constexpr unsigned int mmPPLL_SPARE1__VI = 0x1723; +constexpr unsigned int mmPPLL_STATUS_DEBUG__VI = 0x1720; +constexpr unsigned int mmPRESCALE_CONTROL__VI = 0x46B2; +constexpr unsigned int mmPRESCALE_GRPH_CONTROL__VI = 0x1A2D; +constexpr unsigned int mmPRESCALE_OVL_CONTROL__VI = 0x1A31; +constexpr unsigned int mmPRESCALE_VALUES_B__VI = 0x46B5; +constexpr unsigned int mmPRESCALE_VALUES_G__VI = 0x46B4; +constexpr unsigned int mmPRESCALE_VALUES_GRPH_B__VI = 0x1A30; +constexpr unsigned int mmPRESCALE_VALUES_GRPH_G__VI = 0x1A2F; +constexpr unsigned int mmPRESCALE_VALUES_GRPH_R__VI = 0x1A2E; +constexpr unsigned int mmPRESCALE_VALUES_OVL_CB__VI = 0x1A32; +constexpr unsigned int mmPRESCALE_VALUES_OVL_CR__VI = 0x1A34; +constexpr unsigned int mmPRESCALE_VALUES_OVL_Y__VI = 0x1A33; +constexpr unsigned int mmPRESCALE_VALUES_R__VI = 0x46B3; +constexpr unsigned int mmRAS_TA_SIGNATURE1__VI = 0x33A0; +constexpr unsigned int mmRBBMIF_STATUS__VI = 0x0315; +constexpr unsigned int mmRBBMIF_STATUS_FLAG__VI = 0x0327; +constexpr unsigned int mmRBBMIF_TIMEOUT__VI = 0x0314; +constexpr unsigned int mmRBBMIF_TIMEOUT_DIS__VI = 0x0316; +constexpr unsigned int mmREFCLK_CGTT_BLK_CTRL_REG__VI = 0x010B; +constexpr unsigned int mmREFCLK_CNTL__VI = 0x0109; +constexpr unsigned int mmREGAMMA_CNTLA_END_CNTL1__VI = 0x1AA6; +constexpr unsigned int mmREGAMMA_CNTLA_END_CNTL2__VI = 0x1AA7; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_0_1__VI = 0x1AA8; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_10_11__VI = 0x1AAD; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_12_13__VI = 0x1AAE; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_14_15__VI = 0x1AAF; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_2_3__VI = 0x1AA9; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_4_5__VI = 0x1AAA; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_6_7__VI = 0x1AAB; +constexpr unsigned int mmREGAMMA_CNTLA_REGION_8_9__VI = 0x1AAC; +constexpr unsigned int mmREGAMMA_CNTLA_SLOPE_CNTL__VI = 0x1AA5; +constexpr unsigned int mmREGAMMA_CNTLA_START_CNTL__VI = 0x1AA4; +constexpr unsigned int mmREGAMMA_CNTLB_END_CNTL1__VI = 0x1AB2; +constexpr unsigned int mmREGAMMA_CNTLB_END_CNTL2__VI = 0x1AB3; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_0_1__VI = 0x1AB4; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_10_11__VI = 0x1AB9; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_12_13__VI = 0x1ABA; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_14_15__VI = 0x1ABB; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_2_3__VI = 0x1AB5; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_4_5__VI = 0x1AB6; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_6_7__VI = 0x1AB7; +constexpr unsigned int mmREGAMMA_CNTLB_REGION_8_9__VI = 0x1AB8; +constexpr unsigned int mmREGAMMA_CNTLB_SLOPE_CNTL__VI = 0x1AB1; +constexpr unsigned int mmREGAMMA_CNTLB_START_CNTL__VI = 0x1AB0; +constexpr unsigned int mmREGAMMA_CONTROL__VI = 0x1AA0; +constexpr unsigned int mmREGAMMA_LUT_DATA__VI = 0x1AA2; +constexpr unsigned int mmREGAMMA_LUT_INDEX__VI = 0x1AA1; +constexpr unsigned int mmREGAMMA_LUT_WRITE_EN_MASK__VI = 0x1AA3; +constexpr unsigned int mmREMAP_HDP_MEM_FLUSH_CNTL__VI = 0x1426; +constexpr unsigned int mmREMAP_HDP_REG_FLUSH_CNTL__VI = 0x1427; +constexpr unsigned int mmRLC_AUTO_PG_CTRL__VI = 0xEC55; +constexpr unsigned int mmRLC_CAPTURE_GPU_CLOCK_COUNT__VI = 0xEC26; +constexpr unsigned int mmRLC_CGCG_CGLS_CTRL__VI = 0xEC49; +constexpr unsigned int mmRLC_CGCG_RAMP_CTRL__VI = 0xEC4A; +constexpr unsigned int mmRLC_CGTT_MGCG_OVERRIDE__VI = 0xEC48; +constexpr unsigned int mmRLC_CNTL__SI__CI = 0x30C0; +constexpr unsigned int mmRLC_CNTL__VI = 0xEC00; +constexpr unsigned int mmRLC_CP_RESPONSE0__VI = 0xECA5; +constexpr unsigned int mmRLC_CP_RESPONSE1__VI = 0xECA6; +constexpr unsigned int mmRLC_CP_RESPONSE2__VI = 0xECA7; +constexpr unsigned int mmRLC_CP_RESPONSE3__VI = 0xECA8; +constexpr unsigned int mmRLC_CP_SCHEDULERS__VI = 0xECAA; +constexpr unsigned int mmRLC_CSIB_ADDR_HI__VI = 0xECA3; +constexpr unsigned int mmRLC_CSIB_ADDR_LO__VI = 0xECA2; +constexpr unsigned int mmRLC_CSIB_LENGTH__VI = 0xECA4; +constexpr unsigned int mmRLC_CU_STATUS__VI = 0xEC4E; +constexpr unsigned int mmRLC_DEBUG__VI = 0xEC02; +constexpr unsigned int mmRLC_DEBUG_SELECT__VI = 0xEC01; +constexpr unsigned int mmRLC_DRIVER_CPDMA_STATUS__VI = 0xEC1E; +constexpr unsigned int mmRLC_DYN_PG_REQUEST__VI = 0xEC4C; +constexpr unsigned int mmRLC_DYN_PG_STATUS__VI = 0xEC4B; +constexpr unsigned int mmRLC_GPM_CU_PD_TIMEOUT__VI = 0xEC6B; +constexpr unsigned int mmRLC_GPM_DEBUG__VI = 0xEC21; +constexpr unsigned int mmRLC_GPM_DEBUG_SELECT__VI = 0xEC20; +constexpr unsigned int mmRLC_GPM_GENERAL_0__VI = 0xEC63; +constexpr unsigned int mmRLC_GPM_GENERAL_1__VI = 0xEC64; +constexpr unsigned int mmRLC_GPM_GENERAL_2__VI = 0xEC65; +constexpr unsigned int mmRLC_GPM_GENERAL_3__VI = 0xEC66; +constexpr unsigned int mmRLC_GPM_GENERAL_4__VI = 0xEC67; +constexpr unsigned int mmRLC_GPM_GENERAL_5__VI = 0xEC68; +constexpr unsigned int mmRLC_GPM_GENERAL_6__VI = 0xEC69; +constexpr unsigned int mmRLC_GPM_GENERAL_7__VI = 0xEC6A; +constexpr unsigned int mmRLC_GPM_INT_DISABLE_TH0__VI = 0xEC7C; +constexpr unsigned int mmRLC_GPM_INT_DISABLE_TH1__VI = 0xEC7D; +constexpr unsigned int mmRLC_GPM_INT_FORCE_TH0__VI = 0xEC7E; +constexpr unsigned int mmRLC_GPM_INT_FORCE_TH1__VI = 0xEC7F; +constexpr unsigned int mmRLC_GPM_LOG_ADDR__VI = 0xEC76; +constexpr unsigned int mmRLC_GPM_LOG_CONT__VI = 0xEC7B; +constexpr unsigned int mmRLC_GPM_LOG_SIZE__VI = 0xEC77; +constexpr unsigned int mmRLC_GPM_PERF_COUNT_0__VI = 0xEC6F; +constexpr unsigned int mmRLC_GPM_PERF_COUNT_1__VI = 0xEC70; +constexpr unsigned int mmRLC_GPM_SCRATCH_ADDR__VI = 0xEC6C; +constexpr unsigned int mmRLC_GPM_SCRATCH_DATA__VI = 0xEC6D; +constexpr unsigned int mmRLC_GPM_STAT__VI = 0xEC40; +constexpr unsigned int mmRLC_GPM_THREAD_ENABLE__VI = 0xEC45; +constexpr unsigned int mmRLC_GPM_THREAD_PRIORITY__VI = 0xEC44; +constexpr unsigned int mmRLC_GPM_THREAD_RESET__VI = 0xEC28; +constexpr unsigned int mmRLC_GPM_UCODE_ADDR__VI = 0xF83C; +constexpr unsigned int mmRLC_GPM_UCODE_DATA__VI = 0xF83D; +constexpr unsigned int mmRLC_GPM_VMID_THREAD0__VI = 0xEC46; +constexpr unsigned int mmRLC_GPM_VMID_THREAD1__VI = 0xEC47; +constexpr unsigned int mmRLC_GPM_VMID_THREAD2__VI = 0xFB41; +constexpr unsigned int mmRLC_GPR_REG1__VI = 0xEC79; +constexpr unsigned int mmRLC_GPR_REG2__VI = 0xEC7A; +constexpr unsigned int mmRLC_GPU_CLOCK_32__VI = 0xEC42; +constexpr unsigned int mmRLC_GPU_CLOCK_32_RES_SEL__VI = 0xEC41; +constexpr unsigned int mmRLC_GPU_CLOCK_COUNT_LSB__VI = 0xEC24; +constexpr unsigned int mmRLC_GPU_CLOCK_COUNT_MSB__VI = 0xEC25; +constexpr unsigned int mmRLC_GPU_IOV_ACTIVE_FCN_ID__VI = 0xFB40; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG1__VI = 0xFB01; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG10__VI = 0xFB22; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG11__VI = 0xFB23; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG12__VI = 0xFB24; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG13__VI = 0xFB25; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG14__VI = 0xFB26; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG15__VI = 0xFB27; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG2__VI = 0xFB02; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG6__VI = 0xFB06; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG8__VI = 0xFB08; +constexpr unsigned int mmRLC_GPU_IOV_CFG_REG9__VI = 0xFB21; +constexpr unsigned int mmRLC_GPU_IOV_F32_CNTL__VI = 0xFB46; +constexpr unsigned int mmRLC_GPU_IOV_F32_RESET__VI = 0xFB47; +constexpr unsigned int mmRLC_GPU_IOV_INT_DISABLE__VI = 0xFB4E; +constexpr unsigned int mmRLC_GPU_IOV_INT_FORCE__VI = 0xFB4F; +constexpr unsigned int mmRLC_GPU_IOV_RLC_RESPONSE__VI = 0xFB4D; +constexpr unsigned int mmRLC_GPU_IOV_SCH_0__VI = 0xFB52; +constexpr unsigned int mmRLC_GPU_IOV_SCH_1__VI = 0xFB53; +constexpr unsigned int mmRLC_GPU_IOV_SCH_2__VI = 0xFB54; +constexpr unsigned int mmRLC_GPU_IOV_SCH_3__VI = 0xFB55; +constexpr unsigned int mmRLC_GPU_IOV_SCH_INT__VI = 0xFB56; +constexpr unsigned int mmRLC_GPU_IOV_SCRATCH_ADDR__VI = 0xFB44; +constexpr unsigned int mmRLC_GPU_IOV_SCRATCH_DATA__VI = 0xFB45; +constexpr unsigned int mmRLC_GPU_IOV_SDMA0_BUSY_STATUS__VI = 0xFB50; +constexpr unsigned int mmRLC_GPU_IOV_SDMA0_STATUS__VI = 0xFB48; +constexpr unsigned int mmRLC_GPU_IOV_SDMA1_BUSY_STATUS__VI = 0xFB51; +constexpr unsigned int mmRLC_GPU_IOV_SDMA1_STATUS__VI = 0xFB49; +constexpr unsigned int mmRLC_GPU_IOV_SMU_RESPONSE__VI = 0xFB4A; +constexpr unsigned int mmRLC_GPU_IOV_UCODE_ADDR__VI = 0xFB42; +constexpr unsigned int mmRLC_GPU_IOV_UCODE_DATA__VI = 0xFB43; +constexpr unsigned int mmRLC_GPU_IOV_VF_ENABLE__VI = 0xFB00; +constexpr unsigned int mmRLC_GPU_IOV_VIRT_RESET_REQ__VI = 0xFB4C; +constexpr unsigned int mmRLC_HYP_GPM_UCODE_ADDR__VI = 0xF83C; +constexpr unsigned int mmRLC_HYP_GPM_UCODE_DATA__VI = 0xF83D; +constexpr unsigned int mmRLC_JUMP_TABLE_RESTORE__VI = 0xEC1E; +constexpr unsigned int mmRLC_LB_ALWAYS_ACTIVE_CU_MASK__VI = 0xEC50; +constexpr unsigned int mmRLC_LB_CNTL__VI = 0xEC19; +constexpr unsigned int mmRLC_LB_CNTR_INIT__VI = 0xEC1B; +constexpr unsigned int mmRLC_LB_CNTR_MAX__VI = 0xEC12; +constexpr unsigned int mmRLC_LB_INIT_CU_MASK__VI = 0xEC4F; +constexpr unsigned int mmRLC_LB_PARAMS__VI = 0xEC51; +constexpr unsigned int mmRLC_LOAD_BALANCE_CNTR__VI = 0xEC1C; +constexpr unsigned int mmRLC_MAX_PG_CU__VI = 0xEC54; +constexpr unsigned int mmRLC_MC_CNTL__VI = 0xEC03; +constexpr unsigned int mmRLC_MEM_SLP_CNTL__VI = 0xEC06; +constexpr unsigned int mmRLC_MGCG_CTRL__VI = 0xEC1A; +constexpr unsigned int mmRLC_PERFMON_CLK_CNTL__VI = 0xDCBF; +constexpr unsigned int mmRLC_PG_ALWAYS_ON_CU_MASK__VI = 0xEC53; +constexpr unsigned int mmRLC_PG_CNTL__VI = 0xEC43; +constexpr unsigned int mmRLC_PG_DELAY__VI = 0xEC4D; +constexpr unsigned int mmRLC_PG_DELAY_2__VI = 0xEC1F; +constexpr unsigned int mmRLC_PG_DELAY_3__VI = 0xEC78; +constexpr unsigned int mmRLC_RLCV_COMMAND__VI = 0xEC0A; +constexpr unsigned int mmRLC_RLCV_SAFE_MODE__VI = 0xEC08; +constexpr unsigned int mmRLC_ROM_CNTL__VI = 0xF836; +constexpr unsigned int mmRLC_SAFE_MODE__VI = 0xEC05; +constexpr unsigned int mmRLC_SAVE_AND_RESTORE_BASE__VI = 0xEC1D; +constexpr unsigned int mmRLC_SERDES_CU_MASTER_BUSY__VI = 0xEC61; +constexpr unsigned int mmRLC_SERDES_NONCU_MASTER_BUSY__VI = 0xEC62; +constexpr unsigned int mmRLC_SERDES_RD_DATA_0__VI = 0xEC5A; +constexpr unsigned int mmRLC_SERDES_RD_DATA_1__VI = 0xEC5B; +constexpr unsigned int mmRLC_SERDES_RD_DATA_2__VI = 0xEC5C; +constexpr unsigned int mmRLC_SERDES_RD_MASTER_INDEX__VI = 0xEC59; +constexpr unsigned int mmRLC_SERDES_WR_CTRL__VI = 0xEC5F; +constexpr unsigned int mmRLC_SERDES_WR_CU_MASTER_MASK__VI = 0xEC5D; +constexpr unsigned int mmRLC_SERDES_WR_DATA__VI = 0xEC60; +constexpr unsigned int mmRLC_SERDES_WR_NONCU_MASTER_MASK__VI = 0xEC5E; +constexpr unsigned int mmRLC_SMU_COMMAND__VI = 0xECA9; +constexpr unsigned int mmRLC_SMU_GRBM_REG_SAVE_CTRL__VI = 0xEC56; +constexpr unsigned int mmRLC_SMU_MESSAGE__VI = 0xEC76; +constexpr unsigned int mmRLC_SMU_PG_CTRL__VI = 0xEC57; +constexpr unsigned int mmRLC_SMU_PG_WAKE_UP_CTRL__VI = 0xEC58; +constexpr unsigned int mmRLC_SMU_SAFE_MODE__VI = 0xEC09; +constexpr unsigned int mmRLC_SOFT_RESET_GPU__VI = 0xEC05; +constexpr unsigned int mmRLC_SPM_CBR0_PERFMON_SAMPLE_DELAY__VI = 0xDCA1; +constexpr unsigned int mmRLC_SPM_CBR1_PERFMON_SAMPLE_DELAY__VI = 0xDCA2; +constexpr unsigned int mmRLC_SPM_DBR0_PERFMON_SAMPLE_DELAY__VI = 0xDC9F; +constexpr unsigned int mmRLC_SPM_DBR1_PERFMON_SAMPLE_DELAY__VI = 0xDCA0; +constexpr unsigned int mmRLC_SPM_DEBUG__VI = 0xEC75; +constexpr unsigned int mmRLC_SPM_DEBUG_SELECT__VI = 0xEC74; +constexpr unsigned int mmRLC_SPM_INT_CNTL__VI = 0xEC72; +constexpr unsigned int mmRLC_SPM_INT_STATUS__VI = 0xEC73; +constexpr unsigned int mmRLC_SPM_VMID__VI = 0xEC71; +constexpr unsigned int mmRLC_SRM_ARAM_ADDR__VI = 0xEC83; +constexpr unsigned int mmRLC_SRM_ARAM_DATA__VI = 0xEC84; +constexpr unsigned int mmRLC_SRM_CNTL__VI = 0xEC80; +constexpr unsigned int mmRLC_SRM_DEBUG__VI = 0xEC82; +constexpr unsigned int mmRLC_SRM_DEBUG_SELECT__VI = 0xEC81; +constexpr unsigned int mmRLC_SRM_DRAM_ADDR__VI = 0xEC85; +constexpr unsigned int mmRLC_SRM_DRAM_DATA__VI = 0xEC86; +constexpr unsigned int mmRLC_SRM_GPM_ABORT__VI = 0xEC9C; +constexpr unsigned int mmRLC_SRM_GPM_COMMAND__VI = 0xEC87; +constexpr unsigned int mmRLC_SRM_GPM_COMMAND_STATUS__VI = 0xEC88; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_0__VI = 0xEC8B; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_1__VI = 0xEC8C; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_2__VI = 0xEC8D; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_3__VI = 0xEC8E; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_4__VI = 0xEC8F; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_5__VI = 0xEC90; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_6__VI = 0xEC91; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_ADDR_7__VI = 0xEC92; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_0__VI = 0xEC93; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_1__VI = 0xEC94; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_2__VI = 0xEC95; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_3__VI = 0xEC96; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_4__VI = 0xEC97; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_5__VI = 0xEC98; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_6__VI = 0xEC99; +constexpr unsigned int mmRLC_SRM_INDEX_CNTL_DATA_7__VI = 0xEC9A; +constexpr unsigned int mmRLC_SRM_RLCV_COMMAND__VI = 0xEC89; +constexpr unsigned int mmRLC_SRM_RLCV_COMMAND_STATUS__VI = 0xEC8A; +constexpr unsigned int mmRLC_SRM_STAT__VI = 0xEC9B; +constexpr unsigned int mmRLC_STAT__VI = 0xEC04; +constexpr unsigned int mmRLC_STATIC_PG_STATUS__VI = 0xEC6E; +constexpr unsigned int mmRLC_THREAD1_DELAY__VI = 0xEC52; +constexpr unsigned int mmRLC_UCODE_CNTL__VI = 0xEC27; +constexpr unsigned int mmSAM_IH_EXT_ERR_INTR__VI = 0x8810; +constexpr unsigned int mmSAM_IH_EXT_ERR_INTR_STATUS__VI = 0x8812; +constexpr unsigned int mmSCL0_SCL_DEBUG2__VI = 0x1B69; +constexpr unsigned int mmSCL0_SCL_HORZ_FILTER_CONTROL__VI = 0x1B48; +constexpr unsigned int mmSCL0_SCL_HORZ_FILTER_INIT__VI = 0x1B4A; +constexpr unsigned int mmSCL0_SCL_HORZ_FILTER_SCALE_RATIO__VI = 0x1B49; +constexpr unsigned int mmSCL0_SCL_MODE__VI = 0x1B42; +constexpr unsigned int mmSCL0_SCL_ROUND_OFFSET__VI = 0x1B4F; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_CONTROL__VI = 0x1B4B; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_INIT__VI = 0x1B4D; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_INIT_BOT__VI = 0x1B4E; +constexpr unsigned int mmSCL0_SCL_VERT_FILTER_SCALE_RATIO__VI = 0x1B4C; +constexpr unsigned int mmSCL0_VIEWPORT_START_SECONDARY__VI = 0x1B5B; +constexpr unsigned int mmSCL1_EXT_OVERSCAN_LEFT_RIGHT__VI = 0x1D5E; +constexpr unsigned int mmSCL1_EXT_OVERSCAN_TOP_BOTTOM__VI = 0x1D5F; +constexpr unsigned int mmSCL1_SCL_ALU_CONTROL__VI = 0x1D54; +constexpr unsigned int mmSCL1_SCL_AUTOMATIC_MODE_CONTROL__VI = 0x1D47; +constexpr unsigned int mmSCL1_SCL_BYPASS_CONTROL__VI = 0x1D45; +constexpr unsigned int mmSCL1_SCL_COEF_RAM_CONFLICT_STATUS__VI = 0x1D55; +constexpr unsigned int mmSCL1_SCL_COEF_RAM_SELECT__VI = 0x1D40; +constexpr unsigned int mmSCL1_SCL_COEF_RAM_TAP_DATA__VI = 0x1D41; +constexpr unsigned int mmSCL1_SCL_CONTROL__VI = 0x1D44; +constexpr unsigned int mmSCL1_SCL_DEBUG__VI = 0x1D6A; +constexpr unsigned int mmSCL1_SCL_DEBUG2__VI = 0x1D69; +constexpr unsigned int mmSCL1_SCL_F_SHARP_CONTROL__VI = 0x1D53; +constexpr unsigned int mmSCL1_SCL_HORZ_FILTER_CONTROL__VI = 0x1D48; +constexpr unsigned int mmSCL1_SCL_HORZ_FILTER_INIT__VI = 0x1D4A; +constexpr unsigned int mmSCL1_SCL_HORZ_FILTER_SCALE_RATIO__VI = 0x1D49; +constexpr unsigned int mmSCL1_SCL_MANUAL_REPLICATE_CONTROL__VI = 0x1D46; +constexpr unsigned int mmSCL1_SCL_MODE__VI = 0x1D42; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_DET1__VI = 0x1D60; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_DET2__VI = 0x1D61; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_DET3__VI = 0x1D62; +constexpr unsigned int mmSCL1_SCL_MODE_CHANGE_MASK__VI = 0x1D63; +constexpr unsigned int mmSCL1_SCL_ROUND_OFFSET__VI = 0x1D4F; +constexpr unsigned int mmSCL1_SCL_TAP_CONTROL__VI = 0x1D43; +constexpr unsigned int mmSCL1_SCL_TEST_DEBUG_DATA__VI = 0x1D6C; +constexpr unsigned int mmSCL1_SCL_TEST_DEBUG_INDEX__VI = 0x1D6B; +constexpr unsigned int mmSCL1_SCL_UPDATE__VI = 0x1D51; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_CONTROL__VI = 0x1D4B; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_INIT__VI = 0x1D4D; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_INIT_BOT__VI = 0x1D4E; +constexpr unsigned int mmSCL1_SCL_VERT_FILTER_SCALE_RATIO__VI = 0x1D4C; +constexpr unsigned int mmSCL1_VIEWPORT_SIZE__VI = 0x1D5D; +constexpr unsigned int mmSCL1_VIEWPORT_START__VI = 0x1D5C; +constexpr unsigned int mmSCL1_VIEWPORT_START_SECONDARY__VI = 0x1D5B; +constexpr unsigned int mmSCL2_EXT_OVERSCAN_LEFT_RIGHT__VI = 0x1F5E; +constexpr unsigned int mmSCL2_EXT_OVERSCAN_TOP_BOTTOM__VI = 0x1F5F; +constexpr unsigned int mmSCL2_SCL_ALU_CONTROL__VI = 0x1F54; +constexpr unsigned int mmSCL2_SCL_AUTOMATIC_MODE_CONTROL__VI = 0x1F47; +constexpr unsigned int mmSCL2_SCL_BYPASS_CONTROL__VI = 0x1F45; +constexpr unsigned int mmSCL2_SCL_COEF_RAM_CONFLICT_STATUS__VI = 0x1F55; +constexpr unsigned int mmSCL2_SCL_COEF_RAM_SELECT__VI = 0x1F40; +constexpr unsigned int mmSCL2_SCL_COEF_RAM_TAP_DATA__VI = 0x1F41; +constexpr unsigned int mmSCL2_SCL_CONTROL__VI = 0x1F44; +constexpr unsigned int mmSCL2_SCL_DEBUG__VI = 0x1F6A; +constexpr unsigned int mmSCL2_SCL_DEBUG2__VI = 0x1F69; +constexpr unsigned int mmSCL2_SCL_F_SHARP_CONTROL__VI = 0x1F53; +constexpr unsigned int mmSCL2_SCL_HORZ_FILTER_CONTROL__VI = 0x1F48; +constexpr unsigned int mmSCL2_SCL_HORZ_FILTER_INIT__VI = 0x1F4A; +constexpr unsigned int mmSCL2_SCL_HORZ_FILTER_SCALE_RATIO__VI = 0x1F49; +constexpr unsigned int mmSCL2_SCL_MANUAL_REPLICATE_CONTROL__VI = 0x1F46; +constexpr unsigned int mmSCL2_SCL_MODE__VI = 0x1F42; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_DET1__VI = 0x1F60; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_DET2__VI = 0x1F61; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_DET3__VI = 0x1F62; +constexpr unsigned int mmSCL2_SCL_MODE_CHANGE_MASK__VI = 0x1F63; +constexpr unsigned int mmSCL2_SCL_ROUND_OFFSET__VI = 0x1F4F; +constexpr unsigned int mmSCL2_SCL_TAP_CONTROL__VI = 0x1F43; +constexpr unsigned int mmSCL2_SCL_TEST_DEBUG_DATA__VI = 0x1F6C; +constexpr unsigned int mmSCL2_SCL_TEST_DEBUG_INDEX__VI = 0x1F6B; +constexpr unsigned int mmSCL2_SCL_UPDATE__VI = 0x1F51; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_CONTROL__VI = 0x1F4B; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_INIT__VI = 0x1F4D; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_INIT_BOT__VI = 0x1F4E; +constexpr unsigned int mmSCL2_SCL_VERT_FILTER_SCALE_RATIO__VI = 0x1F4C; +constexpr unsigned int mmSCL2_VIEWPORT_SIZE__VI = 0x1F5D; +constexpr unsigned int mmSCL2_VIEWPORT_START__VI = 0x1F5C; +constexpr unsigned int mmSCL2_VIEWPORT_START_SECONDARY__VI = 0x1F5B; +constexpr unsigned int mmSCL3_EXT_OVERSCAN_LEFT_RIGHT__VI = 0x415E; +constexpr unsigned int mmSCL3_EXT_OVERSCAN_TOP_BOTTOM__VI = 0x415F; +constexpr unsigned int mmSCL3_SCL_ALU_CONTROL__VI = 0x4154; +constexpr unsigned int mmSCL3_SCL_AUTOMATIC_MODE_CONTROL__VI = 0x4147; +constexpr unsigned int mmSCL3_SCL_BYPASS_CONTROL__VI = 0x4145; +constexpr unsigned int mmSCL3_SCL_COEF_RAM_CONFLICT_STATUS__VI = 0x4155; +constexpr unsigned int mmSCL3_SCL_COEF_RAM_SELECT__VI = 0x4140; +constexpr unsigned int mmSCL3_SCL_COEF_RAM_TAP_DATA__VI = 0x4141; +constexpr unsigned int mmSCL3_SCL_CONTROL__VI = 0x4144; +constexpr unsigned int mmSCL3_SCL_DEBUG__VI = 0x416A; +constexpr unsigned int mmSCL3_SCL_DEBUG2__VI = 0x4169; +constexpr unsigned int mmSCL3_SCL_F_SHARP_CONTROL__VI = 0x4153; +constexpr unsigned int mmSCL3_SCL_HORZ_FILTER_CONTROL__VI = 0x4148; +constexpr unsigned int mmSCL3_SCL_HORZ_FILTER_INIT__VI = 0x414A; +constexpr unsigned int mmSCL3_SCL_HORZ_FILTER_SCALE_RATIO__VI = 0x4149; +constexpr unsigned int mmSCL3_SCL_MANUAL_REPLICATE_CONTROL__VI = 0x4146; +constexpr unsigned int mmSCL3_SCL_MODE__VI = 0x4142; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_DET1__VI = 0x4160; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_DET2__VI = 0x4161; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_DET3__VI = 0x4162; +constexpr unsigned int mmSCL3_SCL_MODE_CHANGE_MASK__VI = 0x4163; +constexpr unsigned int mmSCL3_SCL_ROUND_OFFSET__VI = 0x414F; +constexpr unsigned int mmSCL3_SCL_TAP_CONTROL__VI = 0x4143; +constexpr unsigned int mmSCL3_SCL_TEST_DEBUG_DATA__VI = 0x416C; +constexpr unsigned int mmSCL3_SCL_TEST_DEBUG_INDEX__VI = 0x416B; +constexpr unsigned int mmSCL3_SCL_UPDATE__VI = 0x4151; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_CONTROL__VI = 0x414B; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_INIT__VI = 0x414D; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_INIT_BOT__VI = 0x414E; +constexpr unsigned int mmSCL3_SCL_VERT_FILTER_SCALE_RATIO__VI = 0x414C; +constexpr unsigned int mmSCL3_VIEWPORT_SIZE__VI = 0x415D; +constexpr unsigned int mmSCL3_VIEWPORT_START__VI = 0x415C; +constexpr unsigned int mmSCL3_VIEWPORT_START_SECONDARY__VI = 0x415B; +constexpr unsigned int mmSCL4_EXT_OVERSCAN_LEFT_RIGHT__VI = 0x435E; +constexpr unsigned int mmSCL4_EXT_OVERSCAN_TOP_BOTTOM__VI = 0x435F; +constexpr unsigned int mmSCL4_SCL_ALU_CONTROL__VI = 0x4354; +constexpr unsigned int mmSCL4_SCL_AUTOMATIC_MODE_CONTROL__VI = 0x4347; +constexpr unsigned int mmSCL4_SCL_BYPASS_CONTROL__VI = 0x4345; +constexpr unsigned int mmSCL4_SCL_COEF_RAM_CONFLICT_STATUS__VI = 0x4355; +constexpr unsigned int mmSCL4_SCL_COEF_RAM_SELECT__VI = 0x4340; +constexpr unsigned int mmSCL4_SCL_COEF_RAM_TAP_DATA__VI = 0x4341; +constexpr unsigned int mmSCL4_SCL_CONTROL__VI = 0x4344; +constexpr unsigned int mmSCL4_SCL_DEBUG__VI = 0x436A; +constexpr unsigned int mmSCL4_SCL_DEBUG2__VI = 0x4369; +constexpr unsigned int mmSCL4_SCL_F_SHARP_CONTROL__VI = 0x4353; +constexpr unsigned int mmSCL4_SCL_HORZ_FILTER_CONTROL__VI = 0x4348; +constexpr unsigned int mmSCL4_SCL_HORZ_FILTER_INIT__VI = 0x434A; +constexpr unsigned int mmSCL4_SCL_HORZ_FILTER_SCALE_RATIO__VI = 0x4349; +constexpr unsigned int mmSCL4_SCL_MANUAL_REPLICATE_CONTROL__VI = 0x4346; +constexpr unsigned int mmSCL4_SCL_MODE__VI = 0x4342; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_DET1__VI = 0x4360; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_DET2__VI = 0x4361; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_DET3__VI = 0x4362; +constexpr unsigned int mmSCL4_SCL_MODE_CHANGE_MASK__VI = 0x4363; +constexpr unsigned int mmSCL4_SCL_ROUND_OFFSET__VI = 0x434F; +constexpr unsigned int mmSCL4_SCL_TAP_CONTROL__VI = 0x4343; +constexpr unsigned int mmSCL4_SCL_TEST_DEBUG_DATA__VI = 0x436C; +constexpr unsigned int mmSCL4_SCL_TEST_DEBUG_INDEX__VI = 0x436B; +constexpr unsigned int mmSCL4_SCL_UPDATE__VI = 0x4351; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_CONTROL__VI = 0x434B; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_INIT__VI = 0x434D; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_INIT_BOT__VI = 0x434E; +constexpr unsigned int mmSCL4_SCL_VERT_FILTER_SCALE_RATIO__VI = 0x434C; +constexpr unsigned int mmSCL4_VIEWPORT_SIZE__VI = 0x435D; +constexpr unsigned int mmSCL4_VIEWPORT_START__VI = 0x435C; +constexpr unsigned int mmSCL4_VIEWPORT_START_SECONDARY__VI = 0x435B; +constexpr unsigned int mmSCL5_EXT_OVERSCAN_LEFT_RIGHT__VI = 0x455E; +constexpr unsigned int mmSCL5_EXT_OVERSCAN_TOP_BOTTOM__VI = 0x455F; +constexpr unsigned int mmSCL5_SCL_ALU_CONTROL__VI = 0x4554; +constexpr unsigned int mmSCL5_SCL_AUTOMATIC_MODE_CONTROL__VI = 0x4547; +constexpr unsigned int mmSCL5_SCL_BYPASS_CONTROL__VI = 0x4545; +constexpr unsigned int mmSCL5_SCL_COEF_RAM_CONFLICT_STATUS__VI = 0x4555; +constexpr unsigned int mmSCL5_SCL_COEF_RAM_SELECT__VI = 0x4540; +constexpr unsigned int mmSCL5_SCL_COEF_RAM_TAP_DATA__VI = 0x4541; +constexpr unsigned int mmSCL5_SCL_CONTROL__VI = 0x4544; +constexpr unsigned int mmSCL5_SCL_DEBUG__VI = 0x456A; +constexpr unsigned int mmSCL5_SCL_DEBUG2__VI = 0x4569; +constexpr unsigned int mmSCL5_SCL_F_SHARP_CONTROL__VI = 0x4553; +constexpr unsigned int mmSCL5_SCL_HORZ_FILTER_CONTROL__VI = 0x4548; +constexpr unsigned int mmSCL5_SCL_HORZ_FILTER_INIT__VI = 0x454A; +constexpr unsigned int mmSCL5_SCL_HORZ_FILTER_SCALE_RATIO__VI = 0x4549; +constexpr unsigned int mmSCL5_SCL_MANUAL_REPLICATE_CONTROL__VI = 0x4546; +constexpr unsigned int mmSCL5_SCL_MODE__VI = 0x4542; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_DET1__VI = 0x4560; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_DET2__VI = 0x4561; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_DET3__VI = 0x4562; +constexpr unsigned int mmSCL5_SCL_MODE_CHANGE_MASK__VI = 0x4563; +constexpr unsigned int mmSCL5_SCL_ROUND_OFFSET__VI = 0x454F; +constexpr unsigned int mmSCL5_SCL_TAP_CONTROL__VI = 0x4543; +constexpr unsigned int mmSCL5_SCL_TEST_DEBUG_DATA__VI = 0x456C; +constexpr unsigned int mmSCL5_SCL_TEST_DEBUG_INDEX__VI = 0x456B; +constexpr unsigned int mmSCL5_SCL_UPDATE__VI = 0x4551; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_CONTROL__VI = 0x454B; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_INIT__VI = 0x454D; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_INIT_BOT__VI = 0x454E; +constexpr unsigned int mmSCL5_SCL_VERT_FILTER_SCALE_RATIO__VI = 0x454C; +constexpr unsigned int mmSCL5_VIEWPORT_SIZE__VI = 0x455D; +constexpr unsigned int mmSCL5_VIEWPORT_START__VI = 0x455C; +constexpr unsigned int mmSCL5_VIEWPORT_START_SECONDARY__VI = 0x455B; +constexpr unsigned int mmSCLK_CGTT_BLK_CTRL_REG__VI = 0x0136; +constexpr unsigned int mmSCLV_ALU_CONTROL__VI = 0x4685; +constexpr unsigned int mmSCLV_AUTOMATIC_MODE_CONTROL__VI = 0x4676; +constexpr unsigned int mmSCLV_COEF_RAM_SELECT__VI = 0x4670; +constexpr unsigned int mmSCLV_COEF_RAM_TAP_DATA__VI = 0x4671; +constexpr unsigned int mmSCLV_CONTROL__VI = 0x4674; +constexpr unsigned int mmSCLV_DEBUG__VI = 0x4693; +constexpr unsigned int mmSCLV_DEBUG2__VI = 0x4692; +constexpr unsigned int mmSCLV_EXT_OVERSCAN_LEFT_RIGHT__VI = 0x468C; +constexpr unsigned int mmSCLV_EXT_OVERSCAN_TOP_BOTTOM__VI = 0x468D; +constexpr unsigned int mmSCLV_HORZ_FILTER_CONTROL__VI = 0x4677; +constexpr unsigned int mmSCLV_HORZ_FILTER_INIT__VI = 0x4679; +constexpr unsigned int mmSCLV_HORZ_FILTER_INIT_C__VI = 0x467B; +constexpr unsigned int mmSCLV_HORZ_FILTER_SCALE_RATIO__VI = 0x4678; +constexpr unsigned int mmSCLV_HORZ_FILTER_SCALE_RATIO_C__VI = 0x467A; +constexpr unsigned int mmSCLV_MANUAL_REPLICATE_CONTROL__VI = 0x4675; +constexpr unsigned int mmSCLV_MODE__VI = 0x4672; +constexpr unsigned int mmSCLV_MODE_CHANGE_DET1__VI = 0x468E; +constexpr unsigned int mmSCLV_MODE_CHANGE_DET2__VI = 0x468F; +constexpr unsigned int mmSCLV_MODE_CHANGE_DET3__VI = 0x4690; +constexpr unsigned int mmSCLV_MODE_CHANGE_MASK__VI = 0x4691; +constexpr unsigned int mmSCLV_ROUND_OFFSET__VI = 0x4683; +constexpr unsigned int mmSCLV_TAP_CONTROL__VI = 0x4673; +constexpr unsigned int mmSCLV_TEST_DEBUG_DATA__VI = 0x4695; +constexpr unsigned int mmSCLV_TEST_DEBUG_INDEX__VI = 0x4694; +constexpr unsigned int mmSCLV_UPDATE__VI = 0x4684; +constexpr unsigned int mmSCLV_VERT_FILTER_CONTROL__VI = 0x467C; +constexpr unsigned int mmSCLV_VERT_FILTER_INIT__VI = 0x467E; +constexpr unsigned int mmSCLV_VERT_FILTER_INIT_BOT__VI = 0x467F; +constexpr unsigned int mmSCLV_VERT_FILTER_INIT_BOT_C__VI = 0x4682; +constexpr unsigned int mmSCLV_VERT_FILTER_INIT_C__VI = 0x4681; +constexpr unsigned int mmSCLV_VERT_FILTER_SCALE_RATIO__VI = 0x467D; +constexpr unsigned int mmSCLV_VERT_FILTER_SCALE_RATIO_C__VI = 0x4680; +constexpr unsigned int mmSCLV_VIEWPORT_SIZE__VI = 0x4688; +constexpr unsigned int mmSCLV_VIEWPORT_SIZE_C__VI = 0x468B; +constexpr unsigned int mmSCLV_VIEWPORT_START__VI = 0x4686; +constexpr unsigned int mmSCLV_VIEWPORT_START_C__VI = 0x4689; +constexpr unsigned int mmSCLV_VIEWPORT_START_SECONDARY__VI = 0x4687; +constexpr unsigned int mmSCLV_VIEWPORT_START_SECONDARY_C__VI = 0x468A; +constexpr unsigned int mmSCL_DEBUG2__VI = 0x1B69; +constexpr unsigned int mmSCL_HORZ_FILTER_CONTROL__VI = 0x1B48; +constexpr unsigned int mmSCL_HORZ_FILTER_INIT__VI = 0x1B4A; +constexpr unsigned int mmSCL_HORZ_FILTER_SCALE_RATIO__VI = 0x1B49; +constexpr unsigned int mmSCL_MODE__VI = 0x1B42; +constexpr unsigned int mmSCL_ROUND_OFFSET__VI = 0x1B4F; +constexpr unsigned int mmSCL_VERT_FILTER_CONTROL__VI = 0x1B4B; +constexpr unsigned int mmSCL_VERT_FILTER_INIT__VI = 0x1B4D; +constexpr unsigned int mmSCL_VERT_FILTER_INIT_BOT__VI = 0x1B4E; +constexpr unsigned int mmSCL_VERT_FILTER_SCALE_RATIO__VI = 0x1B4C; +constexpr unsigned int mmSDMA0_ACTIVE_FCN_ID__VI = 0x341F; +constexpr unsigned int mmSDMA0_ATOMIC_CNTL__VI = 0x342E; +constexpr unsigned int mmSDMA0_ATOMIC_PREOP_HI__VI = 0x3430; +constexpr unsigned int mmSDMA0_ATOMIC_PREOP_LO__VI = 0x342F; +constexpr unsigned int mmSDMA0_BA_THRESHOLD__VI = 0x342B; +constexpr unsigned int mmSDMA0_CONTEXT_REG_TYPE0__VI = 0x3478; +constexpr unsigned int mmSDMA0_CONTEXT_REG_TYPE1__VI = 0x3479; +constexpr unsigned int mmSDMA0_CONTEXT_REG_TYPE2__VI = 0x347A; +constexpr unsigned int mmSDMA0_EDC_CONFIG__VI = 0x341A; +constexpr unsigned int mmSDMA0_GFX_CSA_ADDR_HI__VI = 0x34AD; +constexpr unsigned int mmSDMA0_GFX_CSA_ADDR_LO__VI = 0x34AC; +constexpr unsigned int mmSDMA0_GFX_DOORBELL__VI = 0x3492; +constexpr unsigned int mmSDMA0_GFX_DOORBELL_LOG__VI = 0x34A9; +constexpr unsigned int mmSDMA0_GFX_DUMMY_REG__VI = 0x34B1; +constexpr unsigned int mmSDMA0_GFX_IB_SUB_REMAIN__VI = 0x34AF; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_CNTL__VI = 0x34C7; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_DATA0__VI = 0x34C1; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_DATA1__VI = 0x34C2; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_DATA2__VI = 0x34C3; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_DATA3__VI = 0x34C4; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_DATA4__VI = 0x34C5; +constexpr unsigned int mmSDMA0_GFX_MIDCMD_DATA5__VI = 0x34C6; +constexpr unsigned int mmSDMA0_GFX_PREEMPT__VI = 0x34B0; +constexpr unsigned int mmSDMA0_GFX_WATERMARK__VI = 0x34AA; +constexpr unsigned int mmSDMA0_ID__VI = 0x342C; +constexpr unsigned int mmSDMA0_PERFCOUNTER0_RESULT__VI = 0x9001; +constexpr unsigned int mmSDMA0_PERFCOUNTER1_RESULT__VI = 0x9002; +constexpr unsigned int mmSDMA0_PERFMON_CNTL__VI = 0x9000; +constexpr unsigned int mmSDMA0_PERF_REG_TYPE0__VI = 0x3477; +constexpr unsigned int mmSDMA0_POWER_CNTL_IDLE__VI = 0x342C; +constexpr unsigned int mmSDMA0_PUB_REG_TYPE0__VI = 0x347C; +constexpr unsigned int mmSDMA0_PUB_REG_TYPE1__VI = 0x347D; +constexpr unsigned int mmSDMA0_RD_BURST_CNTL__VI = 0x340F; +constexpr unsigned int mmSDMA0_RLC0_CSA_ADDR_HI__VI = 0x352D; +constexpr unsigned int mmSDMA0_RLC0_CSA_ADDR_LO__VI = 0x352C; +constexpr unsigned int mmSDMA0_RLC0_DUMMY_REG__VI = 0x3531; +constexpr unsigned int mmSDMA0_RLC0_IB_SUB_REMAIN__VI = 0x352F; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_CNTL__VI = 0x3547; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_DATA0__VI = 0x3541; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_DATA1__VI = 0x3542; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_DATA2__VI = 0x3543; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_DATA3__VI = 0x3544; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_DATA4__VI = 0x3545; +constexpr unsigned int mmSDMA0_RLC0_MIDCMD_DATA5__VI = 0x3546; +constexpr unsigned int mmSDMA0_RLC0_PREEMPT__VI = 0x3530; +constexpr unsigned int mmSDMA0_RLC0_WATERMARK__VI = 0x352A; +constexpr unsigned int mmSDMA0_RLC1_CSA_ADDR_HI__VI = 0x35AD; +constexpr unsigned int mmSDMA0_RLC1_CSA_ADDR_LO__VI = 0x35AC; +constexpr unsigned int mmSDMA0_RLC1_DUMMY_REG__VI = 0x35B1; +constexpr unsigned int mmSDMA0_RLC1_IB_SUB_REMAIN__VI = 0x35AF; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_CNTL__VI = 0x35C7; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_DATA0__VI = 0x35C1; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_DATA1__VI = 0x35C2; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_DATA2__VI = 0x35C3; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_DATA3__VI = 0x35C4; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_DATA4__VI = 0x35C5; +constexpr unsigned int mmSDMA0_RLC1_MIDCMD_DATA5__VI = 0x35C6; +constexpr unsigned int mmSDMA0_RLC1_PREEMPT__VI = 0x35B0; +constexpr unsigned int mmSDMA0_RLC1_WATERMARK__VI = 0x35AA; +constexpr unsigned int mmSDMA0_STATUS2_REG__VI = 0x341E; +constexpr unsigned int mmSDMA0_VERSION__VI = 0x342D; +constexpr unsigned int mmSDMA0_VF_ENABLE__VI = 0x342A; +constexpr unsigned int mmSDMA0_VIRT_RESET_REQ__VI = 0x3421; +constexpr unsigned int mmSDMA0_VM_CNTL__VI = 0x341B; +constexpr unsigned int mmSDMA0_VM_CTX_CNTL__VI = 0x3420; +constexpr unsigned int mmSDMA0_VM_CTX_HI__VI = 0x341D; +constexpr unsigned int mmSDMA0_VM_CTX_LO__VI = 0x341C; +constexpr unsigned int mmSDMA1_ACTIVE_FCN_ID__VI = 0x361F; +constexpr unsigned int mmSDMA1_ATOMIC_CNTL__VI = 0x362E; +constexpr unsigned int mmSDMA1_ATOMIC_PREOP_HI__VI = 0x3630; +constexpr unsigned int mmSDMA1_ATOMIC_PREOP_LO__VI = 0x362F; +constexpr unsigned int mmSDMA1_BA_THRESHOLD__VI = 0x362B; +constexpr unsigned int mmSDMA1_CONTEXT_REG_TYPE0__VI = 0x3678; +constexpr unsigned int mmSDMA1_CONTEXT_REG_TYPE1__VI = 0x3679; +constexpr unsigned int mmSDMA1_CONTEXT_REG_TYPE2__VI = 0x367A; +constexpr unsigned int mmSDMA1_EDC_CONFIG__VI = 0x361A; +constexpr unsigned int mmSDMA1_GFX_CSA_ADDR_HI__VI = 0x36AD; +constexpr unsigned int mmSDMA1_GFX_CSA_ADDR_LO__VI = 0x36AC; +constexpr unsigned int mmSDMA1_GFX_DOORBELL__VI = 0x3692; +constexpr unsigned int mmSDMA1_GFX_DOORBELL_LOG__VI = 0x36A9; +constexpr unsigned int mmSDMA1_GFX_DUMMY_REG__VI = 0x36B1; +constexpr unsigned int mmSDMA1_GFX_IB_SUB_REMAIN__VI = 0x36AF; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_CNTL__VI = 0x36C7; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_DATA0__VI = 0x36C1; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_DATA1__VI = 0x36C2; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_DATA2__VI = 0x36C3; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_DATA3__VI = 0x36C4; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_DATA4__VI = 0x36C5; +constexpr unsigned int mmSDMA1_GFX_MIDCMD_DATA5__VI = 0x36C6; +constexpr unsigned int mmSDMA1_GFX_PREEMPT__VI = 0x36B0; +constexpr unsigned int mmSDMA1_GFX_WATERMARK__VI = 0x36AA; +constexpr unsigned int mmSDMA1_ID__VI = 0x362C; +constexpr unsigned int mmSDMA1_PERFCOUNTER0_RESULT__VI = 0x9011; +constexpr unsigned int mmSDMA1_PERFCOUNTER1_RESULT__VI = 0x9012; +constexpr unsigned int mmSDMA1_PERFMON_CNTL__VI = 0x9010; +constexpr unsigned int mmSDMA1_PERF_REG_TYPE0__VI = 0x3677; +constexpr unsigned int mmSDMA1_POWER_CNTL_IDLE__VI = 0x362C; +constexpr unsigned int mmSDMA1_PUB_REG_TYPE0__VI = 0x367C; +constexpr unsigned int mmSDMA1_PUB_REG_TYPE1__VI = 0x367D; +constexpr unsigned int mmSDMA1_RD_BURST_CNTL__VI = 0x360F; +constexpr unsigned int mmSDMA1_RLC0_CSA_ADDR_HI__VI = 0x372D; +constexpr unsigned int mmSDMA1_RLC0_CSA_ADDR_LO__VI = 0x372C; +constexpr unsigned int mmSDMA1_RLC0_DUMMY_REG__VI = 0x3731; +constexpr unsigned int mmSDMA1_RLC0_IB_SUB_REMAIN__VI = 0x372F; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_CNTL__VI = 0x3747; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_DATA0__VI = 0x3741; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_DATA1__VI = 0x3742; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_DATA2__VI = 0x3743; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_DATA3__VI = 0x3744; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_DATA4__VI = 0x3745; +constexpr unsigned int mmSDMA1_RLC0_MIDCMD_DATA5__VI = 0x3746; +constexpr unsigned int mmSDMA1_RLC0_PREEMPT__VI = 0x3730; +constexpr unsigned int mmSDMA1_RLC0_WATERMARK__VI = 0x372A; +constexpr unsigned int mmSDMA1_RLC1_CSA_ADDR_HI__VI = 0x37AD; +constexpr unsigned int mmSDMA1_RLC1_CSA_ADDR_LO__VI = 0x37AC; +constexpr unsigned int mmSDMA1_RLC1_DUMMY_REG__VI = 0x37B1; +constexpr unsigned int mmSDMA1_RLC1_IB_SUB_REMAIN__VI = 0x37AF; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_CNTL__VI = 0x37C7; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_DATA0__VI = 0x37C1; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_DATA1__VI = 0x37C2; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_DATA2__VI = 0x37C3; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_DATA3__VI = 0x37C4; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_DATA4__VI = 0x37C5; +constexpr unsigned int mmSDMA1_RLC1_MIDCMD_DATA5__VI = 0x37C6; +constexpr unsigned int mmSDMA1_RLC1_PREEMPT__VI = 0x37B0; +constexpr unsigned int mmSDMA1_RLC1_WATERMARK__VI = 0x37AA; +constexpr unsigned int mmSDMA1_STATUS2_REG__VI = 0x361E; +constexpr unsigned int mmSDMA1_VERSION__VI = 0x362D; +constexpr unsigned int mmSDMA1_VF_ENABLE__VI = 0x362A; +constexpr unsigned int mmSDMA1_VIRT_RESET_REQ__VI = 0x3621; +constexpr unsigned int mmSDMA1_VM_CNTL__VI = 0x361B; +constexpr unsigned int mmSDMA1_VM_CTX_CNTL__VI = 0x3620; +constexpr unsigned int mmSDMA1_VM_CTX_HI__VI = 0x361D; +constexpr unsigned int mmSDMA1_VM_CTX_LO__VI = 0x361C; +constexpr unsigned int mmSEM_ACTIVE_FCN_ID__VI = 0x0F97; +constexpr unsigned int mmSEM_MAILBOX_CLIENTCONFIG_EXTRA__VI = 0x0F9F; +constexpr unsigned int mmSEM_PERFCOUNTER0_RESULT__VI = 0x0F92; +constexpr unsigned int mmSEM_PERFCOUNTER1_RESULT__VI = 0x0F93; +constexpr unsigned int mmSEM_PERFMON_CNTL__VI = 0x0F91; +constexpr unsigned int mmSEM_VF_ENABLE__VI = 0x0F95; +constexpr unsigned int mmSEM_VIRT_RESET_REQ__VI = 0x0F98; +constexpr unsigned int mmSE_CAC_CGTT_CLK_CTRL__VI = 0x3293; +constexpr unsigned int mmSMBCLK_PAD_CNTL__VI = 0x15ED; +constexpr unsigned int mmSMBDAT_PAD_CNTL__VI = 0x15EC; +constexpr unsigned int mmSMBUS_BACO_DUMMY__VI = 0x15EB; +constexpr unsigned int mmSMC_MSG_ARG_11__VI = 0x0093; +constexpr unsigned int mmSMU_BIF_VDDGFX_PWR_STATUS__VI = 0x14F8; +constexpr unsigned int mmSMU_CONTROL__VI = 0x012D; +constexpr unsigned int mmSMU_IND_DATA_0__VI = 0x01A7; +constexpr unsigned int mmSMU_IND_DATA_1__VI = 0x01A9; +constexpr unsigned int mmSMU_IND_DATA_2__VI = 0x01AB; +constexpr unsigned int mmSMU_IND_DATA_3__VI = 0x01AD; +constexpr unsigned int mmSMU_IND_DATA_4__VI = 0x01AF; +constexpr unsigned int mmSMU_IND_DATA_5__VI = 0x01B1; +constexpr unsigned int mmSMU_IND_DATA_6__VI = 0x01B3; +constexpr unsigned int mmSMU_IND_DATA_7__VI = 0x01B5; +constexpr unsigned int mmSMU_IND_INDEX_0__VI = 0x01A6; +constexpr unsigned int mmSMU_IND_INDEX_1__VI = 0x01A8; +constexpr unsigned int mmSMU_IND_INDEX_2__VI = 0x01AA; +constexpr unsigned int mmSMU_IND_INDEX_3__VI = 0x01AC; +constexpr unsigned int mmSMU_IND_INDEX_4__VI = 0x01AE; +constexpr unsigned int mmSMU_IND_INDEX_5__VI = 0x01B0; +constexpr unsigned int mmSMU_IND_INDEX_6__VI = 0x01B2; +constexpr unsigned int mmSMU_IND_INDEX_7__VI = 0x01B4; +constexpr unsigned int mmSMU_INTERRUPT_CONTROL__VI = 0x012E; +constexpr unsigned int mmSMU_MP1_RLC2MP_RESP__VI = 0x01F4; +constexpr unsigned int mmSMU_MP1_SRBM2P_MSG_5__VI = 0x01C5; +constexpr unsigned int mmSMU_RLC_RESPONSE__VI = 0xEC07; +constexpr unsigned int mmSM_CONTROL2__VI = 0x1B6E; +constexpr unsigned int mmSPI_COMPUTE_WF_CTX_SAVE__VI = 0x31FC; +constexpr unsigned int mmSPI_CONFIG_CNTL_2__VI = 0x2451; +constexpr unsigned int mmSPI_DSM_CNTL__VI = 0x2443; +constexpr unsigned int mmSPI_EDC_CNT__VI = 0x2444; +constexpr unsigned int mmSPI_GFX_CNTL__VI = 0x243C; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_12__VI = 0x31F4; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_13__VI = 0x31F5; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_14__VI = 0x31F6; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_CU_15__VI = 0x31F7; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_12__VI = 0x31F8; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_13__VI = 0x31F9; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_14__VI = 0x31FA; +constexpr unsigned int mmSPI_RESOURCE_RESERVE_EN_CU_15__VI = 0x31FB; +constexpr unsigned int mmSPI_START_PHASE__VI = 0x243B; +constexpr unsigned int mmSQC_ATC_EDC_GATCL1_CNT__VI = 0x23B3; +constexpr unsigned int mmSQC_DSM_CNTL__VI = 0x230F; +constexpr unsigned int mmSQC_EDC_CNT__VI = 0x23A0; +constexpr unsigned int mmSQC_GATCL1_CNTL__VI = 0x23B2; +constexpr unsigned int mmSQC_WRITEBACK__VI = 0xC349; +constexpr unsigned int mmSQ_DSM_CNTL__VI = 0x2306; +constexpr unsigned int mmSQ_EDC_DED_CNT__VI = 0x23A2; +constexpr unsigned int mmSQ_EDC_INFO__VI = 0x23A3; +constexpr unsigned int mmSQ_EDC_SEC_CNT__VI = 0x23A1; +constexpr unsigned int mmSQ_M0_GPR_IDX_WORD__VI = 0x23D2; +constexpr unsigned int mmSQ_SMEM_0__VI = 0x237F; +constexpr unsigned int mmSQ_SMEM_1__VI = 0x237F; +constexpr unsigned int mmSQ_THREAD_TRACE_BASE__SI__CI = 0x2380; +constexpr unsigned int mmSQ_THREAD_TRACE_BASE__VI = 0xC330; +constexpr unsigned int mmSQ_THREAD_TRACE_BASE2__VI = 0xC337; +constexpr unsigned int mmSQ_THREAD_TRACE_CTRL__SI__CI = 0x238F; +constexpr unsigned int mmSQ_THREAD_TRACE_CTRL__VI = 0xC335; +constexpr unsigned int mmSQ_THREAD_TRACE_HIWATER__SI__CI = 0x2392; +constexpr unsigned int mmSQ_THREAD_TRACE_HIWATER__VI = 0xC33B; +constexpr unsigned int mmSQ_THREAD_TRACE_MASK__SI__CI = 0x2382; +constexpr unsigned int mmSQ_THREAD_TRACE_MASK__VI = 0xC332; +constexpr unsigned int mmSQ_THREAD_TRACE_MODE__SI__CI = 0x238E; +constexpr unsigned int mmSQ_THREAD_TRACE_MODE__VI = 0xC336; +constexpr unsigned int mmSQ_THREAD_TRACE_PERF_MASK__SI__CI = 0x2384; +constexpr unsigned int mmSQ_THREAD_TRACE_PERF_MASK__VI = 0xC334; +constexpr unsigned int mmSQ_THREAD_TRACE_SIZE__SI__CI = 0x2381; +constexpr unsigned int mmSQ_THREAD_TRACE_SIZE__VI = 0xC331; +constexpr unsigned int mmSQ_THREAD_TRACE_STATUS__SI__CI = 0x238D; +constexpr unsigned int mmSQ_THREAD_TRACE_STATUS__VI = 0xC33A; +constexpr unsigned int mmSQ_THREAD_TRACE_TOKEN_MASK__SI__CI = 0x2383; +constexpr unsigned int mmSQ_THREAD_TRACE_TOKEN_MASK__VI = 0xC333; +constexpr unsigned int mmSQ_THREAD_TRACE_TOKEN_MASK2__VI = 0xC338; +constexpr unsigned int mmSQ_THREAD_TRACE_WPTR__SI__CI = 0x238C; +constexpr unsigned int mmSQ_THREAD_TRACE_WPTR__VI = 0xC339; +constexpr unsigned int mmSQ_VOP_DPP__VI = 0x237F; +constexpr unsigned int mmSQ_VOP_SDWA__VI = 0x237F; +constexpr unsigned int mmSQ_WREXEC_EXEC_HI__VI = 0x23B1; +constexpr unsigned int mmSQ_WREXEC_EXEC_LO__VI = 0x23B1; +constexpr unsigned int mmSRBM_CAM_DATA__SI__CI = 0x0397; +constexpr unsigned int mmSRBM_CAM_DATA__VI = 0xFE35; +constexpr unsigned int mmSRBM_CAM_INDEX__SI__CI = 0x0396; +constexpr unsigned int mmSRBM_CAM_INDEX__VI = 0xFE34; +constexpr unsigned int mmSRBM_CREDIT_RECOVER__VI = 0x039D; +constexpr unsigned int mmSRBM_CREDIT_RECOVER_CNTL__VI = 0x039C; +constexpr unsigned int mmSRBM_CREDIT_RESET__VI = 0x039E; +constexpr unsigned int mmSRBM_DEBUG_SNAPSHOT2__VI = 0x03AD; +constexpr unsigned int mmSRBM_DSM_TRIG_CNTL0__VI = 0x03AF; +constexpr unsigned int mmSRBM_DSM_TRIG_CNTL1__VI = 0x03B0; +constexpr unsigned int mmSRBM_DSM_TRIG_MASK0__VI = 0x03B1; +constexpr unsigned int mmSRBM_DSM_TRIG_MASK1__VI = 0x03B2; +constexpr unsigned int mmSRBM_FIREWALL_ERROR_ADDR__VI = 0x03AC; +constexpr unsigned int mmSRBM_FIREWALL_ERROR_SRC__VI = 0x03AB; +constexpr unsigned int mmSRBM_GFX_CNTL_DATA__VI = 0xFA2F; +constexpr unsigned int mmSRBM_GFX_CNTL_SELECT__VI = 0xFA2E; +constexpr unsigned int mmSRBM_ISP_CLKEN_CNTL__VI = 0x03B9; +constexpr unsigned int mmSRBM_ISP_DOMAIN_ADDR0__VI = 0xFA20; +constexpr unsigned int mmSRBM_ISP_DOMAIN_ADDR1__VI = 0xFA21; +constexpr unsigned int mmSRBM_ISP_DOMAIN_ADDR2__VI = 0xFA22; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR0__VI = 0xFA00; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR1__VI = 0xFA01; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR2__VI = 0xFA02; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR3__VI = 0xFA03; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR4__VI = 0xFA04; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR5__VI = 0xFA05; +constexpr unsigned int mmSRBM_MC_DOMAIN_ADDR6__VI = 0xFA06; +constexpr unsigned int mmSRBM_PERFCOUNTER0_HI__SI__CI = 0x0704; +constexpr unsigned int mmSRBM_PERFCOUNTER0_HI__VI = 0x7C04; +constexpr unsigned int mmSRBM_PERFCOUNTER0_LO__SI__CI = 0x0703; +constexpr unsigned int mmSRBM_PERFCOUNTER0_LO__VI = 0x7C03; +constexpr unsigned int mmSRBM_PERFCOUNTER0_SELECT__SI__CI = 0x0701; +constexpr unsigned int mmSRBM_PERFCOUNTER0_SELECT__VI = 0x7C01; +constexpr unsigned int mmSRBM_PERFCOUNTER1_HI__SI__CI = 0x0706; +constexpr unsigned int mmSRBM_PERFCOUNTER1_HI__VI = 0x7C06; +constexpr unsigned int mmSRBM_PERFCOUNTER1_LO__SI__CI = 0x0705; +constexpr unsigned int mmSRBM_PERFCOUNTER1_LO__VI = 0x7C05; +constexpr unsigned int mmSRBM_PERFCOUNTER1_SELECT__SI__CI = 0x0702; +constexpr unsigned int mmSRBM_PERFCOUNTER1_SELECT__VI = 0x7C02; +constexpr unsigned int mmSRBM_PERFMON_CNTL__SI__CI = 0x0700; +constexpr unsigned int mmSRBM_PERFMON_CNTL__VI = 0x7C00; +constexpr unsigned int mmSRBM_READ_CNTL__VI = 0x0392; +constexpr unsigned int mmSRBM_READ_ERROR2__VI = 0x03AE; +constexpr unsigned int mmSRBM_SAM_DOMAIN_ADDR0__VI = 0xFA1C; +constexpr unsigned int mmSRBM_SAM_DOMAIN_ADDR1__VI = 0xFA1D; +constexpr unsigned int mmSRBM_SAM_DOMAIN_ADDR2__VI = 0xFA1E; +constexpr unsigned int mmSRBM_SDMA_DOMAIN_ADDR0__VI = 0xFA10; +constexpr unsigned int mmSRBM_SDMA_DOMAIN_ADDR1__VI = 0xFA11; +constexpr unsigned int mmSRBM_SDMA_DOMAIN_ADDR2__VI = 0xFA12; +constexpr unsigned int mmSRBM_SDMA_DOMAIN_ADDR3__VI = 0xFA13; +constexpr unsigned int mmSRBM_STATUS3__VI = 0x0395; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR0__VI = 0xFA08; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR1__VI = 0xFA09; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR2__VI = 0xFA0A; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR3__VI = 0xFA0B; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR4__VI = 0xFA0C; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR5__VI = 0xFA0D; +constexpr unsigned int mmSRBM_SYS_DOMAIN_ADDR6__VI = 0xFA0E; +constexpr unsigned int mmSRBM_UVD_DOMAIN_ADDR0__VI = 0xFA14; +constexpr unsigned int mmSRBM_UVD_DOMAIN_ADDR1__VI = 0xFA15; +constexpr unsigned int mmSRBM_UVD_DOMAIN_ADDR2__VI = 0xFA16; +constexpr unsigned int mmSRBM_VCE_DOMAIN_ADDR0__VI = 0xFA18; +constexpr unsigned int mmSRBM_VCE_DOMAIN_ADDR1__VI = 0xFA19; +constexpr unsigned int mmSRBM_VCE_DOMAIN_ADDR2__VI = 0xFA1A; +constexpr unsigned int mmSRBM_VF_ENABLE__VI = 0xFA30; +constexpr unsigned int mmSRBM_VIRT_CNTL__VI = 0xFA31; +constexpr unsigned int mmSRBM_VIRT_RESET_REQ__VI = 0xFA32; +constexpr unsigned int mmSRBM_VP8_CLKEN_CNTL__VI = 0x03BA; +constexpr unsigned int mmSRBM_VP8_DOMAIN_ADDR0__VI = 0xFA24; +constexpr unsigned int mmSWRST_COMMAND_0__VI = 0x14A2; +constexpr unsigned int mmSWRST_COMMAND_1__VI = 0x14A3; +constexpr unsigned int mmSWRST_COMMAND_STATUS__VI = 0x14A0; +constexpr unsigned int mmSWRST_CONTROL_0__VI = 0x14A4; +constexpr unsigned int mmSWRST_CONTROL_1__VI = 0x14A5; +constexpr unsigned int mmSWRST_CONTROL_2__VI = 0x14A6; +constexpr unsigned int mmSWRST_CONTROL_3__VI = 0x14A7; +constexpr unsigned int mmSWRST_CONTROL_4__VI = 0x14A8; +constexpr unsigned int mmSWRST_CONTROL_5__VI = 0x14A9; +constexpr unsigned int mmSWRST_CONTROL_6__VI = 0x14AA; +constexpr unsigned int mmSWRST_EP_COMMAND_0__VI = 0x14AB; +constexpr unsigned int mmSWRST_EP_CONTROL_0__VI = 0x14AC; +constexpr unsigned int mmSWRST_GENERAL_CONTROL__VI = 0x14A1; +constexpr unsigned int mmSX_BLEND_OPT_CONTROL__VI = 0xA1D7; +constexpr unsigned int mmSX_BLEND_OPT_EPSILON__VI = 0xA1D6; +constexpr unsigned int mmSX_MRT0_BLEND_OPT__VI = 0xA1D8; +constexpr unsigned int mmSX_MRT1_BLEND_OPT__VI = 0xA1D9; +constexpr unsigned int mmSX_MRT2_BLEND_OPT__VI = 0xA1DA; +constexpr unsigned int mmSX_MRT3_BLEND_OPT__VI = 0xA1DB; +constexpr unsigned int mmSX_MRT4_BLEND_OPT__VI = 0xA1DC; +constexpr unsigned int mmSX_MRT5_BLEND_OPT__VI = 0xA1DD; +constexpr unsigned int mmSX_MRT6_BLEND_OPT__VI = 0xA1DE; +constexpr unsigned int mmSX_MRT7_BLEND_OPT__VI = 0xA1DF; +constexpr unsigned int mmSX_PS_DOWNCONVERT__VI = 0xA1D5; +constexpr unsigned int mmSYMCLKA_CLOCK_ENABLE__VI = 0x0160; +constexpr unsigned int mmSYMCLKB_CLOCK_ENABLE__VI = 0x0161; +constexpr unsigned int mmSYMCLKC_CLOCK_ENABLE__VI = 0x0162; +constexpr unsigned int mmSYMCLKD_CLOCK_ENABLE__VI = 0x0163; +constexpr unsigned int mmSYMCLKE_CLOCK_ENABLE__VI = 0x0164; +constexpr unsigned int mmSYMCLKF_CLOCK_ENABLE__VI = 0x0165; +constexpr unsigned int mmSYMCLKG_CLOCK_ENABLE__VI = 0x0117; +constexpr unsigned int mmSYS_GRBM_GFX_INDEX_DATA__VI = 0xFA2D; +constexpr unsigned int mmSYS_GRBM_GFX_INDEX_SELECT__VI = 0xFA2C; +constexpr unsigned int mmTCC_DSM_CNTL__VI = 0x2B85; +constexpr unsigned int mmTCC_EDC_CNT__VI = 0x2B82; +constexpr unsigned int mmTCC_EXE_DISABLE__VI = 0x2B84; +constexpr unsigned int mmTCP_ATC_EDC_GATCL1_CNT__VI = 0x32B1; +constexpr unsigned int mmTCP_CNTL2__VI = 0x32B4; +constexpr unsigned int mmTCP_DSM_CNTL__VI = 0x32B3; +constexpr unsigned int mmTCP_EDC_CNT__VI = 0x2B17; +constexpr unsigned int mmTCP_GATCL1_CNTL__VI = 0x32B0; +constexpr unsigned int mmTCP_GATCL1_DSM_CNTL__VI = 0x32B2; +constexpr unsigned int mmTD_DSM_CNTL__VI = 0x252F; +constexpr unsigned int mmTMDS_CNTL__VI = 0x4A6B; +constexpr unsigned int mmTMDS_CONTROL0_FEEDBACK__VI = 0x4A6D; +constexpr unsigned int mmTMDS_CONTROL_CHAR__VI = 0x4A6C; +constexpr unsigned int mmTMDS_CTL0_1_GEN_CNTL__VI = 0x4A75; +constexpr unsigned int mmTMDS_CTL2_3_GEN_CNTL__VI = 0x4A76; +constexpr unsigned int mmTMDS_CTL_BITS__VI = 0x4A72; +constexpr unsigned int mmTMDS_DCBALANCER_CONTROL__VI = 0x4A73; +constexpr unsigned int mmTMDS_DEBUG__VI = 0x4A71; +constexpr unsigned int mmTMDS_STEREOSYNC_CTL_SEL__VI = 0x4A6E; +constexpr unsigned int mmTMDS_SYNC_CHAR_PATTERN_0_1__VI = 0x4A6F; +constexpr unsigned int mmTMDS_SYNC_CHAR_PATTERN_2_3__VI = 0x4A70; +constexpr unsigned int mmUNIPHYA_CHANNEL_XBAR_CNTL__VI = 0x4806; +constexpr unsigned int mmUNIPHYA_LINK_CNTL__VI = 0x4805; +constexpr unsigned int mmUNIPHYB_CHANNEL_XBAR_CNTL__VI = 0x4808; +constexpr unsigned int mmUNIPHYB_LINK_CNTL__VI = 0x4807; +constexpr unsigned int mmUNIPHYC_CHANNEL_XBAR_CNTL__VI = 0x480A; +constexpr unsigned int mmUNIPHYC_LINK_CNTL__VI = 0x4809; +constexpr unsigned int mmUNIPHYD_CHANNEL_XBAR_CNTL__VI = 0x480C; +constexpr unsigned int mmUNIPHYD_LINK_CNTL__VI = 0x480B; +constexpr unsigned int mmUNIPHYE_CHANNEL_XBAR_CNTL__VI = 0x480E; +constexpr unsigned int mmUNIPHYE_LINK_CNTL__VI = 0x480D; +constexpr unsigned int mmUNIPHYF_CHANNEL_XBAR_CNTL__VI = 0x4810; +constexpr unsigned int mmUNIPHYF_LINK_CNTL__VI = 0x480F; +constexpr unsigned int mmUNIPHYG_CHANNEL_XBAR_CNTL__VI = 0x4812; +constexpr unsigned int mmUNIPHYG_LINK_CNTL__VI = 0x4811; +constexpr unsigned int mmUNIPHY_ANG_BIST_CNTL__VI = 0x48CC; +constexpr unsigned int mmUNIPHY_DATA_SYNCHRONIZATION__VI = 0x48CA; +constexpr unsigned int mmUNIPHY_DEBUG__VI = 0x48D6; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKA__VI = 0x4838; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKB__VI = 0x4839; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKC__VI = 0x483F; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKD__VI = 0x4840; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKE__VI = 0x4843; +constexpr unsigned int mmUNIPHY_IMPCAL_LINKF__VI = 0x4844; +constexpr unsigned int mmUNIPHY_IMPCAL_PERIOD__VI = 0x483A; +constexpr unsigned int mmUNIPHY_IMPCAL_PSW_AB__VI = 0x483E; +constexpr unsigned int mmUNIPHY_IMPCAL_PSW_CD__VI = 0x4842; +constexpr unsigned int mmUNIPHY_IMPCAL_PSW_EF__VI = 0x4846; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED0__VI = 0x48C0; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED1__VI = 0x48C1; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED10__VI = 0x48CA; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED11__VI = 0x48CB; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED12__VI = 0x48CC; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED13__VI = 0x48CD; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED14__VI = 0x48CE; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED15__VI = 0x48CF; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED16__VI = 0x48D0; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED17__VI = 0x48D1; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED18__VI = 0x48D2; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED19__VI = 0x48D3; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED2__VI = 0x48C2; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED20__VI = 0x48D4; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED21__VI = 0x48D5; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED22__VI = 0x48D6; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED23__VI = 0x48D7; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED24__VI = 0x48D8; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED25__VI = 0x48D9; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED26__VI = 0x48DA; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED27__VI = 0x48DB; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED28__VI = 0x48DC; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED29__VI = 0x48DD; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED3__VI = 0x48C3; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED30__VI = 0x48DE; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED31__VI = 0x48DF; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED4__VI = 0x48C4; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED5__VI = 0x48C5; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED6__VI = 0x48C6; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED7__VI = 0x48C7; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED8__VI = 0x48C8; +constexpr unsigned int mmUNIPHY_MACRO_CNTL_RESERVED9__VI = 0x48C9; +constexpr unsigned int mmUNIPHY_PLL_CONTROL1__VI = 0x48C6; +constexpr unsigned int mmUNIPHY_PLL_CONTROL2__VI = 0x48C7; +constexpr unsigned int mmUNIPHY_PLL_FBDIV__VI = 0x48C5; +constexpr unsigned int mmUNIPHY_PLL_SS_CNTL__VI = 0x48C9; +constexpr unsigned int mmUNIPHY_PLL_SS_STEP_SIZE__VI = 0x48C8; +constexpr unsigned int mmUNIPHY_POWER_CONTROL__VI = 0x48C4; +constexpr unsigned int mmUNIPHY_REG_TEST_OUTPUT__VI = 0x48CB; +constexpr unsigned int mmUNIPHY_REG_TEST_OUTPUT2__VI = 0x48CD; +constexpr unsigned int mmUNIPHY_TPG_CONTROL__VI = 0x48D4; +constexpr unsigned int mmUNIPHY_TPG_SEED__VI = 0x48D5; +constexpr unsigned int mmUNIPHY_TX_CONTROL1__VI = 0x48C0; +constexpr unsigned int mmUNIPHY_TX_CONTROL2__VI = 0x48C1; +constexpr unsigned int mmUNIPHY_TX_CONTROL3__VI = 0x48C2; +constexpr unsigned int mmUNIPHY_TX_CONTROL4__VI = 0x48C3; +constexpr unsigned int mmUNP_CRC_CONTROL__VI = 0x4630; +constexpr unsigned int mmUNP_CRC_CURRENT__VI = 0x4632; +constexpr unsigned int mmUNP_CRC_LAST__VI = 0x4633; +constexpr unsigned int mmUNP_CRC_MASK__VI = 0x4631; +constexpr unsigned int mmUNP_DEBUG__VI = 0x4636; +constexpr unsigned int mmUNP_DEBUG2__VI = 0x4637; +constexpr unsigned int mmUNP_GRPH_CONTROL__VI = 0x4601; +constexpr unsigned int mmUNP_GRPH_CONTROL_EXP__VI = 0x4603; +constexpr unsigned int mmUNP_GRPH_DFQ_CONTROL__VI = 0x4629; +constexpr unsigned int mmUNP_GRPH_DFQ_STATUS__VI = 0x462A; +constexpr unsigned int mmUNP_GRPH_ENABLE__VI = 0x4600; +constexpr unsigned int mmUNP_GRPH_FLIP_RATE_CNTL__VI = 0x462F; +constexpr unsigned int mmUNP_GRPH_INTERRUPT_CONTROL__VI = 0x462C; +constexpr unsigned int mmUNP_GRPH_INTERRUPT_STATUS__VI = 0x462B; +constexpr unsigned int mmUNP_GRPH_PITCH_C__VI = 0x4617; +constexpr unsigned int mmUNP_GRPH_PITCH_L__VI = 0x4616; +constexpr unsigned int mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C__VI = 0x460B; +constexpr unsigned int mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__VI = 0x460D; +constexpr unsigned int mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__VI = 0x460C; +constexpr unsigned int mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L__VI = 0x460A; +constexpr unsigned int mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_C__VI = 0x4607; +constexpr unsigned int mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__VI = 0x4609; +constexpr unsigned int mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__VI = 0x4608; +constexpr unsigned int mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_L__VI = 0x4606; +constexpr unsigned int mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C__VI = 0x4613; +constexpr unsigned int mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__VI = 0x4615; +constexpr unsigned int mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__VI = 0x4614; +constexpr unsigned int mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L__VI = 0x4612; +constexpr unsigned int mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_C__VI = 0x460F; +constexpr unsigned int mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C__VI = 0x4611; +constexpr unsigned int mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L__VI = 0x4610; +constexpr unsigned int mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_L__VI = 0x460E; +constexpr unsigned int mmUNP_GRPH_STEREOSYNC_FLIP__VI = 0x462E; +constexpr unsigned int mmUNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_C__VI = 0x4628; +constexpr unsigned int mmUNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_L__VI = 0x4627; +constexpr unsigned int mmUNP_GRPH_SURFACE_ADDRESS_INUSE_C__VI = 0x4626; +constexpr unsigned int mmUNP_GRPH_SURFACE_ADDRESS_INUSE_L__VI = 0x4625; +constexpr unsigned int mmUNP_GRPH_SURFACE_OFFSET_X_C__VI = 0x4619; +constexpr unsigned int mmUNP_GRPH_SURFACE_OFFSET_X_L__VI = 0x4618; +constexpr unsigned int mmUNP_GRPH_SURFACE_OFFSET_Y_C__VI = 0x461B; +constexpr unsigned int mmUNP_GRPH_SURFACE_OFFSET_Y_L__VI = 0x461A; +constexpr unsigned int mmUNP_GRPH_SWAP_CNTL__VI = 0x4605; +constexpr unsigned int mmUNP_GRPH_UPDATE__VI = 0x4624; +constexpr unsigned int mmUNP_GRPH_X_END_C__VI = 0x4621; +constexpr unsigned int mmUNP_GRPH_X_END_L__VI = 0x4620; +constexpr unsigned int mmUNP_GRPH_X_START_C__VI = 0x461D; +constexpr unsigned int mmUNP_GRPH_X_START_L__VI = 0x461C; +constexpr unsigned int mmUNP_GRPH_Y_END_C__VI = 0x4623; +constexpr unsigned int mmUNP_GRPH_Y_END_L__VI = 0x4622; +constexpr unsigned int mmUNP_GRPH_Y_START_C__VI = 0x461F; +constexpr unsigned int mmUNP_GRPH_Y_START_L__VI = 0x461E; +constexpr unsigned int mmUNP_HW_ROTATION__VI = 0x4635; +constexpr unsigned int mmUNP_LB_DATA_GAP_BETWEEN_CHUNK__VI = 0x4634; +constexpr unsigned int mmUNP_TEST_DEBUG_DATA__VI = 0x4639; +constexpr unsigned int mmUNP_TEST_DEBUG_INDEX__VI = 0x4638; +constexpr unsigned int mmUVD_CGC_UDEC_STATUS__VI = 0x3D2D; +constexpr unsigned int mmUVD_JPEG_ADDR_CONFIG__VI = 0x3A1F; +constexpr unsigned int mmUVD_LMI_RBC_IB_64BIT_BAR_HIGH__VI = 0x3C66; +constexpr unsigned int mmUVD_LMI_RBC_IB_64BIT_BAR_LOW__VI = 0x3C67; +constexpr unsigned int mmUVD_LMI_RBC_IB_VMID__VI = 0x3DA1; +constexpr unsigned int mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH__VI = 0x3C68; +constexpr unsigned int mmUVD_LMI_RBC_RB_64BIT_BAR_LOW__VI = 0x3C69; +constexpr unsigned int mmUVD_LMI_RBC_RB_VMID__VI = 0x3DA3; +constexpr unsigned int mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH__VI = 0x3C5E; +constexpr unsigned int mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW__VI = 0x3C5F; +constexpr unsigned int mmUVD_MIF_CURR_ADDR_CONFIG__VI = 0x3992; +constexpr unsigned int mmUVD_MIF_RECON1_ADDR_CONFIG__VI = 0x39C5; +constexpr unsigned int mmUVD_MIF_REF_ADDR_CONFIG__VI = 0x3993; +constexpr unsigned int mmUVD_PGFSM_CONFIG__VI = 0x38C0; +constexpr unsigned int mmUVD_PGFSM_READ_TILE1__VI = 0x38C2; +constexpr unsigned int mmUVD_PGFSM_READ_TILE2__VI = 0x38C3; +constexpr unsigned int mmUVD_PGFSM_READ_TILE3__VI = 0x38C5; +constexpr unsigned int mmUVD_PGFSM_READ_TILE4__VI = 0x38C6; +constexpr unsigned int mmUVD_PGFSM_READ_TILE5__VI = 0x38C8; +constexpr unsigned int mmUVD_PGFSM_READ_TILE6__VI = 0x38EE; +constexpr unsigned int mmUVD_PGFSM_READ_TILE7__VI = 0x38EF; +constexpr unsigned int mmUVD_POWER_STATUS__VI = 0x38C4; +constexpr unsigned int mmUVD_SUVD_CGC_CTRL__VI = 0x3BE6; +constexpr unsigned int mmUVD_SUVD_CGC_GATE__VI = 0x3BE4; +constexpr unsigned int mmUVD_SUVD_CGC_STATUS__VI = 0x3BE5; +constexpr unsigned int mmUVD_UDEC_ADDR_CONFIG__VI = 0x3BD3; +constexpr unsigned int mmUVD_UDEC_DBW_ADDR_CONFIG__VI = 0x3BD5; +constexpr unsigned int mmUVD_UDEC_DB_ADDR_CONFIG__VI = 0x3BD4; +constexpr unsigned int mmVCE_LMI_CACHE_CTRL__VI = 0x85BD; +constexpr unsigned int mmVCE_LMI_CTRL__VI = 0x85A6; +constexpr unsigned int mmVCE_LMI_CTRL2__VI = 0x859D; +constexpr unsigned int mmVCE_LMI_SWAP_CNTL__VI = 0x85AD; +constexpr unsigned int mmVCE_LMI_SWAP_CNTL1__VI = 0x85AE; +constexpr unsigned int mmVCE_LMI_SWAP_CNTL2__VI = 0x85B3; +constexpr unsigned int mmVCE_LMI_SWAP_CNTL3__VI = 0x859E; +constexpr unsigned int mmVCE_LMI_VCPU_CACHE_40BIT_BAR__VI = 0x8597; +constexpr unsigned int mmVCE_RB_ARB_CTRL__VI = 0x809F; +constexpr unsigned int mmVCE_RB_BASE_HI__VI = 0x8061; +constexpr unsigned int mmVCE_RB_BASE_HI2__VI = 0x805C; +constexpr unsigned int mmVCE_RB_BASE_HI3__VI = 0x80D5; +constexpr unsigned int mmVCE_RB_BASE_LO__VI = 0x8060; +constexpr unsigned int mmVCE_RB_BASE_LO2__VI = 0x805B; +constexpr unsigned int mmVCE_RB_BASE_LO3__VI = 0x80D4; +constexpr unsigned int mmVCE_RB_RPTR__VI = 0x8063; +constexpr unsigned int mmVCE_RB_RPTR2__VI = 0x805E; +constexpr unsigned int mmVCE_RB_RPTR3__VI = 0x80D7; +constexpr unsigned int mmVCE_RB_SIZE__VI = 0x8062; +constexpr unsigned int mmVCE_RB_SIZE2__VI = 0x805D; +constexpr unsigned int mmVCE_RB_SIZE3__VI = 0x80D6; +constexpr unsigned int mmVCE_RB_WPTR__VI = 0x8064; +constexpr unsigned int mmVCE_RB_WPTR2__VI = 0x805F; +constexpr unsigned int mmVCE_RB_WPTR3__VI = 0x80D8; +constexpr unsigned int mmVCE_SOFT_RESET__VI = 0x8048; +constexpr unsigned int mmVCE_STATUS__VI = 0x8001; +constexpr unsigned int mmVCE_SYS_INT_ACK__VI = 0x8541; +constexpr unsigned int mmVCE_SYS_INT_EN__VI = 0x8540; +constexpr unsigned int mmVCE_SYS_INT_STATUS__VI = 0x8541; +constexpr unsigned int mmVCE_UENC_DMA_DCLK_CTRL__VI = 0x8390; +constexpr unsigned int mmVCE_VCPU_CACHE_OFFSET0__VI = 0x8009; +constexpr unsigned int mmVCE_VCPU_CACHE_OFFSET1__VI = 0x800B; +constexpr unsigned int mmVCE_VCPU_CACHE_OFFSET2__VI = 0x800D; +constexpr unsigned int mmVCE_VCPU_CACHE_SIZE0__VI = 0x800A; +constexpr unsigned int mmVCE_VCPU_CACHE_SIZE1__VI = 0x800C; +constexpr unsigned int mmVCE_VCPU_CACHE_SIZE2__VI = 0x800E; +constexpr unsigned int mmVCE_VCPU_CNTL__VI = 0x8005; +constexpr unsigned int mmVGA25_PPLL_ANALOG__VI = 0x171B; +constexpr unsigned int mmVGA25_PPLL_FB_DIV__VI = 0x1715; +constexpr unsigned int mmVGA25_PPLL_POST_DIV__VI = 0x1718; +constexpr unsigned int mmVGA25_PPLL_REF_DIV__VI = 0x1712; +constexpr unsigned int mmVGA28_PPLL_ANALOG__VI = 0x171C; +constexpr unsigned int mmVGA28_PPLL_FB_DIV__VI = 0x1716; +constexpr unsigned int mmVGA28_PPLL_POST_DIV__VI = 0x1719; +constexpr unsigned int mmVGA28_PPLL_REF_DIV__VI = 0x1713; +constexpr unsigned int mmVGA41_PPLL_ANALOG__VI = 0x171D; +constexpr unsigned int mmVGA41_PPLL_FB_DIV__VI = 0x1717; +constexpr unsigned int mmVGA41_PPLL_POST_DIV__VI = 0x171A; +constexpr unsigned int mmVGA41_PPLL_REF_DIV__VI = 0x1714; +constexpr unsigned int mmVGT_DISPATCH_DRAW_INDEX__VI = 0xA2DD; +constexpr unsigned int mmVGT_TESS_DISTRIBUTION__VI = 0xA2D4; +constexpr unsigned int mmVIEWPORT_START_SECONDARY__VI = 0x1B5B; +constexpr unsigned int mmVM_INIT_STATUS__VI = 0x14D3; +constexpr unsigned int mmVM_L2_BANK_SELECT_RESERVED_CID__VI = 0x0579; +constexpr unsigned int mmVM_L2_BANK_SELECT_RESERVED_CID2__VI = 0x057A; +constexpr unsigned int mmVM_L2_CNTL4__VI = 0x0578; +constexpr unsigned int mmWB_DBG_MODE__VI = 0x5E31; +constexpr unsigned int mmWB_DEBUG_CTRL__VI = 0x5E30; +constexpr unsigned int mmWB_EC_CONFIG__VI = 0x5E19; +constexpr unsigned int mmWB_ENABLE__VI = 0x5E18; +constexpr unsigned int mmWB_HW_DEBUG__VI = 0x5E32; +constexpr unsigned int mmWB_SOFT_RESET__VI = 0x5E36; +constexpr unsigned int mmWD_QOS__VI = 0x2242; +constexpr unsigned int mmXDMA_AON_TEST_DEBUG_DATA__VI = 0x03FD; +constexpr unsigned int mmXDMA_AON_TEST_DEBUG_INDEX__VI = 0x03FC; +constexpr unsigned int mmXDMA_CLOCK_GATING_CNTL__VI = 0x03E4; +constexpr unsigned int mmXDMA_IF_BIF_STATUS__VI = 0x03E7; +constexpr unsigned int mmXDMA_IF_STATUS__VI = 0x03E9; +constexpr unsigned int mmXDMA_INTERRUPT__VI = 0x03E3; +constexpr unsigned int mmXDMA_LOCAL_SURFACE_TILING1__VI = 0x03E1; +constexpr unsigned int mmXDMA_LOCAL_SURFACE_TILING2__VI = 0x03E2; +constexpr unsigned int mmXDMA_MC_PCIE_CLIENT_CONFIG__VI = 0x03E0; +constexpr unsigned int mmXDMA_MEM_POWER_CNTL__VI = 0x03E6; +constexpr unsigned int mmXDMA_MSTR_CACHE__VI = 0x040A; +constexpr unsigned int mmXDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0408; +constexpr unsigned int mmXDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0409; +constexpr unsigned int mmXDMA_MSTR_CHANNEL_DIM__VI = 0x0402; +constexpr unsigned int mmXDMA_MSTR_CHANNEL_START__VI = 0x040B; +constexpr unsigned int mmXDMA_MSTR_CMD_URGENT_CNTL__VI = 0x03F2; +constexpr unsigned int mmXDMA_MSTR_CNTL__VI = 0x03EC; +constexpr unsigned int mmXDMA_MSTR_HEIGHT__VI = 0x0403; +constexpr unsigned int mmXDMA_MSTR_LOCAL_SURFACE_BASE_ADDR__VI = 0x03EF; +constexpr unsigned int mmXDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_HIGH__VI = 0x03F0; +constexpr unsigned int mmXDMA_MSTR_LOCAL_SURFACE_PITCH__VI = 0x03F1; +constexpr unsigned int mmXDMA_MSTR_MEM_CLIENT_CONFIG__VI = 0x03EE; +constexpr unsigned int mmXDMA_MSTR_MEM_NACK_STATUS__VI = 0x03F6; +constexpr unsigned int mmXDMA_MSTR_MEM_URGENT_CNTL__VI = 0x03F3; +constexpr unsigned int mmXDMA_MSTR_PCIE_NACK_STATUS__VI = 0x03F5; +constexpr unsigned int mmXDMA_MSTR_PERFMEAS_CNTL__VI = 0x040F; +constexpr unsigned int mmXDMA_MSTR_PERFMEAS_STATUS__VI = 0x040E; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_CACHE__VI = 0x040A; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0408; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0409; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_CHANNEL_DIM__VI = 0x0402; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_CHANNEL_START__VI = 0x040B; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_HEIGHT__VI = 0x0403; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_PERFMEAS_CNTL__VI = 0x040F; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_PERFMEAS_STATUS__VI = 0x040E; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_PIPE_CNTL__VI = 0x0400; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_READ_COMMAND__VI = 0x0401; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0406; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0407; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0404; +constexpr unsigned int mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0405; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_CACHE__VI = 0x041A; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0418; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0419; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_CHANNEL_DIM__VI = 0x0412; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_CHANNEL_START__VI = 0x041B; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_HEIGHT__VI = 0x0413; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_PERFMEAS_CNTL__VI = 0x041F; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_PERFMEAS_STATUS__VI = 0x041E; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_PIPE_CNTL__VI = 0x0410; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_READ_COMMAND__VI = 0x0411; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0416; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0417; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0414; +constexpr unsigned int mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0415; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_CACHE__VI = 0x042A; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0428; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0429; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_CHANNEL_DIM__VI = 0x0422; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_CHANNEL_START__VI = 0x042B; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_HEIGHT__VI = 0x0423; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_PERFMEAS_CNTL__VI = 0x042F; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_PERFMEAS_STATUS__VI = 0x042E; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_PIPE_CNTL__VI = 0x0420; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_READ_COMMAND__VI = 0x0421; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0426; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0427; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0424; +constexpr unsigned int mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0425; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_CACHE__VI = 0x043A; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0438; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0439; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_CHANNEL_DIM__VI = 0x0432; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_CHANNEL_START__VI = 0x043B; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_HEIGHT__VI = 0x0433; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_PERFMEAS_CNTL__VI = 0x043F; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_PERFMEAS_STATUS__VI = 0x043E; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_PIPE_CNTL__VI = 0x0430; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_READ_COMMAND__VI = 0x0431; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0436; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0437; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0434; +constexpr unsigned int mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0435; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_CACHE__VI = 0x044A; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0448; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0449; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_CHANNEL_DIM__VI = 0x0442; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_CHANNEL_START__VI = 0x044B; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_HEIGHT__VI = 0x0443; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_PERFMEAS_CNTL__VI = 0x044F; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_PERFMEAS_STATUS__VI = 0x044E; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_PIPE_CNTL__VI = 0x0440; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_READ_COMMAND__VI = 0x0441; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0446; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0447; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0444; +constexpr unsigned int mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0445; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_CACHE__VI = 0x045A; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_CACHE_BASE_ADDR__VI = 0x0458; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_CACHE_BASE_ADDR_HIGH__VI = 0x0459; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_CHANNEL_DIM__VI = 0x0452; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_CHANNEL_START__VI = 0x045B; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_HEIGHT__VI = 0x0453; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_PERFMEAS_CNTL__VI = 0x045F; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_PERFMEAS_STATUS__VI = 0x045E; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_PIPE_CNTL__VI = 0x0450; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_READ_COMMAND__VI = 0x0451; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0456; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0457; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0454; +constexpr unsigned int mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0455; +constexpr unsigned int mmXDMA_MSTR_PIPE_CNTL__VI = 0x0400; +constexpr unsigned int mmXDMA_MSTR_READ_COMMAND__VI = 0x0401; +constexpr unsigned int mmXDMA_MSTR_REMOTE_GPU_ADDRESS__VI = 0x0406; +constexpr unsigned int mmXDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0407; +constexpr unsigned int mmXDMA_MSTR_REMOTE_SURFACE_BASE__VI = 0x0404; +constexpr unsigned int mmXDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__VI = 0x0405; +constexpr unsigned int mmXDMA_MSTR_STATUS__VI = 0x03ED; +constexpr unsigned int mmXDMA_MSTR_VSYNC_GSL_CHECK__VI = 0x03F7; +constexpr unsigned int mmXDMA_PERF_MEAS_STATUS__VI = 0x03E8; +constexpr unsigned int mmXDMA_PG_CONTROL__VI = 0x03F9; +constexpr unsigned int mmXDMA_PG_STATUS__VI = 0x03FB; +constexpr unsigned int mmXDMA_PG_WDATA__VI = 0x03FA; +constexpr unsigned int mmXDMA_RBBMIF_RDWR_CNTL__VI = 0x03F8; +constexpr unsigned int mmXDMA_SLV_CHANNEL0_XDMA_SLV_CHANNEL_CNTL__VI = 0x0470; +constexpr unsigned int mmXDMA_SLV_CHANNEL0_XDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0471; +constexpr unsigned int mmXDMA_SLV_CHANNEL0_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0472; +constexpr unsigned int mmXDMA_SLV_CHANNEL1_XDMA_SLV_CHANNEL_CNTL__VI = 0x0478; +constexpr unsigned int mmXDMA_SLV_CHANNEL1_XDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0479; +constexpr unsigned int mmXDMA_SLV_CHANNEL1_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x047A; +constexpr unsigned int mmXDMA_SLV_CHANNEL2_XDMA_SLV_CHANNEL_CNTL__VI = 0x0480; +constexpr unsigned int mmXDMA_SLV_CHANNEL2_XDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0481; +constexpr unsigned int mmXDMA_SLV_CHANNEL2_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0482; +constexpr unsigned int mmXDMA_SLV_CHANNEL3_XDMA_SLV_CHANNEL_CNTL__VI = 0x0488; +constexpr unsigned int mmXDMA_SLV_CHANNEL3_XDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0489; +constexpr unsigned int mmXDMA_SLV_CHANNEL3_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x048A; +constexpr unsigned int mmXDMA_SLV_CHANNEL4_XDMA_SLV_CHANNEL_CNTL__VI = 0x0490; +constexpr unsigned int mmXDMA_SLV_CHANNEL4_XDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0491; +constexpr unsigned int mmXDMA_SLV_CHANNEL4_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0492; +constexpr unsigned int mmXDMA_SLV_CHANNEL5_XDMA_SLV_CHANNEL_CNTL__VI = 0x0498; +constexpr unsigned int mmXDMA_SLV_CHANNEL5_XDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0499; +constexpr unsigned int mmXDMA_SLV_CHANNEL5_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x049A; +constexpr unsigned int mmXDMA_SLV_CHANNEL_CNTL__VI = 0x0470; +constexpr unsigned int mmXDMA_SLV_CNTL__VI = 0x0460; +constexpr unsigned int mmXDMA_SLV_MEM_CLIENT_CONFIG__VI = 0x0461; +constexpr unsigned int mmXDMA_SLV_MEM_NACK_STATUS__VI = 0x0469; +constexpr unsigned int mmXDMA_SLV_PCIE_NACK_STATUS__VI = 0x0468; +constexpr unsigned int mmXDMA_SLV_RDRET_BUF_STATUS__VI = 0x046A; +constexpr unsigned int mmXDMA_SLV_READ_LATENCY_AVE__VI = 0x0467; +constexpr unsigned int mmXDMA_SLV_READ_LATENCY_MINMAX__VI = 0x0466; +constexpr unsigned int mmXDMA_SLV_READ_LATENCY_TIMER__VI = 0x046B; +constexpr unsigned int mmXDMA_SLV_READ_URGENT_CNTL__VI = 0x0463; +constexpr unsigned int mmXDMA_SLV_REMOTE_GPU_ADDRESS__VI = 0x0471; +constexpr unsigned int mmXDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__VI = 0x0472; +constexpr unsigned int mmXDMA_SLV_SLS_PITCH__VI = 0x0462; +constexpr unsigned int mmXDMA_SLV_WB_RATE_CNTL__VI = 0x0465; +constexpr unsigned int mmXDMA_SLV_WRITE_URGENT_CNTL__VI = 0x0464; +constexpr unsigned int mmXDMA_TEST_DEBUG_DATA__VI = 0x03EB; +constexpr unsigned int mmXDMA_TEST_DEBUG_INDEX__VI = 0x03EA; +#define offset_HEADER__VI +constexpr unsigned int pciMSI_MASK__VI = 0x002B; +constexpr unsigned int pciMSI_MASK_64__VI = 0x002C; +constexpr unsigned int pciMSI_PENDING__VI = 0x002C; +constexpr unsigned int pciMSI_PENDING_64__VI = 0x002D; +constexpr unsigned int pciPCIE_ARI_CAP__VI = 0x00CB; +constexpr unsigned int pciPCIE_ARI_CNTL__VI = 0x00CB; +constexpr unsigned int pciPCIE_ARI_ENH_CAP_LIST__VI = 0x00CA; +constexpr unsigned int pciPCIE_LTR_CAP__VI = 0x00C9; +constexpr unsigned int pciPCIE_LTR_ENH_CAP_LIST__VI = 0x00C8; +constexpr unsigned int pciPCIE_MC_ADDR0__VI = 0x00BE; +constexpr unsigned int pciPCIE_MC_ADDR1__VI = 0x00BF; +constexpr unsigned int pciPCIE_MC_BLOCK_ALL0__VI = 0x00C2; +constexpr unsigned int pciPCIE_MC_BLOCK_ALL1__VI = 0x00C3; +constexpr unsigned int pciPCIE_MC_BLOCK_UNTRANSLATED_0__VI = 0x00C4; +constexpr unsigned int pciPCIE_MC_BLOCK_UNTRANSLATED_1__VI = 0x00C5; +constexpr unsigned int pciPCIE_MC_CAP__VI = 0x00BD; +constexpr unsigned int pciPCIE_MC_CNTL__VI = 0x00BD; +constexpr unsigned int pciPCIE_MC_ENH_CAP_LIST__VI = 0x00BC; +constexpr unsigned int pciPCIE_MC_RCV0__VI = 0x00C0; +constexpr unsigned int pciPCIE_MC_RCV1__VI = 0x00C1; +constexpr unsigned int pciPCIE_SRIOV_CAP__VI = 0x00CD; +constexpr unsigned int pciPCIE_SRIOV_CONTROL__VI = 0x00CE; +constexpr unsigned int pciPCIE_SRIOV_ENH_CAP_LIST__VI = 0x00CC; +constexpr unsigned int pciPCIE_SRIOV_FIRST_VF_OFFSET__VI = 0x00D1; +constexpr unsigned int pciPCIE_SRIOV_FUNC_DEP_LINK__VI = 0x00D0; +constexpr unsigned int pciPCIE_SRIOV_INITIAL_VFS__VI = 0x00CF; +constexpr unsigned int pciPCIE_SRIOV_NUM_VFS__VI = 0x00D0; +constexpr unsigned int pciPCIE_SRIOV_STATUS__VI = 0x00CE; +constexpr unsigned int pciPCIE_SRIOV_SUPPORTED_PAGE_SIZE__VI = 0x00D3; +constexpr unsigned int pciPCIE_SRIOV_SYSTEM_PAGE_SIZE__VI = 0x00D4; +constexpr unsigned int pciPCIE_SRIOV_TOTAL_VFS__VI = 0x00CF; +constexpr unsigned int pciPCIE_SRIOV_VF_BASE_ADDR_0__VI = 0x00D5; +constexpr unsigned int pciPCIE_SRIOV_VF_BASE_ADDR_1__VI = 0x00D6; +constexpr unsigned int pciPCIE_SRIOV_VF_BASE_ADDR_2__VI = 0x00D7; +constexpr unsigned int pciPCIE_SRIOV_VF_BASE_ADDR_3__VI = 0x00D8; +constexpr unsigned int pciPCIE_SRIOV_VF_BASE_ADDR_4__VI = 0x00D9; +constexpr unsigned int pciPCIE_SRIOV_VF_BASE_ADDR_5__VI = 0x00DA; +constexpr unsigned int pciPCIE_SRIOV_VF_DEVICE_ID__VI = 0x00D2; +constexpr unsigned int pciPCIE_SRIOV_VF_MIGRATION_STATE_ARRAY_OFFSET__VI = 0x00DB; +constexpr unsigned int pciPCIE_SRIOV_VF_STRIDE__VI = 0x00D1; +constexpr unsigned int pciPCIE_TPH_REQR_CAP__VI = 0x00B9; +constexpr unsigned int pciPCIE_TPH_REQR_CNTL__VI = 0x00BA; +constexpr unsigned int pciPCIE_TPH_REQR_ENH_CAP_LIST__VI = 0x00B8; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC_ENH_CAP_LIST_GPUIOV__VI = 0x0100; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC_HDR_GPUIOV__VI = 0x0101; +constexpr unsigned int pciPCIE_VENDOR_SPECIFIC_HDR_GPUIOV_RESET_CONTROL__VI = 0x0105; +} // inline namespace Chip +} // namespace Gfx6 +} // namespace Pal + +#endif diff --git a/externals/gcn/include/gcn/si_ci_vi_merged_pm4_it_opcodes.h b/externals/gcn/include/gcn/si_ci_vi_merged_pm4_it_opcodes.h new file mode 100644 index 000000000..0c2ac3abc --- /dev/null +++ b/externals/gcn/include/gcn/si_ci_vi_merged_pm4_it_opcodes.h @@ -0,0 +1,117 @@ +/* + *********************************************************************************************************************** + * + * Copyright (c) 2015-2021 Advanced Micro Devices, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************************************************************************/ + +#ifndef PM4_IT_OPCODES_H +#define PM4_IT_OPCODES_H + +enum IT_OpCodeType { + IT_NOP = 0x10, + IT_SET_BASE = 0x11, + IT_CLEAR_STATE = 0x12, + IT_INDEX_BUFFER_SIZE = 0x13, + IT_DISPATCH_DIRECT = 0x15, + IT_DISPATCH_INDIRECT = 0x16, + IT_ATOMIC_GDS = 0x1D, + IT_ATOMIC = 0x1E, + IT_OCCLUSION_QUERY = 0x1F, + IT_SET_PREDICATION = 0x20, + IT_REG_RMW = 0x21, + IT_COND_EXEC = 0x22, + IT_PRED_EXEC = 0x23, + IT_DRAW_INDIRECT = 0x24, + IT_DRAW_INDEX_INDIRECT = 0x25, + IT_INDEX_BASE = 0x26, + IT_DRAW_INDEX_2 = 0x27, + IT_CONTEXT_CONTROL = 0x28, + IT_INDEX_TYPE = 0x2A, + IT_DRAW_INDIRECT_MULTI = 0x2C, + IT_DRAW_INDEX_AUTO = 0x2D, + IT_NUM_INSTANCES = 0x2F, + IT_DRAW_INDEX_MULTI_AUTO = 0x30, + IT_INDIRECT_BUFFER_CNST = 0x33, + IT_STRMOUT_BUFFER_UPDATE = 0x34, + IT_DRAW_INDEX_OFFSET_2 = 0x35, + IT_WRITE_DATA = 0x37, + IT_DRAW_INDEX_INDIRECT_MULTI = 0x38, + IT_MEM_SEMAPHORE = 0x39, + IT_COPY_DW__SI__CI = 0x3B, + IT_WAIT_REG_MEM = 0x3C, + IT_INDIRECT_BUFFER = 0x3F, + IT_COND_INDIRECT_BUFFER = 0x3F, + IT_COPY_DATA = 0x40, + IT_CP_DMA = 0x41, + IT_PFP_SYNC_ME = 0x42, + IT_SURFACE_SYNC = 0x43, + IT_COND_WRITE = 0x45, + IT_EVENT_WRITE = 0x46, + IT_EVENT_WRITE_EOP = 0x47, + IT_EVENT_WRITE_EOS = 0x48, + IT_PREAMBLE_CNTL = 0x4A, + IT_CONTEXT_REG_RMW = 0x51, + IT_LOAD_SH_REG = 0x5F, + IT_LOAD_CONFIG_REG = 0x60, + IT_LOAD_CONTEXT_REG = 0x61, + IT_SET_CONFIG_REG = 0x68, + IT_SET_CONTEXT_REG = 0x69, + IT_SET_CONTEXT_REG_INDIRECT = 0x73, + IT_SET_SH_REG = 0x76, + IT_SET_SH_REG_OFFSET = 0x77, + IT_SCRATCH_RAM_WRITE = 0x7D, + IT_SCRATCH_RAM_READ = 0x7E, + IT_LOAD_CONST_RAM = 0x80, + IT_WRITE_CONST_RAM = 0x81, + IT_DUMP_CONST_RAM = 0x83, + IT_INCREMENT_CE_COUNTER = 0x84, + IT_INCREMENT_DE_COUNTER = 0x85, + IT_WAIT_ON_CE_COUNTER = 0x86, + IT_WAIT_ON_DE_COUNTER__SI = 0x87, + IT_WAIT_ON_DE_COUNTER_DIFF = 0x88, + IT_SWITCH_BUFFER = 0x8B, + IT_DRAW_PREAMBLE__CI__VI = 0x36, + IT_RELEASE_MEM__CI__VI = 0x49, + IT_DMA_DATA__CI__VI = 0x50, + IT_ACQUIRE_MEM__CI__VI = 0x58, + IT_REWIND__CI__VI = 0x59, + IT_LOAD_UCONFIG_REG__CI__VI = 0x5E, + IT_SET_QUEUE_REG__CI__VI = 0x78, + IT_SET_UCONFIG_REG__CI__VI = 0x79, + IT_INDEX_ATTRIBUTES_INDIRECT__CI__VI = 0x91, + IT_SET_SH_REG_INDEX__CI__VI = 0x9B, + IT_SET_RESOURCES__CI__VI = 0xA0, + IT_MAP_PROCESS__CI__VI = 0xA1, + IT_MAP_QUEUES__CI__VI = 0xA2, + IT_UNMAP_QUEUES__CI__VI = 0xA3, + IT_QUERY_STATUS__CI__VI = 0xA4, + IT_RUN_LIST__CI__VI = 0xA5, + IT_LOAD_SH_REG_INDEX__VI = 0x63, + IT_LOAD_CONTEXT_REG_INDEX__VI = 0x9F, + IT_DUMP_CONST_RAM_OFFSET__VI = 0x9E, +}; + +#define PM4_TYPE_0 0 +#define PM4_TYPE_2 2 +#define PM4_TYPE_3 3 + +#endif diff --git a/externals/glslang b/externals/glslang index 12cbda959..46ef757e0 160000 --- a/externals/glslang +++ b/externals/glslang @@ -1 +1 @@ -Subproject commit 12cbda959b6df2af119a76a73ff906c2bed36884 +Subproject commit 46ef757e048e760b46601e6e77ae0cb72c97bd2f diff --git a/externals/magic_enum b/externals/magic_enum index dae6bbf16..126539e13 160000 --- a/externals/magic_enum +++ b/externals/magic_enum @@ -1 +1 @@ -Subproject commit dae6bbf16c363e9ead4e628a47fdb02956a634f3 +Subproject commit 126539e13cccdc2e75ce770e94f3c26403099fa5 diff --git a/externals/pugixml b/externals/pugixml new file mode 160000 index 000000000..3b1718437 --- /dev/null +++ b/externals/pugixml @@ -0,0 +1 @@ +Subproject commit 3b17184379fcaaeb7f1fbe08018b7fedf2640b3b diff --git a/externals/robin-map b/externals/robin-map index 2c48a1a50..fe845fd78 160000 --- a/externals/robin-map +++ b/externals/robin-map @@ -1 +1 @@ -Subproject commit 2c48a1a50203bbaf1e3d0d64c5d726d56f8d3bb3 +Subproject commit fe845fd7852ef541c5479ae23b3d36b57f8608ee diff --git a/externals/sdl3 b/externals/sdl3 index 4cc3410dc..0548050fc 160000 --- a/externals/sdl3 +++ b/externals/sdl3 @@ -1 +1 @@ -Subproject commit 4cc3410dce50cefce98d3cf3cf1bc8eca83b862a +Subproject commit 0548050fc5a4edf1f47c3633c2cd06d8762b5532 diff --git a/externals/toml11 b/externals/toml11 index 4b7401272..d050c6b13 160000 --- a/externals/toml11 +++ b/externals/toml11 @@ -1 +1 @@ -Subproject commit 4b740127230472779c4a4d71e1a75aaa3a367a2d +Subproject commit d050c6b137199666cae75c2628a75d63b49b1c22 diff --git a/externals/vma b/externals/vma index e1bdbca9b..1c35ba99c 160000 --- a/externals/vma +++ b/externals/vma @@ -1 +1 @@ -Subproject commit e1bdbca9baf4d682fb6066b380f4aa4a7bdbb58a +Subproject commit 1c35ba99ce775f8342d87a83a3f0f696f99c2a39 diff --git a/externals/vulkan-headers b/externals/vulkan-headers index d205aff40..29f979ee5 160000 --- a/externals/vulkan-headers +++ b/externals/vulkan-headers @@ -1 +1 @@ -Subproject commit d205aff40b4e15d4c568523ee6a26f85138126d9 +Subproject commit 29f979ee5aa58b7b005f805ea8df7a855c39ff37 diff --git a/externals/xxhash b/externals/xxhash index dbea33e47..3e321b440 160000 --- a/externals/xxhash +++ b/externals/xxhash @@ -1 +1 @@ -Subproject commit dbea33e47e7c0fe0b7c8592cd931c7430c1f130d +Subproject commit 3e321b4407318ac1348c0b80fb6fbae8c81ad5fa diff --git a/scripts/file_formats/sfo.hexpat b/scripts/file_formats/sfo.hexpat new file mode 100644 index 000000000..cfc1f8789 --- /dev/null +++ b/scripts/file_formats/sfo.hexpat @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +import std.io; +import std.sys; + +struct Header { + u32 magic; + u32 version; + u32 key_table_offset; + u32 data_table_offset; + u32 index_table_entries; +}; + +struct KeyEntry { + char name[]; +} [[inline]]; + +struct DataEntry { + if (fmt == 0x0404) { + u32 int_value; + } else if(fmt == 0x0004) { + char bin_value[size]; + } else if(fmt == 0x0204) { + char str_value[size]; + } else { + std::warning("unknown fmt type"); + } +} [[inline]]; + +struct IndexEntry { + u16 key_offset; + u16 param_fmt; + u32 param_len; + u32 param_max_len; + u32 data_offset; +}; + +struct Entry { + u64 begin = $; + IndexEntry index; + KeyEntry key @ KeyTableOffset + index.key_offset; + DataEntry data @ DataTableOffset + index.data_offset; + u8 data_empty[index.param_max_len - index.param_len] @ DataTableOffset + index.data_offset + index.param_len; + $ = begin + sizeof(IndexEntry); +}; + +Header header @ 0; +std::assert(header.magic == 0x46535000, "Miss match magic"); +std::assert(header.version == 0x00000101, "Miss match version"); + +Entry list[header.index_table_entries] @ 0x14; \ No newline at end of file diff --git a/src/audio_core/sdl_audio.cpp b/src/audio_core/sdl_audio.cpp index f544c52f9..894f5da55 100644 --- a/src/audio_core/sdl_audio.cpp +++ b/src/audio_core/sdl_audio.cpp @@ -14,7 +14,9 @@ namespace Audio { -int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, +constexpr int AUDIO_STREAM_BUFFER_THRESHOLD = 65536; // Define constant for buffer threshold + +s32 SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, Libraries::AudioOut::OrbisAudioOutParamFormat format) { using Libraries::AudioOut::OrbisAudioOutParamFormat; std::unique_lock lock{m_mutex}; @@ -80,7 +82,7 @@ int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, SDL_zero(fmt); fmt.format = sampleFormat; fmt.channels = port.channels_num; - fmt.freq = 48000; + fmt.freq = freq; // Set frequency from the argument port.stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &fmt, NULL, NULL); SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(port.stream)); @@ -88,7 +90,8 @@ int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, } } - return -1; // all ports are used + LOG_ERROR(Lib_AudioOut, "Audio ports are full"); + return ORBIS_AUDIO_OUT_ERROR_PORT_FULL; // all ports are used } s32 SDLAudio::AudioOutOutput(s32 handle, const void* ptr) { @@ -97,27 +100,28 @@ s32 SDLAudio::AudioOutOutput(s32 handle, const void* ptr) { if (!port.isOpen) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } - if (ptr == nullptr) { - return 0; - } - // TODO mixing channels - int result = SDL_PutAudioStreamData(port.stream, ptr, - port.samples_num * port.sample_size * port.channels_num); - // TODO find a correct value 8192 is estimated - while (SDL_GetAudioStreamAvailable(port.stream) > 65536) { + + const size_t data_size = port.samples_num * port.sample_size * port.channels_num; + + SDL_bool result = SDL_PutAudioStreamData(port.stream, ptr, data_size); + + lock.unlock(); // Unlock only after necessary operations + + while (SDL_GetAudioStreamAvailable(port.stream) > AUDIO_STREAM_BUFFER_THRESHOLD) { SDL_Delay(0); } - return result; + return result ? ORBIS_OK : -1; } -bool SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { +s32 SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { using Libraries::AudioOut::OrbisAudioOutParamFormat; std::shared_lock lock{m_mutex}; auto& port = portsOut[handle - 1]; if (!port.isOpen) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } + for (int i = 0; i < port.channels_num; i++, bitflag >>= 1u) { auto bit = bitflag & 0x1u; @@ -147,16 +151,16 @@ bool SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { } } - return true; + return ORBIS_OK; } -bool SDLAudio::AudioOutGetStatus(s32 handle, int* type, int* channels_num) { +s32 SDLAudio::AudioOutGetStatus(s32 handle, int* type, int* channels_num) { std::shared_lock lock{m_mutex}; auto& port = portsOut[handle - 1]; *type = port.type; *channels_num = port.channels_num; - return true; + return ORBIS_OK; } } // namespace Audio diff --git a/src/audio_core/sdl_audio.h b/src/audio_core/sdl_audio.h index 07e82145e..0d4783f19 100644 --- a/src/audio_core/sdl_audio.h +++ b/src/audio_core/sdl_audio.h @@ -14,11 +14,11 @@ public: SDLAudio() = default; virtual ~SDLAudio() = default; - int AudioOutOpen(int type, u32 samples_num, u32 freq, + s32 AudioOutOpen(int type, u32 samples_num, u32 freq, Libraries::AudioOut::OrbisAudioOutParamFormat format); s32 AudioOutOutput(s32 handle, const void* ptr); - bool AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume); - bool AudioOutGetStatus(s32 handle, int* type, int* channels_num); + s32 AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume); + s32 AudioOutGetStatus(s32 handle, int* type, int* channels_num); private: struct PortOut { @@ -33,8 +33,7 @@ private: bool isOpen = false; }; std::shared_mutex m_mutex; - std::array portsOut; // main up to 8 ports , BGM 1 port , voice up to 4 ports , - // personal up to 4 ports , padspk up to 5 ports , aux 1 port + std::array portsOut; }; } // namespace Audio diff --git a/src/common/alignment.h b/src/common/alignment.h index 367efb6bb..8480fae26 100644 --- a/src/common/alignment.h +++ b/src/common/alignment.h @@ -28,4 +28,16 @@ template return (value & 0x3FFF) == 0; } +template + requires std::is_integral_v +[[nodiscard]] constexpr bool Is64KBAligned(T value) { + return (value & 0xFFFF) == 0; +} + +template + requires std::is_integral_v +[[nodiscard]] constexpr bool Is2MBAligned(T value) { + return (value & 0x1FFFFF) == 0; +} + } // namespace Common diff --git a/src/common/config.cpp b/src/common/config.cpp index fb6ee120a..8ac3c694b 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -3,28 +3,52 @@ #include #include +#include #include +#include // for wstring support #include +#include "common/logging/formatter.h" +#include "common/path_util.h" #include "config.h" +namespace toml { +template +std::filesystem::path find_fs_path_or(const basic_value& v, const K& ky, + std::filesystem::path opt) { + try { + auto str = find(v, ky); + if (str.empty()) { + return opt; + } + std::u8string u8str{(char8_t*)&str.front(), (char8_t*)&str.back() + 1}; + return std::filesystem::path{u8str}; + } catch (...) { + return opt; + } +} +} // namespace toml + namespace Config { static bool isNeo = false; static bool isFullscreen = false; +static bool playBGM = false; +static int BGMvolume = 50; static u32 screenWidth = 1280; static u32 screenHeight = 720; static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select static std::string logFilter; static std::string logType = "async"; static std::string userName = "shadPS4"; +static std::string updateChannel; static bool useSpecialPad = false; static int specialPadClass = 1; static bool isDebugDump = false; static bool isShowSplash = false; +static bool isAutoUpdate = false; static bool isNullGpu = false; static bool shouldCopyGPUBuffers = false; static bool shouldDumpShaders = false; -static bool shouldDumpPM4 = false; static u32 vblankDivider = 1; static bool vkValidation = false; static bool vkValidationSync = false; @@ -34,7 +58,8 @@ static bool vkMarkers = false; static bool vkCrashDiagnostic = false; // Gui -std::string settings_install_dir = ""; +std::filesystem::path settings_install_dir = {}; +std::filesystem::path settings_addon_install_dir = {}; u32 main_window_geometry_x = 400; u32 main_window_geometry_y = 400; u32 main_window_geometry_w = 1280; @@ -62,6 +87,14 @@ bool isFullscreenMode() { return isFullscreen; } +bool getPlayBGM() { + return playBGM; +} + +int getBGMvolume() { + return BGMvolume; +} + u32 getScreenWidth() { return screenWidth; } @@ -86,6 +119,10 @@ std::string getUserName() { return userName; } +std::string getUpdateChannel() { + return updateChannel; +} + bool getUseSpecialPad() { return useSpecialPad; } @@ -102,6 +139,10 @@ bool showSplash() { return isShowSplash; } +bool autoUpdate() { + return isAutoUpdate; +} + bool nullGpu() { return isNullGpu; } @@ -114,10 +155,6 @@ bool dumpShaders() { return shouldDumpShaders; } -bool dumpPM4() { - return shouldDumpPM4; -} - bool isRdocEnabled() { return rdocEnable; } @@ -170,6 +207,10 @@ void setShowSplash(bool enable) { isShowSplash = enable; } +void setAutoUpdate(bool enable) { + isAutoUpdate = enable; +} + void setNullGpu(bool enable) { isNullGpu = enable; } @@ -182,10 +223,6 @@ void setDumpShaders(bool enable) { shouldDumpShaders = enable; } -void setDumpPM4(bool enable) { - shouldDumpPM4 = enable; -} - void setVkValidation(bool enable) { vkValidation = enable; } @@ -206,6 +243,14 @@ void setFullscreenMode(bool enable) { isFullscreen = enable; } +void setPlayBGM(bool enable) { + playBGM = enable; +} + +void setBGMvolume(int volume) { + BGMvolume = volume; +} + void setLanguage(u32 language) { m_language = language; } @@ -226,6 +271,10 @@ void setUserName(const std::string& type) { userName = type; } +void setUpdateChannel(const std::string& type) { + updateChannel = type; +} + void setUseSpecialPad(bool use) { useSpecialPad = use; } @@ -240,9 +289,12 @@ void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) { main_window_geometry_w = w; main_window_geometry_h = h; } -void setGameInstallDir(const std::string& dir) { +void setGameInstallDir(const std::filesystem::path& dir) { settings_install_dir = dir; } +void setAddonInstallDir(const std::filesystem::path& dir) { + settings_addon_install_dir = dir; +} void setMainWindowTheme(u32 theme) { mw_themes = theme; } @@ -296,9 +348,16 @@ u32 getMainWindowGeometryW() { u32 getMainWindowGeometryH() { return main_window_geometry_h; } -std::string getGameInstallDir() { +std::filesystem::path getGameInstallDir() { return settings_install_dir; } +std::filesystem::path getAddonInstallDir() { + if (settings_addon_install_dir.empty()) { + // Default for users without a config file or a config file from before this option existed + return Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "addcont"; + } + return settings_addon_install_dir; +} u32 getMainWindowTheme() { return mw_themes; } @@ -351,7 +410,10 @@ void load(const std::filesystem::path& path) { toml::value data; try { - data = toml::parse(path); + std::ifstream ifs; + ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit); + ifs.open(path, std::ios_base::binary); + data = toml::parse(ifs, std::string{fmt::UTF(path.filename().u8string()).data}); } catch (std::exception& ex) { fmt::print("Got exception trying to load config file. Exception: {}\n", ex.what()); return; @@ -361,10 +423,18 @@ void load(const std::filesystem::path& path) { isNeo = toml::find_or(general, "isPS4Pro", false); isFullscreen = toml::find_or(general, "Fullscreen", false); + playBGM = toml::find_or(general, "playBGM", false); + BGMvolume = toml::find_or(general, "BGMvolume", 50); logFilter = toml::find_or(general, "logFilter", ""); logType = toml::find_or(general, "logType", "sync"); userName = toml::find_or(general, "userName", "shadPS4"); + if (Common::isRelease) { + updateChannel = toml::find_or(general, "updateChannel", "Release"); + } else { + updateChannel = toml::find_or(general, "updateChannel", "Nightly"); + } isShowSplash = toml::find_or(general, "showSplash", true); + isAutoUpdate = toml::find_or(general, "autoUpdate", false); } if (data.contains("Input")) { @@ -382,7 +452,6 @@ void load(const std::filesystem::path& path) { isNullGpu = toml::find_or(gpu, "nullGpu", false); shouldCopyGPUBuffers = toml::find_or(gpu, "copyGPUBuffers", false); shouldDumpShaders = toml::find_or(gpu, "dumpShaders", false); - shouldDumpPM4 = toml::find_or(gpu, "dumpPM4", false); vblankDivider = toml::find_or(gpu, "vblankDivider", 1); } @@ -414,7 +483,8 @@ void load(const std::filesystem::path& path) { mw_themes = toml::find_or(gui, "theme", 0); m_window_size_W = toml::find_or(gui, "mw_width", 0); m_window_size_H = toml::find_or(gui, "mw_height", 0); - settings_install_dir = toml::find_or(gui, "installDir", ""); + settings_install_dir = toml::find_fs_path_or(gui, "installDir", {}); + settings_addon_install_dir = toml::find_fs_path_or(gui, "addonInstallDir", {}); main_window_geometry_x = toml::find_or(gui, "geometry_x", 0); main_window_geometry_y = toml::find_or(gui, "geometry_y", 0); main_window_geometry_w = toml::find_or(gui, "geometry_w", 0); @@ -438,25 +508,31 @@ void save(const std::filesystem::path& path) { std::error_code error; if (std::filesystem::exists(path, error)) { try { - data = toml::parse(path); + std::ifstream ifs; + ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit); + ifs.open(path, std::ios_base::binary); + data = toml::parse(ifs, std::string{fmt::UTF(path.filename().u8string()).data}); } catch (const std::exception& ex) { fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what()); return; } } else { if (error) { - fmt::print("Filesystem error accessing {} (error: {})\n", path.string(), - error.message().c_str()); + fmt::print("Filesystem error: {}\n", error.message()); } - fmt::print("Saving new configuration file {}\n", path.string()); + fmt::print("Saving new configuration file {}\n", fmt::UTF(path.u8string())); } data["General"]["isPS4Pro"] = isNeo; data["General"]["Fullscreen"] = isFullscreen; + data["General"]["playBGM"] = playBGM; + data["General"]["BGMvolume"] = BGMvolume; data["General"]["logFilter"] = logFilter; data["General"]["logType"] = logType; data["General"]["userName"] = userName; + data["General"]["updateChannel"] = updateChannel; data["General"]["showSplash"] = isShowSplash; + data["General"]["autoUpdate"] = isAutoUpdate; data["Input"]["useSpecialPad"] = useSpecialPad; data["Input"]["specialPadClass"] = specialPadClass; data["GPU"]["screenWidth"] = screenWidth; @@ -464,7 +540,6 @@ void save(const std::filesystem::path& path) { data["GPU"]["nullGpu"] = isNullGpu; data["GPU"]["copyGPUBuffers"] = shouldCopyGPUBuffers; data["GPU"]["dumpShaders"] = shouldDumpShaders; - data["GPU"]["dumpPM4"] = shouldDumpPM4; data["GPU"]["vblankDivider"] = vblankDivider; data["Vulkan"]["gpuId"] = gpuId; data["Vulkan"]["validation"] = vkValidation; @@ -482,7 +557,9 @@ void save(const std::filesystem::path& path) { data["GUI"]["gameTableMode"] = m_table_mode; data["GUI"]["mw_width"] = m_window_size_W; data["GUI"]["mw_height"] = m_window_size_H; - data["GUI"]["installDir"] = settings_install_dir; + data["GUI"]["installDir"] = std::string{fmt::UTF(settings_install_dir.u8string()).data}; + data["GUI"]["addonInstallDir"] = + std::string{fmt::UTF(settings_addon_install_dir.u8string()).data}; data["GUI"]["geometry_x"] = main_window_geometry_x; data["GUI"]["geometry_y"] = main_window_geometry_y; data["GUI"]["geometry_w"] = main_window_geometry_w; @@ -502,18 +579,25 @@ void save(const std::filesystem::path& path) { void setDefaultValues() { isNeo = false; isFullscreen = false; + playBGM = false; + BGMvolume = 50; screenWidth = 1280; screenHeight = 720; logFilter = ""; logType = "async"; userName = "shadPS4"; + if (Common::isRelease) { + updateChannel = "Release"; + } else { + updateChannel = "Nightly"; + } useSpecialPad = false; specialPadClass = 1; isDebugDump = false; isShowSplash = false; + isAutoUpdate = false; isNullGpu = false; shouldDumpShaders = false; - shouldDumpPM4 = false; vblankDivider = 1; vkValidation = false; vkValidationSync = false; diff --git a/src/common/config.h b/src/common/config.h index 7e717fe71..daee9e078 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -13,9 +13,13 @@ void save(const std::filesystem::path& path); bool isNeoMode(); bool isFullscreenMode(); +bool getPlayBGM(); +int getBGMvolume(); + std::string getLogFilter(); std::string getLogType(); std::string getUserName(); +std::string getUpdateChannel(); bool getUseSpecialPad(); int getSpecialPadClass(); @@ -26,27 +30,30 @@ s32 getGpuId(); bool debugDump(); bool showSplash(); +bool autoUpdate(); bool nullGpu(); bool copyGPUCmdBuffers(); bool dumpShaders(); -bool dumpPM4(); bool isRdocEnabled(); u32 vblankDiv(); void setDebugDump(bool enable); void setShowSplash(bool enable); +void setAutoUpdate(bool enable); void setNullGpu(bool enable); void setCopyGPUCmdBuffers(bool enable); void setDumpShaders(bool enable); -void setDumpPM4(bool enable); void setVblankDiv(u32 value); void setGpuId(s32 selectedGpuId); void setScreenWidth(u32 width); void setScreenHeight(u32 height); void setFullscreenMode(bool enable); +void setPlayBGM(bool enable); +void setBGMvolume(int volume); void setLanguage(u32 language); void setNeoMode(bool enable); void setUserName(const std::string& type); +void setUpdateChannel(const std::string& type); void setUseSpecialPad(bool use); void setSpecialPadClass(int type); @@ -66,7 +73,8 @@ bool vkCrashDiagnosticEnabled(); // Gui void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h); -void setGameInstallDir(const std::string& dir); +void setGameInstallDir(const std::filesystem::path& dir); +void setAddonInstallDir(const std::filesystem::path& dir); void setMainWindowTheme(u32 theme); void setIconSize(u32 size); void setIconSizeGrid(u32 size); @@ -84,7 +92,8 @@ u32 getMainWindowGeometryX(); u32 getMainWindowGeometryY(); u32 getMainWindowGeometryW(); u32 getMainWindowGeometryH(); -std::string getGameInstallDir(); +std::filesystem::path getGameInstallDir(); +std::filesystem::path getAddonInstallDir(); u32 getMainWindowTheme(); u32 getIconSize(); u32 getIconSizeGrid(); diff --git a/src/common/cstring.h b/src/common/cstring.h new file mode 100644 index 000000000..fb29443ee --- /dev/null +++ b/src/common/cstring.h @@ -0,0 +1,157 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +#include "assert.h" + +namespace Common { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wtautological-undefined-compare" + +/** + * @brief A null-terminated string with a fixed maximum length + * This class is not meant to be used as a general-purpose string class + * It is meant to be used as `char[N]` where memory layout is fixed + * @tparam N Maximum length of the string + * @tparam T Type of character + */ +template +class CString { + T data[N]{}; + +public: + class Iterator; + + CString() = default; + + template + explicit CString(const CString& other) + requires(M <= N) + { + if (this == nullptr) { + return; + } + std::ranges::copy(other.begin(), other.end(), data); + } + + void FromString(const std::basic_string_view& str) { + if (this == nullptr) { + return; + } + size_t p = str.copy(data, N - 1); + data[p] = '\0'; + } + + void Zero() { + if (this == nullptr) { + return; + } + std::ranges::fill(data, 0); + } + + explicit(false) operator std::basic_string_view() const { + if (this == nullptr) { + return {}; + } + return std::basic_string_view{data}; + } + + explicit operator std::basic_string() const { + if (this == nullptr) { + return {}; + } + return std::basic_string{data}; + } + + std::basic_string to_string() const { + if (this == nullptr) { + return {}; + } + return std::basic_string{data}; + } + + std::basic_string_view to_view() const { + if (this == nullptr) { + return {}; + } + return std::basic_string_view{data}; + } + + char* begin() { + if (this == nullptr) { + return nullptr; + } + return data; + } + + const char* begin() const { + if (this == nullptr) { + return nullptr; + } + return data; + } + + char* end() { + if (this == nullptr) { + return nullptr; + } + return data + N; + } + + const char* end() const { + if (this == nullptr) { + return nullptr; + } + return data + N; + } + + T& operator[](size_t idx) { + return data[idx]; + } + + const T& operator[](size_t idx) const { + return data[idx]; + } + + class Iterator { + T* ptr; + T* end; + + public: + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; + + Iterator() = default; + explicit Iterator(T* ptr) : ptr(ptr), end(ptr + N) {} + + Iterator& operator++() { + ++ptr; + return *this; + } + + Iterator operator++(int) { + Iterator tmp = *this; + ++ptr; + return tmp; + } + + operator T*() { + ASSERT_MSG(ptr >= end, "CString iterator out of bounds"); + return ptr; + } + }; +}; + +static_assert(sizeof(CString<13>) == sizeof(char[13])); // Ensure size still matches a simple array +static_assert(std::weakly_incrementable::Iterator>); + +#pragma clang diagnostic pop + +} // namespace Common \ No newline at end of file diff --git a/src/common/disassembler.cpp b/src/common/decoder.cpp similarity index 65% rename from src/common/disassembler.cpp rename to src/common/decoder.cpp index 2d1264a4e..249907419 100644 --- a/src/common/disassembler.cpp +++ b/src/common/decoder.cpp @@ -2,18 +2,18 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/disassembler.h" +#include "common/decoder.h" namespace Common { -Disassembler::Disassembler() { +DecoderImpl::DecoderImpl() { ZydisDecoderInit(&m_decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_STACK_WIDTH_64); ZydisFormatterInit(&m_formatter, ZYDIS_FORMATTER_STYLE_INTEL); } -Disassembler::~Disassembler() = default; +DecoderImpl::~DecoderImpl() = default; -void Disassembler::printInstruction(void* code, u64 address) { +void DecoderImpl::printInstruction(void* code, u64 address) { ZydisDecodedInstruction instruction; ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT_VISIBLE]; ZyanStatus status = @@ -25,8 +25,8 @@ void Disassembler::printInstruction(void* code, u64 address) { } } -void Disassembler::printInst(ZydisDecodedInstruction& inst, ZydisDecodedOperand* operands, - u64 address) { +void DecoderImpl::printInst(ZydisDecodedInstruction& inst, ZydisDecodedOperand* operands, + u64 address) { const int bufLen = 256; char szBuffer[bufLen]; ZydisFormatterFormatInstruction(&m_formatter, &inst, operands, inst.operand_count_visible, @@ -34,4 +34,9 @@ void Disassembler::printInst(ZydisDecodedInstruction& inst, ZydisDecodedOperand* fmt::print("instruction: {}\n", szBuffer); } +ZyanStatus DecoderImpl::decodeInstruction(ZydisDecodedInstruction& inst, + ZydisDecodedOperand* operands, void* data, u64 size) { + return ZydisDecoderDecodeFull(&m_decoder, data, size, &inst, operands); +} + } // namespace Common diff --git a/src/common/disassembler.h b/src/common/decoder.h similarity index 60% rename from src/common/disassembler.h rename to src/common/decoder.h index b81f9e31b..1f2219596 100644 --- a/src/common/disassembler.h +++ b/src/common/decoder.h @@ -4,21 +4,26 @@ #pragma once #include +#include "common/singleton.h" #include "common/types.h" namespace Common { -class Disassembler { +class DecoderImpl { public: - Disassembler(); - ~Disassembler(); + DecoderImpl(); + ~DecoderImpl(); void printInst(ZydisDecodedInstruction& inst, ZydisDecodedOperand* operands, u64 address); void printInstruction(void* code, u64 address); + ZyanStatus decodeInstruction(ZydisDecodedInstruction& inst, ZydisDecodedOperand* operands, + void* data, u64 size = 15); private: ZydisDecoder m_decoder; ZydisFormatter m_formatter; }; +using Decoder = Common::Singleton; + } // namespace Common diff --git a/src/common/elf_info.h b/src/common/elf_info.h new file mode 100644 index 000000000..5a2c914e0 --- /dev/null +++ b/src/common/elf_info.h @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "assert.h" +#include "singleton.h" +#include "types.h" + +namespace Core { +class Emulator; +} + +namespace Common { + +class ElfInfo { + friend class Core::Emulator; + + bool initialized = false; + + std::string game_serial{}; + std::string title{}; + std::string app_ver{}; + u32 firmware_ver = 0; + u32 raw_firmware_ver = 0; + +public: + static constexpr u32 FW_15 = 0x1500000; + static constexpr u32 FW_16 = 0x1600000; + static constexpr u32 FW_17 = 0x1700000; + static constexpr u32 FW_20 = 0x2000000; + static constexpr u32 FW_25 = 0x2500000; + static constexpr u32 FW_30 = 0x3000000; + static constexpr u32 FW_40 = 0x4000000; + static constexpr u32 FW_45 = 0x4500000; + static constexpr u32 FW_50 = 0x5000000; + static constexpr u32 FW_80 = 0x8000000; + + static ElfInfo& Instance() { + return *Singleton::Instance(); + } + + [[nodiscard]] std::string_view GameSerial() const { + ASSERT(initialized); + return Instance().game_serial; + } + + [[nodiscard]] std::string_view Title() const { + ASSERT(initialized); + return title; + } + + [[nodiscard]] std::string_view AppVer() const { + ASSERT(initialized); + return app_ver; + } + + [[nodiscard]] u32 FirmwareVer() const { + ASSERT(initialized); + return firmware_ver; + } + + [[nodiscard]] u32 RawFirmwareVer() const { + ASSERT(initialized); + return raw_firmware_ver; + } +}; + +} // namespace Common diff --git a/src/common/io_file.cpp b/src/common/io_file.cpp index fbc37a10c..1b28d2bba 100644 --- a/src/common/io_file.cpp +++ b/src/common/io_file.cpp @@ -192,8 +192,9 @@ int IOFile::Open(const fs::path& path, FileAccessMode mode, FileType type, FileS #endif if (!IsOpen()) { - LOG_ERROR(Common_Filesystem, "Failed to open the file at path={}", - PathToUTF8String(file_path)); + const auto ec = std::error_code{result, std::generic_category()}; + LOG_ERROR(Common_Filesystem, "Failed to open the file at path={}, error_message={}", + PathToUTF8String(file_path), ec.message()); } return result; @@ -372,6 +373,18 @@ bool IOFile::Seek(s64 offset, SeekOrigin origin) const { return false; } + u64 size = GetSize(); + if (origin == SeekOrigin::CurrentPosition && Tell() + offset > size) { + LOG_ERROR(Common_Filesystem, "Seeking past the end of the file"); + return false; + } else if (origin == SeekOrigin::SetOrigin && (u64)offset > size) { + LOG_ERROR(Common_Filesystem, "Seeking past the end of the file"); + return false; + } else if (origin == SeekOrigin::End && offset > 0) { + LOG_ERROR(Common_Filesystem, "Seeking past the end of the file"); + return false; + } + errno = 0; const auto seek_result = fseeko(file, offset, ToSeekOrigin(origin)) == 0; @@ -396,4 +409,18 @@ s64 IOFile::Tell() const { return ftello(file); } +u64 GetDirectorySize(const std::filesystem::path& path) { + if (!fs::exists(path)) { + return 0; + } + + u64 total = 0; + for (const auto& entry : fs::recursive_directory_iterator(path)) { + if (fs::is_regular_file(entry.path())) { + total += fs::file_size(entry.path()); + } + } + return total; +} + } // namespace Common::FS diff --git a/src/common/io_file.h b/src/common/io_file.h index 2c3df3f69..8fed4981f 100644 --- a/src/common/io_file.h +++ b/src/common/io_file.h @@ -205,9 +205,9 @@ public: return WriteSpan(string); } - static void WriteBytes(const std::filesystem::path path, std::span data) { + static size_t WriteBytes(const std::filesystem::path path, std::span data) { IOFile out(path, FileAccessMode::Write); - out.Write(data); + return out.Write(data); } private: @@ -219,4 +219,6 @@ private: uintptr_t file_mapping = 0; }; +u64 GetDirectorySize(const std::filesystem::path& path); + } // namespace Common::FS diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index a21af8bba..7802977f5 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -144,6 +144,10 @@ public: initialization_in_progress_suppress_logging = false; } + static bool IsActive() { + return instance != nullptr; + } + static void Start() { instance->StartBackendThread(); } @@ -275,6 +279,10 @@ void Initialize(std::string_view log_file) { Impl::Initialize(log_file.empty() ? LOG_FILE : log_file); } +bool IsActive() { + return Impl::IsActive(); +} + void Start() { Impl::Start(); } diff --git a/src/common/logging/backend.h b/src/common/logging/backend.h index 91c9da832..a1ad66369 100644 --- a/src/common/logging/backend.h +++ b/src/common/logging/backend.h @@ -13,6 +13,8 @@ class Filter; /// Initializes the logging system. This should be the first thing called in main. void Initialize(std::string_view log_file = ""); +bool IsActive(); + /// Starts the logging threads. void Start(); diff --git a/src/common/logging/formatter.h b/src/common/logging/formatter.h index f80905cc3..fad8451e9 100644 --- a/src/common/logging/formatter.h +++ b/src/common/logging/formatter.h @@ -19,3 +19,24 @@ struct fmt::formatter, char>> } }; #endif + +namespace fmt { +template +struct UTF { + T data; + + explicit UTF(const std::u8string_view view) { + data = view.empty() ? T{} : T{(const char*)&view.front(), (const char*)&view.back() + 1}; + } + + explicit UTF(const std::u8string& str) : UTF(std::u8string_view{str}) {} +}; +} // namespace fmt + +template <> +struct fmt::formatter, char> : formatter { + template + auto format(const UTF& wrapper, FormatContext& ctx) const { + return formatter::format(wrapper.data, ctx); + } +}; \ No newline at end of file diff --git a/src/qt_gui/memory_patcher.cpp b/src/common/memory_patcher.cpp similarity index 65% rename from src/qt_gui/memory_patcher.cpp rename to src/common/memory_patcher.cpp index d5ffa1c99..d2930cf5e 100644 --- a/src/qt_gui/memory_patcher.cpp +++ b/src/common/memory_patcher.cpp @@ -2,14 +2,20 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include +#include #include +#include +#ifdef ENABLE_QT_GUI #include #include #include #include #include #include +#include #include +#endif #include "common/logging/log.h" #include "common/path_util.h" #include "memory_patcher.h" @@ -17,81 +23,172 @@ namespace MemoryPatcher { uintptr_t g_eboot_address; -u64 g_eboot_image_size; +uint64_t g_eboot_image_size; std::string g_game_serial; +std::string patchFile; std::vector pending_patches; -QString toHex(unsigned long long value, size_t byteSize) { +std::string toHex(unsigned long long value, size_t byteSize) { std::stringstream ss; ss << std::hex << std::setfill('0') << std::setw(byteSize * 2) << value; - return QString::fromStdString(ss.str()); + return ss.str(); } -QString convertValueToHex(const QString& type, const QString& valueStr) { - QString result; - std::string typeStr = type.toStdString(); - std::string valueStrStd = valueStr.toStdString(); +std::string convertValueToHex(const std::string type, const std::string valueStr) { + std::string result; - if (typeStr == "byte") { - unsigned int value = std::stoul(valueStrStd, nullptr, 16); + if (type == "byte") { + unsigned int value = std::stoul(valueStr, nullptr, 16); result = toHex(value, 1); - } else if (typeStr == "bytes16") { - unsigned int value = std::stoul(valueStrStd, nullptr, 16); + } else if (type == "bytes16") { + unsigned int value = std::stoul(valueStr, nullptr, 16); result = toHex(value, 2); - } else if (typeStr == "bytes32") { - unsigned long value = std::stoul(valueStrStd, nullptr, 16); + } else if (type == "bytes32") { + unsigned long value = std::stoul(valueStr, nullptr, 16); result = toHex(value, 4); - } else if (typeStr == "bytes64") { - unsigned long long value = std::stoull(valueStrStd, nullptr, 16); + } else if (type == "bytes64") { + unsigned long long value = std::stoull(valueStr, nullptr, 16); result = toHex(value, 8); - } else if (typeStr == "float32") { + } else if (type == "float32") { union { float f; uint32_t i; } floatUnion; - floatUnion.f = std::stof(valueStrStd); + floatUnion.f = std::stof(valueStr); result = toHex(floatUnion.i, sizeof(floatUnion.i)); - } else if (typeStr == "float64") { + } else if (type == "float64") { union { double d; uint64_t i; } doubleUnion; - doubleUnion.d = std::stod(valueStrStd); + doubleUnion.d = std::stod(valueStr); result = toHex(doubleUnion.i, sizeof(doubleUnion.i)); - } else if (typeStr == "utf8") { - QByteArray byteArray = QString::fromStdString(valueStrStd).toUtf8(); - byteArray.append('\0'); + } else if (type == "utf8") { + std::vector byteArray = + std::vector(valueStr.begin(), valueStr.end()); + byteArray.push_back('\0'); std::stringstream ss; for (unsigned char c : byteArray) { ss << std::hex << std::setfill('0') << std::setw(2) << static_cast(c); } - result = QString::fromStdString(ss.str()); - } else if (typeStr == "utf16") { - QByteArray byteArray( - reinterpret_cast(QString::fromStdString(valueStrStd).utf16()), - QString::fromStdString(valueStrStd).size() * 2); - byteArray.append('\0'); - byteArray.append('\0'); - std::stringstream ss; - for (unsigned char c : byteArray) { - ss << std::hex << std::setfill('0') << std::setw(2) << static_cast(c); + result = ss.str(); + } else if (type == "utf16") { + std::wstring wide_str(valueStr.size(), L'\0'); + std::mbstowcs(&wide_str[0], valueStr.c_str(), valueStr.size()); + wide_str.resize(std::wcslen(wide_str.c_str())); + + std::u16string valueStringU16; + + for (wchar_t wc : wide_str) { + if (wc <= 0xFFFF) { + valueStringU16.push_back(static_cast(wc)); + } else { + wc -= 0x10000; + valueStringU16.push_back(static_cast(0xD800 | (wc >> 10))); + valueStringU16.push_back(static_cast(0xDC00 | (wc & 0x3FF))); + } } - result = QString::fromStdString(ss.str()); - } else if (typeStr == "bytes") { + + std::vector byteArray; + // convert to little endian + for (char16_t ch : valueStringU16) { + unsigned char low_byte = static_cast(ch & 0x00FF); + unsigned char high_byte = static_cast((ch >> 8) & 0x00FF); + + byteArray.push_back(low_byte); + byteArray.push_back(high_byte); + } + byteArray.push_back('\0'); + byteArray.push_back('\0'); + std::stringstream ss; + + for (unsigned char ch : byteArray) { + ss << std::hex << std::setw(2) << std::setfill('0') << static_cast(ch); + } + result = ss.str(); + } else if (type == "bytes") { result = valueStr; - } else if (typeStr == "mask" || typeStr == "mask_jump32") { + } else if (type == "mask" || type == "mask_jump32") { result = valueStr; } else { - LOG_INFO(Loader, "Error applying Patch, unknown type: {}", typeStr); + LOG_INFO(Loader, "Error applying Patch, unknown type: {}", type); } return result; } void OnGameLoaded() { + if (!patchFile.empty()) { + std::filesystem::path patchDir = Common::FS::GetUserPath(Common::FS::PathType::PatchesDir); + + auto filePath = (patchDir / patchFile).native(); + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(filePath.c_str()); + + if (result) { + auto patchXML = doc.child("Patch"); + for (pugi::xml_node_iterator it = patchXML.children().begin(); + it != patchXML.children().end(); ++it) { + + if (std::string(it->name()) == "Metadata") { + if (std::string(it->attribute("isEnabled").value()) == "true") { + auto patchList = it->first_child(); + + std::string currentPatchName = it->attribute("Name").value(); + + for (pugi::xml_node_iterator patchLineIt = patchList.children().begin(); + patchLineIt != patchList.children().end(); ++patchLineIt) { + + std::string type = patchLineIt->attribute("Type").value(); + std::string address = patchLineIt->attribute("Address").value(); + std::string patchValue = patchLineIt->attribute("Value").value(); + std::string maskOffsetStr = patchLineIt->attribute("type").value(); + + patchValue = convertValueToHex(type, patchValue); + + bool littleEndian = false; + + if (type == "bytes16") { + littleEndian = true; + } else if (type == "bytes32") { + littleEndian = true; + } else if (type == "bytes64") { + littleEndian = true; + } + + MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None; + int maskOffsetValue = 0; + + if (type == "mask") { + patchMask = MemoryPatcher::PatchMask::Mask; + + // im not sure if this works, there is no games to test the mask + // offset on yet + if (!maskOffsetStr.empty()) + maskOffsetValue = std::stoi(maskOffsetStr, 0, 10); + } + + if (type == "mask_jump32") + patchMask = MemoryPatcher::PatchMask::Mask_Jump32; + + MemoryPatcher::PatchMemory(currentPatchName, address, patchValue, false, + littleEndian, patchMask); + } + } + } + } + } else + LOG_ERROR(Loader, "couldnt patch parse xml : {}", result.description()); + + ApplyPendingPatches(); + return; + } + +#ifdef ENABLE_QT_GUI // We use the QT headers for the xml and json parsing, this define is only true on QT builds - QString patchDir = - QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::PatchesDir).string()); + QString patchDir; + Common::FS::PathToQString(patchDir, Common::FS::GetUserPath(Common::FS::PathType::PatchesDir)); QString repositories[] = {"GoldHEN", "shadPS4"}; for (const QString& repository : repositories) { @@ -190,7 +287,8 @@ void OnGameLoaded() { QString patchValue = lineObject["Value"].toString(); QString maskOffsetStr = lineObject["Offset"].toString(); - patchValue = convertValueToHex(type, patchValue); + patchValue = QString::fromStdString( + convertValueToHex(type.toStdString(), patchValue.toStdString())); bool littleEndian = false; @@ -233,6 +331,7 @@ void OnGameLoaded() { } ApplyPendingPatches(); } +#endif } void AddPatchToQueue(patchInfo patchToAdd) { diff --git a/src/qt_gui/memory_patcher.h b/src/common/memory_patcher.h similarity index 87% rename from src/qt_gui/memory_patcher.h rename to src/common/memory_patcher.h index 821184ade..899ffccb1 100644 --- a/src/qt_gui/memory_patcher.h +++ b/src/common/memory_patcher.h @@ -5,13 +5,13 @@ #include #include #include -#include namespace MemoryPatcher { extern uintptr_t g_eboot_address; -extern u64 g_eboot_image_size; +extern uint64_t g_eboot_image_size; extern std::string g_game_serial; +extern std::string patchFile; enum PatchMask : uint8_t { None, @@ -32,7 +32,7 @@ struct patchInfo { extern std::vector pending_patches; -QString convertValueToHex(const QString& type, const QString& valueStr); +std::string convertValueToHex(const std::string type, const std::string valueStr); void OnGameLoaded(); void AddPatchToQueue(patchInfo patchToAdd); diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp index cce12ebcf..27098e2d1 100644 --- a/src/common/path_util.cpp +++ b/src/common/path_util.cpp @@ -22,6 +22,10 @@ #endif #endif +#ifdef ENABLE_QT_GUI +#include +#endif + namespace Common::FS { namespace fs = std::filesystem; @@ -106,7 +110,6 @@ static auto UserPaths = [] { create_path(PathType::LogDir, user_dir / LOG_DIR); create_path(PathType::ScreenshotsDir, user_dir / SCREENSHOTS_DIR); create_path(PathType::ShaderDir, user_dir / SHADER_DIR); - create_path(PathType::PM4Dir, user_dir / PM4_DIR); create_path(PathType::SaveDataDir, user_dir / SAVEDATA_DIR); create_path(PathType::GameDataDir, user_dir / GAMEDATA_DIR); create_path(PathType::TempDataDir, user_dir / TEMPDATA_DIR); @@ -115,7 +118,6 @@ static auto UserPaths = [] { create_path(PathType::CapturesDir, user_dir / CAPTURES_DIR); create_path(PathType::CheatsDir, user_dir / CHEATS_DIR); create_path(PathType::PatchesDir, user_dir / PATCHES_DIR); - create_path(PathType::AddonsDir, user_dir / ADDONS_DIR); create_path(PathType::MetaDataDir, user_dir / METADATA_DIR); return paths; @@ -165,4 +167,22 @@ void SetUserPath(PathType shad_path, const fs::path& new_path) { UserPaths.insert_or_assign(shad_path, new_path); } +#ifdef ENABLE_QT_GUI +void PathToQString(QString& result, const std::filesystem::path& path) { +#ifdef _WIN32 + result = QString::fromStdWString(path.wstring()); +#else + result = QString::fromStdString(path.string()); +#endif +} + +std::filesystem::path PathFromQString(const QString& path) { +#ifdef _WIN32 + return std::filesystem::path(path.toStdWString()); +#else + return std::filesystem::path(path.toStdString()); +#endif +} +#endif + } // namespace Common::FS \ No newline at end of file diff --git a/src/common/path_util.h b/src/common/path_util.h index 623b285ed..09b7a3337 100644 --- a/src/common/path_util.h +++ b/src/common/path_util.h @@ -6,6 +6,10 @@ #include #include +#ifdef ENABLE_QT_GUI +class QString; // to avoid including in this header +#endif + namespace Common::FS { enum class PathType { @@ -13,7 +17,6 @@ enum class PathType { LogDir, // Where log files are stored. ScreenshotsDir, // Where screenshots are stored. ShaderDir, // Where shaders are stored. - PM4Dir, // Where command lists are stored. SaveDataDir, // Where guest save data is stored. TempDataDir, // Where game temp data is stored. GameDataDir, // Where game data is stored. @@ -22,7 +25,6 @@ enum class PathType { CapturesDir, // Where rdoc captures are stored. CheatsDir, // Where cheats are stored. PatchesDir, // Where patches are stored. - AddonsDir, // Where additional content is stored. MetaDataDir, // Where game metadata (e.g. trophies and menu backgrounds) is stored. }; @@ -32,7 +34,6 @@ constexpr auto PORTABLE_DIR = "user"; constexpr auto LOG_DIR = "log"; constexpr auto SCREENSHOTS_DIR = "screenshots"; constexpr auto SHADER_DIR = "shader"; -constexpr auto PM4_DIR = "pm4"; constexpr auto SAVEDATA_DIR = "savedata"; constexpr auto GAMEDATA_DIR = "data"; constexpr auto TEMPDATA_DIR = "temp"; @@ -41,7 +42,6 @@ constexpr auto DOWNLOAD_DIR = "download"; constexpr auto CAPTURES_DIR = "captures"; constexpr auto CHEATS_DIR = "cheats"; constexpr auto PATCHES_DIR = "patches"; -constexpr auto ADDONS_DIR = "addcont"; constexpr auto METADATA_DIR = "game_data"; // Filenames @@ -96,4 +96,23 @@ constexpr auto LOG_FILE = "shad_log.txt"; */ void SetUserPath(PathType user_path, const std::filesystem::path& new_path); +#ifdef ENABLE_QT_GUI +/** + * Converts an std::filesystem::path to a QString. + * The native underlying string of a path is wstring on Windows and string on POSIX. + * + * @param result The resulting QString + * @param path The path to convert + */ +void PathToQString(QString& result, const std::filesystem::path& path); + +/** + * Converts a QString to an std::filesystem::path. + * The native underlying string of a path is wstring on Windows and string on POSIX. + * + * @param path The path to convert + */ +[[nodiscard]] std::filesystem::path PathFromQString(const QString& path); +#endif + } // namespace Common::FS diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in index 7f6fba9ed..642e6373d 100644 --- a/src/common/scm_rev.cpp.in +++ b/src/common/scm_rev.cpp.in @@ -6,12 +6,14 @@ #define GIT_REV "@GIT_REV@" #define GIT_BRANCH "@GIT_BRANCH@" #define GIT_DESC "@GIT_DESC@" +#define BUILD_DATE "@BUILD_DATE@" namespace Common { const char g_scm_rev[] = GIT_REV; const char g_scm_branch[] = GIT_BRANCH; const char g_scm_desc[] = GIT_DESC; +const char g_scm_date[] = BUILD_DATE; } // namespace diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h index 877a01272..005099d2d 100644 --- a/src/common/scm_rev.h +++ b/src/common/scm_rev.h @@ -8,5 +8,6 @@ namespace Common { extern const char g_scm_rev[]; extern const char g_scm_branch[]; extern const char g_scm_desc[]; +extern const char g_scm_date[]; } // namespace Common diff --git a/src/common/signal_context.cpp b/src/common/signal_context.cpp new file mode 100644 index 000000000..112160bc8 --- /dev/null +++ b/src/common/signal_context.cpp @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/arch.h" +#include "common/assert.h" +#include "common/signal_context.h" + +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace Common { + +void* GetXmmPointer(void* ctx, u8 index) { +#if defined(_WIN32) +#define CASE(index) \ + case index: \ + return (void*)(&((EXCEPTION_POINTERS*)ctx)->ContextRecord->Xmm##index.Low) +#elif defined(__APPLE__) +#define CASE(index) \ + case index: \ + return (void*)(&((ucontext_t*)ctx)->uc_mcontext->__fs.__fpu_xmm##index); +#else +#define CASE(index) \ + case index: \ + return (void*)(&((ucontext_t*)ctx)->uc_mcontext.fpregs->_xmm[index].element[0]) +#endif + switch (index) { + CASE(0); + CASE(1); + CASE(2); + CASE(3); + CASE(4); + CASE(5); + CASE(6); + CASE(7); + CASE(8); + CASE(9); + CASE(10); + CASE(11); + CASE(12); + CASE(13); + CASE(14); + CASE(15); + default: { + UNREACHABLE_MSG("Invalid XMM register index: {}", index); + return nullptr; + } + } +#undef CASE +} + +void* GetRip(void* ctx) { +#if defined(_WIN32) + return (void*)((EXCEPTION_POINTERS*)ctx)->ContextRecord->Rip; +#elif defined(__APPLE__) + return (void*)((ucontext_t*)ctx)->uc_mcontext->__ss.__rip; +#else + return (void*)((ucontext_t*)ctx)->uc_mcontext.gregs[REG_RIP]; +#endif +} + +void IncrementRip(void* ctx, u64 length) { +#if defined(_WIN32) + ((EXCEPTION_POINTERS*)ctx)->ContextRecord->Rip += length; +#elif defined(__APPLE__) + ((ucontext_t*)ctx)->uc_mcontext->__ss.__rip += length; +#else + ((ucontext_t*)ctx)->uc_mcontext.gregs[REG_RIP] += length; +#endif +} + +bool IsWriteError(void* ctx) { +#if defined(_WIN32) + return ((EXCEPTION_POINTERS*)ctx)->ExceptionRecord->ExceptionInformation[0] == 1; +#elif defined(__APPLE__) +#if defined(ARCH_X86_64) + return ((ucontext_t*)ctx)->uc_mcontext->__es.__err & 0x2; +#elif defined(ARCH_ARM64) + return ((ucontext_t*)ctx)->uc_mcontext->__es.__esr & 0x40; +#endif +#else +#if defined(ARCH_X86_64) + return ((ucontext_t*)ctx)->uc_mcontext.gregs[REG_ERR] & 0x2; +#else +#error "Unsupported architecture" +#endif +#endif +} +} // namespace Common \ No newline at end of file diff --git a/src/common/signal_context.h b/src/common/signal_context.h new file mode 100644 index 000000000..b09da64f2 --- /dev/null +++ b/src/common/signal_context.h @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Common { + +void* GetXmmPointer(void* ctx, u8 index); + +void* GetRip(void* ctx); + +void IncrementRip(void* ctx, u64 length); + +bool IsWriteError(void* ctx); + +} // namespace Common \ No newline at end of file diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 29e6aeb4f..6d5a254cd 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -14,12 +14,17 @@ namespace Common { -std::string ToLower(std::string str) { - std::transform(str.begin(), str.end(), str.begin(), - [](unsigned char c) { return static_cast(std::tolower(c)); }); +std::string ToLower(std::string_view input) { + std::string str; + str.resize(input.size()); + std::ranges::transform(input, str.begin(), tolower); return str; } +void ToLowerInPlace(std::string& str) { + std::ranges::transform(str, str.begin(), tolower); +} + std::vector SplitString(const std::string& str, char delimiter) { std::istringstream iss(str); std::vector output(1); diff --git a/src/common/string_util.h b/src/common/string_util.h index 8dae6c75b..23e82b93c 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -10,7 +10,9 @@ namespace Common { /// Make a string lowercase -[[nodiscard]] std::string ToLower(std::string str); +[[nodiscard]] std::string ToLower(std::string_view str); + +void ToLowerInPlace(std::string& str); std::vector SplitString(const std::string& str, char delimiter); diff --git a/src/common/thread.cpp b/src/common/thread.cpp index f08b36faa..46df68c38 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -3,12 +3,15 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "common/error.h" #include "common/logging/log.h" #include "common/thread.h" +#include "ntapi.h" #ifdef __APPLE__ #include +#include #include #elif defined(_WIN32) #include @@ -31,6 +34,48 @@ namespace Common { +#ifdef __APPLE__ + +void SetCurrentThreadRealtime(const std::chrono::nanoseconds period_ns) { + // CPU time to grant. + const std::chrono::nanoseconds computation_ns = period_ns / 2; + + // Determine the timebase for converting time to ticks. + struct mach_timebase_info timebase {}; + mach_timebase_info(&timebase); + const auto ticks_per_ns = + static_cast(timebase.denom) / static_cast(timebase.numer); + + const auto period_ticks = + static_cast(static_cast(period_ns.count()) * ticks_per_ns); + const auto computation_ticks = + static_cast(static_cast(computation_ns.count()) * ticks_per_ns); + + thread_time_constraint_policy policy = { + .period = period_ticks, + .computation = computation_ticks, + // Should not matter since preemptible is false, but needs to be >= computation regardless. + .constraint = computation_ticks, + .preemptible = false, + }; + + int ret = thread_policy_set( + pthread_mach_thread_np(pthread_self()), THREAD_TIME_CONSTRAINT_POLICY, + reinterpret_cast(&policy), THREAD_TIME_CONSTRAINT_POLICY_COUNT); + if (ret != KERN_SUCCESS) { + LOG_ERROR(Common, "Could not set thread to real-time with period {} ns: {}", + period_ns.count(), ret); + } +} + +#else + +void SetCurrentThreadRealtime(const std::chrono::nanoseconds period_ns) { + // Not implemented +} + +#endif + #ifdef _WIN32 void SetCurrentThreadPriority(ThreadPriority new_priority) { @@ -59,6 +104,16 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) { SetThreadPriority(handle, windows_priority); } +static void AccurateSleep(std::chrono::nanoseconds duration) { + LARGE_INTEGER interval{ + .QuadPart = -1 * (duration.count() / 100u), + }; + HANDLE timer = ::CreateWaitableTimer(NULL, TRUE, NULL); + SetWaitableTimer(timer, &interval, 0, NULL, NULL, 0); + WaitForSingleObject(timer, INFINITE); + ::CloseHandle(timer); +} + #else void SetCurrentThreadPriority(ThreadPriority new_priority) { @@ -79,6 +134,10 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) { pthread_setschedparam(this_thread, scheduling_type, ¶ms); } +static void AccurateSleep(std::chrono::nanoseconds duration) { + std::this_thread::sleep_for(duration); +} + #endif #ifdef _MSC_VER @@ -121,4 +180,22 @@ void SetCurrentThreadName(const char*) { #endif +AccurateTimer::AccurateTimer(std::chrono::nanoseconds target_interval) + : target_interval(target_interval) {} + +void AccurateTimer::Start() { + auto begin_sleep = std::chrono::high_resolution_clock::now(); + if (total_wait.count() > 0) { + AccurateSleep(total_wait); + } + start_time = std::chrono::high_resolution_clock::now(); + total_wait -= std::chrono::duration_cast(start_time - begin_sleep); +} + +void AccurateTimer::End() { + auto now = std::chrono::high_resolution_clock::now(); + total_wait += + target_interval - std::chrono::duration_cast(now - start_time); +} + } // namespace Common diff --git a/src/common/thread.h b/src/common/thread.h index 39acc1db5..fd962f8e5 100644 --- a/src/common/thread.h +++ b/src/common/thread.h @@ -4,6 +4,7 @@ #pragma once +#include #include "common/types.h" namespace Common { @@ -16,8 +17,24 @@ enum class ThreadPriority : u32 { Critical = 4, }; +void SetCurrentThreadRealtime(std::chrono::nanoseconds period_ns); + void SetCurrentThreadPriority(ThreadPriority new_priority); void SetCurrentThreadName(const char* name); +class AccurateTimer { + std::chrono::nanoseconds target_interval{}; + std::chrono::nanoseconds total_wait{}; + + std::chrono::high_resolution_clock::time_point start_time; + +public: + explicit AccurateTimer(std::chrono::nanoseconds target_interval); + + void Start(); + + void End(); +}; + } // namespace Common diff --git a/src/common/version.h b/src/common/version.h index 80de187b0..12fd17041 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -8,7 +8,7 @@ namespace Common { -constexpr char VERSION[] = "0.2.1 WIP"; +constexpr char VERSION[] = "0.3.1 WIP"; constexpr bool isRelease = false; } // namespace Common diff --git a/src/core/address_space.cpp b/src/core/address_space.cpp index 3950bd5fe..48748e4c3 100644 --- a/src/core/address_space.cpp +++ b/src/core/address_space.cpp @@ -72,7 +72,8 @@ struct AddressSpace::Impl { } reduction += ReductionOnFail; } - ASSERT_MSG(virtual_base, "Unable to reserve virtual address space!"); + ASSERT_MSG(virtual_base, "Unable to reserve virtual address space: {}", + Common::GetLastErrorMsg()); // Take the reduction off of the system managed area, and leave the others unchanged. system_managed_base = virtual_base; diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index 91b3bcd40..b812e5444 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -1,12 +1,20 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include +#include #include #include +#include +#include "common/alignment.h" +#include "common/arch.h" #include "common/assert.h" +#include "common/decoder.h" +#include "common/signal_context.h" #include "common/types.h" +#include "core/signals.h" #include "core/tls.h" #include "cpu_patches.h" @@ -22,6 +30,16 @@ using namespace Xbyak::util; +#define MAYBE_AVX(OPCODE, ...) \ + [&] { \ + Cpu cpu; \ + if (cpu.has(Cpu::tAVX)) { \ + c.v##OPCODE(__VA_ARGS__); \ + } else { \ + c.OPCODE(__VA_ARGS__); \ + } \ + }() + namespace Core { static Xbyak::Reg ZydisToXbyakRegister(const ZydisRegister reg) { @@ -534,7 +552,7 @@ static bool FilterRosetta2Only(const ZydisDecodedOperand*) { return ret; } -#endif // __APPLE__ +#else // __APPLE__ static bool FilterTcbAccess(const ZydisDecodedOperand* operands) { const auto& dst_op = operands[0]; @@ -580,6 +598,275 @@ static void GenerateTcbAccess(const ZydisDecodedOperand* operands, Xbyak::CodeGe #endif } +#endif // __APPLE__ + +static bool FilterNoSSE4a(const ZydisDecodedOperand*) { + Cpu cpu; + return !cpu.has(Cpu::tSSE4a); +} + +static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { + bool immediateForm = operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && + operands[2].type == ZYDIS_OPERAND_TYPE_IMMEDIATE; + + ASSERT_MSG(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER, "operand 0 must be a register"); + + const auto dst = ZydisToXbyakRegisterOperand(operands[0]); + + ASSERT_MSG(dst.isXMM(), "operand 0 must be an XMM register"); + + Xbyak::Xmm xmm_dst = *reinterpret_cast(&dst); + + if (immediateForm) { + u8 length = operands[1].imm.value.u & 0x3F; + u8 index = operands[2].imm.value.u & 0x3F; + + LOG_DEBUG(Core, "Patching immediate form EXTRQ, length: {}, index: {}", length, index); + + const Xbyak::Reg64 scratch1 = rax; + const Xbyak::Reg64 scratch2 = rcx; + + // Set rsp to before red zone and save scratch registers + c.lea(rsp, ptr[rsp - 128]); + c.pushfq(); + c.push(scratch1); + c.push(scratch2); + + u64 mask; + if (length == 0) { + length = 64; // for the check below + mask = 0xFFFF'FFFF'FFFF'FFFF; + } else { + mask = (1ULL << length) - 1; + } + + ASSERT_MSG(length + index <= 64, "length + index must be less than or equal to 64."); + + // Get lower qword from xmm register + MAYBE_AVX(movq, scratch1, xmm_dst); + + if (index != 0) { + c.shr(scratch1, index); + } + + // We need to move mask to a register because we can't use all the possible + // immediate values with `and reg, imm32` + c.mov(scratch2, mask); + c.and_(scratch1, scratch2); + + // Writeback to xmm register, extrq instruction says top 64-bits are undefined so we don't + // care to preserve them + MAYBE_AVX(movq, xmm_dst, scratch1); + + c.pop(scratch2); + c.pop(scratch1); + c.popfq(); + c.lea(rsp, ptr[rsp + 128]); + } else { + ASSERT_MSG(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + operands[0].reg.value >= ZYDIS_REGISTER_XMM0 && + operands[0].reg.value <= ZYDIS_REGISTER_XMM15 && + operands[1].reg.value >= ZYDIS_REGISTER_XMM0 && + operands[1].reg.value <= ZYDIS_REGISTER_XMM15, + "Unexpected operand types for EXTRQ instruction"); + + const auto src = ZydisToXbyakRegisterOperand(operands[1]); + + ASSERT_MSG(src.isXMM(), "operand 1 must be an XMM register"); + + Xbyak::Xmm xmm_src = *reinterpret_cast(&src); + + const Xbyak::Reg64 scratch1 = rax; + const Xbyak::Reg64 scratch2 = rcx; + const Xbyak::Reg64 mask = rdx; + + Xbyak::Label length_zero, end; + + c.lea(rsp, ptr[rsp - 128]); + c.pushfq(); + c.push(scratch1); + c.push(scratch2); + c.push(mask); + + // Construct the mask out of the length that resides in bottom 6 bits of source xmm + MAYBE_AVX(movq, scratch1, xmm_src); + c.mov(scratch2, scratch1); + c.and_(scratch2, 0x3F); + c.jz(length_zero); + + // mask = (1ULL << length) - 1 + c.mov(mask, 1); + c.shl(mask, cl); + c.dec(mask); + c.jmp(end); + + c.L(length_zero); + c.mov(mask, 0xFFFF'FFFF'FFFF'FFFF); + + c.L(end); + + // Get the shift amount and store it in scratch2 + c.shr(scratch1, 8); + c.and_(scratch1, 0x3F); + c.mov(scratch2, scratch1); // cl now contains the shift amount + + MAYBE_AVX(movq, scratch1, xmm_dst); + c.shr(scratch1, cl); + c.and_(scratch1, mask); + MAYBE_AVX(movq, xmm_dst, scratch1); + + c.pop(mask); + c.pop(scratch2); + c.pop(scratch1); + c.popfq(); + c.lea(rsp, ptr[rsp + 128]); + } +} + +static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { + bool immediateForm = operands[2].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && + operands[3].type == ZYDIS_OPERAND_TYPE_IMMEDIATE; + + ASSERT_MSG(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER, + "operands 0 and 1 must be registers."); + + const auto dst = ZydisToXbyakRegisterOperand(operands[0]); + const auto src = ZydisToXbyakRegisterOperand(operands[1]); + + ASSERT_MSG(dst.isXMM() && src.isXMM(), "operands 0 and 1 must be xmm registers."); + + Xbyak::Xmm xmm_dst = *reinterpret_cast(&dst); + Xbyak::Xmm xmm_src = *reinterpret_cast(&src); + + if (immediateForm) { + u8 length = operands[2].imm.value.u & 0x3F; + u8 index = operands[3].imm.value.u & 0x3F; + + const Xbyak::Reg64 scratch1 = rax; + const Xbyak::Reg64 scratch2 = rcx; + const Xbyak::Reg64 mask = rdx; + + // Set rsp to before red zone and save scratch registers + c.lea(rsp, ptr[rsp - 128]); + c.pushfq(); + c.push(scratch1); + c.push(scratch2); + c.push(mask); + + u64 mask_value; + if (length == 0) { + length = 64; // for the check below + mask_value = 0xFFFF'FFFF'FFFF'FFFF; + } else { + mask_value = (1ULL << length) - 1; + } + + ASSERT_MSG(length + index <= 64, "length + index must be less than or equal to 64."); + + MAYBE_AVX(movq, scratch1, xmm_src); + MAYBE_AVX(movq, scratch2, xmm_dst); + c.mov(mask, mask_value); + + // src &= mask + c.and_(scratch1, mask); + + // src <<= index + c.shl(scratch1, index); + + // dst &= ~(mask << index) + mask_value = ~(mask_value << index); + c.mov(mask, mask_value); + c.and_(scratch2, mask); + + // dst |= src + c.or_(scratch2, scratch1); + + // Insert scratch2 into low 64 bits of dst, upper 64 bits are unaffected + Cpu cpu; + if (cpu.has(Cpu::tAVX)) { + c.vpinsrq(xmm_dst, xmm_dst, scratch2, 0); + } else { + c.pinsrq(xmm_dst, scratch2, 0); + } + + c.pop(mask); + c.pop(scratch2); + c.pop(scratch1); + c.popfq(); + c.lea(rsp, ptr[rsp + 128]); + } else { + ASSERT_MSG(operands[2].type == ZYDIS_OPERAND_TYPE_UNUSED && + operands[3].type == ZYDIS_OPERAND_TYPE_UNUSED, + "operands 2 and 3 must be unused for register form."); + + const Xbyak::Reg64 scratch1 = rax; + const Xbyak::Reg64 scratch2 = rcx; + const Xbyak::Reg64 index = rdx; + const Xbyak::Reg64 mask = rbx; + + Xbyak::Label length_zero, end; + + c.lea(rsp, ptr[rsp - 128]); + c.pushfq(); + c.push(scratch1); + c.push(scratch2); + c.push(index); + c.push(mask); + + // Get upper 64 bits of src and copy it to mask and index + MAYBE_AVX(pextrq, index, xmm_src, 1); + c.mov(mask, index); + + // When length is 0, set it to 64 + c.and_(mask, 0x3F); // mask now holds the length + c.jz(length_zero); // Check if length is 0 and set mask to all 1s if it is + + // Create a mask out of the length + c.mov(cl, mask.cvt8()); + c.mov(mask, 1); + c.shl(mask, cl); + c.dec(mask); + c.jmp(end); + + c.L(length_zero); + c.mov(mask, 0xFFFF'FFFF'FFFF'FFFF); + + c.L(end); + // Get index to insert at + c.shr(index, 8); + c.and_(index, 0x3F); + + // src &= mask + MAYBE_AVX(movq, scratch1, xmm_src); + c.and_(scratch1, mask); + + // mask = ~(mask << index) + c.mov(cl, index.cvt8()); + c.shl(mask, cl); + c.not_(mask); + + // src <<= index + c.shl(scratch1, cl); + + // dst = (dst & mask) | src + MAYBE_AVX(movq, scratch2, xmm_dst); + c.and_(scratch2, mask); + c.or_(scratch2, scratch1); + + // Upper 64 bits are undefined in insertq + MAYBE_AVX(movq, xmm_dst, scratch2); + + c.pop(mask); + c.pop(index); + c.pop(scratch2); + c.pop(scratch1); + c.popfq(); + c.lea(rsp, ptr[rsp + 128]); + } +} + using PatchFilter = bool (*)(const ZydisDecodedOperand*); using InstructionGenerator = void (*)(const ZydisDecodedOperand*, Xbyak::CodeGenerator&); struct PatchInfo { @@ -601,6 +888,9 @@ static const std::unordered_map Patches = { {ZYDIS_MNEMONIC_MOV, {FilterTcbAccess, GenerateTcbAccess, false}}, #endif + {ZYDIS_MNEMONIC_EXTRQ, {FilterNoSSE4a, GenerateEXTRQ, true}}, + {ZYDIS_MNEMONIC_INSERTQ, {FilterNoSSE4a, GenerateINSERTQ, true}}, + #ifdef __APPLE__ // Patches for instruction sets not supported by Rosetta 2. // BMI1 @@ -615,64 +905,338 @@ static const std::unordered_map Patches = { #endif }; -void PatchInstructions(u64 segment_addr, u64 segment_size, Xbyak::CodeGenerator& c) { - if (Patches.empty()) { - // Nothing to patch on this platform. +static std::once_flag init_flag; + +struct PatchModule { + /// Mutex controlling access to module code regions. + std::mutex mutex{}; + + /// Start of the module. + u8* start; + + /// End of the module. + u8* end; + + /// Tracker for patched code locations. + std::set patched; + + /// Code generator for patching the module. + Xbyak::CodeGenerator patch_gen; + + /// Code generator for writing trampoline patches. + Xbyak::CodeGenerator trampoline_gen; + + PatchModule(u8* module_ptr, const u64 module_size, u8* trampoline_ptr, + const u64 trampoline_size) + : start(module_ptr), end(module_ptr + module_size), patch_gen(module_size, module_ptr), + trampoline_gen(trampoline_size, trampoline_ptr) {} +}; +static std::map modules; + +static PatchModule* GetModule(const void* ptr) { + auto upper_bound = modules.upper_bound(reinterpret_cast(ptr)); + if (upper_bound == modules.begin()) { + return nullptr; + } + return &(std::prev(upper_bound)->second); +} + +/// Returns a boolean indicating whether the instruction was patched, and the offset to advance past +/// whatever is at the current code pointer. +static std::pair TryPatch(u8* code, PatchModule* module) { + ZydisDecodedInstruction instruction; + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; + const auto status = Common::Decoder::Instance()->decodeInstruction(instruction, operands, code, + module->end - code); + if (!ZYAN_SUCCESS(status)) { + return std::make_pair(false, 1); + } + + if (Patches.contains(instruction.mnemonic)) { + const auto& patch_info = Patches.at(instruction.mnemonic); + bool needs_trampoline = patch_info.trampoline; + if (patch_info.filter(operands)) { + auto& patch_gen = module->patch_gen; + + if (needs_trampoline && instruction.length < 5) { + // Trampoline is needed but instruction is too short to patch. + // Return false and length to fall back to the illegal instruction handler, + // or to signal to AOT compilation that this instruction should be skipped and + // handled at runtime. + return std::make_pair(false, instruction.length); + } + + // Reset state and move to current code position. + patch_gen.reset(); + patch_gen.setSize(code - patch_gen.getCode()); + + if (needs_trampoline) { + auto& trampoline_gen = module->trampoline_gen; + const auto trampoline_ptr = trampoline_gen.getCurr(); + + patch_info.generator(operands, trampoline_gen); + + // Return to the following instruction at the end of the trampoline. + trampoline_gen.jmp(code + instruction.length); + + // Replace instruction with near jump to the trampoline. + patch_gen.jmp(trampoline_ptr, Xbyak::CodeGenerator::LabelType::T_NEAR); + } else { + patch_info.generator(operands, patch_gen); + } + + const auto patch_size = patch_gen.getCurr() - code; + if (patch_size > 0) { + ASSERT_MSG(instruction.length >= patch_size, + "Instruction {} with length {} is too short to replace at: {}", + ZydisMnemonicGetString(instruction.mnemonic), instruction.length, + fmt::ptr(code)); + + // Fill remaining space with nops. + patch_gen.nop(instruction.length - patch_size); + + module->patched.insert(code); + LOG_DEBUG(Core, "Patched instruction '{}' at: {}", + ZydisMnemonicGetString(instruction.mnemonic), fmt::ptr(code)); + return std::make_pair(true, instruction.length); + } + } + } + + return std::make_pair(false, instruction.length); +} + +#if defined(ARCH_X86_64) + +static bool TryExecuteIllegalInstruction(void* ctx, void* code_address) { + ZydisDecodedInstruction instruction; + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; + const auto status = + Common::Decoder::Instance()->decodeInstruction(instruction, operands, code_address); + + switch (instruction.mnemonic) { + case ZYDIS_MNEMONIC_EXTRQ: { + bool immediateForm = operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && + operands[2].type == ZYDIS_OPERAND_TYPE_IMMEDIATE; + if (immediateForm) { + LOG_CRITICAL(Core, "EXTRQ immediate form should have been patched at code address: {}", + fmt::ptr(code_address)); + return false; + } else { + ASSERT_MSG(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + operands[0].reg.value >= ZYDIS_REGISTER_XMM0 && + operands[0].reg.value <= ZYDIS_REGISTER_XMM15 && + operands[1].reg.value >= ZYDIS_REGISTER_XMM0 && + operands[1].reg.value <= ZYDIS_REGISTER_XMM15, + "Unexpected operand types for EXTRQ instruction"); + + const auto dstIndex = operands[0].reg.value - ZYDIS_REGISTER_XMM0; + const auto srcIndex = operands[1].reg.value - ZYDIS_REGISTER_XMM0; + + const auto dst = Common::GetXmmPointer(ctx, dstIndex); + const auto src = Common::GetXmmPointer(ctx, srcIndex); + + u64 lowQWordSrc; + memcpy(&lowQWordSrc, src, sizeof(lowQWordSrc)); + + u64 lowQWordDst; + memcpy(&lowQWordDst, dst, sizeof(lowQWordDst)); + + u64 length = lowQWordSrc & 0x3F; + u64 mask; + if (length == 0) { + length = 64; // for the check below + mask = 0xFFFF'FFFF'FFFF'FFFF; + } else { + mask = (1ULL << length) - 1; + } + + u64 index = (lowQWordSrc >> 8) & 0x3F; + if (length + index > 64) { + // Undefined behavior if length + index is bigger than 64 according to the spec, + // we'll warn and continue execution. + LOG_WARNING(Core, + "extrq at {} with length {} and index {} is bigger than 64, " + "undefined behavior", + fmt::ptr(code_address), length, index); + } + + lowQWordDst >>= index; + lowQWordDst &= mask; + + memcpy(dst, &lowQWordDst, sizeof(lowQWordDst)); + + Common::IncrementRip(ctx, instruction.length); + + return true; + } + break; + } + case ZYDIS_MNEMONIC_INSERTQ: { + bool immediateForm = operands[2].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && + operands[3].type == ZYDIS_OPERAND_TYPE_IMMEDIATE; + if (immediateForm) { + LOG_CRITICAL(Core, + "INSERTQ immediate form should have been patched at code address: {}", + fmt::ptr(code_address)); + return false; + } else { + ASSERT_MSG(operands[2].type == ZYDIS_OPERAND_TYPE_UNUSED && + operands[3].type == ZYDIS_OPERAND_TYPE_UNUSED, + "operands 2 and 3 must be unused for register form."); + + ASSERT_MSG(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER, + "operands 0 and 1 must be registers."); + + const auto dstIndex = operands[0].reg.value - ZYDIS_REGISTER_XMM0; + const auto srcIndex = operands[1].reg.value - ZYDIS_REGISTER_XMM0; + + const auto dst = Common::GetXmmPointer(ctx, dstIndex); + const auto src = Common::GetXmmPointer(ctx, srcIndex); + + u64 lowQWordSrc, highQWordSrc; + memcpy(&lowQWordSrc, src, sizeof(lowQWordSrc)); + memcpy(&highQWordSrc, (u8*)src + 8, sizeof(highQWordSrc)); + + u64 lowQWordDst; + memcpy(&lowQWordDst, dst, sizeof(lowQWordDst)); + + u64 length = highQWordSrc & 0x3F; + u64 mask; + if (length == 0) { + length = 64; // for the check below + mask = 0xFFFF'FFFF'FFFF'FFFF; + } else { + mask = (1ULL << length) - 1; + } + + u64 index = (highQWordSrc >> 8) & 0x3F; + if (length + index > 64) { + // Undefined behavior if length + index is bigger than 64 according to the spec, + // we'll warn and continue execution. + LOG_WARNING(Core, + "insertq at {} with length {} and index {} is bigger than 64, " + "undefined behavior", + fmt::ptr(code_address), length, index); + } + + lowQWordSrc &= mask; + lowQWordDst &= ~(mask << index); + lowQWordDst |= lowQWordSrc << index; + + memcpy(dst, &lowQWordDst, sizeof(lowQWordDst)); + + Common::IncrementRip(ctx, instruction.length); + + return true; + } + break; + } + default: { + LOG_ERROR(Core, "Unhandled illegal instruction at code address {}: {}", + fmt::ptr(code_address), ZydisMnemonicGetString(instruction.mnemonic)); + return false; + } + } + + UNREACHABLE(); +} +#elif defined(ARCH_ARM64) +// These functions shouldn't be needed for ARM as it will use a JIT so there's no need to patch +// instructions. +static bool TryExecuteIllegalInstruction(void*, void*) { + return false; +} +#else +#error "Unsupported architecture" +#endif + +static bool TryPatchJit(void* code_address) { + auto* code = static_cast(code_address); + auto* module = GetModule(code); + if (module == nullptr) { + return false; + } + + std::unique_lock lock{module->mutex}; + + // Return early if already patched, in case multiple threads signaled at the same time. + if (std::ranges::find(module->patched, code) != module->patched.end()) { + return true; + } + + return TryPatch(code, module).first; +} + +static void TryPatchAot(void* code_address, u64 code_size) { + auto* code = static_cast(code_address); + auto* module = GetModule(code); + if (module == nullptr) { return; } - ZydisDecoder instr_decoder; - ZydisDecodedInstruction instruction; - ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; - ZydisDecoderInit(&instr_decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_STACK_WIDTH_64); + std::unique_lock lock{module->mutex}; - u8* code = reinterpret_cast(segment_addr); - u8* end = code + segment_size; + const auto* end = code + code_size; while (code < end) { - ZyanStatus status = - ZydisDecoderDecodeFull(&instr_decoder, code, end - code, &instruction, operands); - if (!ZYAN_SUCCESS(status)) { - code++; - continue; - } - - if (Patches.contains(instruction.mnemonic)) { - auto patch_info = Patches.at(instruction.mnemonic); - if (patch_info.filter(operands)) { - auto patch_gen = Xbyak::CodeGenerator(instruction.length, code); - - if (patch_info.trampoline) { - const auto trampoline_ptr = c.getCurr(); - - patch_info.generator(operands, c); - - // Return to the following instruction at the end of the trampoline. - c.jmp(code + instruction.length); - - // Replace instruction with near jump to the trampoline. - patch_gen.jmp(trampoline_ptr, Xbyak::CodeGenerator::LabelType::T_NEAR); - } else { - patch_info.generator(operands, patch_gen); - } - - const auto patch_size = patch_gen.getCurr() - code; - if (patch_size > 0) { - ASSERT_MSG(instruction.length >= patch_size, - "Instruction {} with length {} is too short to replace at: {}", - ZydisMnemonicGetString(instruction.mnemonic), instruction.length, - fmt::ptr(code)); - - // Fill remaining space with nops. - patch_gen.nop(instruction.length - patch_size); - - LOG_DEBUG(Core, "Patched instruction '{}' at: {}", - ZydisMnemonicGetString(instruction.mnemonic), fmt::ptr(code)); - } - } - } - - code += instruction.length; + code += TryPatch(code, module).second; } } +static bool PatchesAccessViolationHandler(void* context, void* /* fault_address */) { + return TryPatchJit(Common::GetRip(context)); +} + +static bool PatchesIllegalInstructionHandler(void* context) { + void* code_address = Common::GetRip(context); + if (!TryPatchJit(code_address)) { + return TryExecuteIllegalInstruction(context, code_address); + } + return true; +} + +static void PatchesInit() { + if (!Patches.empty()) { + auto* signals = Signals::Instance(); + // Should be called last. + constexpr auto priority = std::numeric_limits::max(); + signals->RegisterAccessViolationHandler(PatchesAccessViolationHandler, priority); + signals->RegisterIllegalInstructionHandler(PatchesIllegalInstructionHandler, priority); + } +} + +void RegisterPatchModule(void* module_ptr, u64 module_size, void* trampoline_area_ptr, + u64 trampoline_area_size) { + std::call_once(init_flag, PatchesInit); + + const auto module_addr = reinterpret_cast(module_ptr); + modules.emplace(std::piecewise_construct, std::forward_as_tuple(module_addr), + std::forward_as_tuple(static_cast(module_ptr), module_size, + static_cast(trampoline_area_ptr), + trampoline_area_size)); +} + +void PrePatchInstructions(u64 segment_addr, u64 segment_size) { +#if defined(__APPLE__) + // HACK: For some reason patching in the signal handler at the start of a page does not work + // under Rosetta 2. Patch any instructions at the start of a page ahead of time. + if (!Patches.empty()) { + auto* code_page = reinterpret_cast(Common::AlignUp(segment_addr, 0x1000)); + const auto* end_page = code_page + Common::AlignUp(segment_size, 0x1000); + while (code_page < end_page) { + TryPatchJit(code_page); + code_page += 0x1000; + } + } +#elif !defined(_WIN32) + // Linux and others have an FS segment pointing to valid memory, so continue to do full + // ahead-of-time patching for now until a better solution is worked out. + if (!Patches.empty()) { + TryPatchAot(reinterpret_cast(segment_addr), segment_size); + } +#endif +} + } // namespace Core diff --git a/src/core/cpu_patches.h b/src/core/cpu_patches.h index 9126074ed..f9f7fe646 100644 --- a/src/core/cpu_patches.h +++ b/src/core/cpu_patches.h @@ -3,10 +3,6 @@ #pragma once -namespace Xbyak { -class CodeGenerator; -} - namespace Core { /// Initializes a stack for the current thread for use by patch implementations. @@ -15,7 +11,11 @@ void InitializeThreadPatchStack(); /// Cleans up the patch stack for the current thread. void CleanupThreadPatchStack(); -/// Patches CPU instructions that cannot run as-is on the host. -void PatchInstructions(u64 segment_addr, u64 segment_size, Xbyak::CodeGenerator& c); +/// Registers a module for patching, providing an area to generate trampoline code. +void RegisterPatchModule(void* module_ptr, u64 module_size, void* trampoline_area_ptr, + u64 trampoline_area_size); + +/// Applies CPU patches that need to be done before beginning executions. +void PrePatchInstructions(u64 segment_addr, u64 segment_size); } // namespace Core diff --git a/src/core/debug_state.cpp b/src/core/debug_state.cpp new file mode 100644 index 000000000..050143e6e --- /dev/null +++ b/src/core/debug_state.cpp @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/native_clock.h" +#include "common/singleton.h" +#include "debug_state.h" +#include "libraries/kernel/event_queues.h" +#include "libraries/kernel/time_management.h" +#include "libraries/system/msgdialog.h" + +using namespace DebugStateType; + +DebugStateImpl& DebugState = *Common::Singleton::Instance(); + +static ThreadID ThisThreadID() { +#ifdef _WIN32 + return GetCurrentThreadId(); +#else + return pthread_self(); +#endif +} + +static void PauseThread(ThreadID id) { +#ifdef _WIN32 + auto handle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, id); + SuspendThread(handle); + CloseHandle(handle); +#else + pthread_kill(id, SIGUSR1); +#endif +} + +static void ResumeThread(ThreadID id) { +#ifdef _WIN32 + auto handle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, id); + ResumeThread(handle); + CloseHandle(handle); +#else + pthread_kill(id, SIGUSR1); +#endif +} + +void DebugStateImpl::AddCurrentThreadToGuestList() { + std::lock_guard lock{guest_threads_mutex}; + const ThreadID id = ThisThreadID(); + guest_threads.push_back(id); +} + +void DebugStateImpl::RemoveCurrentThreadFromGuestList() { + std::lock_guard lock{guest_threads_mutex}; + const ThreadID id = ThisThreadID(); + std::erase_if(guest_threads, [&](const ThreadID& v) { return v == id; }); +} + +void DebugStateImpl::PauseGuestThreads() { + using namespace Libraries::MsgDialog; + std::unique_lock lock{guest_threads_mutex}; + if (is_guest_threads_paused) { + return; + } + if (ShouldPauseInSubmit()) { + waiting_submit_pause = false; + should_show_frame_dump = true; + } + bool self_guest = false; + ThreadID self_id = ThisThreadID(); + for (const auto& id : guest_threads) { + if (id == self_id) { + self_guest = true; + } else { + PauseThread(id); + } + } + pause_time = Libraries::Kernel::Dev::GetClock()->GetUptime(); + is_guest_threads_paused = true; + lock.unlock(); + if (self_guest) { + PauseThread(self_id); + } +} + +void DebugStateImpl::ResumeGuestThreads() { + std::lock_guard lock{guest_threads_mutex}; + if (!is_guest_threads_paused) { + return; + } + + u64 delta_time = Libraries::Kernel::Dev::GetClock()->GetUptime() - pause_time; + Libraries::Kernel::Dev::GetInitialPtc() += delta_time; + for (const auto& id : guest_threads) { + ResumeThread(id); + } + is_guest_threads_paused = false; +} + +void DebugStateImpl::RequestFrameDump(s32 count) { + gnm_frame_dump_request_count = count; + frame_dump_list.clear(); + frame_dump_list.resize(count); + waiting_submit_pause = true; +} diff --git a/src/core/debug_state.h b/src/core/debug_state.h new file mode 100644 index 000000000..00c687fa5 --- /dev/null +++ b/src/core/debug_state.h @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include + +#include "common/types.h" + +#ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +using ThreadID = DWORD; +#else +#include +#include +using ThreadID = pthread_t; +#endif + +namespace Core::Devtools { +class Layer; +namespace Widget { +class FrameGraph; +} +} // namespace Core::Devtools + +namespace DebugStateType { + +enum class QueueType { + acb, + dcb, + ccb, +}; + +struct QueueDump { + QueueType type; + u32 submit_num; + u32 num2; // acb: queue_num; else: buffer_in_submit + std::vector data; +}; + +struct FrameDump { + std::vector queues; +}; + +class DebugStateImpl { + friend class Core::Devtools::Layer; + friend class Core::Devtools::Widget::FrameGraph; + + std::mutex guest_threads_mutex{}; + std::vector guest_threads{}; + std::atomic_bool is_guest_threads_paused = false; + u64 pause_time{}; + + std::atomic_int32_t flip_frame_count = 0; + std::atomic_int32_t gnm_frame_count = 0; + + s32 gnm_frame_dump_request_count = -1; + bool waiting_submit_pause = false; + bool should_show_frame_dump = false; + + std::mutex frame_dump_list_mutex; + std::vector frame_dump_list{}; + + std::queue debug_message_popup; + +public: + void AddCurrentThreadToGuestList(); + + void RemoveCurrentThreadFromGuestList(); + + void PauseGuestThreads(); + + void ResumeGuestThreads(); + + bool IsGuestThreadsPaused() const { + return is_guest_threads_paused; + } + + void IncFlipFrameNum() { + ++flip_frame_count; + } + + void IncGnmFrameNum() { + ++gnm_frame_count; + --gnm_frame_dump_request_count; + } + + u32 GetFrameNum() const { + return flip_frame_count; + } + + bool DumpingCurrentFrame() const { + return gnm_frame_dump_request_count > 0; + } + + bool ShouldPauseInSubmit() const { + return waiting_submit_pause && gnm_frame_dump_request_count == 0; + } + + void RequestFrameDump(s32 count = 1); + + FrameDump& GetFrameDump() { + return frame_dump_list[frame_dump_list.size() - gnm_frame_dump_request_count]; + } + + void PushQueueDump(QueueDump dump) { + std::unique_lock lock{frame_dump_list_mutex}; + GetFrameDump().queues.push_back(std::move(dump)); + } + + void ShowDebugMessage(std::string message) { + if (message.empty()) { + return; + } + debug_message_popup.push(std::move(message)); + } +}; +} // namespace DebugStateType + +extern DebugStateType::DebugStateImpl& DebugState; diff --git a/src/core/devtools/gcn/gcn_context_regs.cpp b/src/core/devtools/gcn/gcn_context_regs.cpp new file mode 100644 index 000000000..843ba9e65 --- /dev/null +++ b/src/core/devtools/gcn/gcn_context_regs.cpp @@ -0,0 +1,297 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Credits to https://github.com/psucien/tlg-emu-tools/ + +#include "common/types.h" +#include "gcn/si_ci_vi_merged_offset.h" + +using namespace Pal::Gfx6; + +namespace Core::Devtools::Gcn { +const char* GetContextRegName(u32 reg_offset) { + switch (reg_offset) { + case mmDB_SHADER_CONTROL: + return "mmDB_SHADER_CONTROL"; + case mmCB_SHADER_MASK: + return "mmCB_SHADER_MASK"; + case mmPA_CL_CLIP_CNTL: + return "mmPA_CL_CLIP_CNTL"; + case mmVGT_INSTANCE_STEP_RATE_0: + return "mmVGT_INSTANCE_STEP_RATE_0"; + case mmVGT_INSTANCE_STEP_RATE_1: + return "mmVGT_INSTANCE_STEP_RATE_1"; + case mmVGT_INDX_OFFSET: + return "mmVGT_INDX_OFFSET"; + case mmVGT_SHADER_STAGES_EN: + return "mmVGT_SHADER_STAGES_EN"; + case mmVGT_GS_MODE: + return "mmVGT_GS_MODE"; + case mmVGT_STRMOUT_CONFIG: + return "mmVGT_STRMOUT_CONFIG"; + case mmVGT_OUT_DEALLOC_CNTL: + return "mmVGT_OUT_DEALLOC_CNTL"; + case mmVGT_VTX_CNT_EN: + return "mmVGT_VTX_CNT_EN"; + case mmVGT_MAX_VTX_INDX: + return "mmVGT_MAX_VTX_INDX"; + case mmVGT_MULTI_PRIM_IB_RESET_INDX: + return "mmVGT_MULTI_PRIM_IB_RESET_INDX"; + case mmVGT_OUTPUT_PATH_CNTL: + return "mmVGT_OUTPUT_PATH_CNTL"; + case mmVGT_GS_PER_ES: + return "mmVGT_GS_PER_ES"; + case mmVGT_ES_PER_GS: + return "mmVGT_ES_PER_GS"; + case mmVGT_GS_PER_VS: + return "mmVGT_GS_PER_VS"; + case mmCB_COLOR0_BASE: + return "mmCB_COLOR0_BASE"; + case mmCB_COLOR0_INFO: + return "mmCB_COLOR0_INFO"; + case mmCB_COLOR0_CMASK_SLICE: + return "mmCB_COLOR0_CMASK_SLICE"; + case mmCB_COLOR0_CLEAR_WORD0: + return "mmCB_COLOR0_CLEAR_WORD0"; + case mmCB_COLOR0_CLEAR_WORD1: + return "mmCB_COLOR0_CLEAR_WORD1"; + case mmCB_COLOR0_PITCH: + return "mmCB_COLOR0_PITCH"; + case mmCB_COLOR0_SLICE: + return "mmCB_COLOR0_SLICE"; + case mmCB_COLOR0_VIEW: + return "mmCB_COLOR0_VIEW"; + case mmCB_COLOR0_DCC_CONTROL__VI: + return "mmCB_COLOR0_DCC_CONTROL"; + case mmCB_COLOR0_CMASK: + return "mmCB_COLOR0_CMASK"; + case mmCB_COLOR0_FMASK_SLICE: + return "mmCB_COLOR0_FMASK_SLICE"; + case mmCB_COLOR0_FMASK: + return "mmCB_COLOR0_FMASK"; + case mmCB_COLOR0_DCC_BASE__VI: + return "mmCB_COLOR0_DCC_BASE"; + case mmCB_COLOR0_ATTRIB: + return "mmCB_COLOR0_ATTRIB"; + case mmCB_COLOR1_BASE: + return "mmCB_COLOR1_BASE"; + case mmCB_COLOR1_INFO: + return "mmCB_COLOR1_INFO"; + case mmCB_COLOR1_ATTRIB: + return "mmCB_COLOR1_ATTRIB"; + case mmCB_COLOR1_CMASK_SLICE: + return "mmCB_COLOR1_CMASK_SLICE"; + case mmCB_COLOR1_CLEAR_WORD0: + return "mmCB_COLOR1_CLEAR_WORD0"; + case mmCB_COLOR1_CLEAR_WORD1: + return "mmCB_COLOR1_CLEAR_WORD1"; + case mmCB_COLOR1_PITCH: + return "mmCB_COLOR1_PITCH"; + case mmCB_COLOR1_VIEW: + return "mmCB_COLOR1_VIEW"; + case mmCB_COLOR2_INFO: + return "mmCB_COLOR2_INFO"; + case mmCB_COLOR2_ATTRIB: + return "mmCB_COLOR2_ATTRIB"; + case mmCB_COLOR2_CMASK_SLICE: + return "mmCB_COLOR2_CMASK_SLICE"; + case mmCB_COLOR2_CLEAR_WORD0: + return "mmCB_COLOR2_CLEAR_WORD0"; + case mmCB_COLOR2_CLEAR_WORD1: + return "mmCB_COLOR2_CLEAR_WORD1"; + case mmCB_COLOR2_PITCH: + return "mmCB_COLOR2_PITCH"; + case mmCB_COLOR2_VIEW: + return "mmCB_COLOR2_VIEW"; + case mmCB_COLOR3_INFO: + return "mmCB_COLOR3_INFO"; + case mmCB_COLOR3_CMASK_SLICE: + return "mmCB_COLOR3_CMASK_SLICE"; + case mmCB_COLOR4_INFO: + return "mmCB_COLOR4_INFO"; + case mmCB_COLOR5_INFO: + return "mmCB_COLOR5_INFO"; + case mmCB_COLOR6_INFO: + return "mmCB_COLOR6_INFO"; + case mmCB_COLOR7_INFO: + return "mmCB_COLOR7_INFO"; + case mmDB_SRESULTS_COMPARE_STATE0: + return "mmDB_SRESULTS_COMPARE_STATE0"; + case mmDB_SRESULTS_COMPARE_STATE1: + return "mmDB_SRESULTS_COMPARE_STATE1"; + case mmDB_DEPTH_CONTROL: + return "mmDB_DEPTH_CONTROL"; + case mmDB_EQAA: + return "mmDB_EQAA"; + case mmPA_SU_POINT_SIZE: + return "mmPA_SU_POINT_SIZE"; + case mmPA_SU_POINT_MINMAX: + return "mmPA_SU_POINT_MINMAX"; + case mmPA_SU_SC_MODE_CNTL: + return "mmPA_SU_SC_MODE_CNTL"; + case mmPA_SU_POLY_OFFSET_DB_FMT_CNTL: + return "mmPA_SU_POLY_OFFSET_DB_FMT_CNTL"; + case mmPA_SC_CLIPRECT_RULE: + return "mmPA_SC_CLIPRECT_RULE"; + case mmPA_SC_MODE_CNTL_0: + return "mmPA_SC_MODE_CNTL_0"; + case mmPA_SC_MODE_CNTL_1: + return "mmPA_SC_MODE_CNTL_1"; + case mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0: + return "mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0"; + case mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0: + return "mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0"; + case mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0: + return "mmPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0"; + case mmPA_SC_AA_MASK_X0Y0_X1Y0: + return "mmPA_SC_AA_MASK_X0Y0_X1Y0"; + case mmPA_SC_AA_MASK_X0Y1_X1Y1: + return "mmPA_SC_AA_MASK_X0Y1_X1Y1"; + case mmPA_SC_CENTROID_PRIORITY_0: + return "mmPA_SC_CENTROID_PRIORITY_0"; + case mmPA_SC_CENTROID_PRIORITY_1: + return "mmPA_SC_CENTROID_PRIORITY_1"; + case mmPA_SC_AA_CONFIG: + return "mmPA_SC_AA_CONFIG"; + case mmDB_RENDER_CONTROL: + return "mmDB_RENDER_CONTROL"; + case mmDB_STENCIL_CONTROL: + return "mmDB_STENCIL_CONTROL"; + case mmDB_STENCILREFMASK: + return "mmDB_STENCILREFMASK"; + case mmDB_STENCILREFMASK_BF: + return "mmDB_STENCILREFMASK_BF"; + case mmDB_STENCIL_CLEAR: + return "mmDB_STENCIL_CLEAR"; + case mmDB_DEPTH_CLEAR: + return "mmDB_DEPTH_CLEAR"; + case mmCB_TARGET_MASK: + return "mmCB_TARGET_MASK"; + case mmDB_Z_INFO: + return "mmDB_Z_INFO"; + case mmDB_STENCIL_INFO: + return "mmDB_STENCIL_INFO"; + case mmDB_Z_READ_BASE: + return "mmDB_Z_READ_BASE"; + case mmDB_STENCIL_READ_BASE: + return "mmDB_STENCIL_READ_BASE"; + case mmDB_Z_WRITE_BASE: + return "mmDB_Z_WRITE_BASE"; + case mmDB_STENCIL_WRITE_BASE: + return "mmDB_STENCIL_WRITE_BASE"; + case mmDB_DEPTH_INFO: + return "mmDB_DEPTH_INFO"; + case mmDB_DEPTH_VIEW: + return "mmDB_DEPTH_VIEW"; + case mmDB_DEPTH_SLICE: + return "mmDB_DEPTH_SLICE"; + case mmDB_DEPTH_SIZE: + return "mmDB_DEPTH_SIZE"; + case mmTA_BC_BASE_ADDR: + return "mmTA_BC_BASE_ADDR"; + case mmCB_BLEND_RED: + return "mmCB_BLEND_RED"; + case mmCB_BLEND_GREEN: + return "mmCB_BLEND_GREEN"; + case mmCB_BLEND_BLUE: + return "mmCB_BLEND_BLUE"; + case mmDB_ALPHA_TO_MASK: + return "mmDB_ALPHA_TO_MASK"; + case mmCB_BLEND0_CONTROL: + return "mmCB_BLEND0_CONTROL"; + case mmCB_BLEND1_CONTROL: + return "mmCB_BLEND1_CONTROL"; + case mmCB_BLEND2_CONTROL: + return "mmCB_BLEND2_CONTROL"; + case mmCB_BLEND3_CONTROL: + return "mmCB_BLEND3_CONTROL"; + case mmCB_BLEND4_CONTROL: + return "mmCB_BLEND4_CONTROL"; + case mmCB_BLEND5_CONTROL: + return "mmCB_BLEND5_CONTROL"; + case mmCB_BLEND6_CONTROL: + return "mmCB_BLEND6_CONTROL"; + case mmCB_BLEND7_CONTROL: + return "mmCB_BLEND7_CONTROL"; + case mmDB_HTILE_DATA_BASE: + return "mmDB_HTILE_DATA_BASE"; + case mmDB_HTILE_SURFACE: + return "mmDB_HTILE_SURFACE"; + case mmPA_SU_LINE_CNTL: + return "mmPA_SU_LINE_CNTL"; + case mmPA_SC_VPORT_ZMIN_0: + return "mmPA_SC_VPORT_ZMIN_0"; + case mmPA_SC_VPORT_ZMAX_0: + return "mmPA_SC_VPORT_ZMAX_0"; + case mmPA_SC_VPORT_SCISSOR_0_TL: + return "mmPA_SC_VPORT_SCISSOR_0_TL"; + case mmPA_SC_VPORT_SCISSOR_0_BR: + return "mmPA_SC_VPORT_SCISSOR_0_BR"; + case mmPA_SC_GENERIC_SCISSOR_TL: + return "mmPA_SC_GENERIC_SCISSOR_TL"; + case mmPA_SC_GENERIC_SCISSOR_BR: + return "mmPA_SC_GENERIC_SCISSOR_BR"; + case mmPA_CL_VPORT_XSCALE: + return "mmPA_CL_VPORT_XSCALE"; + case mmPA_CL_VPORT_YSCALE: + return "mmPA_CL_VPORT_YSCALE"; + case mmPA_CL_VPORT_ZSCALE: + return "mmPA_CL_VPORT_ZSCALE"; + case mmPA_CL_VPORT_XOFFSET: + return "mmPA_CL_VPORT_XOFFSET"; + case mmPA_CL_VPORT_YOFFSET: + return "mmPA_CL_VPORT_YOFFSET"; + case mmPA_CL_VPORT_ZOFFSET: + return "mmPA_CL_VPORT_ZOFFSET"; + case mmPA_CL_VTE_CNTL: + return "mmPA_CL_VTE_CNTL"; + case mmPA_SC_SCREEN_SCISSOR_TL: + return "mmPA_SC_SCREEN_SCISSOR_TL"; + case mmPA_SC_SCREEN_SCISSOR_BR: + return "mmPA_SC_SCREEN_SCISSOR_BR"; + case mmPA_SU_HARDWARE_SCREEN_OFFSET: + return "mmPA_SU_HARDWARE_SCREEN_OFFSET"; + case mmPA_SU_VTX_CNTL: + return "mmPA_SU_VTX_CNTL"; + case mmPA_CL_GB_VERT_CLIP_ADJ: + return "mmPA_CL_GB_VERT_CLIP_ADJ"; + case mmPA_CL_GB_HORZ_CLIP_ADJ: + return "mmPA_CL_GB_HORZ_CLIP_ADJ"; + case mmPA_CL_GB_VERT_DISC_ADJ: + return "mmPA_CL_GB_VERT_DISC_ADJ"; + case mmPA_CL_GB_HORZ_DISC_ADJ: + return "mmPA_CL_GB_HORZ_DISC_ADJ"; + case mmCB_COLOR_CONTROL: + return "mmCB_COLOR_CONTROL"; + case mmSPI_SHADER_Z_FORMAT: + return "mmSPI_SHADER_Z_FORMAT"; + case mmSPI_SHADER_COL_FORMAT: + return "mmSPI_SHADER_COL_FORMAT"; + case mmPA_CL_VS_OUT_CNTL: + return "mmPA_CL_VS_OUT_CNTL"; + case mmSPI_VS_OUT_CONFIG: + return "mmSPI_VS_OUT_CONFIG"; + case mmSPI_SHADER_POS_FORMAT: + return "mmSPI_SHADER_POS_FORMAT"; + case mmSPI_PS_INPUT_ENA: + return "mmSPI_PS_INPUT_ENA"; + case mmSPI_PS_INPUT_ADDR: + return "mmSPI_PS_INPUT_ADDR"; + case mmSPI_PS_IN_CONTROL: + return "mmSPI_PS_IN_CONTROL"; + case mmSPI_BARYC_CNTL: + return "mmSPI_BARYC_CNTL"; + case mmSPI_PS_INPUT_CNTL_0: + return "mmSPI_PS_INPUT_CNTL_0"; + case mmSPI_PS_INPUT_CNTL_1: + return "mmSPI_PS_INPUT_CNTL_1"; + case mmSPI_PS_INPUT_CNTL_2: + return "mmSPI_PS_INPUT_CNTL_2"; + case mmSPI_PS_INPUT_CNTL_3: + return "mmSPI_PS_INPUT_CNTL_3"; + default: + break; + } + return ""; +} +} // namespace Core::Devtools::Gcn \ No newline at end of file diff --git a/src/core/devtools/gcn/gcn_op_names.cpp b/src/core/devtools/gcn/gcn_op_names.cpp new file mode 100644 index 000000000..6684b660e --- /dev/null +++ b/src/core/devtools/gcn/gcn_op_names.cpp @@ -0,0 +1,118 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Credits to https://github.com/psucien/tlg-emu-tools/ + +#include "common/types.h" +#include "gcn/si_ci_vi_merged_pm4_it_opcodes.h" + +namespace Core::Devtools::Gcn { +const char* GetOpCodeName(u32 op) { + switch (op) { + case IT_NOP: + return "IT_NOP"; + case IT_SET_BASE: + return "IT_SET_BASE"; + case IT_INDEX_BUFFER_SIZE: + return "IT_INDEX_BUFFER_SIZE"; + case IT_SET_PREDICATION: + return "IT_SET_PREDICATION"; + case IT_COND_EXEC: + return "IT_COND_EXEC"; + case IT_INDEX_BASE: + return "IT_INDEX_BASE"; + case IT_INDEX_TYPE: + return "IT_INDEX_TYPE"; + case IT_NUM_INSTANCES: + return "IT_NUM_INSTANCES"; + case IT_STRMOUT_BUFFER_UPDATE: + return "IT_STRMOUT_BUFFER_UPDATE"; + case IT_WRITE_DATA: + return "IT_WRITE_DATA"; + case IT_MEM_SEMAPHORE: + return "IT_MEM_SEMAPHORE"; + case IT_WAIT_REG_MEM: + return "IT_WAIT_REG_MEM"; + case IT_INDIRECT_BUFFER: + return "IT_INDIRECT_BUFFER"; + case IT_PFP_SYNC_ME: + return "IT_PFP_SYNC_ME"; + case IT_EVENT_WRITE: + return "IT_EVENT_WRITE"; + case IT_EVENT_WRITE_EOP: + return "IT_EVENT_WRITE_EOP"; + case IT_EVENT_WRITE_EOS: + return "IT_EVENT_WRITE_EOS"; + case IT_DMA_DATA__CI__VI: + return "IT_DMA_DATA"; + case IT_ACQUIRE_MEM__CI__VI: + return "IT_ACQUIRE_MEM"; + case IT_REWIND__CI__VI: + return "IT_REWIND"; + case IT_SET_CONFIG_REG: + return "IT_SET_CONFIG_REG"; + case IT_SET_CONTEXT_REG: + return "IT_SET_CONTEXT_REG"; + case IT_SET_SH_REG: + return "IT_SET_SH_REG"; + case IT_SET_UCONFIG_REG__CI__VI: + return "IT_SET_UCONFIG_REG"; + case IT_INCREMENT_DE_COUNTER: + return "IT_INCREMENT_DE_COUNTER"; + case IT_WAIT_ON_CE_COUNTER: + return "IT_WAIT_ON_CE_COUNTER"; + case IT_DISPATCH_DIRECT: + return "IT_DISPATCH_DIRECT"; + case IT_DISPATCH_INDIRECT: + return "IT_DISPATCH_INDIRECT"; + case IT_OCCLUSION_QUERY: + return "IT_OCCLUSION_QUERY"; + case IT_REG_RMW: + return "IT_REG_RMW"; + case IT_PRED_EXEC: + return "IT_PRED_EXEC"; + case IT_DRAW_INDIRECT: + return "IT_DRAW_INDIRECT"; + case IT_DRAW_INDEX_INDIRECT: + return "IT_DRAW_INDEX_INDIRECT"; + case IT_DRAW_INDEX_2: + return "IT_DRAW_INDEX_2"; + case IT_DRAW_INDEX_OFFSET_2: + return "IT_DRAW_INDEX_OFFSET_2"; + case IT_CONTEXT_CONTROL: + return "IT_CONTEXT_CONTROL"; + case IT_DRAW_INDIRECT_MULTI: + return "IT_DRAW_INDIRECT_MULTI"; + case IT_DRAW_INDEX_AUTO: + return "IT_DRAW_INDEX_AUTO"; + case IT_DRAW_INDEX_MULTI_AUTO: + return "IT_DRAW_INDEX_MULTI_AUTO"; + case IT_COPY_DATA: + return "IT_COPY_DATA"; + case IT_CP_DMA: + return "IT_CP_DMA"; + case IT_SURFACE_SYNC: + return "IT_SURFACE_SYNC"; + case IT_COND_WRITE: + return "IT_COND_WRITE"; + case IT_RELEASE_MEM__CI__VI: + return "IT_RELEASE_MEM"; + case IT_WRITE_CONST_RAM: + return "IT_WRITE_CONST_RAM"; // used in CCB + case IT_WAIT_ON_DE_COUNTER_DIFF: + return "IT_WAIT_ON_DE_COUNTER_DIFF"; // used in CCB + case IT_DUMP_CONST_RAM: + return "IT_DUMP_CONST_RAM"; // used in CCB + case IT_INCREMENT_CE_COUNTER: + return "IT_INCREMENT_CE_COUNTER"; // used in CCB + case IT_CLEAR_STATE: + return "IT_CLEAR_STATE"; + case 0xFF: + return ""; + default: + break; + } + + return ""; +} +} // namespace Core::Devtools::Gcn \ No newline at end of file diff --git a/src/core/devtools/gcn/gcn_shader_regs.cpp b/src/core/devtools/gcn/gcn_shader_regs.cpp new file mode 100644 index 000000000..16778dd07 --- /dev/null +++ b/src/core/devtools/gcn/gcn_shader_regs.cpp @@ -0,0 +1,171 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Credits to https://github.com/psucien/tlg-emu-tools/ + +#include "common/types.h" +#include "gcn/si_ci_vi_merged_offset.h" + +using namespace Pal::Gfx6; + +namespace Core::Devtools::Gcn { +const char* GetShaderRegName(u32 reg_offset) { + switch (reg_offset) { + case mmSPI_SHADER_PGM_LO_VS: + return "mmSPI_SHADER_PGM_LO_VS"; + case mmSPI_SHADER_PGM_HI_VS: + return "mmSPI_SHADER_PGM_HI_VS"; + case mmSPI_SHADER_PGM_LO_PS: + return "mmSPI_SHADER_PGM_LO_PS"; + case mmSPI_SHADER_PGM_HI_PS: + return "mmSPI_SHADER_PGM_HI_PS"; + case mmSPI_SHADER_PGM_RSRC1_VS: + return "mmSPI_SHADER_PGM_RSRC1_VS"; + case mmSPI_SHADER_PGM_RSRC2_VS: + return "mmSPI_SHADER_PGM_RSRC2_VS"; + case mmSPI_SHADER_PGM_RSRC3_VS__CI__VI: + return "mmSPI_SHADER_PGM_RSRC3_VS__CI__VI"; + case mmSPI_SHADER_PGM_RSRC1_PS: + return "mmSPI_SHADER_PGM_RSRC1_PS"; + case mmSPI_SHADER_PGM_RSRC2_PS: + return "mmSPI_SHADER_PGM_RSRC2_PS"; + case mmSPI_SHADER_PGM_RSRC3_PS__CI__VI: + return "mmSPI_SHADER_PGM_RSRC3_PS__CI__VI"; + case mmSPI_SHADER_USER_DATA_PS_0: + return "mmSPI_SHADER_USER_DATA_PS_0"; + case mmSPI_SHADER_USER_DATA_PS_1: + return "mmSPI_SHADER_USER_DATA_PS_1"; + case mmSPI_SHADER_USER_DATA_PS_2: + return "mmSPI_SHADER_USER_DATA_PS_2"; + case mmSPI_SHADER_USER_DATA_PS_3: + return "mmSPI_SHADER_USER_DATA_PS_3"; + case mmSPI_SHADER_USER_DATA_PS_4: + return "mmSPI_SHADER_USER_DATA_PS_4"; + case mmSPI_SHADER_USER_DATA_PS_5: + return "mmSPI_SHADER_USER_DATA_PS_5"; + case mmSPI_SHADER_USER_DATA_PS_6: + return "mmSPI_SHADER_USER_DATA_PS_6"; + case mmSPI_SHADER_USER_DATA_PS_7: + return "mmSPI_SHADER_USER_DATA_PS_7"; + case mmSPI_SHADER_USER_DATA_PS_8: + return "mmSPI_SHADER_USER_DATA_PS_8"; + case mmSPI_SHADER_USER_DATA_PS_9: + return "mmSPI_SHADER_USER_DATA_PS_9"; + case mmSPI_SHADER_USER_DATA_PS_10: + return "mmSPI_SHADER_USER_DATA_PS_10"; + case mmSPI_SHADER_USER_DATA_PS_11: + return "mmSPI_SHADER_USER_DATA_PS_11"; + case mmSPI_SHADER_USER_DATA_PS_12: + return "mmSPI_SHADER_USER_DATA_PS_12"; + case mmSPI_SHADER_USER_DATA_PS_13: + return "mmSPI_SHADER_USER_DATA_PS_13"; + case mmSPI_SHADER_USER_DATA_PS_14: + return "mmSPI_SHADER_USER_DATA_PS_14"; + case mmSPI_SHADER_USER_DATA_PS_15: + return "mmSPI_SHADER_USER_DATA_PS_15"; + case mmCOMPUTE_TMPRING_SIZE: + return "mmCOMPUTE_TMPRING_SIZE"; + case mmCOMPUTE_PGM_LO: + return "mmCOMPUTE_PGM_LO"; + case mmCOMPUTE_PGM_HI: + return "mmCOMPUTE_PGM_HI"; + case mmCOMPUTE_PGM_RSRC1: + return "mmCOMPUTE_PGM_RSRC1"; + case mmCOMPUTE_PGM_RSRC2: + return "mmCOMPUTE_PGM_RSRC2"; + case mmCOMPUTE_USER_DATA_0: + return "mmCOMPUTE_USER_DATA_0"; + case mmCOMPUTE_USER_DATA_1: + return "mmCOMPUTE_USER_DATA_1"; + case mmCOMPUTE_USER_DATA_2: + return "mmCOMPUTE_USER_DATA_2"; + case mmCOMPUTE_USER_DATA_3: + return "mmCOMPUTE_USER_DATA_3"; + case mmCOMPUTE_USER_DATA_4: + return "mmCOMPUTE_USER_DATA_4"; + case mmCOMPUTE_USER_DATA_5: + return "mmCOMPUTE_USER_DATA_5"; + case mmCOMPUTE_USER_DATA_6: + return "mmCOMPUTE_USER_DATA_6"; + case mmCOMPUTE_USER_DATA_7: + return "mmCOMPUTE_USER_DATA_7"; + case mmCOMPUTE_USER_DATA_8: + return "mmCOMPUTE_USER_DATA_8"; + case mmCOMPUTE_USER_DATA_9: + return "mmCOMPUTE_USER_DATA_9"; + case mmCOMPUTE_USER_DATA_10: + return "mmCOMPUTE_USER_DATA_10"; + case mmCOMPUTE_USER_DATA_11: + return "mmCOMPUTE_USER_DATA_11"; + case mmCOMPUTE_USER_DATA_12: + return "mmCOMPUTE_USER_DATA_12"; + case mmCOMPUTE_USER_DATA_13: + return "mmCOMPUTE_USER_DATA_13"; + case mmCOMPUTE_USER_DATA_14: + return "mmCOMPUTE_USER_DATA_14"; + case mmCOMPUTE_USER_DATA_15: + return "mmCOMPUTE_USER_DATA_15"; + case mmCOMPUTE_NUM_THREAD_X: + return "mmCOMPUTE_NUM_THREAD_X"; + case mmCOMPUTE_NUM_THREAD_Y: + return "mmCOMPUTE_NUM_THREAD_Y"; + case mmCOMPUTE_NUM_THREAD_Z: + return "mmCOMPUTE_NUM_THREAD_Z"; + case mmCOMPUTE_STATIC_THREAD_MGMT_SE0: + return "mmCOMPUTE_STATIC_THREAD_MGMT_SE0"; + case mmCOMPUTE_STATIC_THREAD_MGMT_SE1: + return "mmCOMPUTE_STATIC_THREAD_MGMT_SE1"; + case mmCOMPUTE_RESOURCE_LIMITS: + return "mmCOMPUTE_RESOURCE_LIMITS"; + case mmSPI_SHADER_USER_DATA_VS_0: + return "mmSPI_SHADER_USER_DATA_VS_0"; + case mmSPI_SHADER_USER_DATA_VS_1: + return "mmSPI_SHADER_USER_DATA_VS_1"; + case mmSPI_SHADER_USER_DATA_VS_2: + return "mmSPI_SHADER_USER_DATA_VS_2"; + case mmSPI_SHADER_USER_DATA_VS_3: + return "mmSPI_SHADER_USER_DATA_VS_3"; + case mmSPI_SHADER_USER_DATA_VS_4: + return "mmSPI_SHADER_USER_DATA_VS_4"; + case mmSPI_SHADER_USER_DATA_VS_5: + return "mmSPI_SHADER_USER_DATA_VS_5"; + case mmSPI_SHADER_USER_DATA_VS_6: + return "mmSPI_SHADER_USER_DATA_VS_6"; + case mmSPI_SHADER_USER_DATA_VS_7: + return "mmSPI_SHADER_USER_DATA_VS_7"; + case mmSPI_SHADER_USER_DATA_VS_8: + return "mmSPI_SHADER_USER_DATA_VS_8"; + case mmSPI_SHADER_USER_DATA_VS_9: + return "mmSPI_SHADER_USER_DATA_VS_9"; + case mmSPI_SHADER_USER_DATA_VS_10: + return "mmSPI_SHADER_USER_DATA_VS_10"; + case mmSPI_SHADER_USER_DATA_VS_11: + return "mmSPI_SHADER_USER_DATA_VS_11"; + case mmSPI_SHADER_USER_DATA_VS_12: + return "mmSPI_SHADER_USER_DATA_VS_12"; + case mmSPI_SHADER_USER_DATA_VS_13: + return "mmSPI_SHADER_USER_DATA_VS_13"; + case mmSPI_SHADER_USER_DATA_VS_14: + return "mmSPI_SHADER_USER_DATA_VS_14"; + case mmSPI_SHADER_USER_DATA_VS_15: + return "mmSPI_SHADER_USER_DATA_VS_15"; + case mmSPI_SHADER_USER_DATA_HS_0: + return "mmSPI_SHADER_USER_DATA_HS_0"; + case mmSPI_SHADER_USER_DATA_HS_1: + return "mmSPI_SHADER_USER_DATA_HS_1"; + case mmSPI_SHADER_USER_DATA_HS_9: + return "mmSPI_SHADER_USER_DATA_HS_9"; + case mmSPI_SHADER_PGM_RSRC3_GS__CI__VI: + return "mmSPI_SHADER_PGM_RSRC3_GS__CI__VI"; + case mmSPI_SHADER_PGM_RSRC3_ES__CI__VI: + return "mmSPI_SHADER_PGM_RSRC3_ES__CI__VI"; + case mmSPI_SHADER_PGM_RSRC3_LS__CI__VI: + return "mmSPI_SHADER_PGM_RSRC3_LS__CI__VI"; + case mmSPI_SHADER_LATE_ALLOC_VS__CI__VI: + return "mmSPI_SHADER_LATE_ALLOC_VS__CI__VI"; + default: + break; + } + return ""; +} +} // namespace Core::Devtools::Gcn \ No newline at end of file diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp new file mode 100644 index 000000000..0c7e85e4c --- /dev/null +++ b/src/core/devtools/layer.cpp @@ -0,0 +1,231 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include "common/config.h" +#include "common/singleton.h" +#include "common/types.h" +#include "core/debug_state.h" +#include "imgui/imgui_std.h" +#include "imgui_internal.h" +#include "layer.h" +#include "widget/frame_dump.h" +#include "widget/frame_graph.h" + +using namespace ImGui; +using namespace Core::Devtools; +using L = Core::Devtools::Layer; + +static bool show_simple_fps = false; +static float fps_scale = 1.0f; + +static bool show_advanced_debug = false; + +static int dump_frame_count = 1; + +static Widget::FrameGraph frame_graph; +static std::vector frame_viewers; + +static float debug_popup_timing = 3.0f; + +void L::DrawMenuBar() { + const auto& ctx = *GImGui; + const auto& io = ctx.IO; + + auto isSystemPaused = DebugState.IsGuestThreadsPaused(); + + if (BeginMainMenuBar()) { + if (BeginMenu("Options")) { + if (MenuItemEx("Emulator Paused", nullptr, nullptr, isSystemPaused)) { + if (isSystemPaused) { + DebugState.ResumeGuestThreads(); + } else { + DebugState.PauseGuestThreads(); + } + } + ImGui::EndMenu(); + } + if (BeginMenu("GPU Tools")) { + MenuItem("Show frame info", nullptr, &frame_graph.is_open); + if (BeginMenu("Dump frames")) { + SliderInt("Count", &dump_frame_count, 1, 5); + if (MenuItem("Dump", "Ctrl+Alt+F9", nullptr, !DebugState.DumpingCurrentFrame())) { + DebugState.RequestFrameDump(dump_frame_count); + } + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + EndMainMenuBar(); + } + + if (IsKeyPressed(ImGuiKey_F9, false)) { + if (io.KeyCtrl && io.KeyAlt) { + if (!DebugState.ShouldPauseInSubmit()) { + DebugState.RequestFrameDump(dump_frame_count); + } + } + if (!io.KeyCtrl && !io.KeyAlt) { + if (isSystemPaused) { + DebugState.ResumeGuestThreads(); + } else { + DebugState.PauseGuestThreads(); + } + } + } +} + +void L::DrawAdvanced() { + DrawMenuBar(); + + const auto& ctx = *GImGui; + const auto& io = ctx.IO; + + auto isSystemPaused = DebugState.IsGuestThreadsPaused(); + + frame_graph.Draw(); + + if (isSystemPaused) { + GetForegroundDrawList(GetMainViewport()) + ->AddText({10.0f, io.DisplaySize.y - 40.0f}, IM_COL32_WHITE, "Emulator paused"); + } + + if (DebugState.should_show_frame_dump) { + DebugState.should_show_frame_dump = false; + std::unique_lock lock{DebugState.frame_dump_list_mutex}; + while (!DebugState.frame_dump_list.empty()) { + auto frame_dump = std::move(DebugState.frame_dump_list.back()); + DebugState.frame_dump_list.pop_back(); + frame_viewers.emplace_back(frame_dump); + } + } + + for (auto it = frame_viewers.begin(); it != frame_viewers.end();) { + if (it->is_open) { + it->Draw(); + ++it; + } else { + it = frame_viewers.erase(it); + } + } + + if (!DebugState.debug_message_popup.empty()) { + if (debug_popup_timing > 0.0f) { + debug_popup_timing -= io.DeltaTime; + if (Begin("##devtools_msg", nullptr, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove)) { + BringWindowToDisplayFront(GetCurrentWindow()); + const auto display_size = io.DisplaySize; + const auto& msg = DebugState.debug_message_popup.front(); + const auto padding = GetStyle().WindowPadding; + const auto txt_size = CalcTextSize(&msg.front(), &msg.back() + 1, false, 250.0f); + SetWindowPos({display_size.x - padding.x * 2.0f - txt_size.x, 50.0f}); + SetWindowSize({txt_size.x + padding.x * 2.0f, txt_size.y + padding.y * 2.0f}); + PushTextWrapPos(250.0f); + TextEx(&msg.front(), &msg.back() + 1); + PopTextWrapPos(); + } + End(); + } else { + DebugState.debug_message_popup.pop(); + debug_popup_timing = 3.0f; + } + } +} + +void L::DrawSimple() { + const auto io = GetIO(); + Text("Frame time: %.3f ms (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +} + +void L::SetupSettings() { + frame_graph.is_open = true; + + ImGuiSettingsHandler handler{}; + handler.TypeName = "DevtoolsLayer"; + handler.TypeHash = ImHashStr(handler.TypeName); + handler.ReadOpenFn = [](ImGuiContext*, ImGuiSettingsHandler*, const char* name) { + return std::string_view("Data") == name ? (void*)1 : nullptr; + }; + handler.ReadLineFn = [](ImGuiContext*, ImGuiSettingsHandler*, void*, const char* line) { + int v; + float f; + if (sscanf(line, "fps_scale=%f", &f) == 1) { + fps_scale = f; + } else if (sscanf(line, "show_advanced_debug=%d", &v) == 1) { + show_advanced_debug = v != 0; + } else if (sscanf(line, "show_frame_graph=%d", &v) == 1) { + frame_graph.is_open = v != 0; + } else if (sscanf(line, "dump_frame_count=%d", &v) == 1) { + dump_frame_count = v; + } + }; + handler.WriteAllFn = [](ImGuiContext*, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) { + buf->appendf("[%s][Data]\n", handler->TypeName); + buf->appendf("fps_scale=%f\n", fps_scale); + buf->appendf("show_advanced_debug=%d\n", show_advanced_debug); + buf->appendf("show_frame_graph=%d\n", frame_graph.is_open); + buf->appendf("dump_frame_count=%d\n", dump_frame_count); + buf->append("\n"); + }; + AddSettingsHandler(&handler); + + const ImGuiID dock_id = ImHashStr("FrameDumpDock"); + DockBuilderAddNode(dock_id, 0); + DockBuilderSetNodePos(dock_id, ImVec2{50.0, 50.0}); + DockBuilderFinish(dock_id); +} + +void L::Draw() { + const auto io = GetIO(); + PushID("DevtoolsLayer"); + + if (!DebugState.IsGuestThreadsPaused()) { + const auto fn = DebugState.flip_frame_count.load(); + frame_graph.AddFrame(fn, io.DeltaTime); + } + + if (IsKeyPressed(ImGuiKey_F10, false)) { + if (io.KeyCtrl) { + show_advanced_debug = !show_advanced_debug; + } else { + show_simple_fps = !show_simple_fps; + } + } + + if (show_simple_fps) { + if (Begin("Video Info", nullptr, + ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration | + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDocking)) { + SetWindowPos("Video Info", {999999.0f, 0.0f}, ImGuiCond_FirstUseEver); + if (BeginPopupContextWindow()) { +#define M(label, value) \ + if (MenuItem(label, nullptr, fps_scale == value)) \ + fps_scale = value + M("0.5x", 0.5f); + M("1.0x", 1.0f); + M("1.5x", 1.5f); + M("2.0x", 2.0f); + M("2.5x", 2.5f); + EndPopup(); +#undef M + } + KeepWindowInside(); + SetWindowFontScale(fps_scale); + DrawSimple(); + } + End(); + } + + if (show_advanced_debug) { + PushFont(io.Fonts->Fonts[IMGUI_FONT_MONO]); + PushID("DevtoolsLayer"); + DrawAdvanced(); + PopID(); + PopFont(); + } + + PopID(); +} diff --git a/src/core/devtools/layer.h b/src/core/devtools/layer.h new file mode 100644 index 000000000..5bb53fbdb --- /dev/null +++ b/src/core/devtools/layer.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "imgui/imgui_layer.h" + +namespace Core::Devtools { + +class Layer final : public ImGui::Layer { + + static void DrawMenuBar(); + + static void DrawAdvanced(); + + static void DrawSimple(); + +public: + static void SetupSettings(); + + void Draw() override; +}; + +} // namespace Core::Devtools diff --git a/src/core/devtools/widget/cmd_list.cpp b/src/core/devtools/widget/cmd_list.cpp new file mode 100644 index 000000000..012891c37 --- /dev/null +++ b/src/core/devtools/widget/cmd_list.cpp @@ -0,0 +1,1223 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Credits to https://github.com/psucien/tlg-emu-tools/ + +#include +#include +#include + +#include "cmd_list.h" +#include "frame_dump.h" +#include "imgui_internal.h" +#include "imgui_memory_editor.h" +#include "video_core/amdgpu/liverpool.h" +#include "video_core/amdgpu/pm4_cmds.h" + +#define CONTEXT_SPACE_START 0x0000a000 +#define PERSISTENT_SPACE_START 0x00002c00 + +using namespace ImGui; +using namespace Pal::Gfx6; +using Liverpool = AmdGpu::Liverpool; +using magic_enum::enum_name; + +namespace Core::Devtools::Gcn { + +const char* GetContextRegName(u32 reg_offset); +const char* GetShaderRegName(u32 reg_offset); +const char* GetOpCodeName(u32 op); + +} // namespace Core::Devtools::Gcn + +namespace Core::Devtools::Widget { + +template +static HdrType GetNext(HdrType this_pm4, uint32_t n) { + HdrType curr_pm4 = this_pm4; + while (n) { + curr_pm4 = reinterpret_cast(reinterpret_cast(curr_pm4) + + curr_pm4->count + 2); + --n; + } + return curr_pm4; +} + +static void ParsePolygonControl(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("PA_SU_SC_MODE_CNTL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("CULL_FRONT"); + TableSetColumnIndex(1); + Text("%X", reg.cull_front.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("CULL_BACK"); + TableSetColumnIndex(1); + Text("%X", reg.cull_back.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FACE"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.front_face.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("POLY_MODE"); + TableSetColumnIndex(1); + Text("%X", reg.enable_polygon_mode.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("POLYMODE_FRONT_PTYPE"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.polygon_mode_front.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("POLYMODE_BACK_PTYPE"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.polygon_mode_back.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("POLY_OFFSET_FRONT_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.enable_polygon_offset_front.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("POLY_OFFSET_BACK_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.enable_polygon_offset_back.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("POLY_OFFSET_PARA_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.enable_polygon_offset_para.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VTX_WINDOW_OFFSET_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.enable_window_offset.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("PROVOKING_VTX_LAST"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.provoking_vtx_last.Value(), + enum_name(reg.provoking_vtx_last.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("PERSP_CORR_DIS"); + TableSetColumnIndex(1); + Text("%X", reg.persp_corr_dis.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("MULTI_PRIM_IB_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.multi_prim_ib_ena.Value()); + + EndTable(); + } +} + +static void ParseAaConfig(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("PA_SC_AA_CONFIG", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("MSAA_NUM_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.msaa_num_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("AA_MASK_CENTROID_DTMN"); + TableSetColumnIndex(1); + Text("%X", reg.aa_mask_centroid_dtmn.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("MAX_SAMPLE_DIST"); + TableSetColumnIndex(1); + Text("%X", reg.max_sample_dst.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("MSAA_EXPOSED_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.msaa_exposed_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DETAIL_TO_EXPOSED_MODE"); + TableSetColumnIndex(1); + Text("%X", reg.detail_to_exposed_mode.Value()); + + EndTable(); + } +} + +static void ParseViewportControl(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("PA_CL_VTE_CNTL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("VPORT_X_SCALE_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.xscale_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VPORT_X_OFFSET_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.yoffset_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VPORT_Y_SCALE_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.yscale_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VPORT_Y_OFFSET_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.yoffset_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VPORT_Z_SCALE_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.zscale_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VPORT_Z_OFFSET_ENA"); + TableSetColumnIndex(1); + Text("%X", reg.zoffset_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VTX_XY_FMT"); + TableSetColumnIndex(1); + Text("%X", reg.xy_transformed.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VTX_Z_FMT"); + TableSetColumnIndex(1); + Text("%X", reg.z_transformed.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("VTX_W0_FMT"); + TableSetColumnIndex(1); + Text("%X", reg.w_transformed.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("PERFCOUNTER_REF"); + TableSetColumnIndex(1); + Text("%X", reg.perfcounter_ref.Value()); + + EndTable(); + } +} + +static void ParseColorControl(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("CB_COLOR_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("DISABLE_DUAL_QUAD__VI"); + TableSetColumnIndex(1); + Text("%X", reg.disable_dual_quad.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DEGAMMA_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.degamma_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("MODE"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.mode.Value(), enum_name(reg.mode.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ROP3"); + TableSetColumnIndex(1); + Text("%X", reg.rop3.Value()); + + EndTable(); + } +} + +static void ParseColor0Info(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("CB_COLOR_INFO", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("ENDIAN"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.endian.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FORMAT"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.format.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("LINEAR_GENERAL"); + TableSetColumnIndex(1); + Text("%X", reg.linear_general.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("NUMBER_TYPE"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.number_type.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("COMP_SWAP"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.comp_swap.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FAST_CLEAR"); + TableSetColumnIndex(1); + Text("%X", reg.fast_clear.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("COMPRESSION"); + TableSetColumnIndex(1); + Text("%X", reg.compression.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("BLEND_CLAMP"); + TableSetColumnIndex(1); + Text("%X", reg.blend_clamp.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("BLEND_BYPASS"); + TableSetColumnIndex(1); + Text("%X", reg.blend_bypass.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("SIMPLE_FLOAT"); + TableSetColumnIndex(1); + Text("%X", reg.simple_float.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ROUND_MODE"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.round_mode.Value(), enum_name(reg.round_mode.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("CMASK_IS_LINEAR"); + TableSetColumnIndex(1); + Text("%X", reg.cmask_is_linear.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("BLEND_OPT_DONT_RD_DST"); + TableSetColumnIndex(1); + Text("%X", reg.blend_opt_dont_rd_dst.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("BLEND_OPT_DISCARD_PIXEL"); + TableSetColumnIndex(1); + Text("%X", reg.blend_opt_discard_pixel.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FMASK_COMPRESSION_DISABLE__CI__VI"); + TableSetColumnIndex(1); + Text("%X", reg.fmask_compression_disable_ci.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FMASK_COMPRESS_1FRAG_ONLY__VI"); + TableSetColumnIndex(1); + Text("%X", reg.fmask_compress_1frag_only.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DCC_ENABLE__VI"); + TableSetColumnIndex(1); + Text("%X", reg.dcc_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("CMASK_ADDR_TYPE__VI"); + TableSetColumnIndex(1); + Text("%X", reg.cmask_addr_type.Value()); + + EndTable(); + } +} + +static void ParseColor0Attrib(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("CB_COLOR_ATTRIB", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("TILE_MODE_INDEX"); + TableSetColumnIndex(1); + Text("%s", enum_name(reg.tile_mode_index.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FMASK_TILE_MODE_INDEX"); + TableSetColumnIndex(1); + Text("%X", reg.fmask_tile_mode_index.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FMASK_BANK_HEIGHT"); + TableSetColumnIndex(1); + Text("%X", reg.fmask_bank_height.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("NUM_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.num_samples_log2.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("NUM_FRAGMENTS"); + TableSetColumnIndex(1); + Text("%X", reg.num_fragments_log2.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("FORCE_DST_ALPHA_1"); + TableSetColumnIndex(1); + Text("%X", reg.force_dst_alpha_1.Value()); + + EndTable(); + } +} + +static void ParseBlendControl(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("CB_BLEND_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("COLOR_SRCBLEND"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.color_src_factor.Value(), + enum_name(reg.color_src_factor.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("COLOR_COMB_FCN"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.color_func.Value(), enum_name(reg.color_func.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("COLOR_DESTBLEND"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.color_dst_factor.Value(), + enum_name(reg.color_dst_factor.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ALPHA_SRCBLEND"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.alpha_src_factor.Value(), + enum_name(reg.alpha_src_factor.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ALPHA_COMB_FCN"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.alpha_func.Value(), enum_name(reg.alpha_func.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ALPHA_DESTBLEND"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.alpha_dst_factor.Value(), + enum_name(reg.alpha_dst_factor.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("SEPARATE_ALPHA_BLEND"); + TableSetColumnIndex(1); + Text("%X", reg.separate_alpha_blend.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DISABLE_ROP3"); + TableSetColumnIndex(1); + Text("%X", reg.disable_rop3.Value()); + + EndTable(); + } +} + +static void ParseDepthRenderControl(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("DB_RENDER_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("DEPTH_CLEAR_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.depth_clear_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("STENCIL_CLEAR_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.stencil_clear_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DEPTH_COPY"); + TableSetColumnIndex(1); + Text("%X", reg.depth_clear_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("STENCIL_COPY"); + TableSetColumnIndex(1); + Text("%X", reg.stencil_copy.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("RESUMMARIZE_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.resummarize_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("STENCIL_COMPRESS_DISABLE"); + TableSetColumnIndex(1); + Text("%X", reg.stencil_compress_disable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DEPTH_COMPRESS_DISABLE"); + TableSetColumnIndex(1); + Text("%X", reg.depth_compress_disable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("COPY_CENTROID"); + TableSetColumnIndex(1); + Text("%X", reg.copy_centroid.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("COPY_SAMPLE"); + TableSetColumnIndex(1); + Text("%X", reg.copy_sample.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DECOMPRESS_ENABLE__VI"); + TableSetColumnIndex(1); + Text("%X", reg.decompress_enable.Value()); + + EndTable(); + } +} + +static void ParseDepthControl(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("STENCIL_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.stencil_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("Z_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.depth_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("Z_WRITE_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.depth_write_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DEPTH_BOUNDS_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.depth_bounds_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ZFUNC"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.depth_func.Value(), enum_name(reg.depth_func.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("BACKFACE_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.backface_enable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("STENCILFUNC"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.stencil_ref_func.Value(), + enum_name(reg.stencil_ref_func.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("STENCILFUNC_BF"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.stencil_bf_func.Value(), + enum_name(reg.stencil_bf_func.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ENABLE_COLOR_WRITES_ON_DEPTH_FAIL"); + TableSetColumnIndex(1); + Text("%X", reg.enable_color_writes_on_depth_fail.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DISABLE_COLOR_WRITES_ON_DEPTH_PASS"); + TableSetColumnIndex(1); + Text("%X", reg.disable_color_writes_on_depth_pass.Value()); + + EndTable(); + } +} + +static void ParseEqaa(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("MAX_ANCHOR_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.max_anchor_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("PS_ITER_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.ps_iter_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("MASK_EXPORT_NUM_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.mask_export_num_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ALPHA_TO_MASK_NUM_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.alpha_to_mask_num_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("HIGH_QUALITY_INTERSECTIONS"); + TableSetColumnIndex(1); + Text("%X", reg.high_quality_intersections.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("INCOHERENT_EQAA_READS"); + TableSetColumnIndex(1); + Text("%X", reg.incoherent_eqaa_reads.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("INTERPOLATE_COMP_Z"); + TableSetColumnIndex(1); + Text("%X", reg.interpolate_comp_z.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("INTERPOLATE_SRC_Z"); + TableSetColumnIndex(1); + Text("%X", reg.interpolate_src_z.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("STATIC_ANCHOR_ASSOCIATIONS"); + TableSetColumnIndex(1); + Text("%X", reg.static_anchor_associations.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ALPHA_TO_MASK_EQAA_DISABLE"); + TableSetColumnIndex(1); + Text("%X", reg.alpha_to_mask_eqaa_disable.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("OVERRASTERIZATION_AMOUNT"); + TableSetColumnIndex(1); + Text("%X", reg.overrasterization_amount.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ENABLE_POSTZ_OVERRASTERIZATION"); + TableSetColumnIndex(1); + Text("%X", reg.enable_postz_overrasterization.Value()); + + EndTable(); + } +} + +static void ParseZInfo(u32 value) { + auto const reg = reinterpret_cast(value); + + if (BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + TableNextRow(); + TableSetColumnIndex(0); + Text("FORMAT"); + TableSetColumnIndex(1); + Text("%X (%s)", (u32)reg.format.Value(), enum_name(reg.format.Value()).data()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("NUM_SAMPLES"); + TableSetColumnIndex(1); + Text("%X", reg.num_samples.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("TILE_SPLIT__CI__VI"); + TableSetColumnIndex(1); + Text("%X", reg.tile_split.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("TILE_MODE_INDEX"); + TableSetColumnIndex(1); + Text("%X", reg.tile_mode_index.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("DECOMPRESS_ON_N_ZPLANES__VI"); + TableSetColumnIndex(1); + Text("%X", reg.decompress_on_n_zplanes.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ALLOW_EXPCLEAR"); + TableSetColumnIndex(1); + Text("%X", reg.allow_expclear.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("READ_SIZE"); + TableSetColumnIndex(1); + Text("%X", reg.read_size.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("TILE_SURFACE_ENABLE"); + TableSetColumnIndex(1); + Text("%X", reg.tile_surface_en.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("CLEAR_DISALLOWED__VI"); + TableSetColumnIndex(1); + Text("%X", reg.clear_disallowed.Value()); + + TableNextRow(); + TableSetColumnIndex(0); + Text("ZRANGE_PRECISION"); + TableSetColumnIndex(1); + Text("%X", reg.zrange_precision.Value()); + + EndTable(); + } +} + +void CmdListViewer::OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body) { + using namespace std::string_view_literals; + + enum class NOP_PAYLOAD : u32 { + ACB_SUBMIT_MRK = 0x68750013, + ALLOC_ALIGN8 = 0x68753000, + PUSH_MARKER = 0x68750001, + SET_VSHARP = 0x68750004, + SET_TSHARP = 0x68750005, + SET_SSHARP = 0x68750006, + SET_USER_DATA = 0x6875000d, + }; + auto get_noppayload_text = [](NOP_PAYLOAD const nop_payload) { + switch (nop_payload) { + case NOP_PAYLOAD::ACB_SUBMIT_MRK: + return "ACB_SUBMIT_MRK"sv; + case NOP_PAYLOAD::ALLOC_ALIGN8: + return "ALLOC_ALIGN8"sv; + case NOP_PAYLOAD::PUSH_MARKER: + return "PUSH_MARKER"sv; + case NOP_PAYLOAD::SET_VSHARP: + return "SET_VSHARP"sv; + case NOP_PAYLOAD::SET_TSHARP: + return "SET_TSHARP"sv; + case NOP_PAYLOAD::SET_SSHARP: + return "SET_SSHARP"sv; + case NOP_PAYLOAD::SET_USER_DATA: + return "SET_USER_DATA"sv; + } + return ""sv; + }; + + Separator(); + BeginGroup(); + + auto const* pkt = reinterpret_cast(header); + auto const* payload = &body[0]; + + // Dump payload + for (unsigned i = 0; i < pkt->header.count + 1; ++i) { + Text("%02X: %08X", i, payload[i]); + if ((payload[i] & 0xffff0000) == 0x68750000) { + const auto& e = get_noppayload_text((NOP_PAYLOAD)payload[i]); + if (!e.empty()) { + SameLine(); + Text("(%s)", e.data()); + } + } + } + + EndGroup(); +} +void CmdListViewer::OnSetBase(AmdGpu::PM4Type3Header const* header, u32 const* body) { + Separator(); + BeginGroup(); + + auto const* pkt = reinterpret_cast(header); + Text("BASE_INDEX: %08X", body[0]); + Text("ADDRESS0 : %08X", body[1]); + Text("ADDRESS1 : %08X", body[2]); + + EndGroup(); +} + +void CmdListViewer::OnSetContextReg(AmdGpu::PM4Type3Header const* header, u32 const* body) { + Separator(); + BeginGroup(); + + auto const* pkt = reinterpret_cast(header); + + for (auto i = 0u; i < header->count; ++i) { + auto const absOffset = CONTEXT_SPACE_START + pkt->reg_offset + i; + Text("reg: %4X (%s)", pkt->reg_offset + i, Gcn::GetContextRegName(absOffset)); + Text("[%08X]", body[i + 1]); + + switch (absOffset) { + case mmPA_SU_SC_MODE_CNTL: { + if (IsItemHovered() && BeginTooltip()) { + ParsePolygonControl(body[1]); + EndTooltip(); + } + break; + } + case mmPA_SC_AA_CONFIG: { + if (IsItemHovered() && BeginTooltip()) { + ParseAaConfig(body[1]); + EndTooltip(); + } + break; + } + case mmPA_CL_VTE_CNTL: { + if (IsItemHovered() && BeginTooltip()) { + ParseViewportControl(body[1]); + EndTooltip(); + } + break; + } + case mmCB_COLOR_CONTROL: + if (IsItemHovered() && BeginTooltip()) { + ParseColorControl(body[1]); + EndTooltip(); + } + break; + case mmCB_COLOR0_INFO: + [[fallthrough]]; + case mmCB_COLOR1_INFO: + [[fallthrough]]; + case mmCB_COLOR2_INFO: + [[fallthrough]]; + case mmCB_COLOR3_INFO: + [[fallthrough]]; + case mmCB_COLOR4_INFO: + [[fallthrough]]; + case mmCB_COLOR5_INFO: + [[fallthrough]]; + case mmCB_COLOR6_INFO: + [[fallthrough]]; + case mmCB_COLOR7_INFO: { + if (IsItemHovered() && BeginTooltip()) { + ParseColor0Info(body[i + 1]); + EndTooltip(); + } + break; + } + case mmCB_COLOR0_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR1_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR2_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR3_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR4_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR5_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR6_ATTRIB: + [[fallthrough]]; + case mmCB_COLOR7_ATTRIB: { + if (IsItemHovered() && BeginTooltip()) { + ParseColor0Attrib(body[i + 1]); + EndTooltip(); + } + break; + } + case mmCB_BLEND0_CONTROL: + [[fallthrough]]; + case mmCB_BLEND1_CONTROL: + [[fallthrough]]; + case mmCB_BLEND2_CONTROL: + [[fallthrough]]; + case mmCB_BLEND3_CONTROL: + [[fallthrough]]; + case mmCB_BLEND4_CONTROL: + [[fallthrough]]; + case mmCB_BLEND5_CONTROL: + [[fallthrough]]; + case mmCB_BLEND6_CONTROL: + [[fallthrough]]; + case mmCB_BLEND7_CONTROL: { + if (IsItemHovered() && BeginTooltip()) { + ParseBlendControl(body[i + 1]); + EndTooltip(); + } + break; + } + case mmDB_RENDER_CONTROL: { + if (IsItemHovered() && BeginTooltip()) { + ParseDepthRenderControl(body[1]); + EndTooltip(); + } + break; + } + case mmDB_DEPTH_CONTROL: { + if (IsItemHovered() && BeginTooltip()) { + ParseDepthControl(body[1]); + EndTooltip(); + } + break; + } + case mmDB_EQAA: { + if (IsItemHovered() && BeginTooltip()) { + ParseEqaa(body[1]); + EndTooltip(); + } + break; + } + case mmDB_Z_INFO: { + if (IsItemHovered() && BeginTooltip()) { + ParseZInfo(body[1]); + EndTooltip(); + } + break; + } + case mmDB_HTILE_DATA_BASE: { + auto const& reg = reinterpret_cast(body[1]); + Text("addr: %08x", reg * 256u); + break; + } + default: + break; + } + + //... + } + + EndGroup(); +} + +void CmdListViewer::OnSetShReg(AmdGpu::PM4Type3Header const* header, u32 const* body) { + Separator(); + BeginGroup(); + + auto const* pkt = reinterpret_cast(header); + + for (auto i = 0u; i < header->count; ++i) { + auto const absOffset = PERSISTENT_SPACE_START + pkt->reg_offset + i; + Text("reg: %4X (%s)", pkt->reg_offset + i, Gcn::GetShaderRegName(absOffset)); + + Text("%08X", *((uint32_t*)header + 2 + i)); + + //... + } + + EndGroup(); +} + +void CmdListViewer::OnDispatch(AmdGpu::PM4Type3Header const* header, u32 const* body) { + Separator(); + BeginGroup(); + + auto const* pkt = reinterpret_cast(header); + + Text("DIM_X : %d", pkt->dim_x); + Text("DIM_Y : %d", pkt->dim_y); + Text("DIM_Z : %d", pkt->dim_z); + Text("INITIATOR: %X", pkt->dispatch_initiator); + if (IsItemHovered() && BeginTooltip()) { + // TODO: dump_reg + EndTooltip(); + } + + EndGroup(); +} + +CmdListViewer::CmdListViewer(FrameDumpViewer* parent, const std::vector& cmd_list) + : parent(parent) { + using namespace AmdGpu; + + cmdb_addr = (uintptr_t)cmd_list.data(); + cmdb_size = cmd_list.size() * sizeof(u32); + + auto const* pm4_hdr = reinterpret_cast(cmdb_addr); + + size_t processed_size = 0; + size_t prev_offset = 0; + + std::string marker{}; + + while (processed_size < cmdb_size) { + auto* next_pm4_hdr = GetNext(pm4_hdr, 1); + auto processed_len = + reinterpret_cast(next_pm4_hdr) - reinterpret_cast(pm4_hdr); + processed_size += processed_len; + + if (pm4_hdr->type == PM4Type3Header::TYPE) { + + auto const* pm4_t3 = reinterpret_cast(pm4_hdr); + + if (pm4_t3->opcode == PM4ItOpcode::Nop) { + auto const* it_body = reinterpret_cast(pm4_hdr + 1); + if (it_body[0] == 0x68750001) { + marker = std::string{(char*)&it_body[1]}; + } + } + + if (pm4_t3->opcode == PM4ItOpcode::DispatchDirect || + pm4_t3->opcode == PM4ItOpcode::DispatchIndirect || + pm4_t3->opcode == PM4ItOpcode::DrawIndex2 || + pm4_t3->opcode == PM4ItOpcode::DrawIndexAuto || + pm4_t3->opcode == PM4ItOpcode::DrawIndexOffset2 || + pm4_t3->opcode == PM4ItOpcode::DrawIndexIndirect + // ... + ) { + // All these commands are terminated by NOP at the end, so + // it is safe to skip it to be even with CP + // next_pm4_hdr = get_next(next_pm4_hdr, 1); + // auto constexpr nop_len = 0x10; + // processed_len += nop_len; + // processed_size += nop_len; + + batches.emplace_back(BatchInfo{ + marker, + prev_offset, + processed_size, + processed_size - processed_len, + pm4_t3->opcode, + }); + prev_offset = processed_size; + marker.clear(); + } + } + + pm4_hdr = next_pm4_hdr; + } + + // state batch (last) + if (processed_size - prev_offset > 0) { + batches.emplace_back(BatchInfo{ + marker, + prev_offset, + processed_size, + 0, + static_cast(0xFF), + }); + } +} + +void CmdListViewer::Draw() { + if (BeginChild("cmd_queue", {})) { + char queue_name[32]{}; + if (vqid < 254) { + std::snprintf(queue_name, sizeof(queue_name), "%s %d", vqid > 254 ? "GFX" : "ASC", + vqid); + } else { + std::snprintf(queue_name, sizeof(queue_name), "%s", vqid > 254 ? "GFX" : "ASC"); + } + + Text("queue : %s", queue_name); + Text("base addr: %08llX", cmdb_addr); + SameLine(); + if (SmallButton(">")) { + parent->cmdb_view.Open ^= true; + } + Text("size : %04llX", cmdb_size); + Separator(); + + char batch_hdr[128]; + for (int batch_id = 0; batch_id < batches.size(); ++batch_id) { + auto processed_size = 0ull; + auto const* pm4_hdr = + reinterpret_cast(cmdb_addr + batches[batch_id].start_addr); + + sprintf(batch_hdr, "%08llX: batch-%03d | %s", cmdb_addr + batches[batch_id].start_addr, + batch_id, batches[batch_id].marker.c_str()); + + if (batch_id == batch_bp) { // highlight batch at breakpoint + PushStyleColor(ImGuiCol_Header, ImVec4{1.0f, 0.5f, 0.5f, 0.5f}); + } + + if (batches[batch_id].type == static_cast(0xFF) || + CollapsingHeader(batch_hdr)) { + auto const batch_sz = batches[batch_id].end_addr - batches[batch_id].start_addr; + while (processed_size < batch_sz) { + AmdGpu::PM4ItOpcode op{0xFFu}; + + if (pm4_hdr->type == AmdGpu::PM4Type3Header::TYPE) { + auto const* pm4_t3 = + reinterpret_cast(pm4_hdr); + op = pm4_t3->opcode; + + static char header_name[128]; + sprintf(header_name, "%08llX: %s", + cmdb_addr + batches[batch_id].start_addr + processed_size, + Gcn::GetOpCodeName((u32)op)); + + if (TreeNode(header_name)) { + bool just_opened = IsItemToggledOpen(); + if (BeginTable("split", 1)) { + TableNextColumn(); + Text("size: %d", pm4_hdr->count + 1); + + if (just_opened) { + // Editor + parent->cmdb_view.GotoAddrAndHighlight( + reinterpret_cast(pm4_hdr) - cmdb_addr, + reinterpret_cast(pm4_hdr) - cmdb_addr + + (pm4_hdr->count + 2) * 4); + } + + auto const* it_body = + reinterpret_cast(pm4_hdr + 1); + + switch (op) { + case AmdGpu::PM4ItOpcode::Nop: { + OnNop(pm4_t3, it_body); + break; + } + case AmdGpu::PM4ItOpcode::SetBase: { + OnSetBase(pm4_t3, it_body); + break; + } + case AmdGpu::PM4ItOpcode::SetContextReg: { + OnSetContextReg(pm4_t3, it_body); + break; + } + case AmdGpu::PM4ItOpcode::SetShReg: { + OnSetShReg(pm4_t3, it_body); + break; + } + case AmdGpu::PM4ItOpcode::DispatchDirect: { + OnDispatch(pm4_t3, it_body); + break; + } + default: { + auto const* payload = &it_body[0]; + for (unsigned i = 0; i < pm4_hdr->count + 1; ++i) { + Text("%02X: %08X", i, payload[i]); + } + } + } + + EndTable(); + } + TreePop(); + } + } else { + Text(""); + } + + auto const* next_pm4_hdr = GetNext(pm4_hdr, 1); + auto const processed_len = reinterpret_cast(next_pm4_hdr) - + reinterpret_cast(pm4_hdr); + pm4_hdr = next_pm4_hdr; + processed_size += processed_len; + } + } + + if (batch_id == batch_bp) { + PopStyleColor(); + } + + if (batch_id == batches.size() - 2) { + Separator(); + } + } + } + EndChild(); +} + +} // namespace Core::Devtools::Widget \ No newline at end of file diff --git a/src/core/devtools/widget/cmd_list.h b/src/core/devtools/widget/cmd_list.h new file mode 100644 index 000000000..a6ecd9323 --- /dev/null +++ b/src/core/devtools/widget/cmd_list.h @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Credits to https://github.com/psucien/tlg-emu-tools/ + +#pragma once + +#include + +#include "common/types.h" +#include "video_core/buffer_cache/buffer_cache.h" + +namespace AmdGpu { +union PM4Type3Header; +enum class PM4ItOpcode : u32; +} // namespace AmdGpu + +namespace Core::Devtools::Widget { + +class FrameDumpViewer; + +class CmdListViewer { + /* + * Generic PM4 header + */ + union PM4Header { + struct { + u32 reserved : 16; + u32 count : 14; + u32 type : 2; // PM4_TYPE + }; + u32 u32All; + }; + struct BatchInfo { + std::string marker{}; + size_t start_addr; + size_t end_addr; + size_t command_addr; + AmdGpu::PM4ItOpcode type; + bool bypass{false}; + }; + + FrameDumpViewer* parent; + std::vector batches{}; + uintptr_t cmdb_addr; + size_t cmdb_size; + + int batch_bp{-1}; + int vqid{255}; + + void OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body); + void OnSetBase(AmdGpu::PM4Type3Header const* header, u32 const* body); + void OnSetContextReg(AmdGpu::PM4Type3Header const* header, u32 const* body); + void OnSetShReg(AmdGpu::PM4Type3Header const* header, u32 const* body); + void OnDispatch(AmdGpu::PM4Type3Header const* header, u32 const* body); + +public: + explicit CmdListViewer(FrameDumpViewer* parent, const std::vector& cmd_list); + + void Draw(); +}; + +} // namespace Core::Devtools::Widget diff --git a/src/core/devtools/widget/frame_dump.cpp b/src/core/devtools/widget/frame_dump.cpp new file mode 100644 index 000000000..d27bab90a --- /dev/null +++ b/src/core/devtools/widget/frame_dump.cpp @@ -0,0 +1,191 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "common/io_file.h" +#include "frame_dump.h" +#include "imgui_internal.h" +#include "imgui_memory_editor.h" + +using namespace ImGui; +using namespace DebugStateType; + +#define C_V(label, value, var, out) \ + if (Selectable(label, var == value)) { \ + var = value; \ + selected_cmd = -1; \ + out = true; \ + } + +// 00 to 99 +static std::array small_int_to_str(const s32 i) { + std::array label{}; + if (i == -1) { + label[0] = 'N'; + label[1] = 'A'; + } else { + label[0] = i / 10 + '0'; + label[1] = i % 10 + '0'; + } + return label; +} + +namespace Core::Devtools::Widget { + +FrameDumpViewer::FrameDumpViewer(FrameDump _frame_dump) : frame_dump(std::move(_frame_dump)) { + static int unique_id = 0; + id = unique_id++; + + selected_queue_type = QueueType::dcb; + selected_submit_num = 0; + selected_queue_num2 = 0; + + cmd_list_viewer.reserve(frame_dump.queues.size()); + for (const auto& cmd : frame_dump.queues) { + cmd_list_viewer.emplace_back(this, cmd.data); + if (cmd.type == QueueType::dcb && cmd.submit_num == selected_submit_num && + cmd.num2 == selected_queue_num2) { + selected_cmd = cmd_list_viewer.size() - 1; + } + } + + cmdb_view.Open = false; + cmdb_view.ReadOnly = true; +} + +FrameDumpViewer::~FrameDumpViewer() {} + +void FrameDumpViewer::Draw() { + if (!is_open) { + return; + } + + char name[32]; + snprintf(name, sizeof(name), "Frame #%d dump", id); + static ImGuiID dock_id = ImHashStr("FrameDumpDock"); + SetNextWindowDockID(dock_id, ImGuiCond_Appearing); + if (Begin(name, &is_open, ImGuiWindowFlags_NoSavedSettings)) { + if (IsWindowAppearing()) { + auto window = GetCurrentWindow(); + SetWindowSize(window, ImVec2{470.0f, 600.0f}); + } + BeginGroup(); + TextEx("Queue type"); + SameLine(); + if (BeginCombo("##select_queue_type", magic_enum::enum_name(selected_queue_type).data(), + ImGuiComboFlags_WidthFitPreview)) { + bool selected = false; +#define COMBO(x) C_V(magic_enum::enum_name(x).data(), x, selected_queue_type, selected) + COMBO(QueueType::acb) + COMBO(QueueType::dcb); + COMBO(QueueType::ccb); + if (selected) { + selected_submit_num = selected_queue_num2 = -1; + } + EndCombo(); + } + SameLine(); + TextEx("Submit num"); + SameLine(); + if (BeginCombo("##select_submit_num", small_int_to_str(selected_submit_num).data(), + ImGuiComboFlags_WidthFitPreview)) { + std::array available_submits{}; + for (const auto& cmd : frame_dump.queues) { + if (cmd.type == selected_queue_type) { + available_submits[cmd.submit_num] = true; + } + } + bool selected = false; + for (int i = 0; i < available_submits.size(); ++i) { + if (available_submits[i]) { + char label[3]{}; + label[0] = i / 10 + '0'; + label[1] = i % 10 + '0'; + C_V(label, i, selected_submit_num, selected); + } + } + if (selected) { + selected_queue_num2 = -1; + } + EndCombo(); + } + SameLine(); + TextEx(selected_queue_type == QueueType::acb ? "Queue num" : "Buffer num"); + SameLine(); + if (BeginCombo("##select_queue_num2", small_int_to_str(selected_queue_num2).data(), + ImGuiComboFlags_WidthFitPreview)) { + std::array available_queues{}; + for (const auto& cmd : frame_dump.queues) { + if (cmd.type == selected_queue_type && cmd.submit_num == selected_submit_num) { + available_queues[cmd.num2] = true; + } + } + bool selected = false; + for (int i = 0; i < available_queues.size(); ++i) { + if (available_queues[i]) { + char label[3]{}; + label[0] = i / 10 + '0'; + label[1] = i % 10 + '0'; + C_V(label, i, selected_queue_num2, selected); + } + } + if (selected) { + const auto it = std::ranges::find_if(frame_dump.queues, [&](const auto& cmd) { + return cmd.type == selected_queue_type && + cmd.submit_num == selected_submit_num && cmd.num2 == selected_queue_num2; + }); + if (it != frame_dump.queues.end()) { + selected_cmd = std::distance(frame_dump.queues.begin(), it); + } + } + EndCombo(); + } + SameLine(); + BeginDisabled(selected_cmd == -1); + if (SmallButton("Dump cmd")) { + auto now_time = fmt::localtime(std::time(nullptr)); + const auto fname = fmt::format("{:%F %H-%M-%S} {}_{}_{}.bin", now_time, + magic_enum::enum_name(selected_queue_type), + selected_submit_num, selected_queue_num2); + Common::FS::IOFile file(fname, Common::FS::FileAccessMode::Write); + auto& data = frame_dump.queues[selected_cmd].data; + if (file.IsOpen()) { + DebugState.ShowDebugMessage(fmt::format("Dumping cmd as {}", fname)); + file.Write(data); + } else { + DebugState.ShowDebugMessage(fmt::format("Failed to save {}", fname)); + LOG_ERROR(Core, "Failed to open file {}", fname); + } + } + EndDisabled(); + EndGroup(); + + if (selected_cmd != -1) { + cmd_list_viewer[selected_cmd].Draw(); + } + } + End(); + + if (cmdb_view.Open && selected_cmd != -1) { + auto& cmd = frame_dump.queues[selected_cmd].data; + auto cmd_size = cmd.size() * sizeof(u32); + MemoryEditor::Sizes s; + cmdb_view.CalcSizes(s, cmd_size, (size_t)cmd.data()); + SetNextWindowSizeConstraints(ImVec2(0.0f, 0.0f), ImVec2(s.WindowWidth, FLT_MAX)); + + char name[64]; + snprintf(name, sizeof(name), "[GFX] Command buffer %d###cmdbuf_hex_%d", id, id); + if (Begin(name, &cmdb_view.Open, ImGuiWindowFlags_NoScrollbar)) { + cmdb_view.DrawContents(cmd.data(), cmd_size, (size_t)cmd.data()); + } + End(); + } +} + +} // namespace Core::Devtools::Widget + +#undef C_V \ No newline at end of file diff --git a/src/core/devtools/widget/frame_dump.h b/src/core/devtools/widget/frame_dump.h new file mode 100644 index 000000000..d9d11f825 --- /dev/null +++ b/src/core/devtools/widget/frame_dump.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "cmd_list.h" +#include "core/debug_state.h" +#include "imgui_memory_editor.h" + +namespace Core::Devtools::Widget { + +class CmdListViewer; + +class FrameDumpViewer { + friend class CmdListViewer; + + DebugStateType::FrameDump frame_dump; + int id; + + std::vector cmd_list_viewer; + MemoryEditor cmdb_view; + + DebugStateType::QueueType selected_queue_type; + s32 selected_submit_num; + s32 selected_queue_num2; + s32 selected_cmd = -1; + +public: + bool is_open = true; + + explicit FrameDumpViewer(DebugStateType::FrameDump frame_dump); + + ~FrameDumpViewer(); + + void Draw(); +}; + +} // namespace Core::Devtools::Widget \ No newline at end of file diff --git a/src/core/devtools/widget/frame_graph.cpp b/src/core/devtools/widget/frame_graph.cpp new file mode 100644 index 000000000..952f50c34 --- /dev/null +++ b/src/core/devtools/widget/frame_graph.cpp @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "frame_graph.h" + +#include "common/config.h" +#include "common/singleton.h" +#include "core/debug_state.h" +#include "imgui.h" +#include "imgui_internal.h" + +using namespace ImGui; + +namespace Core::Devtools::Widget { + +constexpr float TARGET_FPS = 60.0f; +constexpr float BAR_WIDTH_MULT = 1.4f; +constexpr float BAR_HEIGHT_MULT = 1.25f; +constexpr float FRAME_GRAPH_PADDING_Y = 3.0f; +constexpr static float FRAME_GRAPH_HEIGHT = 50.0f; + +void FrameGraph::Draw() { + if (!is_open) { + return; + } + SetNextWindowSize({340.0, 185.0f}, ImGuiCond_FirstUseEver); + if (Begin("Video debug info", &is_open)) { + const auto& ctx = *GImGui; + const auto& io = ctx.IO; + const auto& window = *ctx.CurrentWindow; + auto& draw_list = *window.DrawList; + + auto isSystemPaused = DebugState.IsGuestThreadsPaused(); + + static float deltaTime; + static float frameRate; + + if (!isSystemPaused) { + deltaTime = io.DeltaTime * 1000.0f; + frameRate = 1000.0f / deltaTime; + } + + Text("Frame time: %.3f ms (%.1f FPS)", deltaTime, frameRate); + Text("Flip frame: %d Gnm submit frame: %d", DebugState.flip_frame_count.load(), + DebugState.gnm_frame_count.load()); + SeparatorText("Frame graph"); + + const float full_width = GetContentRegionAvail().x; + // Frame graph - inspired by + // https://asawicki.info/news_1758_an_idea_for_visualization_of_frame_times + auto pos = GetCursorScreenPos(); + const ImVec2 size{full_width, FRAME_GRAPH_HEIGHT + FRAME_GRAPH_PADDING_Y * 2.0f}; + ItemSize(size); + if (!ItemAdd({pos, pos + size}, GetID("FrameGraph"))) { + return; + } + + float target_dt = 1.0f / (TARGET_FPS * (float)Config::vblankDiv()); + float cur_pos_x = pos.x + full_width; + pos.y += FRAME_GRAPH_PADDING_Y; + const float final_pos_y = pos.y + FRAME_GRAPH_HEIGHT; + + draw_list.AddRectFilled({pos.x, pos.y - FRAME_GRAPH_PADDING_Y}, + {pos.x + full_width, final_pos_y + FRAME_GRAPH_PADDING_Y}, + IM_COL32(0x33, 0x33, 0x33, 0xFF)); + draw_list.PushClipRect({pos.x, pos.y}, {pos.x + full_width, final_pos_y}, true); + for (u32 i = 0; i < FRAME_BUFFER_SIZE; ++i) { + const auto& frame_info = frame_list[(DebugState.GetFrameNum() - i) % FRAME_BUFFER_SIZE]; + const float dt_factor = target_dt / frame_info.delta; + + const float width = std::ceil(BAR_WIDTH_MULT / dt_factor); + const float height = + std::min(std::log2(BAR_HEIGHT_MULT / dt_factor) / 3.0f, 1.0f) * FRAME_GRAPH_HEIGHT; + + ImU32 color; + if (dt_factor >= 0.95f) { // BLUE + color = IM_COL32(0x33, 0x33, 0xFF, 0xFF); + } else if (dt_factor >= 0.5f) { // GREEN <> YELLOW + float t = 1.0f - (dt_factor - 0.5f) * 2.0f; + int r = (int)(0xFF * t); + color = IM_COL32(r, 0xFF, 0, 0xFF); + } else { // YELLOW <> RED + float t = dt_factor * 2.0f; + int g = (int)(0xFF * t); + color = IM_COL32(0xFF, g, 0, 0xFF); + } + draw_list.AddRectFilled({cur_pos_x - width, final_pos_y - height}, + {cur_pos_x, final_pos_y}, color); + cur_pos_x -= width; + if (cur_pos_x < width) { + break; + } + } + draw_list.PopClipRect(); + } + End(); +} + +} // namespace Core::Devtools::Widget diff --git a/src/core/devtools/widget/frame_graph.h b/src/core/devtools/widget/frame_graph.h new file mode 100644 index 000000000..700b6b2a2 --- /dev/null +++ b/src/core/devtools/widget/frame_graph.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Devtools::Widget { + +class FrameGraph { + static constexpr u32 FRAME_BUFFER_SIZE = 1024; + struct FrameInfo { + u32 num; + float delta; + }; + + std::array frame_list{}; + +public: + bool is_open = true; + + void Draw(); + + void AddFrame(u32 num, float delta) { + frame_list[num % FRAME_BUFFER_SIZE] = FrameInfo{num, delta}; + } +}; + +} // namespace Core::Devtools::Widget \ No newline at end of file diff --git a/src/core/devtools/widget/imgui_memory_editor.h b/src/core/devtools/widget/imgui_memory_editor.h new file mode 100644 index 000000000..fb1f46767 --- /dev/null +++ b/src/core/devtools/widget/imgui_memory_editor.h @@ -0,0 +1,942 @@ +// SPDX-FileCopyrightText: 2024 Dear ImGui Club Contributors +// SPDX-License-Identifier: MIT + +// Mini memory editor for Dear ImGui (to embed in your game/tools) +// Get latest version at http://www.github.com/ocornut/imgui_club +// Licensed under The MIT License (MIT) + +// Right-click anywhere to access the Options menu! +// You can adjust the keyboard repeat delay/rate in ImGuiIO. +// The code assume a mono-space font for simplicity! +// If you don't use the default font, use ImGui::PushFont()/PopFont() to switch to a mono-space font +// before calling this. +// +// Usage: +// // Create a window and draw memory editor inside it: +// static MemoryEditor mem_edit_1; +// static char data[0x10000]; +// size_t data_size = 0x10000; +// mem_edit_1.DrawWindow("Memory Editor", data, data_size); +// +// Usage: +// // If you already have a window, use DrawContents() instead: +// static MemoryEditor mem_edit_2; +// ImGui::Begin("MyWindow") +// mem_edit_2.DrawContents(this, sizeof(*this), (size_t)this); +// ImGui::End(); +// +// Changelog: +// - v0.10: initial version +// - v0.23 (2017/08/17): added to github. fixed right-arrow triggering a byte write. +// - v0.24 (2018/06/02): changed DragInt("Rows" to use a %d data format (which is desirable since +// imgui 1.61). +// - v0.25 (2018/07/11): fixed wording: all occurrences of "Rows" renamed to "Columns". +// - v0.26 (2018/08/02): fixed clicking on hex region +// - v0.30 (2018/08/02): added data preview for common data types +// - v0.31 (2018/10/10): added OptUpperCaseHex option to select lower/upper casing display +// [@samhocevar] +// - v0.32 (2018/10/10): changed signatures to use void* instead of unsigned char* +// - v0.33 (2018/10/10): added OptShowOptions option to hide all the interactive option setting. +// - v0.34 (2019/05/07): binary preview now applies endianness setting [@nicolasnoble] +// - v0.35 (2020/01/29): using ImGuiDataType available since Dear ImGui 1.69. +// - v0.36 (2020/05/05): minor tweaks, minor refactor. +// - v0.40 (2020/10/04): fix misuse of ImGuiListClipper API, broke with Dear ImGui 1.79. made cursor +// position appears on left-side of edit box. option popup appears on mouse release. fix MSVC +// warnings where _CRT_SECURE_NO_WARNINGS wasn't working in recent versions. +// - v0.41 (2020/10/05): fix when using with keyboard/gamepad navigation enabled. +// - v0.42 (2020/10/14): fix for . character in ASCII view always being greyed out. +// - v0.43 (2021/03/12): added OptFooterExtraHeight to allow for custom drawing at the bottom of the +// editor [@leiradel] +// - v0.44 (2021/03/12): use ImGuiInputTextFlags_AlwaysOverwrite in 1.82 + fix hardcoded width. +// - v0.50 (2021/11/12): various fixes for recent dear imgui versions (fixed misuse of clipper, +// relying on SetKeyboardFocusHere() handling scrolling from 1.85). added default size. +// - v0.51 (2024/02/22): fix for layout change in 1.89 when using IMGUI_DISABLE_OBSOLETE_FUNCTIONS. +// (#34) +// - v0.52 (2024/03/08): removed unnecessary GetKeyIndex() calls, they are a no-op since 1.87. +// - v0.53 (2024/05/27): fixed right-click popup from not appearing when using DrawContents(). +// warning fixes. (#35) +// - v0.54 (2024/07/29): allow ReadOnly mode to still select and preview data. (#46) [@DeltaGW2]) +// - v0.55 (2024/08/19): added BgColorFn to allow setting background colors independently from +// highlighted selection. (#27) [@StrikerX3] +// added MouseHoveredAddr public readable field. (#47, #27) [@StrikerX3] +// fixed a data preview crash with 1.91.0 WIP. fixed contiguous highlight +// color when using data preview. *BREAKING* added UserData field passed to +// all optional function handlers: ReadFn, WriteFn, HighlightFn, BgColorFn. +// (#50) [@silverweed] +// +// TODO: +// - This is generally old/crappy code, it should work but isn't very good.. to be rewritten some +// day. +// - PageUp/PageDown are not supported because we use _NoNav. This is a good test scenario for +// working out idioms of how to mix natural nav and our own... +// - Arrows are being sent to the InputText() about to disappear which for LeftArrow makes the text +// cursor appear at position 1 for one frame. +// - Using InputText() is awkward and maybe overkill here, consider implementing something custom. + +#pragma once + +#include // uint8_t, etc. +#include // sprintf, scanf + +#if defined(_MSC_VER) || defined(_UCRT) +#define _PRISizeT "I" +#define ImSnprintf _snprintf +#else +#define _PRISizeT "z" +#define ImSnprintf snprintf +#endif + +#if defined(_MSC_VER) || defined(_UCRT) +#pragma warning(push) +#pragma warning( \ + disable : 4996) // warning C4996: 'sprintf': This function or variable may be unsafe. +#endif + +struct MemoryEditor { + enum DataFormat { + DataFormat_Bin = 0, + DataFormat_Dec = 1, + DataFormat_Hex = 2, + DataFormat_COUNT + }; + + // Settings + bool Open; // = true // set to false when DrawWindow() was closed. ignore if not using + // DrawWindow(). + bool ReadOnly; // = false // disable any editing. + int Cols; // = 16 // number of columns to display. + bool OptShowOptions; // = true // display options button/context menu. when disabled, options + // will be locked unless you provide your own UI for them. + bool OptShowDataPreview; // = false // display a footer previewing the decimal/binary/hex/float + // representation of the currently selected bytes. + bool OptShowHexII; // = false // display values in HexII representation instead of regular + // hexadecimal: hide null/zero bytes, ascii values as ".X". + bool OptShowAscii; // = true // display ASCII representation on the right side. + bool OptGreyOutZeroes; // = true // display null/zero bytes using the TextDisabled color. + bool OptUpperCaseHex; // = true // display hexadecimal values as "FF" instead of "ff". + int OptMidColsCount; // = 8 // set to 0 to disable extra spacing between every mid-cols. + int OptAddrDigitsCount; // = 0 // number of addr digits to display (default calculated + // based on maximum displayed addr). + float OptFooterExtraHeight; // = 0 // space to reserve at the bottom of the widget to add + // custom widgets + ImU32 HighlightColor; // // background color of highlighted bytes. + + // Function handlers + ImU8 (*ReadFn)(const ImU8* mem, size_t off, + void* user_data); // = 0 // optional handler to read bytes. + void (*WriteFn)(ImU8* mem, size_t off, ImU8 d, + void* user_data); // = 0 // optional handler to write bytes. + bool (*HighlightFn)(const ImU8* mem, size_t off, + void* user_data); // = 0 // optional handler to return Highlight + // property (to support non-contiguous highlighting). + ImU32 (*BgColorFn)(const ImU8* mem, size_t off, + void* user_data); // = 0 // optional handler to return custom background + // color of individual bytes. + void* UserData; // = NULL // user data forwarded to the function handlers + + // Public read-only data + bool MouseHovered; // set when mouse is hovering a value. + size_t MouseHoveredAddr; // the address currently being hovered if MouseHovered is set. + + // [Internal State] + bool ContentsWidthChanged; + size_t DataPreviewAddr; + size_t DataEditingAddr; + bool DataEditingTakeFocus; + char DataInputBuf[32]; + char AddrInputBuf[32]; + size_t GotoAddr; + size_t HighlightMin, HighlightMax; + int PreviewEndianness; + ImGuiDataType PreviewDataType; + + MemoryEditor() { + // Settings + Open = true; + ReadOnly = false; + Cols = 16; + OptShowOptions = true; + OptShowDataPreview = false; + OptShowHexII = false; + OptShowAscii = true; + OptGreyOutZeroes = true; + OptUpperCaseHex = true; + OptMidColsCount = 8; + OptAddrDigitsCount = 0; + OptFooterExtraHeight = 0.0f; + HighlightColor = IM_COL32(255, 255, 255, 50); + ReadFn = nullptr; + WriteFn = nullptr; + HighlightFn = nullptr; + BgColorFn = nullptr; + UserData = nullptr; + + // State/Internals + ContentsWidthChanged = false; + DataPreviewAddr = DataEditingAddr = (size_t)-1; + DataEditingTakeFocus = false; + memset(DataInputBuf, 0, sizeof(DataInputBuf)); + memset(AddrInputBuf, 0, sizeof(AddrInputBuf)); + GotoAddr = (size_t)-1; + MouseHovered = false; + MouseHoveredAddr = 0; + HighlightMin = HighlightMax = (size_t)-1; + PreviewEndianness = 0; + PreviewDataType = ImGuiDataType_S32; + } + + void GotoAddrAndHighlight(size_t addr_min, size_t addr_max) { + GotoAddr = addr_min; + HighlightMin = addr_min; + HighlightMax = addr_max; + } + + struct Sizes { + int AddrDigitsCount; + float LineHeight; + float GlyphWidth; + float HexCellWidth; + float SpacingBetweenMidCols; + float PosHexStart; + float PosHexEnd; + float PosAsciiStart; + float PosAsciiEnd; + float WindowWidth; + + Sizes() { + memset(this, 0, sizeof(*this)); + } + }; + + void CalcSizes(Sizes& s, size_t mem_size, size_t base_display_addr) { + ImGuiStyle& style = ImGui::GetStyle(); + s.AddrDigitsCount = OptAddrDigitsCount; + if (s.AddrDigitsCount == 0) + for (size_t n = base_display_addr + mem_size - 1; n > 0; n >>= 4) + s.AddrDigitsCount++; + s.LineHeight = ImGui::GetTextLineHeight(); + s.GlyphWidth = ImGui::CalcTextSize("F").x + 1; // We assume the font is mono-space + s.HexCellWidth = + (float)(int)(s.GlyphWidth * 2.5f); // "FF " we include trailing space in the width to + // easily catch clicks everywhere + s.SpacingBetweenMidCols = + (float)(int)(s.HexCellWidth * + 0.25f); // Every OptMidColsCount columns we add a bit of extra spacing + s.PosHexStart = (s.AddrDigitsCount + 2) * s.GlyphWidth; + s.PosHexEnd = s.PosHexStart + (s.HexCellWidth * Cols); + s.PosAsciiStart = s.PosAsciiEnd = s.PosHexEnd; + if (OptShowAscii) { + s.PosAsciiStart = s.PosHexEnd + s.GlyphWidth * 1; + if (OptMidColsCount > 0) + s.PosAsciiStart += (float)((Cols + OptMidColsCount - 1) / OptMidColsCount) * + s.SpacingBetweenMidCols; + s.PosAsciiEnd = s.PosAsciiStart + Cols * s.GlyphWidth; + } + s.WindowWidth = + s.PosAsciiEnd + style.ScrollbarSize + style.WindowPadding.x * 2 + s.GlyphWidth; + } + + // Standalone Memory Editor window + void DrawWindow(const char* title, void* mem_data, size_t mem_size, + size_t base_display_addr = 0x0000) { + Sizes s; + CalcSizes(s, mem_size, base_display_addr); + ImGui::SetNextWindowSize(ImVec2(s.WindowWidth, s.WindowWidth * 0.60f), + ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, 0.0f), ImVec2(s.WindowWidth, FLT_MAX)); + + Open = true; + if (ImGui::Begin(title, &Open, ImGuiWindowFlags_NoScrollbar)) { + DrawContents(mem_data, mem_size, base_display_addr); + if (ContentsWidthChanged) { + CalcSizes(s, mem_size, base_display_addr); + ImGui::SetWindowSize(ImVec2(s.WindowWidth, ImGui::GetWindowSize().y)); + } + } + ImGui::End(); + } + + // Memory Editor contents only + void DrawContents(void* mem_data_void, size_t mem_size, size_t base_display_addr = 0x0000) { + if (Cols < 1) + Cols = 1; + + ImU8* mem_data = (ImU8*)mem_data_void; + Sizes s; + CalcSizes(s, mem_size, base_display_addr); + ImGuiStyle& style = ImGui::GetStyle(); + + const ImVec2 contents_pos_start = ImGui::GetCursorScreenPos(); + + // We begin into our scrolling region with the 'ImGuiWindowFlags_NoMove' in order to prevent + // click from moving the window. This is used as a facility since our main click detection + // code doesn't assign an ActiveId so the click would normally be caught as a window-move. + const float height_separator = style.ItemSpacing.y; + float footer_height = OptFooterExtraHeight; + if (OptShowOptions) + footer_height += height_separator + ImGui::GetFrameHeightWithSpacing() * 1; + if (OptShowDataPreview) + footer_height += height_separator + ImGui::GetFrameHeightWithSpacing() * 1 + + ImGui::GetTextLineHeightWithSpacing() * 3; + ImGui::BeginChild("##scrolling", ImVec2(-FLT_MIN, -footer_height), ImGuiChildFlags_None, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + + // We are not really using the clipper API correctly here, because we rely on + // visible_start_addr/visible_end_addr for our scrolling function. + const int line_total_count = (int)((mem_size + Cols - 1) / Cols); + ImGuiListClipper clipper; + clipper.Begin(line_total_count, s.LineHeight); + + bool data_next = false; + + if (DataEditingAddr >= mem_size) + DataEditingAddr = (size_t)-1; + if (DataPreviewAddr >= mem_size) + DataPreviewAddr = (size_t)-1; + + size_t preview_data_type_size = OptShowDataPreview ? DataTypeGetSize(PreviewDataType) : 0; + + size_t data_editing_addr_next = (size_t)-1; + if (DataEditingAddr != (size_t)-1) { + // Move cursor but only apply on next frame so scrolling with be synchronized (because + // currently we can't change the scrolling while the window is being rendered) + if (ImGui::IsKeyPressed(ImGuiKey_UpArrow) && + (ptrdiff_t)DataEditingAddr >= (ptrdiff_t)Cols) { + data_editing_addr_next = DataEditingAddr - Cols; + } else if (ImGui::IsKeyPressed(ImGuiKey_DownArrow) && + (ptrdiff_t)DataEditingAddr < (ptrdiff_t)mem_size - Cols) { + data_editing_addr_next = DataEditingAddr + Cols; + } else if (ImGui::IsKeyPressed(ImGuiKey_LeftArrow) && + (ptrdiff_t)DataEditingAddr > (ptrdiff_t)0) { + data_editing_addr_next = DataEditingAddr - 1; + } else if (ImGui::IsKeyPressed(ImGuiKey_RightArrow) && + (ptrdiff_t)DataEditingAddr < (ptrdiff_t)mem_size - 1) { + data_editing_addr_next = DataEditingAddr + 1; + } + } + + // Draw vertical separator + ImVec2 window_pos = ImGui::GetWindowPos(); + if (OptShowAscii) + draw_list->AddLine( + ImVec2(window_pos.x + s.PosAsciiStart - s.GlyphWidth, window_pos.y), + ImVec2(window_pos.x + s.PosAsciiStart - s.GlyphWidth, window_pos.y + 9999), + ImGui::GetColorU32(ImGuiCol_Border)); + + const ImU32 color_text = ImGui::GetColorU32(ImGuiCol_Text); + const ImU32 color_disabled = + OptGreyOutZeroes ? ImGui::GetColorU32(ImGuiCol_TextDisabled) : color_text; + + const char* format_address = + OptUpperCaseHex ? "%0*" _PRISizeT "X: " : "%0*" _PRISizeT "x: "; + const char* format_data = OptUpperCaseHex ? "%0*" _PRISizeT "X" : "%0*" _PRISizeT "x"; + const char* format_byte = OptUpperCaseHex ? "%02X" : "%02x"; + const char* format_byte_space = OptUpperCaseHex ? "%02X " : "%02x "; + + MouseHovered = false; + MouseHoveredAddr = 0; + + while (clipper.Step()) + for (int line_i = clipper.DisplayStart; line_i < clipper.DisplayEnd; + line_i++) // display only visible lines + { + size_t addr = (size_t)line_i * Cols; + ImGui::Text(format_address, s.AddrDigitsCount, base_display_addr + addr); + + // Draw Hexadecimal + for (int n = 0; n < Cols && addr < mem_size; n++, addr++) { + float byte_pos_x = s.PosHexStart + s.HexCellWidth * n; + if (OptMidColsCount > 0) + byte_pos_x += (float)(n / OptMidColsCount) * s.SpacingBetweenMidCols; + ImGui::SameLine(byte_pos_x); + + // Draw highlight or custom background color + const bool is_highlight_from_user_range = + (addr >= HighlightMin && addr < HighlightMax); + const bool is_highlight_from_user_func = + (HighlightFn && HighlightFn(mem_data, addr, UserData)); + const bool is_highlight_from_preview = + (addr >= DataPreviewAddr && + addr < DataPreviewAddr + preview_data_type_size); + + ImU32 bg_color = 0; + bool is_next_byte_highlighted = false; + if (is_highlight_from_user_range || is_highlight_from_user_func || + is_highlight_from_preview) { + is_next_byte_highlighted = + (addr + 1 < mem_size) && + ((HighlightMax != (size_t)-1 && addr + 1 < HighlightMax) || + (HighlightFn && HighlightFn(mem_data, addr + 1, UserData)) || + (addr + 1 < DataPreviewAddr + preview_data_type_size)); + bg_color = HighlightColor; + } else if (BgColorFn != nullptr) { + is_next_byte_highlighted = + (addr + 1 < mem_size) && + ((BgColorFn(mem_data, addr + 1, UserData) & IM_COL32_A_MASK) != 0); + bg_color = BgColorFn(mem_data, addr, UserData); + } + if (bg_color != 0) { + float bg_width = s.GlyphWidth * 2; + if (is_next_byte_highlighted || (n + 1 == Cols)) { + bg_width = s.HexCellWidth; + if (OptMidColsCount > 0 && n > 0 && (n + 1) < Cols && + ((n + 1) % OptMidColsCount) == 0) + bg_width += s.SpacingBetweenMidCols; + } + ImVec2 pos = ImGui::GetCursorScreenPos(); + draw_list->AddRectFilled( + pos, ImVec2(pos.x + bg_width, pos.y + s.LineHeight), bg_color); + } + + if (DataEditingAddr == addr) { + // Display text input on current byte + bool data_write = false; + ImGui::PushID((void*)addr); + if (DataEditingTakeFocus) { + ImGui::SetKeyboardFocusHere(0); + ImSnprintf(AddrInputBuf, 32, format_data, s.AddrDigitsCount, + base_display_addr + addr); + ImSnprintf(DataInputBuf, 32, format_byte, + ReadFn ? ReadFn(mem_data, addr, UserData) : mem_data[addr]); + } + struct InputTextUserData { + // FIXME: We should have a way to retrieve the text edit cursor position + // more easily in the API, this is rather tedious. This is such a ugly + // mess we may be better off not using InputText() at all here. + static int Callback(ImGuiInputTextCallbackData* data) { + InputTextUserData* user_data = (InputTextUserData*)data->UserData; + if (!data->HasSelection()) + user_data->CursorPos = data->CursorPos; +#if IMGUI_VERSION_NUM < 19102 + if (data->Flags & ImGuiInputTextFlags_ReadOnly) + return 0; +#endif + if (data->SelectionStart == 0 && + data->SelectionEnd == data->BufTextLen) { + // When not editing a byte, always refresh its InputText content + // pulled from underlying memory data (this is a bit tricky, + // since InputText technically "owns" the master copy of the + // buffer we edit it in there) + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, user_data->CurrentBufOverwrite); + data->SelectionStart = 0; + data->SelectionEnd = 2; + data->CursorPos = 0; + } + return 0; + } + char CurrentBufOverwrite[3]; // Input + int CursorPos; // Output + }; + InputTextUserData input_text_user_data; + input_text_user_data.CursorPos = -1; + ImSnprintf(input_text_user_data.CurrentBufOverwrite, 3, format_byte, + ReadFn ? ReadFn(mem_data, addr, UserData) : mem_data[addr]); + ImGuiInputTextFlags flags = ImGuiInputTextFlags_CharsHexadecimal | + ImGuiInputTextFlags_EnterReturnsTrue | + ImGuiInputTextFlags_AutoSelectAll | + ImGuiInputTextFlags_NoHorizontalScroll | + ImGuiInputTextFlags_CallbackAlways; + if (ReadOnly) + flags |= ImGuiInputTextFlags_ReadOnly; + flags |= + ImGuiInputTextFlags_AlwaysOverwrite; // was + // ImGuiInputTextFlags_AlwaysInsertMode + ImGui::SetNextItemWidth(s.GlyphWidth * 2); + if (ImGui::InputText("##data", DataInputBuf, IM_ARRAYSIZE(DataInputBuf), + flags, InputTextUserData::Callback, + &input_text_user_data)) + data_write = data_next = true; + else if (!DataEditingTakeFocus && !ImGui::IsItemActive()) + DataEditingAddr = data_editing_addr_next = (size_t)-1; + DataEditingTakeFocus = false; + if (input_text_user_data.CursorPos >= 2) + data_write = data_next = true; + if (data_editing_addr_next != (size_t)-1) + data_write = data_next = false; + unsigned int data_input_value = 0; + if (!ReadOnly && data_write && + sscanf(DataInputBuf, "%X", &data_input_value) == 1) { + if (WriteFn) + WriteFn(mem_data, addr, (ImU8)data_input_value, UserData); + else + mem_data[addr] = (ImU8)data_input_value; + } + ImGui::PopID(); + } else { + // NB: The trailing space is not visible but ensure there's no gap that the + // mouse cannot click on. + ImU8 b = ReadFn ? ReadFn(mem_data, addr, UserData) : mem_data[addr]; + + if (OptShowHexII) { + if ((b >= 32 && b < 128)) + ImGui::Text(".%c ", b); + else if (b == 0xFF && OptGreyOutZeroes) + ImGui::TextDisabled("## "); + else if (b == 0x00) + ImGui::Text(" "); + else + ImGui::Text(format_byte_space, b); + } else { + if (b == 0 && OptGreyOutZeroes) + ImGui::TextDisabled("00 "); + else + ImGui::Text(format_byte_space, b); + } + if (ImGui::IsItemHovered()) { + MouseHovered = true; + MouseHoveredAddr = addr; + if (ImGui::IsMouseClicked(0)) { + DataEditingTakeFocus = true; + data_editing_addr_next = addr; + } + } + } + } + + if (OptShowAscii) { + // Draw ASCII values + ImGui::SameLine(s.PosAsciiStart); + ImVec2 pos = ImGui::GetCursorScreenPos(); + addr = (size_t)line_i * Cols; + + const float mouse_off_x = ImGui::GetIO().MousePos.x - pos.x; + const size_t mouse_addr = + (mouse_off_x >= 0.0f && mouse_off_x < s.PosAsciiEnd - s.PosAsciiStart) + ? addr + (size_t)(mouse_off_x / s.GlyphWidth) + : (size_t)-1; + + ImGui::PushID(line_i); + if (ImGui::InvisibleButton( + "ascii", ImVec2(s.PosAsciiEnd - s.PosAsciiStart, s.LineHeight))) { + DataEditingAddr = DataPreviewAddr = mouse_addr; + DataEditingTakeFocus = true; + } + if (ImGui::IsItemHovered()) { + MouseHovered = true; + MouseHoveredAddr = mouse_addr; + } + ImGui::PopID(); + for (int n = 0; n < Cols && addr < mem_size; n++, addr++) { + if (addr == DataEditingAddr) { + draw_list->AddRectFilled( + pos, ImVec2(pos.x + s.GlyphWidth, pos.y + s.LineHeight), + ImGui::GetColorU32(ImGuiCol_FrameBg)); + draw_list->AddRectFilled( + pos, ImVec2(pos.x + s.GlyphWidth, pos.y + s.LineHeight), + ImGui::GetColorU32(ImGuiCol_TextSelectedBg)); + } else if (BgColorFn) { + draw_list->AddRectFilled( + pos, ImVec2(pos.x + s.GlyphWidth, pos.y + s.LineHeight), + BgColorFn(mem_data, addr, UserData)); + } + unsigned char c = + ReadFn ? ReadFn(mem_data, addr, UserData) : mem_data[addr]; + char display_c = (c < 32 || c >= 128) ? '.' : c; + draw_list->AddText(pos, (display_c == c) ? color_text : color_disabled, + &display_c, &display_c + 1); + pos.x += s.GlyphWidth; + } + } + } + ImGui::PopStyleVar(2); + const float child_width = ImGui::GetWindowSize().x; + ImGui::EndChild(); + + // Notify the main window of our ideal child content size (FIXME: we are missing an API to + // get the contents size from the child) + ImGui::SetCursorPosX(s.WindowWidth); + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + + if (data_next && DataEditingAddr + 1 < mem_size) { + DataEditingAddr = DataPreviewAddr = DataEditingAddr + 1; + DataEditingTakeFocus = true; + } else if (data_editing_addr_next != (size_t)-1) { + DataEditingAddr = DataPreviewAddr = data_editing_addr_next; + DataEditingTakeFocus = true; + } + + const bool lock_show_data_preview = OptShowDataPreview; + if (OptShowOptions) { + ImGui::Separator(); + DrawOptionsLine(s, mem_data, mem_size, base_display_addr); + } + + if (lock_show_data_preview) { + ImGui::Separator(); + DrawPreviewLine(s, mem_data, mem_size, base_display_addr); + } + + const ImVec2 contents_pos_end(contents_pos_start.x + child_width, + ImGui::GetCursorScreenPos().y); + // ImGui::GetForegroundDrawList()->AddRect(contents_pos_start, contents_pos_end, + // IM_COL32(255, 0, 0, 255)); + if (OptShowOptions) + if (ImGui::IsMouseHoveringRect(contents_pos_start, contents_pos_end)) + if (ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows) && + ImGui::IsMouseReleased(ImGuiMouseButton_Right)) + ImGui::OpenPopup("OptionsPopup"); + + if (ImGui::BeginPopup("OptionsPopup")) { + ImGui::SetNextItemWidth(s.GlyphWidth * 7 + style.FramePadding.x * 2.0f); + if (ImGui::DragInt("##cols", &Cols, 0.2f, 4, 32, "%d cols")) { + ContentsWidthChanged = true; + if (Cols < 1) + Cols = 1; + } + ImGui::Checkbox("Show Data Preview", &OptShowDataPreview); + ImGui::Checkbox("Show HexII", &OptShowHexII); + if (ImGui::Checkbox("Show Ascii", &OptShowAscii)) { + ContentsWidthChanged = true; + } + ImGui::Checkbox("Grey out zeroes", &OptGreyOutZeroes); + ImGui::Checkbox("Uppercase Hex", &OptUpperCaseHex); + + ImGui::EndPopup(); + } + } + + void DrawOptionsLine(const Sizes& s, void* mem_data, size_t mem_size, + size_t base_display_addr) { + IM_UNUSED(mem_data); + ImGuiStyle& style = ImGui::GetStyle(); + const char* format_range = OptUpperCaseHex ? "Range %0*" _PRISizeT "X..%0*" _PRISizeT "X" + : "Range %0*" _PRISizeT "x..%0*" _PRISizeT "x"; + + // Options menu + if (ImGui::Button("Options")) + ImGui::OpenPopup("OptionsPopup"); + + ImGui::SameLine(); + ImGui::Text(format_range, s.AddrDigitsCount, base_display_addr, s.AddrDigitsCount, + base_display_addr + mem_size - 1); + ImGui::SameLine(); + ImGui::SetNextItemWidth((s.AddrDigitsCount + 1) * s.GlyphWidth + + style.FramePadding.x * 2.0f); + if (ImGui::InputText("##addr", AddrInputBuf, IM_ARRAYSIZE(AddrInputBuf), + ImGuiInputTextFlags_CharsHexadecimal | + ImGuiInputTextFlags_EnterReturnsTrue)) { + size_t goto_addr; + if (sscanf(AddrInputBuf, "%" _PRISizeT "X", &goto_addr) == 1) { + GotoAddr = goto_addr - base_display_addr; + HighlightMin = HighlightMax = (size_t)-1; + } + } + + if (GotoAddr != (size_t)-1) { + if (GotoAddr < mem_size) { + ImGui::BeginChild("##scrolling"); + ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + + (GotoAddr / Cols) * ImGui::GetTextLineHeight()); + ImGui::EndChild(); + DataEditingAddr = DataPreviewAddr = GotoAddr; + DataEditingTakeFocus = true; + } + GotoAddr = (size_t)-1; + } + + // if (MouseHovered) + //{ + // ImGui::SameLine(); + // ImGui::Text("Hovered: %p", MouseHoveredAddr); + // } + } + + void DrawPreviewLine(const Sizes& s, void* mem_data_void, size_t mem_size, + size_t base_display_addr) { + IM_UNUSED(base_display_addr); + ImU8* mem_data = (ImU8*)mem_data_void; + ImGuiStyle& style = ImGui::GetStyle(); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Preview as:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth((s.GlyphWidth * 10.0f) + style.FramePadding.x * 2.0f + + style.ItemInnerSpacing.x); + + static const ImGuiDataType supported_data_types[] = { + ImGuiDataType_S8, ImGuiDataType_U8, ImGuiDataType_S16, ImGuiDataType_U16, + ImGuiDataType_S32, ImGuiDataType_U32, ImGuiDataType_S64, ImGuiDataType_U64, + ImGuiDataType_Float, ImGuiDataType_Double}; + if (ImGui::BeginCombo("##combo_type", DataTypeGetDesc(PreviewDataType), + ImGuiComboFlags_HeightLargest)) { + for (int n = 0; n < IM_ARRAYSIZE(supported_data_types); n++) { + ImGuiDataType data_type = supported_data_types[n]; + if (ImGui::Selectable(DataTypeGetDesc(data_type), PreviewDataType == data_type)) + PreviewDataType = data_type; + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + ImGui::SetNextItemWidth((s.GlyphWidth * 6.0f) + style.FramePadding.x * 2.0f + + style.ItemInnerSpacing.x); + ImGui::Combo("##combo_endianness", &PreviewEndianness, "LE\0BE\0\0"); + + char buf[128] = ""; + float x = s.GlyphWidth * 6.0f; + bool has_value = DataPreviewAddr != (size_t)-1; + if (has_value) + DrawPreviewData(DataPreviewAddr, mem_data, mem_size, PreviewDataType, DataFormat_Dec, + buf, (size_t)IM_ARRAYSIZE(buf)); + ImGui::Text("Dec"); + ImGui::SameLine(x); + ImGui::TextUnformatted(has_value ? buf : "N/A"); + if (has_value) + DrawPreviewData(DataPreviewAddr, mem_data, mem_size, PreviewDataType, DataFormat_Hex, + buf, (size_t)IM_ARRAYSIZE(buf)); + ImGui::Text("Hex"); + ImGui::SameLine(x); + ImGui::TextUnformatted(has_value ? buf : "N/A"); + if (has_value) + DrawPreviewData(DataPreviewAddr, mem_data, mem_size, PreviewDataType, DataFormat_Bin, + buf, (size_t)IM_ARRAYSIZE(buf)); + buf[IM_ARRAYSIZE(buf) - 1] = 0; + ImGui::Text("Bin"); + ImGui::SameLine(x); + ImGui::TextUnformatted(has_value ? buf : "N/A"); + } + + // Utilities for Data Preview (since we don't access imgui_internal.h) + // FIXME: This technically depends on ImGuiDataType order. + const char* DataTypeGetDesc(ImGuiDataType data_type) const { + const char* descs[] = {"Int8", "Uint8", "Int16", "Uint16", "Int32", + "Uint32", "Int64", "Uint64", "Float", "Double"}; + IM_ASSERT(data_type >= 0 && data_type < IM_ARRAYSIZE(descs)); + return descs[data_type]; + } + + size_t DataTypeGetSize(ImGuiDataType data_type) const { + const size_t sizes[] = {1, 1, 2, 2, 4, 4, 8, 8, sizeof(float), sizeof(double)}; + IM_ASSERT(data_type >= 0 && data_type < IM_ARRAYSIZE(sizes)); + return sizes[data_type]; + } + + const char* DataFormatGetDesc(DataFormat data_format) const { + const char* descs[] = {"Bin", "Dec", "Hex"}; + IM_ASSERT(data_format >= 0 && data_format < DataFormat_COUNT); + return descs[data_format]; + } + + bool IsBigEndian() const { + uint16_t x = 1; + char c[2]; + memcpy(c, &x, 2); + return c[0] != 0; + } + + static void* EndiannessCopyBigEndian(void* _dst, void* _src, size_t s, int is_little_endian) { + if (is_little_endian) { + uint8_t* dst = (uint8_t*)_dst; + uint8_t* src = (uint8_t*)_src + s - 1; + for (int i = 0, n = (int)s; i < n; ++i) + memcpy(dst++, src--, 1); + return _dst; + } else { + return memcpy(_dst, _src, s); + } + } + + static void* EndiannessCopyLittleEndian(void* _dst, void* _src, size_t s, + int is_little_endian) { + if (is_little_endian) { + return memcpy(_dst, _src, s); + } else { + uint8_t* dst = (uint8_t*)_dst; + uint8_t* src = (uint8_t*)_src + s - 1; + for (int i = 0, n = (int)s; i < n; ++i) + memcpy(dst++, src--, 1); + return _dst; + } + } + + void* EndiannessCopy(void* dst, void* src, size_t size) const { + static void* (*fp)(void*, void*, size_t, int) = nullptr; + if (fp == nullptr) + fp = IsBigEndian() ? EndiannessCopyBigEndian : EndiannessCopyLittleEndian; + return fp(dst, src, size, PreviewEndianness); + } + + const char* FormatBinary(const uint8_t* buf, int width) const { + IM_ASSERT(width <= 64); + size_t out_n = 0; + static char out_buf[64 + 8 + 1]; + int n = width / 8; + for (int j = n - 1; j >= 0; --j) { + for (int i = 0; i < 8; ++i) + out_buf[out_n++] = (buf[j] & (1 << (7 - i))) ? '1' : '0'; + out_buf[out_n++] = ' '; + } + IM_ASSERT(out_n < IM_ARRAYSIZE(out_buf)); + out_buf[out_n] = 0; + return out_buf; + } + + // [Internal] + void DrawPreviewData(size_t addr, const ImU8* mem_data, size_t mem_size, + ImGuiDataType data_type, DataFormat data_format, char* out_buf, + size_t out_buf_size) const { + uint8_t buf[8]; + size_t elem_size = DataTypeGetSize(data_type); + size_t size = addr + elem_size > mem_size ? mem_size - addr : elem_size; + if (ReadFn) + for (int i = 0, n = (int)size; i < n; ++i) + buf[i] = ReadFn(mem_data, addr + i, UserData); + else + memcpy(buf, mem_data + addr, size); + + if (data_format == DataFormat_Bin) { + uint8_t binbuf[8]; + EndiannessCopy(binbuf, buf, size); + ImSnprintf(out_buf, out_buf_size, "%s", FormatBinary(binbuf, (int)size * 8)); + return; + } + + out_buf[0] = 0; + switch (data_type) { + case ImGuiDataType_S8: { + int8_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%hhd", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%02x", data & 0xFF); + return; + } + break; + } + case ImGuiDataType_U8: { + uint8_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%hhu", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%02x", data & 0XFF); + return; + } + break; + } + case ImGuiDataType_S16: { + int16_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%hd", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%04x", data & 0xFFFF); + return; + } + break; + } + case ImGuiDataType_U16: { + uint16_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%hu", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%04x", data & 0xFFFF); + return; + } + break; + } + case ImGuiDataType_S32: { + int32_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%d", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%08x", data); + return; + } + break; + } + case ImGuiDataType_U32: { + uint32_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%u", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%08x", data); + return; + } + break; + } + case ImGuiDataType_S64: { + int64_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%lld", (long long)data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%016llx", (long long)data); + return; + } + break; + } + case ImGuiDataType_U64: { + uint64_t data = 0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%llu", (long long)data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "0x%016llx", (long long)data); + return; + } + break; + } + case ImGuiDataType_Float: { + float data = 0.0f; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%f", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "%a", data); + return; + } + break; + } + case ImGuiDataType_Double: { + double data = 0.0; + EndiannessCopy(&data, buf, size); + if (data_format == DataFormat_Dec) { + ImSnprintf(out_buf, out_buf_size, "%f", data); + return; + } + if (data_format == DataFormat_Hex) { + ImSnprintf(out_buf, out_buf_size, "%a", data); + return; + } + break; + } + default: + case ImGuiDataType_COUNT: + break; + } // Switch + IM_ASSERT(0); // Shouldn't reach + } +}; + +#undef _PRISizeT +#undef ImSnprintf + +#ifdef _MSC_VER +#pragma warning(pop) +#endif \ No newline at end of file diff --git a/src/core/file_format/pkg.cpp b/src/core/file_format/pkg.cpp index d86f3b28d..7d36b019a 100644 --- a/src/core/file_format/pkg.cpp +++ b/src/core/file_format/pkg.cpp @@ -44,7 +44,7 @@ PKG::PKG() = default; PKG::~PKG() = default; -bool PKG::Open(const std::filesystem::path& filepath) { +bool PKG::Open(const std::filesystem::path& filepath, std::string& failreason) { Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); if (!file.IsOpen()) { return false; @@ -70,7 +70,11 @@ bool PKG::Open(const std::filesystem::path& filepath) { u32 offset = pkgheader.pkg_table_entry_offset; u32 n_files = pkgheader.pkg_table_entry_count; - file.Seek(offset); + if (!file.Seek(offset)) { + failreason = "Failed to seek to PKG table entry offset"; + return false; + } + for (int i = 0; i < n_files; i++) { PKGEntry entry{}; file.Read(entry.id); @@ -85,7 +89,10 @@ bool PKG::Open(const std::filesystem::path& filepath) { const auto name = GetEntryNameByType(entry.id); if (name == "param.sfo") { sfo.clear(); - file.Seek(entry.offset); + if (!file.Seek(entry.offset)) { + failreason = "Failed to seek to param.sfo offset"; + return false; + } sfo.resize(entry.size); file.ReadRaw(sfo.data(), entry.size); } @@ -127,7 +134,11 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: std::array, 7> key1; std::array imgkeydata; - file.Seek(offset); + if (!file.Seek(offset)) { + failreason = "Failed to seek to PKG table entry offset"; + return false; + } + for (int i = 0; i < n_files; i++) { PKGEntry entry{}; file.Read(entry.id); @@ -149,7 +160,10 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: // Just print with id Common::FS::IOFile out(extract_path / "sce_sys" / std::to_string(entry.id), Common::FS::FileAccessMode::Write); - file.Seek(entry.offset); + if (!file.Seek(entry.offset)) { + failreason = "Failed to seek to PKG entry offset"; + return false; + } std::vector data; data.resize(entry.size); @@ -195,7 +209,10 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: } Common::FS::IOFile out(extract_path / "sce_sys" / name, Common::FS::FileAccessMode::Write); - file.Seek(entry.offset); + if (!file.Seek(entry.offset)) { + failreason = "Failed to seek to PKG entry offset"; + return false; + } std::vector data; data.resize(entry.size); @@ -207,7 +224,10 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: if (entry.id == 0x400 || entry.id == 0x401 || entry.id == 0x402 || entry.id == 0x403) { // somehow 0x401 is not decrypting decNp.resize(entry.size); - file.Seek(entry.offset); + if (!file.Seek(entry.offset)) { + failreason = "Failed to seek to PKG entry offset"; + return false; + } std::vector data; data.resize(entry.size); @@ -229,15 +249,12 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: file.Seek(currentPos); } - // Extract trophy files - if (!trp.Extract(extract_path)) { - // Do nothing some pkg come with no trp file. - // return false; - } - // Read the seed std::array seed; - file.Seek(pkgheader.pfs_image_offset + 0x370); + if (!file.Seek(pkgheader.pfs_image_offset + 0x370)) { + failreason = "Failed to seek to PFS image offset"; + return false; + } file.Read(seed); // Get data and tweak keys. @@ -371,8 +388,7 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: if (table.type == PFS_CURRENT_DIR) { current_dir = extractPaths[table.inode]; } - extractPaths[table.inode] = - current_dir.string() / std::filesystem::path(table.name); + extractPaths[table.inode] = current_dir / std::filesystem::path(table.name); if (table.type == PFS_FILE || table.type == PFS_DIR) { if (table.type == PFS_DIR) { // Create dirs. @@ -402,7 +418,7 @@ void PKG::ExtractFiles(const int index) { int bsize = iNodeBuf[inode_number].Size; Common::FS::IOFile inflated; - inflated.Open(extractPaths[inode_number].string(), Common::FS::FileAccessMode::Write); + inflated.Open(extractPaths[inode_number], Common::FS::FileAccessMode::Write); Common::FS::IOFile pkgFile; // Open the file for each iteration to avoid conflict. pkgFile.Open(pkgpath, Common::FS::FileAccessMode::Read); diff --git a/src/core/file_format/pkg.h b/src/core/file_format/pkg.h index d30d50b44..a488a2df8 100644 --- a/src/core/file_format/pkg.h +++ b/src/core/file_format/pkg.h @@ -103,7 +103,7 @@ public: PKG(); ~PKG(); - bool Open(const std::filesystem::path& filepath); + bool Open(const std::filesystem::path& filepath, std::string& failreason); void ExtractFiles(const int index); bool Extract(const std::filesystem::path& filepath, const std::filesystem::path& extract, std::string& failreason); diff --git a/src/core/file_format/psf.cpp b/src/core/file_format/psf.cpp index 3d076acdc..a5e502f98 100644 --- a/src/core/file_format/psf.cpp +++ b/src/core/file_format/psf.cpp @@ -2,61 +2,280 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include + +#include "common/assert.h" #include "common/io_file.h" +#include "common/logging/log.h" #include "core/file_format/psf.h" -PSF::PSF() = default; +static const std::unordered_map psf_known_max_sizes = { + {"ACCOUNT_ID", 8}, {"CATEGORY", 4}, {"DETAIL", 1024}, {"FORMAT", 4}, + {"MAINTITLE", 128}, {"PARAMS", 1024}, {"SAVEDATA_BLOCKS", 8}, {"SAVEDATA_DIRECTORY", 32}, + {"SUBTITLE", 128}, {"TITLE_ID", 12}, +}; +static inline u32 get_max_size(std::string_view key, u32 default_value) { + if (const auto& v = psf_known_max_sizes.find(key); v != psf_known_max_sizes.end()) { + return v->second; + } + return default_value; +} -PSF::~PSF() = default; - -bool PSF::open(const std::string& filepath, const std::vector& psfBuffer) { - if (!psfBuffer.empty()) { - psf.resize(psfBuffer.size()); - psf = psfBuffer; - } else { - Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - - const u64 psfSize = file.GetSize(); - psf.resize(psfSize); - file.Seek(0); - file.Read(psf); - file.Close(); +bool PSF::Open(const std::filesystem::path& filepath) { + if (std::filesystem::exists(filepath)) { + last_write = std::filesystem::last_write_time(filepath); } - // Parse file contents - PSFHeader header; - std::memcpy(&header, psf.data(), sizeof(header)); - for (u32 i = 0; i < header.index_table_entries; i++) { - PSFEntry entry; - std::memcpy(&entry, &psf[sizeof(PSFHeader) + i * sizeof(PSFEntry)], sizeof(entry)); + Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); + if (!file.IsOpen()) { + return false; + } - const std::string key = (char*)&psf[header.key_table_offset + entry.key_offset]; - if (entry.param_fmt == PSFEntry::Fmt::TextRaw || - entry.param_fmt == PSFEntry::Fmt::TextNormal) { - map_strings[key] = (char*)&psf[header.data_table_offset + entry.data_offset]; - } - if (entry.param_fmt == PSFEntry::Fmt::Integer) { - u32 value; - std::memcpy(&value, &psf[header.data_table_offset + entry.data_offset], sizeof(value)); - map_integers[key] = value; + const u64 psfSize = file.GetSize(); + std::vector psf(psfSize); + file.Seek(0); + file.Read(psf); + file.Close(); + return Open(psf); +} + +bool PSF::Open(const std::vector& psf_buffer) { + const u8* psf_data = psf_buffer.data(); + + entry_list.clear(); + map_binaries.clear(); + map_strings.clear(); + map_integers.clear(); + + // Parse file contents + PSFHeader header{}; + std::memcpy(&header, psf_data, sizeof(header)); + + if (header.magic != PSF_MAGIC) { + LOG_ERROR(Core, "Invalid PSF magic number"); + return false; + } + if (header.version != PSF_VERSION_1_1 && header.version != PSF_VERSION_1_0) { + LOG_ERROR(Core, "Unsupported PSF version: 0x{:08x}", header.version); + return false; + } + + for (u32 i = 0; i < header.index_table_entries; i++) { + PSFRawEntry raw_entry{}; + std::memcpy(&raw_entry, psf_data + sizeof(PSFHeader) + i * sizeof(PSFRawEntry), + sizeof(raw_entry)); + + Entry& entry = entry_list.emplace_back(); + entry.key = std::string{(char*)(psf_data + header.key_table_offset + raw_entry.key_offset)}; + entry.param_fmt = static_cast(raw_entry.param_fmt.Raw()); + entry.max_len = raw_entry.param_max_len; + + const u8* data = psf_data + header.data_table_offset + raw_entry.data_offset; + + switch (entry.param_fmt) { + case PSFEntryFmt::Binary: { + std::vector value(raw_entry.param_len); + std::memcpy(value.data(), data, raw_entry.param_len); + map_binaries.emplace(i, std::move(value)); + } break; + case PSFEntryFmt::Text: { + std::string c_str{reinterpret_cast(data)}; + map_strings.emplace(i, std::move(c_str)); + } break; + case PSFEntryFmt::Integer: { + ASSERT_MSG(raw_entry.param_len == sizeof(s32), "PSF integer entry size mismatch"); + s32 integer = *(s32*)data; + map_integers.emplace(i, integer); + } break; + default: + UNREACHABLE_MSG("Unknown PSF entry format"); } } return true; } -std::string PSF::GetString(const std::string& key) { - if (map_strings.find(key) != map_strings.end()) { - return map_strings.at(key); +bool PSF::Encode(const std::filesystem::path& filepath) const { + Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Write); + if (!file.IsOpen()) { + return false; } - return ""; + + last_write = std::filesystem::file_time_type::clock::now(); + + const auto psf_buffer = Encode(); + const size_t written = file.Write(psf_buffer); + if (written != psf_buffer.size()) { + LOG_ERROR(Core, "Failed to write PSF file. Written {} Expected {}", written, + psf_buffer.size()); + } + return written == psf_buffer.size(); } -u32 PSF::GetInteger(const std::string& key) { - if (map_integers.find(key) != map_integers.end()) { - return map_integers.at(key); - } - return -1; +std::vector PSF::Encode() const { + std::vector psf_buffer; + Encode(psf_buffer); + return psf_buffer; +} + +void PSF::Encode(std::vector& psf_buffer) const { + psf_buffer.resize(sizeof(PSFHeader) + sizeof(PSFRawEntry) * entry_list.size()); + + { + auto& header = *(PSFHeader*)psf_buffer.data(); + header.magic = PSF_MAGIC; + header.version = PSF_VERSION_1_1; + header.index_table_entries = entry_list.size(); + } + + const size_t key_table_offset = psf_buffer.size(); + ((PSFHeader*)psf_buffer.data())->key_table_offset = key_table_offset; + for (size_t i = 0; i < entry_list.size(); i++) { + auto& raw_entry = ((PSFRawEntry*)(psf_buffer.data() + sizeof(PSFHeader)))[i]; + const Entry& entry = entry_list[i]; + raw_entry.key_offset = psf_buffer.size() - key_table_offset; + raw_entry.param_fmt.FromRaw(static_cast(entry.param_fmt)); + raw_entry.param_max_len = entry.max_len; + std::ranges::copy(entry.key, std::back_inserter(psf_buffer)); + psf_buffer.push_back(0); // NULL terminator + } + + const size_t data_table_offset = psf_buffer.size(); + ((PSFHeader*)psf_buffer.data())->data_table_offset = data_table_offset; + for (size_t i = 0; i < entry_list.size(); i++) { + if (psf_buffer.size() % 4 != 0) { + std::ranges::fill_n(std::back_inserter(psf_buffer), 4 - psf_buffer.size() % 4, 0); + } + auto& raw_entry = ((PSFRawEntry*)(psf_buffer.data() + sizeof(PSFHeader)))[i]; + const Entry& entry = entry_list[i]; + raw_entry.data_offset = psf_buffer.size() - data_table_offset; + + s32 additional_padding = s32(raw_entry.param_max_len); + + switch (entry.param_fmt) { + case PSFEntryFmt::Binary: { + const auto& value = map_binaries.at(i); + raw_entry.param_len = value.size(); + additional_padding -= s32(raw_entry.param_len); + std::ranges::copy(value, std::back_inserter(psf_buffer)); + } break; + case PSFEntryFmt::Text: { + const auto& value = map_strings.at(i); + raw_entry.param_len = value.size() + 1; + additional_padding -= s32(raw_entry.param_len); + std::ranges::copy(value, std::back_inserter(psf_buffer)); + psf_buffer.push_back(0); // NULL terminator + } break; + case PSFEntryFmt::Integer: { + const auto& value = map_integers.at(i); + raw_entry.param_len = sizeof(s32); + additional_padding -= s32(raw_entry.param_len); + const auto value_bytes = reinterpret_cast(&value); + std::ranges::copy(value_bytes, value_bytes + sizeof(s32), + std::back_inserter(psf_buffer)); + } break; + default: + UNREACHABLE_MSG("Unknown PSF entry format"); + } + ASSERT_MSG(additional_padding >= 0, "PSF entry max size mismatch"); + std::ranges::fill_n(std::back_inserter(psf_buffer), additional_padding, 0); + } +} + +std::optional> PSF::GetBinary(std::string_view key) const { + const auto& [it, index] = FindEntry(key); + if (it == entry_list.end()) { + return {}; + } + ASSERT(it->param_fmt == PSFEntryFmt::Binary); + return std::span{map_binaries.at(index)}; +} + +std::optional PSF::GetString(std::string_view key) const { + const auto& [it, index] = FindEntry(key); + if (it == entry_list.end()) { + return {}; + } + ASSERT(it->param_fmt == PSFEntryFmt::Text); + return std::string_view{map_strings.at(index)}; +} + +std::optional PSF::GetInteger(std::string_view key) const { + const auto& [it, index] = FindEntry(key); + if (it == entry_list.end()) { + return {}; + } + ASSERT(it->param_fmt == PSFEntryFmt::Integer); + return map_integers.at(index); +} + +void PSF::AddBinary(std::string key, std::vector value, bool update) { + auto [it, index] = FindEntry(key); + bool exist = it != entry_list.end(); + if (exist && !update) { + LOG_ERROR(Core, "PSF: Tried to add binary key that already exists: {}", key); + return; + } + if (exist) { + ASSERT_MSG(it->param_fmt == PSFEntryFmt::Binary, "PSF: Change format is not supported"); + it->max_len = get_max_size(key, value.size()); + map_binaries.at(index) = std::move(value); + return; + } + Entry& entry = entry_list.emplace_back(); + entry.max_len = get_max_size(key, value.size()); + entry.key = std::move(key); + entry.param_fmt = PSFEntryFmt::Binary; + map_binaries.emplace(entry_list.size() - 1, std::move(value)); +} + +void PSF::AddString(std::string key, std::string value, bool update) { + auto [it, index] = FindEntry(key); + bool exist = it != entry_list.end(); + if (exist && !update) { + LOG_ERROR(Core, "PSF: Tried to add string key that already exists: {}", key); + return; + } + if (exist) { + ASSERT_MSG(it->param_fmt == PSFEntryFmt::Text, "PSF: Change format is not supported"); + it->max_len = get_max_size(key, value.size() + 1); + map_strings.at(index) = std::move(value); + return; + } + Entry& entry = entry_list.emplace_back(); + entry.max_len = get_max_size(key, value.size() + 1); + entry.key = std::move(key); + entry.param_fmt = PSFEntryFmt::Text; + map_strings.emplace(entry_list.size() - 1, std::move(value)); +} + +void PSF::AddInteger(std::string key, s32 value, bool update) { + auto [it, index] = FindEntry(key); + bool exist = it != entry_list.end(); + if (exist && !update) { + LOG_ERROR(Core, "PSF: Tried to add integer key that already exists: {}", key); + return; + } + if (exist) { + ASSERT_MSG(it->param_fmt == PSFEntryFmt::Integer, "PSF: Change format is not supported"); + it->max_len = sizeof(s32); + map_integers.at(index) = value; + return; + } + Entry& entry = entry_list.emplace_back(); + entry.key = std::move(key); + entry.param_fmt = PSFEntryFmt::Integer; + entry.max_len = sizeof(s32); + map_integers.emplace(entry_list.size() - 1, value); +} + +std::pair::iterator, size_t> PSF::FindEntry(std::string_view key) { + auto entry = + std::ranges::find_if(entry_list, [&](const auto& entry) { return entry.key == key; }); + return {entry, std::distance(entry_list.begin(), entry)}; +} + +std::pair::const_iterator, size_t> PSF::FindEntry( + std::string_view key) const { + auto entry = + std::ranges::find_if(entry_list, [&](const auto& entry) { return entry.key == key; }); + return {entry, std::distance(entry_list.begin(), entry)}; } diff --git a/src/core/file_format/psf.h b/src/core/file_format/psf.h index 9a162b1d5..d25b79eec 100644 --- a/src/core/file_format/psf.h +++ b/src/core/file_format/psf.h @@ -3,11 +3,18 @@ #pragma once +#include +#include #include +#include #include #include #include "common/endian.h" +constexpr u32 PSF_MAGIC = 0x00505346; +constexpr u32 PSF_VERSION_1_1 = 0x00000101; +constexpr u32 PSF_VERSION_1_0 = 0x00000100; + struct PSFHeader { u32_be magic; u32_le version; @@ -15,34 +22,72 @@ struct PSFHeader { u32_le data_table_offset; u32_le index_table_entries; }; +static_assert(sizeof(PSFHeader) == 0x14); -struct PSFEntry { - enum Fmt : u16 { - TextRaw = 0x0400, // String in UTF-8 format and not NULL terminated - TextNormal = 0x0402, // String in UTF-8 format and NULL terminated - Integer = 0x0404, // Unsigned 32-bit integer - }; - +struct PSFRawEntry { u16_le key_offset; u16_be param_fmt; u32_le param_len; u32_le param_max_len; u32_le data_offset; }; +static_assert(sizeof(PSFRawEntry) == 0x10); + +enum class PSFEntryFmt : u16 { + Binary = 0x0004, // Binary data + Text = 0x0204, // String in UTF-8 format and NULL terminated + Integer = 0x0404, // Signed 32-bit integer +}; class PSF { + struct Entry { + std::string key; + PSFEntryFmt param_fmt; + u32 max_len; + }; + public: - PSF(); - ~PSF(); + PSF() = default; + ~PSF() = default; - bool open(const std::string& filepath, const std::vector& psfBuffer); + PSF(const PSF& other) = default; + PSF(PSF&& other) noexcept = default; + PSF& operator=(const PSF& other) = default; + PSF& operator=(PSF&& other) noexcept = default; - std::string GetString(const std::string& key); - u32 GetInteger(const std::string& key); + bool Open(const std::filesystem::path& filepath); + bool Open(const std::vector& psf_buffer); - std::unordered_map map_strings; - std::unordered_map map_integers; + [[nodiscard]] std::vector Encode() const; + void Encode(std::vector& buf) const; + bool Encode(const std::filesystem::path& filepath) const; + + std::optional> GetBinary(std::string_view key) const; + std::optional GetString(std::string_view key) const; + std::optional GetInteger(std::string_view key) const; + + void AddBinary(std::string key, std::vector value, bool update = false); + void AddString(std::string key, std::string value, bool update = false); + void AddInteger(std::string key, s32 value, bool update = false); + + [[nodiscard]] std::filesystem::file_time_type GetLastWrite() const { + return last_write; + } + + [[nodiscard]] const std::vector& GetEntries() const { + return entry_list; + } private: - std::vector psf; + mutable std::filesystem::file_time_type last_write; + + std::vector entry_list; + + std::unordered_map> map_binaries; + std::unordered_map map_strings; + std::unordered_map map_integers; + + [[nodiscard]] std::pair::iterator, size_t> FindEntry(std::string_view key); + [[nodiscard]] std::pair::const_iterator, size_t> FindEntry( + std::string_view key) const; }; diff --git a/src/core/file_format/splash.cpp b/src/core/file_format/splash.cpp index f41789a85..5e06c912d 100644 --- a/src/core/file_format/splash.cpp +++ b/src/core/file_format/splash.cpp @@ -12,8 +12,8 @@ #define STBI_NO_STDIO #include "externals/stb_image.h" -bool Splash::Open(const std::string& filepath) { - ASSERT_MSG(filepath.ends_with(".png"), "Unexpected file format passed"); +bool Splash::Open(const std::filesystem::path& filepath) { + ASSERT_MSG(filepath.stem().string() != "png", "Unexpected file format passed"); Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); if (!file.IsOpen()) { diff --git a/src/core/file_format/splash.h b/src/core/file_format/splash.h index 68cc33c47..7c563f317 100644 --- a/src/core/file_format/splash.h +++ b/src/core/file_format/splash.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include "common/types.h" @@ -22,7 +23,7 @@ public: Splash() = default; ~Splash() = default; - bool Open(const std::string& filepath); + bool Open(const std::filesystem::path& filepath); [[nodiscard]] bool IsLoaded() const { return img_data.size(); } diff --git a/src/core/file_format/trp.cpp b/src/core/file_format/trp.cpp index 86865fe63..2ca88c778 100644 --- a/src/core/file_format/trp.cpp +++ b/src/core/file_format/trp.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "common/logging/log.h" #include "common/path_util.h" #include "trp.h" @@ -11,9 +12,13 @@ void TRP::GetNPcommID(const std::filesystem::path& trophyPath, int index) { std::filesystem::path trpPath = trophyPath / "sce_sys/npbind.dat"; Common::FS::IOFile npbindFile(trpPath, Common::FS::FileAccessMode::Read); if (!npbindFile.IsOpen()) { + LOG_CRITICAL(Common_Filesystem, "Failed to open npbind.dat file"); + return; + } + if (!npbindFile.Seek(0x84 + (index * 0x180))) { + LOG_CRITICAL(Common_Filesystem, "Failed to seek to NPbind offset"); return; } - npbindFile.Seek(0x84 + (index * 0x180)); npbindFile.ReadRaw(np_comm_id.data(), 12); std::fill(np_comm_id.begin() + 12, np_comm_id.end(), 0); // fill with 0, we need 16 bytes. } @@ -28,10 +33,10 @@ static void removePadding(std::vector& vec) { } } -bool TRP::Extract(const std::filesystem::path& trophyPath) { - std::string title = trophyPath.filename().string(); +bool TRP::Extract(const std::filesystem::path& trophyPath, const std::string titleId) { std::filesystem::path gameSysDir = trophyPath / "sce_sys/trophy/"; if (!std::filesystem::exists(gameSysDir)) { + LOG_CRITICAL(Common_Filesystem, "Game sce_sys directory doesn't exist"); return false; } for (int index = 0; const auto& it : std::filesystem::directory_iterator(gameSysDir)) { @@ -40,42 +45,57 @@ bool TRP::Extract(const std::filesystem::path& trophyPath) { Common::FS::IOFile file(it.path(), Common::FS::FileAccessMode::Read); if (!file.IsOpen()) { + LOG_CRITICAL(Common_Filesystem, "Unable to open trophy file for read"); return false; } TrpHeader header; file.Read(header); - if (header.magic != 0xDCA24D00) + if (header.magic != 0xDCA24D00) { + LOG_CRITICAL(Common_Filesystem, "Wrong trophy magic number"); return false; + } s64 seekPos = sizeof(TrpHeader); std::filesystem::path trpFilesPath( - Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / title / "TrophyFiles" / - it.path().stem()); + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / titleId / + "TrophyFiles" / it.path().stem()); std::filesystem::create_directories(trpFilesPath / "Icons"); std::filesystem::create_directory(trpFilesPath / "Xml"); for (int i = 0; i < header.entry_num; i++) { - file.Seek(seekPos); + if (!file.Seek(seekPos)) { + LOG_CRITICAL(Common_Filesystem, "Failed to seek to TRP entry offset"); + return false; + } seekPos += (s64)header.entry_size; TrpEntry entry; file.Read(entry); std::string_view name(entry.entry_name); if (entry.flag == 0 && name.find("TROP") != std::string::npos) { // PNG - file.Seek(entry.entry_pos); + if (!file.Seek(entry.entry_pos)) { + LOG_CRITICAL(Common_Filesystem, "Failed to seek to TRP entry offset"); + return false; + } std::vector icon(entry.entry_len); file.Read(icon); Common::FS::IOFile::WriteBytes(trpFilesPath / "Icons" / name, icon); } if (entry.flag == 3 && np_comm_id[0] == 'N' && np_comm_id[1] == 'P') { // ESFM, encrypted. - file.Seek(entry.entry_pos); + if (!file.Seek(entry.entry_pos)) { + LOG_CRITICAL(Common_Filesystem, "Failed to seek to TRP entry offset"); + return false; + } file.Read(esfmIv); // get iv key. // Skip the first 16 bytes which are the iv key on every entry as we want a // clean xml file. std::vector ESFM(entry.entry_len - iv_len); std::vector XML(entry.entry_len - iv_len); - file.Seek(entry.entry_pos + iv_len); + if (!file.Seek(entry.entry_pos + iv_len)) { + LOG_CRITICAL(Common_Filesystem, "Failed to seek to TRP entry + iv offset"); + return false; + } file.Read(ESFM); crypto.decryptEFSM(np_comm_id, esfmIv, ESFM, XML); // decrypt removePadding(XML); @@ -83,7 +103,14 @@ bool TRP::Extract(const std::filesystem::path& trophyPath) { size_t pos = xml_name.find("ESFM"); if (pos != std::string::npos) xml_name.replace(pos, xml_name.length(), "XML"); - Common::FS::IOFile::WriteBytes(trpFilesPath / "Xml" / xml_name, XML); + std::filesystem::path path = trpFilesPath / "Xml" / xml_name; + size_t written = Common::FS::IOFile::WriteBytes(path, XML); + if (written != XML.size()) { + LOG_CRITICAL( + Common_Filesystem, + "Trophy XML {} write failed, wanted to write {} bytes, wrote {}", + fmt::UTF(path.u8string()), XML.size(), written); + } } } } diff --git a/src/core/file_format/trp.h b/src/core/file_format/trp.h index 56f490026..aec129f0e 100644 --- a/src/core/file_format/trp.h +++ b/src/core/file_format/trp.h @@ -33,7 +33,7 @@ class TRP { public: TRP(); ~TRP(); - bool Extract(const std::filesystem::path& trophyPath); + bool Extract(const std::filesystem::path& trophyPath, const std::string titleId); void GetNPcommID(const std::filesystem::path& trophyPath, int index); private: diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp index 199e42a04..3b060dd83 100644 --- a/src/core/file_sys/fs.cpp +++ b/src/core/file_sys/fs.cpp @@ -9,12 +9,14 @@ namespace Core::FileSys { constexpr int RESERVED_HANDLES = 3; // First 3 handles are stdin,stdout,stderr -void MntPoints::Mount(const std::filesystem::path& host_folder, const std::string& guest_folder) { +void MntPoints::Mount(const std::filesystem::path& host_folder, const std::string& guest_folder, + bool read_only) { std::scoped_lock lock{m_mutex}; - m_mnt_pairs.emplace_back(host_folder, guest_folder); + m_mnt_pairs.emplace_back(host_folder, guest_folder, read_only); } void MntPoints::Unmount(const std::filesystem::path& host_folder, const std::string& guest_folder) { + std::scoped_lock lock{m_mutex}; auto it = std::remove_if(m_mnt_pairs.begin(), m_mnt_pairs.end(), [&](const MntPair& pair) { return pair.mount == guest_folder; }); m_mnt_pairs.erase(it, m_mnt_pairs.end()); @@ -25,7 +27,7 @@ void MntPoints::UnmountAll() { m_mnt_pairs.clear(); } -std::filesystem::path MntPoints::GetHostPath(std::string_view guest_directory) { +std::filesystem::path MntPoints::GetHostPath(std::string_view guest_directory, bool* is_read_only) { // Evil games like Turok2 pass double slashes e.g /app0//game.kpf std::string corrected_path(guest_directory); size_t pos = corrected_path.find("//"); @@ -39,6 +41,10 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view guest_directory) { return ""; } + if (is_read_only) { + *is_read_only = mount->read_only; + } + // Nothing to do if getting the mount itself. if (corrected_path == mount->mount) { return mount->host_path; diff --git a/src/core/file_sys/fs.h b/src/core/file_sys/fs.h index 2c55b0513..eeaeaf781 100644 --- a/src/core/file_sys/fs.h +++ b/src/core/file_sys/fs.h @@ -22,18 +22,22 @@ public: struct MntPair { std::filesystem::path host_path; std::string mount; // e.g /app0/ + bool read_only; }; explicit MntPoints() = default; ~MntPoints() = default; - void Mount(const std::filesystem::path& host_folder, const std::string& guest_folder); + void Mount(const std::filesystem::path& host_folder, const std::string& guest_folder, + bool read_only = false); void Unmount(const std::filesystem::path& host_folder, const std::string& guest_folder); void UnmountAll(); - std::filesystem::path GetHostPath(std::string_view guest_directory); + std::filesystem::path GetHostPath(std::string_view guest_directory, + bool* is_read_only = nullptr); const MntPair* GetMount(const std::string& guest_path) { + std::scoped_lock lock{m_mutex}; const auto it = std::ranges::find_if( m_mnt_pairs, [&](const auto& mount) { return guest_path.starts_with(mount.mount); }); return it == m_mnt_pairs.end() ? nullptr : &*it; diff --git a/src/core/libraries/app_content/app_content.cpp b/src/core/libraries/app_content/app_content.cpp index 125d19684..f912639eb 100644 --- a/src/core/libraries/app_content/app_content.cpp +++ b/src/core/libraries/app_content/app_content.cpp @@ -4,6 +4,8 @@ #include #include "app_content.h" +#include "common/assert.h" +#include "common/config.h" #include "common/io_file.h" #include "common/logging/log.h" #include "common/path_util.h" @@ -58,8 +60,7 @@ int PS4_SYSV_ABI sceAppContentAddcontMount(u32 service_label, OrbisAppContentMountPoint* mount_point) { LOG_INFO(Lib_AppContent, "called"); - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::AddonsDir) / title_id / - entitlement_label->data; + const auto& mount_dir = Config::getAddonInstallDir() / title_id / entitlement_label->data; auto* mnt = Common::Singleton::Instance(); for (int i = 0; i < addcont_count; i++) { @@ -90,37 +91,32 @@ int PS4_SYSV_ABI sceAppContentAddcontUnmount() { return ORBIS_OK; } -int PS4_SYSV_ABI sceAppContentAppParamGetInt(OrbisAppContentAppParamId paramId, s32* value) { - if (value == nullptr) +int PS4_SYSV_ABI sceAppContentAppParamGetInt(OrbisAppContentAppParamId paramId, s32* out_value) { + if (out_value == nullptr) return ORBIS_APP_CONTENT_ERROR_PARAMETER; auto* param_sfo = Common::Singleton::Instance(); + std::optional value; switch (paramId) { case ORBIS_APP_CONTENT_APPPARAM_ID_SKU_FLAG: - *value = ORBIS_APP_CONTENT_APPPARAM_SKU_FLAG_FULL; + value = ORBIS_APP_CONTENT_APPPARAM_SKU_FLAG_FULL; break; case ORBIS_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1: - *value = param_sfo->GetInteger("USER_DEFINED_PARAM_1"); + value = param_sfo->GetInteger("USER_DEFINED_PARAM_1"); break; case ORBIS_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_2: - *value = param_sfo->GetInteger("USER_DEFINED_PARAM_2"); + value = param_sfo->GetInteger("USER_DEFINED_PARAM_2"); break; case ORBIS_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_3: - *value = param_sfo->GetInteger("USER_DEFINED_PARAM_3"); + value = param_sfo->GetInteger("USER_DEFINED_PARAM_3"); break; case ORBIS_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4: - *value = param_sfo->GetInteger("USER_DEFINED_PARAM_4"); + value = param_sfo->GetInteger("USER_DEFINED_PARAM_4"); break; default: - LOG_ERROR(Lib_AppContent, " paramId = {}, value = {} paramId is not valid", paramId, - *value); - return ORBIS_APP_CONTENT_ERROR_PARAMETER; - } - if (*value == -1) { - LOG_ERROR(Lib_AppContent, - " paramId = {}, value = {} value is not valid can't read param.sfo?", paramId, - *value); + LOG_ERROR(Lib_AppContent, " paramId = {} paramId is not valid", paramId); return ORBIS_APP_CONTENT_ERROR_PARAMETER; } + *out_value = value.value_or(0); return ORBIS_OK; } @@ -250,8 +246,12 @@ int PS4_SYSV_ABI sceAppContentInitialize(const OrbisAppContentInitParam* initPar LOG_ERROR(Lib_AppContent, "(DUMMY) called"); auto* param_sfo = Common::Singleton::Instance(); - const auto addons_dir = Common::FS::GetUserPath(Common::FS::PathType::AddonsDir); - title_id = param_sfo->GetString("TITLE_ID"); + const auto addons_dir = Config::getAddonInstallDir(); + if (const auto value = param_sfo->GetString("TITLE_ID"); value.has_value()) { + title_id = *value; + } else { + UNREACHABLE_MSG("Failed to get TITLE_ID"); + } auto addon_path = addons_dir / title_id; if (std::filesystem::exists(addon_path)) { for (const auto& entry : std::filesystem::directory_iterator(addon_path)) { diff --git a/src/core/libraries/audio/audioout.cpp b/src/core/libraries/audio/audioout.cpp index 54db4c673..778d777c2 100644 --- a/src/core/libraries/audio/audioout.cpp +++ b/src/core/libraries/audio/audioout.cpp @@ -176,11 +176,15 @@ int PS4_SYSV_ABI sceAudioOutGetLastOutputTime() { } int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* state) { + if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + } + int type = 0; int channels_num = 0; - if (!audio->AudioOutGetStatus(handle, &type, &channels_num)) { - return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + if (const auto err = audio->AudioOutGetStatus(handle, &type, &channels_num); err != ORBIS_OK) { + return err; } state->rerouteCounter = 0; @@ -310,12 +314,7 @@ s32 PS4_SYSV_ABI sceAudioOutOpen(UserService::OrbisUserServiceUserId user_id, LOG_ERROR(Lib_AudioOut, "Invalid format attribute"); return ORBIS_AUDIO_OUT_ERROR_INVALID_FORMAT; } - int result = audio->AudioOutOpen(port_type, length, sample_rate, format); - if (result == -1) { - LOG_ERROR(Lib_AudioOut, "Audio ports are full"); - return ORBIS_AUDIO_OUT_ERROR_PORT_FULL; - } - return result; + return audio->AudioOutOpen(port_type, length, sample_rate, format); } int PS4_SYSV_ABI sceAudioOutOpenEx() { @@ -324,12 +323,19 @@ int PS4_SYSV_ABI sceAudioOutOpenEx() { } s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, const void* ptr) { + if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + } + if (ptr == nullptr) { + // Nothing to output + return ORBIS_OK; + } return audio->AudioOutOutput(handle, ptr); } int PS4_SYSV_ABI sceAudioOutOutputs(OrbisAudioOutOutputParam* param, u32 num) { for (u32 i = 0; i < num; i++) { - if (auto err = audio->AudioOutOutput(param[i].handle, param[i].ptr); err != 0) + if (const auto err = sceAudioOutOutput(param[i].handle, param[i].ptr); err != 0) return err; } return ORBIS_OK; @@ -426,10 +432,10 @@ int PS4_SYSV_ABI sceAudioOutSetUsbVolume() { } s32 PS4_SYSV_ABI sceAudioOutSetVolume(s32 handle, s32 flag, s32* vol) { - if (!audio->AudioOutSetVolume(handle, flag, vol)) { + if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } - return ORBIS_OK; + return audio->AudioOutSetVolume(handle, flag, vol); } int PS4_SYSV_ABI sceAudioOutSetVolumeDown() { diff --git a/src/core/libraries/audio/audioout.h b/src/core/libraries/audio/audioout.h index d29eea7c3..95cfc1707 100644 --- a/src/core/libraries/audio/audioout.h +++ b/src/core/libraries/audio/audioout.h @@ -11,6 +11,10 @@ namespace Libraries::AudioOut { constexpr int SCE_AUDIO_OUT_VOLUME_0DB = 32768; // max volume value +// main up to 8 ports, BGM 1 port, voice up to 4 ports, +// personal up to 4 ports, padspk up to 5 ports, aux 1 port +constexpr int SCE_AUDIO_OUT_NUM_PORTS = 22; + enum OrbisAudioOutPort { ORBIS_AUDIO_OUT_PORT_TYPE_MAIN = 0, ORBIS_AUDIO_OUT_PORT_TYPE_BGM = 1, diff --git a/src/core/libraries/avplayer/avplayer.cpp b/src/core/libraries/avplayer/avplayer.cpp index d9006edc9..96e66023a 100644 --- a/src/core/libraries/avplayer/avplayer.cpp +++ b/src/core/libraries/avplayer/avplayer.cpp @@ -166,8 +166,8 @@ s32 PS4_SYSV_ABI sceAvPlayerInitEx(const SceAvPlayerInitDataEx* p_data, bool PS4_SYSV_ABI sceAvPlayerIsActive(SceAvPlayerHandle handle) { LOG_TRACE(Lib_AvPlayer, "called"); if (handle == nullptr) { - LOG_TRACE(Lib_AvPlayer, "returning ORBIS_AVPLAYER_ERROR_INVALID_PARAMS"); - return ORBIS_AVPLAYER_ERROR_INVALID_PARAMS; + LOG_TRACE(Lib_AvPlayer, "returning false"); + return false; } const auto res = handle->IsActive(); LOG_TRACE(Lib_AvPlayer, "returning {}", res); diff --git a/src/core/libraries/avplayer/avplayer.h b/src/core/libraries/avplayer/avplayer.h index 360f06b65..98e932070 100644 --- a/src/core/libraries/avplayer/avplayer.h +++ b/src/core/libraries/avplayer/avplayer.h @@ -161,7 +161,20 @@ struct SceAvPlayerFileReplacement { SceAvPlayerSizeFile size; }; -typedef void PS4_SYSV_ABI (*SceAvPlayerEventCallback)(void* p, s32 event, s32 src_id, void* data); +enum SceAvPlayerEvents { + SCE_AVPLAYER_STATE_STOP = 0x01, + SCE_AVPLAYER_STATE_READY = 0x02, + SCE_AVPLAYER_STATE_PLAY = 0x03, + SCE_AVPLAYER_STATE_PAUSE = 0x04, + SCE_AVPLAYER_STATE_BUFFERING = 0x05, + SCE_AVPLAYER_TIMED_TEXT_DELIVERY = 0x10, + SCE_AVPLAYER_WARNING_ID = 0x20, + SCE_AVPLAYER_ENCRYPTION = 0x30, + SCE_AVPLAYER_DRM_ERROR = 0x40 +}; + +typedef void PS4_SYSV_ABI (*SceAvPlayerEventCallback)(void* p, SceAvPlayerEvents event, s32 src_id, + void* data); struct SceAvPlayerEventReplacement { void* object_ptr; @@ -275,18 +288,6 @@ enum SceAvPlayerAvSyncMode { typedef int PS4_SYSV_ABI (*SceAvPlayerLogCallback)(void* p, const char* format, va_list args); -enum SceAvPlayerEvents { - SCE_AVPLAYER_STATE_STOP = 0x01, - SCE_AVPLAYER_STATE_READY = 0x02, - SCE_AVPLAYER_STATE_PLAY = 0x03, - SCE_AVPLAYER_STATE_PAUSE = 0x04, - SCE_AVPLAYER_STATE_BUFFERING = 0x05, - SCE_AVPLAYER_TIMED_TEXT_DELIVERY = 0x10, - SCE_AVPLAYER_WARNING_ID = 0x20, - SCE_AVPLAYER_ENCRYPTION = 0x30, - SCE_AVPLAYER_DRM_ERROR = 0x40 -}; - void RegisterlibSceAvPlayer(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::AvPlayer diff --git a/src/core/libraries/avplayer/avplayer_impl.h b/src/core/libraries/avplayer/avplayer_impl.h index 09989d399..b6ad940c9 100644 --- a/src/core/libraries/avplayer/avplayer_impl.h +++ b/src/core/libraries/avplayer/avplayer_impl.h @@ -40,8 +40,6 @@ public: bool SetLooping(bool is_looping); private: - using ScePthreadMutex = Kernel::ScePthreadMutex; - // Memory Replacement static void* PS4_SYSV_ABI Allocate(void* handle, u32 alignment, u32 size); static void PS4_SYSV_ABI Deallocate(void* handle, void* memory); diff --git a/src/core/libraries/avplayer/avplayer_source.cpp b/src/core/libraries/avplayer/avplayer_source.cpp index 603d55014..fcae180e7 100644 --- a/src/core/libraries/avplayer/avplayer_source.cpp +++ b/src/core/libraries/avplayer/avplayer_source.cpp @@ -7,6 +7,8 @@ #include "common/alignment.h" #include "common/singleton.h" +#include "common/thread.h" + #include "core/file_sys/fs.h" #include "core/libraries/kernel/time_management.h" @@ -432,6 +434,8 @@ void AvPlayerSource::ReleaseAVFormatContext(AVFormatContext* context) { void AvPlayerSource::DemuxerThread(std::stop_token stop) { using namespace std::chrono; + Common::SetCurrentThreadName("shadPS4:AvDemuxer"); + if (!m_audio_stream_index.has_value() && !m_video_stream_index.has_value()) { LOG_WARNING(Lib_AvPlayer, "Could not start DEMUXER thread. No streams enabled."); return; @@ -439,7 +443,8 @@ void AvPlayerSource::DemuxerThread(std::stop_token stop) { LOG_INFO(Lib_AvPlayer, "Demuxer Thread started"); while (!stop.stop_requested()) { - if (m_video_packets.Size() > 30 && m_audio_packets.Size() > 8) { + if (m_video_packets.Size() > 30 && + (!m_audio_stream_index.has_value() || m_audio_packets.Size() > 8)) { std::this_thread::sleep_for(milliseconds(5)); continue; } @@ -498,7 +503,7 @@ void AvPlayerSource::DemuxerThread(std::stop_token stop) { } m_state.OnEOF(); - LOG_INFO(Lib_AvPlayer, "Demuxer Thread exited normaly"); + LOG_INFO(Lib_AvPlayer, "Demuxer Thread exited normally"); } AvPlayerSource::AVFramePtr AvPlayerSource::ConvertVideoFrame(const AVFrame& frame) { @@ -597,6 +602,8 @@ Frame AvPlayerSource::PrepareVideoFrame(FrameBuffer buffer, const AVFrame& frame void AvPlayerSource::VideoDecoderThread(std::stop_token stop) { using namespace std::chrono; + Common::SetCurrentThreadName("shadPS4:AvVideoDecoder"); + LOG_INFO(Lib_AvPlayer, "Video Decoder Thread started"); while ((!m_is_eof || m_video_packets.Size() != 0) && !stop.stop_requested()) { if (!m_video_packets_cv.Wait(stop, @@ -652,7 +659,7 @@ void AvPlayerSource::VideoDecoderThread(std::stop_token stop) { } } - LOG_INFO(Lib_AvPlayer, "Video Decoder Thread exited normaly"); + LOG_INFO(Lib_AvPlayer, "Video Decoder Thread exited normally"); } AvPlayerSource::AVFramePtr AvPlayerSource::ConvertAudioFrame(const AVFrame& frame) { @@ -717,6 +724,8 @@ Frame AvPlayerSource::PrepareAudioFrame(FrameBuffer buffer, const AVFrame& frame void AvPlayerSource::AudioDecoderThread(std::stop_token stop) { using namespace std::chrono; + Common::SetCurrentThreadName("shadPS4:AvAudioDecoder"); + LOG_INFO(Lib_AvPlayer, "Audio Decoder Thread started"); while ((!m_is_eof || m_audio_packets.Size() != 0) && !stop.stop_requested()) { if (!m_audio_packets_cv.Wait(stop, @@ -772,7 +781,7 @@ void AvPlayerSource::AudioDecoderThread(std::stop_token stop) { } } - LOG_INFO(Lib_AvPlayer, "Audio Decoder Thread exited normaly"); + LOG_INFO(Lib_AvPlayer, "Audio Decoder Thread exited normally"); } bool AvPlayerSource::HasRunningThreads() const { diff --git a/src/core/libraries/avplayer/avplayer_state.cpp b/src/core/libraries/avplayer/avplayer_state.cpp index a512063f2..b0e498479 100644 --- a/src/core/libraries/avplayer/avplayer_state.cpp +++ b/src/core/libraries/avplayer/avplayer_state.cpp @@ -5,8 +5,11 @@ #include "avplayer_source.h" #include "avplayer_state.h" +#include "common/singleton.h" +#include "common/thread.h" #include "core/libraries/error_codes.h" #include "core/libraries/kernel/time_management.h" +#include "core/linker.h" #include @@ -14,8 +17,8 @@ namespace Libraries::AvPlayer { using namespace Kernel; -void PS4_SYSV_ABI AvPlayerState::AutoPlayEventCallback(void* opaque, s32 event_id, s32 source_id, - void* event_data) { +void PS4_SYSV_ABI AvPlayerState::AutoPlayEventCallback(void* opaque, SceAvPlayerEvents event_id, + s32 source_id, void* event_data) { auto const self = reinterpret_cast(opaque); if (event_id == SCE_AVPLAYER_STATE_READY) { @@ -88,7 +91,8 @@ void PS4_SYSV_ABI AvPlayerState::AutoPlayEventCallback(void* opaque, s32 event_i const auto callback = self->m_event_replacement.event_callback; const auto ptr = self->m_event_replacement.object_ptr; if (callback != nullptr) { - callback(ptr, event_id, 0, event_data); + const auto* linker = Common::Singleton::Instance(); + linker->ExecuteGuest(callback, ptr, event_id, 0, event_data); } } @@ -178,6 +182,7 @@ bool AvPlayerState::Start() { void AvPlayerState::AvControllerThread(std::stop_token stop) { using std::chrono::milliseconds; + Common::SetCurrentThreadName("shadPS4:AvController"); while (!stop.stop_requested()) { if (m_event_queue.Size() != 0) { @@ -362,7 +367,8 @@ void AvPlayerState::EmitEvent(SceAvPlayerEvents event_id, void* event_data) { const auto callback = m_init_data.event_replacement.event_callback; if (callback) { const auto ptr = m_init_data.event_replacement.object_ptr; - callback(ptr, event_id, 0, event_data); + const auto* linker = Common::Singleton::Instance(); + linker->ExecuteGuest(callback, ptr, event_id, 0, event_data); } } diff --git a/src/core/libraries/avplayer/avplayer_state.h b/src/core/libraries/avplayer/avplayer_state.h index a5a3bd689..f50d1bc1f 100644 --- a/src/core/libraries/avplayer/avplayer_state.h +++ b/src/core/libraries/avplayer/avplayer_state.h @@ -38,12 +38,9 @@ public: bool SetLooping(bool is_looping); private: - using ScePthreadMutex = Kernel::ScePthreadMutex; - using ScePthread = Kernel::ScePthread; - // Event Replacement - static void PS4_SYSV_ABI AutoPlayEventCallback(void* handle, s32 event_id, s32 source_id, - void* event_data); + static void PS4_SYSV_ABI AutoPlayEventCallback(void* handle, SceAvPlayerEvents event_id, + s32 source_id, void* event_data); void OnWarning(u32 id) override; void OnError() override; diff --git a/src/core/libraries/dialogs/error_dialog.cpp b/src/core/libraries/dialogs/error_dialog.cpp index 7df9b1c83..b122e2d0a 100644 --- a/src/core/libraries/dialogs/error_dialog.cpp +++ b/src/core/libraries/dialogs/error_dialog.cpp @@ -1,40 +1,166 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include + +#include "common/assert.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" -#include "error_codes.h" +#include "core/libraries/system/commondialog.h" #include "error_dialog.h" +#include "imgui/imgui_layer.h" +#include "imgui/imgui_std.h" + +static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; namespace Libraries::ErrorDialog { -static OrbisErrorDialogStatus g_error_dlg_status = - OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_NONE; +using CommonDialog::Error; +using CommonDialog::Result; +using CommonDialog::Status; -int PS4_SYSV_ABI sceErrorDialogClose() { - g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_FINISHED; - return ORBIS_OK; -} +class ErrorDialogUi final : public ImGui::Layer { + bool first_render{false}; -OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogGetStatus() { - return g_error_dlg_status; -} + Status* status{nullptr}; + std::string err_message{}; -int PS4_SYSV_ABI sceErrorDialogInitialize(OrbisErrorDialogParam* param) { - if (g_error_dlg_status == OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_INITIALIZED) { - LOG_ERROR(Lib_ErrorDialog, "Error dialog is already at init mode"); - return ORBIS_ERROR_DIALOG_ERROR_ALREADY_INITIALIZED; +public: + explicit ErrorDialogUi(Status* status = nullptr, std::string err_message = "") + : status(status), err_message(std::move(err_message)) { + if (status && *status == Status::RUNNING) { + first_render = true; + AddLayer(this); + } } - g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_INITIALIZED; - return ORBIS_OK; + ~ErrorDialogUi() override { + Finish(); + } + ErrorDialogUi(const ErrorDialogUi& other) = delete; + ErrorDialogUi(ErrorDialogUi&& other) noexcept + : Layer(other), status(other.status), err_message(std::move(other.err_message)) { + other.status = nullptr; + } + ErrorDialogUi& operator=(ErrorDialogUi other) { + using std::swap; + swap(status, other.status); + swap(err_message, other.err_message); + if (status && *status == Status::RUNNING) { + first_render = true; + AddLayer(this); + } + return *this; + } + + void Finish() { + if (status) { + *status = Status::FINISHED; + } + status = nullptr; + RemoveLayer(this); + } + + void Draw() override { + using namespace ImGui; + if (status == nullptr || *status != Status::RUNNING) { + return; + } + const auto& io = GetIO(); + + const ImVec2 window_size{ + std::min(io.DisplaySize.x, 500.0f), + std::min(io.DisplaySize.y, 300.0f), + }; + + CentralizeWindow(); + SetNextWindowSize(window_size); + SetNextWindowCollapsed(false); + if (first_render || !io.NavActive) { + SetNextWindowFocus(); + } + KeepNavHighlight(); + if (Begin("Error Dialog##ErrorDialog", nullptr, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings)) { + const auto ws = GetWindowSize(); + + DrawPrettyBackground(); + const char* begin = &err_message.front(); + const char* end = &err_message.back() + 1; + SetWindowFontScale(1.3f); + DrawCenteredText(begin, end, + GetContentRegionAvail() - ImVec2{0.0f, 15.0f + BUTTON_SIZE.y}); + SetWindowFontScale(1.0f); + + SetCursorPos({ + ws.x / 2.0f - BUTTON_SIZE.x / 2.0f, + ws.y - 10.0f - BUTTON_SIZE.y, + }); + if (Button("OK", BUTTON_SIZE)) { + Finish(); + } + if (first_render) { + SetItemCurrentNavFocus(); + } + } + End(); + + first_render = false; + } +}; + +static auto g_status = Status::NONE; +static ErrorDialogUi g_dialog_ui; + +struct Param { + s32 size; + s32 errorCode; + OrbisUserServiceUserId userId; + s32 _reserved; +}; + +Error PS4_SYSV_ABI sceErrorDialogClose() { + LOG_DEBUG(Lib_ErrorDialog, "called"); + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + g_dialog_ui.Finish(); + return Error::OK; } -int PS4_SYSV_ABI sceErrorDialogOpen(OrbisErrorDialogParam* param) { - LOG_ERROR(Lib_ErrorDialog, "size = {} errorcode = {:#x} userid = {}", param->size, - param->errorCode, param->userId); - g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_RUNNING; - return ORBIS_OK; +Status PS4_SYSV_ABI sceErrorDialogGetStatus() { + LOG_TRACE(Lib_ErrorDialog, "called status={}", magic_enum::enum_name(g_status)); + return g_status; +} + +Error PS4_SYSV_ABI sceErrorDialogInitialize() { + LOG_DEBUG(Lib_ErrorDialog, "called"); + if (g_status != Status::NONE) { + return Error::ALREADY_INITIALIZED; + } + g_status = Status::INITIALIZED; + return Error::OK; +} + +Error PS4_SYSV_ABI sceErrorDialogOpen(const Param* param) { + if (g_status != Status::INITIALIZED && g_status != Status::FINISHED) { + LOG_INFO(Lib_ErrorDialog, "called without initialize"); + return Error::INVALID_STATE; + } + if (param == nullptr) { + LOG_DEBUG(Lib_ErrorDialog, "called param:(NULL)"); + return Error::ARG_NULL; + } + const auto err = static_cast(param->errorCode); + LOG_DEBUG(Lib_ErrorDialog, "called param->errorCode = {:#x}", err); + ASSERT(param->size == sizeof(Param)); + + const std::string err_message = fmt::format("An error has occurred. \nCode: {:#X}", err); + g_status = Status::RUNNING; + g_dialog_ui = ErrorDialogUi{&g_status, err_message}; + return Error::OK; } int PS4_SYSV_ABI sceErrorDialogOpenDetail() { @@ -47,20 +173,21 @@ int PS4_SYSV_ABI sceErrorDialogOpenWithReport() { return ORBIS_OK; } -int PS4_SYSV_ABI sceErrorDialogTerminate() { - if (g_error_dlg_status == OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_NONE) { - LOG_ERROR(Lib_ErrorDialog, "Error dialog hasn't initialized"); - return ORBIS_ERROR_DIALOG_ERROR_NOT_INITIALIZED; +Error PS4_SYSV_ABI sceErrorDialogTerminate() { + LOG_DEBUG(Lib_ErrorDialog, "called"); + if (g_status == Status::RUNNING) { + sceErrorDialogClose(); } - g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_NONE; - return ORBIS_OK; + if (g_status == Status::NONE) { + return Error::NOT_INITIALIZED; + } + g_status = Status::NONE; + return Error::OK; } -OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogUpdateStatus() { - // TODO when imgui dialog is done this will loop until ORBIS_ERROR_DIALOG_STATUS_FINISHED - // This should be done calling sceErrorDialogClose but since we don't have a dialog we finish it - // here - return OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_FINISHED; +Status PS4_SYSV_ABI sceErrorDialogUpdateStatus() { + LOG_TRACE(Lib_ErrorDialog, "called status={}", magic_enum::enum_name(g_status)); + return g_status; } void RegisterlibSceErrorDialog(Core::Loader::SymbolsResolver* sym) { diff --git a/src/core/libraries/dialogs/error_dialog.h b/src/core/libraries/dialogs/error_dialog.h index e491b2eee..3e6651d4a 100644 --- a/src/core/libraries/dialogs/error_dialog.h +++ b/src/core/libraries/dialogs/error_dialog.h @@ -4,34 +4,25 @@ #pragma once #include "common/types.h" +#include "core/libraries/system/commondialog.h" namespace Core::Loader { class SymbolsResolver; } namespace Libraries::ErrorDialog { -enum OrbisErrorDialogStatus { - ORBIS_ERROR_DIALOG_STATUS_NONE = 0, - ORBIS_ERROR_DIALOG_STATUS_INITIALIZED = 1, - ORBIS_ERROR_DIALOG_STATUS_RUNNING = 2, - ORBIS_ERROR_DIALOG_STATUS_FINISHED = 3 -}; +using OrbisUserServiceUserId = s32; -struct OrbisErrorDialogParam { - s32 size; - u32 errorCode; - s32 userId; - s32 reserved; -}; +struct Param; -int PS4_SYSV_ABI sceErrorDialogClose(); -OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogGetStatus(); -int PS4_SYSV_ABI sceErrorDialogInitialize(OrbisErrorDialogParam* param); -int PS4_SYSV_ABI sceErrorDialogOpen(OrbisErrorDialogParam* param); +CommonDialog::Error PS4_SYSV_ABI sceErrorDialogClose(); +CommonDialog::Status PS4_SYSV_ABI sceErrorDialogGetStatus(); +CommonDialog::Error PS4_SYSV_ABI sceErrorDialogInitialize(); +CommonDialog::Error PS4_SYSV_ABI sceErrorDialogOpen(const Param* param); int PS4_SYSV_ABI sceErrorDialogOpenDetail(); int PS4_SYSV_ABI sceErrorDialogOpenWithReport(); -int PS4_SYSV_ABI sceErrorDialogTerminate(); -OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogUpdateStatus(); +CommonDialog::Error PS4_SYSV_ABI sceErrorDialogTerminate(); +CommonDialog::Status PS4_SYSV_ABI sceErrorDialogUpdateStatus(); void RegisterlibSceErrorDialog(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::ErrorDialog \ No newline at end of file diff --git a/src/core/libraries/error_codes.h b/src/core/libraries/error_codes.h index 094ea6603..b9896b6c3 100644 --- a/src/core/libraries/error_codes.h +++ b/src/core/libraries/error_codes.h @@ -440,11 +440,47 @@ constexpr int ORBIS_USER_SERVICE_ERROR_BUFFER_TOO_SHORT = 0x8096000A; constexpr int ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER = 0x80A10003; // NpTrophy library +constexpr int ORBIS_NP_TROPHY_ERROR_UNKNOWN = 0x80551600; +constexpr int ORBIS_NP_TROPHY_ERROR_NOT_INITIALIZED = 0x80551601; +constexpr int ORBIS_NP_TROPHY_ERROR_ALREADY_INITIALIZED = 0x80551602; +constexpr int ORBIS_NP_TROPHY_ERROR_OUT_OF_MEMORY = 0x80551603; constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80551604; +constexpr int ORBIS_NP_TROPHY_ERROR_INSUFFICIENT_BUFFER = 0x80551605; +constexpr int ORBIS_NP_TROPHY_ERROR_EXCEEDS_MAX = 0x80551606; +constexpr int ORBIS_NP_TROPHY_ERROR_ABORT = 0x80551607; constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80551608; -constexpr int ORBIS_NP_TROPHY_ERROR_HANDLE_EXCEEDS_MAX = 0x80551624; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT = 0x80551609; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_ID = 0x8055160A; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_GROUP_ID = 0x8055160B; +constexpr int ORBIS_NP_TROPHY_ERROR_TROPHY_ALREADY_UNLOCKED = 0x8055160C; +constexpr int ORBIS_NP_TROPHY_ERROR_PLATINUM_CANNOT_UNLOCK = 0x8055160D; +constexpr int ORBIS_NP_TROPHY_ERROR_ACCOUNTID_NOT_MATCH = 0x8055160E; +constexpr int ORBIS_NP_TROPHY_ERROR_NOT_REGISTERED = 0x8055160F; +constexpr int ORBIS_NP_TROPHY_ERROR_ALREADY_REGISTERED = 0x80551610; +constexpr int ORBIS_NP_TROPHY_ERROR_BROKEN_DATA = 0x80551611; +constexpr int ORBIS_NP_TROPHY_ERROR_INSUFFICIENT_SPACE = 0x80551612; constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_ALREADY_EXISTS = 0x80551613; -constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_EXCEEDS_MAX = 0x80551622; +constexpr int ORBIS_NP_TROPHY_ERROR_ICON_FILE_NOT_FOUND = 0x80551614; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_TRP_FILE_FORMAT = 0x80551616; +constexpr int ORBIS_NP_TROPHY_ERROR_UNSUPPORTED_TRP_FILE = 0x80551617; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_CONF_FORMAT = 0x80551618; +constexpr int ORBIS_NP_TROPHY_ERROR_UNSUPPORTED_TROPHY_CONF = 0x80551619; +constexpr int ORBIS_NP_TROPHY_ERROR_TROPHY_NOT_UNLOCKED = 0x8055161A; +constexpr int ORBIS_NP_TROPHY_ERROR_USER_NOT_FOUND = 0x8055161C; +constexpr int ORBIS_NP_TROPHY_ERROR_USER_NOT_LOGGED_IN = 0x8055161D; +constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_USER_LOGOUT = 0x8055161E; +constexpr int ORBIS_NP_TROPHY_ERROR_USE_TRP_FOR_DEVELOPMENT = 0x8055161F; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_NP_SERVICE_LABEL = 0x80551621; +constexpr int ORBIS_NP_TROPHY_ERROR_NOT_SUPPORTED = 0x80551622; +constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_EXCEEDS_MAX = 0x80551623; +constexpr int ORBIS_NP_TROPHY_ERROR_HANDLE_EXCEEDS_MAX = 0x80551624; +constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_USER_ID = 0x80551625; +constexpr int ORBIS_NP_TROPHY_ERROR_TITLE_CONF_NOT_INSTALLED = 0x80551626; +constexpr int ORBIS_NP_TROPHY_ERROR_BROKEN_TITLE_CONF = 0x80551627; +constexpr int ORBIS_NP_TROPHY_ERROR_INCONSISTENT_TITLE_CONF = 0x80551628; +constexpr int ORBIS_NP_TROPHY_ERROR_TITLE_BACKGROUND = 0x80551629; +constexpr int ORBIS_NP_TROPHY_ERROR_SCREENSHOT_DISABLED = 0x8055162B; +constexpr int ORBIS_NP_TROPHY_ERROR_SCREENSHOT_DISPLAY_BUFFER_NOT_IN_USE = 0x8055162D; // AvPlayer library constexpr int ORBIS_AVPLAYER_ERROR_INVALID_PARAMS = 0x806A0001; diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index 2a4ea31a3..c7dbfec2e 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -11,6 +11,7 @@ #include "common/path_util.h" #include "common/slot_vector.h" #include "core/address_space.h" +#include "core/debug_state.h" #include "core/libraries/error_codes.h" #include "core/libraries/kernel/libkernel.h" #include "core/libraries/libs.h" @@ -320,20 +321,6 @@ static void WaitGpuIdle() { cv_lock.wait(lock, [] { return submission_lock == 0; }); } -static void DumpCommandList(std::span cmd_list, const std::string& postfix) { - using namespace Common::FS; - const auto dump_dir = GetUserPath(PathType::PM4Dir); - if (!std::filesystem::exists(dump_dir)) { - std::filesystem::create_directories(dump_dir); - } - if (cmd_list.empty()) { - return; - } - const auto filename = fmt::format("{:08}_{}", frames_submitted, postfix); - const auto file = IOFile{dump_dir / filename, FileAccessMode::Write}; - file.WriteSpan(cmd_list); -} - // Write a special ending NOP packet with N DWs data block template static inline u32* WriteTrailingNop(u32* cmdbuf) { @@ -507,16 +494,18 @@ void PS4_SYSV_ABI sceGnmDingDong(u32 gnm_vqid, u32 next_offs_dw) { WaitGpuIdle(); - /* Suspend logic goes here */ + if (DebugState.ShouldPauseInSubmit()) { + DebugState.PauseGuestThreads(); + } auto vqid = gnm_vqid - 1; auto& asc_queue = asc_queues[{vqid}]; const auto* acb_ptr = reinterpret_cast(asc_queue.map_addr + *asc_queue.read_addr); const auto acb_size = next_offs_dw ? (next_offs_dw << 2u) - *asc_queue.read_addr : (asc_queue.ring_size_dw << 2u) - *asc_queue.read_addr; - const std::span acb_span{acb_ptr, acb_size >> 2u}; + const std::span acb_span{acb_ptr, acb_size >> 2u}; - if (Config::dumpPM4()) { + if (DebugState.DumpingCurrentFrame()) { static auto last_frame_num = -1LL; static u32 seq_num{}; if (last_frame_num == frames_submitted) { @@ -536,8 +525,14 @@ void PS4_SYSV_ABI sceGnmDingDong(u32 gnm_vqid, u32 next_offs_dw) { acb = {indirect_buffer->Address(), indirect_buffer->ib_size}; } - // File name format is: __ - DumpCommandList(acb, fmt::format("acb_{}_{}", gnm_vqid, seq_num)); + using namespace DebugStateType; + + DebugState.PushQueueDump({ + .type = QueueType::acb, + .submit_num = seq_num, + .num2 = gnm_vqid, + .data = {acb.begin(), acb.end()}, + }); } liverpool->SubmitAsc(vqid, acb_span); @@ -1272,8 +1267,12 @@ int PS4_SYSV_ABI sceGnmRequestMipStatsReportAndReset() { return ORBIS_OK; } -int PS4_SYSV_ABI sceGnmResetVgtControl() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceGnmResetVgtControl(u32* cmdbuf, u32 size) { + LOG_TRACE(Lib_GnmDriver, "called"); + if (cmdbuf == nullptr || size != 3) { + return -1; + } + PM4CmdSetData::SetContextReg(cmdbuf, 0x2aau, 0xffu); // IA_MULTI_VGT_PARAM return ORBIS_OK; } @@ -2104,7 +2103,9 @@ s32 PS4_SYSV_ABI sceGnmSubmitCommandBuffers(u32 count, const u32* dcb_gpu_addrs[ WaitGpuIdle(); - /* Suspend logic goes here */ + if (DebugState.ShouldPauseInSubmit()) { + DebugState.PauseGuestThreads(); + } if (send_init_packet) { if (sdk_version <= 0x1ffffffu) { @@ -2124,10 +2125,10 @@ s32 PS4_SYSV_ABI sceGnmSubmitCommandBuffers(u32 count, const u32* dcb_gpu_addrs[ const auto dcb_size_dw = dcb_sizes_in_bytes[cbpair] >> 2; const auto ccb_size_dw = ccb_size_in_bytes >> 2; - const auto& dcb_span = std::span{dcb_gpu_addrs[cbpair], dcb_size_dw}; - const auto& ccb_span = std::span{ccb, ccb_size_dw}; + const auto& dcb_span = std::span{dcb_gpu_addrs[cbpair], dcb_size_dw}; + const auto& ccb_span = std::span{ccb, ccb_size_dw}; - if (Config::dumpPM4()) { + if (DebugState.DumpingCurrentFrame()) { static auto last_frame_num = -1LL; static u32 seq_num{}; if (last_frame_num == frames_submitted && cbpair == 0) { @@ -2137,9 +2138,20 @@ s32 PS4_SYSV_ABI sceGnmSubmitCommandBuffers(u32 count, const u32* dcb_gpu_addrs[ seq_num = 0u; } - // File name format is: __ - DumpCommandList(dcb_span, fmt::format("dcb_{}_{}", seq_num, cbpair)); - DumpCommandList(ccb_span, fmt::format("ccb_{}_{}", seq_num, cbpair)); + using DebugStateType::QueueType; + + DebugState.PushQueueDump({ + .type = QueueType::dcb, + .submit_num = seq_num, + .num2 = cbpair, + .data = {dcb_span.begin(), dcb_span.end()}, + }); + DebugState.PushQueueDump({ + .type = QueueType::ccb, + .submit_num = seq_num, + .num2 = cbpair, + .data = {ccb_span.begin(), ccb_span.end()}, + }); } liverpool->SubmitGfx(dcb_span, ccb_span); @@ -2162,6 +2174,7 @@ int PS4_SYSV_ABI sceGnmSubmitDone() { liverpool->SubmitDone(); send_init_packet = true; ++frames_submitted; + DebugState.IncGnmFrameNum(); return ORBIS_OK; } @@ -2667,6 +2680,10 @@ void RegisterlibSceGnmDriver(Core::Loader::SymbolsResolver* sym) { sdk_version = 0; } + if (Config::copyGPUCmdBuffers()) { + liverpool->reserveCopyBufferSpace(); + } + Platform::IrqC::Instance()->Register(Platform::InterruptId::GpuIdle, ResetSubmissionLock, nullptr); diff --git a/src/core/libraries/gnmdriver/gnmdriver.h b/src/core/libraries/gnmdriver/gnmdriver.h index 3089b1d17..0d206d8f3 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.h +++ b/src/core/libraries/gnmdriver/gnmdriver.h @@ -134,7 +134,7 @@ s32 PS4_SYSV_ABI sceGnmRegisterResource(void* res_handle, void* owner_handle, co int PS4_SYSV_ABI sceGnmRequestFlipAndSubmitDone(); int PS4_SYSV_ABI sceGnmRequestFlipAndSubmitDoneForWorkload(); int PS4_SYSV_ABI sceGnmRequestMipStatsReportAndReset(); -int PS4_SYSV_ABI sceGnmResetVgtControl(); +s32 PS4_SYSV_ABI sceGnmResetVgtControl(u32* cmdbuf, u32 size); int PS4_SYSV_ABI sceGnmSdmaClose(); int PS4_SYSV_ABI sceGnmSdmaConstFill(); int PS4_SYSV_ABI sceGnmSdmaCopyLinear(); diff --git a/src/core/libraries/kernel/event_flag/event_flag.cpp b/src/core/libraries/kernel/event_flag/event_flag.cpp index 4d3925127..f83ae0a7f 100644 --- a/src/core/libraries/kernel/event_flag/event_flag.cpp +++ b/src/core/libraries/kernel/event_flag/event_flag.cpp @@ -137,7 +137,7 @@ int PS4_SYSV_ABI sceKernelPollEventFlag(OrbisKernelEventFlag ef, u64 bitPattern, auto result = ef->Poll(bitPattern, wait, clear, pResultPat); - if (result != ORBIS_OK) { + if (result != ORBIS_OK && result != ORBIS_KERNEL_ERROR_EBUSY) { LOG_ERROR(Kernel_Event, "returned {}", result); } @@ -184,7 +184,7 @@ int PS4_SYSV_ABI sceKernelWaitEventFlag(OrbisKernelEventFlag ef, u64 bitPattern, u32 result = ef->Wait(bitPattern, wait, clear, pResultPat, pTimeout); - if (result != ORBIS_OK) { + if (result != ORBIS_OK && result != ORBIS_KERNEL_ERROR_ETIMEDOUT) { LOG_ERROR(Kernel_Event, "returned {:#x}", result); } diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index f7f58df59..e2093ce21 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -89,6 +89,8 @@ int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { } // RW, then scekernelWrite is called and savedata is written just fine now. e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite); + } else if (write) { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); } else { UNREACHABLE(); } @@ -150,7 +152,6 @@ int PS4_SYSV_ABI posix_close(int d) { return -1; } return result; - return ORBIS_OK; } size_t PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes) { @@ -180,11 +181,16 @@ int PS4_SYSV_ABI sceKernelUnlink(const char* path) { auto* h = Common::Singleton::Instance(); auto* mnt = Common::Singleton::Instance(); - const auto host_path = mnt->GetHostPath(path); + bool ro = false; + const auto host_path = mnt->GetHostPath(path, &ro); if (host_path.empty()) { return SCE_KERNEL_ERROR_EACCES; } + if (ro) { + return SCE_KERNEL_ERROR_EROFS; + } + if (std::filesystem::is_directory(host_path)) { return SCE_KERNEL_ERROR_EPERM; } @@ -223,7 +229,10 @@ s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) { } std::scoped_lock lk{file->m_mutex}; - file->f.Seek(offset, origin); + if (!file->f.Seek(offset, origin)) { + LOG_CRITICAL(Kernel_Fs, "sceKernelLseek: failed to seek"); + return SCE_KERNEL_ERROR_EINVAL; + } return file->f.Tell(); } @@ -271,13 +280,21 @@ int PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { return SCE_KERNEL_ERROR_EINVAL; } auto* mnt = Common::Singleton::Instance(); - const auto dir_name = mnt->GetHostPath(path); + + bool ro = false; + const auto dir_name = mnt->GetHostPath(path, &ro); + if (std::filesystem::exists(dir_name)) { return SCE_KERNEL_ERROR_EEXIST; } + if (ro) { + return SCE_KERNEL_ERROR_EROFS; + } + // CUSA02456: path = /aotl after sceSaveDataMount(mode = 1) - if (dir_name.empty() || !std::filesystem::create_directory(dir_name)) { + std::error_code ec; + if (dir_name.empty() || !std::filesystem::create_directory(dir_name, ec)) { return SCE_KERNEL_ERROR_EIO; } @@ -297,10 +314,63 @@ int PS4_SYSV_ABI posix_mkdir(const char* path, u16 mode) { return result; } +int PS4_SYSV_ABI sceKernelRmdir(const char* path) { + auto* mnt = Common::Singleton::Instance(); + bool ro = false; + + const std::filesystem::path dir_name = mnt->GetHostPath(path, &ro); + + if (dir_name.empty()) { + LOG_INFO(Kernel_Fs, "Failed to remove directory: {}, permission denied", + fmt::UTF(dir_name.u8string())); + return SCE_KERNEL_ERROR_EACCES; + } + + if (ro) { + LOG_INFO(Kernel_Fs, "Failed to remove directory: {}, directory is read only", + fmt::UTF(dir_name.u8string())); + return SCE_KERNEL_ERROR_EROFS; + } + + if (!std::filesystem::is_directory(dir_name)) { + LOG_INFO(Kernel_Fs, "Failed to remove directory: {}, path is not a directory", + fmt::UTF(dir_name.u8string())); + return ORBIS_KERNEL_ERROR_ENOTDIR; + } + + if (!std::filesystem::exists(dir_name)) { + LOG_INFO(Kernel_Fs, "Failed to remove directory: {}, no such file or directory", + fmt::UTF(dir_name.u8string())); + return ORBIS_KERNEL_ERROR_ENOENT; + } + + std::error_code ec; + int result = std::filesystem::remove_all(dir_name, ec); + + if (!ec) { + LOG_DEBUG(Kernel_Fs, "Removed directory: {}", fmt::UTF(dir_name.u8string())); + return ORBIS_OK; + } + LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, error_code={}", + fmt::UTF(dir_name.u8string()), ec.message()); + return ErrnoToSceKernelError(ec.value()); +} + +int PS4_SYSV_ABI posix_rmdir(const char* path) { + int result = sceKernelRmdir(path); + if (result < 0) { + LOG_ERROR(Kernel_Pthread, "posix_rmdir: error = {}", result); + ErrSceToPosix(result); + return -1; + } + return result; +} + int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { LOG_INFO(Kernel_Fs, "(PARTIAL) path = {}", path); auto* mnt = Common::Singleton::Instance(); - const auto path_name = mnt->GetHostPath(path); + bool ro = false; + const auto path_name = mnt->GetHostPath(path, &ro); std::memset(sb, 0, sizeof(OrbisKernelStat)); const bool is_dir = std::filesystem::is_directory(path_name); const bool is_file = std::filesystem::is_regular_file(path_name); @@ -320,6 +390,10 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { sb->st_blocks = (sb->st_size + 511) / 512; // TODO incomplete } + if (ro) { + sb->st_mode &= ~0000555u; + } + return ORBIS_OK; } @@ -361,14 +435,26 @@ s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset) { SCOPE_EXIT { file->f.Seek(pos); }; - file->f.Seek(offset); + if (!file->f.Seek(offset)) { + LOG_CRITICAL(Kernel_Fs, "sceKernelPread: failed to seek"); + return ORBIS_KERNEL_ERROR_EINVAL; + } return file->f.ReadRaw(buf, nbytes); } int PS4_SYSV_ABI sceKernelFStat(int fd, OrbisKernelStat* sb) { LOG_INFO(Kernel_Fs, "(PARTIAL) fd = {}", fd); + if (fd < 3) { + return ORBIS_KERNEL_ERROR_EPERM; + } + if (sb == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); + if (file == nullptr) { + return ORBIS_KERNEL_ERROR_EBADF; + } std::memset(sb, 0, sizeof(OrbisKernelStat)); if (file->is_directory) { @@ -421,15 +507,24 @@ int PS4_SYSV_ABI sceKernelFtruncate(int fd, s64 length) { } static int GetDents(int fd, char* buf, int nbytes, s64* basep) { - // TODO error codes - ASSERT(buf != nullptr); + if (fd < 3) { + return ORBIS_KERNEL_ERROR_EBADF; + } + + if (buf == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); - + if (file == nullptr) { + return ORBIS_KERNEL_ERROR_EBADF; + } if (file->dirents_index == file->dirents.size()) { return ORBIS_OK; } - + if (!file->is_directory || nbytes < 512 || file->dirents_index > file->dirents.size()) { + return ORBIS_KERNEL_ERROR_EINVAL; + } const auto& entry = file->dirents.at(file->dirents_index++); auto str = entry.name; auto str_size = str.size() - 1; @@ -477,17 +572,27 @@ s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset) { SCOPE_EXIT { file->f.Seek(pos); }; - file->f.Seek(offset); + if (!file->f.Seek(offset)) { + LOG_CRITICAL(Kernel_Fs, "sceKernelPwrite: failed to seek"); + return ORBIS_KERNEL_ERROR_EINVAL; + } return file->f.WriteRaw(buf, nbytes); } s32 PS4_SYSV_ABI sceKernelRename(const char* from, const char* to) { auto* mnt = Common::Singleton::Instance(); - const auto src_path = mnt->GetHostPath(from); + bool ro = false; + const auto src_path = mnt->GetHostPath(from, &ro); if (!std::filesystem::exists(src_path)) { return ORBIS_KERNEL_ERROR_ENOENT; } - const auto dst_path = mnt->GetHostPath(to); + if (ro) { + return SCE_KERNEL_ERROR_EROFS; + } + const auto dst_path = mnt->GetHostPath(to, &ro); + if (ro) { + return SCE_KERNEL_ERROR_EROFS; + } const bool src_is_dir = std::filesystem::is_directory(src_path); const bool dst_is_dir = std::filesystem::is_directory(dst_path); if (src_is_dir && !dst_is_dir) { @@ -521,13 +626,19 @@ void fileSystemSymbolsRegister(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("AqBioC2vF3I", "libScePosix", 1, "libkernel", 1, 1, posix_read); LIB_FUNCTION("1-LFLmRFxxM", "libkernel", 1, "libkernel", 1, 1, sceKernelMkdir); LIB_FUNCTION("JGMio+21L4c", "libScePosix", 1, "libkernel", 1, 1, posix_mkdir); + LIB_FUNCTION("JGMio+21L4c", "libkernel", 1, "libkernel", 1, 1, posix_mkdir); + LIB_FUNCTION("naInUjYt3so", "libkernel", 1, "libkernel", 1, 1, sceKernelRmdir); + LIB_FUNCTION("c7ZnT7V1B98", "libScePosix", 1, "libkernel", 1, 1, posix_rmdir); + LIB_FUNCTION("c7ZnT7V1B98", "libkernel", 1, "libkernel", 1, 1, posix_rmdir); LIB_FUNCTION("eV9wAD2riIA", "libkernel", 1, "libkernel", 1, 1, sceKernelStat); LIB_FUNCTION("kBwCPsYX-m4", "libkernel", 1, "libkernel", 1, 1, sceKernelFStat); LIB_FUNCTION("mqQMh1zPPT8", "libScePosix", 1, "libkernel", 1, 1, posix_fstat); + LIB_FUNCTION("mqQMh1zPPT8", "libkernel", 1, "libkernel", 1, 1, posix_fstat); LIB_FUNCTION("VW3TVZiM4-E", "libkernel", 1, "libkernel", 1, 1, sceKernelFtruncate); LIB_FUNCTION("52NcYU9+lEo", "libkernel", 1, "libkernel", 1, 1, sceKernelRename); LIB_FUNCTION("E6ao34wPw+U", "libScePosix", 1, "libkernel", 1, 1, posix_stat); + LIB_FUNCTION("E6ao34wPw+U", "libkernel", 1, "libkernel", 1, 1, posix_stat); LIB_FUNCTION("+r3rMFwItV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPread); LIB_FUNCTION("uWyW3v98sU4", "libkernel", 1, "libkernel", 1, 1, sceKernelCheckReachability); LIB_FUNCTION("fTx66l5iWIA", "libkernel", 1, "libkernel", 1, 1, sceKernelFsync); diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index 3a3a63125..83d30a00c 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -8,6 +8,7 @@ #include "common/assert.h" #include "common/debug.h" +#include "common/elf_info.h" #include "common/logging/log.h" #include "common/polyfill_thread.h" #include "common/singleton.h" @@ -55,7 +56,7 @@ void KernelSignalRequest() { } static void KernelServiceThread(std::stop_token stoken) { - Common::SetCurrentThreadName("Kernel_ServiceThread"); + Common::SetCurrentThreadName("shadPS4:Kernel_ServiceThread"); while (!stoken.stop_requested()) { HLE_TRACE; @@ -185,6 +186,16 @@ void* PS4_SYSV_ABI posix_mmap(void* addr, u64 len, int prot, int flags, int fd, return ptr; } +s32 PS4_SYSV_ABI sceKernelConfiguredFlexibleMemorySize(u64* sizeOut) { + if (sizeOut == nullptr) { + return ORBIS_KERNEL_ERROR_EINVAL; + } + + auto* memory = Core::Memory::Instance(); + *sizeOut = memory->GetTotalFlexibleSize(); + return ORBIS_OK; +} + static uint64_t g_mspace_atomic_id_mask = 0; static uint64_t g_mstate_table[64] = {0}; @@ -243,8 +254,7 @@ int PS4_SYSV_ABI sceKernelConvertUtcToLocaltime(time_t time, time_t* local_time, } int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver) { - auto* param_sfo = Common::Singleton::Instance(); - int version = param_sfo->GetInteger("SYSTEM_VER"); + int version = Common::ElfInfo::Instance().RawFirmwareVer(); LOG_INFO(Kernel, "returned system version = {:#x}", version); *ver = version; return (version > 0) ? ORBIS_OK : ORBIS_KERNEL_ERROR_EINVAL; @@ -403,10 +413,12 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { // obj LIB_OBJ("f7uOxY9mM1U", "libkernel", 1, "libkernel", 1, 1, &g_stack_chk_guard); + // misc LIB_FUNCTION("JGfTMBOdUJo", "libkernel", 1, "libkernel", 1, 1, sceKernelGetFsSandboxRandomWord); LIB_FUNCTION("XVL8So3QJUk", "libkernel", 1, "libkernel", 1, 1, posix_connect); LIB_FUNCTION("6xVpy0Fdq+I", "libkernel", 1, "libkernel", 1, 1, _sigprocmask); + // memory LIB_FUNCTION("OMDRKKAZ8I4", "libkernel", 1, "libkernel", 1, 1, sceKernelDebugRaiseException); LIB_FUNCTION("rTXw65xmLIA", "libkernel", 1, "libkernel", 1, 1, sceKernelAllocateDirectMemory); @@ -425,6 +437,7 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("WFcfL2lzido", "libkernel", 1, "libkernel", 1, 1, sceKernelQueryMemoryProtection); LIB_FUNCTION("BHouLQzh0X0", "libkernel", 1, "libkernel", 1, 1, sceKernelDirectMemoryQuery); LIB_FUNCTION("MBuItvba6z8", "libkernel", 1, "libkernel", 1, 1, sceKernelReleaseDirectMemory); + LIB_FUNCTION("PGhQHd-dzv8", "libkernel", 1, "libkernel", 1, 1, sceKernelMmap); LIB_FUNCTION("cQke9UuBQOk", "libkernel", 1, "libkernel", 1, 1, sceKernelMunmap); LIB_FUNCTION("mL8NDH86iQI", "libkernel", 1, "libkernel", 1, 1, sceKernelMapNamedFlexibleMemory); LIB_FUNCTION("aNz11fnnzi4", "libkernel", 1, "libkernel", 1, 1, @@ -442,6 +455,14 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("2SKEx6bSq-4", "libkernel", 1, "libkernel", 1, 1, sceKernelBatchMap); LIB_FUNCTION("kBJzF8x4SyE", "libkernel", 1, "libkernel", 1, 1, sceKernelBatchMap2); LIB_FUNCTION("DGMG3JshrZU", "libkernel", 1, "libkernel", 1, 1, sceKernelSetVirtualRangeName); + LIB_FUNCTION("n1-v6FgU7MQ", "libkernel", 1, "libkernel", 1, 1, + sceKernelConfiguredFlexibleMemorySize); + + // Memory pool + LIB_FUNCTION("qCSfqDILlns", "libkernel", 1, "libkernel", 1, 1, sceKernelMemoryPoolExpand); + LIB_FUNCTION("pU-QydtGcGY", "libkernel", 1, "libkernel", 1, 1, sceKernelMemoryPoolReserve); + LIB_FUNCTION("Vzl66WmfLvk", "libkernel", 1, "libkernel", 1, 1, sceKernelMemoryPoolCommit); + LIB_FUNCTION("LXo1tpFqJGs", "libkernel", 1, "libkernel", 1, 1, sceKernelMemoryPoolDecommit); // equeue LIB_FUNCTION("D0OdFMjp46I", "libkernel", 1, "libkernel", 1, 1, sceKernelCreateEqueue); diff --git a/src/core/libraries/kernel/memory_management.cpp b/src/core/libraries/kernel/memory_management.cpp index af3542912..5331f47f2 100644 --- a/src/core/libraries/kernel/memory_management.cpp +++ b/src/core/libraries/kernel/memory_management.cpp @@ -228,8 +228,7 @@ int PS4_SYSV_ABI sceKernelMProtect(const void* addr, size_t size, int prot) { int PS4_SYSV_ABI sceKernelMTypeProtect(const void* addr, size_t size, int mtype, int prot) { Core::MemoryManager* memory_manager = Core::Memory::Instance(); Core::MemoryProt protection_flags = static_cast(prot); - return memory_manager->MTypeProtect(std::bit_cast(addr), size, - static_cast(mtype), protection_flags); + return memory_manager->Protect(std::bit_cast(addr), size, protection_flags); } int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInfo* query_info, @@ -348,4 +347,102 @@ s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, size_t len, cons memory->NameVirtualRange(std::bit_cast(addr), len, name); return ORBIS_OK; } + +s32 PS4_SYSV_ABI sceKernelMemoryPoolExpand(u64 searchStart, u64 searchEnd, size_t len, + size_t alignment, u64* physAddrOut) { + if (searchStart < 0 || searchEnd <= searchStart) { + LOG_ERROR(Kernel_Vmm, "Provided address range is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + const bool is_in_range = searchEnd - searchStart >= len; + if (len <= 0 || !Common::Is64KBAligned(len) || !is_in_range) { + LOG_ERROR(Kernel_Vmm, "Provided address range is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + if (alignment != 0 && !Common::Is64KBAligned(alignment)) { + LOG_ERROR(Kernel_Vmm, "Alignment value is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + if (physAddrOut == nullptr) { + LOG_ERROR(Kernel_Vmm, "Result physical address pointer is null!"); + return SCE_KERNEL_ERROR_EINVAL; + } + + auto* memory = Core::Memory::Instance(); + PAddr phys_addr = memory->PoolExpand(searchStart, searchEnd, len, alignment); + *physAddrOut = static_cast(phys_addr); + + LOG_INFO(Kernel_Vmm, + "searchStart = {:#x}, searchEnd = {:#x}, len = {:#x}, alignment = {:#x}, physAddrOut " + "= {:#x}", + searchStart, searchEnd, len, alignment, phys_addr); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelMemoryPoolReserve(void* addrIn, size_t len, size_t alignment, int flags, + void** addrOut) { + LOG_INFO(Kernel_Vmm, "addrIn = {}, len = {:#x}, alignment = {:#x}, flags = {:#x}", + fmt::ptr(addrIn), len, alignment, flags); + + if (addrIn == nullptr) { + LOG_ERROR(Kernel_Vmm, "Address is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + if (len == 0 || !Common::Is2MBAligned(len)) { + LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 2MB aligned!"); + return SCE_KERNEL_ERROR_EINVAL; + } + if (alignment != 0) { + if ((!std::has_single_bit(alignment) && !Common::Is2MBAligned(alignment))) { + LOG_ERROR(Kernel_Vmm, "Alignment value is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + } + + auto* memory = Core::Memory::Instance(); + const VAddr in_addr = reinterpret_cast(addrIn); + const auto map_flags = static_cast(flags); + memory->PoolReserve(addrOut, in_addr, len, map_flags, alignment); + + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelMemoryPoolCommit(void* addr, size_t len, int type, int prot, int flags) { + if (addr == nullptr) { + LOG_ERROR(Kernel_Vmm, "Address is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + if (len == 0 || !Common::Is64KBAligned(len)) { + LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 64KB aligned!"); + return SCE_KERNEL_ERROR_EINVAL; + } + + LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}, type = {:#x}, prot = {:#x}, flags = {:#x}", + fmt::ptr(addr), len, type, prot, flags); + + const VAddr in_addr = reinterpret_cast(addr); + const auto mem_prot = static_cast(prot); + auto* memory = Core::Memory::Instance(); + return memory->PoolCommit(in_addr, len, mem_prot); +} + +s32 PS4_SYSV_ABI sceKernelMemoryPoolDecommit(void* addr, size_t len, int flags) { + if (addr == nullptr) { + LOG_ERROR(Kernel_Vmm, "Address is invalid!"); + return SCE_KERNEL_ERROR_EINVAL; + } + if (len == 0 || !Common::Is64KBAligned(len)) { + LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 64KB aligned!"); + return SCE_KERNEL_ERROR_EINVAL; + } + + LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}, flags = {:#x}", fmt::ptr(addr), len, flags); + + const VAddr pool_addr = reinterpret_cast(addr); + auto* memory = Core::Memory::Instance(); + memory->PoolDecommit(pool_addr, len); + + return ORBIS_OK; +} + } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/memory_management.h b/src/core/libraries/kernel/memory_management.h index 205b2274f..38898aa57 100644 --- a/src/core/libraries/kernel/memory_management.h +++ b/src/core/libraries/kernel/memory_management.h @@ -114,4 +114,11 @@ s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEn s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, size_t len, const char* name); +s32 PS4_SYSV_ABI sceKernelMemoryPoolExpand(u64 searchStart, u64 searchEnd, size_t len, + size_t alignment, u64* physAddrOut); +s32 PS4_SYSV_ABI sceKernelMemoryPoolReserve(void* addrIn, size_t len, size_t alignment, int flags, + void** addrOut); +s32 PS4_SYSV_ABI sceKernelMemoryPoolCommit(void* addr, size_t len, int type, int prot, int flags); +s32 PS4_SYSV_ABI sceKernelMemoryPoolDecommit(void* addr, size_t len, int flags); + } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/thread_management.cpp b/src/core/libraries/kernel/thread_management.cpp index d09f47b5e..c30c7fca5 100644 --- a/src/core/libraries/kernel/thread_management.cpp +++ b/src/core/libraries/kernel/thread_management.cpp @@ -6,13 +6,12 @@ #include #include "common/alignment.h" -#include "common/arch.h" #include "common/assert.h" #include "common/error.h" #include "common/logging/log.h" #include "common/singleton.h" #include "common/thread.h" -#include "core/cpu_patches.h" +#include "core/debug_state.h" #include "core/libraries/error_codes.h" #include "core/libraries/kernel/libkernel.h" #include "core/libraries/kernel/thread_management.h" @@ -416,6 +415,7 @@ ScePthreadMutex* createMutex(ScePthreadMutex* addr) { if (addr == nullptr || *addr != nullptr) { return addr; } + const VAddr vaddr = reinterpret_cast(addr); std::string name = fmt::format("mutex{:#x}", vaddr); scePthreadMutexInit(addr, nullptr, name.c_str()); @@ -517,9 +517,12 @@ int PS4_SYSV_ABI scePthreadMutexattrSettype(ScePthreadMutexattr* attr, int type) ptype = PTHREAD_MUTEX_RECURSIVE; break; case ORBIS_PTHREAD_MUTEX_NORMAL: - case ORBIS_PTHREAD_MUTEX_ADAPTIVE: ptype = PTHREAD_MUTEX_NORMAL; break; + case ORBIS_PTHREAD_MUTEX_ADAPTIVE: + LOG_ERROR(Kernel_Pthread, "Unimplemented adaptive mutex"); + ptype = PTHREAD_MUTEX_ERRORCHECK; + break; default: return SCE_KERNEL_ERROR_EINVAL; } @@ -654,7 +657,7 @@ int PS4_SYSV_ABI scePthreadCondInit(ScePthreadCond* cond, const ScePthreadCondat int result = pthread_cond_init(&(*cond)->cond, &(*attr)->cond_attr); if (name != nullptr) { - LOG_INFO(Kernel_Pthread, "name={}, result={}", (*cond)->name, result); + LOG_TRACE(Kernel_Pthread, "name={}, result={}", (*cond)->name, result); } switch (result) { @@ -986,21 +989,19 @@ static void cleanup_thread(void* arg) { } Core::SetTcbBase(nullptr); thread->is_almost_done = true; + DebugState.RemoveCurrentThreadFromGuestList(); } static void* run_thread(void* arg) { auto* thread = static_cast(arg); Common::SetCurrentThreadName(thread->name.c_str()); -#ifdef ARCH_X86_64 - Core::InitializeThreadPatchStack(); -#endif - auto* linker = Common::Singleton::Instance(); - linker->InitTlsForThread(false); + const auto* linker = Common::Singleton::Instance(); void* ret = nullptr; g_pthread_self = thread; pthread_cleanup_push(cleanup_thread, thread); thread->is_started = true; - ret = thread->entry(thread->arg); + DebugState.AddCurrentThreadToGuestList(); + ret = linker->ExecuteGuest(thread->entry, thread->arg); pthread_cleanup_pop(1); return ret; } @@ -1063,7 +1064,7 @@ ScePthread PThreadPool::Create(const char* name) { std::scoped_lock lock{m_mutex}; for (auto* p : m_threads) { - if (p->is_free && p->name == name) { + if (p->is_free && name != nullptr && p->name == name) { p->is_free = false; return p; } @@ -1521,6 +1522,10 @@ int PS4_SYSV_ABI scePthreadGetprio(ScePthread thread, int* prio) { return ORBIS_OK; } int PS4_SYSV_ABI scePthreadSetprio(ScePthread thread, int prio) { + if (thread == nullptr) { + LOG_ERROR(Kernel_Pthread, "scePthreadSetprio: thread is nullptr"); + return ORBIS_KERNEL_ERROR_EINVAL; + } thread->prio = prio; return ORBIS_OK; } @@ -1631,6 +1636,10 @@ void pthreadSymbolsRegister(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("upoVrzMHFeE", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexTrylock); LIB_FUNCTION("IafI2PxcPnQ", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexTimedlock); + // scePthreadMutexInitForInternalLibc, scePthreadMutexattrInitForInternalLibc + LIB_FUNCTION("qH1gXoq71RY", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexInit); + LIB_FUNCTION("n2MMpvU8igI", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexattrInit); + // cond calls LIB_FUNCTION("2Tb92quprl0", "libkernel", 1, "libkernel", 1, 1, scePthreadCondInit); LIB_FUNCTION("m5-2bsNfv7s", "libkernel", 1, "libkernel", 1, 1, scePthreadCondattrInit); diff --git a/src/core/libraries/kernel/threads/semaphore.cpp b/src/core/libraries/kernel/threads/semaphore.cpp index 63ca25338..ff5368023 100644 --- a/src/core/libraries/kernel/threads/semaphore.cpp +++ b/src/core/libraries/kernel/threads/semaphore.cpp @@ -32,12 +32,20 @@ public: return ORBIS_KERNEL_ERROR_EBUSY; } + if (timeout && *timeout == 0) { + return SCE_KERNEL_ERROR_ETIMEDOUT; + } + // Create waiting thread object and add it into the list of waiters. WaitingThread waiter{need_count, is_fifo}; - AddWaiter(&waiter); + const auto it = AddWaiter(&waiter); // Perform the wait. - return waiter.Wait(lk, timeout); + const s32 result = waiter.Wait(lk, timeout); + if (result == SCE_KERNEL_ERROR_ETIMEDOUT) { + wait_list.erase(it); + } + return result; } bool Signal(s32 signal_count) { @@ -129,11 +137,13 @@ public: } }; - void AddWaiter(WaitingThread* waiter) { + using WaitList = std::list; + + WaitList::iterator AddWaiter(WaitingThread* waiter) { // Insert at the end of the list for FIFO order. if (is_fifo) { wait_list.push_back(waiter); - return; + return --wait_list.end(); } // Find the first with priority less then us and insert right before it. auto it = wait_list.begin(); @@ -141,9 +151,10 @@ public: it++; } wait_list.insert(it, waiter); + return it; } - std::list wait_list; + WaitList wait_list; std::string name; std::atomic token_count; std::mutex mutex; diff --git a/src/core/libraries/kernel/time_management.cpp b/src/core/libraries/kernel/time_management.cpp index 7a6ba4f62..5fa26b789 100644 --- a/src/core/libraries/kernel/time_management.cpp +++ b/src/core/libraries/kernel/time_management.cpp @@ -147,13 +147,20 @@ int PS4_SYSV_ABI sceKernelGettimeofday(OrbisKernelTimeval* tp) { } #ifdef _WIN64 - auto now = std::chrono::system_clock::now(); - auto duration = now.time_since_epoch(); - auto seconds = std::chrono::duration_cast(duration); - auto microsecs = std::chrono::duration_cast(duration - seconds); + FILETIME filetime; + GetSystemTimeAsFileTime(&filetime); - tp->tv_sec = seconds.count(); - tp->tv_usec = microsecs.count(); + constexpr u64 UNIX_TIME_START = 0x295E9648864000; + constexpr u64 TICKS_PER_SECOND = 1000000; + + u64 ticks = filetime.dwHighDateTime; + ticks <<= 32; + ticks |= filetime.dwLowDateTime; + ticks /= 10; + ticks -= UNIX_TIME_START; + + tp->tv_sec = ticks / TICKS_PER_SECOND; + tp->tv_usec = ticks % TICKS_PER_SECOND; #else timeval tv; gettimeofday(&tv, nullptr); @@ -240,6 +247,17 @@ int PS4_SYSV_ABI sceKernelConvertLocaltimeToUtc(time_t param_1, int64_t param_2, return SCE_OK; } +namespace Dev { +u64& GetInitialPtc() { + return initial_ptc; +} + +Common::NativeClock* GetClock() { + return clock.get(); +} + +} // namespace Dev + void timeSymbolsRegister(Core::Loader::SymbolsResolver* sym) { clock = std::make_unique(); initial_ptc = clock->GetUptime(); diff --git a/src/core/libraries/kernel/time_management.h b/src/core/libraries/kernel/time_management.h index a28e6e558..f2216f3d3 100644 --- a/src/core/libraries/kernel/time_management.h +++ b/src/core/libraries/kernel/time_management.h @@ -7,6 +7,10 @@ #include "common/types.h" +namespace Common { +class NativeClock; +} + namespace Core::Loader { class SymbolsResolver; } @@ -47,6 +51,12 @@ constexpr int ORBIS_CLOCK_EXT_DEBUG_NETWORK = 17; constexpr int ORBIS_CLOCK_EXT_AD_NETWORK = 18; constexpr int ORBIS_CLOCK_EXT_RAW_NETWORK = 19; +namespace Dev { +u64& GetInitialPtc(); + +Common::NativeClock* GetClock(); +} // namespace Dev + u64 PS4_SYSV_ABI sceKernelGetTscFrequency(); u64 PS4_SYSV_ABI sceKernelGetProcessTime(); u64 PS4_SYSV_ABI sceKernelGetProcessTimeCounter(); diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index da41eaf00..5b6c17b10 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -27,12 +27,12 @@ #include "core/libraries/playgo/playgo.h" #include "core/libraries/random/random.h" #include "core/libraries/rtc/rtc.h" +#include "core/libraries/save_data/dialog/savedatadialog.h" #include "core/libraries/save_data/savedata.h" #include "core/libraries/screenshot/screenshot.h" #include "core/libraries/system/commondialog.h" #include "core/libraries/system/msgdialog.h" #include "core/libraries/system/posix.h" -#include "core/libraries/system/savedatadialog.h" #include "core/libraries/system/sysmodule.h" #include "core/libraries/system/systemservice.h" #include "core/libraries/system/userservice.h" @@ -57,11 +57,11 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::Net::RegisterlibSceNet(sym); Libraries::NetCtl::RegisterlibSceNetCtl(sym); Libraries::SaveData::RegisterlibSceSaveData(sym); + Libraries::SaveData::Dialog::RegisterlibSceSaveDataDialog(sym); Libraries::Ssl::RegisterlibSceSsl(sym); Libraries::SysModule::RegisterlibSceSysmodule(sym); Libraries::Posix::Registerlibsceposix(sym); Libraries::AudioIn::RegisterlibSceAudioIn(sym); - Libraries::SaveDataDialog::RegisterlibSceSaveDataDialog(sym); Libraries::NpManager::RegisterlibSceNpManager(sym); Libraries::NpScore::RegisterlibSceNpScore(sym); Libraries::NpTrophy::RegisterlibSceNpTrophy(sym); diff --git a/src/core/libraries/network/net_ctl_codes.h b/src/core/libraries/network/net_ctl_codes.h new file mode 100644 index 000000000..a38565c1e --- /dev/null +++ b/src/core/libraries/network/net_ctl_codes.h @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// error codes +constexpr int ORBIS_NET_CTL_ERROR_CALLBACK_MAX = 0x80412103; +constexpr int ORBIS_NET_CTL_ERROR_ID_NOT_FOUND = 0x80412104; +constexpr int ORBIS_NET_CTL_ERROR_INVALID_ID = 0x80412105; +constexpr int ORBIS_NET_CTL_ERROR_INVALID_ADDR = 0x80412107; +constexpr int ORBIS_NET_CTL_ERROR_NOT_CONNECTED = 0x80412108; +constexpr int ORBIS_NET_CTL_ERROR_NOT_AVAIL = 0x80412109; +constexpr int ORBIS_NET_CTL_ERROR_NETWORK_DISABLED = 0x8041210D; +constexpr int ORBIS_NET_CTL_ERROR_DISCONNECT_REQ = 0x8041210E; +constexpr int ORBIS_NET_CTL_ERROR_ETHERNET_PLUGOUT = 0x80412115; +constexpr int ORBIS_NET_CTL_ERROR_WIFI_DEAUTHED = 0x80412116; +constexpr int ORBIS_NET_CTL_ERROR_WIFI_BEACON_LOST = 0x80412117; + +// state codes +constexpr int ORBIS_NET_CTL_STATE_DISCONNECTED = 0; +constexpr int ORBIS_NET_CTL_STATE_CONNECTING = 1; +constexpr int ORBIS_NET_CTL_STATE_IPOBTAINING = 2; +constexpr int ORBIS_NET_CTL_STATE_IPOBTAINED = 3; + +// event type +constexpr int ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED = 1; +constexpr int ORBIS_SCE_NET_CTL_EVENT_TYPE_DISCONNECT_REQ_FINISHED = 2; +constexpr int ORBIS_NET_CTL_EVENT_TYPE_IPOBTAINED = 3; diff --git a/src/core/libraries/network/net_ctl_obj.cpp b/src/core/libraries/network/net_ctl_obj.cpp new file mode 100644 index 000000000..07381d676 --- /dev/null +++ b/src/core/libraries/network/net_ctl_obj.cpp @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/singleton.h" +#include "core/linker.h" +#include "net_ctl_codes.h" +#include "net_ctl_obj.h" + +Libraries::NetCtl::NetCtlInternal::NetCtlInternal() { + callbacks.fill({nullptr, nullptr}); + nptoolCallbacks.fill({nullptr, nullptr}); +} + +Libraries::NetCtl::NetCtlInternal::~NetCtlInternal() {} + +s32 Libraries::NetCtl::NetCtlInternal::registerCallback(OrbisNetCtlCallback func, void* arg) { + std::unique_lock lock{m_mutex}; + + // Find the next available slot + int next_id = 0; + for (const auto& callback : callbacks) { + if (callback.func == nullptr) { + break; + } + next_id++; + } + + if (next_id == 8) { + return ORBIS_NET_CTL_ERROR_CALLBACK_MAX; + } + + callbacks[next_id].func = func; + callbacks[next_id].arg = arg; + return next_id; +} + +s32 Libraries::NetCtl::NetCtlInternal::registerNpToolkitCallback( + OrbisNetCtlCallbackForNpToolkit func, void* arg) { + + std::unique_lock lock{m_mutex}; + + // Find the next available slot + int next_id = 0; + for (const auto& callback : nptoolCallbacks) { + if (callback.func == nullptr) { + break; + } + next_id++; + } + + if (next_id == 8) { + return ORBIS_NET_CTL_ERROR_CALLBACK_MAX; + } + + nptoolCallbacks[next_id].func = func; + nptoolCallbacks[next_id].arg = arg; + return next_id; +} + +void Libraries::NetCtl::NetCtlInternal::checkCallback() { + std::unique_lock lock{m_mutex}; + const auto* linker = Common::Singleton::Instance(); + for (auto& callback : callbacks) { + if (callback.func != nullptr) { + linker->ExecuteGuest(callback.func, ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED, + callback.arg); + } + } +} + +void Libraries::NetCtl::NetCtlInternal::checkNpToolkitCallback() { + std::unique_lock lock{m_mutex}; + const auto* linker = Common::Singleton::Instance(); + for (auto& callback : nptoolCallbacks) { + if (callback.func != nullptr) { + linker->ExecuteGuest(callback.func, ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED, + callback.arg); + } + } +} diff --git a/src/core/libraries/network/net_ctl_obj.h b/src/core/libraries/network/net_ctl_obj.h new file mode 100644 index 000000000..3178677f4 --- /dev/null +++ b/src/core/libraries/network/net_ctl_obj.h @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "common/types.h" + +namespace Libraries::NetCtl { + +using OrbisNetCtlCallback = PS4_SYSV_ABI void (*)(int eventType, void* arg); +using OrbisNetCtlCallbackForNpToolkit = PS4_SYSV_ABI void (*)(int eventType, void* arg); + +struct NetCtlCallback { + OrbisNetCtlCallback func; + void* arg; +}; + +struct NetCtlCallbackForNpToolkit { + OrbisNetCtlCallbackForNpToolkit func; + void* arg; +}; + +class NetCtlInternal { +public: + NetCtlInternal(); + ~NetCtlInternal(); + s32 registerCallback(OrbisNetCtlCallback func, void* arg); + s32 registerNpToolkitCallback(OrbisNetCtlCallbackForNpToolkit func, void* arg); + void checkCallback(); + void checkNpToolkitCallback(); + +public: + std::array nptoolCallbacks; + std::array callbacks; + std::mutex m_mutex; +}; +} // namespace Libraries::NetCtl diff --git a/src/core/libraries/network/netctl.cpp b/src/core/libraries/network/netctl.cpp index a1c8e81c0..3ecdde773 100644 --- a/src/core/libraries/network/netctl.cpp +++ b/src/core/libraries/network/netctl.cpp @@ -2,8 +2,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" +#include "common/singleton.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" +#include "core/libraries/network/net_ctl_codes.h" #include "core/libraries/network/netctl.h" namespace Libraries::NetCtl { @@ -79,7 +81,8 @@ int PS4_SYSV_ABI sceNetCtlUnregisterCallbackV6() { } int PS4_SYSV_ABI sceNetCtlCheckCallback() { - LOG_TRACE(Lib_NetCtl, "(STUBBED) called"); + auto* netctl = Common::Singleton::Instance(); + netctl->checkCallback(); return ORBIS_OK; } @@ -143,7 +146,17 @@ int PS4_SYSV_ABI sceNetCtlGetIfStat() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetCtlGetInfo() { +int PS4_SYSV_ABI sceNetCtlGetInfo(int code, OrbisNetCtlInfo* info) { + switch (code) { + case ORBIS_NET_CTL_INFO_DEVICE: + info->device = 0; + break; + case ORBIS_NET_CTL_INFO_LINK: + info->link = 0; // disconnected + break; + default: + LOG_ERROR(Lib_NetCtl, "{} unsupported code", code); + } LOG_ERROR(Lib_NetCtl, "(STUBBED) called"); return ORBIS_OK; } @@ -173,8 +186,9 @@ int PS4_SYSV_ABI sceNetCtlGetNetEvConfigInfoIpcInt() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetCtlGetResult() { - LOG_ERROR(Lib_NetCtl, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetCtlGetResult(int eventType, int* errorCode) { + LOG_ERROR(Lib_NetCtl, "(STUBBED) called eventType = {} ", eventType); + *errorCode = 0; return ORBIS_OK; } @@ -213,8 +227,8 @@ int PS4_SYSV_ABI sceNetCtlGetScanInfoForSsidScanIpcInt() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetCtlGetState() { - LOG_ERROR(Lib_NetCtl, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetCtlGetState(int* state) { + *state = ORBIS_NET_CTL_STATE_DISCONNECTED; return ORBIS_OK; } @@ -248,8 +262,17 @@ int PS4_SYSV_ABI sceNetCtlIsBandwidthManagementEnabledIpcInt() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetCtlRegisterCallback() { - LOG_ERROR(Lib_NetCtl, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetCtlRegisterCallback(OrbisNetCtlCallback func, void* arg, int* cid) { + if (!func || !cid) { + return ORBIS_NET_CTL_ERROR_INVALID_ADDR; + } + auto* netctl = Common::Singleton::Instance(); + s32 result = netctl->registerCallback(func, arg); + if (result < 0) { + return result; + } else { + *cid = result; + } return ORBIS_OK; } @@ -319,7 +342,8 @@ int PS4_SYSV_ABI Func_D8DCB6973537A3DC() { } int PS4_SYSV_ABI sceNetCtlCheckCallbackForNpToolkit() { - LOG_ERROR(Lib_NetCtl, "(STUBBED) called"); + auto* netctl = Common::Singleton::Instance(); + netctl->checkNpToolkitCallback(); return ORBIS_OK; } @@ -328,8 +352,18 @@ int PS4_SYSV_ABI sceNetCtlClearEventForNpToolkit() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetCtlRegisterCallbackForNpToolkit() { - LOG_ERROR(Lib_NetCtl, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetCtlRegisterCallbackForNpToolkit(OrbisNetCtlCallbackForNpToolkit func, + void* arg, int* cid) { + if (!func || !cid) { + return ORBIS_NET_CTL_ERROR_INVALID_ADDR; + } + auto* netctl = Common::Singleton::Instance(); + s32 result = netctl->registerNpToolkitCallback(func, arg); + if (result < 0) { + return result; + } else { + *cid = result; + } return ORBIS_OK; } diff --git a/src/core/libraries/network/netctl.h b/src/core/libraries/network/netctl.h index 0d6adf9c1..850650f97 100644 --- a/src/core/libraries/network/netctl.h +++ b/src/core/libraries/network/netctl.h @@ -4,6 +4,7 @@ #pragma once #include "common/types.h" +#include "net_ctl_obj.h" namespace Core::Loader { class SymbolsResolver; @@ -11,6 +12,45 @@ class SymbolsResolver; namespace Libraries::NetCtl { +constexpr int ORBIS_NET_ETHER_ADDR_LEN = 6; + +struct OrbisNetEtherAddr { + u8 data[ORBIS_NET_ETHER_ADDR_LEN]; +}; + +constexpr int ORBIS_NET_CTL_SSID_LEN = 32 + 1; +constexpr int ORBIS_NET_CTL_HOSTNAME_LEN = 255 + 1; +constexpr int ORBIS_NET_CTL_AUTH_NAME_LEN = 127 + 1; +constexpr int ORBIS_NET_CTL_IPV4_ADDR_STR_LEN = 16; + +typedef union OrbisNetCtlInfo { + u32 device; + OrbisNetEtherAddr ether_addr; + u32 mtu; + u32 link; + OrbisNetEtherAddr bssid; + char ssid[ORBIS_NET_CTL_SSID_LEN]; + u32 wifi_security; + u8 rssi_dbm; + uint8_t rssi_percentage; + u8 channel; + u32 ip_config; + char dhcp_hostname[ORBIS_NET_CTL_HOSTNAME_LEN]; + char pppoe_auth_name[ORBIS_NET_CTL_AUTH_NAME_LEN]; + char ip_address[ORBIS_NET_CTL_IPV4_ADDR_STR_LEN]; + char netmask[ORBIS_NET_CTL_IPV4_ADDR_STR_LEN]; + char default_route[ORBIS_NET_CTL_IPV4_ADDR_STR_LEN]; + char primary_dns[ORBIS_NET_CTL_IPV4_ADDR_STR_LEN]; + char secondary_dns[ORBIS_NET_CTL_IPV4_ADDR_STR_LEN]; + u32 http_proxy_config; + char http_proxy_server[ORBIS_NET_CTL_HOSTNAME_LEN]; + u16 http_proxy_port; +} SceNetCtlInfo; + +// GetInfo codes +constexpr int ORBIS_NET_CTL_INFO_DEVICE = 1; +constexpr int ORBIS_NET_CTL_INFO_LINK = 4; + int PS4_SYSV_ABI sceNetBweCheckCallbackIpcInt(); int PS4_SYSV_ABI sceNetBweClearEventIpcInt(); int PS4_SYSV_ABI sceNetBweFinishInternetConnectionTestIpcInt(); @@ -38,13 +78,13 @@ int PS4_SYSV_ABI sceNetCtlEnableBandwidthManagementIpcInt(); int PS4_SYSV_ABI sceNetCtlGetBandwidthInfoIpcInt(); int PS4_SYSV_ABI sceNetCtlGetEtherLinkMode(); int PS4_SYSV_ABI sceNetCtlGetIfStat(); -int PS4_SYSV_ABI sceNetCtlGetInfo(); +int PS4_SYSV_ABI sceNetCtlGetInfo(int code, OrbisNetCtlInfo* info); int PS4_SYSV_ABI sceNetCtlGetInfoIpcInt(); int PS4_SYSV_ABI sceNetCtlGetInfoV6IpcInt(); int PS4_SYSV_ABI sceNetCtlGetNatInfo(); int PS4_SYSV_ABI sceNetCtlGetNatInfoIpcInt(); int PS4_SYSV_ABI sceNetCtlGetNetEvConfigInfoIpcInt(); -int PS4_SYSV_ABI sceNetCtlGetResult(); +int PS4_SYSV_ABI sceNetCtlGetResult(int eventType, int* errorCode); int PS4_SYSV_ABI sceNetCtlGetResultIpcInt(); int PS4_SYSV_ABI sceNetCtlGetResultV6IpcInt(); int PS4_SYSV_ABI sceNetCtlGetScanInfoBssidForSsidListScanIpcInt(); @@ -52,14 +92,14 @@ int PS4_SYSV_ABI sceNetCtlGetScanInfoBssidIpcInt(); int PS4_SYSV_ABI sceNetCtlGetScanInfoByBssidIpcInt(); int PS4_SYSV_ABI sceNetCtlGetScanInfoForSsidListScanIpcInt(); int PS4_SYSV_ABI sceNetCtlGetScanInfoForSsidScanIpcInt(); -int PS4_SYSV_ABI sceNetCtlGetState(); +int PS4_SYSV_ABI sceNetCtlGetState(int* state); int PS4_SYSV_ABI sceNetCtlGetState2IpcInt(); int PS4_SYSV_ABI sceNetCtlGetStateIpcInt(); int PS4_SYSV_ABI sceNetCtlGetStateV6IpcInt(); int PS4_SYSV_ABI sceNetCtlGetWifiType(); int PS4_SYSV_ABI sceNetCtlInit(); int PS4_SYSV_ABI sceNetCtlIsBandwidthManagementEnabledIpcInt(); -int PS4_SYSV_ABI sceNetCtlRegisterCallback(); +int PS4_SYSV_ABI sceNetCtlRegisterCallback(OrbisNetCtlCallback func, void* arg, int* cid); int PS4_SYSV_ABI sceNetCtlRegisterCallbackForLibIpcInt(); int PS4_SYSV_ABI sceNetCtlRegisterCallbackIpcInt(); int PS4_SYSV_ABI sceNetCtlRegisterCallbackV6IpcInt(); @@ -75,7 +115,8 @@ int PS4_SYSV_ABI sceNetCtlUnsetStunWithPaddingFlagIpcInt(); int PS4_SYSV_ABI Func_D8DCB6973537A3DC(); int PS4_SYSV_ABI sceNetCtlCheckCallbackForNpToolkit(); int PS4_SYSV_ABI sceNetCtlClearEventForNpToolkit(); -int PS4_SYSV_ABI sceNetCtlRegisterCallbackForNpToolkit(); +int PS4_SYSV_ABI sceNetCtlRegisterCallbackForNpToolkit(OrbisNetCtlCallbackForNpToolkit func, + void* arg, int* cid); int PS4_SYSV_ABI sceNetCtlUnregisterCallbackForNpToolkit(); int PS4_SYSV_ABI sceNetCtlApCheckCallback(); int PS4_SYSV_ABI sceNetCtlApClearEvent(); diff --git a/src/core/libraries/np_manager/np_manager.cpp b/src/core/libraries/np_manager/np_manager.cpp index a761caa73..28d28cc93 100644 --- a/src/core/libraries/np_manager/np_manager.cpp +++ b/src/core/libraries/np_manager/np_manager.cpp @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include #include "common/config.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" @@ -874,11 +876,6 @@ int PS4_SYSV_ABI sceNpCheckCallback() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpCheckCallbackForLib() { - LOG_ERROR(Lib_NpManager, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNpCheckNpAvailability() { LOG_ERROR(Lib_NpManager, "(STUBBED) called"); return ORBIS_OK; @@ -975,9 +972,10 @@ int PS4_SYSV_ABI sceNpGetGamePresenceStatusA() { } int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId userId, OrbisNpId* npId) { - LOG_ERROR(Lib_NpManager, "(DUMMY) called"); - + LOG_INFO(Lib_NpManager, "userId {}", userId); std::string name = Config::getUserName(); + // Fill the unused stuffs to 0 + memset(npId, 0, sizeof(*npId)); strcpy(npId->handle.data, name.c_str()); return ORBIS_OK; } @@ -1002,8 +1000,9 @@ int PS4_SYSV_ABI sceNpGetParentalControlInfoA() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetState() { - LOG_ERROR(Lib_NpManager, "(STUBBED) called"); +int PS4_SYSV_ABI sceNpGetState(s32 userId, OrbisNpState* state) { + *state = ORBIS_NP_STATE_SIGNED_OUT; + LOG_DEBUG(Lib_NpManager, "Signed out"); return ORBIS_OK; } @@ -2507,11 +2506,30 @@ int PS4_SYSV_ABI Func_FF966E4351E564D6() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpRegisterStateCallbackForToolkit() { - LOG_ERROR(Lib_NpManager, "(STUBBED) called"); +struct NpStateCallbackForNpToolkit { + OrbisNpStateCallbackForNpToolkit func; + void* userdata; +}; + +NpStateCallbackForNpToolkit NpStateCbForNp; + +int PS4_SYSV_ABI sceNpCheckCallbackForLib() { + // LOG_ERROR(Lib_NpManager, "(STUBBED) called"); + const auto* linker = Common::Singleton::Instance(); + linker->ExecuteGuest(NpStateCbForNp.func, 1, ORBIS_NP_STATE_SIGNED_OUT, + NpStateCbForNp.userdata); return ORBIS_OK; } +int PS4_SYSV_ABI sceNpRegisterStateCallbackForToolkit(OrbisNpStateCallbackForNpToolkit callback, + void* userdata) { + static int id = 0; + LOG_ERROR(Lib_NpManager, "(STUBBED) called"); + NpStateCbForNp.func = callback; + NpStateCbForNp.userdata = userdata; + return id; +} + int PS4_SYSV_ABI sceNpUnregisterStateCallbackForToolkit() { LOG_ERROR(Lib_NpManager, "(STUBBED) called"); return ORBIS_OK; diff --git a/src/core/libraries/np_manager/np_manager.h b/src/core/libraries/np_manager/np_manager.h index 5955a40b4..43ea49ce4 100644 --- a/src/core/libraries/np_manager/np_manager.h +++ b/src/core/libraries/np_manager/np_manager.h @@ -11,6 +11,17 @@ class SymbolsResolver; namespace Libraries::NpManager { +constexpr int ORBIS_NP_ERROR_SIGNED_OUT = 0x80550006; + +enum OrbisNpState { + ORBIS_NP_STATE_UNKNOWN = 0, + ORBIS_NP_STATE_SIGNED_OUT, + ORBIS_NP_STATE_SIGNED_IN +}; + +using OrbisNpStateCallbackForNpToolkit = PS4_SYSV_ABI void (*)(s32 userId, OrbisNpState state, + void* userdata); + constexpr int ORBIS_NP_ONLINEID_MAX_LENGTH = 16; typedef int OrbisUserServiceUserId; @@ -225,7 +236,7 @@ int PS4_SYSV_ABI sceNpGetNpReachabilityState(); int PS4_SYSV_ABI sceNpGetOnlineId(); int PS4_SYSV_ABI sceNpGetParentalControlInfo(); int PS4_SYSV_ABI sceNpGetParentalControlInfoA(); -int PS4_SYSV_ABI sceNpGetState(); +int PS4_SYSV_ABI sceNpGetState(s32 userId, OrbisNpState* state); int PS4_SYSV_ABI sceNpGetUserIdByAccountId(); int PS4_SYSV_ABI sceNpGetUserIdByOnlineId(); int PS4_SYSV_ABI sceNpHasSignedUp(); @@ -526,7 +537,8 @@ int PS4_SYSV_ABI Func_F91B5B25CC9B30D9(); int PS4_SYSV_ABI Func_FC335B7102A585B3(); int PS4_SYSV_ABI Func_FCEAC354CA8B206E(); int PS4_SYSV_ABI Func_FF966E4351E564D6(); -int PS4_SYSV_ABI sceNpRegisterStateCallbackForToolkit(); +int PS4_SYSV_ABI sceNpRegisterStateCallbackForToolkit(OrbisNpStateCallbackForNpToolkit callback, + void* userdata); int PS4_SYSV_ABI sceNpUnregisterStateCallbackForToolkit(); void RegisterlibSceNpManager(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/np_trophy/np_trophy.cpp b/src/core/libraries/np_trophy/np_trophy.cpp index ed25322b4..548d1af69 100644 --- a/src/core/libraries/np_trophy/np_trophy.cpp +++ b/src/core/libraries/np_trophy/np_trophy.cpp @@ -2,15 +2,20 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "common/logging/log.h" +#include "common/path_util.h" #include "common/slot_vector.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "np_trophy.h" +#include "trophy_ui.h" namespace Libraries::NpTrophy { +std::string game_serial; + static constexpr auto MaxTrophyHandles = 4u; static constexpr auto MaxTrophyContexts = 8u; @@ -24,11 +29,70 @@ struct ContextKeyHash { struct TrophyContext { u32 context_id; }; -static Common::SlotVector trophy_handles{}; +static Common::SlotVector trophy_handles{}; static Common::SlotVector trophy_contexts{}; static std::unordered_map contexts_internal{}; -int PS4_SYSV_ABI sceNpTrophyAbortHandle() { +void ORBIS_NP_TROPHY_FLAG_ZERO(OrbisNpTrophyFlagArray* p) { + for (int i = 0; i < ORBIS_NP_TROPHY_NUM_MAX; i++) { + uint32_t array_index = i / 32; + uint32_t bit_position = i % 32; + + p->flag_bits[array_index] &= ~(1U << bit_position); + } +} + +void ORBIS_NP_TROPHY_FLAG_SET(int32_t trophyId, OrbisNpTrophyFlagArray* p) { + uint32_t array_index = trophyId / 32; + uint32_t bit_position = trophyId % 32; + + p->flag_bits[array_index] |= (1U << bit_position); +} + +void ORBIS_NP_TROPHY_FLAG_SET_ALL(OrbisNpTrophyFlagArray* p) { + for (int i = 0; i < ORBIS_NP_TROPHY_NUM_MAX; i++) { + uint32_t array_index = i / 32; + uint32_t bit_position = i % 32; + + p->flag_bits[array_index] |= (1U << bit_position); + } +} + +void ORBIS_NP_TROPHY_FLAG_CLR(int32_t trophyId, OrbisNpTrophyFlagArray* p) { + uint32_t array_index = trophyId / 32; + uint32_t bit_position = trophyId % 32; + + p->flag_bits[array_index] &= ~(1U << bit_position); +} + +bool ORBIS_NP_TROPHY_FLAG_ISSET(int32_t trophyId, OrbisNpTrophyFlagArray* p) { + uint32_t array_index = trophyId / 32; + uint32_t bit_position = trophyId % 32; + + return (p->flag_bits[array_index] & (1U << bit_position)) ? 1 : 0; +} + +OrbisNpTrophyGrade GetTrophyGradeFromChar(char trophyType) { + switch (trophyType) { + default: + return ORBIS_NP_TROPHY_GRADE_UNKNOWN; + break; + case 'B': + return ORBIS_NP_TROPHY_GRADE_BRONZE; + break; + case 'S': + return ORBIS_NP_TROPHY_GRADE_SILVER; + break; + case 'G': + return ORBIS_NP_TROPHY_GRADE_GOLD; + break; + case 'P': + return ORBIS_NP_TROPHY_GRADE_PLATINUM; + break; + } +} + +int PS4_SYSV_ABI sceNpTrophyAbortHandle(OrbisNpTrophyHandle handle) { LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); return ORBIS_OK; } @@ -83,8 +147,8 @@ int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceNpTrophyCreateContext(u32* context, u32 user_id, u32 service_label, - u64 options) { +s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t user_id, + uint32_t service_label, uint64_t options) { ASSERT(options == 0ull); if (!context) { return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; @@ -107,7 +171,7 @@ s32 PS4_SYSV_ABI sceNpTrophyCreateContext(u32* context, u32 user_id, u32 service return ORBIS_OK; } -s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(u32* handle) { +s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(OrbisNpTrophyHandle* handle) { if (!handle) { return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; } @@ -122,55 +186,361 @@ s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(u32* handle) { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyDestroyContext() { - LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); +int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context) { + LOG_INFO(Lib_NpTrophy, "Destroyed Context {}", context); + + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; + + Common::SlotId contextId; + contextId.index = context; + + ContextKey contextkey = trophy_contexts[contextId]; + trophy_contexts.erase(contextId); + contexts_internal.erase(contextkey); + return ORBIS_OK; } -s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(u32 handle) { - if (!trophy_handles.is_allocated({handle})) { +s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle) { + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + + if (!trophy_handles.is_allocated({static_cast(handle)})) { return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; } - trophy_handles.erase({handle}); + trophy_handles.erase({static_cast(handle)}); LOG_INFO(Lib_NpTrophy, "Handle {} destroyed", handle); return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyGetGameIcon() { +int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + void* buffer, size_t* size) { LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyGetGameInfo() { +struct GameTrophyInfo { + uint32_t num_groups; + uint32_t num_trophies; + uint32_t num_trophies_by_rarity[5]; + uint32_t unlocked_trophies; + uint32_t unlocked_trophies_by_rarity[5]; +}; + +int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyGameDetails* details, + OrbisNpTrophyGameData* data) { + LOG_INFO(Lib_NpTrophy, "Getting Game Trophy"); + + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; + + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + + if (details == nullptr || data == nullptr) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + if (details->size != 0x4A0 || data->size != 0x20) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + const auto trophy_dir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles"; + auto trophy_file = trophy_dir / "trophy00" / "Xml" / "TROP.XML"; + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(trophy_file.native().c_str()); + + if (!result) { + LOG_ERROR(Lib_NpTrophy, "Failed to parse trophy xml : {}", result.description()); + return ORBIS_OK; + } + + GameTrophyInfo game_info{}; + + auto trophyconf = doc.child("trophyconf"); + for (const pugi::xml_node& node : trophyconf.children()) { + std::string_view node_name = node.name(); + + if (node_name == "title-name") { + strncpy(details->title, node.text().as_string(), ORBIS_NP_TROPHY_GAME_TITLE_MAX_SIZE); + } + + if (node_name == "title-detail") { + strncpy(details->description, node.text().as_string(), + ORBIS_NP_TROPHY_GAME_DESCR_MAX_SIZE); + } + + if (node_name == "group") + game_info.num_groups++; + + if (node_name == "trophy") { + bool current_trophy_unlockstate = node.attribute("unlockstate").as_bool(); + std::string_view current_trophy_grade = node.attribute("ttype").value(); + + if (current_trophy_grade.empty()) { + continue; + } + + game_info.num_trophies++; + int trophy_grade = GetTrophyGradeFromChar(current_trophy_grade.at(0)); + game_info.num_trophies_by_rarity[trophy_grade]++; + + if (current_trophy_unlockstate) { + game_info.unlocked_trophies++; + game_info.unlocked_trophies_by_rarity[trophy_grade]++; + } + } + } + + details->num_groups = game_info.num_groups; + details->num_trophies = game_info.num_trophies; + details->num_platinum = game_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_PLATINUM]; + details->num_gold = game_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_GOLD]; + details->num_silver = game_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_SILVER]; + details->num_bronze = game_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_BRONZE]; + data->unlocked_trophies = game_info.unlocked_trophies; + data->unlocked_platinum = game_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_PLATINUM]; + data->unlocked_gold = game_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_GOLD]; + data->unlocked_silver = game_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_SILVER]; + data->unlocked_bronze = game_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_BRONZE]; + + // maybe this should be 1 instead of 100? + data->progress_percentage = 100; + + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyGroupId groupId, void* buffer, size_t* size) { LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyGetGroupIcon() { +struct GroupTrophyInfo { + uint32_t num_trophies; + uint32_t num_trophies_by_rarity[5]; + uint32_t unlocked_trophies; + uint32_t unlocked_trophies_by_rarity[5]; +}; + +int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyGroupId groupId, + OrbisNpTrophyGroupDetails* details, + OrbisNpTrophyGroupData* data) { + LOG_INFO(Lib_NpTrophy, "Getting Trophy Group Info for id {}", groupId); + + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; + + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + + if (details == nullptr || data == nullptr) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + if (details->size != 0x4A0 || data->size != 0x28) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + const auto trophy_dir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles"; + auto trophy_file = trophy_dir / "trophy00" / "Xml" / "TROP.XML"; + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(trophy_file.native().c_str()); + + if (!result) { + LOG_ERROR(Lib_NpTrophy, "Failed to open trophy xml : {}", result.description()); + return ORBIS_OK; + } + + GroupTrophyInfo group_info{}; + + auto trophyconf = doc.child("trophyconf"); + for (const pugi::xml_node& node : trophyconf.children()) { + std::string_view node_name = node.name(); + + if (node_name == "group") { + int current_group_id = node.attribute("id").as_int(ORBIS_NP_TROPHY_INVALID_GROUP_ID); + if (current_group_id != ORBIS_NP_TROPHY_INVALID_GROUP_ID) { + if (current_group_id == groupId) { + std::string_view current_group_name = node.child("name").text().as_string(); + std::string_view current_group_description = + node.child("detail").text().as_string(); + + strncpy(details->title, current_group_name.data(), + ORBIS_NP_TROPHY_GROUP_TITLE_MAX_SIZE); + strncpy(details->description, current_group_description.data(), + ORBIS_NP_TROPHY_GAME_DESCR_MAX_SIZE); + } + } + } + + details->group_id = groupId; + data->group_id = groupId; + + if (node_name == "trophy") { + bool current_trophy_unlockstate = node.attribute("unlockstate").as_bool(); + std::string_view current_trophy_grade = node.attribute("ttype").value(); + int current_trophy_group_id = node.attribute("gid").as_int(-1); + + if (current_trophy_grade.empty()) { + continue; + } + + if (current_trophy_group_id == groupId) { + group_info.num_trophies++; + int trophyGrade = GetTrophyGradeFromChar(current_trophy_grade.at(0)); + group_info.num_trophies_by_rarity[trophyGrade]++; + if (current_trophy_unlockstate) { + group_info.unlocked_trophies++; + group_info.unlocked_trophies_by_rarity[trophyGrade]++; + } + } + } + } + + details->num_trophies = group_info.num_trophies; + details->num_platinum = group_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_PLATINUM]; + details->num_gold = group_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_GOLD]; + details->num_silver = group_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_SILVER]; + details->num_bronze = group_info.num_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_BRONZE]; + data->unlocked_trophies = group_info.unlocked_trophies; + data->unlocked_platinum = + group_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_PLATINUM]; + data->unlocked_gold = group_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_GOLD]; + data->unlocked_silver = group_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_SILVER]; + data->unlocked_bronze = group_info.unlocked_trophies_by_rarity[ORBIS_NP_TROPHY_GRADE_BRONZE]; + + // maybe this should be 1 instead of 100? + data->progress_percentage = 100; + + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyId trophyId, void* buffer, size_t* size) { LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyGetGroupInfo() { - LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); +int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyId trophyId, OrbisNpTrophyDetails* details, + OrbisNpTrophyData* data) { + LOG_INFO(Lib_NpTrophy, "Getting trophy info for id {}", trophyId); + + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; + + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + + if (trophyId >= 127) + return ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_ID; + + if (details == nullptr || data == nullptr) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + if (details->size != 0x498 || data->size != 0x18) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + const auto trophy_dir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles"; + auto trophy_file = trophy_dir / "trophy00" / "Xml" / "TROP.XML"; + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(trophy_file.native().c_str()); + + if (!result) { + LOG_ERROR(Lib_NpTrophy, "Failed to open trophy xml : {}", result.description()); + return ORBIS_OK; + } + + auto trophyconf = doc.child("trophyconf"); + + for (const pugi::xml_node& node : trophyconf.children()) { + std::string_view node_name = node.name(); + + if (node_name == "trophy") { + int current_trophy_id = node.attribute("id").as_int(ORBIS_NP_TROPHY_INVALID_TROPHY_ID); + if (current_trophy_id == trophyId) { + bool current_trophy_unlockstate = node.attribute("unlockstate").as_bool(); + std::string_view current_trophy_grade = node.attribute("ttype").value(); + std::string_view current_trophy_name = node.child("name").text().as_string(); + std::string_view current_trophy_description = + node.child("detail").text().as_string(); + + uint64_t current_trophy_timestamp = node.attribute("timestamp").as_ullong(); + int current_trophy_groupid = node.attribute("gid").as_int(-1); + bool current_trophy_hidden = node.attribute("hidden").as_bool(); + + details->trophy_id = trophyId; + details->trophy_grade = GetTrophyGradeFromChar(current_trophy_grade.at(0)); + details->group_id = current_trophy_groupid; + details->hidden = current_trophy_hidden; + + strncpy(details->name, current_trophy_name.data(), ORBIS_NP_TROPHY_NAME_MAX_SIZE); + strncpy(details->description, current_trophy_description.data(), + ORBIS_NP_TROPHY_DESCR_MAX_SIZE); + + data->trophy_id = trophyId; + data->unlocked = current_trophy_unlockstate; + data->timestamp.tick = current_trophy_timestamp; + } + } + } + return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon() { - LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); - return ORBIS_OK; -} +s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(OrbisNpTrophyContext context, + OrbisNpTrophyHandle handle, + OrbisNpTrophyFlagArray* flags, u32* count) { + LOG_INFO(Lib_NpTrophy, "GetTrophyUnlockState called"); -int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo() { - LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); - return ORBIS_OK; -} + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; -s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, u32* flags, u32* count) { - LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); - *flags = 0u; - *count = 0; + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + + if (flags == nullptr || count == nullptr) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + ORBIS_NP_TROPHY_FLAG_ZERO(flags); + + const auto trophy_dir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles"; + auto trophy_file = trophy_dir / "trophy00" / "Xml" / "TROP.XML"; + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(trophy_file.native().c_str()); + + if (!result) { + LOG_ERROR(Lib_NpTrophy, "Failed to open trophy xml : {}", result.description()); + return ORBIS_OK; + } + + int num_trophies = 0; + auto trophyconf = doc.child("trophyconf"); + + for (const pugi::xml_node& node : trophyconf.children()) { + std::string_view node_name = node.name(); + int current_trophy_id = node.attribute("id").as_int(ORBIS_NP_TROPHY_INVALID_TROPHY_ID); + bool current_trophy_unlockstate = node.attribute("unlockstate").as_bool(); + + if (node_name == "trophy") { + num_trophies++; + } + + if (current_trophy_unlockstate) { + ORBIS_NP_TROPHY_FLAG_SET(current_trophy_id, flags); + } + } + + *count = num_trophies; return ORBIS_OK; } @@ -239,8 +609,16 @@ int PS4_SYSV_ABI sceNpTrophyNumInfoGetTotal() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyRegisterContext() { +int PS4_SYSV_ABI sceNpTrophyRegisterContext(OrbisNpTrophyContext context, + OrbisNpTrophyHandle handle, uint64_t options) { LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); + + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; + + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + return ORBIS_OK; } @@ -254,7 +632,8 @@ int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyNum() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyShowTrophyList() { +int PS4_SYSV_ABI sceNpTrophyShowTrophyList(OrbisNpTrophyContext context, + OrbisNpTrophyHandle handle) { LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); return ORBIS_OK; } @@ -474,8 +853,136 @@ int PS4_SYSV_ABI sceNpTrophySystemSetDbgParamInt() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpTrophyUnlockTrophy() { - LOG_ERROR(Lib_NpTrophy, "(STUBBED) called"); +int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyId trophyId, OrbisNpTrophyId* platinumId) { + LOG_INFO(Lib_NpTrophy, "Unlocking trophy id {}", trophyId); + + if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT) + return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT; + + if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE) + return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE; + + if (trophyId >= 127) + return ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_ID; + + if (platinumId == nullptr) + return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT; + + const auto trophy_dir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles"; + auto trophy_file = trophy_dir / "trophy00" / "Xml" / "TROP.XML"; + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(trophy_file.native().c_str()); + + if (!result) { + LOG_ERROR(Lib_NpTrophy, "Failed to parse trophy xml : {}", result.description()); + return ORBIS_OK; + } + + *platinumId = ORBIS_NP_TROPHY_INVALID_TROPHY_ID; + + int num_trophies = 0; + int num_trophies_unlocked = 0; + pugi::xml_node platinum_node; + + auto trophyconf = doc.child("trophyconf"); + + for (pugi::xml_node& node : trophyconf.children()) { + int current_trophy_id = node.attribute("id").as_int(ORBIS_NP_TROPHY_INVALID_TROPHY_ID); + bool current_trophy_unlockstate = node.attribute("unlockstate").as_bool(); + const char* current_trophy_name = node.child("name").text().as_string(); + std::string_view current_trophy_description = node.child("detail").text().as_string(); + std::string_view current_trophy_type = node.attribute("ttype").value(); + + if (current_trophy_type == "P") { + platinum_node = node; + if (trophyId == current_trophy_id) { + return ORBIS_NP_TROPHY_ERROR_PLATINUM_CANNOT_UNLOCK; + } + } + + if (std::string_view(node.name()) == "trophy") { + if (node.attribute("pid").as_int(-1) != ORBIS_NP_TROPHY_INVALID_TROPHY_ID) { + num_trophies++; + if (current_trophy_unlockstate) { + num_trophies_unlocked++; + } + } + + if (current_trophy_id == trophyId) { + if (current_trophy_unlockstate) { + LOG_INFO(Lib_NpTrophy, "Trophy already unlocked"); + return ORBIS_NP_TROPHY_ERROR_TROPHY_ALREADY_UNLOCKED; + } else { + if (node.attribute("unlockstate").empty()) { + node.append_attribute("unlockstate") = "true"; + } else { + node.attribute("unlockstate").set_value("true"); + } + + Rtc::OrbisRtcTick trophyTimestamp; + Rtc::sceRtcGetCurrentTick(&trophyTimestamp); + + if (node.attribute("timestamp").empty()) { + node.append_attribute("timestamp") = + std::to_string(trophyTimestamp.tick).c_str(); + } else { + node.attribute("timestamp") + .set_value(std::to_string(trophyTimestamp.tick).c_str()); + } + + std::string trophy_icon_file = "TROP"; + trophy_icon_file.append(node.attribute("id").value()); + trophy_icon_file.append(".PNG"); + + std::filesystem::path current_icon_path = + trophy_dir / "trophy00" / "Icons" / trophy_icon_file; + + AddTrophyToQueue(current_icon_path, current_trophy_name); + } + } + } + } + + if (!platinum_node.attribute("unlockstate").as_bool()) { + if ((num_trophies - 1) == num_trophies_unlocked) { + if (platinum_node.attribute("unlockstate").empty()) { + platinum_node.append_attribute("unlockstate") = "true"; + } else { + platinum_node.attribute("unlockstate").set_value("true"); + } + + Rtc::OrbisRtcTick trophyTimestamp; + Rtc::sceRtcGetCurrentTick(&trophyTimestamp); + + if (platinum_node.attribute("timestamp").empty()) { + platinum_node.append_attribute("timestamp") = + std::to_string(trophyTimestamp.tick).c_str(); + } else { + platinum_node.attribute("timestamp") + .set_value(std::to_string(trophyTimestamp.tick).c_str()); + } + + int platinum_trophy_id = + platinum_node.attribute("id").as_int(ORBIS_NP_TROPHY_INVALID_TROPHY_ID); + const char* platinum_trophy_name = platinum_node.child("name").text().as_string(); + + std::string platinum_icon_file = "TROP"; + platinum_icon_file.append(platinum_node.attribute("id").value()); + platinum_icon_file.append(".PNG"); + + std::filesystem::path platinum_icon_path = + trophy_dir / "trophy00" / "Icons" / platinum_icon_file; + + *platinumId = platinum_trophy_id; + AddTrophyToQueue(platinum_icon_path, platinum_trophy_name); + } + } + + doc.save_file((trophy_dir / "trophy00" / "Xml" / "TROP.XML").native().c_str()); + return ORBIS_OK; } diff --git a/src/core/libraries/np_trophy/np_trophy.h b/src/core/libraries/np_trophy/np_trophy.h index d05d353f1..ac13a9ab7 100644 --- a/src/core/libraries/np_trophy/np_trophy.h +++ b/src/core/libraries/np_trophy/np_trophy.h @@ -4,6 +4,7 @@ #pragma once #include "common/types.h" +#include "core/libraries/rtc/rtc.h" namespace Core::Loader { class SymbolsResolver; @@ -11,7 +12,116 @@ class SymbolsResolver; namespace Libraries::NpTrophy { -int PS4_SYSV_ABI sceNpTrophyAbortHandle(); +extern std::string game_serial; + +constexpr int ORBIS_NP_TROPHY_FLAG_SETSIZE = 128; +constexpr int ORBIS_NP_TROPHY_FLAG_BITS_SHIFT = 5; + +constexpr int ORBIS_NP_TROPHY_GAME_TITLE_MAX_SIZE = 128; +constexpr int ORBIS_NP_TROPHY_GAME_DESCR_MAX_SIZE = 1024; +constexpr int ORBIS_NP_TROPHY_GROUP_TITLE_MAX_SIZE = 128; +constexpr int ORBIS_NP_TROPHY_GROUP_DESCR_MAX_SIZE = 1024; +constexpr int ORBIS_NP_TROPHY_NAME_MAX_SIZE = 128; +constexpr int ORBIS_NP_TROPHY_DESCR_MAX_SIZE = 1024; +constexpr int ORBIS_NP_TROPHY_NUM_MAX = 128; + +constexpr int ORBIS_NP_TROPHY_INVALID_HANDLE = -1; +constexpr int ORBIS_NP_TROPHY_INVALID_CONTEXT = -1; +constexpr int ORBIS_NP_TROPHY_INVALID_TROPHY_ID = -1; + +typedef int32_t OrbisNpTrophyHandle; +typedef int32_t OrbisNpTrophyContext; +typedef int32_t OrbisNpTrophyId; +typedef uint32_t OrbisNpTrophyFlagMask; + +struct OrbisNpTrophyFlagArray { + OrbisNpTrophyFlagMask + flag_bits[ORBIS_NP_TROPHY_FLAG_SETSIZE >> ORBIS_NP_TROPHY_FLAG_BITS_SHIFT]; +}; + +void ORBIS_NP_TROPHY_FLAG_ZERO(OrbisNpTrophyFlagArray* p); +void ORBIS_NP_TROPHY_FLAG_SET(int32_t trophyId, OrbisNpTrophyFlagArray* p); +void ORBIS_NP_TROPHY_FLAG_SET_ALL(OrbisNpTrophyFlagArray* p); +void ORBIS_NP_TROPHY_FLAG_CLR(int32_t trophyId, OrbisNpTrophyFlagArray* p); +bool ORBIS_NP_TROPHY_FLAG_ISSET(int32_t trophyId, OrbisNpTrophyFlagArray* p); + +struct OrbisNpTrophyData { + size_t size; + OrbisNpTrophyId trophy_id; + bool unlocked; + uint8_t reserved[3]; + Rtc::OrbisRtcTick timestamp; +}; + +typedef int32_t OrbisNpTrophyGrade; +constexpr int ORBIS_NP_TROPHY_GRADE_UNKNOWN = 0; +constexpr int ORBIS_NP_TROPHY_GRADE_PLATINUM = 1; +constexpr int ORBIS_NP_TROPHY_GRADE_GOLD = 2; +constexpr int ORBIS_NP_TROPHY_GRADE_SILVER = 3; +constexpr int ORBIS_NP_TROPHY_GRADE_BRONZE = 4; + +typedef int32_t OrbisNpTrophyGroupId; +constexpr int ORBIS_NP_TROPHY_BASE_GAME_GROUP_ID = -1; +constexpr int ORBIS_NP_TROPHY_INVALID_GROUP_ID = -2; + +struct OrbisNpTrophyDetails { + size_t size; + OrbisNpTrophyId trophy_id; + OrbisNpTrophyGrade trophy_grade; + OrbisNpTrophyGroupId group_id; + bool hidden; + uint8_t reserved[3]; + char name[ORBIS_NP_TROPHY_NAME_MAX_SIZE]; + char description[ORBIS_NP_TROPHY_DESCR_MAX_SIZE]; +}; + +struct OrbisNpTrophyGameData { + size_t size; + uint32_t unlocked_trophies; + uint32_t unlocked_platinum; + uint32_t unlocked_gold; + uint32_t unlocked_silver; + uint32_t unlocked_bronze; + uint32_t progress_percentage; +}; + +struct OrbisNpTrophyGameDetails { + size_t size; + uint32_t num_groups; + uint32_t num_trophies; + uint32_t num_platinum; + uint32_t num_gold; + uint32_t num_silver; + uint32_t num_bronze; + char title[ORBIS_NP_TROPHY_GAME_TITLE_MAX_SIZE]; + char description[ORBIS_NP_TROPHY_GAME_DESCR_MAX_SIZE]; +}; + +struct OrbisNpTrophyGroupData { + size_t size; + OrbisNpTrophyGroupId group_id; + uint32_t unlocked_trophies; + uint32_t unlocked_platinum; + uint32_t unlocked_gold; + uint32_t unlocked_silver; + uint32_t unlocked_bronze; + uint32_t progress_percentage; + uint8_t reserved[4]; +}; + +struct OrbisNpTrophyGroupDetails { + size_t size; + OrbisNpTrophyGroupId group_id; + uint32_t num_trophies; + uint32_t num_platinum; + uint32_t num_gold; + uint32_t num_silver; + uint32_t num_bronze; + char title[ORBIS_NP_TROPHY_GROUP_TITLE_MAX_SIZE]; + char description[ORBIS_NP_TROPHY_GROUP_DESCR_MAX_SIZE]; +}; + +int PS4_SYSV_ABI sceNpTrophyAbortHandle(OrbisNpTrophyHandle handle); int PS4_SYSV_ABI sceNpTrophyCaptureScreenshot(); int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyDetails(); int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyFlagArray(); @@ -22,18 +132,30 @@ int PS4_SYSV_ABI sceNpTrophyConfigGetTrophySetInfoInGroup(); int PS4_SYSV_ABI sceNpTrophyConfigGetTrophySetVersion(); int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyTitleDetails(); int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature(); -s32 PS4_SYSV_ABI sceNpTrophyCreateContext(u32* context, u32 user_id, u32 service_label, - u64 options); -s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(u32* handle); -int PS4_SYSV_ABI sceNpTrophyDestroyContext(); -s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(u32 handle); -int PS4_SYSV_ABI sceNpTrophyGetGameIcon(); -int PS4_SYSV_ABI sceNpTrophyGetGameInfo(); -int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(); -int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(); -int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(); -int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(); -s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, u32* flags, u32* count); +s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t user_id, + uint32_t service_label, uint64_t options); +s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(OrbisNpTrophyHandle* handle); +int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context); +s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle); +int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + void* buffer, size_t* size); +int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyGameDetails* details, + OrbisNpTrophyGameData* data); +int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyGroupId groupId, void* buffer, size_t* size); +int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyGroupId groupId, + OrbisNpTrophyGroupDetails* details, + OrbisNpTrophyGroupData* data); +int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyId trophyId, void* buffer, size_t* size); +int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyId trophyId, OrbisNpTrophyDetails* details, + OrbisNpTrophyData* data); +s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(OrbisNpTrophyContext context, + OrbisNpTrophyHandle handle, + OrbisNpTrophyFlagArray* flags, u32* count); int PS4_SYSV_ABI sceNpTrophyGroupArrayGetNum(); int PS4_SYSV_ABI sceNpTrophyIntAbortHandle(); int PS4_SYSV_ABI sceNpTrophyIntCheckNetSyncTitles(); @@ -47,10 +169,12 @@ int PS4_SYSV_ABI sceNpTrophyIntGetTrpIconByUri(); int PS4_SYSV_ABI sceNpTrophyIntNetSyncTitle(); int PS4_SYSV_ABI sceNpTrophyIntNetSyncTitles(); int PS4_SYSV_ABI sceNpTrophyNumInfoGetTotal(); -int PS4_SYSV_ABI sceNpTrophyRegisterContext(); +int PS4_SYSV_ABI sceNpTrophyRegisterContext(OrbisNpTrophyContext context, + OrbisNpTrophyHandle handle, uint64_t options); int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyFlagArray(); int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyNum(); -int PS4_SYSV_ABI sceNpTrophyShowTrophyList(); +int PS4_SYSV_ABI sceNpTrophyShowTrophyList(OrbisNpTrophyContext context, + OrbisNpTrophyHandle handle); int PS4_SYSV_ABI sceNpTrophySystemAbortHandle(); int PS4_SYSV_ABI sceNpTrophySystemBuildGroupIconUri(); int PS4_SYSV_ABI sceNpTrophySystemBuildNetTrophyIconUri(); @@ -94,7 +218,8 @@ int PS4_SYSV_ABI sceNpTrophySystemRemoveTitleData(); int PS4_SYSV_ABI sceNpTrophySystemRemoveUserData(); int PS4_SYSV_ABI sceNpTrophySystemSetDbgParam(); int PS4_SYSV_ABI sceNpTrophySystemSetDbgParamInt(); -int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(); +int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle, + OrbisNpTrophyId trophyId, OrbisNpTrophyId* platinumId); int PS4_SYSV_ABI Func_149656DA81D41C59(); int PS4_SYSV_ABI Func_9F80071876FFA5F6(); int PS4_SYSV_ABI Func_F8EF6F5350A91990(); diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp new file mode 100644 index 000000000..618f8db46 --- /dev/null +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -0,0 +1,93 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include "common/assert.h" +#include "common/singleton.h" +#include "imgui/imgui_std.h" +#include "trophy_ui.h" + +using namespace ImGui; +namespace Libraries::NpTrophy { + +std::optional current_trophy_ui; +std::queue trophy_queue; +std::mutex queueMtx; + +TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName) + : trophy_name(trophyName) { + if (std::filesystem::exists(trophyIconPath)) { + trophy_icon = RefCountedTexture::DecodePngFile(trophyIconPath); + } else { + LOG_ERROR(Lib_NpTrophy, "Couldnt load trophy icon at {}", + fmt::UTF(trophyIconPath.u8string())); + } + AddLayer(this); +} + +TrophyUI::~TrophyUI() { + Finish(); +} + +void TrophyUI::Finish() { + RemoveLayer(this); +} + +void TrophyUI::Draw() { + const auto& io = GetIO(); + + const ImVec2 window_size{ + std::min(io.DisplaySize.x, 250.f), + std::min(io.DisplaySize.y, 70.f), + }; + + SetNextWindowSize(window_size); + SetNextWindowCollapsed(false); + SetNextWindowPos(ImVec2(io.DisplaySize.x - 250, 50)); + KeepNavHighlight(); + + if (Begin("Trophy Window", nullptr, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoInputs)) { + if (trophy_icon) { + Image(trophy_icon.GetTexture().im_id, ImVec2(50, 50)); + ImGui::SameLine(); + } else { + // placeholder + const auto pos = GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f}, + GetColorU32(ImVec4{0.7f})); + ImGui::Indent(60); + } + TextWrapped("Trophy earned!\n%s", trophy_name.c_str()); + } + End(); + + trophy_timer -= io.DeltaTime; + if (trophy_timer <= 0) { + std::lock_guard lock(queueMtx); + if (!trophy_queue.empty()) { + TrophyInfo next_trophy = trophy_queue.front(); + trophy_queue.pop(); + current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name); + } else { + current_trophy_ui.reset(); + } + } +} + +void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName) { + std::lock_guard lock(queueMtx); + if (current_trophy_ui.has_value()) { + TrophyInfo new_trophy; + new_trophy.trophy_icon_path = trophyIconPath; + new_trophy.trophy_name = trophyName; + trophy_queue.push(new_trophy); + } else { + current_trophy_ui.emplace(trophyIconPath, trophyName); + } +} + +} // namespace Libraries::NpTrophy \ No newline at end of file diff --git a/src/core/libraries/np_trophy/trophy_ui.h b/src/core/libraries/np_trophy/trophy_ui.h new file mode 100644 index 000000000..ce7a1c63a --- /dev/null +++ b/src/core/libraries/np_trophy/trophy_ui.h @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include + +#include "common/fixed_value.h" +#include "common/types.h" +#include "core/libraries/np_trophy/np_trophy.h" +#include "imgui/imgui_layer.h" +#include "imgui/imgui_texture.h" + +namespace Libraries::NpTrophy { + +class TrophyUI final : public ImGui::Layer { +public: + TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName); + ~TrophyUI() override; + + void Finish(); + + void Draw() override; + +private: + std::string trophy_name; + float trophy_timer = 5.0f; + ImGui::RefCountedTexture trophy_icon; +}; + +struct TrophyInfo { + std::filesystem::path trophy_icon_path; + std::string trophy_name; +}; + +void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName); + +}; // namespace Libraries::NpTrophy \ No newline at end of file diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index b8a27fdc2..6c3b1f56c 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -522,8 +522,8 @@ int PS4_SYSV_ABI scePadSetUserColor() { int PS4_SYSV_ABI scePadSetVibration(s32 handle, const OrbisPadVibrationParam* pParam) { if (pParam != nullptr) { - LOG_INFO(Lib_Pad, "scePadSetVibration called handle = {} data = {} , {}", handle, - pParam->smallMotor, pParam->largeMotor); + LOG_DEBUG(Lib_Pad, "scePadSetVibration called handle = {} data = {} , {}", handle, + pParam->smallMotor, pParam->largeMotor); auto* controller = Common::Singleton::Instance(); controller->SetVibration(pParam->smallMotor, pParam->largeMotor); return ORBIS_OK; diff --git a/src/core/libraries/save_data/dialog/savedatadialog.cpp b/src/core/libraries/save_data/dialog/savedatadialog.cpp new file mode 100644 index 000000000..0ad7d7dc0 --- /dev/null +++ b/src/core/libraries/save_data/dialog/savedatadialog.cpp @@ -0,0 +1,164 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/elf_info.h" +#include "common/logging/log.h" +#include "core/libraries/libs.h" +#include "core/libraries/system/commondialog.h" +#include "magic_enum.hpp" +#include "savedatadialog.h" +#include "savedatadialog_ui.h" + +namespace Libraries::SaveData::Dialog { + +using CommonDialog::Error; +using CommonDialog::Result; +using CommonDialog::Status; + +static auto g_status = Status::NONE; +static SaveDialogState g_state{}; +static SaveDialogResult g_result{}; +static SaveDialogUi g_save_dialog_ui; + +Error PS4_SYSV_ABI sceSaveDataDialogClose() { + LOG_DEBUG(Lib_SaveDataDialog, "called"); + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + g_save_dialog_ui.Finish(ButtonId::INVALID); + g_save_dialog_ui = SaveDialogUi{}; + return Error::OK; +} + +Error PS4_SYSV_ABI sceSaveDataDialogGetResult(OrbisSaveDataDialogResult* result) { + LOG_DEBUG(Lib_SaveDataDialog, "called"); + if (g_status != Status::FINISHED) { + return Error::NOT_FINISHED; + } + if (result == nullptr) { + return Error::ARG_NULL; + } + g_result.CopyTo(*result); + return Error::OK; +} + +Status PS4_SYSV_ABI sceSaveDataDialogGetStatus() { + LOG_TRACE(Lib_SaveDataDialog, "called status={}", magic_enum::enum_name(g_status)); + return g_status; +} + +Error PS4_SYSV_ABI sceSaveDataDialogInitialize() { + LOG_DEBUG(Lib_SaveDataDialog, "called"); + if (!CommonDialog::g_isInitialized) { + return Error::NOT_SYSTEM_INITIALIZED; + } + if (g_status != Status::NONE) { + return Error::ALREADY_INITIALIZED; + } + if (CommonDialog::g_isUsed) { + return Error::BUSY; + } + g_status = Status::INITIALIZED; + CommonDialog::g_isUsed = true; + + return Error::OK; +} + +s32 PS4_SYSV_ABI sceSaveDataDialogIsReadyToDisplay() { + return 1; +} + +Error PS4_SYSV_ABI sceSaveDataDialogOpen(const OrbisSaveDataDialogParam* param) { + if (g_status != Status::INITIALIZED && g_status != Status::FINISHED) { + LOG_INFO(Lib_SaveDataDialog, "called without initialize"); + return Error::INVALID_STATE; + } + if (param == nullptr) { + LOG_DEBUG(Lib_SaveDataDialog, "called param:(NULL)"); + return Error::ARG_NULL; + } + LOG_DEBUG(Lib_SaveDataDialog, "called param->mode: {}", magic_enum::enum_name(param->mode)); + ASSERT(param->size == sizeof(OrbisSaveDataDialogParam)); + ASSERT(param->baseParam.size == sizeof(CommonDialog::BaseParam)); + g_result = {}; + g_state = SaveDialogState{*param}; + g_status = Status::RUNNING; + g_save_dialog_ui = SaveDialogUi(&g_state, &g_status, &g_result); + return Error::OK; +} + +Error PS4_SYSV_ABI sceSaveDataDialogProgressBarInc(OrbisSaveDataDialogProgressBarTarget target, + u32 delta) { + LOG_DEBUG(Lib_SaveDataDialog, "called"); + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + if (g_state.GetMode() != SaveDataDialogMode::PROGRESS_BAR) { + return Error::NOT_SUPPORTED; + } + if (target != OrbisSaveDataDialogProgressBarTarget::DEFAULT) { + return Error::PARAM_INVALID; + } + g_state.GetState().progress += delta; + return Error::OK; +} + +Error PS4_SYSV_ABI sceSaveDataDialogProgressBarSetValue(OrbisSaveDataDialogProgressBarTarget target, + u32 rate) { + LOG_DEBUG(Lib_SaveDataDialog, "called"); + if (g_status != Status::RUNNING) { + return Error::NOT_RUNNING; + } + if (g_state.GetMode() != SaveDataDialogMode::PROGRESS_BAR) { + return Error::NOT_SUPPORTED; + } + if (target != OrbisSaveDataDialogProgressBarTarget::DEFAULT) { + return Error::PARAM_INVALID; + } + g_state.GetState().progress = rate; + return Error::OK; +} + +Error PS4_SYSV_ABI sceSaveDataDialogTerminate() { + LOG_DEBUG(Lib_SaveDataDialog, "called"); + if (g_status == Status::RUNNING) { + sceSaveDataDialogClose(); + } + if (g_status == Status::NONE) { + return Error::NOT_INITIALIZED; + } + g_save_dialog_ui = SaveDialogUi{}; + g_status = Status::NONE; + CommonDialog::g_isUsed = false; + return Error::OK; +} + +Status PS4_SYSV_ABI sceSaveDataDialogUpdateStatus() { + LOG_TRACE(Lib_SaveDataDialog, "called status={}", magic_enum::enum_name(g_status)); + return g_status; +} + +void RegisterlibSceSaveDataDialog(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("fH46Lag88XY", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogClose); + LIB_FUNCTION("yEiJ-qqr6Cg", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogGetResult); + LIB_FUNCTION("ERKzksauAJA", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogGetStatus); + LIB_FUNCTION("s9e3+YpRnzw", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogInitialize); + LIB_FUNCTION("en7gNVnh878", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogIsReadyToDisplay); + LIB_FUNCTION("4tPhsP6FpDI", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogOpen); + LIB_FUNCTION("V-uEeFKARJU", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogProgressBarInc); + LIB_FUNCTION("hay1CfTmLyA", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogProgressBarSetValue); + LIB_FUNCTION("YuH2FA7azqQ", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogTerminate); + LIB_FUNCTION("KK3Bdg1RWK0", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, + sceSaveDataDialogUpdateStatus); +}; + +} // namespace Libraries::SaveData::Dialog diff --git a/src/core/libraries/save_data/dialog/savedatadialog.h b/src/core/libraries/save_data/dialog/savedatadialog.h new file mode 100644 index 000000000..34afe98a7 --- /dev/null +++ b/src/core/libraries/save_data/dialog/savedatadialog.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" +#include "core/libraries/system/commondialog.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::SaveData::Dialog { + +struct OrbisSaveDataDialogParam; +struct OrbisSaveDataDialogResult; +enum class OrbisSaveDataDialogProgressBarTarget : u32; + +CommonDialog::Error PS4_SYSV_ABI sceSaveDataDialogClose(); +CommonDialog::Error PS4_SYSV_ABI sceSaveDataDialogGetResult(OrbisSaveDataDialogResult* result); +CommonDialog::Status PS4_SYSV_ABI sceSaveDataDialogGetStatus(); +CommonDialog::Error PS4_SYSV_ABI sceSaveDataDialogInitialize(); +s32 PS4_SYSV_ABI sceSaveDataDialogIsReadyToDisplay(); +CommonDialog::Error PS4_SYSV_ABI sceSaveDataDialogOpen(const OrbisSaveDataDialogParam* param); +CommonDialog::Error PS4_SYSV_ABI +sceSaveDataDialogProgressBarInc(OrbisSaveDataDialogProgressBarTarget target, u32 delta); +CommonDialog::Error PS4_SYSV_ABI +sceSaveDataDialogProgressBarSetValue(OrbisSaveDataDialogProgressBarTarget target, u32 rate); +CommonDialog::Error PS4_SYSV_ABI sceSaveDataDialogTerminate(); +CommonDialog::Status PS4_SYSV_ABI sceSaveDataDialogUpdateStatus(); + +void RegisterlibSceSaveDataDialog(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::SaveData::Dialog diff --git a/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp b/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp new file mode 100644 index 000000000..c4bf84258 --- /dev/null +++ b/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp @@ -0,0 +1,852 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "common/elf_info.h" +#include "common/singleton.h" +#include "common/string_util.h" +#include "core/file_sys/fs.h" +#include "core/libraries/save_data/save_instance.h" +#include "imgui/imgui_std.h" +#include "savedatadialog_ui.h" + +using namespace ImGui; +using namespace Libraries::CommonDialog; +using Common::ElfInfo; + +constexpr u32 OrbisSaveDataBlockSize = 32768; // 32 KiB + +constexpr auto SAVE_ICON_SIZE = ImVec2{152.0f, 85.0f}; +constexpr auto SAVE_ICON_PADDING = ImVec2{8.0f, 2.0f}; + +static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; +constexpr auto FOOTER_HEIGHT = BUTTON_SIZE.y + 15.0f; +static constexpr float PROGRESS_BAR_WIDTH{0.8f}; + +static ::Core::FileSys::MntPoints* g_mnt = + Common::Singleton<::Core::FileSys::MntPoints>::Instance(); + +static std::string SpaceSizeToString(size_t size) { + std::string size_str; + if (size > 1024 * 1024 * 1024) { // > 1GB + size_str = fmt::format("{:.2f} GB", double(size / 1024 / 1024) / 1024.0f); + } else if (size > 1024 * 1024) { // > 1MB + size_str = fmt::format("{:.2f} MB", double(size / 1024) / 1024.0f); + } else if (size > 1024) { // > 1KB + size_str = fmt::format("{:.2f} KB", double(size) / 1024.0f); + } else { + size_str = fmt::format("{} B", size); + } + return size_str; +} + +namespace Libraries::SaveData::Dialog { + +void SaveDialogResult::CopyTo(OrbisSaveDataDialogResult& result) const { + result.mode = this->mode; + result.result = this->result; + result.buttonId = this->button_id; + if (mode == SaveDataDialogMode::LIST || ElfInfo::Instance().FirmwareVer() >= ElfInfo::FW_45) { + if (result.dirName != nullptr) { + result.dirName->data.FromString(this->dir_name); + } + if (result.param != nullptr && this->param.GetString(SaveParams::MAINTITLE).has_value()) { + result.param->FromSFO(this->param); + } + } + result.userData = this->user_data; +} + +SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) { + this->mode = param.mode; + this->type = param.dispType; + this->user_data = param.userData; + if (param.optionParam != nullptr) { + this->enable_back = {param.optionParam->back == OptionBack::ENABLE}; + } + + const auto& game_serial = Common::ElfInfo::Instance().GameSerial(); + + const auto item = param.items; + this->user_id = item->userId; + + if (item->titleId == nullptr) { + this->title_id = game_serial; + } else { + this->title_id = item->titleId->data.to_string(); + } + + if (item->dirName != nullptr) { + for (u32 i = 0; i < item->dirNameNum; i++) { + const auto dir_name = item->dirName[i].data.to_view(); + + if (dir_name.empty()) { + continue; + } + + auto dir_path = SaveInstance::MakeDirSavePath(user_id, title_id, dir_name); + + auto param_sfo_path = dir_path / "sce_sys" / "param.sfo"; + if (!std::filesystem::exists(param_sfo_path)) { + continue; + } + + PSF param_sfo; + param_sfo.Open(param_sfo_path); + + auto last_write = param_sfo.GetLastWrite(); +#ifdef _WIN32 + auto utc_time = std::chrono::file_clock::to_utc(last_write); +#else + auto utc_time = std::chrono::file_clock::to_sys(last_write); +#endif + std::string date_str = fmt::format("{:%d %b, %Y %R}", utc_time); + + size_t size = Common::FS::GetDirectorySize(dir_path); + std::string size_str = SpaceSizeToString(size); + + auto icon_path = dir_path / "sce_sys" / "icon0.png"; + RefCountedTexture icon; + if (std::filesystem::exists(icon_path)) { + icon = RefCountedTexture::DecodePngFile(icon_path); + } + + bool is_corrupted = std::filesystem::exists(dir_path / "sce_sys" / "corrupted"); + + this->save_list.emplace_back(Item{ + .dir_name = std::string{dir_name}, + .icon = icon, + + .title = + std::string{param_sfo.GetString(SaveParams::MAINTITLE).value_or("Unknown")}, + .subtitle = std::string{param_sfo.GetString(SaveParams::SUBTITLE).value_or("")}, + .details = std::string{param_sfo.GetString(SaveParams::DETAIL).value_or("")}, + .date = date_str, + .size = size_str, + .last_write = param_sfo.GetLastWrite(), + .pfo = param_sfo, + .is_corrupted = is_corrupted, + }); + } + } + + if (type == DialogType::SAVE && item->newItem != nullptr) { + RefCountedTexture icon; + std::string title{"New Save"}; + + const auto new_item = item->newItem; + if (new_item->iconBuf && new_item->iconSize) { + auto buf = (u8*)new_item->iconBuf; + icon = RefCountedTexture::DecodePngTexture({buf, buf + new_item->iconSize}); + } else { + const auto& src_icon = g_mnt->GetHostPath("/app0/sce_sys/save_data.png"); + if (std::filesystem::exists(src_icon)) { + icon = RefCountedTexture::DecodePngFile(src_icon); + } + } + if (new_item->title != nullptr) { + title = std::string{new_item->title}; + } + + this->new_item = Item{ + .dir_name = "", + .icon = icon, + .title = title, + }; + } + + if (item->focusPos != FocusPos::DIRNAME) { + this->focus_pos = item->focusPos; + } else { + this->focus_pos = item->focusPosDirName->data.to_string(); + } + this->style = item->itemStyle; + + switch (mode) { + case SaveDataDialogMode::USER_MSG: { + this->state = UserState{param}; + } break; + case SaveDataDialogMode::SYSTEM_MSG: + this->state = SystemState{*this, param}; + break; + case SaveDataDialogMode::ERROR_CODE: { + this->state = ErrorCodeState{param}; + } break; + case SaveDataDialogMode::PROGRESS_BAR: { + this->state = ProgressBarState{*this, param}; + } break; + default: + break; + } +} + +SaveDialogState::UserState::UserState(const OrbisSaveDataDialogParam& param) { + auto& user = *param.userMsgParam; + this->type = user.buttonType; + this->msg_type = user.msgType; + this->msg = user.msg != nullptr ? std::string{user.msg} : std::string{}; +} + +SaveDialogState::SystemState::SystemState(const SaveDialogState& state, + const OrbisSaveDataDialogParam& param) { +#define M(save, load, del) \ + if (type == DialogType::SAVE) \ + this->msg = save; \ + else if (type == DialogType::LOAD) \ + this->msg = load; \ + else if (type == DialogType::DELETE) \ + this->msg = del; \ + else \ + UNREACHABLE() + + auto type = param.dispType; + auto& sys = *param.sysMsgParam; + switch (sys.msgType) { + case SystemMessageType::NODATA: { + return_cancel = true; + this->msg = "There is no saved data"; + } break; + case SystemMessageType::CONFIRM: + show_no = true; + M("Do you want to save?", "Do you want to load this saved data?", + "Do you want to delete this saved data?"); + break; + case SystemMessageType::OVERWRITE: + show_no = true; + M("Do you want to overwrite the existing saved data?", "##UNKNOWN##", "##UNKNOWN##"); + break; + case SystemMessageType::NOSPACE: + return_cancel = true; + M(fmt::format( + "There is not enough space to save the data. To continue {} free space is required.", + SpaceSizeToString(sys.value * OrbisSaveDataBlockSize)), + "##UNKNOWN##", "##UNKNOWN##"); + break; + case SystemMessageType::PROGRESS: + hide_ok = true; + show_cancel = state.enable_back.value_or(false); + M("Saving...", "Loading...", "Deleting..."); + break; + case SystemMessageType::FILE_CORRUPTED: + return_cancel = true; + this->msg = "The saved data is corrupted."; + break; + case SystemMessageType::FINISHED: + return_cancel = true; + M("Saved successfully.", "Loading complete.", "Deletion complete."); + break; + case SystemMessageType::NOSPACE_CONTINUABLE: + return_cancel = true; + M(fmt::format("There is not enough space to save the data. {} free space is required.", + SpaceSizeToString(sys.value * OrbisSaveDataBlockSize)), + "##UNKNOWN##", "##UNKNOWN##"); + break; + case SystemMessageType::CORRUPTED_AND_DELETED: { + show_cancel = state.enable_back.value_or(true); + const char* msg1 = "The saved data is corrupted and will be deleted."; + M(msg1, msg1, "##UNKNOWN##"); + } break; + case SystemMessageType::CORRUPTED_AND_CREATED: { + show_cancel = state.enable_back.value_or(true); + const char* msg2 = "The saved data is corrupted. This saved data will be deleted and a new " + "one will be created."; + M(msg2, msg2, "##UNKNOWN##"); + } break; + case SystemMessageType::CORRUPTED_AND_RESTORE: { + show_cancel = state.enable_back.value_or(true); + const char* msg3 = + "The saved data is corrupted. The data that was backed up by the system will be " + "restored."; + M(msg3, msg3, "##UNKNOWN##"); + } break; + case SystemMessageType::TOTAL_SIZE_EXCEEDED: + M("Cannot create more saved data", "##UNKNOWN##", "##UNKNOWN##"); + break; + default: + msg = fmt::format("Unknown message type: {}", magic_enum::enum_name(sys.msgType)); + break; + } + +#undef M +} + +SaveDialogState::ErrorCodeState::ErrorCodeState(const OrbisSaveDataDialogParam& param) { + auto& err = *param.errorCodeParam; + constexpr auto NOT_FOUND = 0x809F0008; + constexpr auto BROKEN = 0x809F000F; + switch (err.errorCode) { + case NOT_FOUND: + this->error_msg = "There is not saved data."; + break; + case BROKEN: + this->error_msg = "The data is corrupted."; + break; + default: + this->error_msg = fmt::format("An error has occurred. ({:X})", err.errorCode); + break; + } +} +SaveDialogState::ProgressBarState::ProgressBarState(const SaveDialogState& state, + const OrbisSaveDataDialogParam& param) { + static auto fw_ver = ElfInfo::Instance().FirmwareVer(); + + this->progress = 0; + + auto& bar = *param.progressBarParam; + + if (bar.msg != nullptr) { + this->msg = std::string{bar.msg}; + } else { + switch (bar.sysMsgType) { + case ProgressSystemMessageType::INVALID: + this->msg = ""; + break; + case ProgressSystemMessageType::PROGRESS: + switch (state.type) { + case DialogType::SAVE: + this->msg = "Saving..."; + break; + case DialogType::LOAD: + this->msg = "Loading..."; + break; + case DialogType::DELETE: + this->msg = "Deleting..."; + break; + } + break; + case ProgressSystemMessageType::RESTORE: + this->msg = "Restoring saved data..."; + break; + } + } +} + +SaveDialogUi::SaveDialogUi(SaveDialogState* state, Status* status, SaveDialogResult* result) + : state(state), status(status), result(result) { + if (status && *status == Status::RUNNING) { + first_render = true; + AddLayer(this); + } +} + +SaveDialogUi::~SaveDialogUi() { + Finish(ButtonId::INVALID); +} + +SaveDialogUi::SaveDialogUi(SaveDialogUi&& other) noexcept + : Layer(other), state(other.state), status(other.status), result(other.result) { + std::scoped_lock lock(draw_mutex, other.draw_mutex); + other.state = nullptr; + other.status = nullptr; + other.result = nullptr; + if (status && *status == Status::RUNNING) { + first_render = true; + AddLayer(this); + } +} + +SaveDialogUi& SaveDialogUi::operator=(SaveDialogUi other) { + std::scoped_lock lock(draw_mutex, other.draw_mutex); + using std::swap; + swap(state, other.state); + swap(status, other.status); + swap(result, other.result); + if (status && *status == Status::RUNNING) { + first_render = true; + AddLayer(this); + } + return *this; +} + +void SaveDialogUi::Finish(ButtonId buttonId, Result r) { + std::unique_lock lock(draw_mutex); + if (result) { + result->mode = this->state->mode; + result->result = r; + result->button_id = buttonId; + result->user_data = this->state->user_data; + if (state && state->mode != SaveDataDialogMode::LIST && !state->save_list.empty()) { + result->dir_name = state->save_list.front().dir_name; + } + } + if (status) { + *status = Status::FINISHED; + } + RemoveLayer(this); +} + +void SaveDialogUi::Draw() { + std::unique_lock lock{draw_mutex}; + + if (status == nullptr || *status != Status::RUNNING || state == nullptr) { + return; + } + + const auto& ctx = *GetCurrentContext(); + const auto& io = ctx.IO; + + ImVec2 window_size; + + if (state->GetMode() == SaveDataDialogMode::LIST) { + window_size = ImVec2{ + std::min(io.DisplaySize.x - 200.0f, 1100.0f), + std::min(io.DisplaySize.y - 100.0f, 700.0f), + }; + } else { + window_size = ImVec2{ + std::min(io.DisplaySize.x, 600.0f), + std::min(io.DisplaySize.y, 300.0f), + }; + } + + CentralizeWindow(); + SetNextWindowSize(window_size); + SetNextWindowCollapsed(false); + if (first_render || !io.NavActive) { + SetNextWindowFocus(); + } + if (Begin("Save Data Dialog##SaveDataDialog", nullptr, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings)) { + DrawPrettyBackground(); + + Separator(); + // Draw title bigger + SetWindowFontScale(1.7f); + switch (state->type) { + case DialogType::SAVE: + TextUnformatted("Save"); + break; + case DialogType::LOAD: + TextUnformatted("Load"); + break; + case DialogType::DELETE: + TextUnformatted("Delete"); + break; + } + SetWindowFontScale(1.0f); + Separator(); + + BeginGroup(); + switch (state->GetMode()) { + case SaveDataDialogMode::LIST: + DrawList(); + break; + case SaveDataDialogMode::USER_MSG: + DrawUser(); + break; + case SaveDataDialogMode::SYSTEM_MSG: + DrawSystemMessage(); + break; + case SaveDataDialogMode::ERROR_CODE: + DrawErrorCode(); + break; + case SaveDataDialogMode::PROGRESS_BAR: + DrawProgressBar(); + break; + default: + TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "!!!Unknown dialog mode!!!"); + } + EndGroup(); + } + End(); + + first_render = false; + if (*status == Status::FINISHED) { + if (state) { + *state = SaveDialogState{}; + } + state = nullptr; + status = nullptr; + result = nullptr; + } +} + +void SaveDialogUi::DrawItem(int _id, const SaveDialogState::Item& item, bool clickable) { + constexpr auto text_spacing = 0.95f; + + auto& ctx = *GetCurrentContext(); + auto& window = *ctx.CurrentWindow; + + auto content_region_avail = GetContentRegionAvail(); + const auto outer_pos = window.DC.CursorPos; + const auto pos = outer_pos + SAVE_ICON_PADDING; + + const ImVec2 size = {content_region_avail.x - SAVE_ICON_PADDING.x, + SAVE_ICON_SIZE.y + SAVE_ICON_PADDING.y}; + const ImRect bb{outer_pos, outer_pos + size + SAVE_ICON_PADDING}; + + const ImGuiID id = GetID(_id); + + ItemSize(size + ImVec2{0.0f, SAVE_ICON_PADDING.y * 2.0f}); + if (!ItemAdd(bb, id)) { + return; + } + + window.DrawList->AddRectFilled(bb.Min + SAVE_ICON_PADDING, bb.Max - SAVE_ICON_PADDING, + GetColorU32(ImVec4{0.3f})); + + bool hovered = false; + if (clickable) { + bool held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held); + if (pressed) { + result->dir_name = item.dir_name; + result->param = item.pfo; + Finish(ButtonId::INVALID); + } + RenderNavHighlight(bb, id); + } + + if (item.icon) { + auto texture = item.icon.GetTexture(); + window.DrawList->AddImage(texture.im_id, pos, pos + SAVE_ICON_SIZE); + } else { + // placeholder + window.DrawList->AddRectFilled(pos, pos + SAVE_ICON_SIZE, GetColorU32(ImVec4{0.7f})); + } + + auto pos_x = SAVE_ICON_SIZE.x + 5.0f; + auto pos_y = 2.0f; + + if (!item.title.empty()) { + const char* begin = &item.title.front(); + const char* end = &item.title.back() + 1; + SetWindowFontScale(1.5f); + RenderText(pos + ImVec2{pos_x, pos_y}, begin, end, false); + pos_y += ctx.FontSize * text_spacing; + } + SetWindowFontScale(1.1f); + + if (item.is_corrupted) { + pos_y -= ctx.FontSize * text_spacing * 0.3f; + const auto bright = (int)std::abs(std::sin(ctx.Time) * 0.15f * 255.0f); + PushStyleColor(ImGuiCol_Text, IM_COL32(bright + 216, bright, bright, 0xFF)); + RenderText(pos + ImVec2{pos_x, pos_y}, "Corrupted", nullptr, false); + PopStyleColor(); + pos_y += ctx.FontSize * text_spacing * 0.8f; + } + + if (state->style == ItemStyle::TITLE_SUBTITLE_DATESIZE) { + if (!item.subtitle.empty()) { + const char* begin = &item.subtitle.front(); + const char* end = &item.subtitle.back() + 1; + RenderText(pos + ImVec2{pos_x, pos_y}, begin, end, false); + } + pos_y += ctx.FontSize * text_spacing; + } + + { + float width = 0.0f; + if (!item.date.empty()) { + const char* d_begin = &item.date.front(); + const char* d_end = &item.date.back() + 1; + width = CalcTextSize(d_begin, d_end).x + 15.0f; + RenderText(pos + ImVec2{pos_x, pos_y}, d_begin, d_end, false); + } + if (!item.size.empty()) { + const char* s_begin = &item.size.front(); + const char* s_end = &item.size.back() + 1; + RenderText(pos + ImVec2{pos_x + width, pos_y}, s_begin, s_end, false); + } + pos_y += ctx.FontSize * text_spacing; + } + + if (state->style == ItemStyle::TITLE_DATASIZE_SUBTITLE && !item.subtitle.empty()) { + const char* begin = &item.subtitle.front(); + const char* end = &item.subtitle.back() + 1; + RenderText(pos + ImVec2{pos_x, pos_y}, begin, end, false); + } + + SetWindowFontScale(1.0f); + + if (hovered) { + window.DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border), 0.0f, 0, 2.0f); + } +} + +void SaveDialogUi::DrawList() { + auto availableSize = GetContentRegionAvail(); + + constexpr auto footerHeight = 30.0f; + availableSize.y -= footerHeight + 1.0f; + + BeginChild("##ScrollingRegion", availableSize, ImGuiChildFlags_NavFlattened); + int i = 0; + if (state->new_item.has_value()) { + DrawItem(i++, state->new_item.value()); + } + for (const auto& item : state->save_list) { + DrawItem(i++, item); + } + if (first_render) { // Make the initial focus + if (std::holds_alternative(state->focus_pos)) { + auto pos = std::get(state->focus_pos); + if (pos == FocusPos::LISTHEAD || pos == FocusPos::DATAHEAD) { + SetItemCurrentNavFocus(GetID(0)); + } else if (pos == FocusPos::LISTTAIL || pos == FocusPos::DATATAIL) { + SetItemCurrentNavFocus(GetID(std::max(i - 1, 0))); + } else { // Date + int idx = 0; + int max_idx = 0; + bool is_min = pos == FocusPos::DATAOLDEST; + std::filesystem::file_time_type max_write{}; + if (state->new_item.has_value()) { + idx++; + } + for (const auto& item : state->save_list) { + if (item.last_write > max_write ^ is_min) { + max_write = item.last_write; + max_idx = idx; + } + idx++; + } + SetItemCurrentNavFocus(GetID(max_idx)); + } + } else if (std::holds_alternative(state->focus_pos)) { + auto dir_name = std::get(state->focus_pos); + if (dir_name.empty()) { + SetItemCurrentNavFocus(GetID(0)); + } else { + int idx = 0; + if (state->new_item.has_value()) { + if (dir_name == state->new_item->dir_name) { + SetItemCurrentNavFocus(GetID(idx)); + } + idx++; + } + for (const auto& item : state->save_list) { + if (item.dir_name == dir_name) { + SetItemCurrentNavFocus(GetID(idx)); + break; + } + idx++; + } + } + } + } + EndChild(); + + Separator(); + if (state->enable_back.value_or(true)) { + constexpr auto back = "Back"; + constexpr float pad = 7.0f; + const auto txt_size = CalcTextSize(back); + const auto button_size = ImVec2{ + std::max(txt_size.x, 100.0f) + pad * 2.0f, + footerHeight - pad, + }; + SetCursorPosX(GetContentRegionAvail().x - button_size.x); + if (Button(back, button_size)) { + result->dir_name.clear(); + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } + if (IsKeyPressed(ImGuiKey_GamepadFaceRight)) { + SetItemCurrentNavFocus(); + } + } +} + +void SaveDialogUi::DrawUser() { + const auto& user_state = state->GetState(); + const auto btn_type = user_state.type; + + const auto ws = GetWindowSize(); + + if (!state->save_list.empty()) { + DrawItem(0, state->save_list.front(), false); + } else if (state->new_item) { + DrawItem(0, *state->new_item, false); + } + + auto has_btn = btn_type != ButtonType::NONE; + ImVec2 btn_space; + if (has_btn) { + btn_space = ImVec2{0.0f, FOOTER_HEIGHT}; + } + + const auto& msg = user_state.msg; + if (!msg.empty()) { + const char* begin = &msg.front(); + const char* end = &msg.back() + 1; + if (user_state.msg_type == UserMessageType::ERROR) { + PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f)); + // Maybe make the text bold? + } + DrawCenteredText(begin, end, GetContentRegionAvail() - btn_space); + if (user_state.msg_type == UserMessageType::ERROR) { + PopStyleColor(); + } + } + + if (has_btn) { + int count = 1; + if (btn_type == ButtonType::YESNO || btn_type == ButtonType::OKCANCEL) { + ++count; + } + + SetCursorPos({ + ws.x / 2.0f - BUTTON_SIZE.x / 2.0f * static_cast(count), + ws.y - FOOTER_HEIGHT + 5.0f, + }); + + BeginGroup(); + if (btn_type == ButtonType::YESNO) { + if (Button("Yes", BUTTON_SIZE)) { + Finish(ButtonId::YES); + } + SameLine(); + if (Button("No", BUTTON_SIZE)) { + if (ElfInfo::Instance().FirmwareVer() < ElfInfo::FW_45) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } else { + Finish(ButtonId::NO); + } + } + if (first_render || IsKeyPressed(ImGuiKey_GamepadFaceRight)) { + SetItemCurrentNavFocus(); + } + } else { + if (Button("OK", BUTTON_SIZE)) { + if (btn_type == ButtonType::OK && + ElfInfo::Instance().FirmwareVer() < ElfInfo::FW_45) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } else { + Finish(ButtonId::OK); + } + } + if (first_render) { + SetItemCurrentNavFocus(); + } + if (btn_type == ButtonType::OKCANCEL) { + SameLine(); + if (Button("Cancel", BUTTON_SIZE)) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } + if (IsKeyPressed(ImGuiKey_GamepadFaceRight)) { + SetItemCurrentNavFocus(); + } + } + } + EndGroup(); + } +} + +void SaveDialogUi::DrawSystemMessage() { + const auto& sys_state = state->GetState(); + + if (!state->save_list.empty()) { + DrawItem(0, state->save_list.front(), false); + } else if (state->new_item) { + DrawItem(0, *state->new_item, false); + } + + const auto ws = GetWindowSize(); + const auto& msg = sys_state.msg; + if (!msg.empty()) { + const char* begin = &msg.front(); + const char* end = &msg.back() + 1; + DrawCenteredText(begin, end, GetContentRegionAvail() - ImVec2{0.0f, FOOTER_HEIGHT}); + } + int count = 1; + if (sys_state.hide_ok) { + --count; + } + if (sys_state.show_no || sys_state.show_cancel) { + ++count; + } + + SetCursorPos({ + ws.x / 2.0f - BUTTON_SIZE.x / 2.0f * static_cast(count), + ws.y - FOOTER_HEIGHT + 5.0f, + }); + BeginGroup(); + if (Button(sys_state.show_no ? "Yes" : "OK", BUTTON_SIZE)) { + if (sys_state.return_cancel && ElfInfo::Instance().FirmwareVer() < ElfInfo::FW_45) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } else { + Finish(ButtonId::YES); + } + } + SameLine(); + if (sys_state.show_no) { + if (Button("No", BUTTON_SIZE)) { + if (ElfInfo::Instance().FirmwareVer() < ElfInfo::FW_45) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } else { + Finish(ButtonId::NO); + } + } + } else if (sys_state.show_cancel) { + if (Button("Cancel", BUTTON_SIZE)) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } + } + if (first_render || IsKeyPressed(ImGuiKey_GamepadFaceRight)) { + SetItemCurrentNavFocus(); + } + EndGroup(); +} + +void SaveDialogUi::DrawErrorCode() { + const auto& err_state = state->GetState(); + + if (!state->save_list.empty()) { + DrawItem(0, state->save_list.front(), false); + } else if (state->new_item) { + DrawItem(0, *state->new_item, false); + } + + const auto ws = GetWindowSize(); + const auto& msg = err_state.error_msg; + if (!msg.empty()) { + const char* begin = &msg.front(); + const char* end = &msg.back() + 1; + DrawCenteredText(begin, end, GetContentRegionAvail() - ImVec2{0.0f, FOOTER_HEIGHT}); + } + + SetCursorPos({ + ws.x / 2.0f - BUTTON_SIZE.x / 2.0f, + ws.y - FOOTER_HEIGHT + 5.0f, + }); + if (Button("OK", BUTTON_SIZE)) { + if (ElfInfo::Instance().FirmwareVer() < ElfInfo::FW_45) { + Finish(ButtonId::INVALID, Result::USER_CANCELED); + } else { + Finish(ButtonId::OK); + } + } + if (first_render) { + SetItemCurrentNavFocus(); + } +} + +void SaveDialogUi::DrawProgressBar() { + const auto& bar_state = state->GetState(); + + const auto ws = GetWindowSize(); + + if (!state->save_list.empty()) { + DrawItem(0, state->save_list.front(), false); + } else if (state->new_item) { + DrawItem(0, *state->new_item, false); + } + + const auto& msg = bar_state.msg; + if (!msg.empty()) { + const char* begin = &msg.front(); + const char* end = &msg.back() + 1; + DrawCenteredText(begin, end, GetContentRegionAvail() - ImVec2{0.0f, FOOTER_HEIGHT}); + } + + SetCursorPos({ + ws.x * ((1 - PROGRESS_BAR_WIDTH) / 2.0f), + ws.y - FOOTER_HEIGHT + 5.0f, + }); + + ProgressBar(static_cast(bar_state.progress) / 100.0f, + {PROGRESS_BAR_WIDTH * ws.x, BUTTON_SIZE.y}); +} +}; // namespace Libraries::SaveData::Dialog \ No newline at end of file diff --git a/src/core/libraries/save_data/dialog/savedatadialog_ui.h b/src/core/libraries/save_data/dialog/savedatadialog_ui.h new file mode 100644 index 000000000..3f414470f --- /dev/null +++ b/src/core/libraries/save_data/dialog/savedatadialog_ui.h @@ -0,0 +1,319 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include + +#include "core/file_format/psf.h" +#include "core/libraries/save_data/savedata.h" +#include "core/libraries/system/commondialog.h" +#include "imgui/imgui_layer.h" +#include "imgui/imgui_texture.h" + +namespace Libraries::SaveData::Dialog { + +using OrbisUserServiceUserId = s32; + +enum class SaveDataDialogMode : u32 { + INVALID = 0, + LIST = 1, + USER_MSG = 2, + SYSTEM_MSG = 3, + ERROR_CODE = 4, + PROGRESS_BAR = 5, +}; + +enum class DialogType : u32 { + SAVE = 1, + LOAD = 2, + DELETE = 3, +}; + +enum class DialogAnimation : u32 { + ON = 0, + OFF = 1, +}; + +enum class ButtonId : u32 { + INVALID = 0, + OK = 1, + YES = 1, + NO = 2, +}; + +enum class ButtonType : u32 { + OK = 0, + YESNO = 1, + NONE = 2, + OKCANCEL = 3, +}; + +enum class UserMessageType : u32 { + NORMAL = 0, + ERROR = 1, +}; + +enum class FocusPos : u32 { + LISTHEAD = 0, + LISTTAIL = 1, + DATAHEAD = 2, + DATATAIL = 3, + DATALTATEST = 4, + DATAOLDEST = 5, + DIRNAME = 6, +}; + +enum class ItemStyle : u32 { + TITLE_DATASIZE_SUBTITLE = 0, + TITLE_SUBTITLE_DATESIZE = 1, + TITLE_DATESIZE = 2, +}; + +enum class SystemMessageType : u32 { + NODATA = 1, + CONFIRM = 2, + OVERWRITE = 3, + NOSPACE = 4, + PROGRESS = 5, + FILE_CORRUPTED = 6, + FINISHED = 7, + NOSPACE_CONTINUABLE = 8, + CORRUPTED_AND_DELETED = 10, + CORRUPTED_AND_CREATED = 11, + CORRUPTED_AND_RESTORE = 13, + TOTAL_SIZE_EXCEEDED = 14, +}; + +enum class ProgressBarType : u32 { + PERCENTAGE = 0, +}; + +enum class ProgressSystemMessageType : u32 { + INVALID = 0, + PROGRESS = 1, + RESTORE = 2, +}; + +enum class OptionBack : u32 { + ENABLE = 0, + DISABLE = 1, +}; + +enum class OrbisSaveDataDialogProgressBarTarget : u32 { + DEFAULT = 0, +}; + +struct AnimationParam { + DialogAnimation userOK; + DialogAnimation userCancel; + std::array _reserved; +}; + +struct SaveDialogNewItem { + const char* title; + void* iconBuf; + size_t iconSize; + std::array _reserved; +}; + +struct SaveDialogItems { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + u32 dirNameNum; + s32 : 32; + const SaveDialogNewItem* newItem; + FocusPos focusPos; + s32 : 32; + const OrbisSaveDataDirName* focusPosDirName; + ItemStyle itemStyle; + std::array _reserved; +}; + +struct UserMessageParam { + ButtonType buttonType; + UserMessageType msgType; + const char* msg; + std::array _reserved; +}; + +struct SystemMessageParam { + SystemMessageType msgType; + s32 : 32; + u64 value; + std::array _reserved; +}; + +struct ErrorCodeParam { + u32 errorCode; + std::array _reserved; +}; + +struct ProgressBarParam { + ProgressBarType barType; + s32 : 32; + const char* msg; + ProgressSystemMessageType sysMsgType; + std::array _reserved; +}; + +struct OptionParam { + OptionBack back; + std::array _reserved; +}; + +struct OrbisSaveDataDialogParam { + CommonDialog::BaseParam baseParam; + s32 size; + SaveDataDialogMode mode; + DialogType dispType; + s32 : 32; + AnimationParam* animParam; + SaveDialogItems* items; + UserMessageParam* userMsgParam; + SystemMessageParam* sysMsgParam; + ErrorCodeParam* errorCodeParam; + ProgressBarParam* progressBarParam; + void* userData; + OptionParam* optionParam; + std::array _reserved; +}; + +struct OrbisSaveDataDialogResult { + SaveDataDialogMode mode{}; + CommonDialog::Result result{}; + ButtonId buttonId{}; + s32 : 32; + OrbisSaveDataDirName* dirName; + OrbisSaveDataParam* param; + void* userData; + std::array _reserved; +}; + +struct SaveDialogResult { + SaveDataDialogMode mode{}; + CommonDialog::Result result{CommonDialog::Result::OK}; + ButtonId button_id{ButtonId::INVALID}; + std::string dir_name{}; + PSF param{}; + void* user_data{}; + + void CopyTo(OrbisSaveDataDialogResult& result) const; +}; + +class SaveDialogState { + friend class SaveDialogUi; + +public: + struct UserState { + ButtonType type{}; + UserMessageType msg_type{}; + std::string msg{}; + + UserState(const OrbisSaveDataDialogParam& param); + }; + struct SystemState { + std::string msg{}; + bool hide_ok{}; + bool show_no{}; // Yes instead of OK + bool show_cancel{}; + + bool return_cancel{}; + + SystemState(const SaveDialogState& state, const OrbisSaveDataDialogParam& param); + }; + struct ErrorCodeState { + std::string error_msg{}; + + ErrorCodeState(const OrbisSaveDataDialogParam& param); + }; + struct ProgressBarState { + std::string msg{}; + u32 progress{}; + + ProgressBarState(const SaveDialogState& state, const OrbisSaveDataDialogParam& param); + }; + + struct Item { + std::string dir_name{}; + ImGui::RefCountedTexture icon{}; + + std::string title{}; + std::string subtitle{}; + std::string details{}; + std::string date{}; + std::string size{}; + + std::filesystem::file_time_type last_write{}; + PSF pfo{}; + bool is_corrupted{}; + }; + +private: + SaveDataDialogMode mode{}; + DialogType type{}; + void* user_data{}; + std::optional enable_back{}; + + OrbisUserServiceUserId user_id{}; + std::string title_id{}; + std::vector save_list{}; + std::variant focus_pos{std::monostate{}}; + ItemStyle style{}; + + std::optional new_item{}; + + std::variant state{ + std::monostate{}}; + +public: + explicit SaveDialogState(const OrbisSaveDataDialogParam& param); + + SaveDialogState() = default; + + [[nodiscard]] SaveDataDialogMode GetMode() const { + return mode; + } + + template + [[nodiscard]] T& GetState() { + return std::get(state); + } +}; + +class SaveDialogUi final : public ImGui::Layer { + bool first_render{false}; + SaveDialogState* state{}; + CommonDialog::Status* status{}; + SaveDialogResult* result{}; + + std::recursive_mutex draw_mutex{}; + +public: + explicit SaveDialogUi(SaveDialogState* state = nullptr, CommonDialog::Status* status = nullptr, + SaveDialogResult* result = nullptr); + + ~SaveDialogUi() override; + SaveDialogUi(const SaveDialogUi& other) = delete; + SaveDialogUi(SaveDialogUi&& other) noexcept; + SaveDialogUi& operator=(SaveDialogUi other); + + void Finish(ButtonId buttonId, CommonDialog::Result r = CommonDialog::Result::OK); + + void Draw() override; + +private: + void DrawItem(int id, const SaveDialogState::Item& item, bool clickable = true); + + void DrawList(); + void DrawUser(); + void DrawSystemMessage(); + void DrawErrorCode(); + void DrawProgressBar(); +}; + +}; // namespace Libraries::SaveData::Dialog \ No newline at end of file diff --git a/src/core/libraries/save_data/error_codes.h b/src/core/libraries/save_data/error_codes.h deleted file mode 100644 index a4a1b7a5a..000000000 --- a/src/core/libraries/save_data/error_codes.h +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -constexpr int ORBIS_SAVE_DATA_ERROR_PARAMETER = 0x809F0000; -constexpr int ORBIS_SAVE_DATA_ERROR_NOT_INITIALIZED = 0x809F0001; -constexpr int ORBIS_SAVE_DATA_ERROR_OUT_OF_MEMORY = 0x809F0002; -constexpr int ORBIS_SAVE_DATA_ERROR_BUSY = 0x809F0003; -constexpr int ORBIS_SAVE_DATA_ERROR_NOT_MOUNTED = 0x809F0004; -constexpr int ORBIS_SAVE_DATA_ERROR_NO_PERMISSION = 0x809F0005; -constexpr int ORBIS_SAVE_DATA_ERROR_FINGERPRINT_MISMATCH = 0x809F0006; -constexpr int ORBIS_SAVE_DATA_ERROR_EXISTS = 0x809F0007; -constexpr int ORBIS_SAVE_DATA_ERROR_NOT_FOUND = 0x809F0008; -constexpr int ORBIS_SAVE_DATA_ERROR_NO_SPACE_FS = 0x809F000A; -constexpr int ORBIS_SAVE_DATA_ERROR_INTERNAL = 0x809F000B; -constexpr int ORBIS_SAVE_DATA_ERROR_MOUNT_FULL = 0x809F000C; -constexpr int ORBIS_SAVE_DATA_ERROR_BAD_MOUNTED = 0x809F000D; -constexpr int ORBIS_SAVE_DATA_ERROR_FILE_NOT_FOUND = 0x809F000E; -constexpr int ORBIS_SAVE_DATA_ERROR_BROKEN = 0x809F000F; -constexpr int ORBIS_SAVE_DATA_ERROR_INVALID_LOGIN_USER = 0x809F0011; -constexpr int ORBIS_SAVE_DATA_ERROR_MEMORY_NOT_READY = 0x809F0012; -constexpr int ORBIS_SAVE_DATA_ERROR_BACKUP_BUSY = 0x809F0013; -constexpr int ORBIS_SAVE_DATA_ERROR_NOT_REGIST_CALLBACK = 0x809F0015; -constexpr int ORBIS_SAVE_DATA_ERROR_BUSY_FOR_SAVING = 0x809F0016; -constexpr int ORBIS_SAVE_DATA_ERROR_LIMITATION_OVER = 0x809F0017; -constexpr int ORBIS_SAVE_DATA_ERROR_EVENT_BUSY = 0x809F0018; -constexpr int ORBIS_SAVE_DATA_ERROR_PARAMSFO_TRANSFER_TITLE_ID_NOT_FOUND = 0x809F0019; diff --git a/src/core/libraries/save_data/save_backup.cpp b/src/core/libraries/save_data/save_backup.cpp new file mode 100644 index 000000000..da5172b15 --- /dev/null +++ b/src/core/libraries/save_data/save_backup.cpp @@ -0,0 +1,250 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include + +#include "save_backup.h" +#include "save_instance.h" + +#include "common/logging/log.h" +#include "common/logging/log_entry.h" +#include "common/polyfill_thread.h" +#include "common/thread.h" + +constexpr std::string_view sce_sys = "sce_sys"; // system folder inside save +constexpr std::string_view backup_dir = "sce_backup"; // backup folder +constexpr std::string_view backup_dir_tmp = "sce_backup_tmp"; // in-progress backup folder +constexpr std::string_view backup_dir_old = "sce_backup_old"; // previous backup folder + +namespace fs = std::filesystem; + +namespace Libraries::SaveData::Backup { + +static std::jthread g_backup_thread; +static std::counting_semaphore g_backup_thread_semaphore{0}; + +static std::mutex g_backup_running_mutex; + +static std::mutex g_backup_queue_mutex; +static std::deque g_backup_queue; +static std::deque g_result_queue; + +static std::atomic_int g_backup_progress = 0; +static std::atomic g_backup_status = WorkerStatus::NotStarted; + +static void backup(const std::filesystem::path& dir_name) { + std::unique_lock lk{g_backup_running_mutex}; + if (!fs::exists(dir_name)) { + return; + } + + const auto backup_dir = dir_name / ::backup_dir; + const auto backup_dir_tmp = dir_name / ::backup_dir_tmp; + const auto backup_dir_old = dir_name / ::backup_dir_old; + + fs::remove_all(backup_dir_tmp); + fs::remove_all(backup_dir_old); + + std::vector backup_files; + for (const auto& entry : fs::directory_iterator(dir_name)) { + const auto filename = entry.path().filename(); + if (filename != ::backup_dir) { + backup_files.push_back(entry.path()); + } + } + + g_backup_progress = 0; + + int total_count = static_cast(backup_files.size()); + int current_count = 0; + + fs::create_directory(backup_dir_tmp); + for (const auto& file : backup_files) { + fs::copy(file, backup_dir_tmp / file.filename(), fs::copy_options::recursive); + current_count++; + g_backup_progress = current_count * 100 / total_count; + } + bool has_existing_backup = fs::exists(backup_dir); + if (has_existing_backup) { + fs::rename(backup_dir, backup_dir_old); + } + fs::rename(backup_dir_tmp, backup_dir); + if (has_existing_backup) { + fs::remove_all(backup_dir_old); + } +} + +static void BackupThreadBody() { + Common::SetCurrentThreadName("shadPS4:SaveData_BackupThread"); + while (g_backup_status != WorkerStatus::Stopping) { + g_backup_status = WorkerStatus::Waiting; + + bool wait; + BackupRequest req; + { + std::scoped_lock lk{g_backup_queue_mutex}; + wait = g_backup_queue.empty(); + if (!wait) { + req = g_backup_queue.front(); + } + } + if (wait) { + g_backup_thread_semaphore.acquire(); + { + std::scoped_lock lk{g_backup_queue_mutex}; + if (g_backup_queue.empty()) { + continue; + } + req = g_backup_queue.front(); + } + } + if (req.save_path.empty()) { + break; + } + g_backup_status = WorkerStatus::Running; + + LOG_INFO(Lib_SaveData, "Backing up the following directory: {}", + fmt::UTF(req.save_path.u8string())); + try { + backup(req.save_path); + } catch (const std::filesystem::filesystem_error& err) { + LOG_ERROR(Lib_SaveData, "Failed to backup {}: {}", fmt::UTF(req.save_path.u8string()), + err.what()); + } + LOG_DEBUG(Lib_SaveData, "Backing up the following directory: {} finished", + fmt::UTF(req.save_path.u8string())); + { + std::scoped_lock lk{g_backup_queue_mutex}; + g_backup_queue.front().done = true; + } + std::this_thread::sleep_for(std::chrono::seconds(5)); // Don't backup too often + { + std::scoped_lock lk{g_backup_queue_mutex}; + g_backup_queue.pop_front(); + g_result_queue.push_back(std::move(req)); + if (g_result_queue.size() > 20) { + g_result_queue.pop_front(); + } + } + } + g_backup_status = WorkerStatus::NotStarted; +} + +void StartThread() { + if (g_backup_status != WorkerStatus::NotStarted) { + return; + } + LOG_DEBUG(Lib_SaveData, "Starting backup thread"); + g_backup_status = WorkerStatus::Waiting; + g_backup_thread = std::jthread{BackupThreadBody}; +} + +void StopThread() { + if (g_backup_status == WorkerStatus::NotStarted || g_backup_status == WorkerStatus::Stopping) { + return; + } + LOG_DEBUG(Lib_SaveData, "Stopping backup thread"); + { + std::scoped_lock lk{g_backup_queue_mutex}; + g_backup_queue.emplace_back(BackupRequest{}); + } + g_backup_thread_semaphore.release(); + g_backup_status = WorkerStatus::Stopping; +} + +bool NewRequest(OrbisUserServiceUserId user_id, std::string_view title_id, + std::string_view dir_name, OrbisSaveDataEventType origin) { + auto save_path = SaveInstance::MakeDirSavePath(user_id, title_id, dir_name); + + if (g_backup_status != WorkerStatus::Waiting && g_backup_status != WorkerStatus::Running) { + LOG_ERROR(Lib_SaveData, "Called backup while status is {}. Backup request to {} ignored", + magic_enum::enum_name(g_backup_status.load()), fmt::UTF(save_path.u8string())); + return false; + } + { + std::scoped_lock lk{g_backup_queue_mutex}; + for (const auto& it : g_backup_queue) { + if (it.dir_name == dir_name) { + LOG_TRACE(Lib_SaveData, "Backup request to {} ignored. Already queued", dir_name); + return false; + } + } + g_backup_queue.push_back(BackupRequest{ + .user_id = user_id, + .title_id = std::string{title_id}, + .dir_name = std::string{dir_name}, + .origin = origin, + .save_path = std::move(save_path), + }); + } + g_backup_thread_semaphore.release(); + return true; +} + +bool Restore(const std::filesystem::path& save_path) { + LOG_INFO(Lib_SaveData, "Restoring backup for {}", fmt::UTF(save_path.u8string())); + std::unique_lock lk{g_backup_running_mutex}; + if (!fs::exists(save_path) || !fs::exists(save_path / backup_dir)) { + return false; + } + for (const auto& entry : fs::directory_iterator(save_path)) { + const auto filename = entry.path().filename(); + if (filename != backup_dir) { + fs::remove_all(entry.path()); + } + } + + for (const auto& entry : fs::directory_iterator(save_path / backup_dir)) { + const auto filename = entry.path().filename(); + fs::copy(entry.path(), save_path / filename, fs::copy_options::recursive); + } + + return true; +} + +WorkerStatus GetWorkerStatus() { + return g_backup_status; +} + +bool IsBackupExecutingFor(const std::filesystem::path& save_path) { + std::scoped_lock lk{g_backup_queue_mutex}; + const auto& it = + std::ranges::find(g_backup_queue, save_path, [](const auto& v) { return v.save_path; }); + return it != g_backup_queue.end() && !it->done; +} + +std::filesystem::path MakeBackupPath(const std::filesystem::path& save_path) { + return save_path / backup_dir; +} + +std::optional PopLastEvent() { + std::scoped_lock lk{g_backup_queue_mutex}; + if (g_result_queue.empty()) { + return std::nullopt; + } + auto req = std::move(g_result_queue.front()); + g_result_queue.pop_front(); + return req; +} + +void PushBackupEvent(BackupRequest&& req) { + std::scoped_lock lk{g_backup_queue_mutex}; + g_result_queue.push_back(std::move(req)); + if (g_result_queue.size() > 20) { + g_result_queue.pop_front(); + } +} + +float GetProgress() { + return static_cast(g_backup_progress) / 100.0f; +} + +void ClearProgress() { + g_backup_progress = 0; +} + +} // namespace Libraries::SaveData::Backup \ No newline at end of file diff --git a/src/core/libraries/save_data/save_backup.h b/src/core/libraries/save_data/save_backup.h new file mode 100644 index 000000000..e49c69f60 --- /dev/null +++ b/src/core/libraries/save_data/save_backup.h @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "common/types.h" + +namespace Libraries::SaveData { + +using OrbisUserServiceUserId = s32; + +namespace Backup { + +enum class WorkerStatus { + NotStarted, + Waiting, + Running, + Stopping, +}; + +enum class OrbisSaveDataEventType : u32 { + UMOUNT_BACKUP = 1, + BACKUP = 2, + SAVE_DATA_MEMORY_SYNC = 3, +}; + +struct BackupRequest { + bool done{}; + + OrbisUserServiceUserId user_id{}; + std::string title_id{}; + std::string dir_name{}; + OrbisSaveDataEventType origin{}; + + std::filesystem::path save_path{}; +}; + +// No problem calling this function if the backup thread is already running +void StartThread(); + +void StopThread(); + +bool NewRequest(OrbisUserServiceUserId user_id, std::string_view title_id, + std::string_view dir_name, OrbisSaveDataEventType origin); + +bool Restore(const std::filesystem::path& save_path); + +WorkerStatus GetWorkerStatus(); + +bool IsBackupExecutingFor(const std::filesystem::path& save_path); + +std::filesystem::path MakeBackupPath(const std::filesystem::path& save_path); + +std::optional PopLastEvent(); + +void PushBackupEvent(BackupRequest&& req); + +float GetProgress(); + +void ClearProgress(); + +} // namespace Backup + +} // namespace Libraries::SaveData diff --git a/src/core/libraries/save_data/save_instance.cpp b/src/core/libraries/save_data/save_instance.cpp new file mode 100644 index 000000000..1127a5452 --- /dev/null +++ b/src/core/libraries/save_data/save_instance.cpp @@ -0,0 +1,232 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include + +#include "common/assert.h" +#include "common/config.h" +#include "common/path_util.h" +#include "common/singleton.h" +#include "core/file_sys/fs.h" +#include "save_instance.h" + +constexpr u32 OrbisSaveDataBlocksMax = 32768; // 1 GiB +constexpr std::string_view sce_sys = "sce_sys"; // system folder inside save +constexpr std::string_view max_block_file_name = "max_block.txt"; + +static Core::FileSys::MntPoints* g_mnt = Common::Singleton::Instance(); + +namespace fs = std::filesystem; + +// clang-format off +static const std::unordered_map default_title = { + {"ja_JP", "セーブデータ"}, + {"en", "Saved Data"}, + {"fr", "Données sauvegardées"}, + {"es_ES", "Datos guardados"}, + {"de", "Gespeicherte Daten"}, + {"it", "Dati salvati"}, + {"nl", "Opgeslagen data"}, + {"pt_PT", "Dados guardados"}, + {"ru", "Сохраненные данные"}, + {"ko_KR", "저장 데이터"}, + {"zh_CN", "保存数据"}, + {"fi", "Tallennetut tiedot"}, + {"sv_SE", "Sparade data"}, + {"da_DK", "Gemte data"}, + {"no_NO", "Lagrede data"}, + {"pl_PL", "Zapisane dane"}, + {"pt_BR", "Dados salvos"}, + {"tr_TR", "Kayıtlı Veriler"}, +}; +// clang-format on + +namespace Libraries::SaveData { + +std::filesystem::path SaveInstance::MakeTitleSavePath(OrbisUserServiceUserId user_id, + std::string_view game_serial) { + return Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / std::to_string(user_id) / + game_serial; +} + +std::filesystem::path SaveInstance::MakeDirSavePath(OrbisUserServiceUserId user_id, + std::string_view game_serial, + std::string_view dir_name) { + return Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / std::to_string(user_id) / + game_serial / dir_name; +} + +int SaveInstance::GetMaxBlocks(const std::filesystem::path& save_path) { + Common::FS::IOFile max_blocks_file{save_path / sce_sys / max_block_file_name, + Common::FS::FileAccessMode::Read}; + int max_blocks = 0; + if (max_blocks_file.IsOpen()) { + max_blocks = std::atoi(max_blocks_file.ReadString(16).c_str()); + } + if (max_blocks <= 0) { + max_blocks = OrbisSaveDataBlocksMax; + } + + return max_blocks; +} + +std::filesystem::path SaveInstance::GetParamSFOPath(const std::filesystem::path& dir_path) { + return dir_path / sce_sys / "param.sfo"; +} + +void SaveInstance::SetupDefaultParamSFO(PSF& param_sfo, std::string dir_name, + std::string game_serial) { + std::string locale = Config::getEmulatorLanguage(); + if (!default_title.contains(locale)) { + locale = "en"; + } + +#define P(type, key, ...) param_sfo.Add##type(std::string{key}, __VA_ARGS__) + // TODO Link with user service + P(Binary, SaveParams::ACCOUNT_ID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}); + P(String, SaveParams::MAINTITLE, default_title.at(locale)); + P(String, SaveParams::SUBTITLE, ""); + P(String, SaveParams::DETAIL, ""); + P(String, SaveParams::SAVEDATA_DIRECTORY, std::move(dir_name)); + P(Integer, SaveParams::SAVEDATA_LIST_PARAM, 0); + P(String, SaveParams::TITLE_ID, std::move(game_serial)); +#undef P +} + +SaveInstance::SaveInstance(int slot_num, OrbisUserServiceUserId user_id, std::string _game_serial, + std::string_view _dir_name, int max_blocks) + : slot_num(slot_num), user_id(user_id), game_serial(std::move(_game_serial)), + dir_name(_dir_name), max_blocks(max_blocks) { + ASSERT(slot_num >= 0 && slot_num < 16); + + save_path = MakeDirSavePath(user_id, game_serial, dir_name); + + const auto sce_sys_path = save_path / sce_sys; + param_sfo_path = sce_sys_path / "param.sfo"; + corrupt_file_path = sce_sys_path / "corrupted"; + + mount_point = "/savedata" + std::to_string(slot_num); + + this->exists = fs::exists(param_sfo_path); + this->mounted = g_mnt->GetMount(mount_point) != nullptr; +} + +SaveInstance::~SaveInstance() { + if (mounted) { + Umount(); + } +} +SaveInstance::SaveInstance(SaveInstance&& other) noexcept { + if (this == &other) + return; + *this = std::move(other); +} + +SaveInstance& SaveInstance::operator=(SaveInstance&& other) noexcept { + if (this == &other) + return *this; + slot_num = other.slot_num; + user_id = other.user_id; + game_serial = std::move(other.game_serial); + dir_name = std::move(other.dir_name); + save_path = std::move(other.save_path); + param_sfo_path = std::move(other.param_sfo_path); + corrupt_file_path = std::move(other.corrupt_file_path); + corrupt_file = std::move(other.corrupt_file); + param_sfo = std::move(other.param_sfo); + mount_point = std::move(other.mount_point); + max_blocks = other.max_blocks; + exists = other.exists; + mounted = other.mounted; + read_only = other.read_only; + + other.mounted = false; + + return *this; +} + +void SaveInstance::SetupAndMount(bool read_only, bool copy_icon, bool ignore_corrupt) { + if (mounted) { + UNREACHABLE_MSG("Save instance is already mounted"); + } + this->exists = fs::exists(param_sfo_path); // check again just in case + if (!exists) { + CreateFiles(); + if (copy_icon) { + const auto& src_icon = g_mnt->GetHostPath("/app0/sce_sys/save_data.png"); + if (fs::exists(src_icon)) { + auto output_icon = GetIconPath(); + if (fs::exists(output_icon)) { + fs::remove(output_icon); + } + fs::copy_file(src_icon, output_icon); + } + } + exists = true; + } else { + if (!ignore_corrupt && fs::exists(corrupt_file_path)) { + throw std::filesystem::filesystem_error( + "Corrupted save data", corrupt_file_path, + std::make_error_code(std::errc::illegal_byte_sequence)); + } + if (!param_sfo.Open(param_sfo_path)) { + throw std::filesystem::filesystem_error( + "Failed to read param.sfo", param_sfo_path, + std::make_error_code(std::errc::illegal_byte_sequence)); + } + } + + if (!ignore_corrupt && !read_only) { + int err = corrupt_file.Open(corrupt_file_path, Common::FS::FileAccessMode::Write); + if (err != 0) { + throw std::filesystem::filesystem_error( + "Failed to open corrupted file", corrupt_file_path, + std::make_error_code(std::errc::illegal_byte_sequence)); + } + } + + max_blocks = GetMaxBlocks(save_path); + + g_mnt->Mount(save_path, mount_point, read_only); + mounted = true; + this->read_only = read_only; +} + +void SaveInstance::Umount() { + if (!mounted) { + UNREACHABLE_MSG("Save instance is not mounted"); + return; + } + mounted = false; + const bool ok = param_sfo.Encode(param_sfo_path); + if (!ok) { + throw std::filesystem::filesystem_error("Failed to write param.sfo", param_sfo_path, + std::make_error_code(std::errc::permission_denied)); + } + param_sfo = PSF(); + + corrupt_file.Close(); + fs::remove(corrupt_file_path); + g_mnt->Unmount(save_path, mount_point); +} + +void SaveInstance::CreateFiles() { + const auto sce_sys_dir = save_path / sce_sys; + fs::create_directories(sce_sys_dir); + + SetupDefaultParamSFO(param_sfo, dir_name, game_serial); + + const bool ok = param_sfo.Encode(param_sfo_path); + if (!ok) { + throw std::filesystem::filesystem_error("Failed to write param.sfo", param_sfo_path, + std::make_error_code(std::errc::permission_denied)); + } + + Common::FS::IOFile max_block{sce_sys_dir / max_block_file_name, + Common::FS::FileAccessMode::Write}; + max_block.WriteString(std::to_string(max_blocks == 0 ? OrbisSaveDataBlocksMax : max_blocks)); +} + +} // namespace Libraries::SaveData \ No newline at end of file diff --git a/src/core/libraries/save_data/save_instance.h b/src/core/libraries/save_data/save_instance.h new file mode 100644 index 000000000..f07011047 --- /dev/null +++ b/src/core/libraries/save_data/save_instance.h @@ -0,0 +1,138 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +#include "common/io_file.h" +#include "core/file_format/psf.h" + +namespace Core::FileSys { +class MntPoints; +} + +namespace Libraries::SaveData { + +// Used constexpr to easily use as string +namespace SaveParams { +constexpr std::string_view ACCOUNT_ID = "ACCOUNT_ID"; +constexpr std::string_view ATTRIBUTE = "ATTRIBUTE"; +constexpr std::string_view CATEGORY = "CATEGORY"; +constexpr std::string_view DETAIL = "DETAIL"; +constexpr std::string_view FORMAT = "FORMAT"; +constexpr std::string_view MAINTITLE = "MAINTITLE"; +constexpr std::string_view PARAMS = "PARAMS"; +constexpr std::string_view SAVEDATA_BLOCKS = "SAVEDATA_BLOCKS"; +constexpr std::string_view SAVEDATA_DIRECTORY = "SAVEDATA_DIRECTORY"; +constexpr std::string_view SAVEDATA_LIST_PARAM = "SAVEDATA_LIST_PARAM"; +constexpr std::string_view SUBTITLE = "SUBTITLE"; +constexpr std::string_view TITLE_ID = "TITLE_ID"; +} // namespace SaveParams + +using OrbisUserServiceUserId = s32; + +class SaveInstance { + int slot_num{}; + int user_id{}; + std::string game_serial; + std::string dir_name; + + std::filesystem::path save_path; + std::filesystem::path param_sfo_path; + std::filesystem::path corrupt_file_path; + + Common::FS::IOFile corrupt_file; + + PSF param_sfo; + std::string mount_point; + + int max_blocks{}; + bool exists{}; + bool mounted{}; + bool read_only{}; + +public: + // Location of all save data for a title + static std::filesystem::path MakeTitleSavePath(OrbisUserServiceUserId user_id, + std::string_view game_serial); + + // Location of a specific save data directory + static std::filesystem::path MakeDirSavePath(OrbisUserServiceUserId user_id, + std::string_view game_serial, + std::string_view dir_name); + + static int GetMaxBlocks(const std::filesystem::path& save_path); + + // Get param.sfo path from a dir_path generated by MakeDirSavePath + static std::filesystem::path GetParamSFOPath(const std::filesystem::path& dir_path); + + static void SetupDefaultParamSFO(PSF& param_sfo, std::string dir_name, std::string game_serial); + + explicit SaveInstance(int slot_num, OrbisUserServiceUserId user_id, std::string game_serial, + std::string_view dir_name, int max_blocks = 0); + + ~SaveInstance(); + + SaveInstance(const SaveInstance& other) = delete; + SaveInstance(SaveInstance&& other) noexcept; + + SaveInstance& operator=(const SaveInstance& other) = delete; + SaveInstance& operator=(SaveInstance&& other) noexcept; + + void SetupAndMount(bool read_only = false, bool copy_icon = false, bool ignore_corrupt = false); + + void Umount(); + + [[nodiscard]] std::filesystem::path GetIconPath() const noexcept { + return save_path / "sce_sys" / "icon0.png"; + } + + [[nodiscard]] bool Exists() const noexcept { + return exists; + } + + [[nodiscard]] OrbisUserServiceUserId GetUserId() const noexcept { + return user_id; + } + + [[nodiscard]] std::string_view GetTitleId() const noexcept { + return game_serial; + } + + [[nodiscard]] const std::string& GetDirName() const noexcept { + return dir_name; + } + + [[nodiscard]] const std::filesystem::path& GetSavePath() const noexcept { + return save_path; + } + + [[nodiscard]] const PSF& GetParamSFO() const noexcept { + return param_sfo; + } + + [[nodiscard]] PSF& GetParamSFO() noexcept { + return param_sfo; + } + + [[nodiscard]] const std::string& GetMountPoint() const noexcept { + return mount_point; + } + + [[nodiscard]] int GetMaxBlocks() const noexcept { + return max_blocks; + } + + [[nodiscard]] bool Mounted() const noexcept { + return mounted; + } + + [[nodiscard]] bool IsReadOnly() const noexcept { + return read_only; + } + + void CreateFiles(); +}; + +} // namespace Libraries::SaveData diff --git a/src/core/libraries/save_data/save_memory.cpp b/src/core/libraries/save_data/save_memory.cpp new file mode 100644 index 000000000..e9ef53761 --- /dev/null +++ b/src/core/libraries/save_data/save_memory.cpp @@ -0,0 +1,287 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "save_memory.h" + +#include +#include +#include +#include +#include + +#include + +#include "common/assert.h" +#include "common/logging/log.h" +#include "common/polyfill_thread.h" +#include "common/singleton.h" +#include "common/thread.h" +#include "core/file_sys/fs.h" +#include "save_instance.h" + +using Common::FS::IOFile; +namespace fs = std::filesystem; + +constexpr std::string_view sce_sys = "sce_sys"; // system folder inside save +constexpr std::string_view DirnameSaveDataMemory = "sce_sdmemory"; +constexpr std::string_view FilenameSaveDataMemory = "memory.dat"; + +namespace Libraries::SaveData::SaveMemory { + +static Core::FileSys::MntPoints* g_mnt = Common::Singleton::Instance(); + +static OrbisUserServiceUserId g_user_id{}; +static std::string g_game_serial{}; +static std::filesystem::path g_save_path{}; +static std::filesystem::path g_param_sfo_path{}; +static PSF g_param_sfo; + +static bool g_save_memory_initialized = false; +static std::mutex g_saving_memory_mutex; +static std::vector g_save_memory; + +static std::filesystem::path g_icon_path; +static std::vector g_icon_memory; + +static std::condition_variable g_trigger_save_memory; +static std::atomic_bool g_saving_memory = false; +static std::atomic_bool g_save_event = false; +static std::jthread g_save_memory_thread; + +static std::atomic_bool g_memory_dirty = false; +static std::atomic_bool g_param_dirty = false; +static std::atomic_bool g_icon_dirty = false; + +static void SaveFileSafe(void* buf, size_t count, const std::filesystem::path& path) { + const auto& dir = path.parent_path(); + const auto& name = path.filename(); + const auto tmp_path = dir / (name.string() + ".tmp"); + + IOFile file(tmp_path, Common::FS::FileAccessMode::Write); + file.WriteRaw(buf, count); + file.Close(); + + fs::remove(path); + fs::rename(tmp_path, path); +} + +[[noreturn]] void SaveThreadLoop() { + Common::SetCurrentThreadName("shadPS4:SaveData_SaveDataMemoryThread"); + std::mutex mtx; + while (true) { + { + std::unique_lock lk{mtx}; + g_trigger_save_memory.wait(lk); + } + // Save the memory + g_saving_memory = true; + std::scoped_lock lk{g_saving_memory_mutex}; + try { + LOG_DEBUG(Lib_SaveData, "Saving save data memory {}", fmt::UTF(g_save_path.u8string())); + + if (g_memory_dirty) { + g_memory_dirty = false; + SaveFileSafe(g_save_memory.data(), g_save_memory.size(), + g_save_path / FilenameSaveDataMemory); + } + if (g_param_dirty) { + g_param_dirty = false; + static std::vector buf; + g_param_sfo.Encode(buf); + SaveFileSafe(buf.data(), buf.size(), g_param_sfo_path); + } + if (g_icon_dirty) { + g_icon_dirty = false; + SaveFileSafe(g_icon_memory.data(), g_icon_memory.size(), g_icon_path); + } + + if (g_save_event) { + Backup::PushBackupEvent(Backup::BackupRequest{ + .user_id = g_user_id, + .title_id = g_game_serial, + .dir_name = std::string{DirnameSaveDataMemory}, + .origin = Backup::OrbisSaveDataEventType::SAVE_DATA_MEMORY_SYNC, + .save_path = g_save_path, + }); + g_save_event = false; + } + } catch (const fs::filesystem_error& e) { + LOG_ERROR(Lib_SaveData, "Failed to save save data memory: {}", e.what()); + MsgDialog::ShowMsgDialog(MsgDialog::MsgDialogState{ + MsgDialog::MsgDialogState::UserState{ + .type = MsgDialog::ButtonType::OK, + .msg = fmt::format("Failed to save save data memory.\nCode: <{}>\n{}", + e.code().message(), e.what()), + }, + }); + } + g_saving_memory = false; + } +} + +void SetDirectories(OrbisUserServiceUserId user_id, std::string _game_serial) { + g_user_id = user_id; + g_game_serial = std::move(_game_serial); + g_save_path = SaveInstance::MakeDirSavePath(user_id, g_game_serial, DirnameSaveDataMemory); + g_param_sfo_path = SaveInstance::GetParamSFOPath(g_save_path); + g_param_sfo = PSF(); + g_icon_path = g_save_path / sce_sys / "icon0.png"; +} + +const std::filesystem::path& GetSavePath() { + return g_save_path; +} + +size_t CreateSaveMemory(size_t memory_size) { + size_t existed_size = 0; + + static std::once_flag init_save_thread_flag; + std::call_once(init_save_thread_flag, + [] { g_save_memory_thread = std::jthread{SaveThreadLoop}; }); + + g_save_memory.resize(memory_size); + SaveInstance::SetupDefaultParamSFO(g_param_sfo, std::string{DirnameSaveDataMemory}, + g_game_serial); + + g_save_memory_initialized = true; + + if (!fs::exists(g_param_sfo_path)) { + // Create save memory + fs::create_directories(g_save_path / sce_sys); + + IOFile memory_file{g_save_path / FilenameSaveDataMemory, Common::FS::FileAccessMode::Write}; + bool ok = memory_file.SetSize(memory_size); + if (!ok) { + LOG_ERROR(Lib_SaveData, "Failed to set memory size"); + throw std::filesystem::filesystem_error( + "Failed to set save memory size", g_save_path / FilenameSaveDataMemory, + std::make_error_code(std::errc::no_space_on_device)); + } + memory_file.Close(); + } else { + // Load save memory + + bool ok = g_param_sfo.Open(g_param_sfo_path); + if (!ok) { + LOG_ERROR(Lib_SaveData, "Failed to open SFO at {}", + fmt::UTF(g_param_sfo_path.u8string())); + throw std::filesystem::filesystem_error( + "failed to open SFO", g_param_sfo_path, + std::make_error_code(std::errc::illegal_byte_sequence)); + } + + IOFile memory_file{g_save_path / FilenameSaveDataMemory, Common::FS::FileAccessMode::Read}; + if (!memory_file.IsOpen()) { + LOG_ERROR(Lib_SaveData, "Failed to open save memory"); + throw std::filesystem::filesystem_error( + "failed to open save memory", g_save_path / FilenameSaveDataMemory, + std::make_error_code(std::errc::permission_denied)); + } + size_t save_size = memory_file.GetSize(); + existed_size = save_size; + memory_file.Seek(0); + memory_file.ReadRaw(g_save_memory.data(), std::min(save_size, memory_size)); + memory_file.Close(); + } + + return existed_size; +} + +void SetIcon(void* buf, size_t buf_size) { + if (buf == nullptr) { + const auto& src_icon = g_mnt->GetHostPath("/app0/sce_sys/save_data.png"); + if (fs::exists(src_icon)) { + if (fs::exists(g_icon_path)) { + fs::remove(g_icon_path); + } + fs::copy_file(src_icon, g_icon_path); + } + if (fs::exists(g_icon_path)) { + IOFile file(g_icon_path, Common::FS::FileAccessMode::Read); + size_t size = file.GetSize(); + file.Seek(0); + g_icon_memory.resize(size); + file.ReadRaw(g_icon_memory.data(), size); + file.Close(); + } + } else { + g_icon_memory.resize(buf_size); + std::memcpy(g_icon_memory.data(), buf, buf_size); + IOFile file(g_icon_path, Common::FS::FileAccessMode::Write); + file.Seek(0); + file.WriteRaw(g_icon_memory.data(), buf_size); + file.Close(); + } +} + +void WriteIcon(void* buf, size_t buf_size) { + if (buf_size != g_icon_memory.size()) { + g_icon_memory.resize(buf_size); + } + std::memcpy(g_icon_memory.data(), buf, buf_size); + g_icon_dirty = true; +} + +bool IsSaveMemoryInitialized() { + return g_save_memory_initialized; +} + +PSF& GetParamSFO() { + return g_param_sfo; +} + +std::span GetIcon() { + return {g_icon_memory}; +} + +void SaveSFO(bool sync) { + if (!sync) { + g_param_dirty = true; + return; + } + const bool ok = g_param_sfo.Encode(g_param_sfo_path); + if (!ok) { + LOG_ERROR(Lib_SaveData, "Failed to encode param.sfo"); + throw std::filesystem::filesystem_error("Failed to write param.sfo", g_param_sfo_path, + std::make_error_code(std::errc::permission_denied)); + } +} +bool IsSaving() { + return g_saving_memory; +} + +bool TriggerSaveWithoutEvent() { + if (g_saving_memory) { + return false; + } + g_trigger_save_memory.notify_one(); + return true; +} + +bool TriggerSave() { + if (g_saving_memory) { + return false; + } + g_save_event = true; + g_trigger_save_memory.notify_one(); + return true; +} + +void ReadMemory(void* buf, size_t buf_size, int64_t offset) { + std::scoped_lock lk{g_saving_memory_mutex}; + if (offset + buf_size > g_save_memory.size()) { + UNREACHABLE_MSG("ReadMemory out of bounds"); + } + std::memcpy(buf, g_save_memory.data() + offset, buf_size); +} + +void WriteMemory(void* buf, size_t buf_size, int64_t offset) { + std::scoped_lock lk{g_saving_memory_mutex}; + if (offset + buf_size > g_save_memory.size()) { + g_save_memory.resize(offset + buf_size); + } + std::memcpy(g_save_memory.data() + offset, buf, buf_size); + g_memory_dirty = true; +} + +} // namespace Libraries::SaveData::SaveMemory \ No newline at end of file diff --git a/src/core/libraries/save_data/save_memory.h b/src/core/libraries/save_data/save_memory.h new file mode 100644 index 000000000..04eeaa652 --- /dev/null +++ b/src/core/libraries/save_data/save_memory.h @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include "save_backup.h" + +class PSF; + +namespace Libraries::SaveData { +using OrbisUserServiceUserId = s32; +} + +namespace Libraries::SaveData::SaveMemory { + +void SetDirectories(OrbisUserServiceUserId user_id, std::string game_serial); + +[[nodiscard]] const std::filesystem::path& GetSavePath(); + +// returns the size of the existed save memory +size_t CreateSaveMemory(size_t memory_size); + +// Initialize the icon. Set buf to null to read the standard icon. +void SetIcon(void* buf, size_t buf_size); + +// Update the icon +void WriteIcon(void* buf, size_t buf_size); + +[[nodiscard]] bool IsSaveMemoryInitialized(); + +[[nodiscard]] PSF& GetParamSFO(); + +[[nodiscard]] std::span GetIcon(); + +// Save now or wait for the background thread to save +void SaveSFO(bool sync = false); + +[[nodiscard]] bool IsSaving(); + +bool TriggerSaveWithoutEvent(); + +bool TriggerSave(); + +void ReadMemory(void* buf, size_t buf_size, int64_t offset); + +void WriteMemory(void* buf, size_t buf_size, int64_t offset); + +} // namespace Libraries::SaveData::SaveMemory \ No newline at end of file diff --git a/src/core/libraries/save_data/savedata.cpp b/src/core/libraries/save_data/savedata.cpp index 779c922e6..a2af2f159 100644 --- a/src/core/libraries/save_data/savedata.cpp +++ b/src/core/libraries/save_data/savedata.cpp @@ -4,30 +4,561 @@ #include #include +#include +#include + #include "common/assert.h" +#include "common/cstring.h" +#include "common/elf_info.h" +#include "common/enum.h" #include "common/logging/log.h" #include "common/path_util.h" -#include "common/singleton.h" +#include "common/string_util.h" #include "core/file_format/psf.h" #include "core/file_sys/fs.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/save_data/savedata.h" -#include "error_codes.h" +#include "core/libraries/system/msgdialog.h" +#include "save_backup.h" +#include "save_instance.h" +#include "save_memory.h" + +namespace fs = std::filesystem; +namespace chrono = std::chrono; + +using Common::CString; +using Common::ElfInfo; namespace Libraries::SaveData { -bool is_rw_mode = false; -static constexpr std::string_view g_mount_point = "/savedata0"; // temp mount point (todo) -std::string game_serial; + +enum class Error : u32 { + OK = 0, + USER_SERVICE_NOT_INITIALIZED = 0x80960002, + PARAMETER = 0x809F0000, + NOT_INITIALIZED = 0x809F0001, + OUT_OF_MEMORY = 0x809F0002, + BUSY = 0x809F0003, + NOT_MOUNTED = 0x809F0004, + EXISTS = 0x809F0007, + NOT_FOUND = 0x809F0008, + NO_SPACE_FS = 0x809F000A, + INTERNAL = 0x809F000B, + MOUNT_FULL = 0x809F000C, + BAD_MOUNTED = 0x809F000D, + BROKEN = 0x809F000F, + INVALID_LOGIN_USER = 0x809F0011, + MEMORY_NOT_READY = 0x809F0012, + BACKUP_BUSY = 0x809F0013, + BUSY_FOR_SAVING = 0x809F0016, +}; + +enum class OrbisSaveDataSaveDataMemoryOption : u32 { + NONE = 0, + SET_PARAM = 1 << 0, + DOUBLE_BUFFER = 1 << 1, + UNLOCK_LIMITATIONS = 1 << 2, +}; + +using OrbisUserServiceUserId = s32; +using OrbisSaveDataBlocks = u64; + +constexpr u32 OrbisSaveDataBlockSize = 32768; // 32 KiB +constexpr u32 OrbisSaveDataBlocksMin2 = 96; // 3MiB +constexpr u32 OrbisSaveDataBlocksMax = 32768; // 1 GiB + +// Maximum size for a mount point "/savedataN", where N is a number +constexpr size_t OrbisSaveDataMountPointDataMaxsize = 16; + +constexpr size_t OrbisSaveDataFingerprintDataSize = 65; // Maximum fingerprint size + +enum class OrbisSaveDataMountMode : u32 { + RDONLY = 1 << 0, + RDWR = 1 << 1, + CREATE = 1 << 2, + DESTRUCT_OFF = 1 << 3, + COPY_ICON = 1 << 4, + CREATE2 = 1 << 5, +}; +DECLARE_ENUM_FLAG_OPERATORS(OrbisSaveDataMountMode); + +enum class OrbisSaveDataMountStatus : u32 { + NOTHING = 0, + CREATED = 1, +}; + +enum class OrbisSaveDataParamType : u32 { + ALL = 0, + TITLE = 1, + SUB_TITLE = 2, + DETAIL = 3, + USER_PARAM = 4, + MTIME = 5, +}; + +enum class OrbisSaveDataSortKey : u32 { + DIRNAME = 0, + USER_PARAM = 1, + BLOCKS = 2, + MTIME = 3, + FREE_BLOCKS = 5, +}; + +enum class OrbisSaveDataSortOrder : u32 { + ASCENT = 0, + DESCENT = 1, +}; + +struct OrbisSaveDataFingerprint { + CString data; + std::array _pad; +}; + +struct OrbisSaveDataBackup { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + const OrbisSaveDataFingerprint* param; + std::array _reserved; +}; + +struct OrbisSaveDataCheckBackupData { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + OrbisSaveDataParam* param; + OrbisSaveDataIcon* icon; + std::array _reserved; +}; + +struct OrbisSaveDataDelete { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + u32 _unused; + std::array _reserved; + s32 : 32; +}; + +struct OrbisSaveDataIcon { + void* buf; + size_t bufSize; + size_t dataSize; + std::array _reserved; + + Error LoadIcon(const std::filesystem::path& icon_path) { + try { + const Common::FS::IOFile file(icon_path, Common::FS::FileAccessMode::Read); + dataSize = file.GetSize(); + file.Seek(0); + file.ReadRaw(buf, std::min(bufSize, dataSize)); + } catch (const fs::filesystem_error& e) { + LOG_ERROR(Lib_SaveData, "Failed to load icon: {}", e.what()); + return Error::INTERNAL; + } + return Error::OK; + } +}; + +struct OrbisSaveDataMemoryData { + void* buf; + size_t bufSize; + s64 offset; + u8 _reserved[40]; +}; + +struct OrbisSaveDataMemoryGet2 { + OrbisUserServiceUserId userId; + std::array _pad; + OrbisSaveDataMemoryData* data; + OrbisSaveDataParam* param; + OrbisSaveDataIcon* icon; + std::array _reserved; +}; + +struct OrbisSaveDataMemorySet2 { + OrbisUserServiceUserId userId; + std::array _pad; + const OrbisSaveDataMemoryData* data; + const OrbisSaveDataParam* param; + const OrbisSaveDataIcon* icon; + std::array _reserved; +}; + +struct OrbisSaveDataMemorySetup2 { + OrbisSaveDataSaveDataMemoryOption option; + OrbisUserServiceUserId userId; + size_t memorySize; + size_t iconMemorySize; + // +4.5 + const OrbisSaveDataParam* initParam; + // +4.5 + const OrbisSaveDataIcon* initIcon; + std::array _reserved; +}; + +struct OrbisSaveDataMemorySetupResult { + size_t existedMemorySize; + std::array _reserved; +}; + +struct OrbisSaveDataMemorySync { + OrbisUserServiceUserId userId; + std::array _reserved; +}; + +struct OrbisSaveDataMount2 { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataDirName* dirName; + OrbisSaveDataBlocks blocks; + OrbisSaveDataMountMode mountMode; + std::array _reserved; + s32 : 32; +}; + +struct OrbisSaveDataMount { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + const OrbisSaveDataFingerprint* fingerprint; + OrbisSaveDataBlocks blocks; + OrbisSaveDataMountMode mountMode; + std::array _reserved; +}; + +struct OrbisSaveDataMountInfo { + OrbisSaveDataBlocks blocks; + OrbisSaveDataBlocks freeBlocks; + std::array _reserved; +}; + +struct OrbisSaveDataMountPoint { + CString data; +}; + +struct OrbisSaveDataMountResult { + OrbisSaveDataMountPoint mount_point; + OrbisSaveDataBlocks required_blocks; + u32 _unused; + // +4.5 + OrbisSaveDataMountStatus mount_status; + std::array _reserved; + s32 : 32; +}; + +struct OrbisSaveDataRestoreBackupData { + OrbisUserServiceUserId userId; + s32 : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + const OrbisSaveDataFingerprint* fingerprint; + u32 _unused; + std::array _reserved; + s32 : 32; +}; + +struct OrbisSaveDataTransferringMount { + OrbisUserServiceUserId userId; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + const OrbisSaveDataFingerprint* fingerprint; + std::array _reserved; +}; + +struct OrbisSaveDataDirNameSearchCond { + OrbisUserServiceUserId userId; + int : 32; + const OrbisSaveDataTitleId* titleId; + const OrbisSaveDataDirName* dirName; + OrbisSaveDataSortKey key; + OrbisSaveDataSortOrder order; + std::array _reserved; +}; + +struct OrbisSaveDataSearchInfo { + u64 blocks; + u64 freeBlocks; + std::array _reserved; +}; + +struct OrbisSaveDataDirNameSearchResult { + u32 hitNum; + int : 32; + OrbisSaveDataDirName* dirNames; + u32 dirNamesNum; + // +1.7 + u32 setNum; + // +1.7 + OrbisSaveDataParam* params; + // +2.5 + OrbisSaveDataSearchInfo* infos; + std::array _reserved; + int : 32; +}; + +struct OrbisSaveDataEventParam { // dummy structure + OrbisSaveDataEventParam() = delete; +}; + +using OrbisSaveDataEventType = Backup::OrbisSaveDataEventType; + +struct OrbisSaveDataEvent { + OrbisSaveDataEventType type; + s32 errorCode; + OrbisUserServiceUserId userId; + std::array _pad; + OrbisSaveDataTitleId titleId; + OrbisSaveDataDirName dirName; + std::array _reserved; +}; + +static bool g_initialized = false; +static std::string g_game_serial; +static u32 g_fw_ver; +static std::array, 16> g_mount_slots; + +static void initialize() { + g_initialized = true; + g_game_serial = ElfInfo::Instance().GameSerial(); + g_fw_ver = ElfInfo::Instance().FirmwareVer(); +} + +// game_00other | game*other + +static bool match(std::string_view str, std::string_view pattern) { + auto str_it = str.begin(); + auto pat_it = pattern.begin(); + while (str_it != str.end() && pat_it != pattern.end()) { + if (*pat_it == '%') { // 0 or more wildcard + for (auto str_wild_it = str_it; str_wild_it <= str.end(); ++str_wild_it) { + if (match({str_wild_it, str.end()}, {pat_it + 1, pattern.end()})) { + return true; + } + } + return false; + } + if (*pat_it == '_') { // 1 character wildcard + ++str_it; + ++pat_it; + } else if (*pat_it != *str_it) { + return false; + } + ++str_it; + ++pat_it; + } + return str_it == str.end() && pat_it == pattern.end(); +} + +static Error setNotInitializedError() { + if (g_fw_ver < ElfInfo::FW_20) { + return Error::INTERNAL; + } + if (g_fw_ver < ElfInfo::FW_25) { + return Error::USER_SERVICE_NOT_INITIALIZED; + } + return Error::NOT_INITIALIZED; +} + +static Error saveDataMount(const OrbisSaveDataMount2* mount_info, + OrbisSaveDataMountResult* mount_result, + std::string_view title_id = g_game_serial) { + + if (mount_info->userId < 0) { + return Error::INVALID_LOGIN_USER; + } + if (mount_info->dirName == nullptr) { + LOG_INFO(Lib_SaveData, "called without dirName"); + return Error::PARAMETER; + } + + // check backup status + { + const auto save_path = + SaveInstance::MakeDirSavePath(mount_info->userId, title_id, mount_info->dirName->data); + if (Backup::IsBackupExecutingFor(save_path) && g_fw_ver) { + return Error::BACKUP_BUSY; + } + } + + auto mount_mode = mount_info->mountMode; + const bool is_ro = True(mount_mode & OrbisSaveDataMountMode::RDONLY); + + const bool create = True(mount_mode & OrbisSaveDataMountMode::CREATE); + const bool create_if_not_exist = + True(mount_mode & OrbisSaveDataMountMode::CREATE2) && g_fw_ver >= ElfInfo::FW_45; + ASSERT(!create || !create_if_not_exist); // Can't have both + + const bool copy_icon = True(mount_mode & OrbisSaveDataMountMode::COPY_ICON); + + const bool ignore_corrupt = + True(mount_mode & OrbisSaveDataMountMode::DESTRUCT_OFF) || g_fw_ver < ElfInfo::FW_16; + + const std::string_view dir_name{mount_info->dirName->data}; + + // find available mount point + int slot_num = -1; + for (size_t i = 0; i < g_mount_slots.size(); i++) { + const auto& instance = g_mount_slots[i]; + if (instance.has_value()) { + const auto& slot_name = instance->GetDirName(); + if (slot_name == dir_name) { + return Error::BUSY; + } + } else { + slot_num = static_cast(i); + break; + } + } + if (slot_num == -1) { + return Error::MOUNT_FULL; + } + + SaveInstance save_instance{slot_num, mount_info->userId, std::string{title_id}, dir_name, + (int)mount_info->blocks}; + + if (save_instance.Mounted()) { + UNREACHABLE_MSG("Save instance should not be mounted"); + } + + if (!create && !create_if_not_exist && !save_instance.Exists()) { + return Error::NOT_FOUND; + } + if (create && save_instance.Exists()) { + return Error::EXISTS; + } + + bool to_be_created = !save_instance.Exists(); + + if (to_be_created) { // Check size + + if (mount_info->blocks < OrbisSaveDataBlocksMin2 || + mount_info->blocks > OrbisSaveDataBlocksMax) { + LOG_INFO(Lib_SaveData, "called with invalid block size"); + } + + const auto root_save = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir); + fs::create_directories(root_save); + const auto available = fs::space(root_save).available; + + auto requested_size = mount_info->blocks * OrbisSaveDataBlockSize; + if (requested_size > available) { + mount_result->required_blocks = (requested_size - available) / OrbisSaveDataBlockSize; + return Error::NO_SPACE_FS; + } + } + + try { + save_instance.SetupAndMount(is_ro, copy_icon, ignore_corrupt); + } catch (const fs::filesystem_error& e) { + if (e.code() == std::errc::illegal_byte_sequence) { + LOG_ERROR(Lib_SaveData, "Corrupted save data"); + return Error::BROKEN; + } + if (e.code() == std::errc::no_space_on_device) { + return Error::NO_SPACE_FS; + } + LOG_ERROR(Lib_SaveData, "Failed to mount save data: {}", e.what()); + return Error::INTERNAL; + } + + mount_result->mount_point.data.FromString(save_instance.GetMountPoint()); + + if (g_fw_ver >= ElfInfo::FW_45) { + mount_result->mount_status = create_if_not_exist && to_be_created + ? OrbisSaveDataMountStatus::CREATED + : OrbisSaveDataMountStatus::NOTHING; + } + + g_mount_slots[slot_num].emplace(std::move(save_instance)); + + return Error::OK; +} + +static Error Umount(const OrbisSaveDataMountPoint* mountPoint, bool call_backup = false) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (mountPoint == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "Umount mountPoint:{}", mountPoint->data.to_view()); + const std::string_view mount_point_str{mountPoint->data}; + for (auto& instance : g_mount_slots) { + if (instance.has_value()) { + const auto& slot_name = instance->GetMountPoint(); + if (slot_name == mount_point_str) { + // TODO: check if is busy + instance->Umount(); + if (call_backup) { + Backup::StartThread(); + Backup::NewRequest(instance->GetUserId(), instance->GetTitleId(), + instance->GetDirName(), + OrbisSaveDataEventType::UMOUNT_BACKUP); + } + instance.reset(); + return Error::OK; + } + } + } + return Error::NOT_FOUND; +} + +void OrbisSaveDataParam::FromSFO(const PSF& sfo) { + memset(this, 0, sizeof(OrbisSaveDataParam)); + title.FromString(sfo.GetString(SaveParams::MAINTITLE).value_or("Unknown")); + subTitle.FromString(sfo.GetString(SaveParams::SUBTITLE).value_or("")); + detail.FromString(sfo.GetString(SaveParams::DETAIL).value_or("")); + userParam = sfo.GetInteger(SaveParams::SAVEDATA_LIST_PARAM).value_or(0); + const auto time_since_epoch = sfo.GetLastWrite().time_since_epoch(); + mtime = chrono::duration_cast(time_since_epoch).count(); +} + +void OrbisSaveDataParam::ToSFO(PSF& sfo) const { + sfo.AddString(std::string{SaveParams::MAINTITLE}, std::string{title}, true); + sfo.AddString(std::string{SaveParams::SUBTITLE}, std::string{subTitle}, true); + sfo.AddString(std::string{SaveParams::DETAIL}, std::string{detail}, true); + sfo.AddInteger(std::string{SaveParams::SAVEDATA_LIST_PARAM}, static_cast(userParam), true); +} int PS4_SYSV_ABI sceSaveDataAbort() { LOG_ERROR(Lib_SaveData, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataBackup() { - LOG_ERROR(Lib_SaveData, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataBackup(const OrbisSaveDataBackup* backup) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (backup == nullptr || backup->dirName == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + + const std::string_view dir_name{backup->dirName->data}; + LOG_DEBUG(Lib_SaveData, "called dirName: {}", dir_name); + + std::string_view title{backup->titleId != nullptr ? std::string_view{backup->titleId->data} + : std::string_view{g_game_serial}}; + + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetUserId() == backup->userId && + instance->GetTitleId() == title && instance->GetDirName() == dir_name) { + return Error::BUSY; + } + } + + Backup::StartThread(); + Backup::NewRequest(backup->userId, title, dir_name, OrbisSaveDataEventType::BACKUP); + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataBindPsnAccount() { @@ -50,15 +581,55 @@ int PS4_SYSV_ABI sceSaveDataChangeInternal() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataCheckBackupData(const OrbisSaveDataCheckBackupData* check) { - auto* mnt = Common::Singleton::Instance(); - const auto mount_dir = mnt->GetHostPath(check->dirName->data); - if (!std::filesystem::exists(mount_dir)) { - return ORBIS_SAVE_DATA_ERROR_NOT_FOUND; +Error PS4_SYSV_ABI sceSaveDataCheckBackupData(const OrbisSaveDataCheckBackupData* check) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (check == nullptr || check->dirName == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; } - LOG_INFO(Lib_SaveData, "called = {}", mount_dir.string()); - return ORBIS_OK; + const std::string_view title{check->titleId != nullptr ? std::string_view{check->titleId->data} + : std::string_view{g_game_serial}}; + LOG_DEBUG(Lib_SaveData, "called with titleId={}", title); + + const auto save_path = + SaveInstance::MakeDirSavePath(check->userId, title, check->dirName->data); + + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetSavePath() == save_path) { + return Error::BUSY; + } + } + + if (Backup::IsBackupExecutingFor(save_path)) { + return Error::BACKUP_BUSY; + } + + const auto backup_path = Backup::MakeBackupPath(save_path); + if (!fs::exists(backup_path)) { + return Error::NOT_FOUND; + } + + if (check->param != nullptr) { + PSF sfo; + if (!sfo.Open(backup_path / "sce_sys" / "param.sfo")) { + LOG_ERROR(Lib_SaveData, "Failed to read SFO at {}", fmt::UTF(backup_path.u8string())); + return Error::INTERNAL; + } + check->param->FromSFO(sfo); + } + + if (check->icon != nullptr) { + const auto icon_path = backup_path / "sce_sys" / "icon0.png"; + if (fs::exists(icon_path) && check->icon->LoadIcon(icon_path) != Error::OK) { + return Error::INTERNAL; + } + } + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataCheckBackupDataForCdlg() { @@ -96,9 +667,14 @@ int PS4_SYSV_ABI sceSaveDataCheckSaveDataVersionLatest() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataClearProgress() { - LOG_ERROR(Lib_SaveData, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataClearProgress() { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + LOG_DEBUG(Lib_SaveData, "called"); + Backup::ClearProgress(); + return Error::OK; } int PS4_SYSV_ABI sceSaveDataCopy5() { @@ -146,15 +722,35 @@ int PS4_SYSV_ABI sceSaveDataDebugTarget() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataDelete(const OrbisSaveDataDelete* del) { - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(1) / game_serial / std::string(del->dirName->data); - LOG_INFO(Lib_SaveData, "called: dirname = {}, mount_dir = {}", (char*)del->dirName->data, - mount_dir.string()); - if (std::filesystem::exists(mount_dir) && std::filesystem::is_directory(mount_dir)) { - std::filesystem::remove_all(mount_dir); +Error PS4_SYSV_ABI sceSaveDataDelete(const OrbisSaveDataDelete* del) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); } - return ORBIS_OK; + if (del == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + const std::string_view dirName{del->dirName->data}; + LOG_DEBUG(Lib_SaveData, "called dirName: {}", dirName); + if (dirName.empty()) { + return Error::PARAMETER; + } + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetDirName() == dirName) { + return Error::BUSY; + } + } + const auto save_path = SaveInstance::MakeDirSavePath(del->userId, g_game_serial, dirName); + try { + if (fs::exists(save_path)) { + fs::remove_all(save_path); + } + } catch (const fs::filesystem_error& e) { + LOG_ERROR(Lib_SaveData, "Failed to delete save data: {}", e.what()); + return Error::INTERNAL; + } + return Error::OK; } int PS4_SYSV_ABI sceSaveDataDelete5() { @@ -177,89 +773,123 @@ int PS4_SYSV_ABI sceSaveDataDeleteUser() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataDirNameSearch(const OrbisSaveDataDirNameSearchCond* cond, - OrbisSaveDataDirNameSearchResult* result) { - if (cond == nullptr || result == nullptr) - return ORBIS_SAVE_DATA_ERROR_PARAMETER; - LOG_INFO(Lib_SaveData, "Number of directories = {}", result->dirNamesNum); - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(cond->userId) / game_serial; - if (!mount_dir.empty() && std::filesystem::exists(mount_dir)) { - int maxDirNum = result->dirNamesNum; // Games set a maximum of directories to search for - int i = 0; +Error PS4_SYSV_ABI sceSaveDataDirNameSearch(const OrbisSaveDataDirNameSearchCond* cond, + OrbisSaveDataDirNameSearchResult* result) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (cond == nullptr || result == nullptr || cond->key > OrbisSaveDataSortKey::FREE_BLOCKS || + cond->order > OrbisSaveDataSortOrder::DESCENT) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called"); + const std::string_view title_id{cond->titleId == nullptr + ? std::string_view{g_game_serial} + : std::string_view{cond->titleId->data}}; + const auto save_path = SaveInstance::MakeTitleSavePath(cond->userId, title_id); - if (cond->dirName == nullptr || std::string_view(cond->dirName->data).empty()) { - // Look for all dirs if no dir is provided. - for (const auto& entry : std::filesystem::directory_iterator(mount_dir)) { - if (i >= maxDirNum) - break; - - if (std::filesystem::is_directory(entry.path()) && - entry.path().filename().string() != "sdmemory") { - // sceSaveDataDirNameSearch does not search for dataMemory1/2 dirs. - // copy dir name to be used by sceSaveDataMount in read mode. - strncpy(result->dirNames[i].data, entry.path().filename().string().c_str(), 32); - i++; - result->hitNum = i; - result->dirNamesNum = i; - result->setNum = i; - } - } - } else { - // Game checks for a specific directory. - LOG_INFO(Lib_SaveData, "dirName = {}", cond->dirName->data); - - // Games can pass '%' as a wildcard - // e.g. `SAVELIST%` searches for all folders with names starting with `SAVELIST` - std::string baseName(cond->dirName->data); - u64 wildcardPos = baseName.find('%'); - if (wildcardPos != std::string::npos) { - baseName = baseName.substr(0, wildcardPos); - } - - for (const auto& entry : std::filesystem::directory_iterator(mount_dir)) { - if (i >= maxDirNum) - break; - - if (std::filesystem::is_directory(entry.path())) { - std::string dirName = entry.path().filename().string(); - - if (wildcardPos != std::string::npos) { - if (dirName.compare(0, baseName.size(), baseName) != 0) { - continue; - } - } else if (wildcardPos == std::string::npos && dirName != cond->dirName->data) { - continue; - } - - strncpy(result->dirNames[i].data, cond->dirName->data, 32); - - i++; - result->hitNum = i; - result->dirNamesNum = i; - result->setNum = i; - } - } - } - - if (result->params != nullptr) { - Common::FS::IOFile file(mount_dir / cond->dirName->data / "param.txt", - Common::FS::FileAccessMode::Read); - if (file.IsOpen()) { - file.ReadRaw((void*)result->params, sizeof(OrbisSaveDataParam)); - file.Close(); - } - } - } else { + if (!fs::exists(save_path)) { result->hitNum = 0; - result->dirNamesNum = 0; - result->setNum = 0; + if (g_fw_ver >= ElfInfo::FW_17) { + result->setNum = 0; + } + return Error::OK; } - if (result->infos != nullptr) { - result->infos->blocks = ORBIS_SAVE_DATA_BLOCK_SIZE; - result->infos->freeBlocks = ORBIS_SAVE_DATA_BLOCK_SIZE; + + std::vector dir_list; + + for (const auto& path : fs::directory_iterator{save_path}) { + auto dir_name = path.path().filename().string(); + // skip non-directories, sce_* and directories without param.sfo + if (fs::is_directory(path) && !dir_name.starts_with("sce_") && + fs::exists(SaveInstance::GetParamSFOPath(path))) { + dir_list.push_back(dir_name); + } } - return ORBIS_OK; + if (cond->dirName != nullptr) { + // Filter names + const auto pat = Common::ToLower(std::string_view{cond->dirName->data}); + if (!pat.empty()) { + std::erase_if(dir_list, [&](const std::string& dir_name) { + return !match(Common::ToLower(dir_name), pat); + }); + } + } + + std::unordered_map map_dir_sfo; + std::unordered_map map_max_blocks; + std::unordered_map map_free_size; + + for (const auto& dir_name : dir_list) { + const auto dir_path = SaveInstance::MakeDirSavePath(cond->userId, title_id, dir_name); + const auto sfo_path = SaveInstance::GetParamSFOPath(dir_path); + PSF sfo; + if (!sfo.Open(sfo_path)) { + LOG_ERROR(Lib_SaveData, "Failed to read SFO: {}", fmt::UTF(sfo_path.u8string())); + ASSERT_MSG(false, "Failed to read SFO"); + } + map_dir_sfo.emplace(dir_name, std::move(sfo)); + + size_t size = Common::FS::GetDirectorySize(dir_path); + size_t total = SaveInstance::GetMaxBlocks(dir_path); + map_free_size.emplace(dir_name, total - size / OrbisSaveDataBlockSize); + map_max_blocks.emplace(dir_name, total); + } + +#define PROJ(x) [&](const auto& v) { return x; } + switch (cond->key) { + case OrbisSaveDataSortKey::DIRNAME: + std::ranges::stable_sort(dir_list); + break; + case OrbisSaveDataSortKey::USER_PARAM: + std::ranges::stable_sort( + dir_list, {}, + PROJ(map_dir_sfo.at(v).GetInteger(SaveParams::SAVEDATA_LIST_PARAM).value_or(0))); + break; + case OrbisSaveDataSortKey::BLOCKS: + std::ranges::stable_sort(dir_list, {}, PROJ(map_max_blocks.at(v))); + break; + case OrbisSaveDataSortKey::FREE_BLOCKS: + std::ranges::stable_sort(dir_list, {}, PROJ(map_free_size.at(v))); + break; + case OrbisSaveDataSortKey::MTIME: + std::ranges::stable_sort(dir_list, {}, PROJ(map_dir_sfo.at(v).GetLastWrite())); + break; + } +#undef PROJ + + if (cond->order == OrbisSaveDataSortOrder::DESCENT) { + std::ranges::reverse(dir_list); + } + + size_t max_count = std::min(static_cast(result->dirNamesNum), dir_list.size()); + if (g_fw_ver >= ElfInfo::FW_17) { + result->hitNum = dir_list.size(); + result->setNum = max_count; + } else { + result->hitNum = max_count; + } + + for (size_t i = 0; i < max_count; i++) { + auto& name_data = result->dirNames[i].data; + name_data.FromString(dir_list[i]); + + if (g_fw_ver >= ElfInfo::FW_17 && result->params != nullptr) { + auto& sfo = map_dir_sfo.at(dir_list[i]); + auto& param_data = result->params[i]; + param_data.FromSFO(sfo); + } + + if (g_fw_ver >= ElfInfo::FW_25 && result->infos != nullptr) { + auto& info = result->infos[i]; + info.blocks = map_max_blocks.at(dir_list[i]); + info.freeBlocks = map_free_size.at(dir_list[i]); + } + } + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataDirNameSearchInternal() { @@ -322,15 +952,30 @@ int PS4_SYSV_ABI sceSaveDataGetEventInfo() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataGetEventResult(const OrbisSaveDataEventParam* eventParam, - OrbisSaveDataEvent* event) { - // eventParam can be 0/null. - if (event == nullptr) - return ORBIS_SAVE_DATA_ERROR_NOT_INITIALIZED; +Error PS4_SYSV_ABI sceSaveDataGetEventResult(const OrbisSaveDataEventParam*, + OrbisSaveDataEvent* event) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (event == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_TRACE(Lib_SaveData, "called"); - LOG_INFO(Lib_SaveData, "called: Todo."); - event->userId = 1; - return ORBIS_OK; + auto last_event = Backup::PopLastEvent(); + if (!last_event.has_value()) { + return Error::NOT_FOUND; + } + + event->type = last_event->origin; + event->errorCode = 0; + event->userId = last_event->user_id; + event->titleId.data.FromString(last_event->title_id); + event->dirName.data.FromString(last_event->dir_name); + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataGetFormat() { @@ -343,65 +988,119 @@ int PS4_SYSV_ABI sceSaveDataGetMountedSaveDataCount() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataGetMountInfo(const OrbisSaveDataMountPoint* mountPoint, - OrbisSaveDataMountInfo* info) { - LOG_INFO(Lib_SaveData, "called"); - info->blocks = ORBIS_SAVE_DATA_BLOCKS_MAX; - info->freeBlocks = ORBIS_SAVE_DATA_BLOCKS_MAX; - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataGetMountInfo(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataMountInfo* info) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (mountPoint == nullptr || info == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called"); + const std::string_view mount_point_str{mountPoint->data}; + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetMountPoint() == mount_point_str) { + const u32 blocks = instance->GetMaxBlocks(); + const u64 size = Common::FS::GetDirectorySize(instance->GetSavePath()); + info->blocks = blocks; + info->freeBlocks = blocks - size / OrbisSaveDataBlockSize; + return Error::OK; + } + } + return Error::NOT_MOUNTED; } -int PS4_SYSV_ABI sceSaveDataGetParam(const OrbisSaveDataMountPoint* mountPoint, - const OrbisSaveDataParamType paramType, void* paramBuf, - const size_t paramBufSize, size_t* gotSize) { +Error PS4_SYSV_ABI sceSaveDataGetParam(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataParamType paramType, void* paramBuf, + size_t paramBufSize, size_t* gotSize) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (paramType > OrbisSaveDataParamType::MTIME || paramBuf == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called: paramType = {}", magic_enum::enum_name(paramType)); + const PSF* param_sfo = nullptr; - if (mountPoint == nullptr) - return ORBIS_SAVE_DATA_ERROR_PARAMETER; - - auto* mnt = Common::Singleton::Instance(); - const auto mount_dir = mnt->GetHostPath(mountPoint->data); - Common::FS::IOFile file(mount_dir / "param.txt", Common::FS::FileAccessMode::Read); - OrbisSaveDataParam params; - file.Read(params); - - LOG_INFO(Lib_SaveData, "called"); - - switch (paramType) { - case ORBIS_SAVE_DATA_PARAM_TYPE_ALL: { - memcpy(paramBuf, ¶ms, sizeof(OrbisSaveDataParam)); - *gotSize = sizeof(OrbisSaveDataParam); - } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_TITLE: { - std::memcpy(paramBuf, ¶ms.title, ORBIS_SAVE_DATA_TITLE_MAXSIZE); - *gotSize = ORBIS_SAVE_DATA_TITLE_MAXSIZE; - } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_SUB_TITLE: { - std::memcpy(paramBuf, ¶ms.subTitle, ORBIS_SAVE_DATA_SUBTITLE_MAXSIZE); - *gotSize = ORBIS_SAVE_DATA_SUBTITLE_MAXSIZE; - } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_DETAIL: { - std::memcpy(paramBuf, ¶ms.detail, ORBIS_SAVE_DATA_DETAIL_MAXSIZE); - *gotSize = ORBIS_SAVE_DATA_DETAIL_MAXSIZE; - } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_USER_PARAM: { - std::memcpy(paramBuf, ¶ms.userParam, sizeof(u32)); - *gotSize = sizeof(u32); - } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_MTIME: { - std::memcpy(paramBuf, ¶ms.mtime, sizeof(time_t)); - *gotSize = sizeof(time_t); - } break; - default: { - UNREACHABLE_MSG("Unknown Param = {}", paramType); - } break; + const std::string_view mount_point_str{mountPoint->data}; + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetMountPoint() == mount_point_str) { + param_sfo = &instance->GetParamSFO(); + break; + } + } + if (param_sfo == nullptr) { + return Error::NOT_MOUNTED; } - return ORBIS_OK; + switch (paramType) { + case OrbisSaveDataParamType::ALL: { + const auto param = static_cast(paramBuf); + ASSERT(paramBufSize == sizeof(OrbisSaveDataParam)); + param->FromSFO(*param_sfo); + if (gotSize != nullptr) { + *gotSize = sizeof(OrbisSaveDataParam); + } + break; + } + case OrbisSaveDataParamType::TITLE: + case OrbisSaveDataParamType::SUB_TITLE: + case OrbisSaveDataParamType::DETAIL: { + const auto param = static_cast(paramBuf); + std::string_view key; + if (paramType == OrbisSaveDataParamType::TITLE) { + key = SaveParams::MAINTITLE; + } else if (paramType == OrbisSaveDataParamType::SUB_TITLE) { + key = SaveParams::SUBTITLE; + } else if (paramType == OrbisSaveDataParamType::DETAIL) { + key = SaveParams::DETAIL; + } else { + UNREACHABLE(); + } + const size_t s = param_sfo->GetString(key).value_or("").copy(param, paramBufSize - 1); + param[s] = '\0'; // null terminate + if (gotSize != nullptr) { + *gotSize = s + 1; + } + } break; + case OrbisSaveDataParamType::USER_PARAM: { + const auto param = static_cast(paramBuf); + *param = param_sfo->GetInteger(SaveParams::SAVEDATA_LIST_PARAM).value_or(0); + if (gotSize != nullptr) { + *gotSize = sizeof(u32); + } + } break; + case OrbisSaveDataParamType::MTIME: { + const auto param = static_cast(paramBuf); + const auto last_write = param_sfo->GetLastWrite().time_since_epoch(); + *param = chrono::duration_cast(last_write).count(); + if (gotSize != nullptr) { + *gotSize = sizeof(time_t); + } + } break; + default: + UNREACHABLE(); + } + + return Error::OK; } -int PS4_SYSV_ABI sceSaveDataGetProgress() { - LOG_ERROR(Lib_SaveData, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataGetProgress(float* progress) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (progress == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called"); + *progress = Backup::GetProgress(); + return Error::OK; } int PS4_SYSV_ABI sceSaveDataGetSaveDataCount() { @@ -409,44 +1108,56 @@ int PS4_SYSV_ABI sceSaveDataGetSaveDataCount() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataGetSaveDataMemory(const u32 userId, void* buf, const size_t bufSize, - const int64_t offset) { - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(userId) / game_serial / "sdmemory/save_mem1.sav"; - - Common::FS::IOFile file(mount_dir, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - file.Seek(offset); - size_t nbytes = file.ReadRaw(buf, bufSize); - LOG_INFO(Lib_SaveData, "called: bufSize = {}, offset = {}", bufSize, offset, nbytes); - - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataGetSaveDataMemory(const OrbisUserServiceUserId userId, void* buf, + const size_t bufSize, const int64_t offset) { + LOG_DEBUG(Lib_SaveData, "Redirecting to sceSaveDataGetSaveDataMemory2"); + OrbisSaveDataMemoryData data{}; + data.buf = buf; + data.bufSize = bufSize; + data.offset = offset; + OrbisSaveDataMemoryGet2 param{}; + param.userId = userId; + param.data = &data; + param.param = nullptr; + param.icon = nullptr; + return sceSaveDataGetSaveDataMemory2(¶m); } -int PS4_SYSV_ABI sceSaveDataGetSaveDataMemory2(OrbisSaveDataMemoryGet2* getParam) { - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(getParam->userId) / game_serial / "sdmemory"; - if (getParam == nullptr) - return ORBIS_SAVE_DATA_ERROR_PARAMETER; - if (getParam->data != nullptr) { - Common::FS::IOFile file(mount_dir / "save_mem2.sav", Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - file.Seek(getParam->data->offset); - file.ReadRaw(getParam->data->buf, getParam->data->bufSize); - LOG_INFO(Lib_SaveData, "called: bufSize = {}, offset = {}", getParam->data->bufSize, - getParam->data->offset); +Error PS4_SYSV_ABI sceSaveDataGetSaveDataMemory2(OrbisSaveDataMemoryGet2* getParam) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (getParam == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + if (!SaveMemory::IsSaveMemoryInitialized()) { + LOG_INFO(Lib_SaveData, "called without save memory initialized"); + return Error::MEMORY_NOT_READY; + } + if (SaveMemory::IsSaving()) { + LOG_TRACE(Lib_SaveData, "called while saving"); + return Error::BUSY_FOR_SAVING; + } + LOG_DEBUG(Lib_SaveData, "called"); + auto data = getParam->data; + if (data != nullptr) { + SaveMemory::ReadMemory(data->buf, data->bufSize, data->offset); + } + auto param = getParam->param; + if (param != nullptr) { + param->FromSFO(SaveMemory::GetParamSFO()); + } + auto icon = getParam->icon; + if (icon != nullptr) { + auto icon_mem = SaveMemory::GetIcon(); + size_t total = std::min(icon->bufSize, icon_mem.size()); + std::memcpy(icon->buf, icon_mem.data(), total); + icon->dataSize = total; } - if (getParam->param != nullptr) { - Common::FS::IOFile file(mount_dir / "param.txt", Common::FS::FileAccessMode::Read); - file.ReadRaw(getParam->param, sizeof(OrbisSaveDataParam)); - } - - return ORBIS_OK; + return Error::OK; } int PS4_SYSV_ABI sceSaveDataGetSaveDataRootDir() { @@ -474,25 +1185,22 @@ int PS4_SYSV_ABI sceSaveDataGetUpdatedDataCount() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataInitialize() { - LOG_INFO(Lib_SaveData, "called"); - static auto* param_sfo = Common::Singleton::Instance(); - game_serial = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataInitialize(void*) { + LOG_DEBUG(Lib_SaveData, "called"); + initialize(); + return Error::OK; } -int PS4_SYSV_ABI sceSaveDataInitialize2() { - LOG_INFO(Lib_SaveData, "called"); - static auto* param_sfo = Common::Singleton::Instance(); - game_serial = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataInitialize2(void*) { + LOG_DEBUG(Lib_SaveData, "called"); + initialize(); + return Error::OK; } -int PS4_SYSV_ABI sceSaveDataInitialize3() { - LOG_INFO(Lib_SaveData, "called"); - static auto* param_sfo = Common::Singleton::Instance(); - game_serial = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataInitialize3(void*) { + LOG_DEBUG(Lib_SaveData, "called"); + initialize(); + return Error::OK; } int PS4_SYSV_ABI sceSaveDataInitializeForCdlg() { @@ -510,101 +1218,69 @@ int PS4_SYSV_ABI sceSaveDataIsMounted() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataLoadIcon(const OrbisSaveDataMountPoint* mountPoint, - OrbisSaveDataIcon* icon) { - auto* mnt = Common::Singleton::Instance(); - const auto mount_dir = mnt->GetHostPath(mountPoint->data); - LOG_INFO(Lib_SaveData, "called: dir = {}", mount_dir.string()); - - if (icon != nullptr) { - Common::FS::IOFile file(mount_dir / "save_data.png", Common::FS::FileAccessMode::Read); - icon->bufSize = file.GetSize(); - file.ReadRaw(icon->buf, icon->bufSize); +Error PS4_SYSV_ABI sceSaveDataLoadIcon(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataIcon* icon) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); } - return ORBIS_OK; + if (mountPoint == nullptr || icon == nullptr || icon->buf == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called"); + std::filesystem::path path; + const std::string_view mount_point_str{mountPoint->data}; + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetMountPoint() == mount_point_str) { + path = instance->GetIconPath(); + break; + } + } + if (path.empty()) { + return Error::NOT_MOUNTED; + } + if (!fs::exists(path)) { + return Error::NOT_FOUND; + } + + return icon->LoadIcon(path); } -s32 saveDataMount(u32 user_id, char* dir_name, u32 mount_mode, - OrbisSaveDataMountResult* mount_result) { - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(user_id) / game_serial / dir_name; - auto* mnt = Common::Singleton::Instance(); - switch (mount_mode) { - case ORBIS_SAVE_DATA_MOUNT_MODE_RDONLY: - case ORBIS_SAVE_DATA_MOUNT_MODE_RDWR: - case ORBIS_SAVE_DATA_MOUNT_MODE_RDWR | ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF: - case ORBIS_SAVE_DATA_MOUNT_MODE_RDONLY | ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF: { - is_rw_mode = (mount_mode == ORBIS_SAVE_DATA_MOUNT_MODE_RDWR) ? true : false; - if (!std::filesystem::exists(mount_dir)) { - return ORBIS_SAVE_DATA_ERROR_NOT_FOUND; - } - mount_result->mount_status = 0; - g_mount_point.copy(mount_result->mount_point.data, 16); - mnt->Mount(mount_dir, mount_result->mount_point.data); - } break; - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_RDONLY: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR | - ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR | - ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF | - ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR | - ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF | ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: { - if (std::filesystem::exists(mount_dir)) { - return ORBIS_SAVE_DATA_ERROR_EXISTS; - } - if (std::filesystem::create_directories(mount_dir)) { - g_mount_point.copy(mount_result->mount_point.data, 16); - mnt->Mount(mount_dir, mount_result->mount_point.data); - mount_result->mount_status = 1; - } - } break; - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR | - ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: - case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR | - ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF | ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: { - if (!std::filesystem::exists(mount_dir)) { - std::filesystem::create_directories(mount_dir); - } - g_mount_point.copy(mount_result->mount_point.data, 16); - mnt->Mount(mount_dir, mount_result->mount_point.data); - mount_result->mount_status = 1; - } break; - default: - UNREACHABLE_MSG("Unknown mount mode = {}", mount_mode); +Error PS4_SYSV_ABI sceSaveDataMount(const OrbisSaveDataMount* mount, + OrbisSaveDataMountResult* mount_result) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); } - mount_result->required_blocks = 0; + if (mount == nullptr && mount->dirName != nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called dirName: {}, mode: {:0b}, blocks: {}", + mount->dirName->data.to_view(), (int)mount->mountMode, mount->blocks); - return ORBIS_OK; + OrbisSaveDataMount2 mount_info{}; + mount_info.userId = mount->userId; + mount_info.dirName = mount->dirName; + mount_info.mountMode = mount->mountMode; + mount_info.blocks = mount->blocks; + return saveDataMount(&mount_info, mount_result); } -s32 PS4_SYSV_ABI sceSaveDataMount(const OrbisSaveDataMount* mount, - OrbisSaveDataMountResult* mount_result) { - if (mount == nullptr) { - return ORBIS_SAVE_DATA_ERROR_PARAMETER; +Error PS4_SYSV_ABI sceSaveDataMount2(const OrbisSaveDataMount2* mount, + OrbisSaveDataMountResult* mount_result) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); } - LOG_INFO(Lib_SaveData, "called: dirName = {}, mode = {}, blocks = {}", mount->dir_name->data, - mount->mount_mode, mount->blocks); - return saveDataMount(mount->user_id, (char*)mount->dir_name->data, mount->mount_mode, - mount_result); -} - -s32 PS4_SYSV_ABI sceSaveDataMount2(const OrbisSaveDataMount2* mount, - OrbisSaveDataMountResult* mount_result) { - if (mount == nullptr) { - return ORBIS_SAVE_DATA_ERROR_PARAMETER; + if (mount == nullptr && mount->dirName != nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; } - LOG_INFO(Lib_SaveData, "called: dirName = {}, mode = {}, blocks = {}", mount->dir_name->data, - mount->mount_mode, mount->blocks); - return saveDataMount(mount->user_id, (char*)mount->dir_name->data, mount->mount_mode, - mount_result); + LOG_DEBUG(Lib_SaveData, "called dirName: {}, mode: {:0b}, blocks: {}", + mount->dirName->data.to_view(), (int)mount->mountMode, mount->blocks); + return saveDataMount(mount, mount_result); } int PS4_SYSV_ABI sceSaveDataMount5() { @@ -637,9 +1313,44 @@ int PS4_SYSV_ABI sceSaveDataRegisterEventCallback() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataRestoreBackupData() { - LOG_ERROR(Lib_SaveData, "(STUBBED) called"); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataRestoreBackupData(const OrbisSaveDataRestoreBackupData* restore) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (restore == nullptr || restore->dirName == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + + const std::string_view dir_name{restore->dirName->data}; + LOG_DEBUG(Lib_SaveData, "called dirName: {}", dir_name); + + std::string_view title{restore->titleId != nullptr ? std::string_view{restore->titleId->data} + : std::string_view{g_game_serial}}; + + const auto save_path = SaveInstance::MakeDirSavePath(restore->userId, title, dir_name); + + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetSavePath() == save_path) { + return Error::BUSY; + } + } + if (Backup::IsBackupExecutingFor(save_path)) { + return Error::BACKUP_BUSY; + } + + const auto backup_path = Backup::MakeBackupPath(save_path); + if (!fs::exists(backup_path)) { + return Error::NOT_FOUND; + } + + const bool ok = Backup::Restore(save_path); + if (!ok) { + return Error::INTERNAL; + } + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataRestoreBackupDataForCdlg() { @@ -652,17 +1363,41 @@ int PS4_SYSV_ABI sceSaveDataRestoreLoadSaveDataMemory() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataSaveIcon(const OrbisSaveDataMountPoint* mountPoint, - const OrbisSaveDataIcon* icon) { - auto* mnt = Common::Singleton::Instance(); - const auto mount_dir = mnt->GetHostPath(mountPoint->data); - LOG_INFO(Lib_SaveData, "called = {}", mount_dir.string()); - - if (icon != nullptr) { - Common::FS::IOFile file(mount_dir / "save_data.png", Common::FS::FileAccessMode::Write); - file.WriteRaw(icon->buf, icon->bufSize); +Error PS4_SYSV_ABI sceSaveDataSaveIcon(const OrbisSaveDataMountPoint* mountPoint, + const OrbisSaveDataIcon* icon) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); } - return ORBIS_OK; + if (mountPoint == nullptr || icon == nullptr || icon->buf == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called"); + std::filesystem::path path; + const std::string_view mount_point_str{mountPoint->data}; + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetMountPoint() == mount_point_str) { + if (instance->IsReadOnly()) { + return Error::BAD_MOUNTED; + } + path = instance->GetIconPath(); + break; + } + } + if (path.empty()) { + return Error::NOT_MOUNTED; + } + + try { + const Common::FS::IOFile file(path, Common::FS::FileAccessMode::Write); + file.WriteRaw(icon->buf, std::min(icon->bufSize, icon->dataSize)); + } catch (const fs::filesystem_error& e) { + LOG_ERROR(Lib_SaveData, "Failed to load icon: {}", e.what()); + return Error::INTERNAL; + } + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataSetAutoUploadSetting() { @@ -675,50 +1410,59 @@ int PS4_SYSV_ABI sceSaveDataSetEventInfo() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataSetParam(const OrbisSaveDataMountPoint* mountPoint, - OrbisSaveDataParamType paramType, const void* paramBuf, - size_t paramBufSize) { - if (paramBuf == nullptr) - return ORBIS_SAVE_DATA_ERROR_PARAMETER; - - auto* mnt = Common::Singleton::Instance(); - const auto mount_dir = mnt->GetHostPath(mountPoint->data) / "param.txt"; - OrbisSaveDataParam params; - if (std::filesystem::exists(mount_dir)) { - Common::FS::IOFile file(mount_dir, Common::FS::FileAccessMode::Read); - file.ReadRaw(¶ms, sizeof(OrbisSaveDataParam)); +Error PS4_SYSV_ABI sceSaveDataSetParam(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataParamType paramType, const void* paramBuf, + size_t paramBufSize) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (paramType > OrbisSaveDataParamType::USER_PARAM || mountPoint == nullptr || + paramBuf == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called: paramType = {}", magic_enum::enum_name(paramType)); + PSF* param_sfo = nullptr; + const std::string_view mount_point_str{mountPoint->data}; + for (auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetMountPoint() == mount_point_str) { + param_sfo = &instance->GetParamSFO(); + break; + } + } + if (param_sfo == nullptr) { + return Error::NOT_MOUNTED; } - - LOG_INFO(Lib_SaveData, "called"); switch (paramType) { - case ORBIS_SAVE_DATA_PARAM_TYPE_ALL: { - memcpy(¶ms, paramBuf, sizeof(OrbisSaveDataParam)); + case OrbisSaveDataParamType::ALL: { + const auto param = static_cast(paramBuf); + ASSERT(paramBufSize == sizeof(OrbisSaveDataParam)); + param->ToSFO(*param_sfo); + return Error::OK; } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_TITLE: { - strncpy(params.title, static_cast(paramBuf), paramBufSize); + case OrbisSaveDataParamType::TITLE: { + const auto value = static_cast(paramBuf); + param_sfo->AddString(std::string{SaveParams::MAINTITLE}, {value}, true); } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_SUB_TITLE: { - strncpy(params.subTitle, static_cast(paramBuf), paramBufSize); + case OrbisSaveDataParamType::SUB_TITLE: { + const auto value = static_cast(paramBuf); + param_sfo->AddString(std::string{SaveParams::SUBTITLE}, {value}, true); } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_DETAIL: { - strncpy(params.detail, static_cast(paramBuf), paramBufSize); + case OrbisSaveDataParamType::DETAIL: { + const auto value = static_cast(paramBuf); + param_sfo->AddString(std::string{SaveParams::DETAIL}, {value}, true); } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_USER_PARAM: { - params.userParam = *(static_cast(paramBuf)); + case OrbisSaveDataParamType::USER_PARAM: { + const auto value = static_cast(paramBuf); + param_sfo->AddInteger(std::string{SaveParams::SAVEDATA_LIST_PARAM}, *value, true); } break; - case ORBIS_SAVE_DATA_PARAM_TYPE_MTIME: { - params.mtime = *(static_cast(paramBuf)); - } break; - default: { - UNREACHABLE_MSG("Unknown Param = {}", paramType); - } + default: + UNREACHABLE(); } - Common::FS::IOFile file(mount_dir, Common::FS::FileAccessMode::Write); - file.WriteRaw(¶ms, sizeof(OrbisSaveDataParam)); - - return ORBIS_OK; + return Error::OK; } int PS4_SYSV_ABI sceSaveDataSetSaveDataLibraryUser() { @@ -726,90 +1470,135 @@ int PS4_SYSV_ABI sceSaveDataSetSaveDataLibraryUser() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataSetSaveDataMemory(const u32 userId, const void* buf, - const size_t bufSize, const int64_t offset) { - LOG_INFO(Lib_SaveData, "called"); - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(userId) / game_serial / "sdmemory/save_mem1.sav"; - - Common::FS::IOFile file(mount_dir, Common::FS::FileAccessMode::Write); - file.Seek(offset); - file.WriteRaw(buf, bufSize); - - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataSetSaveDataMemory(OrbisUserServiceUserId userId, void* buf, + size_t bufSize, int64_t offset) { + LOG_DEBUG(Lib_SaveData, "Redirecting to sceSaveDataSetSaveDataMemory2"); + OrbisSaveDataMemoryData data{}; + data.buf = buf; + data.bufSize = bufSize; + data.offset = offset; + OrbisSaveDataMemorySet2 setParam{}; + setParam.userId = userId; + setParam.data = &data; + setParam.param = nullptr; + setParam.icon = nullptr; + return sceSaveDataSetSaveDataMemory2(&setParam); } -int PS4_SYSV_ABI sceSaveDataSetSaveDataMemory2(const OrbisSaveDataMemorySet2* setParam) { - LOG_INFO(Lib_SaveData, "called: dataNum = {}, slotId= {}", setParam->dataNum, setParam->slotId); - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(setParam->userId) / game_serial / "sdmemory"; - if (setParam->data != nullptr) { - Common::FS::IOFile file(mount_dir / "save_mem2.sav", Common::FS::FileAccessMode::Write); - if (!file.IsOpen()) - return -1; - file.Seek(setParam->data->offset); - file.WriteRaw(setParam->data->buf, setParam->data->bufSize); +Error PS4_SYSV_ABI sceSaveDataSetSaveDataMemory2(const OrbisSaveDataMemorySet2* setParam) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (setParam == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + if (!SaveMemory::IsSaveMemoryInitialized()) { + LOG_INFO(Lib_SaveData, "called without save memory initialized"); + return Error::MEMORY_NOT_READY; + } + if (SaveMemory::IsSaving()) { + LOG_TRACE(Lib_SaveData, "called while saving"); + return Error::BUSY_FOR_SAVING; + } + LOG_DEBUG(Lib_SaveData, "called"); + auto data = setParam->data; + if (data != nullptr) { + SaveMemory::WriteMemory(data->buf, data->bufSize, data->offset); + } + auto param = setParam->param; + if (param != nullptr) { + param->ToSFO(SaveMemory::GetParamSFO()); + SaveMemory::SaveSFO(); + } + auto icon = setParam->icon; + if (icon != nullptr) { + SaveMemory::WriteIcon(icon->buf, icon->bufSize); } - if (setParam->param != nullptr) { - Common::FS::IOFile file(mount_dir / "param.txt", Common::FS::FileAccessMode::Write); - file.WriteRaw((void*)setParam->param, sizeof(OrbisSaveDataParam)); - } - - if (setParam->icon != nullptr) { - Common::FS::IOFile file(mount_dir / "save_icon.png", Common::FS::FileAccessMode::Write); - file.WriteRaw(setParam->icon->buf, setParam->icon->bufSize); - } - - return ORBIS_OK; + SaveMemory::TriggerSaveWithoutEvent(); + return Error::OK; } -int PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory(u32 userId, size_t memorySize, - OrbisSaveDataParam* param) { - - LOG_INFO(Lib_SaveData, "called:userId = {}, memorySize = {}", userId, memorySize); - - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(userId) / game_serial / "sdmemory"; - - if (std::filesystem::exists(mount_dir)) { - return ORBIS_SAVE_DATA_ERROR_EXISTS; +Error PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory(OrbisUserServiceUserId userId, size_t memorySize, + OrbisSaveDataParam* param) { + LOG_DEBUG(Lib_SaveData, "called: userId = {}, memorySize = {}", userId, memorySize); + OrbisSaveDataMemorySetup2 setupParam{}; + setupParam.userId = userId; + setupParam.memorySize = memorySize; + setupParam.initParam = nullptr; + setupParam.initIcon = nullptr; + OrbisSaveDataMemorySetupResult result{}; + const auto res = sceSaveDataSetupSaveDataMemory2(&setupParam, &result); + if (res != Error::OK) { + return res; } - std::filesystem::create_directories(mount_dir); - std::vector buf(memorySize); - Common::FS::IOFile::WriteBytes(mount_dir / "save_mem1.sav", buf); - return ORBIS_OK; + if (param != nullptr) { + OrbisSaveDataMemorySet2 setParam{}; + setParam.userId = userId; + setParam.data = nullptr; + setParam.param = param; + setParam.icon = nullptr; + sceSaveDataSetSaveDataMemory2(&setParam); + } + return Error::OK; } -int PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory2(const OrbisSaveDataMemorySetup2* setupParam, - OrbisSaveDataMemorySetupResult* result) { +Error PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory2(const OrbisSaveDataMemorySetup2* setupParam, + OrbisSaveDataMemorySetupResult* result) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } if (setupParam == nullptr) { - return ORBIS_SAVE_DATA_ERROR_PARAMETER; + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; } - LOG_INFO(Lib_SaveData, "called"); - // if (setupParam->option == 1) { // check this later. - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(setupParam->userId) / game_serial / "sdmemory"; - if (std::filesystem::exists(mount_dir) && - std::filesystem::exists(mount_dir / "save_mem2.sav")) { - Common::FS::IOFile file(mount_dir / "save_mem2.sav", Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) - return -1; - // Bunny - CUSA07988 has a null result, having null result is checked and valid. - if (result != nullptr) - result->existedMemorySize = file.GetSize(); // Assign the saved data size. - // do not return ORBIS_SAVE_DATA_ERROR_EXISTS, as it will not trigger - // sceSaveDataGetSaveDataMemory2. - } else { - std::filesystem::create_directories(mount_dir); - std::vector buf(setupParam->memorySize); // check if > 0x1000000 (16.77mb) or x2? - Common::FS::IOFile::WriteBytes(mount_dir / "save_mem2.sav", buf); - std::vector paramBuf(sizeof(OrbisSaveDataParam)); - Common::FS::IOFile::WriteBytes(mount_dir / "param.txt", paramBuf); - std::vector iconBuf(setupParam->iconMemorySize); - Common::FS::IOFile::WriteBytes(mount_dir / "save_icon.png", iconBuf); + LOG_DEBUG(Lib_SaveData, "called"); + + SaveMemory::SetDirectories(setupParam->userId, g_game_serial); + + const auto& save_path = SaveMemory::GetSavePath(); + for (const auto& instance : g_mount_slots) { + if (instance.has_value() && instance->GetSavePath() == save_path) { + return Error::BUSY; + } } - return ORBIS_OK; + + try { + size_t existed_size = SaveMemory::CreateSaveMemory(setupParam->memorySize); + if (existed_size == 0) { // Just created + if (g_fw_ver >= ElfInfo::FW_45 && setupParam->initParam != nullptr) { + auto& sfo = SaveMemory::GetParamSFO(); + setupParam->initParam->ToSFO(sfo); + } + SaveMemory::SaveSFO(); + + auto init_icon = setupParam->initIcon; + if (g_fw_ver >= ElfInfo::FW_45 && init_icon != nullptr) { + SaveMemory::SetIcon(init_icon->buf, init_icon->bufSize); + } else { + SaveMemory::SetIcon(nullptr, 0); + } + } + SaveMemory::TriggerSaveWithoutEvent(); + if (g_fw_ver >= ElfInfo::FW_45 && result != nullptr) { + result->existedMemorySize = existed_size; + } + } catch (const fs::filesystem_error& e) { + LOG_ERROR(Lib_SaveData, "Failed to create/load save memory: {}", e.what()); + + const MsgDialog::MsgDialogState dialog{MsgDialog::MsgDialogState::UserState{ + .type = MsgDialog::ButtonType::OK, + .msg = "Failed to create or load save memory:\n" + std::string{e.what()}, + }}; + MsgDialog::ShowMsgDialog(dialog); + + return Error::INTERNAL; + } + + return Error::OK; } int PS4_SYSV_ABI sceSaveDataShutdownStart() { @@ -827,34 +1616,69 @@ int PS4_SYSV_ABI sceSaveDataSyncCloudList() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataSyncSaveDataMemory(OrbisSaveDataMemorySync* syncParam) { - LOG_ERROR(Lib_SaveData, "(STUBBED) called: option = {}", syncParam->option); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataTerminate() { - LOG_ERROR(Lib_SaveData, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataTransferringMount() { - LOG_ERROR(Lib_SaveData, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceSaveDataUmount(const OrbisSaveDataMountPoint* mountPoint) { - LOG_INFO(Lib_SaveData, "mountPoint = {}", mountPoint->data); - if (std::string_view(mountPoint->data).empty()) { - return ORBIS_SAVE_DATA_ERROR_NOT_MOUNTED; +Error PS4_SYSV_ABI sceSaveDataSyncSaveDataMemory(OrbisSaveDataMemorySync* syncParam) { + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); } - const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / - std::to_string(1) / game_serial / mountPoint->data; - auto* mnt = Common::Singleton::Instance(); - const auto& guest_path = mnt->GetHostPath(mountPoint->data); - if (guest_path.empty()) - return ORBIS_SAVE_DATA_ERROR_NOT_MOUNTED; - mnt->Unmount(mount_dir, mountPoint->data); - return ORBIS_OK; + if (syncParam == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + if (!SaveMemory::IsSaveMemoryInitialized()) { + LOG_INFO(Lib_SaveData, "called without save memory initialized"); + return Error::MEMORY_NOT_READY; + } + LOG_DEBUG(Lib_SaveData, "called"); + bool ok = SaveMemory::TriggerSave(); + if (!ok) { + return Error::BUSY_FOR_SAVING; + } + return Error::OK; +} + +Error PS4_SYSV_ABI sceSaveDataTerminate() { + LOG_DEBUG(Lib_SaveData, "called"); + if (!g_initialized) { + return setNotInitializedError(); + } + for (auto& instance : g_mount_slots) { + if (instance.has_value()) { + if (g_fw_ver >= ElfInfo::FW_40) { + return Error::BUSY; + } + instance->Umount(); + instance.reset(); + } + } + g_initialized = false; + Backup::StopThread(); + return Error::OK; +} + +Error PS4_SYSV_ABI sceSaveDataTransferringMount(const OrbisSaveDataTransferringMount* mount, + OrbisSaveDataMountResult* mountResult) { + LOG_DEBUG(Lib_SaveData, "called"); + if (!g_initialized) { + LOG_INFO(Lib_SaveData, "called without initialize"); + return setNotInitializedError(); + } + if (mount == nullptr || mount->titleId == nullptr || mount->dirName == nullptr) { + LOG_INFO(Lib_SaveData, "called with invalid parameter"); + return Error::PARAMETER; + } + LOG_DEBUG(Lib_SaveData, "called titleId: {}, dirName: {}", mount->titleId->data.to_view(), + mount->dirName->data.to_view()); + OrbisSaveDataMount2 mount_info{}; + mount_info.userId = mount->userId; + mount_info.dirName = mount->dirName; + mount_info.mountMode = OrbisSaveDataMountMode::RDONLY; + return saveDataMount(&mount_info, mountResult, mount->titleId->data.to_string()); +} + +Error PS4_SYSV_ABI sceSaveDataUmount(const OrbisSaveDataMountPoint* mountPoint) { + LOG_DEBUG(Lib_SaveData, "called"); + return Umount(mountPoint); } int PS4_SYSV_ABI sceSaveDataUmountSys() { @@ -862,37 +1686,9 @@ int PS4_SYSV_ABI sceSaveDataUmountSys() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSaveDataUmountWithBackup(const OrbisSaveDataMountPoint* mountPoint) { - LOG_INFO(Lib_SaveData, "called mount = {}, is_rw_mode = {}", std::string(mountPoint->data), - is_rw_mode); - auto* mnt = Common::Singleton::Instance(); - const auto mount_dir = mnt->GetHostPath(mountPoint->data); - if (!std::filesystem::exists(mount_dir)) { - return ORBIS_SAVE_DATA_ERROR_NOT_FOUND; - } - // leave disabled for now. and just unmount. - - /* if (is_rw_mode) { // backup is done only when mount mode is ReadWrite. - auto backup_path = mount_dir; - std::string save_data_dir = (mount_dir.string() + "_backup"); - backup_path.replace_filename(save_data_dir); - - std::filesystem::create_directories(backup_path); - - for (const auto& entry : std::filesystem::recursive_directory_iterator(mount_dir)) { - const auto& path = entry.path(); - if (std::filesystem::is_regular_file(path)) { - std::filesystem::copy(path, save_data_dir, - std::filesystem::copy_options::overwrite_existing); - } - } - }*/ - const auto& guest_path = mnt->GetHostPath(mountPoint->data); - if (guest_path.empty()) - return ORBIS_SAVE_DATA_ERROR_NOT_MOUNTED; - - mnt->Unmount(mount_dir, mountPoint->data); - return ORBIS_OK; +Error PS4_SYSV_ABI sceSaveDataUmountWithBackup(const OrbisSaveDataMountPoint* mountPoint) { + LOG_DEBUG(Lib_SaveData, "called"); + return Umount(mountPoint, true); } int PS4_SYSV_ABI sceSaveDataUnregisterEventCallback() { diff --git a/src/core/libraries/save_data/savedata.h b/src/core/libraries/save_data/savedata.h index 9b3cf900f..5faf3f2d5 100644 --- a/src/core/libraries/save_data/savedata.h +++ b/src/core/libraries/save_data/savedata.h @@ -3,259 +3,82 @@ #pragma once +#include "common/cstring.h" #include "common/types.h" namespace Core::Loader { class SymbolsResolver; } +class PSF; + namespace Libraries::SaveData { -constexpr int ORBIS_SAVE_DATA_DIRNAME_DATA_MAXSIZE = - 32; // Maximum size for a save data directory name -constexpr int ORBIS_SAVE_DATA_MOUNT_POINT_DATA_MAXSIZE = 16; // Maximum size for a mount point name +constexpr size_t OrbisSaveDataTitleMaxsize = 128; // Maximum title name size +constexpr size_t OrbisSaveDataSubtitleMaxsize = 128; // Maximum subtitle name size +constexpr size_t OrbisSaveDataDetailMaxsize = 1024; // Maximum detail name size + +enum class Error : u32; +enum class OrbisSaveDataParamType : u32; + +using OrbisUserServiceUserId = s32; + +// Maximum size for a title ID (4 uppercase letters + 5 digits) +constexpr int OrbisSaveDataTitleIdDataSize = 10; +// Maximum save directory name size +constexpr int OrbisSaveDataDirnameDataMaxsize = 32; + +struct OrbisSaveDataTitleId { + Common::CString data; + std::array _pad; +}; struct OrbisSaveDataDirName { - char data[ORBIS_SAVE_DATA_DIRNAME_DATA_MAXSIZE]; + Common::CString data; }; -struct OrbisSaveDataMount2 { - s32 user_id; - s32 unk1; - const OrbisSaveDataDirName* dir_name; - u64 blocks; - u32 mount_mode; - u8 reserved[32]; - s32 unk2; -}; - -struct OrbisSaveDataMountPoint { - char data[ORBIS_SAVE_DATA_MOUNT_POINT_DATA_MAXSIZE]; -}; - -struct OrbisSaveDataMountResult { - OrbisSaveDataMountPoint mount_point; - u64 required_blocks; - u32 unused; - u32 mount_status; - u8 reserved[28]; - s32 unk1; -}; - -constexpr int ORBIS_SAVE_DATA_TITLE_ID_DATA_SIZE = 10; -struct OrbisSaveDataTitleId { - char data[ORBIS_SAVE_DATA_TITLE_ID_DATA_SIZE]; - char padding[6]; -}; - -constexpr int ORBIS_SAVE_DATA_FINGERPRINT_DATA_SIZE = 65; -struct OrbisSaveDataFingerprint { - char data[ORBIS_SAVE_DATA_FINGERPRINT_DATA_SIZE]; - char padding[15]; -}; - -struct OrbisSaveDataMount { - s32 user_id; - s32 pad; - const OrbisSaveDataTitleId* titleId; - const OrbisSaveDataDirName* dir_name; - const OrbisSaveDataFingerprint* fingerprint; - u64 blocks; - u32 mount_mode; - u8 reserved[32]; -}; - -typedef u32 OrbisSaveDataParamType; - -constexpr int ORBIS_SAVE_DATA_TITLE_MAXSIZE = 128; -constexpr int ORBIS_SAVE_DATA_SUBTITLE_MAXSIZE = 128; -constexpr int ORBIS_SAVE_DATA_DETAIL_MAXSIZE = 1024; struct OrbisSaveDataParam { - char title[ORBIS_SAVE_DATA_TITLE_MAXSIZE]; - char subTitle[ORBIS_SAVE_DATA_SUBTITLE_MAXSIZE]; - char detail[ORBIS_SAVE_DATA_DETAIL_MAXSIZE]; + Common::CString title; + Common::CString subTitle; + Common::CString detail; u32 userParam; int : 32; time_t mtime; - u8 reserved[32]; + std::array _reserved; + + void FromSFO(const PSF& sfo); + + void ToSFO(PSF& sfo) const; }; -struct OrbisSaveDataIcon { - void* buf; - size_t bufSize; - size_t dataSize; - u8 reserved[32]; -}; - -typedef u32 OrbisSaveDataSaveDataMemoryOption; -#define ORBIS_SAVE_DATA_MEMORY_OPTION_NONE (0x00000000) -#define ORBIS_SAVE_DATA_MEMORY_OPTION_SET_PARAM (0x00000001 << 0) -#define ORBIS_SAVE_DATA_MEMORY_OPTION_DOUBLE_BUFFER (0x00000001 << 1) - -struct OrbisSaveDataMemorySetup2 { - OrbisSaveDataSaveDataMemoryOption option; - s32 userId; - size_t memorySize; - size_t iconMemorySize; - const OrbisSaveDataParam* initParam; - const OrbisSaveDataIcon* initIcon; - u32 slotId; - u8 reserved[20]; -}; - -struct OrbisSaveDataMemorySetupResult { - size_t existedMemorySize; - u8 reserved[16]; -}; - -typedef u32 OrbisSaveDataEventType; -#define SCE_SAVE_DATA_EVENT_TYPE_INVALID (0) -#define SCE_SAVE_DATA_EVENT_TYPE_UMOUNT_BACKUP_END (1) -#define SCE_SAVE_DATA_EVENT_TYPE_BACKUP_END (2) -#define SCE_SAVE_DATA_EVENT_TYPE_SAVE_DATA_MEMORY_SYNC_END (3) - -struct OrbisSaveDataEvent { - OrbisSaveDataEventType type; - s32 errorCode; - s32 userId; - u8 padding[4]; - OrbisSaveDataTitleId titleId; - OrbisSaveDataDirName dirName; - u8 reserved[40]; -}; - -struct OrbisSaveDataMemoryData { - void* buf; - size_t bufSize; - off_t offset; - u8 reserved[40]; -}; - -struct OrbisSaveDataMemoryGet2 { - s32 userId; - u8 padding[4]; - OrbisSaveDataMemoryData* data; - OrbisSaveDataParam* param; - OrbisSaveDataIcon* icon; - u32 slotId; - u8 reserved[28]; -}; - -struct OrbisSaveDataMemorySet2 { - s32 userId; - u8 padding[4]; - const OrbisSaveDataMemoryData* data; - const OrbisSaveDataParam* param; - const OrbisSaveDataIcon* icon; - u32 dataNum; - u8 slotId; - u8 reserved[24]; -}; - -struct OrbisSaveDataCheckBackupData { - s32 userId; - int : 32; - const OrbisSaveDataTitleId* titleId; - const OrbisSaveDataDirName* dirName; - OrbisSaveDataParam* param; - OrbisSaveDataIcon* icon; - u8 reserved[32]; -}; - -struct OrbisSaveDataMountInfo { - u64 blocks; - u64 freeBlocks; - u8 reserved[32]; -}; - -#define ORBIS_SAVE_DATA_BLOCK_SIZE (32768) -#define ORBIS_SAVE_DATA_BLOCKS_MIN2 (96) -#define ORBIS_SAVE_DATA_BLOCKS_MAX (32768) - -// savedataMount2 mountModes (ORed values) -constexpr int ORBIS_SAVE_DATA_MOUNT_MODE_RDONLY = 1; -constexpr int ORBIS_SAVE_DATA_MOUNT_MODE_RDWR = 2; -constexpr int ORBIS_SAVE_DATA_MOUNT_MODE_CREATE = 4; -constexpr int ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF = 8; -constexpr int ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON = 16; -constexpr int ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 = 32; -typedef struct _OrbisSaveDataEventParam OrbisSaveDataEventParam; - -typedef u32 OrbisSaveDataSortKey; -#define ORBIS_SAVE_DATA_SORT_KEY_DIRNAME (0) -#define ORBIS_SAVE_DATA_SORT_KEY_USER_PARAM (1) -#define ORBIS_SAVE_DATA_SORT_KEY_BLOCKS (2) -#define ORBIS_SAVE_DATA_SORT_KEY_MTIME (3) -#define ORBIS_SAVE_DATA_SORT_KEY_FREE_BLOCKS (5) - -typedef u32 OrbisSaveDataSortOrder; -#define ORBIS_SAVE_DATA_SORT_ORDER_ASCENT (0) -#define ORBIS_SAVE_DATA_SORT_ORDER_DESCENT (1) - -struct OrbisSaveDataDirNameSearchCond { - s32 userId; - int : 32; - const OrbisSaveDataTitleId* titleId; - const OrbisSaveDataDirName* dirName; - OrbisSaveDataSortKey key; - OrbisSaveDataSortOrder order; - u8 reserved[32]; -}; - -struct OrbisSaveDataSearchInfo { - u64 blocks; - u64 freeBlocks; - u8 reserved[32]; -}; - -struct OrbisSaveDataDirNameSearchResult { - u32 hitNum; - int : 32; - OrbisSaveDataDirName* dirNames; - u32 dirNamesNum; - u32 setNum; - OrbisSaveDataParam* params; - OrbisSaveDataSearchInfo* infos; - u8 reserved[12]; - int : 32; -}; - -struct OrbisSaveDataDelete { - s32 userId; - int : 32; - const OrbisSaveDataTitleId* titleId; - const OrbisSaveDataDirName* dirName; - u32 unused; - u8 reserved[32]; - int : 32; -}; - -typedef u32 OrbisSaveDataMemorySyncOption; - -#define SCE_SAVE_DATA_MEMORY_SYNC_OPTION_NONE (0x00000000) -#define SCE_SAVE_DATA_MEMORY_SYNC_OPTION_BLOCKING (0x00000001 << 0) - -struct OrbisSaveDataMemorySync { - s32 userId; - u32 slotId; - OrbisSaveDataMemorySyncOption option; - u8 reserved[28]; -}; - -constexpr int ORBIS_SAVE_DATA_PARAM_TYPE_ALL = 0; -constexpr int ORBIS_SAVE_DATA_PARAM_TYPE_TITLE = 1; -constexpr int ORBIS_SAVE_DATA_PARAM_TYPE_SUB_TITLE = 2; -constexpr int ORBIS_SAVE_DATA_PARAM_TYPE_DETAIL = 3; -constexpr int ORBIS_SAVE_DATA_PARAM_TYPE_USER_PARAM = 4; -constexpr int ORBIS_SAVE_DATA_PARAM_TYPE_MTIME = 5; +struct OrbisSaveDataBackup; +struct OrbisSaveDataCheckBackupData; +struct OrbisSaveDataDelete; +struct OrbisSaveDataDirNameSearchCond; +struct OrbisSaveDataDirNameSearchResult; +struct OrbisSaveDataEvent; +struct OrbisSaveDataEventParam; +struct OrbisSaveDataIcon; +struct OrbisSaveDataMemoryGet2; +struct OrbisSaveDataMemorySet2; +struct OrbisSaveDataMemorySetup2; +struct OrbisSaveDataMemorySetupResult; +struct OrbisSaveDataMemorySync; +struct OrbisSaveDataMount2; +struct OrbisSaveDataMount; +struct OrbisSaveDataMountInfo; +struct OrbisSaveDataMountPoint; +struct OrbisSaveDataMountResult; +struct OrbisSaveDataRestoreBackupData; +struct OrbisSaveDataTransferringMount; int PS4_SYSV_ABI sceSaveDataAbort(); -int PS4_SYSV_ABI sceSaveDataBackup(); +Error PS4_SYSV_ABI sceSaveDataBackup(const OrbisSaveDataBackup* backup); int PS4_SYSV_ABI sceSaveDataBindPsnAccount(); int PS4_SYSV_ABI sceSaveDataBindPsnAccountForSystemBackup(); int PS4_SYSV_ABI sceSaveDataChangeDatabase(); int PS4_SYSV_ABI sceSaveDataChangeInternal(); -int PS4_SYSV_ABI sceSaveDataCheckBackupData(const OrbisSaveDataCheckBackupData* check); +Error PS4_SYSV_ABI sceSaveDataCheckBackupData(const OrbisSaveDataCheckBackupData* check); int PS4_SYSV_ABI sceSaveDataCheckBackupDataForCdlg(); int PS4_SYSV_ABI sceSaveDataCheckBackupDataInternal(); int PS4_SYSV_ABI sceSaveDataCheckCloudData(); @@ -263,7 +86,7 @@ int PS4_SYSV_ABI sceSaveDataCheckIpmiIfSize(); int PS4_SYSV_ABI sceSaveDataCheckSaveDataBroken(); int PS4_SYSV_ABI sceSaveDataCheckSaveDataVersion(); int PS4_SYSV_ABI sceSaveDataCheckSaveDataVersionLatest(); -int PS4_SYSV_ABI sceSaveDataClearProgress(); +Error PS4_SYSV_ABI sceSaveDataClearProgress(); int PS4_SYSV_ABI sceSaveDataCopy5(); int PS4_SYSV_ABI sceSaveDataCreateUploadData(); int PS4_SYSV_ABI sceSaveDataDebug(); @@ -273,13 +96,13 @@ int PS4_SYSV_ABI sceSaveDataDebugCreateSaveDataRoot(); int PS4_SYSV_ABI sceSaveDataDebugGetThreadId(); int PS4_SYSV_ABI sceSaveDataDebugRemoveSaveDataRoot(); int PS4_SYSV_ABI sceSaveDataDebugTarget(); -int PS4_SYSV_ABI sceSaveDataDelete(const OrbisSaveDataDelete* del); +Error PS4_SYSV_ABI sceSaveDataDelete(const OrbisSaveDataDelete* del); int PS4_SYSV_ABI sceSaveDataDelete5(); int PS4_SYSV_ABI sceSaveDataDeleteAllUser(); int PS4_SYSV_ABI sceSaveDataDeleteCloudData(); int PS4_SYSV_ABI sceSaveDataDeleteUser(); -int PS4_SYSV_ABI sceSaveDataDirNameSearch(const OrbisSaveDataDirNameSearchCond* cond, - OrbisSaveDataDirNameSearchResult* result); +Error PS4_SYSV_ABI sceSaveDataDirNameSearch(const OrbisSaveDataDirNameSearchCond* cond, + OrbisSaveDataDirNameSearchResult* result); int PS4_SYSV_ABI sceSaveDataDirNameSearchInternal(); int PS4_SYSV_ABI sceSaveDataDownload(); int PS4_SYSV_ABI sceSaveDataGetAllSize(); @@ -292,70 +115,71 @@ int PS4_SYSV_ABI sceSaveDataGetClientThreadPriority(); int PS4_SYSV_ABI sceSaveDataGetCloudQuotaInfo(); int PS4_SYSV_ABI sceSaveDataGetDataBaseFilePath(); int PS4_SYSV_ABI sceSaveDataGetEventInfo(); -int PS4_SYSV_ABI sceSaveDataGetEventResult(const OrbisSaveDataEventParam* eventParam, - OrbisSaveDataEvent* event); +Error PS4_SYSV_ABI sceSaveDataGetEventResult(const OrbisSaveDataEventParam* eventParam, + OrbisSaveDataEvent* event); int PS4_SYSV_ABI sceSaveDataGetFormat(); int PS4_SYSV_ABI sceSaveDataGetMountedSaveDataCount(); -int PS4_SYSV_ABI sceSaveDataGetMountInfo(const OrbisSaveDataMountPoint* mountPoint, - OrbisSaveDataMountInfo* info); -int PS4_SYSV_ABI sceSaveDataGetParam(const OrbisSaveDataMountPoint* mountPoint, - const OrbisSaveDataParamType paramType, void* paramBuf, - const size_t paramBufSize, size_t* gotSize); -int PS4_SYSV_ABI sceSaveDataGetProgress(); +Error PS4_SYSV_ABI sceSaveDataGetMountInfo(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataMountInfo* info); +Error PS4_SYSV_ABI sceSaveDataGetParam(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataParamType paramType, void* paramBuf, + size_t paramBufSize, size_t* gotSize); +Error PS4_SYSV_ABI sceSaveDataGetProgress(float* progress); int PS4_SYSV_ABI sceSaveDataGetSaveDataCount(); -int PS4_SYSV_ABI sceSaveDataGetSaveDataMemory(const u32 userId, void* buf, const size_t bufSize, - const int64_t offset); -int PS4_SYSV_ABI sceSaveDataGetSaveDataMemory2(OrbisSaveDataMemoryGet2* getParam); +Error PS4_SYSV_ABI sceSaveDataGetSaveDataMemory(OrbisUserServiceUserId userId, void* buf, + size_t bufSize, int64_t offset); +Error PS4_SYSV_ABI sceSaveDataGetSaveDataMemory2(OrbisSaveDataMemoryGet2* getParam); int PS4_SYSV_ABI sceSaveDataGetSaveDataRootDir(); int PS4_SYSV_ABI sceSaveDataGetSaveDataRootPath(); int PS4_SYSV_ABI sceSaveDataGetSaveDataRootUsbPath(); int PS4_SYSV_ABI sceSaveDataGetSavePoint(); int PS4_SYSV_ABI sceSaveDataGetUpdatedDataCount(); -int PS4_SYSV_ABI sceSaveDataInitialize(); -int PS4_SYSV_ABI sceSaveDataInitialize2(); -int PS4_SYSV_ABI sceSaveDataInitialize3(); +Error PS4_SYSV_ABI sceSaveDataInitialize(void*); +Error PS4_SYSV_ABI sceSaveDataInitialize2(void*); +Error PS4_SYSV_ABI sceSaveDataInitialize3(void*); int PS4_SYSV_ABI sceSaveDataInitializeForCdlg(); int PS4_SYSV_ABI sceSaveDataIsDeletingUsbDb(); int PS4_SYSV_ABI sceSaveDataIsMounted(); -int PS4_SYSV_ABI sceSaveDataLoadIcon(const OrbisSaveDataMountPoint* mountPoint, - OrbisSaveDataIcon* icon); -int PS4_SYSV_ABI sceSaveDataMount(const OrbisSaveDataMount* mount, - OrbisSaveDataMountResult* mount_result); -s32 PS4_SYSV_ABI sceSaveDataMount2(const OrbisSaveDataMount2* mount, - OrbisSaveDataMountResult* mount_result); +Error PS4_SYSV_ABI sceSaveDataLoadIcon(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataIcon* icon); +Error PS4_SYSV_ABI sceSaveDataMount(const OrbisSaveDataMount* mount, + OrbisSaveDataMountResult* mount_result); +Error PS4_SYSV_ABI sceSaveDataMount2(const OrbisSaveDataMount2* mount, + OrbisSaveDataMountResult* mount_result); int PS4_SYSV_ABI sceSaveDataMount5(); int PS4_SYSV_ABI sceSaveDataMountInternal(); int PS4_SYSV_ABI sceSaveDataMountSys(); int PS4_SYSV_ABI sceSaveDataPromote5(); int PS4_SYSV_ABI sceSaveDataRebuildDatabase(); int PS4_SYSV_ABI sceSaveDataRegisterEventCallback(); -int PS4_SYSV_ABI sceSaveDataRestoreBackupData(); +Error PS4_SYSV_ABI sceSaveDataRestoreBackupData(const OrbisSaveDataRestoreBackupData* restore); int PS4_SYSV_ABI sceSaveDataRestoreBackupDataForCdlg(); int PS4_SYSV_ABI sceSaveDataRestoreLoadSaveDataMemory(); -int PS4_SYSV_ABI sceSaveDataSaveIcon(const OrbisSaveDataMountPoint* mountPoint, - const OrbisSaveDataIcon* icon); +Error PS4_SYSV_ABI sceSaveDataSaveIcon(const OrbisSaveDataMountPoint* mountPoint, + const OrbisSaveDataIcon* icon); int PS4_SYSV_ABI sceSaveDataSetAutoUploadSetting(); int PS4_SYSV_ABI sceSaveDataSetEventInfo(); -int PS4_SYSV_ABI sceSaveDataSetParam(const OrbisSaveDataMountPoint* mountPoint, - OrbisSaveDataParamType paramType, const void* paramBuf, - size_t paramBufSize); +Error PS4_SYSV_ABI sceSaveDataSetParam(const OrbisSaveDataMountPoint* mountPoint, + OrbisSaveDataParamType paramType, const void* paramBuf, + size_t paramBufSize); int PS4_SYSV_ABI sceSaveDataSetSaveDataLibraryUser(); -int PS4_SYSV_ABI sceSaveDataSetSaveDataMemory(const u32 userId, const void* buf, - const size_t bufSize, const int64_t offset); -int PS4_SYSV_ABI sceSaveDataSetSaveDataMemory2(const OrbisSaveDataMemorySet2* setParam); -int PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory(u32 userId, size_t memorySize, - OrbisSaveDataParam* param); -int PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory2(const OrbisSaveDataMemorySetup2* setupParam, - OrbisSaveDataMemorySetupResult* result); +Error PS4_SYSV_ABI sceSaveDataSetSaveDataMemory(OrbisUserServiceUserId userId, void* buf, + size_t bufSize, int64_t offset); +Error PS4_SYSV_ABI sceSaveDataSetSaveDataMemory2(const OrbisSaveDataMemorySet2* setParam); +Error PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory(OrbisUserServiceUserId userId, size_t memorySize, + OrbisSaveDataParam* param); +Error PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory2(const OrbisSaveDataMemorySetup2* setupParam, + OrbisSaveDataMemorySetupResult* result); int PS4_SYSV_ABI sceSaveDataShutdownStart(); int PS4_SYSV_ABI sceSaveDataSupportedFakeBrokenStatus(); int PS4_SYSV_ABI sceSaveDataSyncCloudList(); -int PS4_SYSV_ABI sceSaveDataSyncSaveDataMemory(OrbisSaveDataMemorySync* syncParam); -int PS4_SYSV_ABI sceSaveDataTerminate(); -int PS4_SYSV_ABI sceSaveDataTransferringMount(); -int PS4_SYSV_ABI sceSaveDataUmount(const OrbisSaveDataMountPoint* mountPoint); +Error PS4_SYSV_ABI sceSaveDataSyncSaveDataMemory(OrbisSaveDataMemorySync* syncParam); +Error PS4_SYSV_ABI sceSaveDataTerminate(); +Error PS4_SYSV_ABI sceSaveDataTransferringMount(const OrbisSaveDataTransferringMount* mount, + OrbisSaveDataMountResult* mountResult); +Error PS4_SYSV_ABI sceSaveDataUmount(const OrbisSaveDataMountPoint* mountPoint); int PS4_SYSV_ABI sceSaveDataUmountSys(); -int PS4_SYSV_ABI sceSaveDataUmountWithBackup(const OrbisSaveDataMountPoint* mountPoint); +Error PS4_SYSV_ABI sceSaveDataUmountWithBackup(const OrbisSaveDataMountPoint* mountPoint); int PS4_SYSV_ABI sceSaveDataUnregisterEventCallback(); int PS4_SYSV_ABI sceSaveDataUpload(); int PS4_SYSV_ABI Func_02E4C4D201716422(); diff --git a/src/core/libraries/system/msgdialog.cpp b/src/core/libraries/system/msgdialog.cpp index 94c122d9b..7d924e4ad 100644 --- a/src/core/libraries/system/msgdialog.cpp +++ b/src/core/libraries/system/msgdialog.cpp @@ -39,11 +39,6 @@ Error PS4_SYSV_ABI sceMsgDialogGetResult(DialogResult* result) { if (result == nullptr) { return Error::ARG_NULL; } - for (const auto v : result->reserved) { - if (v != 0) { - return Error::PARAM_INVALID; - } - } *result = g_result; return Error::OK; } diff --git a/src/core/libraries/system/msgdialog_ui.cpp b/src/core/libraries/system/msgdialog_ui.cpp index 63b3390c9..ae1dced12 100644 --- a/src/core/libraries/system/msgdialog_ui.cpp +++ b/src/core/libraries/system/msgdialog_ui.cpp @@ -1,6 +1,9 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include + #include #include "common/assert.h" #include "imgui/imgui_std.h" @@ -31,18 +34,6 @@ struct { }; static_assert(std::size(user_button_texts) == static_cast(ButtonType::TWO_BUTTONS) + 1); -static void DrawCenteredText(const char* text) { - const auto ws = GetWindowSize(); - const auto text_size = CalcTextSize(text, nullptr, false, ws.x - 40.0f); - PushTextWrapPos(ws.x - 30.0f); - SetCursorPos({ - (ws.x - text_size.x) / 2.0f, - (ws.y - text_size.y) / 2.0f - 50.0f, - }); - Text("%s", text); - PopTextWrapPos(); -} - MsgDialogState::MsgDialogState(const OrbisParam& param) { this->mode = param.mode; switch (mode) { @@ -81,11 +72,29 @@ MsgDialogState::MsgDialogState(const OrbisParam& param) { } } +MsgDialogState::MsgDialogState(UserState mode) { + this->mode = MsgDialogMode::USER_MSG; + this->state = mode; +} + +MsgDialogState::MsgDialogState(ProgressState mode) { + this->mode = MsgDialogMode::PROGRESS_BAR; + this->state = mode; +} + +MsgDialogState::MsgDialogState(SystemState mode) { + this->mode = MsgDialogMode::SYSTEM_MSG; + this->state = mode; +} + void MsgDialogUi::DrawUser() { const auto& [button_type, msg, btn_param1, btn_param2] = state->GetState(); const auto ws = GetWindowSize(); - DrawCenteredText(msg.c_str()); + if (!msg.empty()) { + DrawCenteredText(&msg.front(), &msg.back() + 1, + GetContentRegionAvail() - ImVec2{0.0f, 15.0f + BUTTON_SIZE.y}); + } ASSERT(button_type <= ButtonType::TWO_BUTTONS); auto [count, text1, text2] = user_button_texts[static_cast(button_type)]; if (count == 0xFF) { // TWO_BUTTONS -> User defined message @@ -115,7 +124,7 @@ void MsgDialogUi::DrawUser() { break; } } - if (first_render && !focus_first) { + if ((first_render || IsKeyPressed(ImGuiKey_GamepadFaceRight)) && !focus_first) { SetItemCurrentNavFocus(); } PopID(); @@ -125,7 +134,7 @@ void MsgDialogUi::DrawUser() { if (Button(text1, BUTTON_SIZE)) { Finish(ButtonId::BUTTON1); } - if (first_render && focus_first) { + if ((first_render || IsKeyPressed(ImGuiKey_GamepadFaceRight)) && focus_first) { SetItemCurrentNavFocus(); } PopID(); @@ -249,11 +258,13 @@ void MsgDialogUi::Draw() { CentralizeWindow(); SetNextWindowSize(window_size); - SetNextWindowFocus(); SetNextWindowCollapsed(false); + if (first_render || !io.NavActive) { + SetNextWindowFocus(); + } KeepNavHighlight(); - // Hack to allow every dialog to have a unique window - if (Begin("Message Dialog##MessageDialog", nullptr, ImGuiWindowFlags_NoSavedSettings)) { + if (Begin("Message Dialog##MessageDialog", nullptr, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings)) { switch (state->GetMode()) { case MsgDialogMode::USER_MSG: DrawUser(); @@ -269,4 +280,21 @@ void MsgDialogUi::Draw() { End(); first_render = false; -} \ No newline at end of file +} + +DialogResult Libraries::MsgDialog::ShowMsgDialog(MsgDialogState p_state, bool block) { + static DialogResult result{}; + static Status status; + static MsgDialogUi dialog; + static MsgDialogState state; + dialog = MsgDialogUi{}; + status = Status::RUNNING; + state = std::move(p_state); + dialog = MsgDialogUi(&state, &status, &result); + if (block) { + while (status == Status::RUNNING) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + } + return result; +} diff --git a/src/core/libraries/system/msgdialog_ui.h b/src/core/libraries/system/msgdialog_ui.h index 845abdc43..d24ec067c 100644 --- a/src/core/libraries/system/msgdialog_ui.h +++ b/src/core/libraries/system/msgdialog_ui.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include "common/fixed_value.h" @@ -129,6 +130,11 @@ private: public: explicit MsgDialogState(const OrbisParam& param); + + explicit MsgDialogState(UserState mode); + explicit MsgDialogState(ProgressState mode); + explicit MsgDialogState(SystemState mode); + MsgDialogState() = default; [[nodiscard]] OrbisUserServiceUserId GetUserId() const { @@ -165,13 +171,11 @@ public: void Finish(ButtonId buttonId, CommonDialog::Result r = CommonDialog::Result::OK); - void SetProgressBarValue(u32 value, bool increment); - void Draw() override; - - bool ShouldGrabGamepad() override { - return true; - } }; +// Utility function to show a message dialog +// !!! This function can block !!! +DialogResult ShowMsgDialog(MsgDialogState state, bool block = true); + }; // namespace Libraries::MsgDialog \ No newline at end of file diff --git a/src/core/libraries/system/savedatadialog.cpp b/src/core/libraries/system/savedatadialog.cpp deleted file mode 100644 index 5aad480d0..000000000 --- a/src/core/libraries/system/savedatadialog.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/logging/log.h" -#include "core/libraries/error_codes.h" -#include "core/libraries/libs.h" -#include "core/libraries/system/savedatadialog.h" - -namespace Libraries::SaveDataDialog { - -int PS4_SYSV_ABI sceSaveDataDialogClose() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogGetResult() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogGetStatus() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogInitialize() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogIsReadyToDisplay() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return 1; -} - -int PS4_SYSV_ABI sceSaveDataDialogOpen() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogProgressBarInc() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogProgressBarSetValue() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogTerminate() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceSaveDataDialogUpdateStatus() { - LOG_ERROR(Lib_SaveDataDialog, "(STUBBED) called"); - return 3; // SCE_COMMON_DIALOG_STATUS_FINISHED -} - -void RegisterlibSceSaveDataDialog(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("fH46Lag88XY", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogClose); - LIB_FUNCTION("yEiJ-qqr6Cg", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogGetResult); - LIB_FUNCTION("ERKzksauAJA", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogGetStatus); - LIB_FUNCTION("s9e3+YpRnzw", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogInitialize); - LIB_FUNCTION("en7gNVnh878", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogIsReadyToDisplay); - LIB_FUNCTION("4tPhsP6FpDI", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogOpen); - LIB_FUNCTION("V-uEeFKARJU", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogProgressBarInc); - LIB_FUNCTION("hay1CfTmLyA", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogProgressBarSetValue); - LIB_FUNCTION("YuH2FA7azqQ", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogTerminate); - LIB_FUNCTION("KK3Bdg1RWK0", "libSceSaveDataDialog", 1, "libSceSaveDataDialog", 1, 1, - sceSaveDataDialogUpdateStatus); -}; - -} // namespace Libraries::SaveDataDialog diff --git a/src/core/libraries/system/savedatadialog.h b/src/core/libraries/system/savedatadialog.h deleted file mode 100644 index e8fe7c75f..000000000 --- a/src/core/libraries/system/savedatadialog.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/types.h" - -namespace Core::Loader { -class SymbolsResolver; -} - -namespace Libraries::SaveDataDialog { - -int PS4_SYSV_ABI sceSaveDataDialogClose(); -int PS4_SYSV_ABI sceSaveDataDialogGetResult(); -int PS4_SYSV_ABI sceSaveDataDialogGetStatus(); -int PS4_SYSV_ABI sceSaveDataDialogInitialize(); -int PS4_SYSV_ABI sceSaveDataDialogIsReadyToDisplay(); -int PS4_SYSV_ABI sceSaveDataDialogOpen(); -int PS4_SYSV_ABI sceSaveDataDialogProgressBarInc(); -int PS4_SYSV_ABI sceSaveDataDialogProgressBarSetValue(); -int PS4_SYSV_ABI sceSaveDataDialogTerminate(); -int PS4_SYSV_ABI sceSaveDataDialogUpdateStatus(); - -void RegisterlibSceSaveDataDialog(Core::Loader::SymbolsResolver* sym); -} // namespace Libraries::SaveDataDialog diff --git a/src/core/libraries/system/systemservice.cpp b/src/core/libraries/system/systemservice.cpp index d99ec7c7c..8002e2bfc 100644 --- a/src/core/libraries/system/systemservice.cpp +++ b/src/core/libraries/system/systemservice.cpp @@ -1717,7 +1717,7 @@ int PS4_SYSV_ABI sceSystemServiceGetAppType() { s32 PS4_SYSV_ABI sceSystemServiceGetDisplaySafeAreaInfo(OrbisSystemServiceDisplaySafeAreaInfo* info) { - LOG_INFO(Lib_SystemService, "called"); + LOG_DEBUG(Lib_SystemService, "called"); if (info == nullptr) { LOG_ERROR(Lib_SystemService, "OrbisSystemServiceDisplaySafeAreaInfo is null"); return ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER; diff --git a/src/core/libraries/system/userservice.cpp b/src/core/libraries/system/userservice.cpp index cd7a721c0..560855474 100644 --- a/src/core/libraries/system/userservice.cpp +++ b/src/core/libraries/system/userservice.cpp @@ -1,7 +1,9 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "common/config.h" #include "common/logging/log.h" + #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/system/userservice.h" @@ -1071,7 +1073,7 @@ s32 PS4_SYSV_ABI sceUserServiceGetUserName(int user_id, char* user_name, std::si LOG_ERROR(Lib_UserService, "user_name is null"); return ORBIS_USER_SERVICE_ERROR_INVALID_ARGUMENT; } - std::string name = "shadps4"; // TODO onfigurable username + std::string name = Config::getUserName(); if (size < name.length()) { LOG_ERROR(Lib_UserService, "buffer is too short"); return ORBIS_USER_SERVICE_ERROR_BUFFER_TOO_SHORT; diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index aa5d9a986..ddb5ed07f 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -1,12 +1,14 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include "common/assert.h" #include "common/config.h" #include "common/debug.h" #include "common/thread.h" +#include "core/debug_state.h" #include "core/libraries/error_codes.h" #include "core/libraries/kernel/time_management.h" #include "core/libraries/videoout/driver.h" @@ -160,9 +162,7 @@ int VideoOutDriver::UnregisterBuffers(VideoOutPort* port, s32 attributeIndex) { return ORBIS_OK; } -std::chrono::microseconds VideoOutDriver::Flip(const Request& req) { - const auto start = std::chrono::high_resolution_clock::now(); - +void VideoOutDriver::Flip(const Request& req) { // Whatever the game is rendering show splash if it is active if (!renderer->ShowSplash(req.frame)) { // Present the frame. @@ -198,9 +198,6 @@ std::chrono::microseconds VideoOutDriver::Flip(const Request& req) { port->buffer_labels[req.index] = 0; port->SignalVoLabel(); } - - const auto end = std::chrono::high_resolution_clock::now(); - return std::chrono::duration_cast(end - start); } void VideoOutDriver::DrawBlankFrame() { @@ -261,8 +258,13 @@ void VideoOutDriver::SubmitFlipInternal(VideoOutPort* port, s32 index, s64 flip_ } void VideoOutDriver::PresentThread(std::stop_token token) { - static constexpr std::chrono::milliseconds VblankPeriod{16}; - Common::SetCurrentThreadName("PresentThread"); + static constexpr std::chrono::nanoseconds VblankPeriod{16666667}; + const auto vblank_period = VblankPeriod / Config::vblankDiv(); + + Common::SetCurrentThreadName("shadPS4:PresentThread"); + Common::SetCurrentThreadRealtime(vblank_period); + + Common::AccurateTimer timer{vblank_period}; const auto receive_request = [this] -> Request { std::scoped_lock lk{mutex}; @@ -274,25 +276,22 @@ void VideoOutDriver::PresentThread(std::stop_token token) { return {}; }; - auto vblank_period = VblankPeriod / Config::vblankDiv(); auto delay = std::chrono::microseconds{0}; while (!token.stop_requested()) { - // Sleep for most of the vblank duration. - std::this_thread::sleep_for(vblank_period - delay); + timer.Start(); // Check if it's time to take a request. auto& vblank_status = main_port.vblank_status; if (vblank_status.count % (main_port.flip_rate + 1) == 0) { const auto request = receive_request(); if (!request) { - delay = std::chrono::microseconds{0}; - if (!main_port.is_open) { + if (!main_port.is_open || DebugState.IsGuestThreadsPaused()) { DrawBlankFrame(); } } else { - delay = Flip(request); + Flip(request); + FRAME_END; } - FRAME_END; } { @@ -310,6 +309,8 @@ void VideoOutDriver::PresentThread(std::stop_token token) { Kernel::SceKernelEvent::Filter::VideoOut, nullptr); } } + + timer.End(); } } diff --git a/src/core/libraries/videoout/driver.h b/src/core/libraries/videoout/driver.h index 141294bfd..2e478b9ee 100644 --- a/src/core/libraries/videoout/driver.h +++ b/src/core/libraries/videoout/driver.h @@ -101,7 +101,7 @@ private: } }; - std::chrono::microseconds Flip(const Request& req); + void Flip(const Request& req); void DrawBlankFrame(); // Used when there is no flip request to keep ImGui up to date void SubmitFlipInternal(VideoOutPort* port, s32 index, s64 flip_arg, bool is_eop = false); void PresentThread(std::stop_token token); diff --git a/src/core/linker.cpp b/src/core/linker.cpp index e8aab673d..2d7865c33 100644 --- a/src/core/linker.cpp +++ b/src/core/linker.cpp @@ -18,6 +18,7 @@ #include "core/memory.h" #include "core/tls.h" #include "core/virtual_memory.h" +#include "debug_state.h" namespace Core { @@ -27,8 +28,8 @@ static PS4_SYSV_ABI void ProgramExitFunc() { fmt::print("exit function called\n"); } -static void RunMainEntry(VAddr addr, EntryParams* params, ExitFunc exit_func) { #ifdef ARCH_X86_64 +static PS4_SYSV_ABI void RunMainEntry(VAddr addr, EntryParams* params, ExitFunc exit_func) { // reinterpret_cast(addr)(params, exit_func); // can't be used, stack has to have // a specific layout asm volatile("andq $-16, %%rsp\n" // Align to 16 bytes @@ -48,10 +49,8 @@ static void RunMainEntry(VAddr addr, EntryParams* params, ExitFunc exit_func) { : : "r"(addr), "r"(params), "r"(exit_func) : "rax", "rsi", "rdi"); -#else - UNIMPLEMENTED_MSG("Missing RunMainEntry() implementation for target CPU architecture."); -#endif } +#endif Linker::Linker() : memory{Memory::Instance()} {} @@ -90,11 +89,9 @@ void Linker::Execute() { // Init primary thread. Common::SetCurrentThreadName("GAME_MainThread"); -#ifdef ARCH_X86_64 - InitializeThreadPatchStack(); -#endif + DebugState.AddCurrentThreadToGuestList(); Libraries::Kernel::pthreadInitSelfMainThread(); - InitTlsForThread(true); + EnsureThreadInitialized(true); // Start shared library modules for (auto& m : m_modules) { @@ -110,7 +107,12 @@ void Linker::Execute() { for (auto& m : m_modules) { if (!m->IsSharedLib()) { - RunMainEntry(m->GetEntryAddress(), &p, ProgramExitFunc); +#ifdef ARCH_X86_64 + ExecuteGuest(RunMainEntry, m->GetEntryAddress(), &p, ProgramExitFunc); +#else + UNIMPLEMENTED_MSG( + "Missing guest entrypoint implementation for target CPU architecture."); +#endif } } @@ -325,7 +327,8 @@ void* Linker::TlsGetAddr(u64 module_index, u64 offset) { Module* module = m_modules[module_index - 1].get(); const u32 init_image_size = module->tls.init_image_size; // TODO: Determine if Windows will crash from this - u8* dest = reinterpret_cast(heap_api->heap_malloc(module->tls.image_size)); + u8* dest = + reinterpret_cast(ExecuteGuest(heap_api->heap_malloc, module->tls.image_size)); const u8* src = reinterpret_cast(module->tls.image_virtual_addr); std::memcpy(dest, src, init_image_size); std::memset(dest + init_image_size, 0, module->tls.image_size - init_image_size); @@ -335,7 +338,18 @@ void* Linker::TlsGetAddr(u64 module_index, u64 offset) { return addr + offset; } -void Linker::InitTlsForThread(bool is_primary) { +thread_local std::once_flag init_tls_flag; + +void Linker::EnsureThreadInitialized(bool is_primary) const { + std::call_once(init_tls_flag, [this, is_primary] { +#ifdef ARCH_X86_64 + InitializeThreadPatchStack(); +#endif + InitTlsForThread(is_primary); + }); +} + +void Linker::InitTlsForThread(bool is_primary) const { static constexpr size_t TcbSize = 0x40; static constexpr size_t TlsAllocAlign = 0x20; const size_t total_tls_size = Common::AlignUp(static_tls_size, TlsAllocAlign) + TcbSize; @@ -357,7 +371,7 @@ void Linker::InitTlsForThread(bool is_primary) { } else { if (heap_api) { #ifndef WIN32 - addr_out = heap_api->heap_malloc(total_tls_size); + addr_out = ExecuteGuestWithoutTls(heap_api->heap_malloc, total_tls_size); } else { addr_out = std::malloc(total_tls_size); #else diff --git a/src/core/linker.h b/src/core/linker.h index ed1fe400c..fe1278d00 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -98,7 +98,6 @@ public: } void* TlsGetAddr(u64 module_index, u64 offset); - void InitTlsForThread(bool is_primary = false); s32 LoadModule(const std::filesystem::path& elf_name, bool is_dynamic = false); Module* FindByAddress(VAddr address); @@ -109,8 +108,24 @@ public: void Execute(); void DebugDump(); + template + ReturnType ExecuteGuest(PS4_SYSV_ABI ReturnType (*func)(FuncArgs...), + CallArgs&&... args) const { + // Make sure TLS is initialized for the thread before entering guest. + EnsureThreadInitialized(); + return ExecuteGuestWithoutTls(func, args...); + } + private: const Module* FindExportedModule(const ModuleInfo& m, const LibraryInfo& l); + void EnsureThreadInitialized(bool is_primary = false) const; + void InitTlsForThread(bool is_primary) const; + + template + ReturnType ExecuteGuestWithoutTls(PS4_SYSV_ABI ReturnType (*func)(FuncArgs...), + CallArgs&&... args) const { + return func(std::forward(args)...); + } MemoryManager* memory; std::mutex mutex; diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 6d7c8773a..4de20436f 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -204,7 +204,10 @@ void Elf::Open(const std::filesystem::path& file_name) { } out.resize(num); - m_f.Seek(offset, SeekOrigin::SetOrigin); + if (!m_f.Seek(offset, SeekOrigin::SetOrigin)) { + LOG_CRITICAL(Loader, "Failed to seek to header tables"); + return; + } m_f.Read(out); }; @@ -465,7 +468,10 @@ std::string Elf::ElfPHeaderStr(u16 no) { void Elf::LoadSegment(u64 virtual_addr, u64 file_offset, u64 size) { if (!is_self) { // It's elf file - m_f.Seek(file_offset, SeekOrigin::SetOrigin); + if (!m_f.Seek(file_offset, SeekOrigin::SetOrigin)) { + LOG_CRITICAL(Loader, "Failed to seek to ELF header"); + return; + } m_f.ReadRaw(reinterpret_cast(virtual_addr), size); return; } @@ -479,7 +485,10 @@ void Elf::LoadSegment(u64 virtual_addr, u64 file_offset, u64 size) { if (file_offset >= phdr.p_offset && file_offset < phdr.p_offset + phdr.p_filesz) { auto offset = file_offset - phdr.p_offset; - m_f.Seek(offset + seg.file_offset, SeekOrigin::SetOrigin); + if (!m_f.Seek(offset + seg.file_offset, SeekOrigin::SetOrigin)) { + LOG_CRITICAL(Loader, "Failed to seek to segment"); + return; + } m_f.ReadRaw(reinterpret_cast(virtual_addr), size); return; } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 44f96a001..d21ebae83 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -51,6 +51,35 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size) { total_flexible_size, total_direct_size); } +PAddr MemoryManager::PoolExpand(PAddr search_start, PAddr search_end, size_t size, u64 alignment) { + std::scoped_lock lk{mutex}; + + auto dmem_area = FindDmemArea(search_start); + + const auto is_suitable = [&] { + const auto aligned_base = alignment > 0 ? Common::AlignUp(dmem_area->second.base, alignment) + : dmem_area->second.base; + const auto alignment_size = aligned_base - dmem_area->second.base; + const auto remaining_size = + dmem_area->second.size >= alignment_size ? dmem_area->second.size - alignment_size : 0; + return dmem_area->second.is_free && remaining_size >= size; + }; + while (!is_suitable() && dmem_area->second.GetEnd() <= search_end) { + dmem_area++; + } + ASSERT_MSG(is_suitable(), "Unable to find free direct memory area: size = {:#x}", size); + + // Align free position + PAddr free_addr = dmem_area->second.base; + free_addr = alignment > 0 ? Common::AlignUp(free_addr, alignment) : free_addr; + + // Add the allocated region to the list and commit its pages. + auto& area = CarveDmemArea(free_addr, size)->second; + area.is_free = false; + area.is_pooled = true; + return free_addr; +} + PAddr MemoryManager::Allocate(PAddr search_start, PAddr search_end, size_t size, u64 alignment, int memory_type) { std::scoped_lock lk{mutex}; @@ -112,6 +141,43 @@ void MemoryManager::Free(PAddr phys_addr, size_t size) { MergeAdjacent(dmem_map, dmem_area); } +int MemoryManager::PoolReserve(void** out_addr, VAddr virtual_addr, size_t size, + MemoryMapFlags flags, u64 alignment) { + std::scoped_lock lk{mutex}; + + virtual_addr = (virtual_addr == 0) ? impl.SystemManagedVirtualBase() : virtual_addr; + alignment = alignment > 0 ? alignment : 2_MB; + VAddr mapped_addr = alignment > 0 ? Common::AlignUp(virtual_addr, alignment) : virtual_addr; + + // Fixed mapping means the virtual address must exactly match the provided one. + if (True(flags & MemoryMapFlags::Fixed)) { + const auto& vma = FindVMA(mapped_addr)->second; + // If the VMA is mapped, unmap the region first. + if (vma.IsMapped()) { + UnmapMemoryImpl(mapped_addr, size); + } + const size_t remaining_size = vma.base + vma.size - mapped_addr; + ASSERT_MSG(vma.type == VMAType::Free && remaining_size >= size); + } + + // Find the first free area starting with provided virtual address. + if (False(flags & MemoryMapFlags::Fixed)) { + mapped_addr = SearchFree(mapped_addr, size, alignment); + } + + // Add virtual memory area + const auto new_vma_handle = CarveVMA(mapped_addr, size); + auto& new_vma = new_vma_handle->second; + new_vma.disallow_merge = True(flags & MemoryMapFlags::NoCoalesce); + new_vma.prot = MemoryProt::NoAccess; + new_vma.name = ""; + new_vma.type = VMAType::PoolReserved; + MergeAdjacent(vma_map, new_vma_handle); + + *out_addr = std::bit_cast(mapped_addr); + return ORBIS_OK; +} + int MemoryManager::Reserve(void** out_addr, VAddr virtual_addr, size_t size, MemoryMapFlags flags, u64 alignment) { std::scoped_lock lk{mutex}; @@ -149,6 +215,36 @@ int MemoryManager::Reserve(void** out_addr, VAddr virtual_addr, size_t size, Mem return ORBIS_OK; } +int MemoryManager::PoolCommit(VAddr virtual_addr, size_t size, MemoryProt prot) { + std::scoped_lock lk{mutex}; + + const u64 alignment = 64_KB; + + // When virtual addr is zero, force it to virtual_base. The guest cannot pass Fixed + // flag so we will take the branch that searches for free (or reserved) mappings. + virtual_addr = (virtual_addr == 0) ? impl.SystemManagedVirtualBase() : virtual_addr; + VAddr mapped_addr = Common::AlignUp(virtual_addr, alignment); + + // This should return SCE_KERNEL_ERROR_ENOMEM but shouldn't normally happen. + const auto& vma = FindVMA(mapped_addr)->second; + const size_t remaining_size = vma.base + vma.size - mapped_addr; + ASSERT_MSG(!vma.IsMapped() && remaining_size >= size); + + // Perform the mapping. + void* out_addr = impl.Map(mapped_addr, size, alignment, -1, false); + TRACK_ALLOC(out_addr, size, "VMEM"); + + auto& new_vma = CarveVMA(mapped_addr, size)->second; + new_vma.disallow_merge = false; + new_vma.prot = prot; + new_vma.name = ""; + new_vma.type = Core::VMAType::Pooled; + new_vma.is_exec = false; + new_vma.phys_base = 0; + + return ORBIS_OK; +} + int MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, size_t size, MemoryProt prot, MemoryMapFlags flags, VMAType type, std::string_view name, bool is_exec, PAddr phys_addr, u64 alignment) { @@ -232,6 +328,39 @@ int MemoryManager::MapFile(void** out_addr, VAddr virtual_addr, size_t size, Mem return ORBIS_OK; } +void MemoryManager::PoolDecommit(VAddr virtual_addr, size_t size) { + std::scoped_lock lk{mutex}; + + const auto it = FindVMA(virtual_addr); + const auto& vma_base = it->second; + ASSERT_MSG(vma_base.Contains(virtual_addr, size), + "Existing mapping does not contain requested unmap range"); + + const auto vma_base_addr = vma_base.base; + const auto vma_base_size = vma_base.size; + const auto phys_base = vma_base.phys_base; + const bool is_exec = vma_base.is_exec; + const auto start_in_vma = virtual_addr - vma_base_addr; + const auto type = vma_base.type; + + rasterizer->UnmapMemory(virtual_addr, size); + + // Mark region as free and attempt to coalesce it with neighbours. + const auto new_it = CarveVMA(virtual_addr, size); + auto& vma = new_it->second; + vma.type = VMAType::PoolReserved; + vma.prot = MemoryProt::NoAccess; + vma.phys_base = 0; + vma.disallow_merge = false; + vma.name = ""; + MergeAdjacent(vma_map, new_it); + + // Unmap the memory region. + impl.Unmap(vma_base_addr, vma_base_size, start_in_vma, start_in_vma + size, phys_base, is_exec, + false, false); + TRACK_FREE(virtual_addr, "VMEM"); +} + void MemoryManager::UnmapMemory(VAddr virtual_addr, size_t size) { std::scoped_lock lk{mutex}; UnmapMemoryImpl(virtual_addr, size); @@ -348,63 +477,6 @@ int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) { return ORBIS_OK; } -int MemoryManager::MTypeProtect(VAddr addr, size_t size, VMAType mtype, MemoryProt prot) { - std::scoped_lock lk{mutex}; - - // Find the virtual memory area that contains the specified address range. - auto it = FindVMA(addr); - if (it == vma_map.end() || !it->second.Contains(addr, size)) { - LOG_ERROR(Core, "Address range not mapped"); - return ORBIS_KERNEL_ERROR_EINVAL; - } - - VirtualMemoryArea& vma = it->second; - - if (vma.type == VMAType::Free) { - LOG_ERROR(Core, "Cannot change protection on free memory region"); - return ORBIS_KERNEL_ERROR_EINVAL; - } - - // Validate protection flags - constexpr static MemoryProt valid_flags = MemoryProt::NoAccess | MemoryProt::CpuRead | - MemoryProt::CpuReadWrite | MemoryProt::GpuRead | - MemoryProt::GpuWrite | MemoryProt::GpuReadWrite; - - MemoryProt invalid_flags = prot & ~valid_flags; - if (u32(invalid_flags) != 0 && u32(invalid_flags) != u32(MemoryProt::NoAccess)) { - LOG_ERROR(Core, "Invalid protection flags: prot = {:#x}, invalid flags = {:#x}", u32(prot), - u32(invalid_flags)); - return ORBIS_KERNEL_ERROR_EINVAL; - } - - // Change type and protection - vma.type = mtype; - vma.prot = prot; - - // Set permissions - Core::MemoryPermission perms{}; - - if (True(prot & MemoryProt::CpuRead)) { - perms |= Core::MemoryPermission::Read; - } - if (True(prot & MemoryProt::CpuReadWrite)) { - perms |= Core::MemoryPermission::ReadWrite; - } - if (True(prot & MemoryProt::GpuRead)) { - perms |= Core::MemoryPermission::Read; - } - if (True(prot & MemoryProt::GpuWrite)) { - perms |= Core::MemoryPermission::Write; - } - if (True(prot & MemoryProt::GpuReadWrite)) { - perms |= Core::MemoryPermission::ReadWrite; - } - - impl.Protect(addr, size, perms); - - return ORBIS_OK; -} - int MemoryManager::VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info) { std::scoped_lock lk{mutex}; diff --git a/src/core/memory.h b/src/core/memory.h index d0935ffb7..752209cfc 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -50,15 +50,17 @@ enum class VMAType : u32 { Direct = 2, Flexible = 3, Pooled = 4, - Stack = 5, - Code = 6, - File = 7, + PoolReserved = 5, + Stack = 6, + Code = 7, + File = 8, }; struct DirectMemoryArea { PAddr base = 0; size_t size = 0; int memory_type = 0; + bool is_pooled = false; bool is_free = true; PAddr GetEnd() const { @@ -96,7 +98,7 @@ struct VirtualMemoryArea { } bool IsMapped() const noexcept { - return type != VMAType::Free && type != VMAType::Reserved; + return type != VMAType::Free && type != VMAType::Reserved && type != VMAType::PoolReserved; } bool CanMergeWith(const VirtualMemoryArea& next) const { @@ -135,6 +137,10 @@ public: return total_direct_size; } + u64 GetTotalFlexibleSize() const { + return total_flexible_size; + } + u64 GetAvailableFlexibleSize() const { return total_flexible_size - flexible_usage; } @@ -145,14 +151,21 @@ public: void SetupMemoryRegions(u64 flexible_size); + PAddr PoolExpand(PAddr search_start, PAddr search_end, size_t size, u64 alignment); + PAddr Allocate(PAddr search_start, PAddr search_end, size_t size, u64 alignment, int memory_type); void Free(PAddr phys_addr, size_t size); + int PoolReserve(void** out_addr, VAddr virtual_addr, size_t size, MemoryMapFlags flags, + u64 alignment = 0); + int Reserve(void** out_addr, VAddr virtual_addr, size_t size, MemoryMapFlags flags, u64 alignment = 0); + int PoolCommit(VAddr virtual_addr, size_t size, MemoryProt prot); + int MapMemory(void** out_addr, VAddr virtual_addr, size_t size, MemoryProt prot, MemoryMapFlags flags, VMAType type, std::string_view name = "", bool is_exec = false, PAddr phys_addr = -1, u64 alignment = 0); @@ -160,14 +173,14 @@ public: int MapFile(void** out_addr, VAddr virtual_addr, size_t size, MemoryProt prot, MemoryMapFlags flags, uintptr_t fd, size_t offset); + void PoolDecommit(VAddr virtual_addr, size_t size); + void UnmapMemory(VAddr virtual_addr, size_t size); int QueryProtection(VAddr addr, void** start, void** end, u32* prot); int Protect(VAddr addr, size_t size, MemoryProt prot); - int MTypeProtect(VAddr addr, size_t size, VMAType mtype, MemoryProt prot); - int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info); int DirectMemoryQuery(PAddr addr, bool find_next, diff --git a/src/core/module.cpp b/src/core/module.cpp index c28ac1061..5d3b40577 100644 --- a/src/core/module.cpp +++ b/src/core/module.cpp @@ -1,17 +1,15 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include #include "common/alignment.h" #include "common/arch.h" #include "common/assert.h" #include "common/logging/log.h" -#ifdef ENABLE_QT_GUI -#include "qt_gui/memory_patcher.h" -#endif +#include "common/memory_patcher.h" #include "common/string_util.h" #include "core/aerolib/aerolib.h" #include "core/cpu_patches.h" +#include "core/linker.h" #include "core/loader/dwarf.h" #include "core/memory.h" #include "core/module.h" @@ -72,8 +70,9 @@ Module::~Module() = default; s32 Module::Start(size_t args, const void* argp, void* param) { LOG_INFO(Core_Linker, "Module started : {}", name); + const auto* linker = Common::Singleton::Instance(); const VAddr addr = dynamic_info.init_virtual_addr + GetBaseAddress(); - return reinterpret_cast(addr)(args, argp, param); + return linker->ExecuteGuest(reinterpret_cast(addr), args, argp, param); } void Module::LoadModuleToMemory(u32& max_tls_index) { @@ -94,9 +93,11 @@ void Module::LoadModuleToMemory(u32& max_tls_index) { LoadOffset += CODE_BASE_INCR * (1 + aligned_base_size / CODE_BASE_INCR); LOG_INFO(Core_Linker, "Loading module {} to {}", name, fmt::ptr(*out_addr)); +#ifdef ARCH_X86_64 // Initialize trampoline generator. void* trampoline_addr = std::bit_cast(base_virtual_addr + aligned_base_size); - Xbyak::CodeGenerator c(TrampolineSize, trampoline_addr); + RegisterPatchModule(*out_addr, aligned_base_size, trampoline_addr, TrampolineSize); +#endif LOG_INFO(Core_Linker, "======== Load Module to Memory ========"); LOG_INFO(Core_Linker, "base_virtual_addr ......: {:#018x}", base_virtual_addr); @@ -137,7 +138,7 @@ void Module::LoadModuleToMemory(u32& max_tls_index) { add_segment(elf_pheader[i]); #ifdef ARCH_X86_64 if (elf_pheader[i].p_flags & PF_EXEC) { - PatchInstructions(segment_addr, segment_file_size, c); + PrePatchInstructions(segment_addr, segment_file_size); } #endif break; @@ -199,7 +200,6 @@ void Module::LoadModuleToMemory(u32& max_tls_index) { const VAddr entry_addr = base_virtual_addr + elf.GetElfEntry(); LOG_INFO(Core_Linker, "program entry addr ..........: {:#018x}", entry_addr); -#ifdef ENABLE_QT_GUI if (MemoryPatcher::g_eboot_address == 0) { if (name == "eboot") { MemoryPatcher::g_eboot_address = base_virtual_addr; @@ -207,7 +207,6 @@ void Module::LoadModuleToMemory(u32& max_tls_index) { MemoryPatcher::OnGameLoaded(); } } -#endif } void Module::LoadDynamicInfo() { diff --git a/src/core/signals.cpp b/src/core/signals.cpp new file mode 100644 index 000000000..8faf794ed --- /dev/null +++ b/src/core/signals.cpp @@ -0,0 +1,154 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/arch.h" +#include "common/assert.h" +#include "common/decoder.h" +#include "common/signal_context.h" +#include "core/signals.h" + +#ifdef _WIN32 +#include +#else +#include +#ifdef ARCH_X86_64 +#include +#endif +#endif + +namespace Core { + +#if defined(_WIN32) + +static LONG WINAPI SignalHandler(EXCEPTION_POINTERS* pExp) noexcept { + const auto* signals = Signals::Instance(); + + bool handled = false; + switch (pExp->ExceptionRecord->ExceptionCode) { + case EXCEPTION_ACCESS_VIOLATION: + handled = signals->DispatchAccessViolation( + pExp, reinterpret_cast(pExp->ExceptionRecord->ExceptionInformation[1])); + break; + case EXCEPTION_ILLEGAL_INSTRUCTION: + handled = signals->DispatchIllegalInstruction(pExp); + break; + default: + break; + } + + return handled ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH; +} + +#else + +static std::string DisassembleInstruction(void* code_address) { + char buffer[256] = ""; + +#ifdef ARCH_X86_64 + ZydisDecodedInstruction instruction; + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; + const auto status = + Common::Decoder::Instance()->decodeInstruction(instruction, operands, code_address); + if (ZYAN_SUCCESS(status)) { + ZydisFormatter formatter; + ZydisFormatterInit(&formatter, ZYDIS_FORMATTER_STYLE_INTEL); + ZydisFormatterFormatInstruction(&formatter, &instruction, operands, + instruction.operand_count_visible, buffer, sizeof(buffer), + reinterpret_cast(code_address), ZYAN_NULL); + } +#endif + + return buffer; +} + +static void SignalHandler(int sig, siginfo_t* info, void* raw_context) { + const auto* signals = Signals::Instance(); + + auto* code_address = Common::GetRip(raw_context); + + switch (sig) { + case SIGSEGV: + case SIGBUS: { + const bool is_write = Common::IsWriteError(raw_context); + if (!signals->DispatchAccessViolation(raw_context, info->si_addr)) { + UNREACHABLE_MSG("Unhandled access violation at code address {}: {} address {}", + fmt::ptr(code_address), is_write ? "Write to" : "Read from", + fmt::ptr(info->si_addr)); + } + break; + } + case SIGILL: + if (!signals->DispatchIllegalInstruction(raw_context)) { + UNREACHABLE_MSG("Unhandled illegal instruction at code address {}: {}", + fmt::ptr(code_address), DisassembleInstruction(code_address)); + } + break; + case SIGUSR1: { // Sleep thread until signal is received + sigset_t sigset; + sigemptyset(&sigset); + sigaddset(&sigset, SIGUSR1); + sigwait(&sigset, &sig); + } break; + default: + break; + } +} + +#endif + +SignalDispatch::SignalDispatch() { +#if defined(_WIN32) + ASSERT_MSG(handle = AddVectoredExceptionHandler(0, SignalHandler), + "Failed to register exception handler."); +#else + struct sigaction action {}; + action.sa_sigaction = SignalHandler; + action.sa_flags = SA_SIGINFO | SA_ONSTACK; + sigemptyset(&action.sa_mask); + + ASSERT_MSG(sigaction(SIGSEGV, &action, nullptr) == 0 && + sigaction(SIGBUS, &action, nullptr) == 0, + "Failed to register access violation signal handler."); + ASSERT_MSG(sigaction(SIGILL, &action, nullptr) == 0, + "Failed to register illegal instruction signal handler."); + ASSERT_MSG(sigaction(SIGUSR1, &action, nullptr) == 0, + "Failed to register sleep signal handler."); +#endif +} + +SignalDispatch::~SignalDispatch() { +#if defined(_WIN32) + ASSERT_MSG(RemoveVectoredExceptionHandler(handle), "Failed to remove exception handler."); +#else + struct sigaction action {}; + action.sa_handler = SIG_DFL; + action.sa_flags = 0; + sigemptyset(&action.sa_mask); + + ASSERT_MSG(sigaction(SIGSEGV, &action, nullptr) == 0 && + sigaction(SIGBUS, &action, nullptr) == 0, + "Failed to remove access violation signal handler."); + ASSERT_MSG(sigaction(SIGILL, &action, nullptr) == 0, + "Failed to remove illegal instruction signal handler."); +#endif +} + +bool SignalDispatch::DispatchAccessViolation(void* context, void* fault_address) const { + for (const auto& [handler, _] : access_violation_handlers) { + if (handler(context, fault_address)) { + return true; + } + } + return false; +} + +bool SignalDispatch::DispatchIllegalInstruction(void* context) const { + for (const auto& [handler, _] : illegal_instruction_handlers) { + if (handler(context)) { + return true; + } + } + return false; +} + +} // namespace Core \ No newline at end of file diff --git a/src/core/signals.h b/src/core/signals.h new file mode 100644 index 000000000..6ee525e10 --- /dev/null +++ b/src/core/signals.h @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include "common/singleton.h" + +namespace Core { + +using AccessViolationHandler = bool (*)(void* context, void* fault_address); +using IllegalInstructionHandler = bool (*)(void* context); + +/// Receives OS signals and dispatches to the appropriate handlers. +class SignalDispatch { +public: + SignalDispatch(); + ~SignalDispatch(); + + /// Registers a handler for memory access violation signals. + void RegisterAccessViolationHandler(const AccessViolationHandler& handler, u32 priority) { + access_violation_handlers.emplace(handler, priority); + } + + /// Registers a handler for illegal instruction signals. + void RegisterIllegalInstructionHandler(const IllegalInstructionHandler& handler, u32 priority) { + illegal_instruction_handlers.emplace(handler, priority); + } + + /// Dispatches an access violation signal, returning whether it was successfully handled. + bool DispatchAccessViolation(void* context, void* fault_address) const; + + /// Dispatches an illegal instruction signal, returning whether it was successfully handled. + bool DispatchIllegalInstruction(void* context) const; + +private: + template + struct HandlerEntry { + T handler; + u32 priority; + + std::strong_ordering operator<=>(const HandlerEntry& right) const { + return priority <=> right.priority; + } + }; + std::set> access_violation_handlers; + std::set> illegal_instruction_handlers; + +#ifdef _WIN32 + void* handle{}; +#endif +}; + +using Signals = Common::Singleton; + +} // namespace Core \ No newline at end of file diff --git a/src/emulator.cpp b/src/emulator.cpp index de74e6f8c..721151ccc 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -8,8 +8,10 @@ #include "common/logging/backend.h" #include "common/logging/log.h" #ifdef ENABLE_QT_GUI -#include "qt_gui/memory_patcher.h" +#include "common/memory_patcher.h" #endif +#include "common/assert.h" +#include "common/elf_info.h" #include "common/ntapi.h" #include "common/path_util.h" #include "common/polyfill_thread.h" @@ -19,12 +21,14 @@ #include "core/file_format/playgo_chunk.h" #include "core/file_format/psf.h" #include "core/file_format/splash.h" +#include "core/file_format/trp.h" #include "core/file_sys/fs.h" #include "core/libraries/disc_map/disc_map.h" #include "core/libraries/kernel/thread_management.h" #include "core/libraries/libc_internal/libc_internal.h" #include "core/libraries/libs.h" #include "core/libraries/ngs2/ngs2.h" +#include "core/libraries/np_trophy/np_trophy.h" #include "core/libraries/rtc/rtc.h" #include "core/linker.h" #include "core/memory.h" @@ -40,9 +44,10 @@ Emulator::Emulator() { const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); Config::load(config_dir / "config.toml"); - // Initialize NT API functions + // Initialize NT API functions and set high priority #ifdef _WIN32 Common::NtApi::Initialize(); + SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); #endif // Start logger. @@ -56,7 +61,6 @@ Emulator::Emulator() { LOG_INFO(Config, "General isNeo: {}", Config::isNeoMode()); LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu()); LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders()); - LOG_INFO(Config, "GPU shouldDumpPM4: {}", Config::dumpPM4()); LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv()); LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId()); LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled()); @@ -87,24 +91,40 @@ void Emulator::Run(const std::filesystem::path& file) { // Certain games may use /hostapp as well such as CUSA001100 mnt->Mount(file.parent_path(), "/hostapp"); + auto& game_info = Common::ElfInfo::Instance(); + // Loading param.sfo file if exists std::string id; std::string title; std::string app_version; + u32 fw_version; + std::filesystem::path sce_sys_folder = file.parent_path() / "sce_sys"; if (std::filesystem::is_directory(sce_sys_folder)) { for (const auto& entry : std::filesystem::directory_iterator(sce_sys_folder)) { if (entry.path().filename() == "param.sfo") { auto* param_sfo = Common::Singleton::Instance(); - param_sfo->open(sce_sys_folder.string() + "/param.sfo", {}); - id = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9); + const bool success = param_sfo->Open(sce_sys_folder / "param.sfo"); + ASSERT_MSG(success, "Failed to open param.sfo"); + const auto content_id = param_sfo->GetString("CONTENT_ID"); + ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID"); + id = std::string(*content_id, 7, 9); + Libraries::NpTrophy::game_serial = id; + const auto trophyDir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles"; + if (!std::filesystem::exists(trophyDir)) { + TRP trp; + if (!trp.Extract(file.parent_path(), id)) { + LOG_ERROR(Loader, "Couldn't extract trophies"); + } + } #ifdef ENABLE_QT_GUI MemoryPatcher::g_game_serial = id; #endif - title = param_sfo->GetString("TITLE"); + title = param_sfo->GetString("TITLE").value_or("Unknown title"); LOG_INFO(Loader, "Game id: {} Title: {}", id, title); - u32 fw_version = param_sfo->GetInteger("SYSTEM_VER"); - app_version = param_sfo->GetString("APP_VER"); + fw_version = param_sfo->GetInteger("SYSTEM_VER").value_or(0x4700000); + app_version = param_sfo->GetString("APP_VER").value_or("Unknown version"); LOG_INFO(Loader, "Fw: {:#x} App Version: {}", fw_version, app_version); } else if (entry.path().filename() == "playgo-chunk.dat") { auto* playgo = Common::Singleton::Instance(); @@ -118,20 +138,27 @@ void Emulator::Run(const std::filesystem::path& file) { if (splash->IsLoaded()) { continue; } - if (!splash->Open(entry.path().string())) { + if (!splash->Open(entry.path())) { LOG_ERROR(Loader, "Game splash: unable to open file"); } } } } + game_info.initialized = true; + game_info.game_serial = id; + game_info.title = title; + game_info.app_ver = app_version; + game_info.firmware_ver = fw_version & 0xFFF00000; + game_info.raw_firmware_ver = fw_version; + std::string game_title = fmt::format("{} - {} <{}>", id, title, app_version); std::string window_title = ""; if (Common::isRelease) { window_title = fmt::format("shadPS4 v{} | {}", Common::VERSION, game_title); } else { - window_title = - fmt::format("shadPS4 v{} {} | {}", Common::VERSION, Common::g_scm_desc, game_title); + window_title = fmt::format("shadPS4 v{} {} {} | {}", Common::VERSION, Common::g_scm_branch, + Common::g_scm_desc, game_title); } window = std::make_unique( Config::getScreenWidth(), Config::getScreenHeight(), controller, window_title); @@ -161,7 +188,7 @@ void Emulator::Run(const std::filesystem::path& file) { if (!std::filesystem::exists(mount_captures_dir)) { std::filesystem::create_directory(mount_captures_dir); } - VideoCore::SetOutputDir(mount_captures_dir.generic_string(), id); + VideoCore::SetOutputDir(mount_captures_dir, id); // Initialize kernel and library facilities. Libraries::Kernel::init_pthreads(); @@ -177,7 +204,7 @@ void Emulator::Run(const std::filesystem::path& file) { std::filesystem::path sce_module_folder = file.parent_path() / "sce_module"; if (std::filesystem::is_directory(sce_module_folder)) { for (const auto& entry : std::filesystem::directory_iterator(sce_module_folder)) { - LOG_INFO(Loader, "Loading {}", entry.path().string().c_str()); + LOG_INFO(Loader, "Loading {}", fmt::UTF(entry.path().u8string())); linker->LoadModule(entry.path()); } } @@ -194,19 +221,20 @@ void Emulator::Run(const std::filesystem::path& file) { } void Emulator::LoadSystemModules(const std::filesystem::path& file) { - constexpr std::array ModulesToLoad{{ - {"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2}, - {"libSceFiber.sprx", nullptr}, - {"libSceUlt.sprx", nullptr}, - {"libSceJson.sprx", nullptr}, - {"libSceJson2.sprx", nullptr}, - {"libSceLibcInternal.sprx", &Libraries::LibcInternal::RegisterlibSceLibcInternal}, - {"libSceDiscMap.sprx", &Libraries::DiscMap::RegisterlibSceDiscMap}, - {"libSceRtc.sprx", &Libraries::Rtc::RegisterlibSceRtc}, - {"libSceJpegEnc.sprx", nullptr}, - {"libSceFont.sprx", nullptr}, - {"libSceRazorCpu.sprx", nullptr}, - }}; + constexpr std::array ModulesToLoad{ + {{"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2}, + {"libSceFiber.sprx", nullptr}, + {"libSceUlt.sprx", nullptr}, + {"libSceJson.sprx", nullptr}, + {"libSceJson2.sprx", nullptr}, + {"libSceLibcInternal.sprx", &Libraries::LibcInternal::RegisterlibSceLibcInternal}, + {"libSceDiscMap.sprx", &Libraries::DiscMap::RegisterlibSceDiscMap}, + {"libSceRtc.sprx", &Libraries::Rtc::RegisterlibSceRtc}, + {"libSceJpegEnc.sprx", nullptr}, + {"libSceFont.sprx", nullptr}, + {"libSceRazorCpu.sprx", nullptr}, + {"libSceCesCs.sprx", nullptr}, + {"libSceRudp.sprx", nullptr}}}; std::vector found_modules; const auto& sys_module_path = Common::FS::GetUserPath(Common::FS::PathType::SysModuleDir); diff --git a/src/images/dump_icon.png b/src/images/dump_icon.png new file mode 100644 index 000000000..e267181f7 Binary files /dev/null and b/src/images/dump_icon.png differ diff --git a/src/images/flag_china.png b/src/images/flag_china.png index 13bf221e9..33fcdfd86 100644 Binary files a/src/images/flag_china.png and b/src/images/flag_china.png differ diff --git a/src/images/flag_eu.png b/src/images/flag_eu.png index 0922e11ec..461f814e1 100644 Binary files a/src/images/flag_eu.png and b/src/images/flag_eu.png differ diff --git a/src/images/flag_jp.png b/src/images/flag_jp.png index 6433eecfd..fd056962a 100644 Binary files a/src/images/flag_jp.png and b/src/images/flag_jp.png differ diff --git a/src/images/flag_us.png b/src/images/flag_us.png index f4bf3a300..7b0089af4 100644 Binary files a/src/images/flag_us.png and b/src/images/flag_us.png differ diff --git a/src/images/flag_world.png b/src/images/flag_world.png index 0dcccf800..7b96dff11 100644 Binary files a/src/images/flag_world.png and b/src/images/flag_world.png differ diff --git a/src/images/update_icon.png b/src/images/update_icon.png new file mode 100644 index 000000000..517f91fa6 Binary files /dev/null and b/src/images/update_icon.png differ diff --git a/src/imgui/imgui_config.h b/src/imgui/imgui_config.h index 4602382ed..2094d56bc 100644 --- a/src/imgui/imgui_config.h +++ b/src/imgui/imgui_config.h @@ -26,4 +26,7 @@ extern void assert_fail_debug_msg(const char* msg); #define IMGUI_DEFINE_MATH_OPERATORS #define IM_VEC2_CLASS_EXTRA \ - constexpr ImVec2(float _v) : x(_v), y(_v) {} \ No newline at end of file + constexpr ImVec2(float _v) : x(_v), y(_v) {} + +#define IM_VEC4_CLASS_EXTRA \ + constexpr ImVec4(float _v) : x(_v), y(_v), z(_v), w(_v) {} \ No newline at end of file diff --git a/src/imgui/imgui_layer.h b/src/imgui/imgui_layer.h index a2ec7fd24..a6c7e2a4a 100644 --- a/src/imgui/imgui_layer.h +++ b/src/imgui/imgui_layer.h @@ -12,10 +12,6 @@ public: static void RemoveLayer(Layer* layer); virtual void Draw() = 0; - - virtual bool ShouldGrabGamepad() { - return false; - } }; } // namespace ImGui \ No newline at end of file diff --git a/src/imgui/imgui_std.h b/src/imgui/imgui_std.h index 6d97cc11b..168204ea8 100644 --- a/src/imgui/imgui_std.h +++ b/src/imgui/imgui_std.h @@ -3,25 +3,84 @@ #pragma once +#include #include #include "imgui_internal.h" +#define IM_COL32_GRAY(x) IM_COL32(x, x, x, 0xFF) + +#define IMGUI_FONT_TEXT 0 +#define IMGUI_FONT_MONO 1 + namespace ImGui { +namespace Easing { + +inline float FastInFastOutCubic(float x) { + constexpr float c4 = 1.587401f; // 4^(1/3) + constexpr float c05 = 0.7937f; // 0.5^(1/3) + return std::pow(c4 * x - c05, 3.0f) + 0.5f; +} + +} // namespace Easing + inline void CentralizeWindow() { const auto display_size = GetIO().DisplaySize; SetNextWindowPos(display_size / 2.0f, ImGuiCond_Always, {0.5f}); } +inline void KeepWindowInside(ImVec2 display_size = GetIO().DisplaySize) { + const auto cur_pos = GetWindowPos(); + if (cur_pos.x < 0.0f || cur_pos.y < 0.0f) { + SetWindowPos(ImMax(cur_pos, ImVec2(0.0f, 0.0f))); + return; + } + const auto cur_size = GetWindowSize(); + const auto bottom_right = cur_pos + cur_size; + if (bottom_right.x > display_size.x || bottom_right.y > display_size.y) { + const auto max_pos = display_size - cur_size; + SetWindowPos(ImMin(cur_pos, max_pos)); + } +} + inline void KeepNavHighlight() { GetCurrentContext()->NavDisableHighlight = false; } -inline void SetItemCurrentNavFocus() { +inline void SetItemCurrentNavFocus(const ImGuiID id = -1) { const auto ctx = GetCurrentContext(); - SetFocusID(ctx->LastItemData.ID, ctx->CurrentWindow); + SetFocusID(id == -1 ? ctx->LastItemData.ID : id, ctx->CurrentWindow); ctx->NavInitResult.Clear(); + ctx->NavDisableHighlight = false; +} + +inline void DrawPrettyBackground() { + const double time = GetTime() / 1.5f; + const float x = ((float)std::cos(time) + 1.0f) / 2.0f; + const float d = Easing::FastInFastOutCubic(x); + u8 top_left = ImLerp(0x13, 0x05, d); + u8 top_right = ImLerp(0x00, 0x07, d); + u8 bottom_right = ImLerp(0x03, 0x27, d); + u8 bottom_left = ImLerp(0x05, 0x00, d); + + auto& window = *GetCurrentWindowRead(); + auto inner_pos = window.DC.CursorPos - window.WindowPadding; + auto inner_size = GetContentRegionAvail() + window.WindowPadding * 2.0f; + GetWindowDrawList()->AddRectFilledMultiColor( + inner_pos, inner_pos + inner_size, IM_COL32_GRAY(top_left), IM_COL32_GRAY(top_right), + IM_COL32_GRAY(bottom_right), IM_COL32_GRAY(bottom_left)); +} + +static void DrawCenteredText(const char* text, const char* text_end = nullptr, + ImVec2 content = GetContentRegionAvail()) { + auto pos = GetCursorPos(); + const auto text_size = CalcTextSize(text, text_end, false, content.x - 40.0f); + PushTextWrapPos(content.x); + SetCursorPos(pos + (content - text_size) / 2.0f); + TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); + PopTextWrapPos(); + SetCursorPos(pos + content); } } // namespace ImGui diff --git a/src/imgui/imgui_texture.h b/src/imgui/imgui_texture.h new file mode 100644 index 000000000..1a38066d0 --- /dev/null +++ b/src/imgui/imgui_texture.h @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +namespace ImGui { + +namespace Core::TextureManager { +struct Inner; +} // namespace Core::TextureManager + +class RefCountedTexture { + Core::TextureManager::Inner* inner; + + explicit RefCountedTexture(Core::TextureManager::Inner* inner); + +public: + struct Image { + ImTextureID im_id; + u32 width; + u32 height; + }; + + static RefCountedTexture DecodePngTexture(std::vector data); + + static RefCountedTexture DecodePngFile(std::filesystem::path path); + + RefCountedTexture(); + + RefCountedTexture(const RefCountedTexture& other); + RefCountedTexture(RefCountedTexture&& other) noexcept; + RefCountedTexture& operator=(const RefCountedTexture& other); + RefCountedTexture& operator=(RefCountedTexture&& other) noexcept; + + virtual ~RefCountedTexture(); + + [[nodiscard]] Image GetTexture() const; + + explicit(false) operator bool() const; +}; + +}; // namespace ImGui \ No newline at end of file diff --git a/src/imgui/layer/video_info.cpp b/src/imgui/layer/video_info.cpp deleted file mode 100644 index 2a60926fa..000000000 --- a/src/imgui/layer/video_info.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include "video_info.h" - -void ImGui::Layers::VideoInfo::Draw() { - const ImGuiIO& io = GetIO(); - - m_show = IsKeyPressed(ImGuiKey_F10, false) ^ m_show; - - if (m_show) { - if (Begin("Video Info")) { - Text("Frame time: %.3f ms (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); - } - End(); - } -} diff --git a/src/imgui/layer/video_info.h b/src/imgui/layer/video_info.h deleted file mode 100644 index 8eec972a8..000000000 --- a/src/imgui/layer/video_info.h +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "imgui/imgui_layer.h" - -namespace Vulkan { -class RendererVulkan; -} -namespace ImGui::Layers { - -class VideoInfo : public Layer { - bool m_show = false; - ::Vulkan::RendererVulkan* renderer{}; - -public: - explicit VideoInfo(::Vulkan::RendererVulkan* renderer) : renderer(renderer) {} - - void Draw() override; -}; - -} // namespace ImGui::Layers diff --git a/src/imgui/renderer/CMakeLists.txt b/src/imgui/renderer/CMakeLists.txt new file mode 100644 index 000000000..5d74632f9 --- /dev/null +++ b/src/imgui/renderer/CMakeLists.txt @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +project(ImGui_Resources) + +add_executable(Dear_ImGui_FontEmbed ${CMAKE_SOURCE_DIR}/externals/dear_imgui/misc/fonts/binary_to_compressed_c.cpp) + +set(FONT_LIST + NotoSansJP-Regular.ttf + ProggyVector-Regular.ttf +) + +set(OutputList "") +FOREACH (FONT_FILE ${FONT_LIST}) + string(REGEX REPLACE "-" "_" fontname ${FONT_FILE}) + string(TOLOWER ${fontname} fontname) + string(REGEX REPLACE ".ttf" "" fontname_cpp ${fontname}) + set(fontname_cpp "imgui_font_${fontname_cpp}") + + MESSAGE(STATUS "Embedding font ${FONT_FILE}") + set(OUTPUT "generated_fonts/imgui_fonts/${fontname}") + add_custom_command( + OUTPUT "${OUTPUT}.g.cpp" + COMMAND ${CMAKE_COMMAND} -E make_directory "generated_fonts/imgui_fonts" + COMMAND $ -nostatic "${CMAKE_CURRENT_SOURCE_DIR}/fonts/${FONT_FILE}" ${fontname_cpp} > "${OUTPUT}.g.cpp" + DEPENDS Dear_ImGui_FontEmbed "fonts/${FONT_FILE}" + USES_TERMINAL + ) + list(APPEND OutputList "${OUTPUT}.g.cpp") +ENDFOREACH () + +add_library(ImGui_Resources STATIC ${OutputList}) +set(IMGUI_RESOURCES_INCLUDE ${CMAKE_CURRENT_BINARY_DIR}/generated_fonts PARENT_SCOPE) diff --git a/src/imgui/renderer/fonts/NotoSansJP-Regular.ttf b/src/imgui/renderer/fonts/NotoSansJP-Regular.ttf new file mode 100644 index 000000000..b2dad730d Binary files /dev/null and b/src/imgui/renderer/fonts/NotoSansJP-Regular.ttf differ diff --git a/src/imgui/renderer/fonts/ProggyVector-Regular.ttf b/src/imgui/renderer/fonts/ProggyVector-Regular.ttf new file mode 100644 index 000000000..0865b6561 Binary files /dev/null and b/src/imgui/renderer/fonts/ProggyVector-Regular.ttf differ diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index ee77499ee..311e86a3c 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -3,15 +3,22 @@ #include #include + #include "common/config.h" #include "common/path_util.h" +#include "core/devtools/layer.h" #include "imgui/imgui_layer.h" #include "imgui_core.h" #include "imgui_impl_sdl3.h" #include "imgui_impl_vulkan.h" +#include "imgui_internal.h" #include "sdl_window.h" +#include "texture_manager.h" #include "video_core/renderer_vulkan/renderer_vulkan.h" +#include "imgui_fonts/notosansjp_regular.ttf.g.cpp" +#include "imgui_fonts/proggyvector_regular.ttf.g.cpp" + static void CheckVkResult(const vk::Result err) { LOG_ERROR(ImGui, "Vulkan error {}", vk::to_string(err)); } @@ -21,9 +28,11 @@ static std::vector layers; // Update layers before rendering to allow layer changes to be applied during rendering. // Using deque to keep the order of changes in case a Layer is removed then added again between // frames. -static std::deque> change_layers; +static std::deque> change_layers{}; static std::mutex change_layers_mutex{}; +static ImGuiID dock_id; + namespace ImGui { namespace Core { @@ -41,10 +50,39 @@ void Initialize(const ::Vulkan::Instance& instance, const Frontend::WindowSDL& w io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; io.DisplaySize = ImVec2((float)window.getWidth(), (float)window.getHeight()); - io.IniFilename = SDL_strdup(config_path.string().c_str()); - io.LogFilename = SDL_strdup(log_path.string().c_str()); + PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); // Makes the window edges rounded + + auto path = config_path.u8string(); + char* config_file_buf = new char[path.size() + 1](); + std::memcpy(config_file_buf, path.c_str(), path.size()); + io.IniFilename = config_file_buf; + + path = log_path.u8string(); + char* log_file_buf = new char[path.size() + 1](); + std::memcpy(log_file_buf, path.c_str(), path.size()); + io.LogFilename = log_file_buf; + + ImFontGlyphRangesBuilder rb{}; + rb.AddRanges(io.Fonts->GetGlyphRangesDefault()); + rb.AddRanges(io.Fonts->GetGlyphRangesGreek()); + rb.AddRanges(io.Fonts->GetGlyphRangesKorean()); + rb.AddRanges(io.Fonts->GetGlyphRangesJapanese()); + rb.AddRanges(io.Fonts->GetGlyphRangesCyrillic()); + ImVector ranges{}; + rb.BuildRanges(&ranges); + ImFontConfig font_cfg{}; + font_cfg.OversampleH = 2; + font_cfg.OversampleV = 1; + io.FontDefault = io.Fonts->AddFontFromMemoryCompressedTTF( + imgui_font_notosansjp_regular_compressed_data, + imgui_font_notosansjp_regular_compressed_size, 16.0f, &font_cfg, ranges.Data); + io.Fonts->AddFontFromMemoryCompressedTTF(imgui_font_proggyvector_regular_compressed_data, + imgui_font_proggyvector_regular_compressed_size, + 16.0f); + StyleColorsDark(); + ::Core::Devtools::Layer::SetupSettings(); Sdl::Init(window.GetSdlWindow()); const Vulkan::InitInfo vk_info{ @@ -63,6 +101,16 @@ void Initialize(const ::Vulkan::Instance& instance, const Frontend::WindowSDL& w .check_vk_result_fn = &CheckVkResult, }; Vulkan::Init(vk_info); + + TextureManager::StartWorker(); + + char label[32]; + ImFormatString(label, IM_ARRAYSIZE(label), "WindowOverViewport_%08X", GetMainViewport()->ID); + dock_id = ImHashStr(label); + + if (const auto dpi = SDL_GetWindowDisplayScale(window.GetSdlWindow()); dpi > 0.0f) { + GetIO().FontGlobalScale = dpi; + } } void OnResize() { @@ -70,7 +118,13 @@ void OnResize() { } void Shutdown(const vk::Device& device) { - device.waitIdle(); + auto result = device.waitIdle(); + if (result != vk::Result::eSuccess) { + LOG_WARNING(ImGui, "Failed to wait for Vulkan device idle on shutdown: {}", + vk::to_string(result)); + } + + TextureManager::StopWorker(); const ImGuiIO& io = GetIO(); const auto ini_filename = (void*)io.IniFilename; @@ -80,31 +134,34 @@ void Shutdown(const vk::Device& device) { Sdl::Shutdown(); DestroyContext(); - SDL_free(ini_filename); - SDL_free(log_filename); + delete[] (char*)ini_filename; + delete[] (char*)log_filename; } bool ProcessEvent(SDL_Event* event) { Sdl::ProcessEvent(event); switch (event->type) { + // Don't block release/up events case SDL_EVENT_MOUSE_MOTION: case SDL_EVENT_MOUSE_WHEEL: - case SDL_EVENT_MOUSE_BUTTON_DOWN: - case SDL_EVENT_MOUSE_BUTTON_UP: - return GetIO().WantCaptureMouse; + case SDL_EVENT_MOUSE_BUTTON_DOWN: { + const auto& io = GetIO(); + return io.WantCaptureMouse && io.Ctx->NavWindow != nullptr && + io.Ctx->NavWindow->ID != dock_id; + } case SDL_EVENT_TEXT_INPUT: - case SDL_EVENT_KEY_DOWN: - case SDL_EVENT_KEY_UP: - return GetIO().WantCaptureKeyboard; + case SDL_EVENT_KEY_DOWN: { + const auto& io = GetIO(); + return io.WantCaptureKeyboard && io.Ctx->NavWindow != nullptr && + io.Ctx->NavWindow->ID != dock_id; + } case SDL_EVENT_GAMEPAD_BUTTON_DOWN: - case SDL_EVENT_GAMEPAD_BUTTON_UP: case SDL_EVENT_GAMEPAD_AXIS_MOTION: - case SDL_EVENT_GAMEPAD_ADDED: - case SDL_EVENT_GAMEPAD_REMOVED: case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: - case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: - case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: - return (GetIO().BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: { + const auto& io = GetIO(); + return io.NavActive && io.Ctx->NavWindow != nullptr && io.Ctx->NavWindow->ID != dock_id; + } default: return false; } @@ -125,21 +182,13 @@ void NewFrame() { } } - Vulkan::NewFrame(); Sdl::NewFrame(); ImGui::NewFrame(); - bool capture_gamepad = false; + DockSpaceOverViewport(0, GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode); + for (auto* layer : layers) { layer->Draw(); - if (layer->ShouldGrabGamepad()) { - capture_gamepad = true; - } - } - if (capture_gamepad) { - GetIO().BackendFlags |= ImGuiBackendFlags_HasGamepad; - } else { - GetIO().BackendFlags &= ~ImGuiBackendFlags_HasGamepad; } } @@ -164,7 +213,7 @@ void Render(const vk::CommandBuffer& cmdbuf, ::Vulkan::Frame* frame) { .storeOp = vk::AttachmentStoreOp::eStore, }, }; - vk::RenderingInfo render_info = {}; + vk::RenderingInfo render_info{}; render_info.renderArea = vk::Rect2D{ .offset = {0, 0}, .extent = {frame->width, frame->height}, diff --git a/src/imgui/renderer/imgui_impl_sdl3.cpp b/src/imgui/renderer/imgui_impl_sdl3.cpp index 2a7d801e4..bb194bff7 100644 --- a/src/imgui/renderer/imgui_impl_sdl3.cpp +++ b/src/imgui/renderer/imgui_impl_sdl3.cpp @@ -703,8 +703,8 @@ static void UpdateGamepads() { const int thumb_dead_zone = 8000; // SDL_gamepad.h suggests using this value. UpdateGamepadButton(bd, io, ImGuiKey_GamepadStart, SDL_GAMEPAD_BUTTON_START); UpdateGamepadButton(bd, io, ImGuiKey_GamepadBack, SDL_GAMEPAD_BUTTON_BACK); - UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceLeft, - SDL_GAMEPAD_BUTTON_WEST); // Xbox X, PS Square + /*UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceLeft, + SDL_GAMEPAD_BUTTON_WEST); // Xbox X, PS Square*/ // Disable to avoid menu toggle UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceRight, SDL_GAMEPAD_BUTTON_EAST); // Xbox B, PS Circle UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceUp, diff --git a/src/imgui/renderer/imgui_impl_vulkan.cpp b/src/imgui/renderer/imgui_impl_vulkan.cpp index 2c1c135f7..7f7ade2a5 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.cpp +++ b/src/imgui/renderer/imgui_impl_vulkan.cpp @@ -4,6 +4,8 @@ // Based on imgui_impl_vulkan.cpp from Dear ImGui repository #include +#include + #include #include "imgui_impl_vulkan.h" @@ -47,13 +49,15 @@ struct VkData { vk::ShaderModule shader_module_vert{}; vk::ShaderModule shader_module_frag{}; + std::mutex command_pool_mutex; + vk::CommandPool command_pool{}; + vk::Sampler simple_sampler{}; + // Font data - vk::Sampler font_sampler{}; vk::DeviceMemory font_memory{}; vk::Image font_image{}; vk::ImageView font_view{}; vk::DescriptorSet font_descriptor_set{}; - vk::CommandPool font_command_pool{}; vk::CommandBuffer font_command_buffer{}; // Render buffers @@ -222,17 +226,57 @@ static inline vk::DeviceSize AlignBufferSize(vk::DeviceSize size, vk::DeviceSize return (size + alignment - 1) & ~(alignment - 1); } -// Register a texture -vk::DescriptorSet AddTexture(vk::Sampler sampler, vk::ImageView image_view, - vk::ImageLayout image_layout) { +void UploadTextureData::Upload() { VkData* bd = GetBackendData(); const InitInfo& v = bd->init_info; + vk::SubmitInfo submit_info{ + .commandBufferCount = 1, + .pCommandBuffers = &command_buffer, + }; + CheckVkErr(v.queue.submit({submit_info})); + CheckVkErr(v.queue.waitIdle()); + + v.device.destroyBuffer(upload_buffer, v.allocator); + v.device.freeMemory(upload_buffer_memory, v.allocator); + { + std::unique_lock lk(bd->command_pool_mutex); + v.device.freeCommandBuffers(bd->command_pool, {command_buffer}); + } + upload_buffer = VK_NULL_HANDLE; + upload_buffer_memory = VK_NULL_HANDLE; +} + +void UploadTextureData::Destroy() { + VkData* bd = GetBackendData(); + const InitInfo& v = bd->init_info; + + CheckVkErr(v.device.waitIdle()); + RemoveTexture(descriptor_set); + descriptor_set = VK_NULL_HANDLE; + + v.device.destroyImageView(image_view, v.allocator); + image_view = VK_NULL_HANDLE; + v.device.destroyImage(image, v.allocator); + image = VK_NULL_HANDLE; + v.device.freeMemory(image_memory, v.allocator); + image_memory = VK_NULL_HANDLE; +} + +// Register a texture +vk::DescriptorSet AddTexture(vk::ImageView image_view, vk::ImageLayout image_layout, + vk::Sampler sampler) { + VkData* bd = GetBackendData(); + const InitInfo& v = bd->init_info; + + if (sampler == VK_NULL_HANDLE) { + sampler = bd->simple_sampler; + } + // Create Descriptor Set: vk::DescriptorSet descriptor_set; { vk::DescriptorSetAllocateInfo alloc_info{ - .sType = vk::StructureType::eDescriptorSetAllocateInfo, .descriptorPool = bd->descriptor_pool, .descriptorSetCount = 1, .pSetLayouts = &bd->descriptor_set_layout, @@ -251,7 +295,6 @@ vk::DescriptorSet AddTexture(vk::Sampler sampler, vk::ImageView image_view, }; vk::WriteDescriptorSet write_desc[1]{ { - .sType = vk::StructureType::eWriteDescriptorSet, .dstSet = descriptor_set, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eCombinedImageSampler, @@ -262,6 +305,164 @@ vk::DescriptorSet AddTexture(vk::Sampler sampler, vk::ImageView image_view, } return descriptor_set; } +UploadTextureData UploadTexture(const void* data, vk::Format format, u32 width, u32 height, + size_t size) { + ImGuiIO& io = GetIO(); + VkData* bd = GetBackendData(); + const InitInfo& v = bd->init_info; + + UploadTextureData info{}; + { + std::unique_lock lk(bd->command_pool_mutex); + info.command_buffer = + CheckVkResult(v.device.allocateCommandBuffers(vk::CommandBufferAllocateInfo{ + .commandPool = bd->command_pool, + .commandBufferCount = 1, + })) + .front(); + CheckVkErr(info.command_buffer.begin(vk::CommandBufferBeginInfo{ + .flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit, + })); + } + + // Create Image + { + vk::ImageCreateInfo image_info{ + .imageType = vk::ImageType::e2D, + .format = format, + .extent{ + .width = width, + .height = height, + .depth = 1, + }, + .mipLevels = 1, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + .tiling = vk::ImageTiling::eOptimal, + .usage = vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled, + .sharingMode = vk::SharingMode::eExclusive, + .initialLayout = vk::ImageLayout::eUndefined, + }; + info.image = CheckVkResult(v.device.createImage(image_info, v.allocator)); + auto req = v.device.getImageMemoryRequirements(info.image); + vk::MemoryAllocateInfo alloc_info{ + .allocationSize = IM_MAX(v.min_allocation_size, req.size), + .memoryTypeIndex = + FindMemoryType(vk::MemoryPropertyFlagBits::eDeviceLocal, req.memoryTypeBits), + }; + info.image_memory = CheckVkResult(v.device.allocateMemory(alloc_info, v.allocator)); + CheckVkErr(v.device.bindImageMemory(info.image, info.image_memory, 0)); + } + + // Create Image View + { + vk::ImageViewCreateInfo view_info{ + .image = info.image, + .viewType = vk::ImageViewType::e2D, + .format = format, + .subresourceRange{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .levelCount = 1, + .layerCount = 1, + }, + }; + info.image_view = CheckVkResult(v.device.createImageView(view_info, v.allocator)); + } + + // Create descriptor set (ImTextureID) + info.descriptor_set = AddTexture(info.image_view, vk::ImageLayout::eShaderReadOnlyOptimal); + + // Create Upload Buffer + { + vk::BufferCreateInfo buffer_info{ + .size = size, + .usage = vk::BufferUsageFlagBits::eTransferSrc, + .sharingMode = vk::SharingMode::eExclusive, + }; + info.upload_buffer = CheckVkResult(v.device.createBuffer(buffer_info, v.allocator)); + auto req = v.device.getBufferMemoryRequirements(info.upload_buffer); + auto alignemtn = IM_MAX(bd->buffer_memory_alignment, req.alignment); + vk::MemoryAllocateInfo alloc_info{ + .allocationSize = IM_MAX(v.min_allocation_size, req.size), + .memoryTypeIndex = + FindMemoryType(vk::MemoryPropertyFlagBits::eHostVisible, req.memoryTypeBits), + }; + info.upload_buffer_memory = CheckVkResult(v.device.allocateMemory(alloc_info, v.allocator)); + CheckVkErr(v.device.bindBufferMemory(info.upload_buffer, info.upload_buffer_memory, 0)); + } + + // Upload to Buffer + { + char* map = (char*)CheckVkResult(v.device.mapMemory(info.upload_buffer_memory, 0, size)); + memcpy(map, data, size); + vk::MappedMemoryRange range[1]{ + { + .memory = info.upload_buffer_memory, + .size = size, + }, + }; + CheckVkErr(v.device.flushMappedMemoryRanges(range)); + v.device.unmapMemory(info.upload_buffer_memory); + } + + // Copy to Image + { + vk::ImageMemoryBarrier copy_barrier[1]{ + { + .dstAccessMask = vk::AccessFlagBits::eTransferWrite, + .oldLayout = vk::ImageLayout::eUndefined, + .newLayout = vk::ImageLayout::eTransferDstOptimal, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = info.image, + .subresourceRange{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .levelCount = 1, + .layerCount = 1, + }, + }, + }; + info.command_buffer.pipelineBarrier(vk::PipelineStageFlagBits::eHost, + vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, + {copy_barrier}); + + vk::BufferImageCopy region{ + .imageSubresource{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .layerCount = 1, + }, + .imageExtent{ + .width = width, + .height = height, + .depth = 1, + }, + }; + info.command_buffer.copyBufferToImage(info.upload_buffer, info.image, + vk::ImageLayout::eTransferDstOptimal, {region}); + + vk::ImageMemoryBarrier use_barrier[1]{{ + .srcAccessMask = vk::AccessFlagBits::eTransferWrite, + .dstAccessMask = vk::AccessFlagBits::eShaderRead, + .oldLayout = vk::ImageLayout::eTransferDstOptimal, + .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = info.image, + .subresourceRange{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .levelCount = 1, + .layerCount = 1, + }, + }}; + info.command_buffer.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eFragmentShader, {}, {}, {}, + {use_barrier}); + } + + CheckVkErr(info.command_buffer.end()); + + return info; +} void RemoveTexture(vk::DescriptorSet descriptor_set) { VkData* bd = GetBackendData(); @@ -283,7 +484,6 @@ static void CreateOrResizeBuffer(RenderBuffer& rb, size_t new_size, vk::BufferUs const vk::DeviceSize buffer_size_aligned = AlignBufferSize(IM_MAX(v.min_allocation_size, new_size), bd->buffer_memory_alignment); vk::BufferCreateInfo buffer_info{ - .sType = vk::StructureType::eBufferCreateInfo, .size = buffer_size_aligned, .usage = usage, .sharingMode = vk::SharingMode::eExclusive, @@ -293,7 +493,6 @@ static void CreateOrResizeBuffer(RenderBuffer& rb, size_t new_size, vk::BufferUs const vk::MemoryRequirements req = v.device.getBufferMemoryRequirements(rb.buffer); bd->buffer_memory_alignment = IM_MAX(bd->buffer_memory_alignment, req.alignment); vk::MemoryAllocateInfo alloc_info{ - .sType = vk::StructureType::eMemoryAllocateInfo, .allocationSize = req.size, .memoryTypeIndex = FindMemoryType(vk::MemoryPropertyFlagBits::eHostVisible, req.memoryTypeBits), @@ -403,12 +602,10 @@ void RenderDrawData(ImDrawData& draw_data, vk::CommandBuffer command_buffer, } vk::MappedMemoryRange range[2]{ { - .sType = vk::StructureType::eMappedMemoryRange, .memory = frb.vertex.buffer_memory, .size = VK_WHOLE_SIZE, }, { - .sType = vk::StructureType::eMappedMemoryRange, .memory = frb.index.buffer_memory, .size = VK_WHOLE_SIZE, }, @@ -517,29 +714,20 @@ static bool CreateFontsTexture() { DestroyFontsTexture(); } - // Create command pool/buffer - if (bd->font_command_pool == VK_NULL_HANDLE) { - vk::CommandPoolCreateInfo info{ - .sType = vk::StructureType::eCommandPoolCreateInfo, - .flags = vk::CommandPoolCreateFlags{}, - .queueFamilyIndex = v.queue_family, - }; - bd->font_command_pool = CheckVkResult(v.device.createCommandPool(info, v.allocator)); - } + // Create command buffer if (bd->font_command_buffer == VK_NULL_HANDLE) { vk::CommandBufferAllocateInfo info{ - .sType = vk::StructureType::eCommandBufferAllocateInfo, - .commandPool = bd->font_command_pool, + .commandPool = bd->command_pool, .commandBufferCount = 1, }; + std::unique_lock lk(bd->command_pool_mutex); bd->font_command_buffer = CheckVkResult(v.device.allocateCommandBuffers(info)).front(); } // Start command buffer { - CheckVkErr(v.device.resetCommandPool(bd->font_command_pool, vk::CommandPoolResetFlags{})); + CheckVkErr(bd->font_command_buffer.reset()); vk::CommandBufferBeginInfo begin_info{}; - begin_info.sType = vk::StructureType::eCommandBufferBeginInfo; begin_info.flags |= vk::CommandBufferUsageFlagBits::eOneTimeSubmit; CheckVkErr(bd->font_command_buffer.begin(&begin_info)); } @@ -552,7 +740,6 @@ static bool CreateFontsTexture() { // Create the Image: { vk::ImageCreateInfo info{ - .sType = vk::StructureType::eImageCreateInfo, .imageType = vk::ImageType::e2D, .format = vk::Format::eR8G8B8A8Unorm, .extent{ @@ -571,7 +758,6 @@ static bool CreateFontsTexture() { bd->font_image = CheckVkResult(v.device.createImage(info, v.allocator)); vk::MemoryRequirements req = v.device.getImageMemoryRequirements(bd->font_image); vk::MemoryAllocateInfo alloc_info{ - .sType = vk::StructureType::eMemoryAllocateInfo, .allocationSize = IM_MAX(v.min_allocation_size, req.size), .memoryTypeIndex = FindMemoryType(vk::MemoryPropertyFlagBits::eDeviceLocal, req.memoryTypeBits), @@ -583,7 +769,6 @@ static bool CreateFontsTexture() { // Create the Image View: { vk::ImageViewCreateInfo info{ - .sType = vk::StructureType::eImageViewCreateInfo, .image = bd->font_image, .viewType = vk::ImageViewType::e2D, .format = vk::Format::eR8G8B8A8Unorm, @@ -597,15 +782,13 @@ static bool CreateFontsTexture() { } // Create the Descriptor Set: - bd->font_descriptor_set = - AddTexture(bd->font_sampler, bd->font_view, vk::ImageLayout::eShaderReadOnlyOptimal); + bd->font_descriptor_set = AddTexture(bd->font_view, vk::ImageLayout::eShaderReadOnlyOptimal); // Create the Upload Buffer: vk::DeviceMemory upload_buffer_memory{}; vk::Buffer upload_buffer{}; { vk::BufferCreateInfo buffer_info{ - .sType = vk::StructureType::eBufferCreateInfo, .size = upload_size, .usage = vk::BufferUsageFlagBits::eTransferSrc, .sharingMode = vk::SharingMode::eExclusive, @@ -614,7 +797,6 @@ static bool CreateFontsTexture() { vk::MemoryRequirements req = v.device.getBufferMemoryRequirements(upload_buffer); bd->buffer_memory_alignment = IM_MAX(bd->buffer_memory_alignment, req.alignment); vk::MemoryAllocateInfo alloc_info{ - .sType = vk::StructureType::eMemoryAllocateInfo, .allocationSize = IM_MAX(v.min_allocation_size, req.size), .memoryTypeIndex = FindMemoryType(vk::MemoryPropertyFlagBits::eHostVisible, req.memoryTypeBits), @@ -629,7 +811,6 @@ static bool CreateFontsTexture() { memcpy(map, pixels, upload_size); vk::MappedMemoryRange range[1]{ { - .sType = vk::StructureType::eMappedMemoryRange, .memory = upload_buffer_memory, .size = upload_size, }, @@ -642,7 +823,6 @@ static bool CreateFontsTexture() { { vk::ImageMemoryBarrier copy_barrier[1]{ { - .sType = vk::StructureType::eImageMemoryBarrier, .dstAccessMask = vk::AccessFlagBits::eTransferWrite, .oldLayout = vk::ImageLayout::eUndefined, .newLayout = vk::ImageLayout::eTransferDstOptimal, @@ -675,7 +855,6 @@ static bool CreateFontsTexture() { vk::ImageLayout::eTransferDstOptimal, {region}); vk::ImageMemoryBarrier use_barrier[1]{{ - .sType = vk::StructureType::eImageMemoryBarrier, .srcAccessMask = vk::AccessFlagBits::eTransferWrite, .dstAccessMask = vk::AccessFlagBits::eShaderRead, .oldLayout = vk::ImageLayout::eTransferDstOptimal, @@ -695,11 +874,10 @@ static bool CreateFontsTexture() { } // Store our identifier - io.Fonts->SetTexID((ImTextureID)bd->font_descriptor_set); + io.Fonts->SetTexID(bd->font_descriptor_set); // End command buffer vk::SubmitInfo end_info = {}; - end_info.sType = vk::StructureType::eSubmitInfo; end_info.commandBufferCount = 1; end_info.pCommandBuffers = &bd->font_command_buffer; CheckVkErr(bd->font_command_buffer.end()); @@ -768,7 +946,6 @@ static void CreateShaderModules(vk::Device device, const vk::AllocationCallbacks VkData* bd = GetBackendData(); if (bd->shader_module_vert == VK_NULL_HANDLE) { vk::ShaderModuleCreateInfo vert_info{ - .sType = vk::StructureType::eShaderModuleCreateInfo, .codeSize = sizeof(glsl_shader_vert_spv), .pCode = (uint32_t*)glsl_shader_vert_spv, }; @@ -776,7 +953,6 @@ static void CreateShaderModules(vk::Device device, const vk::AllocationCallbacks } if (bd->shader_module_frag == VK_NULL_HANDLE) { vk::ShaderModuleCreateInfo frag_info{ - .sType = vk::StructureType::eShaderModuleCreateInfo, .codeSize = sizeof(glsl_shader_frag_spv), .pCode = (uint32_t*)glsl_shader_frag_spv, }; @@ -794,13 +970,11 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all vk::PipelineShaderStageCreateInfo stage[2]{ { - .sType = vk::StructureType::ePipelineShaderStageCreateInfo, .stage = vk::ShaderStageFlagBits::eVertex, .module = bd->shader_module_vert, .pName = "main", }, { - .sType = vk::StructureType::ePipelineShaderStageCreateInfo, .stage = vk::ShaderStageFlagBits::eFragment, .module = bd->shader_module_frag, .pName = "main", @@ -836,7 +1010,6 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all }; vk::PipelineVertexInputStateCreateInfo vertex_info{ - .sType = vk::StructureType::ePipelineVertexInputStateCreateInfo, .vertexBindingDescriptionCount = 1, .pVertexBindingDescriptions = binding_desc, .vertexAttributeDescriptionCount = 3, @@ -844,18 +1017,15 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all }; vk::PipelineInputAssemblyStateCreateInfo ia_info{ - .sType = vk::StructureType::ePipelineInputAssemblyStateCreateInfo, .topology = vk::PrimitiveTopology::eTriangleList, }; vk::PipelineViewportStateCreateInfo viewport_info{ - .sType = vk::StructureType::ePipelineViewportStateCreateInfo, .viewportCount = 1, .scissorCount = 1, }; vk::PipelineRasterizationStateCreateInfo raster_info{ - .sType = vk::StructureType::ePipelineRasterizationStateCreateInfo, .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eNone, .frontFace = vk::FrontFace::eCounterClockwise, @@ -863,7 +1033,6 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all }; vk::PipelineMultisampleStateCreateInfo ms_info{ - .sType = vk::StructureType::ePipelineMultisampleStateCreateInfo, .rasterizationSamples = vk::SampleCountFlagBits::e1, }; @@ -881,12 +1050,9 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all }, }; - vk::PipelineDepthStencilStateCreateInfo depth_info{ - .sType = vk::StructureType::ePipelineDepthStencilStateCreateInfo, - }; + vk::PipelineDepthStencilStateCreateInfo depth_info{}; vk::PipelineColorBlendStateCreateInfo blend_info{ - .sType = vk::StructureType::ePipelineColorBlendStateCreateInfo, .attachmentCount = 1, .pAttachments = color_attachment, }; @@ -896,13 +1062,11 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all vk::DynamicState::eScissor, }; vk::PipelineDynamicStateCreateInfo dynamic_state{ - .sType = vk::StructureType::ePipelineDynamicStateCreateInfo, .dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states), .pDynamicStates = dynamic_states, }; vk::GraphicsPipelineCreateInfo info{ - .sType = vk::StructureType::eGraphicsPipelineCreateInfo, .pNext = &v.pipeline_rendering_create_info, .flags = bd->pipeline_create_flags, .stageCount = 2, @@ -946,7 +1110,6 @@ bool CreateDeviceObjects() { }; vk::DescriptorPoolCreateInfo pool_info{ - .sType = vk::StructureType::eDescriptorPoolCreateInfo, .flags = vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet, .maxSets = 1000, .poolSizeCount = std::size(pool_sizes), @@ -956,25 +1119,6 @@ bool CreateDeviceObjects() { bd->descriptor_pool = CheckVkResult(v.device.createDescriptorPool(pool_info)); } - if (!bd->font_sampler) { - // Bilinear sampling is required by default. Set 'io.Fonts->Flags |= - // ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow - // point/nearest sampling. - vk::SamplerCreateInfo info{ - .sType = vk::StructureType::eSamplerCreateInfo, - .magFilter = vk::Filter::eLinear, - .minFilter = vk::Filter::eLinear, - .mipmapMode = vk::SamplerMipmapMode::eLinear, - .addressModeU = vk::SamplerAddressMode::eRepeat, - .addressModeV = vk::SamplerAddressMode::eRepeat, - .addressModeW = vk::SamplerAddressMode::eRepeat, - .maxAnisotropy = 1.0f, - .minLod = -1000, - .maxLod = 1000, - }; - bd->font_sampler = CheckVkResult(v.device.createSampler(info, v.allocator)); - } - if (!bd->descriptor_set_layout) { vk::DescriptorSetLayoutBinding binding[1]{ { @@ -984,7 +1128,6 @@ bool CreateDeviceObjects() { }, }; vk::DescriptorSetLayoutCreateInfo info{ - .sType = vk::StructureType::eDescriptorSetLayoutCreateInfo, .bindingCount = 1, .pBindings = binding, }; @@ -1004,7 +1147,6 @@ bool CreateDeviceObjects() { }; vk::DescriptorSetLayout set_layout[1] = {bd->descriptor_set_layout}; vk::PipelineLayoutCreateInfo layout_info{ - .sType = vk::StructureType::ePipelineLayoutCreateInfo, .setLayoutCount = 1, .pSetLayouts = set_layout, .pushConstantRangeCount = 1, @@ -1016,6 +1158,33 @@ bool CreateDeviceObjects() { CreatePipeline(v.device, v.allocator, v.pipeline_cache, nullptr, &bd->pipeline, v.subpass); + if (bd->command_pool == VK_NULL_HANDLE) { + vk::CommandPoolCreateInfo info{ + .flags = vk::CommandPoolCreateFlagBits::eResetCommandBuffer, + .queueFamilyIndex = v.queue_family, + }; + std::unique_lock lk(bd->command_pool_mutex); + bd->command_pool = CheckVkResult(v.device.createCommandPool(info, v.allocator)); + } + + if (!bd->simple_sampler) { + // Bilinear sampling is required by default. Set 'io.Fonts->Flags |= + // ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow + // point/nearest sampling. + vk::SamplerCreateInfo info{ + .magFilter = vk::Filter::eLinear, + .minFilter = vk::Filter::eLinear, + .mipmapMode = vk::SamplerMipmapMode::eLinear, + .addressModeU = vk::SamplerAddressMode::eRepeat, + .addressModeV = vk::SamplerAddressMode::eRepeat, + .addressModeW = vk::SamplerAddressMode::eRepeat, + .maxAnisotropy = 1.0f, + .minLod = -1000, + .maxLod = 1000, + }; + bd->simple_sampler = CheckVkResult(v.device.createSampler(info, v.allocator)); + } + return true; } @@ -1026,12 +1195,14 @@ void ImGuiImplVulkanDestroyDeviceObjects() { DestroyFontsTexture(); if (bd->font_command_buffer) { - v.device.freeCommandBuffers(bd->font_command_pool, {bd->font_command_buffer}); + std::unique_lock lk(bd->command_pool_mutex); + v.device.freeCommandBuffers(bd->command_pool, {bd->font_command_buffer}); bd->font_command_buffer = VK_NULL_HANDLE; } - if (bd->font_command_pool) { - v.device.destroyCommandPool(bd->font_command_pool, v.allocator); - bd->font_command_pool = VK_NULL_HANDLE; + if (bd->command_pool) { + std::unique_lock lk(bd->command_pool_mutex); + v.device.destroyCommandPool(bd->command_pool, v.allocator); + bd->command_pool = VK_NULL_HANDLE; } if (bd->shader_module_vert) { v.device.destroyShaderModule(bd->shader_module_vert, v.allocator); @@ -1041,9 +1212,9 @@ void ImGuiImplVulkanDestroyDeviceObjects() { v.device.destroyShaderModule(bd->shader_module_frag, v.allocator); bd->shader_module_frag = VK_NULL_HANDLE; } - if (bd->font_sampler) { - v.device.destroySampler(bd->font_sampler, v.allocator); - bd->font_sampler = VK_NULL_HANDLE; + if (bd->simple_sampler) { + v.device.destroySampler(bd->simple_sampler, v.allocator); + bd->simple_sampler = VK_NULL_HANDLE; } if (bd->descriptor_set_layout) { v.device.destroyDescriptorSetLayout(bd->descriptor_set_layout, v.allocator); @@ -1095,13 +1266,4 @@ void Shutdown() { IM_DELETE(bd); } -void NewFrame() { - VkData* bd = GetBackendData(); - IM_ASSERT(bd != nullptr && - "Context or backend not initialized! Did you call ImGuiImplVulkanInit()?"); - - if (!bd->font_descriptor_set) - CreateFontsTexture(); -} - } // namespace ImGui::Vulkan diff --git a/src/imgui/renderer/imgui_impl_vulkan.h b/src/imgui/renderer/imgui_impl_vulkan.h index e68b8723f..e325e2a8d 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.h +++ b/src/imgui/renderer/imgui_impl_vulkan.h @@ -5,7 +5,7 @@ #pragma once -#define VULKAN_HPP_NO_EXCEPTIONS +#include "common/types.h" #include "video_core/renderer_vulkan/vk_common.h" struct ImDrawData; @@ -29,14 +29,33 @@ struct InitInfo { void (*check_vk_result_fn)(vk::Result err); }; -vk::DescriptorSet AddTexture(vk::Sampler sampler, vk::ImageView image_view, - vk::ImageLayout image_layout); +// Prepare all resources needed for uploading textures +// Caller should clean up the returned data. +struct UploadTextureData { + vk::Image image; + vk::ImageView image_view; + vk::DescriptorSet descriptor_set; + vk::DeviceMemory image_memory; + + vk::CommandBuffer command_buffer; // Submit to the queue + vk::Buffer upload_buffer; + vk::DeviceMemory upload_buffer_memory; + + void Upload(); + + void Destroy(); +}; + +vk::DescriptorSet AddTexture(vk::ImageView image_view, vk::ImageLayout image_layout, + vk::Sampler sampler = VK_NULL_HANDLE); + +UploadTextureData UploadTexture(const void* data, vk::Format format, u32 width, u32 height, + size_t size); void RemoveTexture(vk::DescriptorSet descriptor_set); bool Init(InitInfo info); void Shutdown(); -void NewFrame(); void RenderDrawData(ImDrawData& draw_data, vk::CommandBuffer command_buffer, vk::Pipeline pipeline = VK_NULL_HANDLE); diff --git a/src/imgui/renderer/texture_manager.cpp b/src/imgui/renderer/texture_manager.cpp new file mode 100644 index 000000000..ba4a05d01 --- /dev/null +++ b/src/imgui/renderer/texture_manager.cpp @@ -0,0 +1,243 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include + +#include + +#include "common/assert.h" +#include "common/io_file.h" +#include "common/polyfill_thread.h" +#include "imgui_impl_vulkan.h" +#include "texture_manager.h" + +namespace ImGui { + +namespace Core::TextureManager { +struct Inner { + std::atomic_int count = 0; + ImTextureID texture_id = nullptr; + u32 width = 0; + u32 height = 0; + + Vulkan::UploadTextureData upload_data; + + ~Inner(); +}; +} // namespace Core::TextureManager + +using namespace Core::TextureManager; + +RefCountedTexture::RefCountedTexture(Inner* inner) : inner(inner) { + ++inner->count; +} + +RefCountedTexture RefCountedTexture::DecodePngTexture(std::vector data) { + const auto core = new Inner; + Core::TextureManager::DecodePngTexture(std::move(data), core); + return RefCountedTexture(core); +} + +RefCountedTexture RefCountedTexture::DecodePngFile(std::filesystem::path path) { + const auto core = new Inner; + Core::TextureManager::DecodePngFile(std::move(path), core); + return RefCountedTexture(core); +} + +RefCountedTexture::RefCountedTexture() : inner(nullptr) {} + +RefCountedTexture::RefCountedTexture(const RefCountedTexture& other) : inner(other.inner) { + if (inner != nullptr) { + ++inner->count; + } +} + +RefCountedTexture::RefCountedTexture(RefCountedTexture&& other) noexcept : inner(other.inner) { + other.inner = nullptr; +} + +RefCountedTexture& RefCountedTexture::operator=(const RefCountedTexture& other) { + if (this == &other) + return *this; + inner = other.inner; + if (inner != nullptr) { + ++inner->count; + } + return *this; +} + +RefCountedTexture& RefCountedTexture::operator=(RefCountedTexture&& other) noexcept { + if (this == &other) + return *this; + std::swap(inner, other.inner); + return *this; +} + +RefCountedTexture::~RefCountedTexture() { + if (inner != nullptr) { + if (inner->count.fetch_sub(1) == 1) { + delete inner; + } + } +} +RefCountedTexture::Image RefCountedTexture::GetTexture() const { + if (inner == nullptr) { + return {}; + } + return Image{ + .im_id = inner->texture_id, + .width = inner->width, + .height = inner->height, + }; +} +RefCountedTexture::operator bool() const { + return inner != nullptr && inner->texture_id != nullptr; +} + +struct Job { + Inner* core; + std::vector data; + std::filesystem::path path; +}; + +struct UploadJob { + Inner* core = nullptr; + Vulkan::UploadTextureData data; + int tick = 0; // Used to skip the first frame when destroying to await the current frame to draw +}; + +static bool g_is_worker_running = false; +static std::jthread g_worker_thread; +static std::condition_variable g_worker_cv; + +static std::mutex g_job_list_mtx; +static std::deque g_job_list; + +static std::mutex g_upload_mtx; +static std::deque g_upload_list; + +namespace Core::TextureManager { + +Inner::~Inner() { + if (upload_data.descriptor_set != nullptr) { + std::unique_lock lk{g_upload_mtx}; + g_upload_list.emplace_back(UploadJob{ + .data = this->upload_data, + .tick = 2, + }); + } +} + +void WorkerLoop() { + std::mutex mtx; + while (g_is_worker_running) { + std::unique_lock lk{mtx}; + g_worker_cv.wait(lk); + if (!g_is_worker_running) { + break; + } + while (true) { + g_job_list_mtx.lock(); + if (g_job_list.empty()) { + g_job_list_mtx.unlock(); + break; + } + auto [core, png_raw, path] = std::move(g_job_list.front()); + g_job_list.pop_front(); + g_job_list_mtx.unlock(); + + if (!path.empty()) { // Decode PNG from file + Common::FS::IOFile file(path, Common::FS::FileAccessMode::Read); + if (!file.IsOpen()) { + LOG_ERROR(ImGui, "Failed to open PNG file: {}", path.string()); + continue; + } + png_raw.resize(file.GetSize()); + file.Seek(0); + file.ReadRaw(png_raw.data(), png_raw.size()); + file.Close(); + } + + int width, height; + const stbi_uc* pixels = + stbi_load_from_memory(png_raw.data(), png_raw.size(), &width, &height, nullptr, 4); + + auto texture = Vulkan::UploadTexture(pixels, vk::Format::eR8G8B8A8Unorm, width, height, + width * height * 4 * sizeof(stbi_uc)); + + core->upload_data = texture; + core->width = width; + core->height = height; + + std::unique_lock upload_lk{g_upload_mtx}; + g_upload_list.emplace_back(UploadJob{ + .core = core, + }); + } + } +} + +void StartWorker() { + ASSERT(!g_is_worker_running); + g_worker_thread = std::jthread(WorkerLoop); + g_is_worker_running = true; +} + +void StopWorker() { + ASSERT(g_is_worker_running); + g_is_worker_running = false; + g_worker_cv.notify_one(); +} + +void DecodePngTexture(std::vector data, Inner* core) { + ++core->count; + Job job{ + .core = core, + .data = std::move(data), + }; + std::unique_lock lk{g_job_list_mtx}; + g_job_list.push_back(std::move(job)); + g_worker_cv.notify_one(); +} + +void DecodePngFile(std::filesystem::path path, Inner* core) { + ++core->count; + Job job{ + .core = core, + .path = std::move(path), + }; + std::unique_lock lk{g_job_list_mtx}; + g_job_list.push_back(std::move(job)); + g_worker_cv.notify_one(); +} + +void Submit() { + UploadJob upload; + { + std::unique_lock lk{g_upload_mtx}; + if (g_upload_list.empty()) { + return; + } + // Upload one texture at a time to avoid slow down + upload = g_upload_list.front(); + g_upload_list.pop_front(); + if (upload.tick > 0) { + --upload.tick; + g_upload_list.emplace_back(upload); + return; + } + } + if (upload.core != nullptr) { + upload.core->upload_data.Upload(); + upload.core->texture_id = upload.core->upload_data.descriptor_set; + if (upload.core->count.fetch_sub(1) == 1) { + delete upload.core; + } + } else { + upload.data.Destroy(); + } +} +} // namespace Core::TextureManager + +} // namespace ImGui \ No newline at end of file diff --git a/src/imgui/renderer/texture_manager.h b/src/imgui/renderer/texture_manager.h new file mode 100644 index 000000000..4fa7b9924 --- /dev/null +++ b/src/imgui/renderer/texture_manager.h @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "common/types.h" +#include "imgui/imgui_texture.h" + +namespace vk { +class CommandBuffer; +} + +namespace ImGui::Core::TextureManager { + +struct Inner; + +void StartWorker(); + +void StopWorker(); + +void DecodePngTexture(std::vector data, Inner* core); + +void DecodePngFile(std::filesystem::path path, Inner* core); + +void Submit(); + +}; // namespace ImGui::Core::TextureManager \ No newline at end of file diff --git a/src/input/controller.cpp b/src/input/controller.cpp index 4de6d83b8..dcd8ed946 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -127,7 +127,7 @@ void GameController::SetLightBarRGB(u8 r, u8 g, u8 b) { bool GameController::SetVibration(u8 smallMotor, u8 largeMotor) { if (m_sdl_gamepad != nullptr) { return SDL_RumbleGamepad(m_sdl_gamepad, (smallMotor / 255.0f) * 0xFFFF, - (largeMotor / 255.0f) * 0xFFFF, -1) == 0; + (largeMotor / 255.0f) * 0xFFFF, -1); } return true; } diff --git a/src/main.cpp b/src/main.cpp index 9df14f138..de1d92326 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,15 +2,38 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include "common/memory_patcher.h" #include "emulator.h" +#ifdef _WIN32 +#include +#endif + int main(int argc, char* argv[]) { +#ifdef _WIN32 + SetConsoleOutputCP(CP_UTF8); +#endif + if (argc == 1) { fmt::print("Usage: {} \n", argv[0]); return -1; } + // check if eboot file exists + if (!std::filesystem::exists(argv[1])) { + fmt::print("Eboot.bin file not found\n"); + return -1; + } + + for (int i = 0; i < argc; i++) { + std::string curArg = argv[i]; + if (curArg == "-p") { + std::string patchFile = argv[i + 1]; + MemoryPatcher::patchFile = patchFile; + } + } Core::Emulator emulator; emulator.Run(argv[1]); + return 0; } diff --git a/src/qt_gui/background_music_player.cpp b/src/qt_gui/background_music_player.cpp new file mode 100644 index 000000000..a40c5bfae --- /dev/null +++ b/src/qt_gui/background_music_player.cpp @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "background_music_player.h" + +BackgroundMusicPlayer::BackgroundMusicPlayer(QObject* parent) : QObject(parent) { + m_mediaPlayer = new QMediaPlayer(this); + m_audioOutput = new QAudioOutput(this); + m_mediaPlayer->setAudioOutput(m_audioOutput); + m_mediaPlayer->setLoops(QMediaPlayer::Infinite); +} + +void BackgroundMusicPlayer::setVolume(int volume) { + float linearVolume = QAudio::convertVolume(volume / 100.0f, QAudio::LogarithmicVolumeScale, + QAudio::LinearVolumeScale); + m_audioOutput->setVolume(linearVolume); +} + +void BackgroundMusicPlayer::playMusic(const QString& snd0path) { + if (snd0path.isEmpty()) { + stopMusic(); + return; + } + const auto newMusic = QUrl::fromLocalFile(snd0path); + if (m_mediaPlayer->playbackState() == QMediaPlayer::PlayingState && + m_currentMusic == newMusic) { + // already playing the correct music + return; + } + + m_currentMusic = newMusic; + m_mediaPlayer->setSource(newMusic); + m_mediaPlayer->play(); +} + +void BackgroundMusicPlayer::stopMusic() { + m_mediaPlayer->stop(); +} diff --git a/src/qt_gui/background_music_player.h b/src/qt_gui/background_music_player.h new file mode 100644 index 000000000..6d70fe68c --- /dev/null +++ b/src/qt_gui/background_music_player.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include + +class BackgroundMusicPlayer : public QObject { + Q_OBJECT + +public: + static BackgroundMusicPlayer& getInstance() { + static BackgroundMusicPlayer instance; + return instance; + } + + void setVolume(int volume); + void playMusic(const QString& snd0path); + void stopMusic(); + +private: + BackgroundMusicPlayer(QObject* parent = nullptr); + + QMediaPlayer* m_mediaPlayer; + QAudioOutput* m_audioOutput; + QUrl m_currentMusic; +}; diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 1c30f7e92..c044c2c3c 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -28,9 +28,9 @@ #include #include #include "cheats_patches.h" +#include "common/memory_patcher.h" #include "common/path_util.h" #include "core/module.h" -#include "qt_gui/memory_patcher.h" using namespace Common::FS; @@ -50,8 +50,9 @@ void CheatsPatches::setupUI() { defaultTextEdit = tr("defaultTextEdit_MSG"); defaultTextEdit.replace("\\n", "\n"); - QString CHEATS_DIR_QString = - QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::CheatsDir).string()); + QString CHEATS_DIR_QString; + Common::FS::PathToQString(CHEATS_DIR_QString, + Common::FS::GetUserPath(Common::FS::PathType::CheatsDir)); QString NameCheatJson = m_gameSerial + "_" + m_gameVersion + ".json"; m_cheatFilePath = CHEATS_DIR_QString + "/" + NameCheatJson; @@ -275,9 +276,9 @@ void CheatsPatches::onSaveButtonClicked() { int separatorIndex = selectedPatchName.indexOf(" | "); selectedPatchName = selectedPatchName.mid(separatorIndex + 3); - QString patchDir = - QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::PatchesDir).string()) + - "/" + selectedPatchName; + QString patchDir; + Common::FS::PathToQString(patchDir, Common::FS::GetUserPath(Common::FS::PathType::PatchesDir)); + patchDir += "/" + selectedPatchName; QString filesJsonPath = patchDir + "/files.json"; QFile jsonFile(filesJsonPath); @@ -455,10 +456,9 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer if (source == "GoldHEN") { url = "https://raw.githubusercontent.com/GoldHEN/GoldHEN_Cheat_Repository/main/json.txt"; } else if (source == "wolf2022") { - url = "https://wolf2022.ir/trainer/" + gameSerial + "_" + gameVersion + ".json"; + url = "https://wolf2022.ir/trainer/list.json"; } else if (source == "shadPS4") { - url = "https://raw.githubusercontent.com/shadps4-emu/ps4_cheats/main/" - "CHEATS_JSON.txt"; + url = "https://raw.githubusercontent.com/shadps4-emu/ps4_cheats/main/CHEATS_JSON.txt"; } else { QMessageBox::warning(this, tr("Invalid Source"), QString(tr("The selected source is invalid.") + "\n%1").arg(source)); @@ -473,44 +473,32 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer QByteArray jsonData = reply->readAll(); bool foundFiles = false; - if (source == "GoldHEN" || source == "shadPS4") { - QString textContent(jsonData); - QRegularExpression regex( - QString("%1_%2[^=]*\\.json").arg(gameSerial).arg(gameVersion)); - QRegularExpressionMatchIterator matches = regex.globalMatch(textContent); - QString baseUrl; + if (source == "wolf2022") { + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); + QJsonArray gamesArray = jsonDoc.object().value("games").toArray(); - if (source == "GoldHEN") { - baseUrl = "https://raw.githubusercontent.com/GoldHEN/GoldHEN_Cheat_Repository/" - "main/json/"; - } else { - baseUrl = "https://raw.githubusercontent.com/shadps4-emu/ps4_cheats/" - "main/CHEATS/"; - } + foreach (const QJsonValue& value, gamesArray) { + QJsonObject gameObject = value.toObject(); + QString title = gameObject.value("title").toString(); + QString version = gameObject.value("version").toString(); - while (matches.hasNext()) { - QRegularExpressionMatch match = matches.next(); - QString fileName = match.captured(0); + if (title == gameSerial && + (version == gameVersion || version == gameVersion.mid(1))) { + QString fileUrl = + "https://wolf2022.ir/trainer/" + gameObject.value("url").toString(); - if (!fileName.isEmpty()) { - QString newFileName = fileName; - int dotIndex = newFileName.lastIndexOf('.'); - if (dotIndex != -1) { + QString localFileName = gameObject.value("url").toString(); + localFileName = + localFileName.left(localFileName.lastIndexOf('.')) + "_wolf2022.json"; - if (source == "GoldHEN") { - newFileName.insert(dotIndex, "_GoldHEN"); - } else { - newFileName.insert(dotIndex, "_shadPS4"); - } - } - QString fileUrl = baseUrl + fileName; - QString localFilePath = dir.filePath(newFileName); + QString localFilePath = dir.filePath(localFileName); if (QFile::exists(localFilePath) && showMessageBox) { QMessageBox::StandardButton reply; reply = QMessageBox::question( this, tr("File Exists"), - tr("File already exists. Do you want to replace it?"), + tr("File already exists. Do you want to replace it?") + "\n" + + localFileName, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { continue; @@ -548,38 +536,81 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer if (!foundFiles && showMessageBox) { QMessageBox::warning(this, tr("Cheats Not Found"), tr("CheatsNotFound_MSG")); } - } else if (source == "wolf2022") { - QString fileName = QFileInfo(QUrl(url).path()).fileName(); - QString baseFileName = fileName; - int dotIndex = baseFileName.lastIndexOf('.'); - if (dotIndex != -1) { - baseFileName.insert(dotIndex, "_wolf2022"); + } else if (source == "GoldHEN" || source == "shadPS4") { + QString textContent(jsonData); + QRegularExpression regex( + QString("%1_%2[^=]*\\.json").arg(gameSerial).arg(gameVersion)); + QRegularExpressionMatchIterator matches = regex.globalMatch(textContent); + QString baseUrl; + + if (source == "GoldHEN") { + baseUrl = "https://raw.githubusercontent.com/GoldHEN/GoldHEN_Cheat_Repository/" + "main/json/"; + } else { + baseUrl = "https://raw.githubusercontent.com/shadps4-emu/ps4_cheats/" + "main/CHEATS/"; } - QString filePath = - QString::fromStdString( - Common::FS::GetUserPath(Common::FS::PathType::CheatsDir).string()) + - "/" + baseFileName; - if (QFile::exists(filePath) && showMessageBox) { - QMessageBox::StandardButton reply2; - reply2 = - QMessageBox::question(this, tr("File Exists"), - tr("File already exists. Do you want to replace it?"), - QMessageBox::Yes | QMessageBox::No); - if (reply2 == QMessageBox::No) { - reply->deleteLater(); - return; + + while (matches.hasNext()) { + QRegularExpressionMatch match = matches.next(); + QString fileName = match.captured(0); + + if (!fileName.isEmpty()) { + QString newFileName = fileName; + int dotIndex = newFileName.lastIndexOf('.'); + if (dotIndex != -1) { + + if (source == "GoldHEN") { + newFileName.insert(dotIndex, "_GoldHEN"); + } else { + newFileName.insert(dotIndex, "_shadPS4"); + } + } + QString fileUrl = baseUrl + fileName; + QString localFilePath = dir.filePath(newFileName); + + if (QFile::exists(localFilePath) && showMessageBox) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question( + this, tr("File Exists"), + tr("File already exists. Do you want to replace it?") + "\n" + + newFileName, + QMessageBox::Yes | QMessageBox::No); + if (reply == QMessageBox::No) { + continue; + } + } + QNetworkRequest fileRequest(fileUrl); + QNetworkReply* fileReply = manager->get(fileRequest); + + connect(fileReply, &QNetworkReply::finished, [=, this]() { + if (fileReply->error() == QNetworkReply::NoError) { + QByteArray fileData = fileReply->readAll(); + QFile localFile(localFilePath); + if (localFile.open(QIODevice::WriteOnly)) { + localFile.write(fileData); + localFile.close(); + } else { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Failed to save file:") + "\n%1") + .arg(localFilePath)); + } + } else { + QMessageBox::warning(this, tr("Error"), + QString(tr("Failed to download file:") + + "%1\n\n" + tr("Error:") + "%2") + .arg(fileUrl) + .arg(fileReply->errorString())); + } + fileReply->deleteLater(); + }); + + foundFiles = true; } } - QFile cheatFile(filePath); - if (cheatFile.open(QIODevice::WriteOnly)) { - cheatFile.write(jsonData); - cheatFile.close(); - foundFiles = true; - populateFileListCheats(); - } else { - QMessageBox::warning( - this, tr("Error"), - QString(tr("Failed to save file:") + "\n%1").arg(filePath)); + if (!foundFiles && showMessageBox) { + QMessageBox::warning(this, tr("Cheats Not Found"), tr("CheatsNotFound_MSG")); } } if (foundFiles && showMessageBox) { @@ -612,8 +643,9 @@ void CheatsPatches::populateFileListPatches() { } m_patchInfos.clear(); - QString patchesDir = - QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::PatchesDir).string()); + QString patchesDir; + Common::FS::PathToQString(patchesDir, + Common::FS::GetUserPath(Common::FS::PathType::PatchesDir)); QDir dir(patchesDir); QStringList folders = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); @@ -669,105 +701,86 @@ void CheatsPatches::populateFileListPatches() { void CheatsPatches::downloadPatches(const QString repository, const bool showMessageBox) { QString url; if (repository == "GoldHEN") { - url = "https://github.com/illusion0001/PS4-PS5-Game-Patch/tree/main/" - "patches/xml"; + url = "https://api.github.com/repos/illusion0001/PS4-PS5-Game-Patch/contents/patches/xml"; } if (repository == "shadPS4") { - url = "https://github.com/shadps4-emu/ps4_cheats/tree/main/" - "PATCHES"; + url = "https://api.github.com/repos/shadps4-emu/ps4_cheats/contents/PATCHES"; } QNetworkAccessManager* manager = new QNetworkAccessManager(this); QNetworkRequest request(url); + request.setRawHeader("Accept", "application/vnd.github.v3+json"); QNetworkReply* reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=, this]() { if (reply->error() == QNetworkReply::NoError) { - QByteArray htmlData = reply->readAll(); + QByteArray jsonData = reply->readAll(); reply->deleteLater(); - // Parsear HTML e extrair JSON usando QRegularExpression - QString htmlString = QString::fromUtf8(htmlData); - QRegularExpression jsonRegex( - R"()"); - QRegularExpressionMatch match = jsonRegex.match(htmlString); + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); + QJsonArray itemsArray = jsonDoc.array(); - if (match.hasMatch()) { - QByteArray jsonData = match.captured(1).toUtf8(); - QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); - QJsonObject jsonObj = jsonDoc.object(); - QJsonArray itemsArray = - jsonObj["payload"].toObject()["tree"].toObject()["items"].toArray(); - - QDir dir(Common::FS::GetUserPath(Common::FS::PathType::PatchesDir)); - QString fullPath = dir.filePath(repository); - if (!dir.exists(fullPath)) { - dir.mkpath(fullPath); - } - dir.setPath(fullPath); - - foreach (const QJsonValue& value, itemsArray) { - QJsonObject fileObj = value.toObject(); - QString fileName = fileObj["name"].toString(); - QString filePath = fileObj["path"].toString(); - - if (fileName.endsWith(".xml")) { - QString fileUrl; - if (repository == "GoldHEN") { - fileUrl = QString("https://raw.githubusercontent.com/illusion0001/" - "PS4-PS5-Game-Patch/main/%1") - .arg(filePath); - } - if (repository == "shadPS4") { - fileUrl = QString("https://raw.githubusercontent.com/shadps4-emu/" - "ps4_cheats/main/%1") - .arg(filePath); - } - QNetworkRequest fileRequest(fileUrl); - QNetworkReply* fileReply = manager->get(fileRequest); - - connect(fileReply, &QNetworkReply::finished, [=, this]() { - if (fileReply->error() == QNetworkReply::NoError) { - QByteArray fileData = fileReply->readAll(); - QFile localFile(dir.filePath(fileName)); - if (localFile.open(QIODevice::WriteOnly)) { - localFile.write(fileData); - localFile.close(); - } else { - if (showMessageBox) { - QMessageBox::warning( - this, tr("Error"), - QString(tr("Failed to save:") + "\n%1").arg(fileName)); - } - } - } else { - if (showMessageBox) { - QMessageBox::warning( - this, tr("Error"), - QString(tr("Failed to download:") + "\n%1").arg(fileUrl)); - } - } - fileReply->deleteLater(); - }); - } - } - if (showMessageBox) { - QMessageBox::information(this, tr("Download Complete"), - QString(tr("DownloadComplete_MSG"))); - } - - // Create the files.json file with the identification of which file to open - createFilesJson(repository); - populateFileListPatches(); - - } else { + if (itemsArray.isEmpty()) { if (showMessageBox) { QMessageBox::warning(this, tr("Error"), tr("Failed to parse JSON data from HTML.")); } + return; } + + QDir dir(Common::FS::GetUserPath(Common::FS::PathType::PatchesDir)); + QString fullPath = dir.filePath(repository); + if (!dir.exists(fullPath)) { + dir.mkpath(fullPath); + } + dir.setPath(fullPath); + + foreach (const QJsonValue& value, itemsArray) { + QJsonObject fileObj = value.toObject(); + QString fileName = fileObj["name"].toString(); + QString filePath = fileObj["path"].toString(); + QString downloadUrl = fileObj["download_url"].toString(); + + if (fileName.endsWith(".xml")) { + QNetworkRequest fileRequest(downloadUrl); + QNetworkReply* fileReply = manager->get(fileRequest); + + connect(fileReply, &QNetworkReply::finished, [=, this]() { + if (fileReply->error() == QNetworkReply::NoError) { + QByteArray fileData = fileReply->readAll(); + QFile localFile(dir.filePath(fileName)); + if (localFile.open(QIODevice::WriteOnly)) { + localFile.write(fileData); + localFile.close(); + } else { + if (showMessageBox) { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Failed to save:") + "\n%1").arg(fileName)); + } + } + } else { + if (showMessageBox) { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Failed to download:") + "\n%1").arg(downloadUrl)); + } + } + fileReply->deleteLater(); + }); + } + } + if (showMessageBox) { + QMessageBox::information(this, tr("Download Complete"), + QString(tr("DownloadComplete_MSG"))); + } + // Create the files.json file with the identification of which file to open + createFilesJson(repository); + populateFileListPatches(); } else { if (showMessageBox) { - QMessageBox::warning(this, tr("Error"), tr("Failed to retrieve HTML page.")); + QMessageBox::warning(this, tr("Error"), + QString(tr("Failed to retrieve HTML page.") + "\n%1") + .arg(reply->errorString())); } } emit downloadFinished(); @@ -925,13 +938,18 @@ void CheatsPatches::addCheatsToLayout(const QJsonArray& modsArray, const QJsonAr } void CheatsPatches::populateFileListCheats() { - QString cheatsDir = - QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::CheatsDir).string()); - QString pattern = m_gameSerial + "_" + m_gameVersion + "*.json"; + QString cheatsDir; + Common::FS::PathToQString(cheatsDir, Common::FS::GetUserPath(Common::FS::PathType::CheatsDir)); + + QString fullGameVersion = m_gameVersion; + QString modifiedGameVersion = m_gameVersion.mid(1); + + QString patternWithFirstChar = m_gameSerial + "_" + fullGameVersion + "*.json"; + QString patternWithoutFirstChar = m_gameSerial + "_" + modifiedGameVersion + "*.json"; QDir dir(cheatsDir); QStringList filters; - filters << pattern; + filters << patternWithFirstChar << patternWithoutFirstChar; dir.setNameFilters(filters); QFileInfoList fileList = dir.entryInfoList(QDir::Files); @@ -951,8 +969,9 @@ void CheatsPatches::populateFileListCheats() { if (!selectedIndexes.isEmpty()) { QString selectedFileName = selectedIndexes.first().data().toString(); - QString cheatsDir = QString::fromStdString( - Common::FS::GetUserPath(Common::FS::PathType::CheatsDir).string()); + QString cheatsDir; + Common::FS::PathToQString( + cheatsDir, Common::FS::GetUserPath(Common::FS::PathType::CheatsDir)); QFile file(cheatsDir + "/" + selectedFileName); if (file.open(QIODevice::ReadOnly)) { @@ -1197,7 +1216,8 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) { QString patchValue = lineObject["Value"].toString(); QString maskOffsetStr = lineObject["Offset"].toString(); - patchValue = MemoryPatcher::convertValueToHex(type, patchValue); + patchValue = QString::fromStdString( + MemoryPatcher::convertValueToHex(type.toStdString(), patchValue.toStdString())); bool littleEndian = false; @@ -1263,4 +1283,4 @@ void CheatsPatches::onPatchCheckBoxHovered(QCheckBox* checkBox, bool hovered) { } else { instructionsTextEdit->setText(defaultTextEdit); } -} +} \ No newline at end of file diff --git a/src/qt_gui/check_update.cpp b/src/qt_gui/check_update.cpp new file mode 100644 index 000000000..023c6e7bb --- /dev/null +++ b/src/qt_gui/check_update.cpp @@ -0,0 +1,528 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "check_update.h" + +using namespace Common::FS; +namespace fs = std::filesystem; + +CheckUpdate::CheckUpdate(const bool showMessage, QWidget* parent) + : QDialog(parent), networkManager(new QNetworkAccessManager(this)) { + setWindowTitle(tr("Auto Updater")); + setFixedSize(0, 0); + CheckForUpdates(showMessage); +} + +CheckUpdate::~CheckUpdate() {} + +void CheckUpdate::CheckForUpdates(const bool showMessage) { + QString updateChannel; + QUrl url; + + bool checkName = true; + while (checkName) { + updateChannel = QString::fromStdString(Config::getUpdateChannel()); + if (updateChannel == "Nightly") { + url = QUrl("https://api.github.com/repos/shadps4-emu/shadPS4/releases"); + checkName = false; + } else if (updateChannel == "Release") { + url = QUrl("https://api.github.com/repos/shadps4-emu/shadPS4/releases/latest"); + checkName = false; + } else { + if (Common::isRelease) { + Config::setUpdateChannel("Release"); + } else { + Config::setUpdateChannel("Nightly"); + } + const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); + Config::save(config_dir / "config.toml"); + } + } + + QNetworkRequest request(url); + QNetworkReply* reply = networkManager->get(request); + + connect(reply, &QNetworkReply::finished, this, [this, reply, showMessage, updateChannel]() { + if (reply->error() != QNetworkReply::NoError) { + QMessageBox::warning(this, tr("Error"), + QString(tr("Network error:") + "\n" + reply->errorString())); + reply->deleteLater(); + return; + } + + QByteArray response = reply->readAll(); + QJsonDocument jsonDoc(QJsonDocument::fromJson(response)); + + if (jsonDoc.isNull()) { + QMessageBox::warning(this, tr("Error"), tr("Failed to parse update information.")); + reply->deleteLater(); + return; + } + + QString downloadUrl; + QString latestVersion; + QString latestRev; + QString latestDate; + QString platformString; + +#ifdef Q_OS_WIN + platformString = "win64-qt"; +#elif defined(Q_OS_LINUX) + platformString = "linux-qt"; +#elif defined(Q_OS_MAC) + platformString = "macos-qt"; +#endif + + QJsonObject jsonObj; + if (updateChannel == "Nightly") { + QJsonArray jsonArray = jsonDoc.array(); + for (const QJsonValue& value : jsonArray) { + jsonObj = value.toObject(); + if (jsonObj.contains("prerelease") && jsonObj["prerelease"].toBool()) { + break; + } + } + if (!jsonObj.isEmpty()) { + latestVersion = jsonObj["tag_name"].toString(); + } else { + QMessageBox::warning(this, tr("Error"), tr("No pre-releases found.")); + reply->deleteLater(); + return; + } + } else { + jsonObj = jsonDoc.object(); + if (jsonObj.contains("tag_name")) { + latestVersion = jsonObj["tag_name"].toString(); + } else { + QMessageBox::warning(this, tr("Error"), tr("Invalid release data.")); + reply->deleteLater(); + return; + } + } + + latestRev = latestVersion.right(7); + latestDate = jsonObj["published_at"].toString(); + + QJsonArray assets = jsonObj["assets"].toArray(); + bool found = false; + + for (const QJsonValue& assetValue : assets) { + QJsonObject assetObj = assetValue.toObject(); + if (assetObj["name"].toString().contains(platformString)) { + downloadUrl = assetObj["browser_download_url"].toString(); + found = true; + break; + } + } + + if (!found) { + QMessageBox::warning(this, tr("Error"), + tr("No download URL found for the specified asset.")); + reply->deleteLater(); + return; + } + + QString currentRev = QString::fromStdString(Common::g_scm_rev).left(7); + QString currentDate = Common::g_scm_date; + + QDateTime dateTime = QDateTime::fromString(latestDate, Qt::ISODate); + latestDate = dateTime.isValid() ? dateTime.toString("yyyy-MM-dd HH:mm:ss") : "Unknown date"; + + if (latestRev == currentRev) { + if (showMessage) { + QMessageBox::information(this, tr("Auto Updater"), + tr("Your version is already up to date!")); + } + close(); + return; + } else { + setupUI(downloadUrl, latestDate, latestRev, currentDate, currentRev); + } + reply->deleteLater(); + }); +} + +void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate, + const QString& latestRev, const QString& currentDate, + const QString& currentRev) { + QVBoxLayout* layout = new QVBoxLayout(this); + QHBoxLayout* titleLayout = new QHBoxLayout(); + + QLabel* imageLabel = new QLabel(this); + QPixmap pixmap(":/images/shadps4.ico"); + imageLabel->setPixmap(pixmap); + imageLabel->setScaledContents(true); + imageLabel->setFixedSize(50, 50); + + QLabel* titleLabel = new QLabel("

" + tr("Update Available") + "

", this); + titleLayout->addWidget(imageLabel); + titleLayout->addWidget(titleLabel); + layout->addLayout(titleLayout); + + QString updateChannel = QString::fromStdString(Config::getUpdateChannel()); + + QString updateText = + QString("


" + tr("Update Channel") + ":
" + updateChannel + "
" + + tr("Current Version") + ": %1 (%2)
" + tr("Latest Version") + + ": %3 (%4)

" + tr("Do you want to update?") + "

") + .arg(currentRev, currentDate, latestRev, latestDate); + QLabel* updateLabel = new QLabel(updateText, this); + layout->addWidget(updateLabel); + + // Setup bottom layout with action buttons + QHBoxLayout* bottomLayout = new QHBoxLayout(); + autoUpdateCheckBox = new QCheckBox(tr("Check for Updates at Startup"), this); + yesButton = new QPushButton(tr("Update"), this); + noButton = new QPushButton(tr("No"), this); + yesButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + noButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + bottomLayout->addWidget(autoUpdateCheckBox); + + QSpacerItem* spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + bottomLayout->addItem(spacer); + + bottomLayout->addWidget(yesButton); + bottomLayout->addWidget(noButton); + layout->addLayout(bottomLayout); + + // Don't show changelog button if: + // The current version is a pre-release and the version to be downloaded is a release. + bool current_isRelease = currentRev.startsWith('v', Qt::CaseInsensitive); + bool latest_isRelease = latestRev.startsWith('v', Qt::CaseInsensitive); + if (!current_isRelease && latest_isRelease) { + } else { + QTextEdit* textField = new QTextEdit(this); + textField->setReadOnly(true); + textField->setFixedWidth(500); + textField->setFixedHeight(200); + textField->setVisible(false); + layout->addWidget(textField); + + QPushButton* toggleButton = new QPushButton(tr("Show Changelog"), this); + layout->addWidget(toggleButton); + + connect(toggleButton, &QPushButton::clicked, + [this, textField, toggleButton, currentRev, latestRev, downloadUrl, latestDate, + currentDate]() { + QString updateChannel = QString::fromStdString(Config::getUpdateChannel()); + if (!textField->isVisible()) { + requestChangelog(currentRev, latestRev, downloadUrl, latestDate, + currentDate); + textField->setVisible(true); + toggleButton->setText(tr("Hide Changelog")); + adjustSize(); + } else { + textField->setVisible(false); + toggleButton->setText(tr("Show Changelog")); + adjustSize(); + } + }); + } + + connect(yesButton, &QPushButton::clicked, this, [this, downloadUrl]() { + yesButton->setEnabled(false); + noButton->setEnabled(false); + DownloadUpdate(downloadUrl); + }); + + connect(noButton, &QPushButton::clicked, this, [this]() { close(); }); + + autoUpdateCheckBox->setChecked(Config::autoUpdate()); + connect(autoUpdateCheckBox, &QCheckBox::stateChanged, this, [](int state) { + const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); + Config::setAutoUpdate(state == Qt::Checked); + Config::save(user_dir / "config.toml"); + }); + + setLayout(layout); +} + +void CheckUpdate::requestChangelog(const QString& currentRev, const QString& latestRev, + const QString& downloadUrl, const QString& latestDate, + const QString& currentDate) { + QString compareUrlString = + QString("https://api.github.com/repos/shadps4-emu/shadPS4/compare/%1...%2") + .arg(currentRev) + .arg(latestRev); + + QUrl compareUrl(compareUrlString); + QNetworkRequest compareRequest(compareUrl); + QNetworkReply* compareReply = networkManager->get(compareRequest); + + connect(compareReply, &QNetworkReply::finished, this, + [this, compareReply, downloadUrl, latestDate, latestRev, currentDate, currentRev]() { + if (compareReply->error() != QNetworkReply::NoError) { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Network error:") + "\n%1").arg(compareReply->errorString())); + compareReply->deleteLater(); + return; + } + + QByteArray compareResponse = compareReply->readAll(); + QJsonDocument compareJsonDoc(QJsonDocument::fromJson(compareResponse)); + QJsonObject compareJsonObj = compareJsonDoc.object(); + QJsonArray commits = compareJsonObj["commits"].toArray(); + + QString changes; + for (const QJsonValue& commitValue : commits) { + QJsonObject commitObj = commitValue.toObject(); + QString message = commitObj["commit"].toObject()["message"].toString(); + + // Remove texts after first line break, if any, to make it cleaner + int newlineIndex = message.indexOf('\n'); + if (newlineIndex != -1) { + message = message.left(newlineIndex); + } + if (!changes.isEmpty()) { + changes += "
"; + } + changes += "    • " + message; + } + + // Update the text field with the changelog + QTextEdit* textField = findChild(); + if (textField) { + textField->setHtml("

" + tr("Changes") + ":

" + changes); + } + + compareReply->deleteLater(); + }); +} + +void CheckUpdate::DownloadUpdate(const QString& url) { + QProgressBar* progressBar = new QProgressBar(this); + progressBar->setRange(0, 100); + progressBar->setTextVisible(true); + progressBar->setValue(0); + + layout()->addWidget(progressBar); + + QNetworkRequest request(url); + QNetworkReply* reply = networkManager->get(request); + + connect(reply, &QNetworkReply::downloadProgress, this, + [progressBar](qint64 bytesReceived, qint64 bytesTotal) { + if (bytesTotal > 0) { + int percentage = static_cast((bytesReceived * 100) / bytesTotal); + progressBar->setValue(percentage); + } + }); + + connect(reply, &QNetworkReply::finished, this, [this, reply, progressBar, url]() { + progressBar->setValue(100); + if (reply->error() != QNetworkReply::NoError) { + QMessageBox::warning(this, tr("Error"), + tr("Network error occurred while trying to access the URL") + + ":\n" + url + "\n" + reply->errorString()); + reply->deleteLater(); + progressBar->deleteLater(); + return; + } + + QString userPath; + Common::FS::PathToQString(userPath, Common::FS::GetUserPath(Common::FS::PathType::UserDir)); + QString tempDownloadPath = userPath + "/temp_download_update"; + QDir dir(tempDownloadPath); + if (!dir.exists()) { + dir.mkpath("."); + } + + QString downloadPath = tempDownloadPath + "/temp_download_update.zip"; + QFile file(downloadPath); + if (file.open(QIODevice::WriteOnly)) { + file.write(reply->readAll()); + file.close(); + QMessageBox::information(this, tr("Download Complete"), + tr("The update has been downloaded, press OK to install.")); + Install(); + } else { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Failed to save the update file at") + ":\n" + downloadPath)); + } + + reply->deleteLater(); + progressBar->deleteLater(); + }); +} + +void CheckUpdate::Install() { + QString userPath; + Common::FS::PathToQString(userPath, Common::FS::GetUserPath(Common::FS::PathType::UserDir)); + + QString startingUpdate = tr("Starting Update..."); + QString tempDirPath = userPath + "/temp_download_update"; + QString rootPath; + Common::FS::PathToQString(rootPath, std::filesystem::current_path()); + + QString scriptContent; + QString scriptFileName; + QStringList arguments; + QString processCommand; + +#ifdef Q_OS_WIN + // Windows Batch Script + scriptFileName = tempDirPath + "/update.ps1"; + scriptContent = QStringLiteral( + "Set-ExecutionPolicy Bypass -Scope Process -Force\n" + "Write-Output '%1'\n" + "Expand-Archive -Path '%2\\temp_download_update.zip' -DestinationPath '%2' -Force\n" + "Start-Sleep -Seconds 3\n" + "Copy-Item -Recurse -Force '%2\\*' '%3\\'\n" + "Start-Sleep -Seconds 2\n" + "Remove-Item -Force '%3\\update.ps1'\n" + "Remove-Item -Force '%3\\temp_download_update.zip'\n" + "Start-Process '%3\\shadps4.exe'\n" + "Remove-Item -Recurse -Force '%2'\n"); + arguments << "-ExecutionPolicy" + << "Bypass" + << "-File" << scriptFileName; + processCommand = "powershell.exe"; + +#elif defined(Q_OS_LINUX) + // Linux Shell Script + scriptFileName = tempDirPath + "/update.sh"; + scriptContent = QStringLiteral( + "#!/bin/bash\n" + "check_unzip() {\n" + " if ! command -v unzip &> /dev/null && ! command -v 7z &> /dev/null; then\n" + " echo \"Neither 'unzip' nor '7z' is installed.\"\n" + " read -p \"Would you like to install 'unzip'? (y/n): \" response\n" + " if [[ \"$response\" == \"y\" || \"$response\" == \"Y\" ]]; then\n" + " if [[ -f /etc/os-release ]]; then\n" + " . /etc/os-release\n" + " case \"$ID\" in\n" + " ubuntu|debian)\n" + " sudo apt-get install unzip -y\n" + " ;;\n" + " fedora|redhat)\n" + " sudo dnf install unzip -y\n" + " ;;\n" + " *)\n" + " echo \"Unsupported distribution for automatic installation.\"\n" + " exit 1\n" + " ;;\n" + " esac\n" + " else\n" + " echo \"Could not identify the distribution.\"\n" + " exit 1\n" + " fi\n" + " else\n" + " echo \"At least one of 'unzip' or '7z' is required to continue. The process " + "will be terminated.\"\n" + " exit 1\n" + " fi\n" + " fi\n" + "}\n" + "extract_file() {\n" + " if command -v unzip &> /dev/null; then\n" + " unzip -o \"%2/temp_download_update.zip\" -d \"%2/\"\n" + " elif command -v 7z &> /dev/null; then\n" + " 7z x \"%2/temp_download_update.zip\" -o\"%2/\" -y\n" + " else\n" + " echo \"No suitable extraction tool found.\"\n" + " exit 1\n" + " fi\n" + "}\n" + "main() {\n" + " check_unzip\n" + " echo \"%1\"\n" + " sleep 2\n" + " extract_file\n" + " sleep 2\n" + " cp -r \"%2/\"* \"%3/\"\n" + " sleep 2\n" + " rm \"%3/update.sh\"\n" + " rm \"%3/temp_download_update.zip\"\n" + " chmod +x \"%3/Shadps4-qt.AppImage\"\n" + " rm -r \"%2\"\n" + " cd \"%3\" && ./Shadps4-qt.AppImage\n" + "}\n" + "main\n"); + arguments << scriptFileName; + processCommand = "bash"; + +#elif defined(Q_OS_MAC) + // macOS Shell Script + scriptFileName = tempDirPath + "/update.sh"; + scriptContent = QStringLiteral( + "#!/bin/bash\n" + "check_tools() {\n" + " if ! command -v unzip &> /dev/null && ! command -v tar &> /dev/null; then\n" + " echo \"Neither 'unzip' nor 'tar' is installed.\"\n" + " read -p \"Would you like to install 'unzip'? (y/n): \" response\n" + " if [[ \"$response\" == \"y\" || \"$response\" == \"Y\" ]]; then\n" + " echo \"Please install 'unzip' using Homebrew or another package manager.\"\n" + " exit 1\n" + " else\n" + " echo \"At least one of 'unzip' or 'tar' is required to continue. The process " + "will be terminated.\"\n" + " exit 1\n" + " fi\n" + " fi\n" + "}\n" + "check_tools\n" + "echo \"%1\"\n" + "sleep 2\n" + "unzip -o \"%2/temp_download_update.zip\" -d \"%2/\"\n" + "sleep 2\n" + "tar -xzf \"%2/shadps4-macos-qt.tar.gz\" -C \"%3\"\n" + "sleep 2\n" + "rm \"%3/update.sh\"\n" + "chmod +x \"%3/shadps4.app/Contents/MacOS/shadps4\"\n" + "open \"%3/shadps4.app\"\n" + "rm -r \"%2\"\n"); + + arguments << scriptFileName; + processCommand = "bash"; + +#else + QMessageBox::warning(this, tr("Error"), "Unsupported operating system."); + return; +#endif + + QFile scriptFile(scriptFileName); + if (scriptFile.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&scriptFile); + out << scriptContent.arg(startingUpdate).arg(tempDirPath).arg(rootPath); + scriptFile.close(); + +// Make the script executable on Unix-like systems +#if defined(Q_OS_LINUX) || defined(Q_OS_MAC) + scriptFile.setPermissions(QFileDevice::ExeOwner | QFileDevice::ReadOwner | + QFileDevice::WriteOwner); +#endif + + QProcess::startDetached(processCommand, arguments); + + exit(EXIT_SUCCESS); + } else { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Failed to create the update script file") + ":\n" + scriptFileName)); + } +} \ No newline at end of file diff --git a/src/qt_gui/check_update.h b/src/qt_gui/check_update.h new file mode 100644 index 000000000..dfeb95e73 --- /dev/null +++ b/src/qt_gui/check_update.h @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef CHECKUPDATE_H +#define CHECKUPDATE_H + +#include +#include +#include +#include + +class CheckUpdate : public QDialog { + Q_OBJECT + +public: + explicit CheckUpdate(const bool showMessage, QWidget* parent = nullptr); + ~CheckUpdate(); + +private slots: + void CheckForUpdates(const bool showMessage); + void DownloadUpdate(const QString& url); + void Install(); + +private: + void setupUI(const QString& downloadUrl, const QString& latestDate, const QString& latestRev, + const QString& currentDate, const QString& currentRev); + + void requestChangelog(const QString& currentRev, const QString& latestRev, + const QString& downloadUrl, const QString& latestDate, + const QString& currentDate); + + QCheckBox* autoUpdateCheckBox; + QPushButton* yesButton; + QPushButton* noButton; + QString updateDownloadUrl; + + QNetworkAccessManager* networkManager; +}; + +#endif // CHECKUPDATE_H diff --git a/src/qt_gui/game_grid_frame.cpp b/src/qt_gui/game_grid_frame.cpp index 9fba0c47c..b932e46c3 100644 --- a/src/qt_gui/game_grid_frame.cpp +++ b/src/qt_gui/game_grid_frame.cpp @@ -22,7 +22,7 @@ GameGridFrame::GameGridFrame(std::shared_ptr game_info_get, QWidg this->setContextMenuPolicy(Qt::CustomContextMenu); PopulateGameGrid(m_game_info->m_games, false); - connect(this, &QTableWidget::cellClicked, this, &GameGridFrame::SetGridBackgroundImage); + connect(this, &QTableWidget::currentCellChanged, this, &GameGridFrame::onCurrentCellChanged); connect(this->verticalScrollBar(), &QScrollBar::valueChanged, this, &GameGridFrame::RefreshGridBackgroundImage); @@ -31,12 +31,33 @@ GameGridFrame::GameGridFrame(std::shared_ptr game_info_get, QWidg connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) { m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, this, false); }); - connect(this, &QTableWidget::cellClicked, this, [&]() { - cellClicked = true; - crtRow = this->currentRow(); - crtColumn = this->currentColumn(); - columnCnt = this->columnCount(); - }); +} + +void GameGridFrame::onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, + int previousColumn) { + cellClicked = true; + crtRow = currentRow; + crtColumn = currentColumn; + columnCnt = this->columnCount(); + + auto itemID = (crtRow * columnCnt) + currentColumn; + if (itemID > m_game_info->m_games.count() - 1) { + validCellSelected = false; + BackgroundMusicPlayer::getInstance().stopMusic(); + return; + } + validCellSelected = true; + SetGridBackgroundImage(crtRow, crtColumn); + auto snd0Path = QString::fromStdString(m_game_info->m_games[itemID].snd0_path.string()); + PlayBackgroundMusic(snd0Path); +} + +void GameGridFrame::PlayBackgroundMusic(QString path) { + if (path.isEmpty() || !Config::getPlayBGM()) { + BackgroundMusicPlayer::getInstance().stopMusic(); + return; + } + BackgroundMusicPlayer::getInstance().playMusic(path); } void GameGridFrame::PopulateGameGrid(QVector m_games_search, bool fromSearch) { @@ -81,7 +102,9 @@ void GameGridFrame::PopulateGameGrid(QVector m_games_search, bool from name_label->setGraphicsEffect(shadowEffect); widget->setLayout(layout); - QString tooltipText = QString::fromStdString(m_games_[gameCounter].name); + QString tooltipText = QString::fromStdString(m_games_[gameCounter].name + " (" + + m_games_[gameCounter].version + ", " + + m_games_[gameCounter].region + ")"); widget->setToolTip(tooltipText); QString tooltipStyle = QString("QToolTip {" "background-color: #ffffff;" @@ -113,14 +136,12 @@ void GameGridFrame::SetGridBackgroundImage(int row, int column) { int itemID = (row * this->columnCount()) + column; QWidget* item = this->cellWidget(row, column); if (item) { - QString pic1Path = QString::fromStdString((*m_games_shared)[itemID].pic_path); + QString pic1Path; + Common::FS::PathToQString(pic1Path, (*m_games_shared)[itemID].pic_path); const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / (*m_games_shared)[itemID].serial / "pic1.png"; -#ifdef _WIN32 - const auto blurredPic1PathQt = QString::fromStdWString(blurredPic1Path.wstring()); -#else - const auto blurredPic1PathQt = QString::fromStdString(blurredPic1Path.string()); -#endif + QString blurredPic1PathQt; + Common::FS::PathToQString(blurredPic1PathQt, blurredPic1Path); backgroundImage = QImage(blurredPic1PathQt); if (backgroundImage.isNull()) { @@ -149,3 +170,7 @@ void GameGridFrame::RefreshGridBackgroundImage() { this->setPalette(palette); } } + +bool GameGridFrame::IsValidCellSelected() { + return validCellSelected; +} diff --git a/src/qt_gui/game_grid_frame.h b/src/qt_gui/game_grid_frame.h index 50b53a581..c09767684 100644 --- a/src/qt_gui/game_grid_frame.h +++ b/src/qt_gui/game_grid_frame.h @@ -5,6 +5,7 @@ #include +#include "background_music_player.h" #include "common/config.h" #include "game_info.h" #include "game_list_utils.h" @@ -19,6 +20,9 @@ Q_SIGNALS: public Q_SLOTS: void SetGridBackgroundImage(int row, int column); void RefreshGridBackgroundImage(); + void PlayBackgroundMusic(QString path); + void onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, + int previousColumn); private: QImage backgroundImage; @@ -26,10 +30,12 @@ private: GuiContextMenus m_gui_context_menus; std::shared_ptr m_game_info; std::shared_ptr> m_games_shared; + bool validCellSelected = false; public: explicit GameGridFrame(std::shared_ptr game_info_get, QWidget* parent = nullptr); void PopulateGameGrid(QVector m_games, bool fromSearch); + bool IsValidCellSelected(); bool cellClicked = false; int icon_size; diff --git a/src/qt_gui/game_info.cpp b/src/qt_gui/game_info.cpp index 2821a0322..6e8d89713 100644 --- a/src/qt_gui/game_info.cpp +++ b/src/qt_gui/game_info.cpp @@ -3,13 +3,15 @@ #include +#include "common/path_util.h" #include "game_info.h" GameInfoClass::GameInfoClass() = default; GameInfoClass::~GameInfoClass() = default; void GameInfoClass::GetGameInfo(QWidget* parent) { - QString installDir = QString::fromStdString(Config::getGameInstallDir()); + QString installDir; + Common::FS::PathToQString(installDir, Config::getGameInstallDir()); QStringList filePaths; QDir parentFolder(installDir); QFileInfoList fileList = parentFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); @@ -19,7 +21,7 @@ void GameInfoClass::GetGameInfo(QWidget* parent) { } } m_games = QtConcurrent::mapped(filePaths, [&](const QString& path) { - return readGameInfo(path.toStdString()); + return readGameInfo(Common::FS::PathFromQString(path)); }).results(); // Progress bar, please be patient :) diff --git a/src/qt_gui/game_info.h b/src/qt_gui/game_info.h index 6032e1c3a..9db25482a 100644 --- a/src/qt_gui/game_info.h +++ b/src/qt_gui/game_info.h @@ -22,25 +22,44 @@ public: return a.name < b.name; } - static GameInfo readGameInfo(const std::string& filePath) { + static GameInfo readGameInfo(const std::filesystem::path& filePath) { GameInfo game; game.path = filePath; PSF psf; - if (psf.open(game.path + "/sce_sys/param.sfo", {})) { - game.icon_path = game.path + "/sce_sys/icon0.png"; - QString iconpath = QString::fromStdString(game.icon_path); + if (psf.Open(game.path / "sce_sys" / "param.sfo")) { + game.icon_path = game.path / "sce_sys" / "icon0.png"; + QString iconpath; + Common::FS::PathToQString(iconpath, game.icon_path); game.icon = QImage(iconpath); - game.pic_path = game.path + "/sce_sys/pic1.png"; - game.name = psf.GetString("TITLE"); - game.serial = psf.GetString("TITLE_ID"); - game.region = GameListUtils::GetRegion(psf.GetString("CONTENT_ID").at(0)).toStdString(); - u32 fw_int = psf.GetInteger("SYSTEM_VER"); - QString fw = QString::number(fw_int, 16); - QString fw_ = fw.length() > 7 ? QString::number(fw_int, 16).left(3).insert(2, '.') - : fw.left(3).insert(1, '.'); - game.fw = (fw_int == 0) ? "0.00" : fw_.toStdString(); - game.version = psf.GetString("APP_VER"); + game.pic_path = game.path / "sce_sys" / "pic1.png"; + game.snd0_path = game.path / "sce_sys" / "snd0.at9"; + + if (const auto title = psf.GetString("TITLE"); title.has_value()) { + game.name = *title; + } + if (const auto title_id = psf.GetString("TITLE_ID"); title_id.has_value()) { + game.serial = *title_id; + } + if (const auto content_id = psf.GetString("CONTENT_ID"); + content_id.has_value() && !content_id->empty()) { + game.region = GameListUtils::GetRegion(content_id->at(0)).toStdString(); + } + if (const auto fw_int_opt = psf.GetInteger("SYSTEM_VER"); fw_int_opt.has_value()) { + auto fw_int = *fw_int_opt; + if (fw_int == 0) { + game.fw = "0.00"; + } else { + QString fw = QString::number(fw_int, 16); + QString fw_ = fw.length() > 7 + ? QString::number(fw_int, 16).left(3).insert(2, '.') + : fw.left(3).insert(1, '.'); + game.fw = fw_.toStdString(); + } + } + if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { + game.version = *app_ver; + } } return game; } diff --git a/src/qt_gui/game_install_dialog.cpp b/src/qt_gui/game_install_dialog.cpp index 5f031bdec..11daf2de0 100644 --- a/src/qt_gui/game_install_dialog.cpp +++ b/src/qt_gui/game_install_dialog.cpp @@ -18,6 +18,7 @@ GameInstallDialog::GameInstallDialog() : m_gamesDirectory(nullptr) { auto layout = new QVBoxLayout(this); layout->addWidget(SetupGamesDirectory()); + layout->addWidget(SetupAddonsDirectory()); layout->addStretch(); layout->addWidget(SetupDialogActions()); @@ -27,7 +28,7 @@ GameInstallDialog::GameInstallDialog() : m_gamesDirectory(nullptr) { GameInstallDialog::~GameInstallDialog() {} -void GameInstallDialog::Browse() { +void GameInstallDialog::BrowseGamesDirectory() { auto path = QFileDialog::getExistingDirectory(this, tr("Directory to install games")); if (!path.isEmpty()) { @@ -35,13 +36,23 @@ void GameInstallDialog::Browse() { } } +void GameInstallDialog::BrowseAddonsDirectory() { + auto path = QFileDialog::getExistingDirectory(this, tr("Directory to install DLC")); + + if (!path.isEmpty()) { + m_addonsDirectory->setText(QDir::toNativeSeparators(path)); + } +} + QWidget* GameInstallDialog::SetupGamesDirectory() { auto group = new QGroupBox(tr("Directory to install games")); auto layout = new QHBoxLayout(group); // Input. m_gamesDirectory = new QLineEdit(); - m_gamesDirectory->setText(QString::fromStdString(Config::getGameInstallDir())); + QString install_dir; + Common::FS::PathToQString(install_dir, Config::getGameInstallDir()); + m_gamesDirectory->setText(install_dir); m_gamesDirectory->setMinimumWidth(400); layout->addWidget(m_gamesDirectory); @@ -49,7 +60,30 @@ QWidget* GameInstallDialog::SetupGamesDirectory() { // Browse button. auto browse = new QPushButton(tr("Browse")); - connect(browse, &QPushButton::clicked, this, &GameInstallDialog::Browse); + connect(browse, &QPushButton::clicked, this, &GameInstallDialog::BrowseGamesDirectory); + + layout->addWidget(browse); + + return group; +} + +QWidget* GameInstallDialog::SetupAddonsDirectory() { + auto group = new QGroupBox(tr("Directory to install DLC")); + auto layout = new QHBoxLayout(group); + + // Input. + m_addonsDirectory = new QLineEdit(); + QString install_dir; + Common::FS::PathToQString(install_dir, Config::getAddonInstallDir()); + m_addonsDirectory->setText(install_dir); + m_addonsDirectory->setMinimumWidth(400); + + layout->addWidget(m_addonsDirectory); + + // Browse button. + auto browse = new QPushButton(tr("Browse")); + + connect(browse, &QPushButton::clicked, this, &GameInstallDialog::BrowseAddonsDirectory); layout->addWidget(browse); @@ -68,6 +102,7 @@ QWidget* GameInstallDialog::SetupDialogActions() { void GameInstallDialog::Save() { // Check games directory. auto gamesDirectory = m_gamesDirectory->text(); + auto addonsDirectory = m_addonsDirectory->text(); if (gamesDirectory.isEmpty() || !QDir(gamesDirectory).exists() || !QDir::isAbsolutePath(gamesDirectory)) { @@ -76,7 +111,22 @@ void GameInstallDialog::Save() { return; } - Config::setGameInstallDir(gamesDirectory.toStdString()); + if (addonsDirectory.isEmpty() || !QDir::isAbsolutePath(addonsDirectory)) { + QMessageBox::critical(this, tr("Error"), + "The value for location to install DLC is not valid."); + return; + } + QDir addonsDir(addonsDirectory); + if (!addonsDir.exists()) { + if (!addonsDir.mkpath(".")) { + QMessageBox::critical(this, tr("Error"), + "The DLC install location could not be created."); + return; + } + } + + Config::setGameInstallDir(Common::FS::PathFromQString(gamesDirectory)); + Config::setAddonInstallDir(Common::FS::PathFromQString(addonsDirectory)); const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); Config::save(config_dir / "config.toml"); accept(); diff --git a/src/qt_gui/game_install_dialog.h b/src/qt_gui/game_install_dialog.h index 6f439e81d..0a4e29357 100644 --- a/src/qt_gui/game_install_dialog.h +++ b/src/qt_gui/game_install_dialog.h @@ -16,13 +16,16 @@ public: ~GameInstallDialog(); private slots: - void Browse(); + void BrowseGamesDirectory(); + void BrowseAddonsDirectory(); private: QWidget* SetupGamesDirectory(); + QWidget* SetupAddonsDirectory(); QWidget* SetupDialogActions(); void Save(); private: QLineEdit* m_gamesDirectory; + QLineEdit* m_addonsDirectory; }; \ No newline at end of file diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index b17da127e..c2f6736b8 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/path_util.h" +#include "common/string_util.h" #include "game_list_frame.h" GameListFrame::GameListFrame(std::shared_ptr game_info_get, QWidget* parent) @@ -40,7 +41,7 @@ GameListFrame::GameListFrame(std::shared_ptr game_info_get, QWidg this->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); PopulateGameList(); - connect(this, &QTableWidget::itemClicked, this, &GameListFrame::SetListBackgroundImage); + connect(this, &QTableWidget::currentCellChanged, this, &GameListFrame::onCurrentCellChanged); connect(this->verticalScrollBar(), &QScrollBar::valueChanged, this, &GameListFrame::RefreshListBackgroundImage); connect(this->horizontalScrollBar(), &QScrollBar::valueChanged, this, @@ -68,6 +69,26 @@ GameListFrame::GameListFrame(std::shared_ptr game_info_get, QWidg }); } +void GameListFrame::onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, + int previousColumn) { + QTableWidgetItem* item = this->item(currentRow, currentColumn); + if (!item) { + return; + } + SetListBackgroundImage(item); + PlayBackgroundMusic(item); +} + +void GameListFrame::PlayBackgroundMusic(QTableWidgetItem* item) { + if (!item || !Config::getPlayBGM()) { + BackgroundMusicPlayer::getInstance().stopMusic(); + return; + } + QString snd0path; + Common::FS::PathToQString(snd0path, m_game_info->m_games[item->row()].snd0_path); + BackgroundMusicPlayer::getInstance().playMusic(snd0path); +} + void GameListFrame::PopulateGameList() { this->setRowCount(m_game_info->m_games.size()); ResizeIcons(icon_size); @@ -79,7 +100,9 @@ void GameListFrame::PopulateGameList() { SetTableItem(i, 4, QString::fromStdString(m_game_info->m_games[i].fw)); SetTableItem(i, 5, QString::fromStdString(m_game_info->m_games[i].size)); SetTableItem(i, 6, QString::fromStdString(m_game_info->m_games[i].version)); - SetTableItem(i, 7, QString::fromStdString(m_game_info->m_games[i].path)); + QString path; + Common::FS::PathToQString(path, m_game_info->m_games[i].path); + SetTableItem(i, 7, path); } } @@ -89,14 +112,12 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) { return; } - QString pic1Path = QString::fromStdString(m_game_info->m_games[item->row()].pic_path); + QString pic1Path; + Common::FS::PathToQString(pic1Path, m_game_info->m_games[item->row()].pic_path); const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / m_game_info->m_games[item->row()].serial / "pic1.png"; -#ifdef _WIN32 - const auto blurredPic1PathQt = QString::fromStdWString(blurredPic1Path.wstring()); -#else - const auto blurredPic1PathQt = QString::fromStdString(blurredPic1Path.string()); -#endif + QString blurredPic1PathQt; + Common::FS::PathToQString(blurredPic1PathQt, blurredPic1Path); backgroundImage = QImage(blurredPic1PathQt); if (backgroundImage.isNull()) { diff --git a/src/qt_gui/game_list_frame.h b/src/qt_gui/game_list_frame.h index ab70e6f6b..957ac7318 100644 --- a/src/qt_gui/game_list_frame.h +++ b/src/qt_gui/game_list_frame.h @@ -5,6 +5,7 @@ #include +#include "background_music_player.h" #include "game_info.h" #include "game_list_utils.h" #include "gui_context_menus.h" @@ -21,6 +22,9 @@ public Q_SLOTS: void RefreshListBackgroundImage(); void SortNameAscending(int columnIndex); void SortNameDescending(int columnIndex); + void PlayBackgroundMusic(QTableWidgetItem* item); + void onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, + int previousColumn); private: void SetTableItem(int row, int column, QString itemStr); @@ -40,25 +44,54 @@ public: int icon_size; + static float parseAsFloat(const std::string& str, const int& offset) { + return std::stof(str.substr(0, str.size() - offset)); + } + + static float parseSizeMB(const std::string& size) { + float num = parseAsFloat(size, 3); + return (size[size.size() - 2] == 'G') ? num * 1024 : num; + } + static bool CompareStringsAscending(GameInfo a, GameInfo b, int columnIndex) { - if (columnIndex == 1) { + switch (columnIndex) { + case 1: return a.name < b.name; - } else if (columnIndex == 2) { - return a.serial < b.serial; - } else if (columnIndex == 3) { - return a.fw < b.fw; + case 2: + return a.serial.substr(4) < b.serial.substr(4); + case 3: + return a.region < b.region; + case 4: + return parseAsFloat(a.fw, 0) < parseAsFloat(b.fw, 0); + case 5: + return parseSizeMB(b.size) < parseSizeMB(a.size); + case 6: + return a.version < b.version; + case 7: + return a.path < b.path; + default: + return false; } - return false; } static bool CompareStringsDescending(GameInfo a, GameInfo b, int columnIndex) { - if (columnIndex == 1) { + switch (columnIndex) { + case 1: return a.name > b.name; - } else if (columnIndex == 2) { - return a.serial > b.serial; - } else if (columnIndex == 3) { - return a.fw > b.fw; + case 2: + return a.serial.substr(4) > b.serial.substr(4); + case 3: + return a.region > b.region; + case 4: + return parseAsFloat(a.fw, 0) > parseAsFloat(b.fw, 0); + case 5: + return parseSizeMB(b.size) > parseSizeMB(a.size); + case 6: + return a.version > b.version; + case 7: + return a.path > b.path; + default: + return false; } - return false; } }; \ No newline at end of file diff --git a/src/qt_gui/game_list_utils.h b/src/qt_gui/game_list_utils.h index 476c90035..f62275eff 100644 --- a/src/qt_gui/game_list_utils.h +++ b/src/qt_gui/game_list_utils.h @@ -3,10 +3,14 @@ #pragma once +#include "common/path_util.h" + struct GameInfo { - std::string path; // root path of game directory (normally directory that contains eboot.bin) - std::string icon_path; // path of icon0.png - std::string pic_path; // path of pic1.png + std::filesystem::path path; // root path of game directory + // (normally directory that contains eboot.bin) + std::filesystem::path icon_path; // path of icon0.png + std::filesystem::path pic_path; // path of pic1.png + std::filesystem::path snd0_path; // path of snd0.at9 QImage icon; std::string size; // variables extracted from param.sfo @@ -43,7 +47,9 @@ public: } static void GetFolderSize(GameInfo& game) { - QDir dir(QString::fromStdString(game.path)); + QString dirPath; + Common::FS::PathToQString(dirPath, game.path); + QDir dir(dirPath); QDirIterator it(dir.absolutePath(), QDirIterator::Subdirectories); qint64 total = 0; while (it.hasNext()) { diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index fb1994bb0..4eb657572 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -20,6 +20,7 @@ #include #include #include +#include #endif #include "common/path_util.h" @@ -74,14 +75,15 @@ public: } if (selected == &openFolder) { - QString folderPath = QString::fromStdString(m_games[itemID].path); + QString folderPath; + Common::FS::PathToQString(folderPath, m_games[itemID].path); QDesktopServices::openUrl(QUrl::fromLocalFile(folderPath)); } if (selected == &openSfoViewer) { PSF psf; - if (psf.open(m_games[itemID].path + "/sce_sys/param.sfo", {})) { - int rows = psf.map_strings.size() + psf.map_integers.size(); + if (psf.Open(std::filesystem::path(m_games[itemID].path) / "sce_sys" / "param.sfo")) { + int rows = psf.GetEntries().size(); QTableWidget* tableWidget = new QTableWidget(rows, 2); tableWidget->setAttribute(Qt::WA_DeleteOnClose); connect(widget->parent(), &QWidget::destroyed, tableWidget, @@ -90,23 +92,45 @@ public: tableWidget->verticalHeader()->setVisible(false); // Hide vertical header int row = 0; - for (const auto& pair : psf.map_strings) { + for (const auto& entry : psf.GetEntries()) { QTableWidgetItem* keyItem = - new QTableWidgetItem(QString::fromStdString(pair.first)); - QTableWidgetItem* valueItem = - new QTableWidgetItem(QString::fromStdString(pair.second)); - - tableWidget->setItem(row, 0, keyItem); - tableWidget->setItem(row, 1, valueItem); - keyItem->setFlags(keyItem->flags() & ~Qt::ItemIsEditable); - valueItem->setFlags(valueItem->flags() & ~Qt::ItemIsEditable); - row++; - } - for (const auto& pair : psf.map_integers) { - QTableWidgetItem* keyItem = - new QTableWidgetItem(QString::fromStdString(pair.first)); - QTableWidgetItem* valueItem = new QTableWidgetItem( - QString("0x").append(QString::number(pair.second, 16))); + new QTableWidgetItem(QString::fromStdString(entry.key)); + QTableWidgetItem* valueItem; + switch (entry.param_fmt) { + case PSFEntryFmt::Binary: { + const auto bin = psf.GetBinary(entry.key); + if (!bin.has_value()) { + valueItem = new QTableWidgetItem(QString("Unknown")); + } else { + std::string text; + text.reserve(bin->size() * 2); + for (const auto& c : *bin) { + static constexpr char hex[] = "0123456789ABCDEF"; + text.push_back(hex[c >> 4 & 0xF]); + text.push_back(hex[c & 0xF]); + } + valueItem = new QTableWidgetItem(QString::fromStdString(text)); + } + } break; + case PSFEntryFmt::Text: { + auto text = psf.GetString(entry.key); + if (!text.has_value()) { + valueItem = new QTableWidgetItem(QString("Unknown")); + } else { + valueItem = + new QTableWidgetItem(QString::fromStdString(std::string{*text})); + } + } break; + case PSFEntryFmt::Integer: { + auto integer = psf.GetInteger(entry.key); + if (!integer.has_value()) { + valueItem = new QTableWidgetItem(QString("Unknown")); + } else { + valueItem = + new QTableWidgetItem(QString("0x") + QString::number(*integer, 16)); + } + } break; + } tableWidget->setItem(row, 0, keyItem); tableWidget->setItem(row, 1, valueItem); @@ -135,7 +159,9 @@ public: QString gameSerial = QString::fromStdString(m_games[itemID].serial); QString gameVersion = QString::fromStdString(m_games[itemID].version); QString gameSize = QString::fromStdString(m_games[itemID].size); - QPixmap gameImage(QString::fromStdString(m_games[itemID].icon_path)); + QString iconPath; + Common::FS::PathToQString(iconPath, m_games[itemID].icon_path); + QPixmap gameImage(iconPath); CheatsPatches* cheatsPatches = new CheatsPatches(gameName, gameSerial, gameVersion, gameSize, gameImage); cheatsPatches->show(); @@ -144,8 +170,9 @@ public: } if (selected == &openTrophyViewer) { - QString trophyPath = QString::fromStdString(m_games[itemID].serial); - QString gameTrpPath = QString::fromStdString(m_games[itemID].path); + QString trophyPath, gameTrpPath; + Common::FS::PathToQString(trophyPath, m_games[itemID].serial); + Common::FS::PathToQString(gameTrpPath, m_games[itemID].path); TrophyViewer* trophyViewer = new TrophyViewer(trophyPath, gameTrpPath); trophyViewer->show(); connect(widget->parent(), &QWidget::destroyed, trophyViewer, @@ -153,11 +180,13 @@ public: } if (selected == &createShortcut) { - QString targetPath = QString::fromStdString(m_games[itemID].path); + QString targetPath; + Common::FS::PathToQString(targetPath, m_games[itemID].path); QString ebootPath = targetPath + "/eboot.bin"; // Get the full path to the icon - QString iconPath = QString::fromStdString(m_games[itemID].icon_path); + QString iconPath; + Common::FS::PathToQString(iconPath, m_games[itemID].icon_path); QFileInfo iconFileInfo(iconPath); QString icoPath = iconFileInfo.absolutePath() + "/" + iconFileInfo.baseName() + ".ico"; @@ -283,10 +312,7 @@ public: if (selected == &installPackage) { QStringList pkg_app_ = m_pkg_app_list[itemIndex].split(";;"); - std::filesystem::path path(pkg_app_[9].toStdString()); -#ifdef _WIN32 - path = std::filesystem::path(pkg_app_[9].toStdWString()); -#endif + std::filesystem::path path = Common::FS::PathFromQString(pkg_app_[9]); InstallDragDropPkg(path, 1, 1); } } @@ -320,9 +346,9 @@ private: CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); // Create the ShellLink object - IShellLink* pShellLink = nullptr; + Microsoft::WRL::ComPtr pShellLink; HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, - IID_IShellLink, (LPVOID*)&pShellLink); + IID_PPV_ARGS(&pShellLink)); if (SUCCEEDED(hres)) { // Defines the path to the program executable pShellLink->SetPath((LPCWSTR)exePath.utf16()); @@ -338,13 +364,11 @@ private: pShellLink->SetIconLocation((LPCWSTR)iconPath.utf16(), 0); // Save the shortcut - IPersistFile* pPersistFile = nullptr; - hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile); + Microsoft::WRL::ComPtr pPersistFile; + hres = pShellLink.As(&pPersistFile); if (SUCCEEDED(hres)) { hres = pPersistFile->Save((LPCWSTR)linkPath.utf16(), TRUE); - pPersistFile->Release(); } - pShellLink->Release(); } CoUninitialize(); diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index abbf6dcb6..8c565a19b 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -2,15 +2,24 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/config.h" +#include "common/memory_patcher.h" #include "core/file_sys/fs.h" #include "emulator.h" #include "game_install_dialog.h" #include "main_window.h" +#ifdef _WIN32 +#include +#endif + // Custom message handler to ignore Qt logs void customMessageHandler(QtMsgType, const QMessageLogContext&, const QString&) {} int main(int argc, char* argv[]) { +#ifdef _WIN32 + SetConsoleOutputCP(CP_UTF8); +#endif + QApplication a(argc, argv); // Load configurations and initialize Qt application @@ -21,7 +30,7 @@ int main(int argc, char* argv[]) { bool has_command_line_argument = argc > 1; // Check if the game install directory is set - if (Config::getGameInstallDir() == "" && !has_command_line_argument) { + if (Config::getGameInstallDir().empty() && !has_command_line_argument) { GameInstallDialog dlg; dlg.exec(); } @@ -36,6 +45,13 @@ int main(int argc, char* argv[]) { // Check for command line arguments if (has_command_line_argument) { Core::Emulator emulator; + for (int i = 0; i < argc; i++) { + std::string curArg = argv[i]; + if (curArg == "-p") { + std::string patchFile = argv[i + 1]; + MemoryPatcher::patchFile = patchFile; + } + } emulator.Run(argv[1]); } diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index e5b502c58..8d8e17177 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -2,11 +2,15 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include #include "about_dialog.h" #include "cheats_patches.h" +#include "check_update.h" #include "common/io_file.h" +#include "common/path_util.h" +#include "common/scm_rev.h" #include "common/string_util.h" #include "common/version.h" #include "core/file_format/pkg.h" @@ -18,6 +22,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); + installEventFilter(this); setAttribute(Qt::WA_DeleteOnClose); } @@ -42,10 +47,18 @@ bool MainWindow::Init() { GetPhysicalDevices(); // show ui setMinimumSize(350, minimumSizeHint().height()); - setWindowTitle(QString::fromStdString("shadPS4 v" + std::string(Common::VERSION))); + std::string window_title = ""; + if (Common::isRelease) { + window_title = fmt::format("shadPS4 v{}", Common::VERSION); + } else { + window_title = fmt::format("shadPS4 v{} {} {}", Common::VERSION, Common::g_scm_branch, + Common::g_scm_desc); + } + setWindowTitle(QString::fromStdString(window_title)); this->show(); // load game list LoadGameLists(); + CheckUpdateMain(true); auto end = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast(end - start); @@ -160,6 +173,16 @@ void MainWindow::LoadGameLists() { } } +void MainWindow::CheckUpdateMain(bool checkSave) { + if (checkSave) { + if (!Config::autoUpdate()) { + return; + } + } + auto checkUpdate = new CheckUpdate(false); + checkUpdate->exec(); +} + void MainWindow::GetPhysicalDevices() { Vulkan::Instance instance(false, false); auto physical_devices = instance.GetPhysicalDevices(); @@ -221,6 +244,11 @@ void MainWindow::CreateConnects() { settingsDialog->exec(); }); + connect(ui->updaterAct, &QAction::triggered, this, [this]() { + auto checkUpdate = new CheckUpdate(true); + checkUpdate->exec(); + }); + connect(ui->aboutAct, &QAction::triggered, this, [this]() { auto aboutDialog = new AboutDialog(this); aboutDialog->exec(); @@ -280,6 +308,7 @@ void MainWindow::CreateConnects() { }); // List connect(ui->setlistModeListAct, &QAction::triggered, m_dock_widget.data(), [this]() { + BackgroundMusicPlayer::getInstance().stopMusic(); m_dock_widget->setWidget(m_game_list_frame.data()); m_game_grid_frame->hide(); m_elf_viewer->hide(); @@ -296,6 +325,7 @@ void MainWindow::CreateConnects() { }); // Grid connect(ui->setlistModeGridAct, &QAction::triggered, m_dock_widget.data(), [this]() { + BackgroundMusicPlayer::getInstance().stopMusic(); m_dock_widget->setWidget(m_game_grid_frame.data()); m_game_grid_frame->show(); m_game_list_frame->hide(); @@ -312,6 +342,7 @@ void MainWindow::CreateConnects() { }); // Elf connect(ui->setlistElfAct, &QAction::triggered, m_dock_widget.data(), [this]() { + BackgroundMusicPlayer::getInstance().stopMusic(); m_dock_widget->setWidget(m_elf_viewer.data()); m_game_grid_frame->hide(); m_game_list_frame->hide(); @@ -416,12 +447,14 @@ void MainWindow::CreateConnects() { .arg(" APP VERSION", -11) .arg(" Path"); for (const GameInfo& game : m_game_info->m_games) { + QString game_path; + Common::FS::PathToQString(game_path, game.path); out << QString("%1 %2 %3 %4 %5\n") .arg(QString::fromStdString(game.name), -50) .arg(QString::fromStdString(game.serial), -10) .arg(QString::fromStdString(game.fw), -4) .arg(QString::fromStdString(game.version), -11) - .arg(QString::fromStdString(game.path)); + .arg(game_path); } }); @@ -487,29 +520,36 @@ void MainWindow::CreateConnects() { } void MainWindow::StartGame() { + isGameRunning = true; + BackgroundMusicPlayer::getInstance().stopMusic(); QString gamePath = ""; int table_mode = Config::getTableMode(); if (table_mode == 0) { if (m_game_list_frame->currentItem()) { int itemID = m_game_list_frame->currentItem()->row(); - gamePath = QString::fromStdString(m_game_info->m_games[itemID].path + "/eboot.bin"); + Common::FS::PathToQString(gamePath, m_game_info->m_games[itemID].path / "eboot.bin"); } } else if (table_mode == 1) { if (m_game_grid_frame->cellClicked) { int itemID = (m_game_grid_frame->crtRow * m_game_grid_frame->columnCnt) + m_game_grid_frame->crtColumn; - gamePath = QString::fromStdString(m_game_info->m_games[itemID].path + "/eboot.bin"); + Common::FS::PathToQString(gamePath, m_game_info->m_games[itemID].path / "eboot.bin"); } } else { if (m_elf_viewer->currentItem()) { int itemID = m_elf_viewer->currentItem()->row(); - gamePath = QString::fromStdString(m_elf_viewer->m_elf_list[itemID].toStdString()); + gamePath = m_elf_viewer->m_elf_list[itemID]; } } if (gamePath != "") { AddRecentFiles(gamePath); Core::Emulator emulator; - emulator.Run(gamePath.toUtf8().constData()); + const auto path = Common::FS::PathFromQString(gamePath); + if (!std::filesystem::exists(path)) { + QMessageBox::critical(nullptr, tr("Run Game"), QString(tr("Eboot.bin file not found"))); + return; + } + emulator.Run(path); } } @@ -565,6 +605,7 @@ void MainWindow::ConfigureGuiFromSettings() { } else { ui->setlistModeGridAct->setChecked(true); } + BackgroundMusicPlayer::getInstance().setVolume(Config::getBGMvolume()); } void MainWindow::SaveWindowState() const { @@ -584,10 +625,7 @@ void MainWindow::InstallPkg() { int pkgNum = 0; for (const QString& file : fileNames) { ++pkgNum; - std::filesystem::path path(file.toStdString()); -#ifdef _WIN64 - path = std::filesystem::path(file.toStdWString()); -#endif + std::filesystem::path path = Common::FS::PathFromQString(file); MainWindow::InstallDragDropPkg(path, pkgNum, nPkg); } } @@ -605,11 +643,13 @@ void MainWindow::BootGame() { QMessageBox::critical(nullptr, tr("Game Boot"), QString(tr("Only one file can be selected!"))); } else { - std::filesystem::path path(fileNames[0].toStdString()); -#ifdef _WIN64 - path = std::filesystem::path(fileNames[0].toStdWString()); -#endif + std::filesystem::path path = Common::FS::PathFromQString(fileNames[0]); Core::Emulator emulator; + if (!std::filesystem::exists(path)) { + QMessageBox::critical(nullptr, tr("Run Game"), + QString(tr("Eboot.bin file not found"))); + return; + } emulator.Run(path); } } @@ -617,30 +657,59 @@ void MainWindow::BootGame() { void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg) { if (Loader::DetectFileType(file) == Loader::FileTypes::Pkg) { - pkg = PKG(); - pkg.Open(file); std::string failreason; - auto extract_path = std::filesystem::path(Config::getGameInstallDir()) / pkg.GetTitleID(); + pkg = PKG(); + if (!pkg.Open(file, failreason)) { + QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); + return; + } + auto extract_path = Config::getGameInstallDir() / pkg.GetTitleID(); QString pkgType = QString::fromStdString(pkg.GetPkgFlags()); - QDir game_dir(QString::fromStdString(extract_path.string())); + QString gameDirPath; + Common::FS::PathToQString(gameDirPath, extract_path); + QDir game_dir(gameDirPath); if (game_dir.exists()) { QMessageBox msgBox; msgBox.setWindowTitle(tr("PKG Extraction")); - psf.open("", pkg.sfo); + if (!psf.Open(pkg.sfo)) { + QMessageBox::critical(this, tr("PKG ERROR"), + "Could not read SFO. Check log for details"); + return; + } - std::string content_id = psf.GetString("CONTENT_ID"); + std::string content_id; + if (auto value = psf.GetString("CONTENT_ID"); value.has_value()) { + content_id = std::string{*value}; + } else { + QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no CONTENT_ID"); + return; + } std::string entitlement_label = Common::SplitString(content_id, '-')[2]; - auto addon_extract_path = Common::FS::GetUserPath(Common::FS::PathType::AddonsDir) / - pkg.GetTitleID() / entitlement_label; - QDir addon_dir(QString::fromStdString(addon_extract_path.string())); + auto addon_extract_path = + Config::getAddonInstallDir() / pkg.GetTitleID() / entitlement_label; + QString addonDirPath; + Common::FS::PathToQString(addonDirPath, addon_extract_path); + QDir addon_dir(addonDirPath); auto category = psf.GetString("CATEGORY"); if (pkgType.contains("PATCH")) { - QString pkg_app_version = QString::fromStdString(psf.GetString("APP_VER")); - psf.open(extract_path.string() + "/sce_sys/param.sfo", {}); - QString game_app_version = QString::fromStdString(psf.GetString("APP_VER")); + QString pkg_app_version; + if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { + pkg_app_version = QString::fromStdString(std::string{*app_ver}); + } else { + QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no APP_VER"); + return; + } + psf.Open(extract_path / "sce_sys" / "param.sfo"); + QString game_app_version; + if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { + game_app_version = QString::fromStdString(std::string{*app_ver}); + } else { + QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no APP_VER"); + return; + } double appD = game_app_version.toDouble(); double pkgD = pkg_app_version.toDouble(); if (pkgD == appD) { @@ -687,8 +756,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int return; } } else { - msgBox.setText(QString(tr("DLC already installed:") + "\n" + - QString::fromStdString(addon_extract_path.string()) + + msgBox.setText(QString(tr("DLC already installed:") + "\n" + addonDirPath + "\n\n" + tr("Would you like to overwrite?"))); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); @@ -700,8 +768,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int } } } else { - msgBox.setText(QString(tr("Game already installed") + "\n" + - QString::fromStdString(extract_path.string()) + "\n" + + msgBox.setText(QString(tr("Game already installed") + "\n" + gameDirPath + "\n" + tr("Would you like to overwrite?"))); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); @@ -744,7 +811,8 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int QFutureWatcher futureWatcher; connect(&futureWatcher, &QFutureWatcher::finished, this, [=, this]() { if (pkgNum == nPkg) { - QString path = QString::fromStdString(Config::getGameInstallDir()); + QString path; + Common::FS::PathToQString(path, Config::getGameInstallDir()); QMessageBox extractMsgBox(this); extractMsgBox.setWindowTitle(tr("Extraction Finished")); extractMsgBox.setText( @@ -845,6 +913,10 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->bootInstallPkgAct->setIcon(RecolorIcon(ui->bootInstallPkgAct->icon(), isWhite)); ui->bootGameAct->setIcon(RecolorIcon(ui->bootGameAct->icon(), isWhite)); ui->exitAct->setIcon(RecolorIcon(ui->exitAct->icon(), isWhite)); + ui->updaterAct->setIcon(RecolorIcon(ui->updaterAct->icon(), isWhite)); + ui->downloadCheatsPatchesAct->setIcon( + RecolorIcon(ui->downloadCheatsPatchesAct->icon(), isWhite)); + ui->dumpGameListAct->setIcon(RecolorIcon(ui->dumpGameListAct->icon(), isWhite)); ui->aboutAct->setIcon(RecolorIcon(ui->aboutAct->icon(), isWhite)); ui->setlistModeListAct->setIcon(RecolorIcon(ui->setlistModeListAct->icon(), isWhite)); ui->setlistModeGridAct->setIcon(RecolorIcon(ui->setlistModeGridAct->icon(), isWhite)); @@ -912,10 +984,14 @@ void MainWindow::CreateRecentGameActions() { } connect(m_recent_files_group, &QActionGroup::triggered, this, [this](QAction* action) { - QString gamePath = action->text(); - AddRecentFiles(gamePath); // Update the list. + auto gamePath = Common::FS::PathFromQString(action->text()); + AddRecentFiles(action->text()); // Update the list. Core::Emulator emulator; - emulator.Run(gamePath.toUtf8().constData()); + if (!std::filesystem::exists(gamePath)) { + QMessageBox::critical(nullptr, tr("Run Game"), QString(tr("Eboot.bin file not found"))); + return; + } + emulator.Run(gamePath); }); } @@ -950,3 +1026,17 @@ void MainWindow::OnLanguageChanged(const std::string& locale) { LoadTranslation(); } + +bool MainWindow::eventFilter(QObject* obj, QEvent* event) { + if (event->type() == QEvent::KeyPress) { + QKeyEvent* keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { + auto tblMode = Config::getTableMode(); + if (tblMode != 2 && (tblMode != 1 || m_game_grid_frame->IsValidCellSelected())) { + StartGame(); + return true; + } + } + } + return QMainWindow::eventFilter(obj, event); +} diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index d3b83e619..a428f4317 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -7,6 +7,7 @@ #include #include +#include "background_music_player.h" #include "common/config.h" #include "common/path_util.h" #include "core/file_format/psf.h" @@ -54,6 +55,7 @@ private: void CreateDockWindows(); void GetPhysicalDevices(); void LoadGameLists(); + void CheckUpdateMain(bool checkSave); void CreateConnects(); void SetLastUsedTheme(); void SetLastIconSizeBullet(); @@ -62,9 +64,11 @@ private: void BootGame(); void AddRecentFiles(QString filePath); void LoadTranslation(); + void PlayBackgroundMusic(); QIcon RecolorIcon(const QIcon& icon, bool isWhite); bool isIconBlack = false; bool isTableList = true; + bool isGameRunning = false; QActionGroup* m_icon_size_act_group = nullptr; QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_theme_act_group = nullptr; @@ -90,6 +94,8 @@ private: QTranslator* translator; protected: + bool eventFilter(QObject* obj, QEvent* event) override; + void dragEnterEvent(QDragEnterEvent* event1) override { if (event1->mimeData()->hasUrls()) { event1->acceptProposedAction(); @@ -104,10 +110,7 @@ protected: int nPkg = urlList.size(); for (const QUrl& url : urlList) { pkgNum++; - std::filesystem::path path(url.toLocalFile().toStdString()); -#ifdef _WIN64 - path = std::filesystem::path(url.toLocalFile().toStdWString()); -#endif + std::filesystem::path path = Common::FS::PathFromQString(url.toLocalFile()); InstallDragDropPkg(path, pkgNum, nPkg); } } diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 6ddc4155e..45b2ab4e0 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -26,6 +26,7 @@ public: QAction* downloadCheatsPatchesAct; QAction* dumpGameListAct; QAction* pkgViewerAct; + QAction* updaterAct; QAction* aboutAct; QAction* configureAct; QAction* setThemeDark; @@ -54,7 +55,7 @@ public: QMenu* menuSettings; QMenu* menuUtils; QMenu* menuThemes; - QMenu* menuAbout; + QMenu* menuHelp; QToolBar* toolBar; void setupUi(QMainWindow* MainWindow) { @@ -122,11 +123,16 @@ public: gameInstallPathAct->setIcon(QIcon(":images/folder_icon.png")); downloadCheatsPatchesAct = new QAction(MainWindow); downloadCheatsPatchesAct->setObjectName("downloadCheatsPatchesAct"); + downloadCheatsPatchesAct->setIcon(QIcon(":images/update_icon.png")); dumpGameListAct = new QAction(MainWindow); dumpGameListAct->setObjectName("dumpGameList"); + dumpGameListAct->setIcon(QIcon(":images/dump_icon.png")); pkgViewerAct = new QAction(MainWindow); pkgViewerAct->setObjectName("pkgViewer"); pkgViewerAct->setIcon(QIcon(":images/file_icon.png")); + updaterAct = new QAction(MainWindow); + updaterAct->setObjectName("updaterAct"); + updaterAct->setIcon(QIcon(":images/update_icon.png")); aboutAct = new QAction(MainWindow); aboutAct->setObjectName("aboutAct"); aboutAct->setIcon(QIcon(":images/about_icon.png")); @@ -243,8 +249,8 @@ public: menuThemes = new QMenu(menuView); menuThemes->setObjectName("menuThemes"); menuThemes->setIcon(QIcon(":images/themes_icon.png")); - menuAbout = new QMenu(menuBar); - menuAbout->setObjectName("menuAbout"); + menuHelp = new QMenu(menuBar); + menuHelp->setObjectName("menuHelp"); MainWindow->setMenuBar(menuBar); toolBar = new QToolBar(MainWindow); toolBar->setObjectName("toolBar"); @@ -253,7 +259,7 @@ public: menuBar->addAction(menuFile->menuAction()); menuBar->addAction(menuView->menuAction()); menuBar->addAction(menuSettings->menuAction()); - menuBar->addAction(menuAbout->menuAction()); + menuBar->addAction(menuHelp->menuAction()); menuFile->addAction(bootInstallPkgAct); menuFile->addAction(bootGameAct); menuFile->addAction(addElfFolderAct); @@ -285,7 +291,8 @@ public: menuUtils->addAction(downloadCheatsPatchesAct); menuUtils->addAction(dumpGameListAct); menuUtils->addAction(pkgViewerAct); - menuAbout->addAction(aboutAct); + menuHelp->addAction(updaterAct); + menuHelp->addAction(aboutAct); retranslateUi(MainWindow); @@ -299,6 +306,8 @@ public: bootInstallPkgAct->setText( QCoreApplication::translate("MainWindow", "Install Packages (PKG)", nullptr)); bootGameAct->setText(QCoreApplication::translate("MainWindow", "Boot Game", nullptr)); + updaterAct->setText( + QCoreApplication::translate("MainWindow", "Check for Updates", nullptr)); aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr)); configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); #if QT_CONFIG(tooltip) @@ -345,7 +354,7 @@ public: menuSettings->setTitle(QCoreApplication::translate("MainWindow", "Settings", nullptr)); menuUtils->setTitle(QCoreApplication::translate("MainWindow", "Utils", nullptr)); menuThemes->setTitle(QCoreApplication::translate("MainWindow", "Themes", nullptr)); - menuAbout->setTitle(QCoreApplication::translate("MainWindow", "About", nullptr)); + menuHelp->setTitle(QCoreApplication::translate("MainWindow", "Help", nullptr)); setThemeDark->setText(QCoreApplication::translate("MainWindow", "Dark", nullptr)); setThemeLight->setText(QCoreApplication::translate("MainWindow", "Light", nullptr)); setThemeGreen->setText(QCoreApplication::translate("MainWindow", "Green", nullptr)); diff --git a/src/qt_gui/pkg_viewer.cpp b/src/qt_gui/pkg_viewer.cpp index 49005c720..0ffb9b579 100644 --- a/src/qt_gui/pkg_viewer.cpp +++ b/src/qt_gui/pkg_viewer.cpp @@ -104,18 +104,23 @@ void PKGViewer::ProcessPKGInfo() { m_pkg_patch_list.clear(); m_full_pkg_list.clear(); for (int i = 0; i < m_pkg_list.size(); i++) { - std::filesystem::path path(m_pkg_list[i].toStdString()); -#ifdef _WIN32 - path = std::filesystem::path(m_pkg_list[i].toStdWString()); -#endif - package.Open(path); - psf.open("", package.sfo); - QString title_name = QString::fromStdString(psf.GetString("TITLE")); - QString title_id = QString::fromStdString(psf.GetString("TITLE_ID")); - QString app_type = game_list_util.GetAppType(psf.GetInteger("APP_TYPE")); - QString app_version = QString::fromStdString(psf.GetString("APP_VER")); - QString title_category = QString::fromStdString(psf.GetString("CATEGORY")); - QString pkg_size = game_list_util.FormatSize(package.GetPkgHeader().pkg_size); + std::filesystem::path path = Common::FS::PathFromQString(m_pkg_list[i]); + std::string failreason; + if (!package.Open(path, failreason)) { + QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); + return; + } + psf.Open(package.sfo); + QString title_name = + QString::fromStdString(std::string{psf.GetString("TITLE").value_or("Unknown")}); + QString title_id = + QString::fromStdString(std::string{psf.GetString("TITLE_ID").value_or("Unknown")}); + QString app_type = GameListUtils::GetAppType(psf.GetInteger("APP_TYPE").value_or(0)); + QString app_version = + QString::fromStdString(std::string{psf.GetString("APP_VER").value_or("Unknown")}); + QString title_category = + QString::fromStdString(std::string{psf.GetString("CATEGORY").value_or("Unknown")}); + QString pkg_size = GameListUtils::FormatSize(package.GetPkgHeader().pkg_size); pkg_content_flag = package.GetPkgHeader().pkg_content_flags; QString flagss = ""; for (const auto& flag : package.flagNames) { @@ -126,11 +131,17 @@ void PKGViewer::ProcessPKGInfo() { } } - u32 fw_int = psf.GetInteger("SYSTEM_VER"); - QString fw = QString::number(fw_int, 16); - QString fw_ = fw.length() > 7 ? QString::number(fw_int, 16).left(3).insert(2, '.') + QString fw_ = "Unknown"; + if (const auto fw_int_opt = psf.GetInteger("SYSTEM_VER"); fw_int_opt.has_value()) { + const u32 fw_int = *fw_int_opt; + if (fw_int == 0) { + fw_ = "0.00"; + } else { + QString fw = QString::number(fw_int, 16); + fw_ = fw.length() > 7 ? QString::number(fw_int, 16).left(3).insert(2, '.') : fw.left(3).insert(1, '.'); - fw_ = (fw_int == 0) ? "0.00" : fw_; + } + } char region = package.GetPkgHeader().pkg_content_id[0]; QString pkg_info = ""; if (title_category == "gd" && !flagss.contains("PATCH")) { diff --git a/src/qt_gui/pkg_viewer.h b/src/qt_gui/pkg_viewer.h index 9598328a0..265a03b92 100644 --- a/src/qt_gui/pkg_viewer.h +++ b/src/qt_gui/pkg_viewer.h @@ -33,7 +33,6 @@ private: PKGHeader pkgheader; PKGEntry entry; PSFHeader header; - PSFEntry psfentry; char pkgTitleID[9]; std::vector pkg; u64 pkgSize = 0; diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 4206c4463..4a42e1961 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -3,7 +3,12 @@ #include #include +#include +#include +#include "check_update.h" +#include "common/logging/backend.h" +#include "common/logging/filter.h" #include "main_window.h" #include "settings_dialog.h" #include "ui_settings_dialog.h" @@ -65,6 +70,9 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge InitializeEmulatorLanguages(); LoadValuesFromConfig(); + defaultTextEdit = tr("Point your mouse at an option to display its description."); + ui->descriptionText->setText(defaultTextEdit); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); connect(ui->buttonBox, &QDialogButtonBox::clicked, this, @@ -78,6 +86,11 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge Config::setDefaultValues(); LoadValuesFromConfig(); } + if (Common::Log::IsActive()) { + Common::Log::Filter filter; + filter.ParseFilterString(Config::getLogFilter()); + Common::Log::SetGlobalFilter(filter); + } }); ui->buttonBox->button(QDialogButtonBox::Save)->setText(tr("Save")); @@ -115,6 +128,29 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge connect(ui->logFilterLineEdit, &QLineEdit::textChanged, this, [](const QString& text) { Config::setLogFilter(text.toStdString()); }); + + connect(ui->updateCheckBox, &QCheckBox::stateChanged, this, + [](int state) { Config::setAutoUpdate(state == Qt::Checked); }); + + connect(ui->updateComboBox, &QComboBox::currentTextChanged, this, + [](const QString& channel) { Config::setUpdateChannel(channel.toStdString()); }); + + connect(ui->checkUpdateButton, &QPushButton::clicked, this, []() { + auto checkUpdate = new CheckUpdate(true); + checkUpdate->exec(); + }); + + connect(ui->playBGMCheckBox, &QCheckBox::stateChanged, this, [](int val) { + Config::setPlayBGM(val); + if (val == Qt::Unchecked) { + BackgroundMusicPlayer::getInstance().stopMusic(); + } + }); + + connect(ui->BGMVolumeSlider, &QSlider::valueChanged, this, [](float val) { + Config::setBGMvolume(val); + BackgroundMusicPlayer::getInstance().setVolume(val); + }); } // GPU TAB @@ -138,9 +174,6 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge connect(ui->nullGpuCheckBox, &QCheckBox::stateChanged, this, [](int val) { Config::setNullGpu(val); }); - - connect(ui->dumpPM4CheckBox, &QCheckBox::stateChanged, this, - [](int val) { Config::setDumpPM4(val); }); } // DEBUG TAB @@ -157,6 +190,35 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge connect(ui->rdocCheckBox, &QCheckBox::stateChanged, this, [](int val) { Config::setRdocEnabled(val); }); } + + // Descriptions + { + // General + ui->consoleLanguageGroupBox->installEventFilter(this); + ui->emulatorLanguageGroupBox->installEventFilter(this); + ui->fullscreenCheckBox->installEventFilter(this); + ui->showSplashCheckBox->installEventFilter(this); + ui->ps4proCheckBox->installEventFilter(this); + ui->userName->installEventFilter(this); + ui->logTypeGroupBox->installEventFilter(this); + ui->logFilter->installEventFilter(this); + ui->updaterGroupBox->installEventFilter(this); + ui->GUIgroupBox->installEventFilter(this); + + // Graphics + ui->graphicsAdapterGroupBox->installEventFilter(this); + ui->widthGroupBox->installEventFilter(this); + ui->heightGroupBox->installEventFilter(this); + ui->heightDivider->installEventFilter(this); + ui->dumpShadersCheckBox->installEventFilter(this); + ui->nullGpuCheckBox->installEventFilter(this); + + // Debug + ui->debugDump->installEventFilter(this); + ui->vkValidationCheckBox->installEventFilter(this); + ui->vkSyncValidationCheckBox->installEventFilter(this); + ui->rdocCheckBox->installEventFilter(this); + } } void SettingsDialog::LoadValuesFromConfig() { @@ -172,8 +234,8 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vblankSpinBox->setValue(Config::vblankDiv()); ui->dumpShadersCheckBox->setChecked(Config::dumpShaders()); ui->nullGpuCheckBox->setChecked(Config::nullGpu()); - ui->dumpPM4CheckBox->setChecked(Config::dumpPM4()); - + ui->playBGMCheckBox->setChecked(Config::getPlayBGM()); + ui->BGMVolumeSlider->setValue((Config::getBGMvolume())); ui->fullscreenCheckBox->setChecked(Config::isFullscreenMode()); ui->showSplashCheckBox->setChecked(Config::showSplash()); ui->ps4proCheckBox->setChecked(Config::isNeoMode()); @@ -185,6 +247,17 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vkValidationCheckBox->setChecked(Config::vkValidationEnabled()); ui->vkSyncValidationCheckBox->setChecked(Config::vkValidationSyncEnabled()); ui->rdocCheckBox->setChecked(Config::isRdocEnabled()); + + ui->updateCheckBox->setChecked(Config::autoUpdate()); + std::string updateChannel = Config::getUpdateChannel(); + if (updateChannel != "Release" && updateChannel != "Nightly") { + if (Common::isRelease) { + updateChannel = "Release"; + } else { + updateChannel = "Nightly"; + } + } + ui->updateComboBox->setCurrentText(QString::fromStdString(updateChannel)); } void SettingsDialog::InitializeEmulatorLanguages() { @@ -221,3 +294,86 @@ int SettingsDialog::exec() { } SettingsDialog::~SettingsDialog() {} + +void SettingsDialog::updateNoteTextEdit(const QString& elementName) { + QString text; // texts are only in .ts translation files for better formatting + + // General + if (elementName == "consoleLanguageGroupBox") { + text = tr("consoleLanguageGroupBox"); + } else if (elementName == "emulatorLanguageGroupBox") { + text = tr("emulatorLanguageGroupBox"); + } else if (elementName == "fullscreenCheckBox") { + text = tr("fullscreenCheckBox"); + } else if (elementName == "showSplashCheckBox") { + text = tr("showSplashCheckBox"); + } else if (elementName == "ps4proCheckBox") { + text = tr("ps4proCheckBox"); + } else if (elementName == "userName") { + text = tr("userName"); + } else if (elementName == "logTypeGroupBox") { + text = tr("logTypeGroupBox"); + } else if (elementName == "logFilter") { + text = tr("logFilter"); + } else if (elementName == "updaterGroupBox") { + text = tr("updaterGroupBox"); + } else if (elementName == "GUIgroupBox") { + text = tr("GUIgroupBox"); + } + + // Graphics + if (elementName == "graphicsAdapterGroupBox") { + text = tr("graphicsAdapterGroupBox"); + } else if (elementName == "widthGroupBox") { + text = tr("resolutionLayout"); + } else if (elementName == "heightGroupBox") { + text = tr("resolutionLayout"); + } else if (elementName == "heightDivider") { + text = tr("heightDivider"); + } else if (elementName == "dumpShadersCheckBox") { + text = tr("dumpShadersCheckBox"); + } else if (elementName == "nullGpuCheckBox") { + text = tr("nullGpuCheckBox"); + } else if (elementName == "dumpPM4CheckBox") { + text = tr("dumpPM4CheckBox"); + } + + // Debug + if (elementName == "debugDump") { + text = tr("debugDump"); + } else if (elementName == "vkValidationCheckBox") { + text = tr("vkValidationCheckBox"); + } else if (elementName == "vkSyncValidationCheckBox") { + text = tr("vkSyncValidationCheckBox"); + } else if (elementName == "rdocCheckBox") { + text = tr("rdocCheckBox"); + } + + ui->descriptionText->setText(text.replace("\\n", "\n")); +} + +bool SettingsDialog::override(QObject* obj, QEvent* event) { + if (event->type() == QEvent::Enter || event->type() == QEvent::Leave) { + if (qobject_cast(obj)) { + bool hovered = (event->type() == QEvent::Enter); + QString elementName = obj->objectName(); + + if (hovered) { + updateNoteTextEdit(elementName); + } else { + ui->descriptionText->setText(defaultTextEdit); + } + + // if the text exceeds the size of the box, it will increase the size + int documentHeight = ui->descriptionText->document()->size().height(); + int visibleHeight = ui->descriptionText->viewport()->height(); + if (documentHeight > visibleHeight) { + ui->descriptionText->setMinimumHeight(90); + } else { + ui->descriptionText->setMinimumHeight(70); + } + return true; + } + } + return QDialog::eventFilter(obj, event); +} diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h index ddae7daac..71307d398 100644 --- a/src/qt_gui/settings_dialog.h +++ b/src/qt_gui/settings_dialog.h @@ -5,6 +5,7 @@ #include #include +#include #include #include "common/config.h" @@ -20,6 +21,9 @@ public: explicit SettingsDialog(std::span physical_devices, QWidget* parent = nullptr); ~SettingsDialog(); + bool override(QObject* obj, QEvent* event); + void updateNoteTextEdit(const QString& groupName); + int exec() override; signals: @@ -33,4 +37,6 @@ private: std::unique_ptr ui; std::map languages; + + QString defaultTextEdit; }; diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 1ecd12495..4edec9e1b 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -12,7 +12,7 @@ 0 0 854 - 480 + 570 @@ -52,7 +52,7 @@ 0 0 836 - 428 + 446 @@ -70,7 +70,7 @@ - + @@ -255,17 +255,209 @@ - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 265 + 0 + + + + Update + + + + + 10 + 130 + 261 + 22 + + + + Check for Updates at Startup + + + + + + 12 + 30 + 241 + 65 + + + + Update Channel + + + + + 12 + 30 + 217 + 28 + + + + + Release + + + + + Nightly + + + + + + + + 25 + 100 + 215 + 24 + + + + Check for Updates + + + + + + + + + + + + + 0 + 0 + + + + GUI Settings + + + + + 10 + 30 + 241 + 71 + + + + + + + + 0 + 0 + + + + Play title music + + + + + + + + + + + Volume + + + + + + + Set the volume of the background music. + + + 100 + + + 10 + + + 20 + + + 50 + + + Qt::Orientation::Horizontal + + + false + + + false + + + QSlider::TickPosition::NoTicks + + + 10 + + + + + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + QSizePolicy::Policy::Expanding + + + + 0 + 0 + + + + + @@ -472,13 +664,6 @@
- - - - Enable PM4 Dumping - - -
@@ -610,6 +795,19 @@ + + + + + 16777215 + 70 + + + + true + + + diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index 12b1e7ba6..b385b491b 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -1,927 +1,956 @@ - + - - - AboutDialog - - - About shadPS4 - حول shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. - - - - ElfViewer - - - Open Folder - فتح المجلد - - - - GameInfoClass - - - Loading game list, please wait :3 - جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 - - - - Cancel - إلغاء - - - - Loading... - ...جارٍ التحميل - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - اختر المجلد - - - - Directory to install games - مجلد تثبيت الألعاب - - - - Browse - تصفح - - - - Error - خطأ - - - - The value for location to install games is not valid. - قيمة موقع تثبيت الألعاب غير صالحة. - - - - GuiContextMenus - - - Create Shortcut - إنشاء اختصار - - - - Open Game Folder - فتح مجلد اللعبة - - - - Cheats / Patches - الغش / التصحيحات - - - - SFO Viewer - عارض SFO - - - - Trophy Viewer - عارض الجوائز - - - - Copy info - نسخ المعلومات - - - - Copy Name - نسخ الاسم - - - - Copy Serial - نسخ الرقم التسلسلي - - - - Copy All - نسخ الكل - - - - Shortcut creation - إنشاء اختصار - - - - Shortcut created successfully!\n %1 - تم إنشاء الاختصار بنجاح!\n %1 - - - - Error - خطأ - - - - Error creating shortcut!\n %1 - !\n %1 خطأ في إنشاء الاختصار - - - - Install PKG - PKG تثبيت - - - - MainWindow - - - Open/Add Elf Folder - Elf فتح/إضافة مجلد - - - - Install Packages (PKG) - (PKG) تثبيت الحزم - - - - Boot Game - تشغيل اللعبة - - - - About shadPS4 - shadPS4 حول - - - - Configure... - ...تكوين - - - - Install application from a .pkg file - .pkg تثبيت التطبيق من ملف - - - - Recent Games - الألعاب الأخيرة - - - - Exit - خروج - - - - Exit shadPS4 - الخروج من shadPS4 - - - - Exit the application. - الخروج من التطبيق. - - - - Show Game List - إظهار قائمة الألعاب - - - - Game List Refresh - تحديث قائمة الألعاب - - - - Tiny - صغير جدًا - - - - Small - صغير - - - - Medium - متوسط - - - - Large - كبير - - - - List View - عرض القائمة - - - - Grid View - عرض الشبكة - - - - Elf Viewer - عارض Elf - - - - Game Install Directory - دليل تثبيت اللعبة - - - - Download Cheats/Patches - تنزيل الغش/التصحيحات - - - - Dump Game List - تفريغ قائمة الألعاب - - - - PKG Viewer - عارض PKG - - - - Search... - ...بحث - - - - File - ملف - - - - View - عرض - - - - Game List Icons - أيقونات قائمة الألعاب - - - - Game List Mode - وضع قائمة الألعاب - - - - Settings - الإعدادات - - - - Utils - الأدوات - - - - Themes - السمات - - - - About - حول - - - - Dark - داكن - - - - Light - فاتح - - - - Green - أخضر - - - - Blue - أزرق - - - - Violet - بنفسجي - - - - toolBar - شريط الأدوات - - - - PKGViewer - - - Open Folder - فتح المجلد - - - - TrophyViewer - - - Trophy Viewer - عارض الجوائز - - - - SettingsDialog - - - Settings - الإعدادات - - - - General - عام - - - - System - النظام - - - - Console Language - لغة وحدة التحكم - - - - Emulator Language - لغة المحاكي - - - - Emulator - المحاكي - - - - Enable Fullscreen - تمكين ملء الشاشة - - - - Show Splash - إظهار شاشة البداية - - - - Is PS4 Pro - PS4 Pro هل هو - - - - Username - اسم المستخدم - - - - Logger - المسجل - - - - Log Type - نوع السجل - - - - Log Filter - مرشح السجل - - - - Graphics - الرسومات - - - - Graphics Device - جهاز الرسومات - - - - Width - العرض - - - - Height - الارتفاع - - - - Vblank Divider - Vblank مقسم - - - - Advanced - متقدم - - - - Enable Shaders Dumping - تمكين تفريغ الشيدرات - - - - Enable NULL GPU - تمكين وحدة معالجة الرسومات الفارغة - - - - Enable PM4 Dumping - PM4 تمكين تفريغ - - - - Debug - تصحيح الأخطاء - - - - Enable Debug Dumping - تمكين تفريغ التصحيح - - - - Enable Vulkan Validation Layers - Vulkan تمكين طبقات التحقق من - - - - Enable Vulkan Synchronization Validation - Vulkan تمكين التحقق من تزامن - - - - Enable RenderDoc Debugging - RenderDoc تمكين تصحيح أخطاء - - - - MainWindow + + AboutDialog + + + About shadPS4 + حول shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. + + + + ElfViewer + + + Open Folder + فتح المجلد + + + + GameInfoClass + + + Loading game list, please wait :3 + جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 + + + + Cancel + إلغاء + + + + Loading... + ...جارٍ التحميل + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - اختر المجلد + + + + Directory to install games + مجلد تثبيت الألعاب + + + + Browse + تصفح + + + + Error + خطأ + + + + The value for location to install games is not valid. + قيمة موقع تثبيت الألعاب غير صالحة. + + + + GuiContextMenus + + + Create Shortcut + إنشاء اختصار + + + + Open Game Folder + فتح مجلد اللعبة + + + + Cheats / Patches + الغش / التصحيحات + + + + SFO Viewer + عارض SFO + + + + Trophy Viewer + عارض الجوائز + + + + Copy info + نسخ المعلومات + + + + Copy Name + نسخ الاسم + + + + Copy Serial + نسخ الرقم التسلسلي + + + + Copy All + نسخ الكل + + + + Shortcut creation + إنشاء اختصار + + + + Shortcut created successfully!\n %1 + تم إنشاء الاختصار بنجاح!\n %1 + + + + Error + خطأ + + + + Error creating shortcut!\n %1 + !\n %1 خطأ في إنشاء الاختصار + + + + Install PKG + PKG تثبيت + + + + MainWindow + + + Open/Add Elf Folder + Elf فتح/إضافة مجلد + + + + Install Packages (PKG) + (PKG) تثبيت الحزم + + + + Boot Game + تشغيل اللعبة + + + + Check for Updates + تحقق من التحديثات + + + + About shadPS4 + shadPS4 حول + + + + Configure... + ...تكوين + + + + Install application from a .pkg file + .pkg تثبيت التطبيق من ملف + + + + Recent Games + الألعاب الأخيرة + + + + Exit + خروج + + + + Exit shadPS4 + الخروج من shadPS4 + + + + Exit the application. + الخروج من التطبيق. + + + + Show Game List + إظهار قائمة الألعاب + + + + Game List Refresh + تحديث قائمة الألعاب + + + + Tiny + صغير جدًا + + + + Small + صغير + + + + Medium + متوسط + + + + Large + كبير + + + + List View + عرض القائمة + + + + Grid View + عرض الشبكة + + + + Elf Viewer + عارض Elf + + + + Game Install Directory + دليل تثبيت اللعبة + + + + Download Cheats/Patches + تنزيل الغش/التصحيحات + + + + Dump Game List + تفريغ قائمة الألعاب + + + + PKG Viewer + عارض PKG + + + + Search... + ...بحث + + + + File + ملف + + + + View + عرض + + + + Game List Icons + أيقونات قائمة الألعاب + + + + Game List Mode + وضع قائمة الألعاب + + + + Settings + الإعدادات + + + + Utils + الأدوات + + + + Themes + السمات + + + + Help + مساعدة + + + + Dark + داكن + + + + Light + فاتح + + + + Green + أخضر + + + + Blue + أزرق + + + + Violet + بنفسجي + + + + toolBar + شريط الأدوات + + + + PKGViewer + + + Open Folder + فتح المجلد + + + + TrophyViewer + + + Trophy Viewer + عارض الجوائز + + + + SettingsDialog + + + Settings + الإعدادات + + + + General + عام + + + + System + النظام + + + + Console Language + لغة وحدة التحكم + + + + Emulator Language + لغة المحاكي + + + + Emulator + المحاكي + + + + Enable Fullscreen + تمكين ملء الشاشة + + + + Show Splash + إظهار شاشة البداية + + + + Is PS4 Pro + PS4 Pro هل هو + + + + Username + اسم المستخدم + + + + Logger + المسجل + + + + Log Type + نوع السجل + + + + Log Filter + مرشح السجل + + + + Graphics + الرسومات + + + + Graphics Device + جهاز الرسومات + + + + Width + العرض + + + + Height + الارتفاع + + + + Vblank Divider + Vblank مقسم + + + + Advanced + متقدم + + + + Enable Shaders Dumping + تمكين تفريغ الشيدرات + + + + Enable NULL GPU + تمكين وحدة معالجة الرسومات الفارغة + + + + Enable PM4 Dumping + PM4 تمكين تفريغ + + + + Debug + تصحيح الأخطاء + + + + Enable Debug Dumping + تمكين تفريغ التصحيح + + + + Enable Vulkan Validation Layers + Vulkan تمكين طبقات التحقق من + + + + Enable Vulkan Synchronization Validation + Vulkan تمكين التحقق من تزامن + + + + Enable RenderDoc Debugging + RenderDoc تمكين تصحيح أخطاء + + + + Update + تحديث + + + + Check for Updates at Startup + تحقق من التحديثات عند بدء التشغيل + + + + Update Channel + قناة التحديث + + + + Check for Updates + التحقق من التحديثات + + + + GUI Settings + إعدادات الواجهة + + + + Play title music + تشغيل موسيقى العنوان + + + + Volume + الصوت + + + + MainWindow Game List ققائمة الألعاب - - - * Unsupported Vulkan Version - * إصدار Vulkan غير مدعوم - - - - Download Cheats For All Installed Games - تنزيل الغش لجميع الألعاب المثبتة - - - - Download Patches For All Games - تنزيل التصحيحات لجميع الألعاب - - - - Download Complete - اكتمل التنزيل - - - - You have downloaded cheats for all the games you have installed. - لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. - - - - Patches Downloaded Successfully! - !تم تنزيل التصحيحات بنجاح - - - - All Patches available for all games have been downloaded. - .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب - - - - Games: - :الألعاب - - - - PKG File (*.PKG) - PKG (*.PKG) ملف - - - - ELF files (*.bin *.elf *.oelf) - ELF (*.bin *.elf *.oelf) ملفات - - - - Game Boot - تشغيل اللعبة - - - - Only one file can be selected! - !يمكن تحديد ملف واحد فقط - - - - PKG Extraction - PKG استخراج - - - - Patch detected! - تم اكتشاف تصحيح! - - - - PKG and Game versions match: - :واللعبة تتطابق إصدارات PKG - - - - Would you like to overwrite? - هل ترغب في الكتابة فوق الملف الموجود؟ - - - - PKG Version %1 is older than installed version: - :أقدم من الإصدار المثبت PKG Version %1 - - - - Game is installed: - :اللعبة مثبتة - - - - Would you like to install Patch: - :هل ترغب في تثبيت التصحيح - - - - DLC Installation - تثبيت المحتوى القابل للتنزيل - - - - Would you like to install DLC: %1? - هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ - - - - DLC already installed: - :المحتوى القابل للتنزيل مثبت بالفعل - - - - Game already installed - اللعبة مثبتة بالفعل - - - - PKG is a patch, please install the game first! - !PKG هو تصحيح، يرجى تثبيت اللعبة أولاً - - - - PKG ERROR - PKG خطأ في - - - - Extracting PKG %1/%2 - PKG %1/%2 جاري استخراج - - - - Extraction Finished - اكتمل الاستخراج - - - - Game successfully installed at %1 - تم تثبيت اللعبة بنجاح في %1 - - - - File doesn't appear to be a valid PKG file - يبدو أن الملف ليس ملف PKG صالحًا - - - - CheatsPatches - - - Cheats / Patches - الغش / التصحيحات - - - - defaultTextEdit_MSG - الغش والتصحيحات هي ميزات تجريبية. - استخدمها بحذر. - - قم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل. - في علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك. - - نظرًا لأننا لا نقوم بتطوير الغش/التصحيحات، - يرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش. - - هل قمت بإنشاء غش جديد؟ قم بزيارة: - https://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - لا تتوفر صورة - - - - Serial: - الرقم التسلسلي: - - - - Version: - الإصدار: - - - - Size: - الحجم: - - - - Select Cheat File: - اختر ملف الغش: - - - - Repository: - المستودع: - - - - Download Cheats - تنزيل الغش - - - - Delete File - حذف الملف - - - - No files selected. - لم يتم اختيار أي ملفات. - - - - You can delete the cheats you don't want after downloading them. - يمكنك حذف الغش الذي لا تريده بعد تنزيله. - - - - Do you want to delete the selected file?\n%1 - هل تريد حذف الملف المحدد؟ - %1 - - - - Select Patch File: - اختر ملف التصحيح: - - - - Download Patches - تنزيل التصحيحات - - - - Save - حفظ - - - - Cheats - الغش - - - - Patches - التصحيحات - - - - Error - خطأ - - - - No patch selected. - لم يتم اختيار أي تصحيح. - - - - Unable to open files.json for reading. - تعذر فتح files.json للقراءة. - - - - No patch file found for the current serial. - لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. - - - - Unable to open the file for reading. - تعذر فتح الملف للقراءة. - - - - Unable to open the file for writing. - تعذر فتح الملف للكتابة. - - - - Failed to parse XML: - :فشل في تحليل XML - - - - Success - نجاح - - - - Options saved successfully. - تم حفظ الخيارات بنجاح. - - - - Invalid Source - مصدر غير صالح - - - - The selected source is invalid. - المصدر المحدد غير صالح. - - - - File Exists - الملف موجود - - - - File already exists. Do you want to replace it? - الملف موجود بالفعل. هل تريد استبداله؟ - - - - Failed to save file: - :فشل في حفظ الملف - - - - Failed to download file: - :فشل في تنزيل الملف - - - - Cheats Not Found - لم يتم العثور على الغش - - - - CheatsNotFound_MSG - لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. - - - - Cheats Downloaded Successfully - تم تنزيل الغش بنجاح - - - - CheatsDownloadedSuccessfully_MSG - لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. - - - - Failed to save: - :فشل في الحفظ - - - - Failed to download: - :فشل في التنزيل - - - - Download Complete - اكتمل التنزيل - - - - DownloadComplete_MSG - تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. قد تحتاج إلى تحديث اللعبة. - - - - Failed to parse JSON data from HTML. - فشل في تحليل بيانات JSON من HTML. - - - - Failed to retrieve HTML page. - .HTML فشل في استرجاع صفحة - - - - Failed to open file: - :فشل في فتح الملف - - - - XML ERROR: - :خطأ في XML - - - - Failed to open files.json for writing - فشل في فتح files.json للكتابة - - - - Author: - :المؤلف - - - - Directory does not exist: - :المجلد غير موجود - - - - Failed to open files.json for reading. - فشل في فتح files.json للقراءة. - - - - Name: - :الاسم - + + + * Unsupported Vulkan Version + * إصدار Vulkan غير مدعوم + + + + Download Cheats For All Installed Games + تنزيل الغش لجميع الألعاب المثبتة + + + + Download Patches For All Games + تنزيل التصحيحات لجميع الألعاب + + + + Download Complete + اكتمل التنزيل + + + + You have downloaded cheats for all the games you have installed. + لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. + + + + Patches Downloaded Successfully! + !تم تنزيل التصحيحات بنجاح + + + + All Patches available for all games have been downloaded. + .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب + + + + Games: + :الألعاب + + + + PKG File (*.PKG) + PKG (*.PKG) ملف + + + + ELF files (*.bin *.elf *.oelf) + ELF (*.bin *.elf *.oelf) ملفات + + + + Game Boot + تشغيل اللعبة + + + + Only one file can be selected! + !يمكن تحديد ملف واحد فقط + + + + PKG Extraction + PKG استخراج + + + + Patch detected! + تم اكتشاف تصحيح! + + + + PKG and Game versions match: + :واللعبة تتطابق إصدارات PKG + + + + Would you like to overwrite? + هل ترغب في الكتابة فوق الملف الموجود؟ + + + + PKG Version %1 is older than installed version: + :أقدم من الإصدار المثبت PKG Version %1 + + + + Game is installed: + :اللعبة مثبتة + + + + Would you like to install Patch: + :هل ترغب في تثبيت التصحيح + + + + DLC Installation + تثبيت المحتوى القابل للتنزيل + + + + Would you like to install DLC: %1? + هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ + + + + DLC already installed: + :المحتوى القابل للتنزيل مثبت بالفعل + + + + Game already installed + اللعبة مثبتة بالفعل + + + + PKG is a patch, please install the game first! + !PKG هو تصحيح، يرجى تثبيت اللعبة أولاً + + + + PKG ERROR + PKG خطأ في + + + + Extracting PKG %1/%2 + PKG %1/%2 جاري استخراج + + + + Extraction Finished + اكتمل الاستخراج + + + + Game successfully installed at %1 + تم تثبيت اللعبة بنجاح في %1 + + + + File doesn't appear to be a valid PKG file + يبدو أن الملف ليس ملف PKG صالحًا + + + + CheatsPatches + + + Cheats / Patches + الغش / التصحيحات + + + + defaultTextEdit_MSG + الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + لا تتوفر صورة + + + + Serial: + الرقم التسلسلي: + + + + Version: + الإصدار: + + + + Size: + الحجم: + + + + Select Cheat File: + اختر ملف الغش: + + + + Repository: + المستودع: + + + + Download Cheats + تنزيل الغش + + + + Delete File + حذف الملف + + + + No files selected. + لم يتم اختيار أي ملفات. + + + + You can delete the cheats you don't want after downloading them. + يمكنك حذف الغش الذي لا تريده بعد تنزيله. + + + + Do you want to delete the selected file?\n%1 + هل تريد حذف الملف المحدد؟\n%1 + + + + Select Patch File: + اختر ملف التصحيح: + + + + Download Patches + تنزيل التصحيحات + + + + Save + حفظ + + + + Cheats + الغش + + + + Patches + التصحيحات + + + + Error + خطأ + + + + No patch selected. + لم يتم اختيار أي تصحيح. + + + + Unable to open files.json for reading. + تعذر فتح files.json للقراءة. + + + + No patch file found for the current serial. + لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. + + + + Unable to open the file for reading. + تعذر فتح الملف للقراءة. + + + + Unable to open the file for writing. + تعذر فتح الملف للكتابة. + + + + Failed to parse XML: + :فشل في تحليل XML + + + + Success + نجاح + + + + Options saved successfully. + تم حفظ الخيارات بنجاح. + + + + Invalid Source + مصدر غير صالح + + + + The selected source is invalid. + المصدر المحدد غير صالح. + + + + File Exists + الملف موجود + + + + File already exists. Do you want to replace it? + الملف موجود بالفعل. هل تريد استبداله؟ + + + + Failed to save file: + :فشل في حفظ الملف + + + + Failed to download file: + :فشل في تنزيل الملف + + + + Cheats Not Found + لم يتم العثور على الغش + + + + CheatsNotFound_MSG + لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. + + + + Cheats Downloaded Successfully + تم تنزيل الغش بنجاح + + + + CheatsDownloadedSuccessfully_MSG + لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. + + + + Failed to save: + :فشل في الحفظ + + + + Failed to download: + :فشل في التنزيل + + + + Download Complete + اكتمل التنزيل + + + + DownloadComplete_MSG + تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. قد تحتاج إلى تحديث اللعبة. + + + + Failed to parse JSON data from HTML. + فشل في تحليل بيانات JSON من HTML. + + + + Failed to retrieve HTML page. + .HTML فشل في استرجاع صفحة + + + + Failed to open file: + :فشل في فتح الملف + + + + XML ERROR: + :خطأ في XML + + + + Failed to open files.json for writing + فشل في فتح files.json للكتابة + + + + Author: + :المؤلف + + + + Directory does not exist: + :المجلد غير موجود + + + + Failed to open files.json for reading. + فشل في فتح files.json للقراءة. + + + + Name: + :الاسم + Can't apply cheats before the game is started لا يمكن تطبيق الغش قبل بدء اللعبة. - + SettingsDialog @@ -944,6 +973,111 @@ Close إغلاق + + + Point your mouse at an option to display its description. + وجّه الماوس نحو خيار لعرض وصفه. + + + + consoleLanguageGroupBox + لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. + + + + emulatorLanguageGroupBox + لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. + + + + fullscreenCheckBox + تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. + + + + showSplashCheckBox + إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. + + + + ps4proCheckBox + هل هو PS4 Pro:\nيجعل المحاكي يعمل كـ PS4 PRO، مما قد يتيح ميزات خاصة في الألعاب التي تدعمه. + + + + userName + اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. + + + + logTypeGroupBox + نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. + + + + logFilter + فلتر السجل: يقوم بتصفية السجل لطباعة معلومات محددة فقط. أمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. + + + + updaterGroupBox + تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. + + + + GUIgroupBox + تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. + + + + graphicsAdapterGroupBox + جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. + + + + resolutionLayout + العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. + + + + heightDivider + مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! + + + + dumpShadersCheckBox + تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. + + + + nullGpuCheckBox + تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. + + + + dumpPM4CheckBox + تمكين تفريغ PM4:\nلأغراض تصحيح الأخطاء التقنية، يحفظ بيانات تعليمات GPU الأولية في مجلد أثناء معالجتها. + + + + debugDump + تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. + + + + vkValidationCheckBox + تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. + + + + vkSyncValidationCheckBox + تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. + + + + rdocCheckBox + تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. + GameListFrame @@ -988,4 +1122,132 @@ مسار - + + CheckUpdate + + + Auto Updater + محدث تلقائي + + + + Error + خطأ + + + + Network error: + خطأ في الشبكة: + + + + Failed to parse update information. + فشل في تحليل معلومات التحديث. + + + + No pre-releases found. + لم يتم العثور على أي إصدارات مسبقة. + + + + Invalid release data. + بيانات الإصدار غير صالحة. + + + + No download URL found for the specified asset. + لم يتم العثور على عنوان URL للتنزيل للأصل المحدد. + + + + Your version is already up to date! + نسختك محدثة بالفعل! + + + + Update Available + تحديث متاح + + + + Update Channel + قناة التحديث + + + + Current Version + الإصدار الحالي + + + + Latest Version + آخر إصدار + + + + Do you want to update? + هل تريد التحديث؟ + + + + Show Changelog + عرض سجل التغييرات + + + + Check for Updates at Startup + تحقق من التحديثات عند بدء التشغيل + + + + Update + تحديث + + + + No + لا + + + + Hide Changelog + إخفاء سجل التغييرات + + + + Changes + تغييرات + + + + Network error occurred while trying to access the URL + حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL + + + + Download Complete + اكتمل التنزيل + + + + The update has been downloaded, press OK to install. + تم تنزيل التحديث، اضغط على OK للتثبيت. + + + + Failed to save the update file at + فشل في حفظ ملف التحديث في + + + + Starting Update... + بدء التحديث... + + + + Failed to create the update script file + فشل في إنشاء ملف سكريبت التحديث + + + \ No newline at end of file diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index bb405ec0a..73bc37189 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Trick / Patches - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Download Tricks / Patches - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + - - MainWindow + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Trick / Patches + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Tjek for opdateringer + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Download Tricks / Patches + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Hjælp + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Opdatering + + + + Check for Updates at Startup + Tjek for opdateringer ved start + + + + Update Channel + Opdateringskanal + + + + Check for Updates + Tjek for opdateringer + + + + GUI Settings + GUI-Indstillinger + + + + Play title music + Afspil titelsang + + + + Volume + Lydstyrke + + + + MainWindow Game List Spiloversigt - - - * Unsupported Vulkan Version - * Ikke understøttet Vulkan-version - - - - Download Cheats For All Installed Games - Hent snyd til alle installerede spil - - - - Download Patches For All Games - Hent patches til alle spil - - - - Download Complete - Download fuldført - - - - You have downloaded cheats for all the games you have installed. - Du har hentet snyd til alle de spil, du har installeret. - - - - Patches Downloaded Successfully! - Patcher hentet med succes! - - - - All Patches available for all games have been downloaded. - Alle patches til alle spil er blevet hentet. - - - - Games: - Spil: - - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - - Game Boot - Spil-boot - - - - Only one file can be selected! - Kun én fil kan vælges! - - - - PKG Extraction - PKG-udtrækning - - - - Patch detected! - Opdatering detekteret! - - - - PKG and Game versions match: - PKG og spilversioner matcher: - - - - Would you like to overwrite? - Vil du overskrive? - - - - PKG Version %1 is older than installed version: - PKG Version %1 er ældre end den installerede version: - - - - Game is installed: - Spillet er installeret: - - - - Would you like to install Patch: - Vil du installere opdateringen: - - - - DLC Installation - DLC Installation - - - - Would you like to install DLC: %1? - Vil du installere DLC: %1? - - - - DLC already installed: - DLC allerede installeret: - - - - Game already installed - Spillet er allerede installeret - - - - PKG is a patch, please install the game first! - PKG er en patch, venligst installer spillet først! - - - - PKG ERROR - PKG FEJL - - - - Extracting PKG %1/%2 - Udvinding af PKG %1/%2 - - - - Extraction Finished - Udvinding afsluttet - - - - Game successfully installed at %1 - Spillet blev installeret succesfuldt på %1 - - - - File doesn't appear to be a valid PKG file - Filen ser ikke ud til at være en gyldig PKG-fil - - - - CheatsPatches - - - Cheats / Patches - Snyd / Patches - - - - defaultTextEdit_MSG - Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Ingen billede tilgængelig - - - - Serial: - Serienummer: - - - - Version: - Version: - - - - Size: - Størrelse: - - - - Select Cheat File: - Vælg snyd-fil: - - - - Repository: - Repository: - - - - Download Cheats - Hent snyd - - - - Delete File - Slet fil - - - - No files selected. - Ingen filer valgt. - - - - You can delete the cheats you don't want after downloading them. - Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. - - - - Do you want to delete the selected file?\n%1 - Ønsker du at slette den valgte fil?\n%1 - - - - Select Patch File: - Vælg patch-fil: - - - - Download Patches - Hent patches - - - - Save - Gem - - - - Cheats - Snyd - - - - Patches - Patches - - - - Error - Fejl - - - - No patch selected. - Ingen patch valgt. - - - - Unable to open files.json for reading. - Kan ikke åbne files.json til læsning. - - - - No patch file found for the current serial. - Ingen patch-fil fundet for det nuværende serienummer. - - - - Unable to open the file for reading. - Kan ikke åbne filen til læsning. - - - - Unable to open the file for writing. - Kan ikke åbne filen til skrivning. - - - - Failed to parse XML: - Kunne ikke analysere XML: - - - - Success - Succes - - - - Options saved successfully. - Indstillinger gemt med succes. - - - - Invalid Source - Ugyldig kilde - - - - The selected source is invalid. - Den valgte kilde er ugyldig. - - - - File Exists - Fil findes - - - - File already exists. Do you want to replace it? - Filen findes allerede. Vil du erstatte den? - - - - Failed to save file: - Kunne ikke gemme fil: - - - - Failed to download file: - Kunne ikke hente fil: - - - - Cheats Not Found - Snyd ikke fundet - - - - CheatsNotFound_MSG - Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. - - - - Cheats Downloaded Successfully - Snyd hentet med succes - - - - CheatsDownloadedSuccessfully_MSG - Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. - - - - Failed to save: - Kunne ikke gemme: - - - - Failed to download: - Kunne ikke hente: - - - - Download Complete - Download fuldført - - - - DownloadComplete_MSG - Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. Det kan være nødvendigt at opdatere spillet. - - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - - Failed to open file: - Kunne ikke åbne fil: - - - - XML ERROR: - XML FEJL: - - - - Failed to open files.json for writing - Kunne ikke åbne files.json til skrivning - - - - Author: - Forfatter: - - - - Directory does not exist: - Mappe findes ikke: - - - - Failed to open files.json for reading. - Kunne ikke åbne files.json til læsning. - - - - Name: - Navn: - + + + * Unsupported Vulkan Version + * Ikke understøttet Vulkan-version + + + + Download Cheats For All Installed Games + Hent snyd til alle installerede spil + + + + Download Patches For All Games + Hent patches til alle spil + + + + Download Complete + Download fuldført + + + + You have downloaded cheats for all the games you have installed. + Du har hentet snyd til alle de spil, du har installeret. + + + + Patches Downloaded Successfully! + Patcher hentet med succes! + + + + All Patches available for all games have been downloaded. + Alle patches til alle spil er blevet hentet. + + + + Games: + Spil: + + + + PKG File (*.PKG) + PKG-fil (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + + Game Boot + Spil-boot + + + + Only one file can be selected! + Kun én fil kan vælges! + + + + PKG Extraction + PKG-udtrækning + + + + Patch detected! + Opdatering detekteret! + + + + PKG and Game versions match: + PKG og spilversioner matcher: + + + + Would you like to overwrite? + Vil du overskrive? + + + + PKG Version %1 is older than installed version: + PKG Version %1 er ældre end den installerede version: + + + + Game is installed: + Spillet er installeret: + + + + Would you like to install Patch: + Vil du installere opdateringen: + + + + DLC Installation + DLC Installation + + + + Would you like to install DLC: %1? + Vil du installere DLC: %1? + + + + DLC already installed: + DLC allerede installeret: + + + + Game already installed + Spillet er allerede installeret + + + + PKG is a patch, please install the game first! + PKG er en patch, venligst installer spillet først! + + + + PKG ERROR + PKG FEJL + + + + Extracting PKG %1/%2 + Udvinding af PKG %1/%2 + + + + Extraction Finished + Udvinding afsluttet + + + + Game successfully installed at %1 + Spillet blev installeret succesfuldt på %1 + + + + File doesn't appear to be a valid PKG file + Filen ser ikke ud til at være en gyldig PKG-fil + + + + CheatsPatches + + + Cheats / Patches + Snyd / Patches + + + + defaultTextEdit_MSG + Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Ingen billede tilgængelig + + + + Serial: + Serienummer: + + + + Version: + Version: + + + + Size: + Størrelse: + + + + Select Cheat File: + Vælg snyd-fil: + + + + Repository: + Repository: + + + + Download Cheats + Hent snyd + + + + Delete File + Slet fil + + + + No files selected. + Ingen filer valgt. + + + + You can delete the cheats you don't want after downloading them. + Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. + + + + Do you want to delete the selected file?\n%1 + Ønsker du at slette den valgte fil?\n%1 + + + + Select Patch File: + Vælg patch-fil: + + + + Download Patches + Hent patches + + + + Save + Gem + + + + Cheats + Snyd + + + + Patches + Patches + + + + Error + Fejl + + + + No patch selected. + Ingen patch valgt. + + + + Unable to open files.json for reading. + Kan ikke åbne files.json til læsning. + + + + No patch file found for the current serial. + Ingen patch-fil fundet for det nuværende serienummer. + + + + Unable to open the file for reading. + Kan ikke åbne filen til læsning. + + + + Unable to open the file for writing. + Kan ikke åbne filen til skrivning. + + + + Failed to parse XML: + Kunne ikke analysere XML: + + + + Success + Succes + + + + Options saved successfully. + Indstillinger gemt med succes. + + + + Invalid Source + Ugyldig kilde + + + + The selected source is invalid. + Den valgte kilde er ugyldig. + + + + File Exists + Fil findes + + + + File already exists. Do you want to replace it? + Filen findes allerede. Vil du erstatte den? + + + + Failed to save file: + Kunne ikke gemme fil: + + + + Failed to download file: + Kunne ikke hente fil: + + + + Cheats Not Found + Snyd ikke fundet + + + + CheatsNotFound_MSG + Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. + + + + Cheats Downloaded Successfully + Snyd hentet med succes + + + + CheatsDownloadedSuccessfully_MSG + Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. + + + + Failed to save: + Kunne ikke gemme: + + + + Failed to download: + Kunne ikke hente: + + + + Download Complete + Download fuldført + + + + DownloadComplete_MSG + Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. Det kan være nødvendigt at opdatere spillet. + + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + + Failed to open file: + Kunne ikke åbne fil: + + + + XML ERROR: + XML FEJL: + + + + Failed to open files.json for writing + Kunne ikke åbne files.json til skrivning + + + + Author: + Forfatter: + + + + Directory does not exist: + Mappe findes ikke: + + + + Failed to open files.json for reading. + Kunne ikke åbne files.json til læsning. + + + + Name: + Navn: + Can't apply cheats before the game is started Kan ikke anvende snyd før spillet er startet. - + SettingsDialog @@ -931,6 +973,111 @@ Close Luk + + + Point your mouse at an option to display its description. + Peg musen over et valg for at vise dets beskrivelse. + + + + consoleLanguageGroupBox + Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. + + + + emulatorLanguageGroupBox + Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. + + + + fullscreenCheckBox + Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. + + + + showSplashCheckBox + Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. + + + + ps4proCheckBox + Er det en PS4 Pro:\nGør det muligt for emulatoren at fungere som en PS4 PRO, hvilket kan aktivere visse funktioner i spil, der understøtter det. + + + + userName + Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. + + + + logTypeGroupBox + Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. + + + + logFilter + Logfilter: Filtrerer loggen for kun at udskrive bestemte oplysninger. Eksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. + + + + updaterGroupBox + Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. + + + + GUIgroupBox + Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. + + + + graphicsAdapterGroupBox + Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. + + + + resolutionLayout + Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. + + + + heightDivider + Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! + + + + dumpShadersCheckBox + Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. + + + + nullGpuCheckBox + Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. + + + + dumpPM4CheckBox + Aktiver dumping af PM4:\nTil teknisk fejlfinding gemmer det rå GPU-kommandoer i en mappe under behandling. + + + + debugDump + Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. + + + + vkValidationCheckBox + Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. + + + + vkSyncValidationCheckBox + Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. + + + + rdocCheckBox + Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. + GameListFrame @@ -975,4 +1122,132 @@ Sti + + CheckUpdate + + + Auto Updater + Automatisk opdatering + + + + Error + Fejl + + + + Network error: + Netsværksfejl: + + + + Failed to parse update information. + Kunne ikke analysere opdateringsoplysninger. + + + + No pre-releases found. + Ingen forhåndsudgivelser fundet. + + + + Invalid release data. + Ugyldige udgivelsesdata. + + + + No download URL found for the specified asset. + Ingen download-URL fundet for den specificerede aktiver. + + + + Your version is already up to date! + Din version er allerede opdateret! + + + + Update Available + Opdatering tilgængelig + + + + Update Channel + Opdateringskanal + + + + Current Version + Nuværende version + + + + Latest Version + Nyeste version + + + + Do you want to update? + Vil du opdatere? + + + + Show Changelog + Vis ændringslog + + + + Check for Updates at Startup + Tjek for opdateringer ved start + + + + Update + Opdater + + + + No + Nej + + + + Hide Changelog + Skjul ændringslog + + + + Changes + Ændringer + + + + Network error occurred while trying to access the URL + Netsværksfejl opstod, mens der blev forsøgt at få adgang til URL'en + + + + Download Complete + Download fuldført + + + + The update has been downloaded, press OK to install. + Opdateringen er blevet downloadet, tryk på OK for at installere. + + + + Failed to save the update file at + Kunne ikke gemme opdateringsfilen på + + + + Starting Update... + Starter opdatering... + + + + Failed to create the update script file + Kunne ikke oprette opdateringsscriptfilen + + \ No newline at end of file diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 1482686ce..771d3bf8e 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - Über shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. - - - - This software should not be used to play games you have not legally obtained. - Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. - - - - ElfViewer - - - Open Folder - Ordner öffnen - - - - GameInfoClass - - - Loading game list, please wait :3 - Lade Spielliste, bitte warten :3 - - - - Cancel - Abbrechen - - - - Loading... - Lade... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Wähle Ordner - - - - Directory to install games - Installationsverzeichnis für Spiele - - - - Browse - Durchsuchen - - - - Error - Fehler - - - - The value for location to install games is not valid. - Der ausgewählte Ordner ist nicht gültig. - - - - GuiContextMenus - - - Create Shortcut - Verknüpfung erstellen - - - - Open Game Folder - Spieleordner öffnen - - - - Cheats / Patches - Cheats / Patches - - - - SFO Viewer - SFO anzeigen - - - - Trophy Viewer - Trophäen anzeigen - - - - Copy info - Infos kopieren - - - - Copy Name - Namen kopieren - - - - Copy Serial - Seriennummer kopieren - - - - Copy All - Alles kopieren - - - - Shortcut creation - Verknüpfungserstellung - - - - Shortcut created successfully!\n %1 - Verknüpfung erfolgreich erstellt!\n %1 - - - - Error - Fehler - - - - Error creating shortcut!\n %1 - Fehler beim Erstellen der Verknüpfung!\n %1 - - - - Install PKG - PKG installieren - - - - MainWindow - - - Open/Add Elf Folder - Elf-Ordner öffnen/hinzufügen - - - - Install Packages (PKG) - Pakete installieren (PKG) - - - - Boot Game - Spiel starten - - - - About shadPS4 - Über shadPS4 - - - - Configure... - Konfigurieren... - - - - Install application from a .pkg file - Installiere Anwendung aus .pkg-Datei - - - - Recent Games - Zuletzt gespielt - - - - Exit - Beenden - - - - Exit shadPS4 - shadPS4 beenden - - - - Exit the application. - Die Anwendung beenden. - - - - Show Game List - Spielliste anzeigen - - - - Game List Refresh - Spielliste aktualisieren - - - - Tiny - Winzig - - - - Small - Klein - - - - Medium - Mittel - - - - Large - Groß - - - - List View - Listenansicht - - - - Grid View - Gitteransicht - - - - Elf Viewer - Elf-Ansicht - - - - Game Install Directory - Installationsverzeichnis für Spiele - - - - Download Cheats/Patches - Cheats / Patches herunterladen - - - - Dump Game List - Spielliste ausgeben - - - - PKG Viewer - PKG-Ansicht - - - - Search... - Suchen... - - - - File - Datei - - - - View - Ansicht - - - - Game List Icons - Game List Icons - - - - Game List Mode - Spiellisten-Symoble - - - - Settings - Einstellungen - - - - Utils - Werkzeuge - - - - Themes - Stile - - - - About - Über - - - - Dark - Dunkel - - - - Light - Hell - - - - Green - Grün - - - - Blue - Blau - - - - Violet - Violett - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Ordner öffnen - - - - TrophyViewer - - - Trophy Viewer - Trophäenansicht - - - - SettingsDialog - - - Settings - Einstellungen - - - - General - Allgemein - - - - System - System - - - - Console Language - Konsolensprache - - - - Emulator Language - Emulatorsprache - - - - Emulator - Emulator - - - - Enable Fullscreen - Vollbild aktivieren - - - - Show Splash - Startbildschirm anzeigen - - - - Is PS4 Pro - Ist PS4 Pro - - - - Username - Benutzername - - - - Logger - Logger - - - - Log Type - Logtyp - - - - Log Filter - Log-Filter - - - - Graphics - Grafik - - - - Graphics Device - Grafikgerät - - - - Width - Breite - - - - Height - Höhe - - - - Vblank Divider - Vblank-Teiler - - - - Advanced - Erweitert - - - - Enable Shaders Dumping - Shader-Dumping aktivieren - - - - Enable NULL GPU - NULL GPU aktivieren - - - - Enable PM4 Dumping - PM4-Dumping aktivieren - - - - Debug - Debug - - - - Enable Debug Dumping - Debug-Dumping aktivieren - - - - Enable Vulkan Validation Layers - Vulkan Validations-Ebenen aktivieren - - - - Enable Vulkan Synchronization Validation - Vulkan Synchronisations-Validierung aktivieren - - - - Enable RenderDoc Debugging - RenderDoc-Debugging aktivieren - + + AboutDialog + + + About shadPS4 + Über shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. + + + + This software should not be used to play games you have not legally obtained. + Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. + - - MainWindow + + ElfViewer + + + Open Folder + Ordner öffnen + + + + GameInfoClass + + + Loading game list, please wait :3 + Lade Spielliste, bitte warten :3 + + + + Cancel + Abbrechen + + + + Loading... + Lade... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Wähle Ordner + + + + Directory to install games + Installationsverzeichnis für Spiele + + + + Browse + Durchsuchen + + + + Error + Fehler + + + + The value for location to install games is not valid. + Der ausgewählte Ordner ist nicht gültig. + + + + GuiContextMenus + + + Create Shortcut + Verknüpfung erstellen + + + + Open Game Folder + Spieleordner öffnen + + + + Cheats / Patches + Cheats / Patches + + + + SFO Viewer + SFO anzeigen + + + + Trophy Viewer + Trophäen anzeigen + + + + Copy info + Infos kopieren + + + + Copy Name + Namen kopieren + + + + Copy Serial + Seriennummer kopieren + + + + Copy All + Alles kopieren + + + + Shortcut creation + Verknüpfungserstellung + + + + Shortcut created successfully!\n %1 + Verknüpfung erfolgreich erstellt!\n %1 + + + + Error + Fehler + + + + Error creating shortcut!\n %1 + Fehler beim Erstellen der Verknüpfung!\n %1 + + + + Install PKG + PKG installieren + + + + MainWindow + + + Open/Add Elf Folder + Elf-Ordner öffnen/hinzufügen + + + + Install Packages (PKG) + Pakete installieren (PKG) + + + + Boot Game + Spiel starten + + + + Check for Updates + Nach Updates suchen + + + + About shadPS4 + Über shadPS4 + + + + Configure... + Konfigurieren... + + + + Install application from a .pkg file + Installiere Anwendung aus .pkg-Datei + + + + Recent Games + Zuletzt gespielt + + + + Exit + Beenden + + + + Exit shadPS4 + shadPS4 beenden + + + + Exit the application. + Die Anwendung beenden. + + + + Show Game List + Spielliste anzeigen + + + + Game List Refresh + Spielliste aktualisieren + + + + Tiny + Winzig + + + + Small + Klein + + + + Medium + Mittel + + + + Large + Groß + + + + List View + Listenansicht + + + + Grid View + Gitteransicht + + + + Elf Viewer + Elf-Ansicht + + + + Game Install Directory + Installationsverzeichnis für Spiele + + + + Download Cheats/Patches + Cheats / Patches herunterladen + + + + Dump Game List + Spielliste ausgeben + + + + PKG Viewer + PKG-Ansicht + + + + Search... + Suchen... + + + + File + Datei + + + + View + Ansicht + + + + Game List Icons + Game List Icons + + + + Game List Mode + Spiellisten-Symoble + + + + Settings + Einstellungen + + + + Utils + Werkzeuge + + + + Themes + Stile + + + + Help + Hilfe + + + + Dark + Dunkel + + + + Light + Hell + + + + Green + Grün + + + + Blue + Blau + + + + Violet + Violett + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Ordner öffnen + + + + TrophyViewer + + + Trophy Viewer + Trophäenansicht + + + + SettingsDialog + + + Settings + Einstellungen + + + + General + Allgemein + + + + System + System + + + + Console Language + Konsolensprache + + + + Emulator Language + Emulatorsprache + + + + Emulator + Emulator + + + + Enable Fullscreen + Vollbild aktivieren + + + + Show Splash + Startbildschirm anzeigen + + + + Is PS4 Pro + Ist PS4 Pro + + + + Username + Benutzername + + + + Logger + Logger + + + + Log Type + Logtyp + + + + Log Filter + Log-Filter + + + + Graphics + Grafik + + + + Graphics Device + Grafikgerät + + + + Width + Breite + + + + Height + Höhe + + + + Vblank Divider + Vblank-Teiler + + + + Advanced + Erweitert + + + + Enable Shaders Dumping + Shader-Dumping aktivieren + + + + Enable NULL GPU + NULL GPU aktivieren + + + + Enable PM4 Dumping + PM4-Dumping aktivieren + + + + Debug + Debug + + + + Enable Debug Dumping + Debug-Dumping aktivieren + + + + Enable Vulkan Validation Layers + Vulkan Validations-Ebenen aktivieren + + + + Enable Vulkan Synchronization Validation + Vulkan Synchronisations-Validierung aktivieren + + + + Enable RenderDoc Debugging + RenderDoc-Debugging aktivieren + + + + Update + Aktualisieren + + + + Check for Updates at Startup + Beim Start nach Updates suchen + + + + Update Channel + Update-Kanal + + + + Check for Updates + Nach Updates suchen + + + + GUI Settings + GUI-Einstellungen + + + + Play title music + Titelmusik abspielen + + + + Volume + Lautstärke + + + + MainWindow Game List Spieleliste - - - * Unsupported Vulkan Version - * Nicht unterstützte Vulkan-Version - - - - Download Cheats For All Installed Games - Cheats für alle installierten Spiele herunterladen - - - - Download Patches For All Games - Patches für alle Spiele herunterladen - - - - Download Complete - Download abgeschlossen - - - - You have downloaded cheats for all the games you have installed. - Sie haben Cheats für alle installierten Spiele heruntergeladen. - - - - Patches Downloaded Successfully! - Patches erfolgreich heruntergeladen! - - - - All Patches available for all games have been downloaded. - Alle Patches für alle Spiele wurden heruntergeladen. - - - - Games: - Spiele: - - - - PKG File (*.PKG) - PKG-Datei (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-Dateien (*.bin *.elf *.oelf) - - - - Game Boot - Spiel-Start - - - - Only one file can be selected! - Es kann nur eine Datei ausgewählt werden! - - - - PKG Extraction - PKG-Extraktion - - - - Patch detected! - Patch erkannt! - - - - PKG and Game versions match: - PKG- und Spielversionen stimmen überein: - - - - Would you like to overwrite? - Willst du überschreiben? - - - - PKG Version %1 is older than installed version: - PKG-Version %1 ist älter als die installierte Version: - - - - Game is installed: - Spiel ist installiert: - - - - Would you like to install Patch: - Willst du den Patch installieren: - - - - DLC Installation - DLC-Installation - - - - Would you like to install DLC: %1? - Willst du den DLC installieren: %1? - - - - DLC already installed: - DLC bereits installiert: - - - - Game already installed - Spiel bereits installiert - - - - PKG is a patch, please install the game first! - PKG ist ein Patch, bitte installieren Sie zuerst das Spiel! - - - - PKG ERROR - PKG-FEHLER - - - - Extracting PKG %1/%2 - Extrahiere PKG %1/%2 - - - - Extraction Finished - Extraktion abgeschlossen - - - - Game successfully installed at %1 - Spiel erfolgreich installiert auf %1 - - - - File doesn't appear to be a valid PKG file - Die Datei scheint keine gültige PKG-Datei zu sein - - - - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Kein Bild verfügbar - - - - Serial: - Seriennummer: - - - - Version: - Version: - - - - Size: - Größe: - - - - Select Cheat File: - Cheat-Datei auswählen: - - - - Repository: - Repository: - - - - Download Cheats - Cheats herunterladen - - - - Delete File - Datei löschen - - - - No files selected. - Keine Dateien ausgewählt. - - - - You can delete the cheats you don't want after downloading them. - Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. - - - - Do you want to delete the selected file?\n%1 - Willst du die ausgewählte Datei löschen?\n%1 - - - - Select Patch File: - Patch-Datei auswählen: - - - - Download Patches - Patches herunterladen - - - - Save - Speichern - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Fehler - - - - No patch selected. - Kein Patch ausgewählt. - - - - Unable to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. - - - - No patch file found for the current serial. - Keine Patch-Datei für die aktuelle Seriennummer gefunden. - - - - Unable to open the file for reading. - Kann die Datei nicht zum Lesen öffnen. - - - - Unable to open the file for writing. - Kann die Datei nicht zum Schreiben öffnen. - - - - Failed to parse XML: - Fehler beim Parsen von XML: - - - - Success - Erfolg - - - - Options saved successfully. - Optionen erfolgreich gespeichert. - - - - Invalid Source - Ungültige Quelle - - - - The selected source is invalid. - Die ausgewählte Quelle ist ungültig. - - - - File Exists - Datei existiert - - - - File already exists. Do you want to replace it? - Datei existiert bereits. Möchtest du sie ersetzen? - - - - Failed to save file: - Fehler beim Speichern der Datei: - - - - Failed to download file: - Fehler beim Herunterladen der Datei: - - - - Cheats Not Found - Cheats nicht gefunden - - - - CheatsNotFound_MSG - Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. - - - - Cheats Downloaded Successfully - Cheats erfolgreich heruntergeladen - - - - CheatsDownloadedSuccessfully_MSG - Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. - - - - Failed to save: - Speichern fehlgeschlagen: - - - - Failed to download: - Herunterladen fehlgeschlagen: - - - - Download Complete - Download abgeschlossen - - - - DownloadComplete_MSG - Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. Möglicherweise müssen Sie das Spiel aktualisieren. - - - - Failed to parse JSON data from HTML. - Fehler beim Parsen der JSON-Daten aus HTML. - - - - Failed to retrieve HTML page. - Fehler beim Abrufen der HTML-Seite. - - - - Failed to open file: - Fehler beim Öffnen der Datei: - - - - XML ERROR: - XML-Fehler: - - - - Failed to open files.json for writing - Kann files.json nicht zum Schreiben öffnen - - - - Author: - Autor: - - - - Directory does not exist: - Verzeichnis existiert nicht: - - - - Failed to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. - - - - Name: - Name: - + + + * Unsupported Vulkan Version + * Nicht unterstützte Vulkan-Version + + + + Download Cheats For All Installed Games + Cheats für alle installierten Spiele herunterladen + + + + Download Patches For All Games + Patches für alle Spiele herunterladen + + + + Download Complete + Download abgeschlossen + + + + You have downloaded cheats for all the games you have installed. + Sie haben Cheats für alle installierten Spiele heruntergeladen. + + + + Patches Downloaded Successfully! + Patches erfolgreich heruntergeladen! + + + + All Patches available for all games have been downloaded. + Alle Patches für alle Spiele wurden heruntergeladen. + + + + Games: + Spiele: + + + + PKG File (*.PKG) + PKG-Datei (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF-Dateien (*.bin *.elf *.oelf) + + + + Game Boot + Spiel-Start + + + + Only one file can be selected! + Es kann nur eine Datei ausgewählt werden! + + + + PKG Extraction + PKG-Extraktion + + + + Patch detected! + Patch erkannt! + + + + PKG and Game versions match: + PKG- und Spielversionen stimmen überein: + + + + Would you like to overwrite? + Willst du überschreiben? + + + + PKG Version %1 is older than installed version: + PKG-Version %1 ist älter als die installierte Version: + + + + Game is installed: + Spiel ist installiert: + + + + Would you like to install Patch: + Willst du den Patch installieren: + + + + DLC Installation + DLC-Installation + + + + Would you like to install DLC: %1? + Willst du den DLC installieren: %1? + + + + DLC already installed: + DLC bereits installiert: + + + + Game already installed + Spiel bereits installiert + + + + PKG is a patch, please install the game first! + PKG ist ein Patch, bitte installieren Sie zuerst das Spiel! + + + + PKG ERROR + PKG-FEHLER + + + + Extracting PKG %1/%2 + Extrahiere PKG %1/%2 + + + + Extraction Finished + Extraktion abgeschlossen + + + + Game successfully installed at %1 + Spiel erfolgreich installiert auf %1 + + + + File doesn't appear to be a valid PKG file + Die Datei scheint keine gültige PKG-Datei zu sein + + + + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Kein Bild verfügbar + + + + Serial: + Seriennummer: + + + + Version: + Version: + + + + Size: + Größe: + + + + Select Cheat File: + Cheat-Datei auswählen: + + + + Repository: + Repository: + + + + Download Cheats + Cheats herunterladen + + + + Delete File + Datei löschen + + + + No files selected. + Keine Dateien ausgewählt. + + + + You can delete the cheats you don't want after downloading them. + Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. + + + + Do you want to delete the selected file?\n%1 + Willst du die ausgewählte Datei löschen?\n%1 + + + + Select Patch File: + Patch-Datei auswählen: + + + + Download Patches + Patches herunterladen + + + + Save + Speichern + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Fehler + + + + No patch selected. + Kein Patch ausgewählt. + + + + Unable to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. + + + + No patch file found for the current serial. + Keine Patch-Datei für die aktuelle Seriennummer gefunden. + + + + Unable to open the file for reading. + Kann die Datei nicht zum Lesen öffnen. + + + + Unable to open the file for writing. + Kann die Datei nicht zum Schreiben öffnen. + + + + Failed to parse XML: + Fehler beim Parsen von XML: + + + + Success + Erfolg + + + + Options saved successfully. + Optionen erfolgreich gespeichert. + + + + Invalid Source + Ungültige Quelle + + + + The selected source is invalid. + Die ausgewählte Quelle ist ungültig. + + + + File Exists + Datei existiert + + + + File already exists. Do you want to replace it? + Datei existiert bereits. Möchtest du sie ersetzen? + + + + Failed to save file: + Fehler beim Speichern der Datei: + + + + Failed to download file: + Fehler beim Herunterladen der Datei: + + + + Cheats Not Found + Cheats nicht gefunden + + + + CheatsNotFound_MSG + Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. + + + + Cheats Downloaded Successfully + Cheats erfolgreich heruntergeladen + + + + CheatsDownloadedSuccessfully_MSG + Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. + + + + Failed to save: + Speichern fehlgeschlagen: + + + + Failed to download: + Herunterladen fehlgeschlagen: + + + + Download Complete + Download abgeschlossen + + + + DownloadComplete_MSG + Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. Möglicherweise müssen Sie das Spiel aktualisieren. + + + + Failed to parse JSON data from HTML. + Fehler beim Parsen der JSON-Daten aus HTML. + + + + Failed to retrieve HTML page. + Fehler beim Abrufen der HTML-Seite. + + + + Failed to open file: + Fehler beim Öffnen der Datei: + + + + XML ERROR: + XML-Fehler: + + + + Failed to open files.json for writing + Kann files.json nicht zum Schreiben öffnen + + + + Author: + Autor: + + + + Directory does not exist: + Verzeichnis existiert nicht: + + + + Failed to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. + + + + Name: + Name: + Can't apply cheats before the game is started Kann keine Cheats anwenden, bevor das Spiel gestartet ist. - + SettingsDialog @@ -931,6 +973,111 @@ Close Schließen + + + Point your mouse at an option to display its description. + Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. + + + + consoleLanguageGroupBox + Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. + + + + emulatorLanguageGroupBox + Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. + + + + fullscreenCheckBox + Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. + + + + showSplashCheckBox + Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. + + + + ps4proCheckBox + Ist es eine PS4 Pro:\nErmöglicht es dem Emulator, als PS4 PRO zu arbeiten, was in Spielen, die dies unterstützen, spezielle Funktionen aktivieren kann. + + + + userName + Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. + + + + logTypeGroupBox + Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. + + + + logFilter + Protokollfilter: Filtert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden. Beispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. + + + + updaterGroupBox + Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. + + + + GUIgroupBox + Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. + + + + graphicsAdapterGroupBox + Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. + + + + resolutionLayout + Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. + + + + heightDivider + Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! + + + + dumpShadersCheckBox + Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. + + + + nullGpuCheckBox + Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. + + + + dumpPM4CheckBox + PM4-Dumping aktivieren:\nZum technischen Debuggen speichert es rohe GPU-Befehlsdaten in einem Ordner während der Verarbeitung. + + + + debugDump + Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. + + + + vkValidationCheckBox + Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. + + + + vkSyncValidationCheckBox + Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. + + + + rdocCheckBox + RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. + GameListFrame @@ -975,4 +1122,132 @@ Pfad + + CheckUpdate + + + Auto Updater + Automatischer Aktualisierer + + + + Error + Fehler + + + + Network error: + Netzwerkfehler: + + + + Failed to parse update information. + Fehler beim Parsen der Aktualisierungsinformationen. + + + + No pre-releases found. + Keine Vorabveröffentlichungen gefunden. + + + + Invalid release data. + Ungültige Versionsdaten. + + + + No download URL found for the specified asset. + Keine Download-URL für das angegebene Asset gefunden. + + + + Your version is already up to date! + Ihre Version ist bereits aktuell! + + + + Update Available + Aktualisierung verfügbar + + + + Update Channel + Update-Kanal + + + + Current Version + Aktuelle Version + + + + Latest Version + Neueste Version + + + + Do you want to update? + Möchten Sie aktualisieren? + + + + Show Changelog + Änderungsprotokoll anzeigen + + + + Check for Updates at Startup + Beim Start nach Updates suchen + + + + Update + Aktualisieren + + + + No + Nein + + + + Hide Changelog + Änderungsprotokoll ausblenden + + + + Changes + Änderungen + + + + Network error occurred while trying to access the URL + Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten + + + + Download Complete + Download abgeschlossen + + + + The update has been downloaded, press OK to install. + Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren. + + + + Failed to save the update file at + Fehler beim Speichern der Aktualisierungsdatei in + + + + Starting Update... + Aktualisierung wird gestartet... + + + + Failed to create the update script file + Fehler beim Erstellen der Aktualisierungs-Skriptdatei + + \ No newline at end of file diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 4a3aa54ff..f2265c7d7 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Kodikí / Enimeróseis - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Κατεβάστε Κωδικούς / Ενημερώσεις - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + - - MainWindow + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Kodikí / Enimeróseis + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Έλεγχος για ενημερώσεις + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Κατεβάστε Κωδικούς / Ενημερώσεις + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Βοήθεια + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Ενημέρωση + + + + Check for Updates at Startup + Έλεγχος για ενημερώσεις κατά την εκκίνηση + + + + Update Channel + Κανάλι Ενημέρωσης + + + + Check for Updates + Έλεγχος για ενημερώσεις + + + + GUI Settings + Ρυθμίσεις GUI + + + + Play title music + Αναπαραγωγή μουσικής τίτλου + + + + Volume + ένταση + + + + MainWindow Game List Λίστα παιχνιδιών - - - * Unsupported Vulkan Version - * Μη υποστηριζόμενη έκδοση Vulkan - - - - Download Cheats For All Installed Games - Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια - - - - Download Patches For All Games - Λήψη Patches για όλα τα παιχνίδια - - - - Download Complete - Η λήψη ολοκληρώθηκε - - - - You have downloaded cheats for all the games you have installed. - Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. - - - - Patches Downloaded Successfully! - Τα Patches κατέβηκαν επιτυχώς! - - - - All Patches available for all games have been downloaded. - Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. - - - - Games: - Παιχνίδια: - - - - PKG File (*.PKG) - Αρχείο PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Αρχεία ELF (*.bin *.elf *.oelf) - - - - Game Boot - Εκκίνηση παιχνιδιού - - - - Only one file can be selected! - Μπορεί να επιλεγεί μόνο ένα αρχείο! - - - - PKG Extraction - Εξαγωγή PKG - - - - Patch detected! - Αναγνώριση ενημέρωσης! - - - - PKG and Game versions match: - Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: - - - - Would you like to overwrite? - Θέλετε να αντικαταστήσετε; - - - - PKG Version %1 is older than installed version: - Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: - - - - Game is installed: - Το παιχνίδι είναι εγκατεστημένο: - - - - Would you like to install Patch: - Θέλετε να εγκαταστήσετε την ενημέρωση: - - - - DLC Installation - Εγκατάσταση DLC - - - - Would you like to install DLC: %1? - Θέλετε να εγκαταστήσετε το DLC: %1; - - - - DLC already installed: - DLC ήδη εγκατεστημένο: - - - - Game already installed - Παιχνίδι ήδη εγκατεστημένο - - - - PKG is a patch, please install the game first! - Το PKG είναι patch, παρακαλώ εγκαταστήστε πρώτα το παιχνίδι! - - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - - Extracting PKG %1/%2 - Εξαγωγή PKG %1/%2 - - - - Extraction Finished - Η εξαγωγή ολοκληρώθηκε - - - - Game successfully installed at %1 - Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 - - - - File doesn't appear to be a valid PKG file - Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG - - - - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Δεν διατίθεται εικόνα - - - - Serial: - Σειριακός αριθμός: - - - - Version: - Έκδοση: - - - - Size: - Μέγεθος: - - - - Select Cheat File: - Επιλέξτε αρχείο Cheat: - - - - Repository: - Αποθετήριο: - - - - Download Cheats - Λήψη Cheats - - - - Delete File - Διαγραφή αρχείου - - - - No files selected. - Δεν έχουν επιλεγεί αρχεία. - - - - You can delete the cheats you don't want after downloading them. - Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. - - - - Do you want to delete the selected file?\n%1 - Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 - - - - Select Patch File: - Επιλέξτε αρχείο Patch: - - - - Download Patches - Λήψη Patches - - - - Save - Αποθήκευση - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Σφάλμα - - - - No patch selected. - Δεν έχει επιλεγεί κανένα patch. - - - - Unable to open files.json for reading. - Αδυναμία ανοίγματος του files.json για ανάγνωση. - - - - No patch file found for the current serial. - Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. - - - - Unable to open the file for reading. - Αδυναμία ανοίγματος του αρχείου για ανάγνωση. - - - - Unable to open the file for writing. - Αδυναμία ανοίγματος του αρχείου για εγγραφή. - - - - Failed to parse XML: - Αποτυχία ανάλυσης XML: - - - - Success - Επιτυχία - - - - Options saved successfully. - Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. - - - - Invalid Source - Μη έγκυρη Πηγή - - - - The selected source is invalid. - Η επιλεγμένη πηγή είναι μη έγκυρη. - - - - File Exists - Η αρχείο υπάρχει - - - - File already exists. Do you want to replace it? - Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; - - - - Failed to save file: - Αποτυχία αποθήκευσης αρχείου: - - - - Failed to download file: - Αποτυχία λήψης αρχείου: - - - - Cheats Not Found - Δεν βρέθηκαν Cheats - - - - CheatsNotFound_MSG - Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. - - - - Cheats Downloaded Successfully - Cheats κατεβάστηκαν επιτυχώς - - - - CheatsDownloadedSuccessfully_MSG - Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. - - - - Failed to save: - Αποτυχία αποθήκευσης: - - - - Failed to download: - Αποτυχία λήψης: - - - - Download Complete - Η λήψη ολοκληρώθηκε - - - - DownloadComplete_MSG - Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι. - - - - Failed to parse JSON data from HTML. - Αποτυχία ανάλυσης δεδομένων JSON από HTML. - - - - Failed to retrieve HTML page. - Αποτυχία ανάκτησης σελίδας HTML. - - - - Failed to open file: - Αποτυχία ανοίγματος αρχείου: - - - - XML ERROR: - ΣΦΑΛΜΑ XML: - - - - Failed to open files.json for writing - Αποτυχία ανοίγματος του files.json για εγγραφή - - - - Author: - Συγγραφέας: - - - - Directory does not exist: - Ο φάκελος δεν υπάρχει: - - - - Failed to open files.json for reading. - Αποτυχία ανοίγματος του files.json για ανάγνωση. - - - - Name: - Όνομα: - + + + * Unsupported Vulkan Version + * Μη υποστηριζόμενη έκδοση Vulkan + + + + Download Cheats For All Installed Games + Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια + + + + Download Patches For All Games + Λήψη Patches για όλα τα παιχνίδια + + + + Download Complete + Η λήψη ολοκληρώθηκε + + + + You have downloaded cheats for all the games you have installed. + Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. + + + + Patches Downloaded Successfully! + Τα Patches κατέβηκαν επιτυχώς! + + + + All Patches available for all games have been downloaded. + Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. + + + + Games: + Παιχνίδια: + + + + PKG File (*.PKG) + Αρχείο PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Αρχεία ELF (*.bin *.elf *.oelf) + + + + Game Boot + Εκκίνηση παιχνιδιού + + + + Only one file can be selected! + Μπορεί να επιλεγεί μόνο ένα αρχείο! + + + + PKG Extraction + Εξαγωγή PKG + + + + Patch detected! + Αναγνώριση ενημέρωσης! + + + + PKG and Game versions match: + Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: + + + + Would you like to overwrite? + Θέλετε να αντικαταστήσετε; + + + + PKG Version %1 is older than installed version: + Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: + + + + Game is installed: + Το παιχνίδι είναι εγκατεστημένο: + + + + Would you like to install Patch: + Θέλετε να εγκαταστήσετε την ενημέρωση: + + + + DLC Installation + Εγκατάσταση DLC + + + + Would you like to install DLC: %1? + Θέλετε να εγκαταστήσετε το DLC: %1; + + + + DLC already installed: + DLC ήδη εγκατεστημένο: + + + + Game already installed + Παιχνίδι ήδη εγκατεστημένο + + + + PKG is a patch, please install the game first! + Το PKG είναι patch, παρακαλώ εγκαταστήστε πρώτα το παιχνίδι! + + + + PKG ERROR + ΣΦΑΛΜΑ PKG + + + + Extracting PKG %1/%2 + Εξαγωγή PKG %1/%2 + + + + Extraction Finished + Η εξαγωγή ολοκληρώθηκε + + + + Game successfully installed at %1 + Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 + + + + File doesn't appear to be a valid PKG file + Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG + + + + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Δεν διατίθεται εικόνα + + + + Serial: + Σειριακός αριθμός: + + + + Version: + Έκδοση: + + + + Size: + Μέγεθος: + + + + Select Cheat File: + Επιλέξτε αρχείο Cheat: + + + + Repository: + Αποθετήριο: + + + + Download Cheats + Λήψη Cheats + + + + Delete File + Διαγραφή αρχείου + + + + No files selected. + Δεν έχουν επιλεγεί αρχεία. + + + + You can delete the cheats you don't want after downloading them. + Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. + + + + Do you want to delete the selected file?\n%1 + Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 + + + + Select Patch File: + Επιλέξτε αρχείο Patch: + + + + Download Patches + Λήψη Patches + + + + Save + Αποθήκευση + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Σφάλμα + + + + No patch selected. + Δεν έχει επιλεγεί κανένα patch. + + + + Unable to open files.json for reading. + Αδυναμία ανοίγματος του files.json για ανάγνωση. + + + + No patch file found for the current serial. + Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. + + + + Unable to open the file for reading. + Αδυναμία ανοίγματος του αρχείου για ανάγνωση. + + + + Unable to open the file for writing. + Αδυναμία ανοίγματος του αρχείου για εγγραφή. + + + + Failed to parse XML: + Αποτυχία ανάλυσης XML: + + + + Success + Επιτυχία + + + + Options saved successfully. + Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. + + + + Invalid Source + Μη έγκυρη Πηγή + + + + The selected source is invalid. + Η επιλεγμένη πηγή είναι μη έγκυρη. + + + + File Exists + Η αρχείο υπάρχει + + + + File already exists. Do you want to replace it? + Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; + + + + Failed to save file: + Αποτυχία αποθήκευσης αρχείου: + + + + Failed to download file: + Αποτυχία λήψης αρχείου: + + + + Cheats Not Found + Δεν βρέθηκαν Cheats + + + + CheatsNotFound_MSG + Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. + + + + Cheats Downloaded Successfully + Cheats κατεβάστηκαν επιτυχώς + + + + CheatsDownloadedSuccessfully_MSG + Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. + + + + Failed to save: + Αποτυχία αποθήκευσης: + + + + Failed to download: + Αποτυχία λήψης: + + + + Download Complete + Η λήψη ολοκληρώθηκε + + + + DownloadComplete_MSG + Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι. + + + + Failed to parse JSON data from HTML. + Αποτυχία ανάλυσης δεδομένων JSON από HTML. + + + + Failed to retrieve HTML page. + Αποτυχία ανάκτησης σελίδας HTML. + + + + Failed to open file: + Αποτυχία ανοίγματος αρχείου: + + + + XML ERROR: + ΣΦΑΛΜΑ XML: + + + + Failed to open files.json for writing + Αποτυχία ανοίγματος του files.json για εγγραφή + + + + Author: + Συγγραφέας: + + + + Directory does not exist: + Ο φάκελος δεν υπάρχει: + + + + Failed to open files.json for reading. + Αποτυχία ανοίγματος του files.json για ανάγνωση. + + + + Name: + Όνομα: + Can't apply cheats before the game is started Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. - + SettingsDialog @@ -931,6 +973,111 @@ Close Κλείσιμο + + + Point your mouse at an option to display its description. + Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. + + + + consoleLanguageGroupBox + Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. + + + + emulatorLanguageGroupBox + Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. + + + + fullscreenCheckBox + Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. + + + + showSplashCheckBox + Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. + + + + ps4proCheckBox + Είναι PS4 Pro:\nΕπιτρέπει στον εξομοιωτή να λειτουργεί σαν PS4 PRO, κάτι που μπορεί να ενεργοποιήσει συγκεκριμένες λειτουργίες σε παιχνίδια που το υποστηρίζουν. + + + + userName + Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. + + + + logTypeGroupBox + Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. + + + + logFilter + Φίλτρο Καταγραφής: Φιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες. Παραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. + + + + updaterGroupBox + Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. + + + + GUIgroupBox + Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. + + + + graphicsAdapterGroupBox + Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. + + + + resolutionLayout + Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. + + + + heightDivider + Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! + + + + dumpShadersCheckBox + Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. + + + + nullGpuCheckBox + Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. + + + + dumpPM4CheckBox + Ενεργοποίηση Καταγραφής PM4:\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις ακατέργαστες εντολές της GPU σε φάκελο κατά την επεξεργασία. + + + + debugDump + Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. + + + + vkValidationCheckBox + Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. + + + + vkSyncValidationCheckBox + Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. + + + + rdocCheckBox + Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. + GameListFrame @@ -975,4 +1122,132 @@ Διαδρομή + + CheckUpdate + + + Auto Updater + Αυτόματος Ενημερωτής + + + + Error + Σφάλμα + + + + Network error: + Σφάλμα δικτύου: + + + + Failed to parse update information. + Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. + + + + No pre-releases found. + Δεν βρέθηκαν προ-κυκλοφορίες. + + + + Invalid release data. + Μη έγκυρα δεδομένα έκδοσης. + + + + No download URL found for the specified asset. + Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο. + + + + Your version is already up to date! + Η έκδοσή σας είναι ήδη ενημερωμένη! + + + + Update Available + Διαθέσιμη Ενημέρωση + + + + Update Channel + Κανάλι Ενημέρωσης + + + + Current Version + Τρέχουσα Έκδοση + + + + Latest Version + Τελευταία Έκδοση + + + + Do you want to update? + Θέλετε να ενημερώσετε; + + + + Show Changelog + Εμφάνιση Ιστορικού Αλλαγών + + + + Check for Updates at Startup + Έλεγχος για ενημερώσεις κατά την εκκίνηση + + + + Update + Ενημέρωση + + + + No + Όχι + + + + Hide Changelog + Απόκρυψη Ιστορικού Αλλαγών + + + + Changes + Αλλαγές + + + + Network error occurred while trying to access the URL + Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL + + + + Download Complete + Λήψη ολοκληρώθηκε + + + + The update has been downloaded, press OK to install. + Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε. + + + + Failed to save the update file at + Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο + + + + Starting Update... + Εκκίνηση Ενημέρωσης... + + + + Failed to create the update script file + Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης + + \ No newline at end of file diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 9696610bc..e45ac475a 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Cheats / Patches - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Download Cheats / Patches - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - MainWindow + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Cheats / Patches + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Check for Updates + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Download Cheats / Patches + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Help + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Update + + + + Check for Updates at Startup + Check for Updates at Startup + + + + Update Channel + Update Channel + + + + Check for Updates + Check for Updates + + + + GUI Settings + GUI Settings + + + + Play title music + Play title music + + + + Volume + Volume + + + + MainWindow Game List Game List - - - * Unsupported Vulkan Version - * Unsupported Vulkan Version - - - - Download Cheats For All Installed Games - Download Cheats For All Installed Games - - - - Download Patches For All Games - Download Patches For All Games - - - - Download Complete - Download Complete - - - - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. - - - - Patches Downloaded Successfully! - Patches Downloaded Successfully! - - - - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. - - - - Games: - Games: - - - - PKG File (*.PKG) - PKG File (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) - - - - Game Boot - Game Boot - - - - Only one file can be selected! - Only one file can be selected! - - - - PKG Extraction - PKG Extraction - - - - Patch detected! - Patch detected! - - - - PKG and Game versions match: - PKG and Game versions match: - - - - Would you like to overwrite? - Would you like to overwrite? - - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - - Game is installed: - Game is installed: - - - - Would you like to install Patch: - Would you like to install Patch: - - - - DLC Installation - DLC Installation - - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - - DLC already installed: - DLC already installed: - - - - Game already installed - Game already installed - - - - PKG is a patch, please install the game first! - PKG is a patch, please install the game first! - - - - PKG ERROR - PKG ERROR - - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - - Extraction Finished - Extraction Finished - - - - Game successfully installed at %1 - Game successfully installed at %1 - - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + + Download Patches For All Games + Download Patches For All Games + + + + Download Complete + Download Complete + + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + + Games: + Games: + + + + PKG File (*.PKG) + PKG File (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + + Game Boot + Game Boot + + + + Only one file can be selected! + Only one file can be selected! + + + + PKG Extraction + PKG Extraction + + + + Patch detected! + Patch detected! + + + + PKG and Game versions match: + PKG and Game versions match: + + + + Would you like to overwrite? + Would you like to overwrite? + + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + + Game is installed: + Game is installed: + + + + Would you like to install Patch: + Would you like to install Patch: + + + + DLC Installation + DLC Installation + + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + + DLC already installed: + DLC already installed: + + + + Game already installed + Game already installed + + + + PKG is a patch, please install the game first! + PKG is a patch, please install the game first! + + + + PKG ERROR + PKG ERROR + + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + + Extraction Finished + Extraction Finished + + + + Game successfully installed at %1 + Game successfully installed at %1 + + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - No Image Available - - - - Serial: - Serial: - - - - Version: - Version: - - - - Size: - Size: - - - - Select Cheat File: - Select Cheat File: - - - - Repository: - Repository: - - - - Download Cheats - Download Cheats - - - - Delete File - Delete File - - - - No files selected. - No files selected. - - - - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. - - - - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 - - - - Select Patch File: - Select Patch File: - - - - Download Patches - Download Patches - - - - Save - Save - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Error - - - - No patch selected. - No patch selected. - - - - Unable to open files.json for reading. - Unable to open files.json for reading. - - - - No patch file found for the current serial. - No patch file found for the current serial. - - - - Unable to open the file for reading. - Unable to open the file for reading. - - - - Unable to open the file for writing. - Unable to open the file for writing. - - - - Failed to parse XML: - Failed to parse XML: - - - - Success - Success - - - - Options saved successfully. - Options saved successfully. - - - - Invalid Source - Invalid Source - - - - The selected source is invalid. - The selected source is invalid. - - - - File Exists - File Exists - - - - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? - - - - Failed to save file: - Failed to save file: - - - - Failed to download file: - Failed to download file: - - - - Cheats Not Found - Cheats Not Found - - - - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - - - - Cheats Downloaded Successfully - Cheats Downloaded Successfully - - - - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - - - - Failed to save: - Failed to save: - - - - Failed to download: - Failed to download: - - - - Download Complete - Download Complete - - - - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. It may be necessary to update the game. - - - - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. - - - - Failed to retrieve HTML page. - Failed to retrieve HTML page. - - - - Failed to open file: - Failed to open file: - - - - XML ERROR: - XML ERROR: - - - - Failed to open files.json for writing - Failed to open files.json for writing - - - - Author: - Author: - - - - Directory does not exist: - Directory does not exist: - - - - Failed to open files.json for reading. - Failed to open files.json for reading. - - - - Name: - Name: - + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + No Image Available + + + + Serial: + Serial: + + + + Version: + Version: + + + + Size: + Size: + + + + Select Cheat File: + Select Cheat File: + + + + Repository: + Repository: + + + + Download Cheats + Download Cheats + + + + Delete File + Delete File + + + + No files selected. + No files selected. + + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + + Select Patch File: + Select Patch File: + + + + Download Patches + Download Patches + + + + Save + Save + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Error + + + + No patch selected. + No patch selected. + + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + + No patch file found for the current serial. + No patch file found for the current serial. + + + + Unable to open the file for reading. + Unable to open the file for reading. + + + + Unable to open the file for writing. + Unable to open the file for writing. + + + + Failed to parse XML: + Failed to parse XML: + + + + Success + Success + + + + Options saved successfully. + Options saved successfully. + + + + Invalid Source + Invalid Source + + + + The selected source is invalid. + The selected source is invalid. + + + + File Exists + File Exists + + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + + Failed to save file: + Failed to save file: + + + + Failed to download file: + Failed to download file: + + + + Cheats Not Found + Cheats Not Found + + + + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + + Failed to save: + Failed to save: + + + + Failed to download: + Failed to download: + + + + Download Complete + Download Complete + + + + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. It may be necessary to update the game. + + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + + Failed to open file: + Failed to open file: + + + + XML ERROR: + XML ERROR: + + + + Failed to open files.json for writing + Failed to open files.json for writing + + + + Author: + Author: + + + + Directory does not exist: + Directory does not exist: + + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + + Name: + Name: + Can't apply cheats before the game is started @@ -931,6 +973,111 @@ Close Close + + + Point your mouse at an option to display its description. + Point your mouse at an option to display its description. + + + + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + + emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. + + + + fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + + + + showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + + + + ps4proCheckBox + Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. + + + + userName + Username:\nSets the PS4's account username, which may be displayed by some games. + + + + logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + + + + logFilter + Log Filter: Filters the log to only print specific information. Examples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + + updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + + + GUIgroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + + + + graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + + + + resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + + + + heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + + + + dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + + + + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + + dumpPM4CheckBox + Enable PM4 Dumping:\nFor the sake of technical debugging, saves raw GPU instruction data to a folder as the emulator processes it. + + + + debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + + + + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. + + + + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. + + + + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + GameListFrame @@ -975,4 +1122,132 @@ Path + + CheckUpdate + + + Auto Updater + Auto Updater + + + + Error + Error + + + + Network error: + Network error: + + + + Failed to parse update information. + Failed to parse update information. + + + + No pre-releases found. + No pre-releases found. + + + + Invalid release data. + Invalid release data. + + + + No download URL found for the specified asset. + No download URL found for the specified asset. + + + + Your version is already up to date! + Your version is already up to date! + + + + Update Available + Update Available + + + + Update Channel + Update Channel + + + + Current Version + Current Version + + + + Latest Version + Latest Version + + + + Do you want to update? + Do you want to update? + + + + Show Changelog + Show Changelog + + + + Check for Updates at Startup + Check for Updates at Startup + + + + Update + Update + + + + No + No + + + + Hide Changelog + Hide Changelog + + + + Changes + Changes + + + + Network error occurred while trying to access the URL + Network error occurred while trying to access the URL + + + + Download Complete + Download Complete + + + + The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. + + + + Failed to save the update file at + Failed to save the update file at + + + + Starting Update... + Starting Update... + + + + Failed to create the update script file + Failed to create the update script file + + \ No newline at end of file diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index e1bc91809..4242bc91e 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - Acerca de shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 es un emulador experimental de código abierto para la PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - Este software no debe utilizarse para jugar juegos que no hayas obtenido legalmente. - - - - ElfViewer - - - Open Folder - Abrir carpeta - - - - GameInfoClass - - - Loading game list, please wait :3 - Cargando lista de juegos, por favor espera :3 - - - - Cancel - Cancelar - - - - Loading... - Cargando... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Elegir carpeta - - - - Directory to install games - Carpeta para instalar juegos - - - - Browse - Buscar - - - - Error - Error - - - - The value for location to install games is not valid. - El valor para la ubicación de instalación de los juegos no es válido. - - - - GuiContextMenus - - - Create Shortcut - Crear acceso directo - - - - Open Game Folder - Abrir carpeta del juego - - - - Cheats / Patches - Trucos / Parches - - - - SFO Viewer - Vista SFO - - - - Trophy Viewer - Ver trofeos - - - - Copy info - Copiar información - - - - Copy Name - Copiar nombre - - - - Copy Serial - Copiar serial - - - - Copy All - Copiar todo - - - - Shortcut creation - Acceso directo creado - - - - Shortcut created successfully!\n %1 - ¡Acceso directo creado con éxito!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - ¡Error al crear el acceso directo!\n %1 - - - - Install PKG - Instalar PKG - - - - MainWindow - - - Open/Add Elf Folder - Abrir/Agregar carpeta Elf - - - - Install Packages (PKG) - Instalar paquetes (PKG) - - - - Boot Game - Iniciar juego - - - - About shadPS4 - Acerca de shadPS4 - - - - Configure... - Configurar... - - - - Install application from a .pkg file - Instalar aplicación desde un archivo .pkg - - - - Recent Games - Juegos recientes - - - - Exit - Salir - - - - Exit shadPS4 - Salir de shadPS4 - - - - Exit the application. - Salir de la aplicación. - - - - Show Game List - Mostrar lista de juegos - - - - Game List Refresh - Actualizar lista de juegos - - - - Tiny - Muy pequeño - - - - Small - Pequeño - - - - Medium - Mediano - - - - Large - Grande - - - - List View - Vista de lista - - - - Grid View - Vista de cuadrícula - - - - Elf Viewer - Vista Elf - - - - Game Install Directory - Carpeta de instalación de los juegos - - - - Download Cheats/Patches - Descargar Trucos / Parches - - - - Dump Game List - Volcar lista de juegos - - - - PKG Viewer - Vista PKG - - - - Search... - Buscar... - - - - File - Archivo - - - - View - Vista - - - - Game List Icons - Iconos de los juegos - - - - Game List Mode - Tipo de lista - - - - Settings - Configuraciones - - - - Utils - Utilidades - - - - Themes - Temas - - - - About - Ayuda - - - - Dark - Oscuro - - - - Light - Claro - - - - Green - Verde - - - - Blue - Azul - - - - Violet - Violeta - - - - toolBar - barra de herramientas - - - - PKGViewer - - - Open Folder - Abrir carpeta - - - - TrophyViewer - - - Trophy Viewer - Vista de trofeos - - - - SettingsDialog - - - Settings - Configuraciones - - - - General - General - - - - System - Sistema - - - - Console Language - Idioma de la consola - - - - Emulator Language - Idioma del emulador - - - - Emulator - Emulador - - - - Enable Fullscreen - Habilitar pantalla completa - - - - Show Splash - Mostrar splash - - - - Is PS4 Pro - Modo PS4 Pro - - - - Username - Nombre de usuario - - - - Logger - Registro - - - - Log Type - Tipo de registro - - - - Log Filter - Filtro de registro - - - - Graphics - Gráficos - - - - Graphics Device - Dispositivo gráfico - - - - Width - Ancho - - - - Height - Alto - - - - Vblank Divider - Divisor de Vblank - - - - Advanced - Avanzado - - - - Enable Shaders Dumping - Habilitar volcado de shaders - - - - Enable NULL GPU - Habilitar GPU NULL - - - - Enable PM4 Dumping - Habilitar volcado de PM4 - - - - Debug - Depuración - - - - Enable Debug Dumping - Habilitar volcado de depuración - - - - Enable Vulkan Validation Layers - Habilitar capas de validación de Vulkan - - - - Enable Vulkan Synchronization Validation - Habilitar validación de sincronización de Vulkan - - - - Enable RenderDoc Debugging - Habilitar depuración de RenderDoc - - - MainWindow + AboutDialog + + + About shadPS4 + Acerca de shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 es un emulador experimental de código abierto para la PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + Este software no debe utilizarse para jugar juegos que hayas obtenido ilegalmente. + + + + ElfViewer + + + Open Folder + Abrir carpeta + + + + GameInfoClass + + + Loading game list, please wait :3 + Cargando lista de juegos, por favor espera :3 + + + + Cancel + Cancelar + + + + Loading... + Cargando... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Elegir carpeta + + + + Directory to install games + Carpeta para instalar juegos + + + + Browse + Buscar + + + + Error + Error + + + + The value for location to install games is not valid. + El valor para la ubicación de instalación de los juegos no es válido. + + + + GuiContextMenus + + + Create Shortcut + Crear acceso directo + + + + Open Game Folder + Abrir carpeta del juego + + + + Cheats / Patches + Trucos / Parches + + + + SFO Viewer + Vista SFO + + + + Trophy Viewer + Ver trofeos + + + + Copy info + Copiar información + + + + Copy Name + Copiar nombre + + + + Copy Serial + Copiar número de serie + + + + Copy All + Copiar todo + + + + Shortcut creation + Acceso directo creado + + + + Shortcut created successfully!\n %1 + ¡Acceso directo creado con éxito!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + ¡Error al crear el acceso directo!\n %1 + + + + Install PKG + Instalar PKG + + + + MainWindow + + + Open/Add Elf Folder + Abrir/Agregar carpeta Elf + + + + Install Packages (PKG) + Instalar paquetes (PKG) + + + + Boot Game + Iniciar juego + + + + Check for Updates + Buscar actualizaciones + + + + About shadPS4 + Acerca de shadPS4 + + + + Configure... + Configurar... + + + + Install application from a .pkg file + Instalar aplicación desde un archivo .pkg + + + + Recent Games + Juegos recientes + + + + Exit + Salir + + + + Exit shadPS4 + Salir de shadPS4 + + + + Exit the application. + Salir de la aplicación. + + + + Show Game List + Mostrar lista de juegos + + + + Game List Refresh + Actualizar lista de juegos + + + + Tiny + Muy pequeño + + + + Small + Pequeño + + + + Medium + Mediano + + + + Large + Grande + + + + List View + Vista de lista + + + + Grid View + Vista de cuadrícula + + + + Elf Viewer + Vista Elf + + + + Game Install Directory + Carpeta de instalación de los juegos + + + + Download Cheats/Patches + Descargar Trucos / Parches + + + + Dump Game List + Volcar lista de juegos + + + + PKG Viewer + Vista PKG + + + + Search... + Buscar... + + + + File + Archivo + + + + View + Vista + + + + Game List Icons + Iconos de los juegos + + + + Game List Mode + Tipo de lista + + + + Settings + Configuración + + + + Utils + Utilidades + + + + Themes + Temas + + + + Help + Ayuda + + + + Dark + Oscuro + + + + Light + Claro + + + + Green + Verde + + + + Blue + Azul + + + + Violet + Violeta + + + + toolBar + Barra de herramientas + + + + PKGViewer + + + Open Folder + Abrir carpeta + + + + TrophyViewer + + + Trophy Viewer + Vista de trofeos + + + + SettingsDialog + + + Settings + Configuración + + + + General + General + + + + System + Sistema + + + + Console Language + Idioma de la consola + + + + Emulator Language + Idioma del emulador + + + + Emulator + Emulador + + + + Enable Fullscreen + Habilitar pantalla completa + + + + Show Splash + Mostrar splash + + + + Is PS4 Pro + Modo PS4 Pro + + + + Username + Nombre de usuario + + + + Logger + Registro + + + + Log Type + Tipo de registro + + + + Log Filter + Filtro de registro + + + + Graphics + Gráficos + + + + Graphics Device + Dispositivo gráfico + + + + Width + Ancho + + + + Height + Alto + + + + Vblank Divider + Divisor de Vblank + + + + Advanced + Avanzado + + + + Enable Shaders Dumping + Habilitar volcado de shaders + + + + Enable NULL GPU + Habilitar GPU NULL + + + + Enable PM4 Dumping + Habilitar volcado de PM4 + + + + Debug + Depuración + + + + Enable Debug Dumping + Habilitar volcado de depuración + + + + Enable Vulkan Validation Layers + Habilitar capas de validación de Vulkan + + + + Enable Vulkan Synchronization Validation + Habilitar validación de sincronización de Vulkan + + + + Enable RenderDoc Debugging + Habilitar depuración de RenderDoc + + + + Update + Actualización + + + + Check for Updates at Startup + Buscar actualizaciones al iniciar + + + + Update Channel + Canal de Actualización + + + + Check for Updates + Verificar actualizaciones + + + + GUI Settings + Configuraciones de la Interfaz + + + + Play title music + Reproducir la música de apertura + + + + Volume + Volumen + + + + MainWindow Game List Lista de juegos - - - * Unsupported Vulkan Version - * Versión de Vulkan no soportada - - - - Download Cheats For All Installed Games - Descargar trucos para todos los juegos instalados - - - - Download Patches For All Games - Descargar parches para todos los juegos - - - - Download Complete - Descarga completa - - - - You have downloaded cheats for all the games you have installed. - Has descargado trucos para todos los juegos que tienes instalados. - - - - Patches Downloaded Successfully! - ¡Parches descargados exitosamente! - - - - All Patches available for all games have been downloaded. - Todos los parches disponibles para todos los juegos han sido descargados. - - - - Games: - Juegos: - - - - PKG File (*.PKG) - Archivo PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Archivos ELF (*.bin *.elf *.oelf) - - - - Game Boot - Inicio del juego - - - - Only one file can be selected! - ¡Solo se puede seleccionar un archivo! - - - - PKG Extraction - Extracción de PKG - - - - Patch detected! - ¡Actualización detectada! - - - - PKG and Game versions match: - Las versiones de PKG y del juego coinciden: - - - - Would you like to overwrite? - ¿Desea sobrescribir? - - - - PKG Version %1 is older than installed version: - La versión de PKG %1 es más antigua que la versión instalada: - - - - Game is installed: - El juego está instalado: - - - - Would you like to install Patch: - ¿Desea instalar la actualización: - - - - DLC Installation - Instalación de DLC - - - - Would you like to install DLC: %1? - ¿Desea instalar el DLC: %1? - - - - DLC already installed: - DLC ya instalado: - - - - Game already installed - Juego ya instalado - - - - PKG is a patch, please install the game first! - PKG es un parche, ¡por favor instala el juego primero! - - - - PKG ERROR - ERROR PKG - - - - Extracting PKG %1/%2 - Extrayendo PKG %1/%2 - - - - Extraction Finished - Extracción terminada - - - - Game successfully installed at %1 - Juego instalado exitosamente en %1 - - - - File doesn't appear to be a valid PKG file - El archivo no parece ser un archivo PKG válido - + + + * Unsupported Vulkan Version + * Versión de Vulkan no soportada + + + + Download Cheats For All Installed Games + Descargar trucos para todos los juegos instalados + + + + Download Patches For All Games + Descargar parches para todos los juegos + + + + Download Complete + Descarga completa + + + + You have downloaded cheats for all the games you have installed. + Has descargado trucos para todos los juegos que tienes instalados. + + + + Patches Downloaded Successfully! + ¡Parches descargados exitosamente! + + + + All Patches available for all games have been downloaded. + Todos los parches disponibles han sido descargados para todos los juegos. + + + + Games: + Juegos: + + + + PKG File (*.PKG) + Archivo PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Archivos ELF (*.bin *.elf *.oelf) + + + + Game Boot + Inicio del juego + + + + Only one file can be selected! + ¡Solo se puede seleccionar un archivo! + + + + PKG Extraction + Extracción de PKG + + + + Patch detected! + ¡Actualización detectada! + + + + PKG and Game versions match: + Las versiones de PKG y del juego coinciden: + + + + Would you like to overwrite? + ¿Desea sobrescribir? + + + + PKG Version %1 is older than installed version: + La versión de PKG %1 es más antigua que la versión instalada: + + + + Game is installed: + El juego está instalado: + + + + Would you like to install Patch: + ¿Desea instalar la actualización: + + + + DLC Installation + Instalación de DLC + + + + Would you like to install DLC: %1? + ¿Desea instalar el DLC: %1? + + + + DLC already installed: + DLC ya instalado: + + + + Game already installed + Juego ya instalado + + + + PKG is a patch, please install the game first! + PKG es un parche, ¡por favor instala el juego primero! + + + + PKG ERROR + ERROR PKG + + + + Extracting PKG %1/%2 + Extrayendo PKG %1/%2 + + + + Extraction Finished + Extracción terminada + + + + Game successfully installed at %1 + Juego instalado exitosamente en %1 + + + + File doesn't appear to be a valid PKG file + El archivo parece no ser un archivo PKG válido + - CheatsPatches - - - Cheats / Patches - Trucos / Parches - - - - defaultTextEdit_MSG - Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - No hay imagen disponible - - - - Serial: - Serie: - - - - Version: - Versión: - - - - Size: - Tamaño: - - - - Select Cheat File: - Seleccionar archivo de trucos: - - - - Repository: - Repositorio: - - - - Download Cheats - Descargar trucos - - - - Delete File - Eliminar archivo - - - - No files selected. - No se han seleccionado archivos. - - - - You can delete the cheats you don't want after downloading them. - Puedes eliminar los trucos que no quieras después de descargarlos. - - - - Do you want to delete the selected file?\n%1 - ¿Deseas eliminar el archivo seleccionado?\n%1 - - - - Select Patch File: - Seleccionar archivo de parche: - - - - Download Patches - Descargar parches - - - - Save - Guardar - - - - Cheats - Trucos - - - - Patches - Parche - - - - Error - Error - - - - No patch selected. - No se ha seleccionado ningún parche. - - - - Unable to open files.json for reading. - No se puede abrir files.json para lectura. - - - - No patch file found for the current serial. - No se encontró ningún archivo de parche para la serie actual. - - - - Unable to open the file for reading. - No se puede abrir el archivo para lectura. - - - - Unable to open the file for writing. - No se puede abrir el archivo para escritura. - - - - Failed to parse XML: - Error al analizar XML: - - - - Success - Éxito - - - - Options saved successfully. - Opciones guardadas exitosamente. - - - - Invalid Source - Fuente inválida - - - - The selected source is invalid. - La fuente seleccionada es inválida. - - - - File Exists - El archivo ya existe - - - - File already exists. Do you want to replace it? - El archivo ya existe. ¿Deseas reemplazarlo? - - - - Failed to save file: - Error al guardar el archivo: - - - - Failed to download file: - Error al descargar el archivo: - - - - Cheats Not Found - Trucos no encontrados - - - - CheatsNotFound_MSG - No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. - - - - Cheats Downloaded Successfully - Trucos descargados exitosamente - - - - CheatsDownloadedSuccessfully_MSG - Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. - - - - Failed to save: - Error al guardar: - - - - Failed to download: - Error al descargar: - - - - Download Complete - Descarga completa - - - - DownloadComplete_MSG - ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. Puede ser necesario actualizar el juego. - - - - Failed to parse JSON data from HTML. - Error al analizar los datos JSON del HTML. - - - - Failed to retrieve HTML page. - Error al recuperar la página HTML. - - - - Failed to open file: - Error al abrir el archivo: - - - - XML ERROR: - ERROR XML: - - - - Failed to open files.json for writing - Error al abrir files.json para escritura - - - - Author: - Autor: - - - - Directory does not exist: - El directorio no existe: - - - - Failed to open files.json for reading. - Error al abrir files.json para lectura. - - - - Name: - Nombre: - + CheatsPatches + + + Cheats / Patches + Trucos / Parches + + + + defaultTextEdit_MSG + Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + No hay imagen disponible + + + + Serial: + Número de serie: + + + + Version: + Versión: + + + + Size: + Tamaño: + + + + Select Cheat File: + Seleccionar archivo de trucos: + + + + Repository: + Repositorio: + + + + Download Cheats + Descargar trucos + + + + Delete File + Eliminar archivo + + + + No files selected. + No se han seleccionado archivos. + + + + You can delete the cheats you don't want after downloading them. + Puedes eliminar los trucos que no quieras una vez descargados. + + + + Do you want to delete the selected file?\n%1 + ¿Deseas eliminar el archivo seleccionado?\n%1 + + + + Select Patch File: + Seleccionar archivo de parche: + + + + Download Patches + Descargar parches + + + + Save + Guardar + + + + Cheats + Trucos + + + + Patches + Parches + + + + Error + Error + + + + No patch selected. + No se ha seleccionado ningún parche. + + + + Unable to open files.json for reading. + No se puede abrir files.json para lectura. + + + + No patch file found for the current serial. + No se encontró ningún archivo de parche para el número de serie actual. + + + + Unable to open the file for reading. + No se puede abrir el archivo para lectura. + + + + Unable to open the file for writing. + No se puede abrir el archivo para escritura. + + + + Failed to parse XML: + Error al analizar XML: + + + + Success + Éxito + + + + Options saved successfully. + Opciones guardadas exitosamente. + + + + Invalid Source + Fuente inválida + + + + The selected source is invalid. + La fuente seleccionada es inválida. + + + + File Exists + El archivo ya existe + + + + File already exists. Do you want to replace it? + El archivo ya existe. ¿Deseas reemplazarlo? + + + + Failed to save file: + Error al guardar el archivo: + + + + Failed to download file: + Error al descargar el archivo: + + + + Cheats Not Found + Trucos no encontrados + + + + CheatsNotFound_MSG + No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. + + + + Cheats Downloaded Successfully + Trucos descargados exitosamente + + + + CheatsDownloadedSuccessfully_MSG + Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. + + + + Failed to save: + Error al guardar: + + + + Failed to download: + Error al descargar: + + + + Download Complete + Descarga completa + + + + DownloadComplete_MSG + ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. Puede ser necesario actualizar el juego. + + + + Failed to parse JSON data from HTML. + Error al analizar los datos JSON del HTML. + + + + Failed to retrieve HTML page. + Error al recuperar la página HTML. + + + + Failed to open file: + Error al abrir el archivo: + + + + XML ERROR: + ERROR XML: + + + + Failed to open files.json for writing + Error al abrir files.json para escritura + + + + Author: + Autor: + + + + Directory does not exist: + El directorio no existe: + + + + Failed to open files.json for reading. + Error al abrir files.json para lectura. + + + + Name: + Nombre: + Can't apply cheats before the game is started @@ -931,13 +973,118 @@ Close Cerrar + + + Point your mouse at an option to display its description. + Coloque el mouse sobre una opción para mostrar su descripción. + + + + consoleLanguageGroupBox + Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. + + + + emulatorLanguageGroupBox + Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. + + + + fullscreenCheckBox + Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. + + + + showSplashCheckBox + Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. + + + + ps4proCheckBox + Es PS4 Pro:\nHace que el emulador actúe como una PS4 PRO, lo que puede habilitar funciones especiales en los juegos que lo admitan. + + + + userName + Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. + + + + logTypeGroupBox + Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. + + + + logFilter + Filtro de Registro: Filtra el registro para imprimir solo información específica. Ejemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. + + + + updaterGroupBox + Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. + + + + GUIgroupBox + Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. + + + + graphicsAdapterGroupBox + Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. + + + + resolutionLayout + Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. + + + + heightDivider + Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. + + + + dumpShadersCheckBox + Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. + + + + nullGpuCheckBox + Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. + + + + dumpPM4CheckBox + Habilitar la Volcadura de PM4:\nPor el bien de la depuración técnica, guarda los datos de instrucciones crudas de GPU en una carpeta a medida que el emulador los procesa. + + + + debugDump + Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. + + + + vkValidationCheckBox + Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. + + + + vkSyncValidationCheckBox + Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. + + + + rdocCheckBox + Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. + GameListFrame Icon - Ícono + Icono @@ -947,7 +1094,7 @@ Serial - Serie + Numero de serie @@ -975,4 +1122,132 @@ Ruta + + CheckUpdate + + + Auto Updater + Actualizador Automático + + + + Error + Error + + + + Network error: + Error de red: + + + + Failed to parse update information. + Error al analizar la información de actualización. + + + + No pre-releases found. + No se encontraron prelanzamientos. + + + + Invalid release data. + Datos de versión no válidos. + + + + No download URL found for the specified asset. + No se encontró URL de descarga para el activo especificado. + + + + Your version is already up to date! + ¡Su versión ya está actualizada! + + + + Update Available + Actualización disponible + + + + Update Channel + Canal de Actualización + + + + Current Version + Versión actual + + + + Latest Version + Última versión + + + + Do you want to update? + ¿Quieres actualizar? + + + + Show Changelog + Mostrar registro de cambios + + + + Check for Updates at Startup + Buscar actualizaciones al iniciar + + + + Update + Actualizar + + + + No + No + + + + Hide Changelog + Ocultar registro de cambios + + + + Changes + Cambios + + + + Network error occurred while trying to access the URL + Se produjo un error de red al intentar acceder a la URL + + + + Download Complete + Descarga completa + + + + The update has been downloaded, press OK to install. + La actualización se ha descargado, presione Aceptar para instalar. + + + + Failed to save the update file at + No se pudo guardar el archivo de actualización en + + + + Starting Update... + Iniciando actualización... + + + + Failed to create the update script file + No se pudo crear el archivo del script de actualización + + \ No newline at end of file diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 089653069..15e07c886 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1,5 +1,7 @@ - - AboutDialog @@ -168,6 +170,11 @@ Boot Game اجرای بازی + + + Check for Updates + به روز رسانی را بررسی کنید + About shadPS4 @@ -310,8 +317,8 @@ - About - درباره ما + Help + کمک @@ -497,15 +504,50 @@ Enable RenderDoc Debugging RenderDoc Debugging + + + Update + بروزرسانی + + + + Check for Updates at Startup + بررسی بروزرسانی هنگام شروع + + + + Update Channel + کانال بروزرسانی + + + + Check for Updates + به روز رسانی را بررسی کنید + + + + GUI Settings + تنظیمات رابط کاربری + + + + Play title music + پخش موسیقی عنوان + + + + Volume + صدا + - MainWindow + MainWindow Game List لیست بازی - + * Unsupported Vulkan Version شما پشتیبانی نمیشود Vulkan ورژن* @@ -931,6 +973,111 @@ Close بستن + + + Point your mouse at an option to display its description. + ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. + + + + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + + emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. + + + + fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + + + + showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + + + + ps4proCheckBox + Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. + + + + userName + Username:\nSets the PS4's account username, which may be displayed by some games. + + + + logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + + + + logFilter + Log Filter: Filters the log to only print specific information. Examples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + + updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + + + GUIgroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + + + + graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + + + + resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + + + + heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + + + + dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + + + + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + + dumpPM4CheckBox + Enable PM4 Dumping:\nFor the sake of technical debugging, saves raw GPU instruction data to a folder as the emulator processes it. + + + + debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + + + + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + + + + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + + + + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + GameListFrame @@ -975,4 +1122,132 @@ مسیر + + CheckUpdate + + + Auto Updater + به روز رسانی خودکار + + + + Error + خطا + + + + Network error: + خطای شبکه: + + + + Failed to parse update information. + خطا در تجزیه اطلاعات بهروزرسانی. + + + + No pre-releases found. + هیچ پیش انتشاری یافت نشد. + + + + Invalid release data. + داده های نسخه نامعتبر است. + + + + No download URL found for the specified asset. + هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد. + + + + Your version is already up to date! + نسخه شما اکنون به روز شده است! + + + + Update Available + به روز رسانی موجود است + + + + Update Channel + کانال بروزرسانی + + + + Current Version + نسخه فعلی + + + + Latest Version + جدیدترین نسخه + + + + Do you want to update? + آیا می خواهید به روز رسانی کنید؟ + + + + Show Changelog + نمایش تغییرات + + + + Check for Updates at Startup + بررسی بروزرسانی هنگام شروع + + + + Update + به روز رسانی + + + + No + خیر + + + + Hide Changelog + مخفی کردن تغییرات + + + + Changes + تغییرات + + + + Network error occurred while trying to access the URL + در حین تلاش برای دسترسی به URL خطای شبکه رخ داد + + + + Download Complete + دانلود کامل شد + + + + The update has been downloaded, press OK to install. + به روز رسانی دانلود شده است، برای نصب OK را فشار دهید. + + + + Failed to save the update file at + فایل به روز رسانی ذخیره نشد + + + + Starting Update... + شروع به روز رسانی... + + + + Failed to create the update script file + فایل اسکریپت به روز رسانی ایجاد نشد + + \ No newline at end of file diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 50e24fce6..a2b319280 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Huijaukset / Korjaukset - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Lataa Huijaukset / Korjaukset - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - - MainWindow + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Huijaukset / Korjaukset + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Tarkista päivitykset + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Lataa Huijaukset / Korjaukset + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Apua + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Päivitys + + + + Check for Updates at Startup + Tarkista päivitykset alussa + + + + Update Channel + Päivityskanava + + + + Check for Updates + Tarkista päivitykset + + + + GUI Settings + GUI-Asetukset + + + + Play title music + Soita otsikkomusiikkia + + + + Volume + Äänenvoimakkuus + + + + MainWindow Game List Pelilista - - - * Unsupported Vulkan Version - * Tuettu Vulkan-versio - - - - Download Cheats For All Installed Games - Lataa huijaukset kaikille asennetuille peleille - - - - Download Patches For All Games - Lataa korjaukset kaikille peleille - - - - Download Complete - Lataus valmis - - - - You have downloaded cheats for all the games you have installed. - Olet ladannut huijaukset kaikkiin asennettuihin peleihin. - - - - Patches Downloaded Successfully! - Korjaukset ladattu onnistuneesti! - - - - All Patches available for all games have been downloaded. - Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu. - - - - Games: - Pelit: - - - - PKG File (*.PKG) - PKG-tiedosto (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-tiedostot (*.bin *.elf *.oelf) - - - - Game Boot - Pelin käynnistys - - - - Only one file can be selected! - Vain yksi tiedosto voidaan valita! - - - - PKG Extraction - PKG:n purku - - - - Patch detected! - Päivitys havaittu! - - - - PKG and Game versions match: - PKG- ja peliversiot vastaavat: - - - - Would you like to overwrite? - Haluatko korvata? - - - - PKG Version %1 is older than installed version: - PKG-versio %1 on vanhempi kuin asennettu versio: - - - - Game is installed: - Peli on asennettu: - - - - Would you like to install Patch: - Haluatko asentaa päivityksen: - - - - DLC Installation - DLC-asennus - - - - Would you like to install DLC: %1? - Haluatko asentaa DLC:n: %1? - - - - DLC already installed: - DLC on jo asennettu: - - - - Game already installed - Peli on jo asennettu - - - - PKG is a patch, please install the game first! - PKG on korjaus, asenna peli ensin! - - - - PKG ERROR - PKG VIRHE - - - - Extracting PKG %1/%2 - Purkaminen PKG %1/%2 - - - - Extraction Finished - Purku valmis - - - - Game successfully installed at %1 - Peli asennettu onnistuneesti kohtaan %1 - - - - File doesn't appear to be a valid PKG file - Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto - - - - CheatsPatches - - - Cheats / Patches - Huijaukset / Korjaukset - - - - defaultTextEdit_MSG - Cheats/Patches ovat kokeellisia.\nKäytä varoen.\n\nLataa cheats yksitellen valitsemalla repositorio ja napsauttamalla latauspainiketta.\nPatches-välilehdellä voit ladata kaikki patchit kerralla, valita, mitä haluat käyttää, ja tallentaa valinnan.\n\nKoska emme kehitä Cheats/Patches,\nilmoita ongelmista cheatin tekijälle.\n\nLuo uusi cheat? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Kuvaa ei saatavilla - - - - Serial: - Sarjanumero: - - - - Version: - Versio: - - - - Size: - Koko: - - - - Select Cheat File: - Valitse huijaustiedosto: - - - - Repository: - Repo: - - - - Download Cheats - Lataa huijaukset - - - - Delete File - Poista tiedosto - - - - No files selected. - Ei tiedostoja valittu. - - - - You can delete the cheats you don't want after downloading them. - Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. - - - - Do you want to delete the selected file?\n%1 - Haluatko poistaa valitun tiedoston?\n%1 - - - - Select Patch File: - Valitse korjaustiedosto: - - - - Download Patches - Lataa korjaukset - - - - Save - Tallenna - - - - Cheats - Huijaukset - - - - Patches - Korjaukset - - - - Error - Virhe - - - - No patch selected. - Ei korjausta valittu. - - - - Unable to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. - - - - No patch file found for the current serial. - Nykyiselle sarjanumerolle ei löytynyt korjaustiedostoa. - - - - Unable to open the file for reading. - Tiedostoa ei voitu avata lukemista varten. - - - - Unable to open the file for writing. - Tiedostoa ei voitu avata kirjoittamista varten. - - - - Failed to parse XML: - XML:n jäsentäminen epäonnistui: - - - - Success - Onnistui - - - - Options saved successfully. - Vaihtoehdot tallennettu onnistuneesti. - - - - Invalid Source - Virheellinen lähde - - - - The selected source is invalid. - Valittu lähde on virheellinen. - - - - File Exists - Tiedosto on olemassa - - - - File already exists. Do you want to replace it? - Tiedosto on jo olemassa. Haluatko korvata sen? - - - - Failed to save file: - Tiedoston tallentaminen epäonnistui: - - - - Failed to download file: - Tiedoston lataaminen epäonnistui: - - - - Cheats Not Found - Huijauksia ei löytynyt - - - - CheatsNotFound_MSG - Huijauksia ei löytynyt tälle pelille tämän version valitusta repositoriosta, yritä toista repositoriota tai pelin eri versiota. - - - - Cheats Downloaded Successfully - Huijaukset ladattu onnistuneesti - - - - CheatsDownloadedSuccessfully_MSG - Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta, jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston luettelosta. - - - - Failed to save: - Tallentaminen epäonnistui: - - - - Failed to download: - Lataaminen epäonnistui: - - - - Download Complete - Lataus valmis - - - - DownloadComplete_MSG - Korjaukset ladattu onnistuneesti! Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille kuten huijauksissa. Jos päivitystä ei näy, se saattaa olla, että sitä ei ole saatavilla tietylle sarjanumerolle ja peliversiolle. Saattaa olla tarpeen päivittää peli. - - - - Failed to parse JSON data from HTML. - JSON-tietojen jäsentäminen HTML:stä epäonnistui. - - - - Failed to retrieve HTML page. - HTML-sivun hakeminen epäonnistui. - - - - Failed to open file: - Tiedoston avaaminen epäonnistui: - - - - XML ERROR: - XML VIRHE: - - - - Failed to open files.json for writing - Tiedostoa files.json ei voitu avata kirjoittamista varten - - - - Author: - Tekijä: - - - - Directory does not exist: - Kansiota ei ole olemassa: - - - - Failed to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. - - - - Name: - Nimi: - + + + * Unsupported Vulkan Version + * Tuettu Vulkan-versio + + + + Download Cheats For All Installed Games + Lataa huijaukset kaikille asennetuille peleille + + + + Download Patches For All Games + Lataa korjaukset kaikille peleille + + + + Download Complete + Lataus valmis + + + + You have downloaded cheats for all the games you have installed. + Olet ladannut huijaukset kaikkiin asennettuihin peleihin. + + + + Patches Downloaded Successfully! + Korjaukset ladattu onnistuneesti! + + + + All Patches available for all games have been downloaded. + Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu. + + + + Games: + Pelit: + + + + PKG File (*.PKG) + PKG-tiedosto (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF-tiedostot (*.bin *.elf *.oelf) + + + + Game Boot + Pelin käynnistys + + + + Only one file can be selected! + Vain yksi tiedosto voidaan valita! + + + + PKG Extraction + PKG:n purku + + + + Patch detected! + Päivitys havaittu! + + + + PKG and Game versions match: + PKG- ja peliversiot vastaavat: + + + + Would you like to overwrite? + Haluatko korvata? + + + + PKG Version %1 is older than installed version: + PKG-versio %1 on vanhempi kuin asennettu versio: + + + + Game is installed: + Peli on asennettu: + + + + Would you like to install Patch: + Haluatko asentaa päivityksen: + + + + DLC Installation + DLC-asennus + + + + Would you like to install DLC: %1? + Haluatko asentaa DLC:n: %1? + + + + DLC already installed: + DLC on jo asennettu: + + + + Game already installed + Peli on jo asennettu + + + + PKG is a patch, please install the game first! + PKG on korjaus, asenna peli ensin! + + + + PKG ERROR + PKG VIRHE + + + + Extracting PKG %1/%2 + Purkaminen PKG %1/%2 + + + + Extraction Finished + Purku valmis + + + + Game successfully installed at %1 + Peli asennettu onnistuneesti kohtaan %1 + + + + File doesn't appear to be a valid PKG file + Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto + + + + CheatsPatches + + + Cheats / Patches + Huijaukset / Korjaukset + + + + defaultTextEdit_MSG + Cheats/Patches ovat kokeellisia.\nKäytä varoen.\n\nLataa cheats yksitellen valitsemalla repositorio ja napsauttamalla latauspainiketta.\nPatches-välilehdellä voit ladata kaikki patchit kerralla, valita, mitä haluat käyttää, ja tallentaa valinnan.\n\nKoska emme kehitä Cheats/Patches,\nilmoita ongelmista cheatin tekijälle.\n\nLuo uusi cheat? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Kuvaa ei saatavilla + + + + Serial: + Sarjanumero: + + + + Version: + Versio: + + + + Size: + Koko: + + + + Select Cheat File: + Valitse huijaustiedosto: + + + + Repository: + Repo: + + + + Download Cheats + Lataa huijaukset + + + + Delete File + Poista tiedosto + + + + No files selected. + Ei tiedostoja valittu. + + + + You can delete the cheats you don't want after downloading them. + Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. + + + + Do you want to delete the selected file?\n%1 + Haluatko poistaa valitun tiedoston?\n%1 + + + + Select Patch File: + Valitse korjaustiedosto: + + + + Download Patches + Lataa korjaukset + + + + Save + Tallenna + + + + Cheats + Huijaukset + + + + Patches + Korjaukset + + + + Error + Virhe + + + + No patch selected. + Ei korjausta valittu. + + + + Unable to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. + + + + No patch file found for the current serial. + Nykyiselle sarjanumerolle ei löytynyt korjaustiedostoa. + + + + Unable to open the file for reading. + Tiedostoa ei voitu avata lukemista varten. + + + + Unable to open the file for writing. + Tiedostoa ei voitu avata kirjoittamista varten. + + + + Failed to parse XML: + XML:n jäsentäminen epäonnistui: + + + + Success + Onnistui + + + + Options saved successfully. + Vaihtoehdot tallennettu onnistuneesti. + + + + Invalid Source + Virheellinen lähde + + + + The selected source is invalid. + Valittu lähde on virheellinen. + + + + File Exists + Tiedosto on olemassa + + + + File already exists. Do you want to replace it? + Tiedosto on jo olemassa. Haluatko korvata sen? + + + + Failed to save file: + Tiedoston tallentaminen epäonnistui: + + + + Failed to download file: + Tiedoston lataaminen epäonnistui: + + + + Cheats Not Found + Huijauksia ei löytynyt + + + + CheatsNotFound_MSG + Huijauksia ei löytynyt tälle pelille tämän version valitusta repositoriosta, yritä toista repositoriota tai pelin eri versiota. + + + + Cheats Downloaded Successfully + Huijaukset ladattu onnistuneesti + + + + CheatsDownloadedSuccessfully_MSG + Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta, jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston luettelosta. + + + + Failed to save: + Tallentaminen epäonnistui: + + + + Failed to download: + Lataaminen epäonnistui: + + + + Download Complete + Lataus valmis + + + + DownloadComplete_MSG + Korjaukset ladattu onnistuneesti! Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille kuten huijauksissa. Jos päivitystä ei näy, se saattaa olla, että sitä ei ole saatavilla tietylle sarjanumerolle ja peliversiolle. Saattaa olla tarpeen päivittää peli. + + + + Failed to parse JSON data from HTML. + JSON-tietojen jäsentäminen HTML:stä epäonnistui. + + + + Failed to retrieve HTML page. + HTML-sivun hakeminen epäonnistui. + + + + Failed to open file: + Tiedoston avaaminen epäonnistui: + + + + XML ERROR: + XML VIRHE: + + + + Failed to open files.json for writing + Tiedostoa files.json ei voitu avata kirjoittamista varten + + + + Author: + Tekijä: + + + + Directory does not exist: + Kansiota ei ole olemassa: + + + + Failed to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. + + + + Name: + Nimi: + Can't apply cheats before the game is started Ei voi käyttää huijauksia ennen kuin peli on aloitettu. - + SettingsDialog @@ -931,6 +973,111 @@ Close Sulje + + + Point your mouse at an option to display its description. + Siirrä hiiri vaihtoehdon päälle näyttämään sen kuvaus. + + + + consoleLanguageGroupBox + Konsoli Kieli:\nAseta PS4 pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. + + + + emulatorLanguageGroupBox + Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. + + + + fullscreenCheckBox + Ota Täysikokoisuus käyttöön:\nSiirtää pelin ikkunan automaattisesti täysikokoiseen tilaan.\nTätä voidaan vaihtaa painamalla F11-näppäintä. + + + + showSplashCheckBox + Näytä Alkunäyttö:\nNäyttää pelin alkunäytön (erityinen kuva) pelin käynnistyessä. + + + + ps4proCheckBox + Onko PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä. + + + + userName + Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissakin peleissä. + + + + logTypeGroupBox + Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. + + + + logFilter + Lokifiltteri: Suodattaa lokia tulostamaan vain erityistä tietoa. Esimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tasot: Jälki, Virheenkorjaus, Tieto, Varoitus, Virhe, Kriittinen - tällä järjestyksellä, tietty taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. + + + + updaterGroupBox + Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan joka kuukausi ja voivat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne voivat sisältää bugeja ja ovat vähemmän vakaita. + + + + GUIgroupBox + Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. + + + + graphicsAdapterGroupBox + Kuvakortti:\nValitse GPU, jota emulaattori käyttää monigpu-järjestelmissä pudotusvalikosta,\n tai valitse "Auto Select" automaattiseen määrittämiseen. + + + + resolutionLayout + Leveys/Korkeus:\nAsettaa emulaattorin ikkunan koon käynnistyksen aikana, jota voidaan muuttaa pelin aikana.\nTämä on eri kuin pelin sisäinen resoluutio. + + + + heightDivider + Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten pelin nopeuden lisääminen tai kriittisten pelitoimintojen rikkoutuminen, jotka eivät odota tämän muuttuvan! + + + + dumpShadersCheckBox + Ota Shadersin dumpaus käyttöön:\nTeknistä vianetsintää varten pelin shadereita tallennetaan kansioon niiden renderöinnin aikana. + + + + nullGpuCheckBox + Ota Null GPU käyttöön:\nTeknistä vianetsintää varten pelin renderöinti estetään niin, että ikään kuin grafiikkakorttia ei olisi. + + + + dumpPM4CheckBox + Ota PM4 dumpaus käyttöön:\nTeknistä vianetsintää varten raakoja GPU-ohjeita tallennetaan kansioon emulaattorin käsitellessä sitä. + + + + debugDump + Ota Debug Dumpaus käyttöön:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. + + + + vkValidationCheckBox + Ota Vulkanin Validointikerrokset käyttöön:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + + + + vkSyncValidationCheckBox + Ota Vulkanin Synkronointivalaistus käyttöön:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + + + + rdocCheckBox + Ota RenderDoc Debugging käyttöön:\nJos se on käytössä, emulaattori tarjoaa yhteensopivuuden Renderdocin kanssa, mikä mahdollistaa nykyisen renderöidyn kehyksen tallennuksen ja analysoinnin. + GameListFrame @@ -975,4 +1122,132 @@ Polku + + CheckUpdate + + + Auto Updater + Automaattinen päivitys + + + + Error + Virhe + + + + Network error: + Verkkovirhe: + + + + Failed to parse update information. + Päivitysinformaation jäsentäminen epäonnistui. + + + + No pre-releases found. + Ennakkojulkaisuja ei löytynyt. + + + + Invalid release data. + Virheelliset julkaisutiedot. + + + + No download URL found for the specified asset. + Ei lataus-URL:ia löytynyt määritetylle omaisuudelle. + + + + Your version is already up to date! + Versiosi on jo ajan tasalla! + + + + Update Available + Päivitys saatavilla + + + + Update Channel + Päivityskanava + + + + Current Version + Nykyinen versio + + + + Latest Version + Uusin versio + + + + Do you want to update? + Haluatko päivittää? + + + + Show Changelog + Näytä muutospäiväkirja + + + + Check for Updates at Startup + Tarkista päivitykset alussa + + + + Update + Päivitä + + + + No + Ei + + + + Hide Changelog + Piilota muutospäiväkirja + + + + Changes + Muutos + + + + Network error occurred while trying to access the URL + Verkkovirhe tapahtui yrittäessäsi päästä URL-osoitteeseen + + + + Download Complete + Download valmis + + + + The update has been downloaded, press OK to install. + Päivitys on ladattu, paina OK asentaaksesi. + + + + Failed to save the update file at + Päivitystiedoston tallentaminen epäonnistui osoitteeseen + + + + Starting Update... + Aloitetaan päivitys... + + + + Failed to create the update script file + Päivitysskripttitiedoston luominen epäonnistui + + \ No newline at end of file diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 5ba5e7e2e..05c70f195 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - À propos de shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 est un émulateur open-source expérimental de la PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. - - - - ElfViewer - - - Open Folder - Ouvrir un dossier - - - - GameInfoClass - - - Loading game list, please wait :3 - Chargement de la liste de jeu, veuillez patienter... - - - - Cancel - Annuler - - - - Loading... - Chargement... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire - - - - Directory to install games - Répertoire d'installation des jeux - - - - Browse - Parcourir - - - - Error - Erreur - - - - The value for location to install games is not valid. - Le répertoire d'installation des jeux n'est pas valide. - - - - GuiContextMenus - - - Create Shortcut - Créer un raccourci - - - - Open Game Folder - Ouvrir le dossier du jeu - - - - Cheats / Patches - Cheats/Patchs - - - - SFO Viewer - Visionneuse SFO - - - - Trophy Viewer - Visionneuse de trophées - - - - Copy info - Copier infos - - - - Copy Name - Copier le nom - - - - Copy Serial - Copier le N° de série - - - - Copy All - Copier tout - - - - Shortcut creation - Création du raccourci - - - - Shortcut created successfully!\n %1 - Raccourci créé avec succès !\n %1 - - - - Error - Erreur - - - - Error creating shortcut!\n %1 - Erreur lors de la création du raccourci !\n %1 - - - - Install PKG - Installer un PKG - - - - MainWindow - - - Open/Add Elf Folder - Ouvrir/Ajouter un dossier ELF - - - - Install Packages (PKG) - Installer des packages (PKG) - - - - Boot Game - Démarrer un jeu - - - - About shadPS4 - À propos de shadPS4 - - - - Configure... - Configurer... - - - - Install application from a .pkg file - Installer une application depuis un fichier .pkg - - - - Recent Games - Jeux récents - - - - Exit - Fermer - - - - Exit shadPS4 - Fermer shadPS4 - - - - Exit the application. - Fermer l'application. - - - - Show Game List - Afficher la liste de jeux - - - - Game List Refresh - Rafraîchir la liste de jeux - - - - Tiny - Très Petit - - - - Small - Petit - - - - Medium - Moyen - - - - Large - Grand - - - - List View - Mode liste - - - - Grid View - Mode grille - - - - Elf Viewer - Visionneuse ELF - - - - Game Install Directory - Répertoire des jeux - - - - Download Cheats/Patches - Télécharger Cheats/Patchs - - - - Dump Game List - Dumper la liste des jeux - - - - PKG Viewer - Visionneuse PKG - - - - Search... - Chercher... - - - - File - Fichier - - - - View - Affichage - - - - Game List Icons - Icônes des jeux - - - - Game List Mode - Mode d'affichage - - - - Settings - Paramètres - - - - Utils - Utilitaires - - - - Themes - Thèmes - - - - About - À propos - - - - Dark - Sombre - - - - Light - Clair - - - - Green - Vert - - - - Blue - Bleu - - - - Violet - Violet - - - - toolBar - Bare d'outils - - - - PKGViewer - - - Open Folder - Ouvrir un dossier - - - - TrophyViewer - - - Trophy Viewer - Visionneuse de trophées - - - - SettingsDialog - - - Settings - Paramètres - - - - General - Général - - - - System - Système - - - - Console Language - Langage de la console - - - - Emulator Language - Langage de l'émulateur - - - - Emulator - Émulateur - - - - Enable Fullscreen - Plein écran - - - - Show Splash - Afficher l'image du jeu - - - - Is PS4 Pro - Mode PS4 Pro - - - - Username - Nom d'utilisateur - - - - Logger - Journalisation - - - - Log Type - Type - - - - Log Filter - Filtre - - - - Graphics - Graphismes - - - - Graphics Device - Carte graphique - - - - Width - Largeur - - - - Height - Hauteur - - - - Vblank Divider - Vblank - - - - Advanced - Avancé - - - - Enable Shaders Dumping - Dumper les shaders - - - - Enable NULL GPU - NULL GPU - - - - Enable PM4 Dumping - Dumper le PM4 - - - - Debug - Débogage - - - - Enable Debug Dumping - Activer le débogage - - - - Enable Vulkan Validation Layers - Activer la couche de validation Vulkan - - - - Enable Vulkan Synchronization Validation - Activer la synchronisation de la validation Vulkan - - - - Enable RenderDoc Debugging - Activer le débogage RenderDoc - + + AboutDialog + + + About shadPS4 + À propos de shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 est un émulateur open-source expérimental de la PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. + - - MainWindow + + ElfViewer + + + Open Folder + Ouvrir un dossier + + + + GameInfoClass + + + Loading game list, please wait :3 + Chargement de la liste de jeu, veuillez patienter... + + + + Cancel + Annuler + + + + Loading... + Chargement... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choisir un répertoire + + + + Directory to install games + Répertoire d'installation des jeux + + + + Browse + Parcourir + + + + Error + Erreur + + + + The value for location to install games is not valid. + Le répertoire d'installation des jeux n'est pas valide. + + + + GuiContextMenus + + + Create Shortcut + Créer un raccourci + + + + Open Game Folder + Ouvrir le dossier du jeu + + + + Cheats / Patches + Cheats/Patchs + + + + SFO Viewer + Visionneuse SFO + + + + Trophy Viewer + Visionneuse de trophées + + + + Copy info + Copier infos + + + + Copy Name + Copier le nom + + + + Copy Serial + Copier le N° de série + + + + Copy All + Copier tout + + + + Shortcut creation + Création du raccourci + + + + Shortcut created successfully!\n %1 + Raccourci créé avec succès !\n %1 + + + + Error + Erreur + + + + Error creating shortcut!\n %1 + Erreur lors de la création du raccourci !\n %1 + + + + Install PKG + Installer un PKG + + + + MainWindow + + + Open/Add Elf Folder + Ouvrir/Ajouter un dossier ELF + + + + Install Packages (PKG) + Installer des packages (PKG) + + + + Boot Game + Démarrer un jeu + + + + Check for Updates + Vérifier les mises à jour + + + + About shadPS4 + À propos de shadPS4 + + + + Configure... + Configurer... + + + + Install application from a .pkg file + Installer une application depuis un fichier .pkg + + + + Recent Games + Jeux récents + + + + Exit + Fermer + + + + Exit shadPS4 + Fermer shadPS4 + + + + Exit the application. + Fermer l'application. + + + + Show Game List + Afficher la liste de jeux + + + + Game List Refresh + Rafraîchir la liste de jeux + + + + Tiny + Très Petit + + + + Small + Petit + + + + Medium + Moyen + + + + Large + Grand + + + + List View + Mode liste + + + + Grid View + Mode grille + + + + Elf Viewer + Visionneuse ELF + + + + Game Install Directory + Répertoire des jeux + + + + Download Cheats/Patches + Télécharger Cheats/Patchs + + + + Dump Game List + Dumper la liste des jeux + + + + PKG Viewer + Visionneuse PKG + + + + Search... + Chercher... + + + + File + Fichier + + + + View + Affichage + + + + Game List Icons + Icônes des jeux + + + + Game List Mode + Mode d'affichage + + + + Settings + Paramètres + + + + Utils + Utilitaires + + + + Themes + Thèmes + + + + Help + Aide + + + + Dark + Sombre + + + + Light + Clair + + + + Green + Vert + + + + Blue + Bleu + + + + Violet + Violet + + + + toolBar + Bare d'outils + + + + PKGViewer + + + Open Folder + Ouvrir un dossier + + + + TrophyViewer + + + Trophy Viewer + Visionneuse de trophées + + + + SettingsDialog + + + Settings + Paramètres + + + + General + Général + + + + System + Système + + + + Console Language + Langage de la console + + + + Emulator Language + Langage de l'émulateur + + + + Emulator + Émulateur + + + + Enable Fullscreen + Plein écran + + + + Show Splash + Afficher l'image du jeu + + + + Is PS4 Pro + Mode PS4 Pro + + + + Username + Nom d'utilisateur + + + + Logger + Journalisation + + + + Log Type + Type + + + + Log Filter + Filtre + + + + Graphics + Graphismes + + + + Graphics Device + Carte graphique + + + + Width + Largeur + + + + Height + Hauteur + + + + Vblank Divider + Vblank + + + + Advanced + Avancé + + + + Enable Shaders Dumping + Dumper les shaders + + + + Enable NULL GPU + NULL GPU + + + + Enable PM4 Dumping + Dumper le PM4 + + + + Debug + Débogage + + + + Enable Debug Dumping + Activer le débogage + + + + Enable Vulkan Validation Layers + Activer la couche de validation Vulkan + + + + Enable Vulkan Synchronization Validation + Activer la synchronisation de la validation Vulkan + + + + Enable RenderDoc Debugging + Activer le débogage RenderDoc + + + + Update + Mise à jour + + + + Check for Updates at Startup + Vérif. maj au démarrage + + + + Update Channel + Canal de Mise à Jour + + + + Check for Updates + Vérifier les mises à jour + + + + GUI Settings + Paramètres de l'interface + + + + Play title music + Lire la musique du titre + + + + Volume + Volume + + + + MainWindow Game List Liste de jeux - - - * Unsupported Vulkan Version - * Version de Vulkan non prise en charge - - - - Download Cheats For All Installed Games - Télécharger les Cheats pour tous les jeux installés - - - - Download Patches For All Games - Télécharger les patchs pour tous les jeux - - - - Download Complete - Téléchargement terminé - - - - You have downloaded cheats for all the games you have installed. - Vous avez téléchargé des Cheats pour tous les jeux installés. - - - - Patches Downloaded Successfully! - Patchs téléchargés avec succès ! - - - - All Patches available for all games have been downloaded. - Tous les patchs disponibles ont été téléchargés. - - - - Games: - Jeux : - - - - PKG File (*.PKG) - Fichiers PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Fichiers ELF (*.bin *.elf *.oelf) - - - - Game Boot - Démarrer un jeu - - - - Only one file can be selected! - Un seul fichier peut être sélectionné ! - - - - PKG Extraction - Extraction du PKG - - - - Patch detected! - Patch détecté ! - - - - PKG and Game versions match: - Les versions PKG et jeu correspondent : - - - - Would you like to overwrite? - Souhaitez-vous remplacer ? - - - - PKG Version %1 is older than installed version: - La version PKG %1 est plus ancienne que la version installée : - - - - Game is installed: - Jeu installé : - - - - Would you like to install Patch: - Souhaitez-vous installer le patch : - - - - DLC Installation - Installation du DLC - - - - Would you like to install DLC: %1? - Souhaitez-vous installer le DLC : %1 ? - - - - DLC already installed: - DLC déjà installé : - - - - Game already installed - Jeu déjà installé - - - - PKG is a patch, please install the game first! - Le PKG est un patch, veuillez d'abord installer le jeu ! - - - - PKG ERROR - Erreur PKG - - - - Extracting PKG %1/%2 - Extraction PKG %1/%2 - - - - Extraction Finished - Extraction terminée - - - - Game successfully installed at %1 - Jeu installé avec succès à %1 - - - - File doesn't appear to be a valid PKG file - Le fichier ne semble pas être un PKG valide - - - - CheatsPatches - - - Cheats / Patches - Cheats/Patches - - - - defaultTextEdit_MSG - Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez :\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Aucune image disponible - - - - Serial: - Série : - - - - Version: - Version : - - - - Size: - Taille : - - - - Select Cheat File: - Sélectionner le fichier de Cheat : - - - - Repository: - Dépôt : - - - - Download Cheats - Télécharger les Cheats - - - - Delete File - Supprimer le fichier - - - - No files selected. - Aucun fichier sélectionné. - - - - You can delete the cheats you don't want after downloading them. - Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. - - - - Do you want to delete the selected file?\n%1 - Voulez-vous supprimer le fichier sélectionné ?\n%1 - - - - Select Patch File: - Sélectionner le fichier de patch : - - - - Download Patches - Télécharger les patchs - - - - Save - Enregistrer - - - - Cheats - Cheats - - - - Patches - Patchs - - - - Error - Erreur - - - - No patch selected. - Aucun patch sélectionné. - - - - Unable to open files.json for reading. - Impossible d'ouvrir files.json pour la lecture. - - - - No patch file found for the current serial. - Aucun fichier de patch trouvé pour la série actuelle. - - - - Unable to open the file for reading. - Impossible d'ouvrir le fichier pour la lecture. - - - - Unable to open the file for writing. - Impossible d'ouvrir le fichier pour l'écriture. - - - - Failed to parse XML: - Échec de l'analyse XML : - - - - Success - Succès - - - - Options saved successfully. - Options enregistrées avec succès. - - - - Invalid Source - Source invalide - - - - The selected source is invalid. - La source sélectionnée est invalide. - - - - File Exists - Le fichier existe - - - - File already exists. Do you want to replace it? - Le fichier existe déjà. Voulez-vous le remplacer ? - - - - Failed to save file: - Échec de l'enregistrement du fichier : - - - - Failed to download file: - Échec du téléchargement du fichier : - - - - Cheats Not Found - Cheats non trouvés - - - - CheatsNotFound_MSG - Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. - - - - Cheats Downloaded Successfully - Cheats téléchargés avec succès - - - - CheatsDownloadedSuccessfully_MSG - Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. - - - - Failed to save: - Échec de l'enregistrement : - - - - Failed to download: - Échec du téléchargement : - - - - Download Complete - Téléchargement terminé - - - - DownloadComplete_MSG - Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour le numéro de série et la version spécifiques du jeu. Il peut être nécessaire de mettre à jour le jeu. - - - - Failed to parse JSON data from HTML. - Échec de l'analyse des données JSON à partir du HTML. - - - - Failed to retrieve HTML page. - Échec de la récupération de la page HTML. - - - - Failed to open file: - Échec de l'ouverture du fichier : - - - - XML ERROR: - Erreur XML : - - - - Failed to open files.json for writing - Échec de l'ouverture de files.json pour l'écriture - - - - Author: - Auteur : - - - - Directory does not exist: - Répertoire n'existe pas : - - - - Failed to open files.json for reading. - Échec de l'ouverture de files.json pour la lecture. - - - - Name: - Nom : - + + + * Unsupported Vulkan Version + * Version de Vulkan non prise en charge + + + + Download Cheats For All Installed Games + Télécharger les Cheats pour tous les jeux installés + + + + Download Patches For All Games + Télécharger les patchs pour tous les jeux + + + + Download Complete + Téléchargement terminé + + + + You have downloaded cheats for all the games you have installed. + Vous avez téléchargé des Cheats pour tous les jeux installés. + + + + Patches Downloaded Successfully! + Patchs téléchargés avec succès ! + + + + All Patches available for all games have been downloaded. + Tous les patchs disponibles ont été téléchargés. + + + + Games: + Jeux : + + + + PKG File (*.PKG) + Fichiers PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Fichiers ELF (*.bin *.elf *.oelf) + + + + Game Boot + Démarrer un jeu + + + + Only one file can be selected! + Un seul fichier peut être sélectionné ! + + + + PKG Extraction + Extraction du PKG + + + + Patch detected! + Patch détecté ! + + + + PKG and Game versions match: + Les versions PKG et jeu correspondent : + + + + Would you like to overwrite? + Souhaitez-vous remplacer ? + + + + PKG Version %1 is older than installed version: + La version PKG %1 est plus ancienne que la version installée : + + + + Game is installed: + Jeu installé : + + + + Would you like to install Patch: + Souhaitez-vous installer le patch : + + + + DLC Installation + Installation du DLC + + + + Would you like to install DLC: %1? + Souhaitez-vous installer le DLC : %1 ? + + + + DLC already installed: + DLC déjà installé : + + + + Game already installed + Jeu déjà installé + + + + PKG is a patch, please install the game first! + Le PKG est un patch, veuillez d'abord installer le jeu ! + + + + PKG ERROR + Erreur PKG + + + + Extracting PKG %1/%2 + Extraction PKG %1/%2 + + + + Extraction Finished + Extraction terminée + + + + Game successfully installed at %1 + Jeu installé avec succès à %1 + + + + File doesn't appear to be a valid PKG file + Le fichier ne semble pas être un PKG valide + + + + CheatsPatches + + + Cheats / Patches + Cheats/Patches + + + + defaultTextEdit_MSG + Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez :\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Aucune image disponible + + + + Serial: + Série : + + + + Version: + Version : + + + + Size: + Taille : + + + + Select Cheat File: + Sélectionner le fichier de Cheat : + + + + Repository: + Dépôt : + + + + Download Cheats + Télécharger les Cheats + + + + Delete File + Supprimer le fichier + + + + No files selected. + Aucun fichier sélectionné. + + + + You can delete the cheats you don't want after downloading them. + Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. + + + + Do you want to delete the selected file?\n%1 + Voulez-vous supprimer le fichier sélectionné ?\n%1 + + + + Select Patch File: + Sélectionner le fichier de patch : + + + + Download Patches + Télécharger les patchs + + + + Save + Enregistrer + + + + Cheats + Cheats + + + + Patches + Patchs + + + + Error + Erreur + + + + No patch selected. + Aucun patch sélectionné. + + + + Unable to open files.json for reading. + Impossible d'ouvrir files.json pour la lecture. + + + + No patch file found for the current serial. + Aucun fichier de patch trouvé pour la série actuelle. + + + + Unable to open the file for reading. + Impossible d'ouvrir le fichier pour la lecture. + + + + Unable to open the file for writing. + Impossible d'ouvrir le fichier pour l'écriture. + + + + Failed to parse XML: + Échec de l'analyse XML : + + + + Success + Succès + + + + Options saved successfully. + Options enregistrées avec succès. + + + + Invalid Source + Source invalide + + + + The selected source is invalid. + La source sélectionnée est invalide. + + + + File Exists + Le fichier existe + + + + File already exists. Do you want to replace it? + Le fichier existe déjà. Voulez-vous le remplacer ? + + + + Failed to save file: + Échec de l'enregistrement du fichier : + + + + Failed to download file: + Échec du téléchargement du fichier : + + + + Cheats Not Found + Cheats non trouvés + + + + CheatsNotFound_MSG + Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. + + + + Cheats Downloaded Successfully + Cheats téléchargés avec succès + + + + CheatsDownloadedSuccessfully_MSG + Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. + + + + Failed to save: + Échec de l'enregistrement : + + + + Failed to download: + Échec du téléchargement : + + + + Download Complete + Téléchargement terminé + + + + DownloadComplete_MSG + Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour le numéro de série et la version spécifiques du jeu. Il peut être nécessaire de mettre à jour le jeu. + + + + Failed to parse JSON data from HTML. + Échec de l'analyse des données JSON à partir du HTML. + + + + Failed to retrieve HTML page. + Échec de la récupération de la page HTML. + + + + Failed to open file: + Échec de l'ouverture du fichier : + + + + XML ERROR: + Erreur XML : + + + + Failed to open files.json for writing + Échec de l'ouverture de files.json pour l'écriture + + + + Author: + Auteur : + + + + Directory does not exist: + Répertoire n'existe pas : + + + + Failed to open files.json for reading. + Échec de l'ouverture de files.json pour la lecture. + + + + Name: + Nom : + Can't apply cheats before the game is started Impossible d'appliquer les Cheats avant que le jeu ne commence. - + SettingsDialog @@ -931,6 +973,111 @@ Close Fermer + + + Point your mouse at an option to display its description. + Pointez votre souris sur une option pour afficher sa description. + + + + consoleLanguageGroupBox + Langue de la console :\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. + + + + emulatorLanguageGroupBox + Langue de l'émulateur :\nDéfinit la langue de l'interface utilisateur de l'émulateur. + + + + fullscreenCheckBox + Activer le mode plein écran :\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. + + + + showSplashCheckBox + Afficher l'écran de démarrage :\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. + + + + ps4proCheckBox + Est-ce un PS4 Pro :\nFait en sorte que l'émulateur se comporte comme un PS4 PRO, ce qui peut activer des fonctionnalités spéciales dans les jeux qui le prennent en charge. + + + + userName + Nom d'utilisateur :\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. + + + + logTypeGroupBox + Type de journal :\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. + + + + logFilter + Filtre de journal : n'imprime que des informations spécifiques. Exemples : "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux : Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. + + + + updaterGroupBox + Mise à jour :\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. + + + + GUIgroupBox + Jouer de la musique de titre :\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. + + + + graphicsAdapterGroupBox + Adaptateur graphique :\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. + + + + resolutionLayout + Largeur/Hauteur :\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. + + + + heightDivider + Diviseur Vblank :\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! + + + + dumpShadersCheckBox + Activer l'exportation de shaders :\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. + + + + nullGpuCheckBox + Activer le GPU nul :\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. + + + + dumpPM4CheckBox + Activer l'exportation PM4 :\nPour le débogage technique, enregistre les données brutes des instructions GPU dans un dossier pendant que l'émulateur les traite. + + + + debugDump + Activer l'exportation de débogage :\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. + + + + vkValidationCheckBox + Activer les couches de validation Vulkan :\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. + + + + vkSyncValidationCheckBox + Activer la validation de synchronisation Vulkan :\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. + + + + rdocCheckBox + Activer le débogage RenderDoc :\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. + GameListFrame @@ -975,4 +1122,132 @@ Répertoire + + CheckUpdate + + + Auto Updater + Mise à jour automatique + + + + Error + Erreur + + + + Network error: + Erreur réseau : + + + + Failed to parse update information. + Échec de l'analyse des informations de mise à jour. + + + + No pre-releases found. + Aucune pré-version trouvée. + + + + Invalid release data. + Données de version invalides. + + + + No download URL found for the specified asset. + Aucune URL de téléchargement trouvée pour l'élément spécifié. + + + + Your version is already up to date! + Votre version est déjà à jour ! + + + + Update Available + Mise à jour disponible + + + + Update Channel + Canal de Mise à Jour + + + + Current Version + Version actuelle + + + + Latest Version + Dernière version + + + + Do you want to update? + Voulez-vous mettre à jour ? + + + + Show Changelog + Afficher le journal des modifications + + + + Check for Updates at Startup + Vérif. maj au démarrage + + + + Update + Mettre à jour + + + + No + Non + + + + Hide Changelog + Cacher le journal des modifications + + + + Changes + Modifications + + + + Network error occurred while trying to access the URL + Une erreur réseau s'est produite en essayant d'accéder à l'URL + + + + Download Complete + Téléchargement terminé + + + + The update has been downloaded, press OK to install. + La mise à jour a été téléchargée, appuyez sur OK pour l'installer. + + + + Failed to save the update file at + Échec de la sauvegarde du fichier de mise à jour à + + + + Starting Update... + Démarrage de la mise à jour... + + + + Failed to create the update script file + Échec de la création du fichier de script de mise à jour + + \ No newline at end of file diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 0f69822e7..fb348ee29 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - A shadPS4-ről - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. - - - - This software should not be used to play games you have not legally obtained. - Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. - - - - ElfViewer - - - Open Folder - Mappa megnyitása - - - - GameInfoClass - - - Loading game list, please wait :3 - Játék könyvtár betöltése, kérjük várjon :3 - - - - Cancel - Megszakítás - - - - Loading... - Betöltés.. - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása - - - - Directory to install games - Mappa a játékok telepítésére - - - - Browse - Böngészés - - - - Error - Hiba - - - - The value for location to install games is not valid. - A játékok telepítéséhez megadott érték nem érvényes. - - - - GuiContextMenus - - - Create Shortcut - Parancsikon Létrehozása - - - - Open Game Folder - Játék Mappa Megnyitása - + + AboutDialog - - Cheats / Patches - Csalások / Javítások - - - - SFO Viewer - SFO Néző - - - - Trophy Viewer - Trófeák Megtekintése - - - - Copy info - Információ Másolása - - - - Copy Name - Név Másolása - - - - Copy Serial - Széria Másolása - - - - Copy All - Összes Másolása - - - - Shortcut creation - Parancsikon létrehozása - - - - Shortcut created successfully!\n %1 - Parancsikon sikeresen létrehozva!\n %1 - - - - Error - Hiba - - - - Error creating shortcut!\n %1 - Hiba a parancsikon létrehozásával!\n %1 - - - - Install PKG - PKG telepítése - - - - MainWindow - - - Open/Add Elf Folder - Efl Mappa Megnyitása/Hozzáadása - - - - Install Packages (PKG) - PKG-k Telepítése (PKG) - - - - Boot Game - Játék Bootolása - - - - About shadPS4 - A shadPS4-ről - - - - Configure... - Konfigurálás... - - - - Install application from a .pkg file - Program telepítése egy .pkg fájlból - - - - Recent Games - Legutóbbi Játékok - - - - Exit - Kilépés - - - - Exit shadPS4 - Kilépés a shadPS4 - - - - Exit the application. - Lépjen ki az programból. - - - - Show Game List - Játék Könyvtár Megjelenítése - - - - Game List Refresh - Játék Könyvtár Újratöltése - - - - Tiny - Apró - - - - Small - Kicsi - - - - Medium - Közepes - - - - Large - Nagy - - - - List View - Lista Nézet - - - - Grid View - Rács Nézet - - - - Elf Viewer - Elf Néző - - - - Game Install Directory - Játék Telepítési Mappa - + + About shadPS4 + A shadPS4-ről + - - Download Cheats/Patches - Csalások / Javítások letöltése - - - - Dump Game List - Játék Lista Dumpolása - - - - PKG Viewer - PKG Néző - - - - Search... - Keresés... - - - - File - Fájl - - - - View - Megnézés - - - - Game List Icons - Játék Könyvtár Ikonok - - - - Game List Mode - Játék Könyvtár Mód - - - - Settings - Beállítások - - - - Utils - Segédeszközök - - - - Themes - Témák - - - - About - Segítség - - - - Dark - Sötét - - - - Light - Világos - - - - Green - Zöld - - - - Blue - Kék - - - - Violet - Ibolya - - - - toolBar - Eszköztár - - - - PKGViewer - - - Open Folder - Mappa Megnyitása - - - - TrophyViewer - - - Trophy Viewer - Trófeák Megtekintése - - - - SettingsDialog - - - Settings - Beállítások - - - - General - Általános - - - - System - Rendszer - - - - Console Language - A Konzol Nyelvezete - - - - Emulator Language - Az Emulátor Nyelvezete - - - - Emulator - Emulátor - - - - Enable Fullscreen - Teljesképernyő Engedélyezése - - - - Show Splash - Indítóképernyő Mutatása - - - - Is PS4 Pro - PS4 Pro - - - - Username - Felhasználónév - - - - Logger - Naplózó - - - - Log Type - Naplózási Típus - - - - Log Filter - Naplózási Filter - - - - Graphics - Grafika - - - - Graphics Device - Grafikai Eszköz - - - - Width - Szélesség - - - - Height - Magasság - - - - Vblank Divider - Vblank Elosztó - - - - Advanced - Haladó - - - - Enable Shaders Dumping - Shader Dumpolás Engedélyezése - - - - Enable NULL GPU - NULL GPU Engedélyezése - - - - Enable PM4 Dumping - PM4 Dumpolás Engedélyezése - - - - Debug - Debugolás - - - - Enable Debug Dumping - Debug Dumpolás Engedélyezése - - - - Enable Vulkan Validation Layers - Vulkan Validációs Rétegek Engedélyezése - - - - Enable Vulkan Synchronization Validation - Vulkan Szinkronizálás Validáció - - - - Enable RenderDoc Debugging - RenderDoc Debugolás Engedélyezése - - - - MainWindow + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. + + + + This software should not be used to play games you have not legally obtained. + Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. + + + + ElfViewer + + + Open Folder + Mappa megnyitása + + + + GameInfoClass + + + Loading game list, please wait :3 + Játék könyvtár betöltése, kérjük várjon :3 + + + + Cancel + Megszakítás + + + + Loading... + Betöltés.. + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Mappa kiválasztása + + + + Directory to install games + Mappa a játékok telepítésére + + + + Browse + Böngészés + + + + Error + Hiba + + + + The value for location to install games is not valid. + A játékok telepítéséhez megadott érték nem érvényes. + + + + GuiContextMenus + + + Create Shortcut + Parancsikon Létrehozása + + + + Open Game Folder + Játék Mappa Megnyitása + + + + Cheats / Patches + Csalások / Javítások + + + + SFO Viewer + SFO Néző + + + + Trophy Viewer + Trófeák Megtekintése + + + + Copy info + Információ Másolása + + + + Copy Name + Név Másolása + + + + Copy Serial + Széria Másolása + + + + Copy All + Összes Másolása + + + + Shortcut creation + Parancsikon létrehozása + + + + Shortcut created successfully!\n %1 + Parancsikon sikeresen létrehozva!\n %1 + + + + Error + Hiba + + + + Error creating shortcut!\n %1 + Hiba a parancsikon létrehozásával!\n %1 + + + + Install PKG + PKG telepítése + + + + MainWindow + + + Open/Add Elf Folder + Efl Mappa Megnyitása/Hozzáadása + + + + Install Packages (PKG) + PKG-k Telepítése (PKG) + + + + Boot Game + Játék Bootolása + + + + Check for Updates + Frissítések keresése + + + + About shadPS4 + A shadPS4-ről + + + + Configure... + Konfigurálás... + + + + Install application from a .pkg file + Program telepítése egy .pkg fájlból + + + + Recent Games + Legutóbbi Játékok + + + + Exit + Kilépés + + + + Exit shadPS4 + Kilépés a shadPS4 + + + + Exit the application. + Lépjen ki az programból. + + + + Show Game List + Játék Könyvtár Megjelenítése + + + + Game List Refresh + Játék Könyvtár Újratöltése + + + + Tiny + Apró + + + + Small + Kicsi + + + + Medium + Közepes + + + + Large + Nagy + + + + List View + Lista Nézet + + + + Grid View + Rács Nézet + + + + Elf Viewer + Elf Néző + + + + Game Install Directory + Játék Telepítési Mappa + + + + Download Cheats/Patches + Csalások / Javítások letöltése + + + + Dump Game List + Játék Lista Dumpolása + + + + PKG Viewer + PKG Néző + + + + Search... + Keresés... + + + + File + Fájl + + + + View + Megnézés + + + + Game List Icons + Játék Könyvtár Ikonok + + + + Game List Mode + Játék Könyvtár Mód + + + + Settings + Beállítások + + + + Utils + Segédeszközök + + + + Themes + Témák + + + + Help + Segítség + + + + Dark + Sötét + + + + Light + Világos + + + + Green + Zöld + + + + Blue + Kék + + + + Violet + Ibolya + + + + toolBar + Eszköztár + + + + PKGViewer + + + Open Folder + Mappa Megnyitása + + + + TrophyViewer + + + Trophy Viewer + Trófeák Megtekintése + + + + SettingsDialog + + + Settings + Beállítások + + + + General + Általános + + + + System + Rendszer + + + + Console Language + A Konzol Nyelvezete + + + + Emulator Language + Az Emulátor Nyelvezete + + + + Emulator + Emulátor + + + + Enable Fullscreen + Teljesképernyő Engedélyezése + + + + Show Splash + Indítóképernyő Mutatása + + + + Is PS4 Pro + PS4 Pro + + + + Username + Felhasználónév + + + + Logger + Naplózó + + + + Log Type + Naplózási Típus + + + + Log Filter + Naplózási Filter + + + + Graphics + Grafika + + + + Graphics Device + Grafikai Eszköz + + + + Width + Szélesség + + + + Height + Magasság + + + + Vblank Divider + Vblank Elosztó + + + + Advanced + Haladó + + + + Enable Shaders Dumping + Shader Dumpolás Engedélyezése + + + + Enable NULL GPU + NULL GPU Engedélyezése + + + + Enable PM4 Dumping + PM4 Dumpolás Engedélyezése + + + + Debug + Debugolás + + + + Enable Debug Dumping + Debug Dumpolás Engedélyezése + + + + Enable Vulkan Validation Layers + Vulkan Validációs Rétegek Engedélyezése + + + + Enable Vulkan Synchronization Validation + Vulkan Szinkronizálás Validáció + + + + Enable RenderDoc Debugging + RenderDoc Debugolás Engedélyezése + + + + Update + Frissítés + + + + Check for Updates at Startup + Frissítések keresése indításkor + + + + Update Channel + Frissítési Csatorna + + + + Check for Updates + Frissítések keresése + + + + GUI Settings + GUI Beállítások + + + + Play title music + Címzene lejátszása + + + + Volume + Hangerő + + + + MainWindow Game List Játéklista - - - * Unsupported Vulkan Version - * Támogatott Vulkan verzió hiányzik - - - - Download Cheats For All Installed Games - Letöltés csalások minden telepített játékhoz - - - - Download Patches For All Games - Frissítések letöltése minden játékhoz - - - - Download Complete - Letöltés befejezve - - - - You have downloaded cheats for all the games you have installed. - Csalásokat töltöttél le az összes telepített játékhoz. - - - - Patches Downloaded Successfully! - Frissítések sikeresen letöltve! - - - - All Patches available for all games have been downloaded. - Az összes játékhoz elérhető frissítés letöltésre került. - - - - Games: - Játékok: - - - - PKG File (*.PKG) - PKG fájl (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF fájlok (*.bin *.elf *.oelf) - - - - Game Boot - Játék indító - - - - Only one file can be selected! - Csak egy fájl választható ki! - - - - PKG Extraction - PKG kicsomagolás - - - - Patch detected! - Frissítés észlelve! - - - - PKG and Game versions match: - A PKG és a játék verziói egyeznek: - - - - Would you like to overwrite? - Szeretné felülírni? - - - - PKG Version %1 is older than installed version: - A %1-es PKG verzió régebbi, mint a telepített verzió: - - - - Game is installed: - A játék telepítve van: - - - - Would you like to install Patch: - Szeretné telepíteni a frissítést: - - - - DLC Installation - DLC Telepítés - - - - Would you like to install DLC: %1? - Szeretné telepíteni a DLC-t: %1? - - - - DLC already installed: - DLC már telepítve: - - - - Game already installed - A játék már telepítve van - - - - PKG is a patch, please install the game first! - A PKG egy javítás, először telepítsd a játékot! - - - - PKG ERROR - PKG HIBA - - - - Extracting PKG %1/%2 - PKG kicsomagolása %1/%2 - - - - Extraction Finished - Kicsomagolás befejezve - - - - Game successfully installed at %1 - A játék sikeresen telepítve itt: %1 - - - - File doesn't appear to be a valid PKG file - A fájl nem tűnik érvényes PKG fájlnak - + + + * Unsupported Vulkan Version + * Támogatott Vulkan verzió hiányzik + + + + Download Cheats For All Installed Games + Letöltés csalások minden telepített játékhoz + + + + Download Patches For All Games + Frissítések letöltése minden játékhoz + + + + Download Complete + Letöltés befejezve + + + + You have downloaded cheats for all the games you have installed. + Csalásokat töltöttél le az összes telepített játékhoz. + + + + Patches Downloaded Successfully! + Frissítések sikeresen letöltve! + + + + All Patches available for all games have been downloaded. + Az összes játékhoz elérhető frissítés letöltésre került. + + + + Games: + Játékok: + + + + PKG File (*.PKG) + PKG fájl (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF fájlok (*.bin *.elf *.oelf) + + + + Game Boot + Játék indító + + + + Only one file can be selected! + Csak egy fájl választható ki! + + + + PKG Extraction + PKG kicsomagolás + + + + Patch detected! + Frissítés észlelve! + + + + PKG and Game versions match: + A PKG és a játék verziói egyeznek: + + + + Would you like to overwrite? + Szeretné felülírni? + + + + PKG Version %1 is older than installed version: + A %1-es PKG verzió régebbi, mint a telepített verzió: + + + + Game is installed: + A játék telepítve van: + + + + Would you like to install Patch: + Szeretné telepíteni a frissítést: + + + + DLC Installation + DLC Telepítés + + + + Would you like to install DLC: %1? + Szeretné telepíteni a DLC-t: %1? + + + + DLC already installed: + DLC már telepítve: + + + + Game already installed + A játék már telepítve van + + + + PKG is a patch, please install the game first! + A PKG egy javítás, először telepítsd a játékot! + + + + PKG ERROR + PKG HIBA + + + + Extracting PKG %1/%2 + PKG kicsomagolása %1/%2 + + + + Extraction Finished + Kicsomagolás befejezve + + + + Game successfully installed at %1 + A játék sikeresen telepítve itt: %1 + + + + File doesn't appear to be a valid PKG file + A fájl nem tűnik érvényes PKG fájlnak + - CheatsPatches - - - Cheats / Patches - Csalások / Javítások - - - - defaultTextEdit_MSG - A csalások/patchek kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a repository kiválasztásával és a letöltés gombra kattintással.\nA Patches fül alatt egyszerre letöltheti az összes patchet, választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nincs elérhető kép - - - - Serial: - Sorozatszám: - - - - Version: - Verzió: - - - - Size: - Méret: - - - - Select Cheat File: - Válaszd ki a csalás fájlt: - - - - Repository: - Tároló: - - - - Download Cheats - Csalások letöltése - - - - Delete File - Fájl törlése - - - - No files selected. - Nincsenek kiválasztott fájlok. - - - - You can delete the cheats you don't want after downloading them. - Törölheted a nem kívánt csalásokat a letöltés után. - - - - Do you want to delete the selected file?\n%1 - Szeretnéd törölni a kiválasztott fájlt?\n%1 - - - - Select Patch File: - Válaszd ki a javítás fájlt: - - - - Download Patches - Javítások letöltése - - - - Save - Mentés - - - - Cheats - Csalások - - - - Patches - Javítások - - - - Error - Hiba - - - - No patch selected. - Nincs kiválasztva javítás. - - - - Unable to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. - - - - No patch file found for the current serial. - Nincs található javítási fájl a jelenlegi sorozatszámhoz. - - - - Unable to open the file for reading. - Nem sikerült megnyitni a fájlt olvasásra. - - - - Unable to open the file for writing. - Nem sikerült megnyitni a fájlt írásra. - - - - Failed to parse XML: - XML elemzési hiba: - - - - Success - Siker - - - - Options saved successfully. - A beállítások sikeresen elmentve. - - - - Invalid Source - Érvénytelen forrás - - - - The selected source is invalid. - A kiválasztott forrás érvénytelen. - - - - File Exists - A fájl létezik - - - - File already exists. Do you want to replace it? - A fájl már létezik. Szeretnéd helyettesíteni? - - - - Failed to save file: - Nem sikerült elmenteni a fájlt: - - - - Failed to download file: - Nem sikerült letölteni a fájlt: - - - - Cheats Not Found - Csalások nem találhatóak - - - - CheatsNotFound_MSG - Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban,próbálj meg egy másik tárolót vagy a játék egy másik verzióját. - - - - Cheats Downloaded Successfully - Csalások sikeresen letöltve - - - - CheatsDownloadedSuccessfully_MSG - Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. - - - - Failed to save: - Nem sikerült menteni: - - - - Failed to download: - Nem sikerült letölteni: - - - - Download Complete - Letöltés befejezve - - - - DownloadComplete_MSG - Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítás nem jelenik meg, lehet, hogy nem létezik a játék adott sorozatszámához és verziójához. Lehet, hogy frissítenie kell a játékot. - - - - Failed to parse JSON data from HTML. - Nem sikerült az JSON adatok elemzése HTML-ből. - - - - Failed to retrieve HTML page. - Nem sikerült HTML oldal lekérése. - - - - Failed to open file: - Nem sikerült megnyitni a fájlt: - - - - XML ERROR: - XML HIBA: - - - - Failed to open files.json for writing - Nem sikerült megnyitni a files.json fájlt írásra - - - - Author: - Szerző: - - - - Directory does not exist: - A könyvtár nem létezik: - - - - Failed to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. - - - - Name: - Név: - + CheatsPatches + + + Cheats / Patches + Csalások / Javítások + + + + defaultTextEdit_MSG + A csalások/patchek kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a repository kiválasztásával és a letöltés gombra kattintással.\nA Patches fül alatt egyszerre letöltheti az összes patchet, választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Nincs elérhető kép + + + + Serial: + Sorozatszám: + + + + Version: + Verzió: + + + + Size: + Méret: + + + + Select Cheat File: + Válaszd ki a csalás fájlt: + + + + Repository: + Tároló: + + + + Download Cheats + Csalások letöltése + + + + Delete File + Fájl törlése + + + + No files selected. + Nincsenek kiválasztott fájlok. + + + + You can delete the cheats you don't want after downloading them. + Törölheted a nem kívánt csalásokat a letöltés után. + + + + Do you want to delete the selected file?\n%1 + Szeretnéd törölni a kiválasztott fájlt?\n%1 + + + + Select Patch File: + Válaszd ki a javítás fájlt: + + + + Download Patches + Javítások letöltése + + + + Save + Mentés + + + + Cheats + Csalások + + + + Patches + Javítások + + + + Error + Hiba + + + + No patch selected. + Nincs kiválasztva javítás. + + + + Unable to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. + + + + No patch file found for the current serial. + Nincs található javítási fájl a jelenlegi sorozatszámhoz. + + + + Unable to open the file for reading. + Nem sikerült megnyitni a fájlt olvasásra. + + + + Unable to open the file for writing. + Nem sikerült megnyitni a fájlt írásra. + + + + Failed to parse XML: + XML elemzési hiba: + + + + Success + Siker + + + + Options saved successfully. + A beállítások sikeresen elmentve. + + + + Invalid Source + Érvénytelen forrás + + + + The selected source is invalid. + A kiválasztott forrás érvénytelen. + + + + File Exists + A fájl létezik + + + + File already exists. Do you want to replace it? + A fájl már létezik. Szeretnéd helyettesíteni? + + + + Failed to save file: + Nem sikerült elmenteni a fájlt: + + + + Failed to download file: + Nem sikerült letölteni a fájlt: + + + + Cheats Not Found + Csalások nem találhatóak + + + + CheatsNotFound_MSG + Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban,próbálj meg egy másik tárolót vagy a játék egy másik verzióját. + + + + Cheats Downloaded Successfully + Csalások sikeresen letöltve + + + + CheatsDownloadedSuccessfully_MSG + Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. + + + + Failed to save: + Nem sikerült menteni: + + + + Failed to download: + Nem sikerült letölteni: + + + + Download Complete + Letöltés befejezve + + + + DownloadComplete_MSG + Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítás nem jelenik meg, lehet, hogy nem létezik a játék adott sorozatszámához és verziójához. Lehet, hogy frissítenie kell a játékot. + + + + Failed to parse JSON data from HTML. + Nem sikerült az JSON adatok elemzése HTML-ből. + + + + Failed to retrieve HTML page. + Nem sikerült HTML oldal lekérése. + + + + Failed to open file: + Nem sikerült megnyitni a fájlt: + + + + XML ERROR: + XML HIBA: + + + + Failed to open files.json for writing + Nem sikerült megnyitni a files.json fájlt írásra + + + + Author: + Szerző: + + + + Directory does not exist: + A könyvtár nem létezik: + + + + Failed to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. + + + + Name: + Név: + Can't apply cheats before the game is started @@ -931,6 +973,111 @@ Close Bezárás + + + Point your mouse at an option to display its description. + Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. + + + + consoleLanguageGroupBox + Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. + + + + emulatorLanguageGroupBox + Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. + + + + fullscreenCheckBox + Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. + + + + showSplashCheckBox + Indító képernyő megjelenítése:\nMegjeleníti a játék indító képernyőjét (különleges képet) a játék elindításakor. + + + + ps4proCheckBox + PS4 Pro:\nAz emulátort PS4 PRO-ként kezeli, ami engedélyezheti a speciális funkciókat olyan játékokban, amelyek támogatják. + + + + userName + Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. + + + + logTypeGroupBox + Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. + + + + logFilter + Napló szűrő: Csak bizonyos információk megjelenítésére szűri a naplót. Példák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. + + + + updaterGroupBox + Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. + + + + GUIgroupBox + Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze a speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. + + + + graphicsAdapterGroupBox + Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki a GPU-t, amelyet az emulátor használ a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan meghatározza azt. + + + + resolutionLayout + Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. + + + + heightDivider + Vblank osztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! + + + + dumpShadersCheckBox + Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. + + + + nullGpuCheckBox + Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. + + + + dumpPM4CheckBox + PM4 dumpolás engedélyezése:\nMűszaki hibaelhárítás céljából a nyers GPU utasítási adatokat elmenti egy mappába, ahogy az emulátor feldolgozza őket. + + + + debugDump + Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. + + + + vkValidationCheckBox + Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. + + + + vkSyncValidationCheckBox + Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. + + + + rdocCheckBox + RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. + GameListFrame @@ -975,4 +1122,132 @@ Útvonal - + + CheckUpdate + + + Auto Updater + Automatikus frissítő + + + + Error + Hiba + + + + Network error: + Hálózati hiba: + + + + Failed to parse update information. + A frissítési információk elemzése sikertelen. + + + + No pre-releases found. + Nem található előzetes kiadás. + + + + Invalid release data. + Érvénytelen kiadási adatok. + + + + No download URL found for the specified asset. + Nincs letöltési URL a megadott eszközhöz. + + + + Your version is already up to date! + A verziód már naprakész! + + + + Update Available + Frissítés elérhető + + + + Update Channel + Frissítési Csatorna + + + + Current Version + Jelenlegi verzió + + + + Latest Version + Legújabb verzió + + + + Do you want to update? + Szeretnéd frissíteni? + + + + Show Changelog + Módosítások megjelenítése + + + + Check for Updates at Startup + Frissítések keresése indításkor + + + + Update + Frissítés + + + + No + Nem + + + + Hide Changelog + Módosítások elrejtése + + + + Changes + Módosítások + + + + Network error occurred while trying to access the URL + Hálózati hiba történt az URL elérésekor + + + + Download Complete + Letöltés kész + + + + The update has been downloaded, press OK to install. + A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez. + + + + Failed to save the update file at + A frissítési fájl mentése nem sikerült a következő helyre + + + + Starting Update... + Frissítés indítása... + + + + Failed to create the update script file + A frissítési szkript fájl létrehozása nem sikerült + + + \ No newline at end of file diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index 6108ffa20..86c58c6ce 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Cheat / Patch - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Unduh Cheat / Patch - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - MainWindow + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Cheat / Patch + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Periksa pembaruan + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Unduh Cheat / Patch + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Bantuan + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Pembaruan + + + + Check for Updates at Startup + Periksa pembaruan saat mulai + + + + Update Channel + Saluran Pembaruan + + + + Check for Updates + Periksa pembaruan + + + + GUI Settings + Pengaturan GUI + + + + Play title music + Putar musik judul + + + + Volume + Volume + + + + MainWindow Game List Daftar game - - - * Unsupported Vulkan Version - * Versi Vulkan Tidak Didukung - - - - Download Cheats For All Installed Games - Unduh Cheat Untuk Semua Game Yang Terpasang - - - - Download Patches For All Games - Unduh Patch Untuk Semua Game - - - - Download Complete - Unduhan Selesai - - - - You have downloaded cheats for all the games you have installed. - Anda telah mengunduh cheat untuk semua game yang terpasang. - - - - Patches Downloaded Successfully! - Patch Berhasil Diunduh! - - - - All Patches available for all games have been downloaded. - Semua Patch yang tersedia untuk semua game telah diunduh. - - - - Games: - Game: - - - - PKG File (*.PKG) - File PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) - - - - Game Boot - Boot Game - - - - Only one file can be selected! - Hanya satu file yang bisa dipilih! - - - - PKG Extraction - Ekstraksi PKG - - - - Patch detected! - Patch terdeteksi! - - - - PKG and Game versions match: - Versi PKG dan Game cocok: - - - - Would you like to overwrite? - Apakah Anda ingin menimpa? - - - - PKG Version %1 is older than installed version: - Versi PKG %1 lebih lama dari versi yang terpasang: - - - - Game is installed: - Game telah terpasang: - - - - Would you like to install Patch: - Apakah Anda ingin menginstal patch: - - - - DLC Installation - Instalasi DLC - - - - Would you like to install DLC: %1? - Apakah Anda ingin menginstal DLC: %1? - - - - DLC already installed: - DLC sudah terpasang: - - - - Game already installed - Game sudah terpasang - - - - PKG is a patch, please install the game first! - PKG adalah patch, harap pasang game terlebih dahulu! - - - - PKG ERROR - KESALAHAN PKG - - - - Extracting PKG %1/%2 - Mengekstrak PKG %1/%2 - - - - Extraction Finished - Ekstraksi Selesai - - - - Game successfully installed at %1 - Game berhasil dipasang di %1 - - - - File doesn't appear to be a valid PKG file - File tampaknya bukan file PKG yang valid - + + + * Unsupported Vulkan Version + * Versi Vulkan Tidak Didukung + + + + Download Cheats For All Installed Games + Unduh Cheat Untuk Semua Game Yang Terpasang + + + + Download Patches For All Games + Unduh Patch Untuk Semua Game + + + + Download Complete + Unduhan Selesai + + + + You have downloaded cheats for all the games you have installed. + Anda telah mengunduh cheat untuk semua game yang terpasang. + + + + Patches Downloaded Successfully! + Patch Berhasil Diunduh! + + + + All Patches available for all games have been downloaded. + Semua Patch yang tersedia untuk semua game telah diunduh. + + + + Games: + Game: + + + + PKG File (*.PKG) + File PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) + + + + Game Boot + Boot Game + + + + Only one file can be selected! + Hanya satu file yang bisa dipilih! + + + + PKG Extraction + Ekstraksi PKG + + + + Patch detected! + Patch terdeteksi! + + + + PKG and Game versions match: + Versi PKG dan Game cocok: + + + + Would you like to overwrite? + Apakah Anda ingin menimpa? + + + + PKG Version %1 is older than installed version: + Versi PKG %1 lebih lama dari versi yang terpasang: + + + + Game is installed: + Game telah terpasang: + + + + Would you like to install Patch: + Apakah Anda ingin menginstal patch: + + + + DLC Installation + Instalasi DLC + + + + Would you like to install DLC: %1? + Apakah Anda ingin menginstal DLC: %1? + + + + DLC already installed: + DLC sudah terpasang: + + + + Game already installed + Game sudah terpasang + + + + PKG is a patch, please install the game first! + PKG adalah patch, harap pasang game terlebih dahulu! + + + + PKG ERROR + KESALAHAN PKG + + + + Extracting PKG %1/%2 + Mengekstrak PKG %1/%2 + + + + Extraction Finished + Ekstraksi Selesai + + + + Game successfully installed at %1 + Game berhasil dipasang di %1 + + + + File doesn't appear to be a valid PKG file + File tampaknya bukan file PKG yang valid + - CheatsPatches - - - Cheats / Patches - Cheat / Patch - - - - defaultTextEdit_MSG - Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Tidak Ada Gambar Tersedia - - - - Serial: - Serial: - - - - Version: - Versi: - - - - Size: - Ukuran: - - - - Select Cheat File: - Pilih File Cheat: - - - - Repository: - Repositori: - - - - Download Cheats - Unduh Cheat - - - - Delete File - Hapus File - - - - No files selected. - Tidak ada file yang dipilih. - - - - You can delete the cheats you don't want after downloading them. - Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. - - - - Do you want to delete the selected file?\n%1 - Apakah Anda ingin menghapus berkas yang dipilih?\n%1 - - - - Select Patch File: - Pilih File Patch: - - - - Download Patches - Unduh Patch - - - - Save - Simpan - - - - Cheats - Cheat - - - - Patches - Patch - - - - Error - Kesalahan - - - - No patch selected. - Tidak ada patch yang dipilih. - - - - Unable to open files.json for reading. - Tidak dapat membuka files.json untuk dibaca. - - - - No patch file found for the current serial. - Tidak ada file patch ditemukan untuk serial saat ini. - - - - Unable to open the file for reading. - Tidak dapat membuka file untuk dibaca. - - - - Unable to open the file for writing. - Tidak dapat membuka file untuk menulis. - - - - Failed to parse XML: - Gagal menganalisis XML: - - - - Success - Sukses - - - - Options saved successfully. - Opsi berhasil disimpan. - - - - Invalid Source - Sumber Tidak Valid - - - - The selected source is invalid. - Sumber yang dipilih tidak valid. - - - - File Exists - File Ada - - - - File already exists. Do you want to replace it? - File sudah ada. Apakah Anda ingin menggantinya? - - - - Failed to save file: - Gagal menyimpan file: - - - - Failed to download file: - Gagal mengunduh file: - - - - Cheats Not Found - Cheat Tidak Ditemukan - - - - CheatsNotFound_MSG - Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. - - - - Cheats Downloaded Successfully - Cheat Berhasil Diunduh - - - - CheatsDownloadedSuccessfully_MSG - Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. - - - - Failed to save: - Gagal menyimpan: - - - - Failed to download: - Gagal mengunduh: - - - - Download Complete - Unduhan Selesai - - - - DownloadComplete_MSG - Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. Mungkin perlu memperbarui game. - - - - Failed to parse JSON data from HTML. - Gagal menganalisis data JSON dari HTML. - - - - Failed to retrieve HTML page. - Gagal mengambil halaman HTML. - - - - Failed to open file: - Gagal membuka file: - - - - XML ERROR: - KESALAHAN XML: - - - - Failed to open files.json for writing - Gagal membuka files.json untuk menulis - - - - Author: - Penulis: - - - - Directory does not exist: - Direktori tidak ada: - - - - Failed to open files.json for reading. - Gagal membuka files.json untuk dibaca. - - - - Name: - Nama: - + CheatsPatches + + + Cheats / Patches + Cheat / Patch + + + + defaultTextEdit_MSG + Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Tidak Ada Gambar Tersedia + + + + Serial: + Serial: + + + + Version: + Versi: + + + + Size: + Ukuran: + + + + Select Cheat File: + Pilih File Cheat: + + + + Repository: + Repositori: + + + + Download Cheats + Unduh Cheat + + + + Delete File + Hapus File + + + + No files selected. + Tidak ada file yang dipilih. + + + + You can delete the cheats you don't want after downloading them. + Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. + + + + Do you want to delete the selected file?\n%1 + Apakah Anda ingin menghapus berkas yang dipilih?\n%1 + + + + Select Patch File: + Pilih File Patch: + + + + Download Patches + Unduh Patch + + + + Save + Simpan + + + + Cheats + Cheat + + + + Patches + Patch + + + + Error + Kesalahan + + + + No patch selected. + Tidak ada patch yang dipilih. + + + + Unable to open files.json for reading. + Tidak dapat membuka files.json untuk dibaca. + + + + No patch file found for the current serial. + Tidak ada file patch ditemukan untuk serial saat ini. + + + + Unable to open the file for reading. + Tidak dapat membuka file untuk dibaca. + + + + Unable to open the file for writing. + Tidak dapat membuka file untuk menulis. + + + + Failed to parse XML: + Gagal menganalisis XML: + + + + Success + Sukses + + + + Options saved successfully. + Opsi berhasil disimpan. + + + + Invalid Source + Sumber Tidak Valid + + + + The selected source is invalid. + Sumber yang dipilih tidak valid. + + + + File Exists + File Ada + + + + File already exists. Do you want to replace it? + File sudah ada. Apakah Anda ingin menggantinya? + + + + Failed to save file: + Gagal menyimpan file: + + + + Failed to download file: + Gagal mengunduh file: + + + + Cheats Not Found + Cheat Tidak Ditemukan + + + + CheatsNotFound_MSG + Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. + + + + Cheats Downloaded Successfully + Cheat Berhasil Diunduh + + + + CheatsDownloadedSuccessfully_MSG + Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. + + + + Failed to save: + Gagal menyimpan: + + + + Failed to download: + Gagal mengunduh: + + + + Download Complete + Unduhan Selesai + + + + DownloadComplete_MSG + Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. Mungkin perlu memperbarui game. + + + + Failed to parse JSON data from HTML. + Gagal menganalisis data JSON dari HTML. + + + + Failed to retrieve HTML page. + Gagal mengambil halaman HTML. + + + + Failed to open file: + Gagal membuka file: + + + + XML ERROR: + KESALAHAN XML: + + + + Failed to open files.json for writing + Gagal membuka files.json untuk menulis + + + + Author: + Penulis: + + + + Directory does not exist: + Direktori tidak ada: + + + + Failed to open files.json for reading. + Gagal membuka files.json untuk dibaca. + + + + Name: + Nama: + Can't apply cheats before the game is started @@ -931,6 +973,111 @@ Close Tutup + + + Point your mouse at an option to display its description. + Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. + + + + consoleLanguageGroupBox + Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. + + + + emulatorLanguageGroupBox + Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. + + + + fullscreenCheckBox + Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. + + + + showSplashCheckBox + Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. + + + + ps4proCheckBox + Adalah PS4 Pro:\nMembuat emulator berfungsi sebagai PS4 PRO, yang mungkin mengaktifkan fitur khusus dalam permainan yang mendukungnya. + + + + userName + Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. + + + + logTypeGroupBox + Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. + + + + logFilter + Filter Log: Menyaring log untuk hanya mencetak informasi tertentu. Contoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. + + + + updaterGroupBox + Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. + + + + GUIgroupBox + Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. + + + + graphicsAdapterGroupBox + Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. + + + + resolutionLayout + Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. + + + + heightDivider + Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! + + + + dumpShadersCheckBox + Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. + + + + nullGpuCheckBox + Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. + + + + dumpPM4CheckBox + Aktifkan Pembuangan PM4:\nUntuk tujuan debugging teknis, menyimpan data instruksi GPU mentah ke folder saat emulator memprosesnya. + + + + debugDump + Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. + + + + vkValidationCheckBox + Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. + + + + vkSyncValidationCheckBox + Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. + + + + rdocCheckBox + Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. + GameListFrame @@ -975,4 +1122,132 @@ Jalur + + CheckUpdate + + + Auto Updater + Pembaruan Otomatis + + + + Error + Kesalahan + + + + Network error: + Kesalahan jaringan: + + + + Failed to parse update information. + Gagal memparse informasi pembaruan. + + + + No pre-releases found. + Tidak ada pra-rilis yang ditemukan. + + + + Invalid release data. + Data rilis tidak valid. + + + + No download URL found for the specified asset. + Tidak ada URL unduhan ditemukan untuk aset yang ditentukan. + + + + Your version is already up to date! + Versi Anda sudah terbaru! + + + + Update Available + Pembaruan Tersedia + + + + Update Channel + Saluran Pembaruan + + + + Current Version + Versi Saat Ini + + + + Latest Version + Versi Terbaru + + + + Do you want to update? + Apakah Anda ingin memperbarui? + + + + Show Changelog + Tampilkan Catatan Perubahan + + + + Check for Updates at Startup + Periksa pembaruan saat mulai + + + + Update + Perbarui + + + + No + Tidak + + + + Hide Changelog + Sembunyikan Catatan Perubahan + + + + Changes + Perubahan + + + + Network error occurred while trying to access the URL + Kesalahan jaringan terjadi saat mencoba mengakses URL + + + + Download Complete + Unduhan Selesai + + + + The update has been downloaded, press OK to install. + Pembaruan telah diunduh, tekan OK untuk menginstal. + + + + Failed to save the update file at + Gagal menyimpan file pembaruan di + + + + Starting Update... + Memulai Pembaruan... + + + + Failed to create the update script file + Gagal membuat file skrip pembaruan + + \ No newline at end of file diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 39cb35dd3..f5ea9a65c 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - Riguardo shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 è un emulatore sperimentale open source per PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. - - - - ElfViewer - - - Open Folder - Apri Cartella - - - - GameInfoClass - - - Loading game list, please wait :3 - Caricamento lista giochi, attendere :3 - - - - Cancel - Annulla - - - - Loading... - Caricamento... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Scegli cartella - - - - Directory to install games - Cartella di installazione dei giochi - - - - Browse - Sfoglia - - - - Error - Errore - - - - The value for location to install games is not valid. - Il valore del percorso di installazione dei giochi non è valido. - - - - GuiContextMenus - - - Create Shortcut - Crea scorciatoia - - - - Open Game Folder - Apri cartella del gioco - - - - Cheats / Patches - Trucchi / Patch - - - - SFO Viewer - Visualizzatore SFO - - - - Trophy Viewer - Visualizzatore Trofei - - - - Copy info - Copia informazioni - - - - Copy Name - Copia Nome - - - - Copy Serial - Copia Seriale - - - - Copy All - Copia Tutto - - - - Shortcut creation - Creazione scorciatoia - - - - Shortcut created successfully!\n %1 - Scorciatoia creata con successo!\n %1 - - - - Error - Errore - - - - Error creating shortcut!\n %1 - Errore nella creazione della scorciatoia!\n %1 - - - - Install PKG - Installa PKG - - - - MainWindow - - - Open/Add Elf Folder - Apri/Aggiungi cartella Elf - - - - Install Packages (PKG) - Installa Pacchetti (PKG) - - - - Boot Game - Avvia Gioco - - - - About shadPS4 - Riguardo a shadPS4 - - - - Configure... - Configura... - - - - Install application from a .pkg file - Installa applicazione da un file .pkg - - - - Recent Games - Giochi Recenti - - - - Exit - Uscita - - - - Exit shadPS4 - Esci da shadPS4 - - - - Exit the application. - Esci dall'applicazione. - - - - Show Game List - Mostra Lista Giochi - - - - Game List Refresh - Aggiorna Lista Giochi - - - - Tiny - Minuscolo - - - - Small - Piccolo - - - - Medium - Medio - - - - Large - Grande - - - - List View - Visualizzazione Lista - - - - Grid View - Visualizzazione Griglia - - - - Elf Viewer - Visualizzatore Elf - - - - Game Install Directory - Cartella Installazione Giochi - - - - Download Cheats/Patches - Scarica Trucchi / Patch - - - - Dump Game List - Scarica Lista Giochi - - - - PKG Viewer - Visualizzatore PKG - - - - Search... - Cerca... - - - - File - File - - - - View - Visualizza - - - - Game List Icons - Icone Lista Giochi - - - - Game List Mode - Modalità Lista Giochi - - - - Settings - Impostazioni - - - - Utils - Utilità - - - - Themes - Temi - - - - About - Info su - - - - Dark - Scuro - - - - Light - Chiaro - - - - Green - Verde - - - - Blue - Blu - - - - Violet - Viola - - - - toolBar - Barra strumenti - - - - PKGViewer - - - Open Folder - Apri Cartella - - - - TrophyViewer - - - Trophy Viewer - Visualizzatore Trofei - - - - SettingsDialog - - - Settings - Impostazioni - - - - General - Generale - - - - System - Sistema - - - - Console Language - Lingua della console - - - - Emulator Language - Lingua dell'emulatore - - - - Emulator - Emulatore - - - - Enable Fullscreen - Abilita Schermo Intero - - - - Show Splash - Mostra Schermata Iniziale - - - - Is PS4 Pro - Modalità Ps4Pro - - - - Username - Nome Utente - - - - Logger - Logger - - - - Log Type - Tipo di Log - - - - Log Filter - Filtro Log - - - - Graphics - Grafica - - - - Graphics Device - Adattatore grafico - - - - Width - Larghezza - - - - Height - Altezza - - - - Vblank Divider - Divisore Vblank - - - - Advanced - Avanzato - - - - Enable Shaders Dumping - Abilita Dump Shader - - - - Enable NULL GPU - Abilita NULL GPU - - - - Enable PM4 Dumping - Abilita Dump PM4 - - - - Debug - Debug - - - - Enable Debug Dumping - Abilita Dump Debug - - - - Enable Vulkan Validation Layers - Abilita Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Abilita Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Abilita Debugging RenderDoc - - - - MainWindow + + AboutDialog + + + About shadPS4 + Riguardo shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 è un emulatore sperimentale open source per PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. + + + + ElfViewer + + + Open Folder + Apri Cartella + + + + GameInfoClass + + + Loading game list, please wait :3 + Caricamento lista giochi, attendere :3 + + + + Cancel + Annulla + + + + Loading... + Caricamento... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Scegli cartella + + + + Directory to install games + Cartella di installazione dei giochi + + + + Browse + Sfoglia + + + + Error + Errore + + + + The value for location to install games is not valid. + Il valore del percorso di installazione dei giochi non è valido. + + + + GuiContextMenus + + + Create Shortcut + Crea scorciatoia + + + + Open Game Folder + Apri cartella del gioco + + + + Cheats / Patches + Trucchi / Patch + + + + SFO Viewer + Visualizzatore SFO + + + + Trophy Viewer + Visualizzatore Trofei + + + + Copy info + Copia informazioni + + + + Copy Name + Copia Nome + + + + Copy Serial + Copia Seriale + + + + Copy All + Copia Tutto + + + + Shortcut creation + Creazione scorciatoia + + + + Shortcut created successfully!\n %1 + Scorciatoia creata con successo!\n %1 + + + + Error + Errore + + + + Error creating shortcut!\n %1 + Errore nella creazione della scorciatoia!\n %1 + + + + Install PKG + Installa PKG + + + + MainWindow + + + Open/Add Elf Folder + Apri/Aggiungi cartella Elf + + + + Install Packages (PKG) + Installa Pacchetti (PKG) + + + + Boot Game + Avvia Gioco + + + + Check for Updates + Controlla aggiornamenti + + + + About shadPS4 + Riguardo a shadPS4 + + + + Configure... + Configura... + + + + Install application from a .pkg file + Installa applicazione da un file .pkg + + + + Recent Games + Giochi Recenti + + + + Exit + Uscita + + + + Exit shadPS4 + Esci da shadPS4 + + + + Exit the application. + Esci dall'applicazione. + + + + Show Game List + Mostra Lista Giochi + + + + Game List Refresh + Aggiorna Lista Giochi + + + + Tiny + Minuscolo + + + + Small + Piccolo + + + + Medium + Medio + + + + Large + Grande + + + + List View + Visualizzazione Lista + + + + Grid View + Visualizzazione Griglia + + + + Elf Viewer + Visualizzatore Elf + + + + Game Install Directory + Cartella Installazione Giochi + + + + Download Cheats/Patches + Scarica Trucchi / Patch + + + + Dump Game List + Scarica Lista Giochi + + + + PKG Viewer + Visualizzatore PKG + + + + Search... + Cerca... + + + + File + File + + + + View + Visualizza + + + + Game List Icons + Icone Lista Giochi + + + + Game List Mode + Modalità Lista Giochi + + + + Settings + Impostazioni + + + + Utils + Utilità + + + + Themes + Temi + + + + Help + Aiuto + + + + Dark + Scuro + + + + Light + Chiaro + + + + Green + Verde + + + + Blue + Blu + + + + Violet + Viola + + + + toolBar + Barra strumenti + + + + PKGViewer + + + Open Folder + Apri Cartella + + + + TrophyViewer + + + Trophy Viewer + Visualizzatore Trofei + + + + SettingsDialog + + + Settings + Impostazioni + + + + General + Generale + + + + System + Sistema + + + + Console Language + Lingua della console + + + + Emulator Language + Lingua dell'emulatore + + + + Emulator + Emulatore + + + + Enable Fullscreen + Abilita Schermo Intero + + + + Show Splash + Mostra Schermata Iniziale + + + + Is PS4 Pro + Modalità Ps4Pro + + + + Username + Nome Utente + + + + Logger + Logger + + + + Log Type + Tipo di Log + + + + Log Filter + Filtro Log + + + + Graphics + Grafica + + + + Graphics Device + Adattatore grafico + + + + Width + Larghezza + + + + Height + Altezza + + + + Vblank Divider + Divisore Vblank + + + + Advanced + Avanzato + + + + Enable Shaders Dumping + Abilita Dump Shader + + + + Enable NULL GPU + Abilita NULL GPU + + + + Enable PM4 Dumping + Abilita Dump PM4 + + + + Debug + Debug + + + + Enable Debug Dumping + Abilita Dump Debug + + + + Enable Vulkan Validation Layers + Abilita Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Abilita Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Abilita Debugging RenderDoc + + + + Update + Aggiornamento + + + + Check for Updates at Startup + Verifica aggiornamenti all’avvio + + + + Update Channel + Canale di Aggiornamento + + + + Check for Updates + Controlla aggiornamenti + + + + GUI Settings + Impostazioni GUI + + + + Play title music + Riproduci musica del titolo + + + + Volume + Volume + + + + MainWindow Game List Elenco giochi - - - * Unsupported Vulkan Version - * Versione Vulkan non supportata - - - - Download Cheats For All Installed Games - Scarica Trucchi per tutti i giochi installati - - - - Download Patches For All Games - Scarica Patch per tutti i giochi - - - - Download Complete - Scaricamento completato - - - - You have downloaded cheats for all the games you have installed. - Hai scaricato trucchi per tutti i giochi installati. - - - - Patches Downloaded Successfully! - Patch scaricate con successo! - - - - All Patches available for all games have been downloaded. - Tutte le patch disponibili per tutti i giochi sono state scaricate. - - - - Games: - Giochi: - - - - PKG File (*.PKG) - File PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) - - - - Game Boot - Avvia Gioco - - - - Only one file can be selected! - Si può selezionare solo un file! - - - - PKG Extraction - Estrazione file PKG - - - - Patch detected! - Patch rilevata! - - - - PKG and Game versions match: - Le versioni di PKG e del gioco corrispondono: - - - - Would you like to overwrite? - Vuoi sovrascrivere? - - - - PKG Version %1 is older than installed version: - La versione PKG %1 è più vecchia rispetto alla versione installata: - - - - Game is installed: - Gioco installato: - - - - Would you like to install Patch: - Vuoi installare la patch: - - - - DLC Installation - Installazione DLC - - - - Would you like to install DLC: %1? - Vuoi installare il DLC: %1? - - - - DLC already installed: - DLC già installato: - - - - Game already installed - Gioco già installato - - - - PKG is a patch, please install the game first! - Questo file PKG contiene una patch. Per favore, installa prima il gioco! - - - - PKG ERROR - ERRORE PKG - - - - Extracting PKG %1/%2 - Estrazione file PKG %1/%2 - - - - Extraction Finished - Estrazione Completata - - - - Game successfully installed at %1 - Gioco installato correttamente in %1 - - - - File doesn't appear to be a valid PKG file - Il file sembra non essere un file PKG valido - - - - CheatsPatches - - - Cheats / Patches - Trucchi / Patch - - - - defaultTextEdit_MSG - I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nessuna immagine disponibile - - - - Serial: - Seriale: - - - - Version: - Versione: - - - - Size: - Dimensione: - - - - Select Cheat File: - Seleziona File Trucchi: - - - - Repository: - Archivio: - - - - Download Cheats - Scarica trucchi - - - - Delete File - Cancella File - - - - No files selected. - Nessun file selezionato. - - - - You can delete the cheats you don't want after downloading them. - Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. - - - - Do you want to delete the selected file?\n%1 - Vuoi cancellare il file selezionato?\n%1 - - - - Select Patch File: - Seleziona File Patch: - - - - Download Patches - Scarica Patch - - - - Save - Salva - - - - Cheats - Trucchi - - - - Patches - Patch - - - - Error - Errore - - - - No patch selected. - Nessuna patch selezionata. - - - - Unable to open files.json for reading. - Impossibile aprire il file .json per la lettura. - - - - No patch file found for the current serial. - Nessun file patch trovato per il seriale selezionato. - - - - Unable to open the file for reading. - Impossibile aprire il file per la lettura. - - - - Unable to open the file for writing. - Impossibile aprire il file per la scrittura. - - - - Failed to parse XML: - Analisi XML fallita: - - - - Success - Successo - - - - Options saved successfully. - Opzioni salvate con successo. - - - - Invalid Source - Fonte non valida - - - - The selected source is invalid. - La fonte selezionata non è valida. - - - - File Exists - Il file è presente - - - - File already exists. Do you want to replace it? - Il file è già presente. Vuoi sostituirlo? - - - - Failed to save file: - Salvataggio file fallito: - - - - Failed to download file: - Scaricamento file fallito: - - - - Cheats Not Found - Trucchi non trovati - - - - CheatsNotFound_MSG - Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. - - - - Cheats Downloaded Successfully - Trucchi scaricati con successo! - - - - CheatsDownloadedSuccessfully_MSG - Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. - - - - Failed to save: - Salvataggio fallito: - - - - Failed to download: - Impossibile scaricare: - - - - Download Complete - Scaricamento completo - - - - DownloadComplete_MSG - Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. Potrebbe essere necessario aggiornare il gioco. - - - - Failed to parse JSON data from HTML. - Impossibile analizzare i dati JSON dall'HTML. - - - - Failed to retrieve HTML page. - Impossibile recuperare la pagina HTML. - - - - Failed to open file: - Impossibile aprire file: - - - - XML ERROR: - ERRORE XML: - - - - Failed to open files.json for writing - Impossibile aprire i file .json per la scrittura - - - - Author: - Autore: - - - - Directory does not exist: - La cartella non esiste: - - - - Failed to open files.json for reading. - Impossibile aprire i file .json per la lettura. - - - - Name: - Nome: - + + + * Unsupported Vulkan Version + * Versione Vulkan non supportata + + + + Download Cheats For All Installed Games + Scarica Trucchi per tutti i giochi installati + + + + Download Patches For All Games + Scarica Patch per tutti i giochi + + + + Download Complete + Scaricamento completato + + + + You have downloaded cheats for all the games you have installed. + Hai scaricato trucchi per tutti i giochi installati. + + + + Patches Downloaded Successfully! + Patch scaricate con successo! + + + + All Patches available for all games have been downloaded. + Tutte le patch disponibili per tutti i giochi sono state scaricate. + + + + Games: + Giochi: + + + + PKG File (*.PKG) + File PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) + + + + Game Boot + Avvia Gioco + + + + Only one file can be selected! + Si può selezionare solo un file! + + + + PKG Extraction + Estrazione file PKG + + + + Patch detected! + Patch rilevata! + + + + PKG and Game versions match: + Le versioni di PKG e del gioco corrispondono: + + + + Would you like to overwrite? + Vuoi sovrascrivere? + + + + PKG Version %1 is older than installed version: + La versione PKG %1 è più vecchia rispetto alla versione installata: + + + + Game is installed: + Gioco installato: + + + + Would you like to install Patch: + Vuoi installare la patch: + + + + DLC Installation + Installazione DLC + + + + Would you like to install DLC: %1? + Vuoi installare il DLC: %1? + + + + DLC already installed: + DLC già installato: + + + + Game already installed + Gioco già installato + + + + PKG is a patch, please install the game first! + Questo file PKG contiene una patch. Per favore, installa prima il gioco! + + + + PKG ERROR + ERRORE PKG + + + + Extracting PKG %1/%2 + Estrazione file PKG %1/%2 + + + + Extraction Finished + Estrazione Completata + + + + Game successfully installed at %1 + Gioco installato correttamente in %1 + + + + File doesn't appear to be a valid PKG file + Il file sembra non essere un file PKG valido + + + + CheatsPatches + + + Cheats / Patches + Trucchi / Patch + + + + defaultTextEdit_MSG + I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Nessuna immagine disponibile + + + + Serial: + Seriale: + + + + Version: + Versione: + + + + Size: + Dimensione: + + + + Select Cheat File: + Seleziona File Trucchi: + + + + Repository: + Archivio: + + + + Download Cheats + Scarica trucchi + + + + Delete File + Cancella File + + + + No files selected. + Nessun file selezionato. + + + + You can delete the cheats you don't want after downloading them. + Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. + + + + Do you want to delete the selected file?\n%1 + Vuoi cancellare il file selezionato?\n%1 + + + + Select Patch File: + Seleziona File Patch: + + + + Download Patches + Scarica Patch + + + + Save + Salva + + + + Cheats + Trucchi + + + + Patches + Patch + + + + Error + Errore + + + + No patch selected. + Nessuna patch selezionata. + + + + Unable to open files.json for reading. + Impossibile aprire il file .json per la lettura. + + + + No patch file found for the current serial. + Nessun file patch trovato per il seriale selezionato. + + + + Unable to open the file for reading. + Impossibile aprire il file per la lettura. + + + + Unable to open the file for writing. + Impossibile aprire il file per la scrittura. + + + + Failed to parse XML: + Analisi XML fallita: + + + + Success + Successo + + + + Options saved successfully. + Opzioni salvate con successo. + + + + Invalid Source + Fonte non valida + + + + The selected source is invalid. + La fonte selezionata non è valida. + + + + File Exists + Il file è presente + + + + File already exists. Do you want to replace it? + Il file è già presente. Vuoi sostituirlo? + + + + Failed to save file: + Salvataggio file fallito: + + + + Failed to download file: + Scaricamento file fallito: + + + + Cheats Not Found + Trucchi non trovati + + + + CheatsNotFound_MSG + Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. + + + + Cheats Downloaded Successfully + Trucchi scaricati con successo! + + + + CheatsDownloadedSuccessfully_MSG + Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. + + + + Failed to save: + Salvataggio fallito: + + + + Failed to download: + Impossibile scaricare: + + + + Download Complete + Scaricamento completo + + + + DownloadComplete_MSG + Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. Potrebbe essere necessario aggiornare il gioco. + + + + Failed to parse JSON data from HTML. + Impossibile analizzare i dati JSON dall'HTML. + + + + Failed to retrieve HTML page. + Impossibile recuperare la pagina HTML. + + + + Failed to open file: + Impossibile aprire file: + + + + XML ERROR: + ERRORE XML: + + + + Failed to open files.json for writing + Impossibile aprire i file .json per la scrittura + + + + Author: + Autore: + + + + Directory does not exist: + La cartella non esiste: + + + + Failed to open files.json for reading. + Impossibile aprire i file .json per la lettura. + + + + Name: + Nome: + Can't apply cheats before the game is started Non è possibile applicare i trucchi prima dell'inizio del gioco. - + SettingsDialog @@ -931,6 +973,111 @@ Close Chiudi + + + Point your mouse at an option to display its description. + Sposta il mouse su un'opzione per visualizzarne la descrizione. + + + + consoleLanguageGroupBox + Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. + + + + emulatorLanguageGroupBox + Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. + + + + fullscreenCheckBox + Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. + + + + showSplashCheckBox + Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. + + + + ps4proCheckBox + È PS4 Pro:\nFa sì che l'emulatore si comporti come una PS4 PRO, il che può abilitare funzionalità speciali in giochi che la supportano. + + + + userName + Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. + + + + logTypeGroupBox + Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. + + + + logFilter + Filtro Log: Filtra il log per stampare solo informazioni specifiche. Esempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. + + + + updaterGroupBox + Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. + + + + GUIgroupBox + Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. + + + + graphicsAdapterGroupBox + Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. + + + + resolutionLayout + Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. + + + + heightDivider + Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! + + + + dumpShadersCheckBox + Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. + + + + nullGpuCheckBox + Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. + + + + dumpPM4CheckBox + Abilita Pompaggio PM4:\nPer scopi di debug tecnico, salva i dati delle istruzioni GPU grezze in una cartella mentre l'emulatore li elabora. + + + + debugDump + Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. + + + + vkValidationCheckBox + Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. + + + + vkSyncValidationCheckBox + Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. + + + + rdocCheckBox + Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. + GameListFrame @@ -975,4 +1122,132 @@ Percorso - + + CheckUpdate + + + Auto Updater + Aggiornamento automatico + + + + Error + Errore + + + + Network error: + Errore di rete: + + + + Failed to parse update information. + Impossibile analizzare le informazioni di aggiornamento. + + + + No pre-releases found. + Nessuna anteprima trovata. + + + + Invalid release data. + Dati della release non validi. + + + + No download URL found for the specified asset. + Nessun URL di download trovato per l'asset specificato. + + + + Your version is already up to date! + La tua versione è già aggiornata! + + + + Update Available + Aggiornamento disponibile + + + + Update Channel + Canale di Aggiornamento + + + + Current Version + Versione attuale + + + + Latest Version + Ultima versione + + + + Do you want to update? + Vuoi aggiornare? + + + + Show Changelog + Mostra il Changelog + + + + Check for Updates at Startup + Verifica aggiornamenti all’avvio + + + + Update + Aggiorna + + + + No + No + + + + Hide Changelog + Nascondi il Changelog + + + + Changes + Modifiche + + + + Network error occurred while trying to access the URL + Si è verificato un errore di rete durante il tentativo di accesso all'URL + + + + Download Complete + Download completato + + + + The update has been downloaded, press OK to install. + L'aggiornamento è stato scaricato, premi OK per installare. + + + + Failed to save the update file at + Impossibile salvare il file di aggiornamento in + + + + Starting Update... + Inizio aggiornamento... + + + + Failed to create the update script file + Impossibile creare il file di script di aggiornamento + + + \ No newline at end of file diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 680d4ebd5..166100db6 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - shadPS4について - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 - - - - This software should not be used to play games you have not legally obtained. - このソフトウェアは、合法的に入手していないゲームをプレイするために使用するものではありません。 - - - - ElfViewer - - - Open Folder - フォルダを開く - - - - GameInfoClass - - - Loading game list, please wait :3 - ゲームリストを読み込み中です。お待ちください :3 - - - - Cancel - キャンセル - - - - Loading... - 読み込み中... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 - - - - Directory to install games - ゲームをインストールするディレクトリ - - - - Browse - 参照 - - - - Error - エラー - - - - The value for location to install games is not valid. - ゲームをインストールする場所が無効です。 - - - - GuiContextMenus - - - Create Shortcut - ショートカットを作成 - - - - Open Game Folder - ゲームフォルダを開く - - - - Cheats / Patches - チート / パッチ - - - - SFO Viewer - SFOビューワー - - - - Trophy Viewer - トロフィービューワー - - - - Copy info - 情報をコピー - - - - Copy Name - 名前をコピー - - - - Copy Serial - シリアルをコピー - - - - Copy All - すべてコピー - - - - Shortcut creation - ショートカットの作成 - - - - Shortcut created successfully!\n %1 - ショートカットが正常に作成されました!\n %1 - - - - Error - エラー - - - - Error creating shortcut!\n %1 - ショートカットの作成に失敗しました!\n %1 - - - - Install PKG - PKGをインストール - - - - MainWindow - - - Open/Add Elf Folder - Elfフォルダを開く/追加する - - - - Install Packages (PKG) - パッケージをインストール (PKG) - - - - Boot Game - ゲームを起動 - - - - About shadPS4 - shadPS4について - - - - Configure... - 設定... - - - - Install application from a .pkg file - .pkgファイルからアプリケーションをインストールする - - - - Recent Games - 最近のゲーム - - - - Exit - 終了 - - - - Exit shadPS4 - shadPS4を終了 - - - - Exit the application. - アプリケーションを終了します。 - - - - Show Game List - ゲームリストを表示 - - - - Game List Refresh - ゲームリストの更新 - - - - Tiny - 極小 - - - - Small - - - - - Medium - - - - - Large - - - - - List View - リストビュー - - - - Grid View - グリッドビュー - - - - Elf Viewer - Elfビュワー - - - - Game Install Directory - ゲームインストールディレクトリ - - - - Download Cheats/Patches - チート / パッチをダウンロード - - - - Dump Game List - ゲームリストをダンプ - - - - PKG Viewer - PKGビューアー - - - - Search... - 検索... - - - - File - ファイル - - - - View - 表示 - - - - Game List Icons - ゲームリストアイコン - - - - Game List Mode - ゲームリストモード - - - - Settings - 設定 - - - - Utils - ユーティリティ - - - - Themes - テーマ - - - - About - 情報 - - - - Dark - ダーク - - - - Light - ライト - - - - Green - グリーン - - - - Blue - ブルー - - - - Violet - バイオレット - - - - toolBar - ツールバー - - - - PKGViewer - - - Open Folder - フォルダーを開く - - - - TrophyViewer - - - Trophy Viewer - トロフィービューアー - - - - SettingsDialog - - - Settings - 設定 - - - - General - 一般 - - - - System - システム - - - - Console Language - コンソール言語 - - - - Emulator Language - エミュレーター言語 - - - - Emulator - エミュレーター - - - - Enable Fullscreen - フルスクリーンを有効にする - - - - Show Splash - スプラッシュを表示する - - - - Is PS4 Pro - PS4 Proモード - - - - Username - ユーザー名 - - - - Logger - ロガー - - - - Log Type - ログタイプ - - - - Log Filter - ログフィルター - - - - Graphics - グラフィックス - - - - Graphics Device - グラフィックスデバイス - - - - Width - - - - - Height - 高さ - - - - Vblank Divider - Vblankディバイダー - - - - Advanced - 高度な設定 - - - - Enable Shaders Dumping - シェーダーのダンプを有効にする - - - - Enable NULL GPU - NULL GPUを有効にする - - - - Enable PM4 Dumping - PM4ダンプを有効にする - - - - Debug - デバッグ - - - - Enable Debug Dumping - デバッグダンプを有効にする - - - - Enable Vulkan Validation Layers - Vulkan検証レイヤーを有効にする - - - - Enable Vulkan Synchronization Validation - Vulkan同期検証を有効にする - - - - Enable RenderDoc Debugging - RenderDocデバッグを有効にする - - - MainWindow + AboutDialog + + + About shadPS4 + shadPS4について + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 + + + + This software should not be used to play games you have not legally obtained. + このソフトウェアは、合法的に入手していないゲームをプレイするために使用するものではありません。 + + + + ElfViewer + + + Open Folder + フォルダを開く + + + + GameInfoClass + + + Loading game list, please wait :3 + ゲームリストを読み込み中です。お待ちください :3 + + + + Cancel + キャンセル + + + + Loading... + 読み込み中... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - ディレクトリを選択 + + + + Directory to install games + ゲームをインストールするディレクトリ + + + + Browse + 参照 + + + + Error + エラー + + + + The value for location to install games is not valid. + ゲームをインストールする場所が無効です。 + + + + GuiContextMenus + + + Create Shortcut + ショートカットを作成 + + + + Open Game Folder + ゲームフォルダを開く + + + + Cheats / Patches + チート / パッチ + + + + SFO Viewer + SFOビューワー + + + + Trophy Viewer + トロフィービューワー + + + + Copy info + 情報をコピー + + + + Copy Name + 名前をコピー + + + + Copy Serial + シリアルをコピー + + + + Copy All + すべてコピー + + + + Shortcut creation + ショートカットの作成 + + + + Shortcut created successfully!\n %1 + ショートカットが正常に作成されました!\n %1 + + + + Error + エラー + + + + Error creating shortcut!\n %1 + ショートカットの作成に失敗しました!\n %1 + + + + Install PKG + PKGをインストール + + + + MainWindow + + + Open/Add Elf Folder + Elfフォルダを開く/追加する + + + + Install Packages (PKG) + パッケージをインストール (PKG) + + + + Boot Game + ゲームを起動 + + + + Check for Updates + 更新を確認する + + + + About shadPS4 + shadPS4について + + + + Configure... + 設定... + + + + Install application from a .pkg file + .pkgファイルからアプリケーションをインストールする + + + + Recent Games + 最近のゲーム + + + + Exit + 終了 + + + + Exit shadPS4 + shadPS4を終了 + + + + Exit the application. + アプリケーションを終了します。 + + + + Show Game List + ゲームリストを表示 + + + + Game List Refresh + ゲームリストの更新 + + + + Tiny + 極小 + + + + Small + + + + + Medium + + + + + Large + + + + + List View + リストビュー + + + + Grid View + グリッドビュー + + + + Elf Viewer + Elfビュワー + + + + Game Install Directory + ゲームインストールディレクトリ + + + + Download Cheats/Patches + チート / パッチをダウンロード + + + + Dump Game List + ゲームリストをダンプ + + + + PKG Viewer + PKGビューアー + + + + Search... + 検索... + + + + File + ファイル + + + + View + 表示 + + + + Game List Icons + ゲームリストアイコン + + + + Game List Mode + ゲームリストモード + + + + Settings + 設定 + + + + Utils + ユーティリティ + + + + Themes + テーマ + + + + Help + ヘルプ + + + + Dark + ダーク + + + + Light + ライト + + + + Green + グリーン + + + + Blue + ブルー + + + + Violet + バイオレット + + + + toolBar + ツールバー + + + + PKGViewer + + + Open Folder + フォルダーを開く + + + + TrophyViewer + + + Trophy Viewer + トロフィービューアー + + + + SettingsDialog + + + Settings + 設定 + + + + General + 一般 + + + + System + システム + + + + Console Language + コンソール言語 + + + + Emulator Language + エミュレーター言語 + + + + Emulator + エミュレーター + + + + Enable Fullscreen + フルスクリーンを有効にする + + + + Show Splash + スプラッシュを表示する + + + + Is PS4 Pro + PS4 Proモード + + + + Username + ユーザー名 + + + + Logger + ロガー + + + + Log Type + ログタイプ + + + + Log Filter + ログフィルター + + + + Graphics + グラフィックス + + + + Graphics Device + グラフィックスデバイス + + + + Width + + + + + Height + 高さ + + + + Vblank Divider + Vblankディバイダー + + + + Advanced + 高度な設定 + + + + Enable Shaders Dumping + シェーダーのダンプを有効にする + + + + Enable NULL GPU + NULL GPUを有効にする + + + + Enable PM4 Dumping + PM4ダンプを有効にする + + + + Debug + デバッグ + + + + Enable Debug Dumping + デバッグダンプを有効にする + + + + Enable Vulkan Validation Layers + Vulkan検証レイヤーを有効にする + + + + Enable Vulkan Synchronization Validation + Vulkan同期検証を有効にする + + + + Enable RenderDoc Debugging + RenderDocデバッグを有効にする + + + + Update + 更新 + + + + Check for Updates at Startup + 起動時に更新確認 + + + + Update Channel + アップデートチャネル + + + + Check for Updates + 更新を確認 + + + + GUI Settings + GUI設定 + + + + Play title music + タイトル音楽を再生する + + + + Volume + 音量 + + + + MainWindow Game List ゲームリスト - - - * Unsupported Vulkan Version - * サポートされていないVulkanバージョン - - - - Download Cheats For All Installed Games - すべてのインストール済みゲームのチートをダウンロード - - - - Download Patches For All Games - すべてのゲームのパッチをダウンロード - - - - Download Complete - ダウンロード完了 - - - - You have downloaded cheats for all the games you have installed. - インストールしたすべてのゲームのチートをダウンロードしました。 - - - - Patches Downloaded Successfully! - パッチが正常にダウンロードされました! - - - - All Patches available for all games have been downloaded. - すべてのゲームに利用可能なパッチがダウンロードされました。 - - - - Games: - ゲーム: - - - - PKG File (*.PKG) - PKGファイル (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELFファイル (*.bin *.elf *.oelf) - - - - Game Boot - ゲームブート - - - - Only one file can be selected! - 1つのファイルしか選択できません! - - - - PKG Extraction - PKG抽出 - - - - Patch detected! - パッチが検出されました! - - - - PKG and Game versions match: - PKGとゲームのバージョンが一致しています: - - - - Would you like to overwrite? - 上書きしてもよろしいですか? - - - - PKG Version %1 is older than installed version: - PKGバージョン %1 はインストールされているバージョンよりも古いです: - - - - Game is installed: - ゲームはインストール済みです: - - - - Would you like to install Patch: - パッチをインストールしてもよろしいですか: - - - - DLC Installation - DLCのインストール - - - - Would you like to install DLC: %1? - DLCをインストールしてもよろしいですか: %1? - - - - DLC already installed: - DLCはすでにインストールされています: - - - - Game already installed - ゲームはすでにインストールされています - - - - PKG is a patch, please install the game first! - PKGはパッチです。ゲームを先にインストールしてください! - - - - PKG ERROR - PKGエラー - - - - Extracting PKG %1/%2 - PKGを抽出中 %1/%2 - - - - Extraction Finished - 抽出完了 - - - - Game successfully installed at %1 - ゲームが %1 に正常にインストールされました - - - - File doesn't appear to be a valid PKG file - ファイルが有効なPKGファイルでないようです - + + + * Unsupported Vulkan Version + * サポートされていないVulkanバージョン + + + + Download Cheats For All Installed Games + すべてのインストール済みゲームのチートをダウンロード + + + + Download Patches For All Games + すべてのゲームのパッチをダウンロード + + + + Download Complete + ダウンロード完了 + + + + You have downloaded cheats for all the games you have installed. + インストールしたすべてのゲームのチートをダウンロードしました。 + + + + Patches Downloaded Successfully! + パッチが正常にダウンロードされました! + + + + All Patches available for all games have been downloaded. + すべてのゲームに利用可能なパッチがダウンロードされました。 + + + + Games: + ゲーム: + + + + PKG File (*.PKG) + PKGファイル (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELFファイル (*.bin *.elf *.oelf) + + + + Game Boot + ゲームブート + + + + Only one file can be selected! + 1つのファイルしか選択できません! + + + + PKG Extraction + PKG抽出 + + + + Patch detected! + パッチが検出されました! + + + + PKG and Game versions match: + PKGとゲームのバージョンが一致しています: + + + + Would you like to overwrite? + 上書きしてもよろしいですか? + + + + PKG Version %1 is older than installed version: + PKGバージョン %1 はインストールされているバージョンよりも古いです: + + + + Game is installed: + ゲームはインストール済みです: + + + + Would you like to install Patch: + パッチをインストールしてもよろしいですか: + + + + DLC Installation + DLCのインストール + + + + Would you like to install DLC: %1? + DLCをインストールしてもよろしいですか: %1? + + + + DLC already installed: + DLCはすでにインストールされています: + + + + Game already installed + ゲームはすでにインストールされています + + + + PKG is a patch, please install the game first! + PKGはパッチです。ゲームを先にインストールしてください! + + + + PKG ERROR + PKGエラー + + + + Extracting PKG %1/%2 + PKGを抽出中 %1/%2 + + + + Extraction Finished + 抽出完了 + + + + Game successfully installed at %1 + ゲームが %1 に正常にインストールされました + + + + File doesn't appear to be a valid PKG file + ファイルが有効なPKGファイルでないようです + - CheatsPatches - - - Cheats / Patches - チート / パッチ - - - - defaultTextEdit_MSG - チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチを開発していないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 - - - - No Image Available - 画像は利用できません - - - - Serial: - シリアル: - - - - Version: - バージョン: - - - - Size: - サイズ: - - - - Select Cheat File: - チートファイルを選択: - - - - Repository: - リポジトリ: - - - - Download Cheats - チートをダウンロード - - - - Delete File - ファイルを削除 - - - - No files selected. - ファイルが選択されていません。 - - - - You can delete the cheats you don't want after downloading them. - ダウンロード後に不要なチートを削除できます。 - - - - Do you want to delete the selected file?\n%1 - 選択したファイルを削除しますか?\n%1 - - - - Select Patch File: - パッチファイルを選択: - - - - Download Patches - パッチをダウンロード - - - - Save - 保存 - - - - Cheats - チート - - - - Patches - パッチ - - - - Error - エラー - - - - No patch selected. - パッチが選択されていません。 - - - - Unable to open files.json for reading. - files.jsonを読み込み用に開けません。 - - - - No patch file found for the current serial. - 現在のシリアルに対するパッチファイルが見つかりません。 - - - - Unable to open the file for reading. - ファイルを読み込み用に開けません。 - - - - Unable to open the file for writing. - ファイルを記録用に開けません。 - - - - Failed to parse XML: - XMLの解析に失敗しました: - - - - Success - 成功 - - - - Options saved successfully. - オプションが正常に保存されました。 - - - - Invalid Source - 無効なソース - - - - The selected source is invalid. - 選択したソースは無効です。 - - - - File Exists - ファイルが存在します - - - - File already exists. Do you want to replace it? - ファイルはすでに存在します。置き換えますか? - - - - Failed to save file: - ファイルの保存に失敗しました: - - - - Failed to download file: - ファイルのダウンロードに失敗しました: - - - - Cheats Not Found - チートが見つかりません - - - - CheatsNotFound_MSG - このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 - - - - Cheats Downloaded Successfully - チートが正常にダウンロードされました - - - - CheatsDownloadedSuccessfully_MSG - このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 - - - - Failed to save: - 保存に失敗しました: - - - - Failed to download: - ダウンロードに失敗しました: - - - - Download Complete - ダウンロード完了 - - - - DownloadComplete_MSG - パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。ゲームを更新する必要があるかもしれません。 - - - - Failed to parse JSON data from HTML. - HTMLからJSONデータの解析に失敗しました。 - - - - Failed to retrieve HTML page. - HTMLページの取得に失敗しました。 - - - - Failed to open file: - ファイルを開くのに失敗しました: - - - - XML ERROR: - XMLエラー: - - - - Failed to open files.json for writing - files.jsonを記録用に開けません - - - - Author: - 著者: - - - - Directory does not exist: - ディレクトリが存在しません: - - - - Failed to open files.json for reading. - files.jsonを読み込み用に開けません。 - - - - Name: - 名前: - + CheatsPatches + + + Cheats / Patches + チート / パッチ + + + + defaultTextEdit_MSG + チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチを開発していないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 + + + + No Image Available + 画像は利用できません + + + + Serial: + シリアル: + + + + Version: + バージョン: + + + + Size: + サイズ: + + + + Select Cheat File: + チートファイルを選択: + + + + Repository: + リポジトリ: + + + + Download Cheats + チートをダウンロード + + + + Delete File + ファイルを削除 + + + + No files selected. + ファイルが選択されていません。 + + + + You can delete the cheats you don't want after downloading them. + ダウンロード後に不要なチートを削除できます。 + + + + Do you want to delete the selected file?\n%1 + 選択したファイルを削除しますか?\n%1 + + + + Select Patch File: + パッチファイルを選択: + + + + Download Patches + パッチをダウンロード + + + + Save + 保存 + + + + Cheats + チート + + + + Patches + パッチ + + + + Error + エラー + + + + No patch selected. + パッチが選択されていません。 + + + + Unable to open files.json for reading. + files.jsonを読み込み用に開けません。 + + + + No patch file found for the current serial. + 現在のシリアルに対するパッチファイルが見つかりません。 + + + + Unable to open the file for reading. + ファイルを読み込み用に開けません。 + + + + Unable to open the file for writing. + ファイルを記録用に開けません。 + + + + Failed to parse XML: + XMLの解析に失敗しました: + + + + Success + 成功 + + + + Options saved successfully. + オプションが正常に保存されました。 + + + + Invalid Source + 無効なソース + + + + The selected source is invalid. + 選択したソースは無効です。 + + + + File Exists + ファイルが存在します + + + + File already exists. Do you want to replace it? + ファイルはすでに存在します。置き換えますか? + + + + Failed to save file: + ファイルの保存に失敗しました: + + + + Failed to download file: + ファイルのダウンロードに失敗しました: + + + + Cheats Not Found + チートが見つかりません + + + + CheatsNotFound_MSG + このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 + + + + Cheats Downloaded Successfully + チートが正常にダウンロードされました + + + + CheatsDownloadedSuccessfully_MSG + このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 + + + + Failed to save: + 保存に失敗しました: + + + + Failed to download: + ダウンロードに失敗しました: + + + + Download Complete + ダウンロード完了 + + + + DownloadComplete_MSG + パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。ゲームを更新する必要があるかもしれません。 + + + + Failed to parse JSON data from HTML. + HTMLからJSONデータの解析に失敗しました。 + + + + Failed to retrieve HTML page. + HTMLページの取得に失敗しました。 + + + + Failed to open file: + ファイルを開くのに失敗しました: + + + + XML ERROR: + XMLエラー: + + + + Failed to open files.json for writing + files.jsonを記録用に開けません + + + + Author: + 著者: + + + + Directory does not exist: + ディレクトリが存在しません: + + + + Failed to open files.json for reading. + files.jsonを読み込み用に開けません。 + + + + Name: + 名前: + Can't apply cheats before the game is started @@ -931,6 +973,111 @@ Close 閉じる + + + Point your mouse at an option to display its description. + オプションにマウスをポイントすると、その説明が表示されます。 + + + + consoleLanguageGroupBox + コンソール言語:\nPS4ゲームが使用する言語を設定します。\nこれはゲームがサポートする言語に設定することをお勧めしますが、地域によって異なる場合があります。 + + + + emulatorLanguageGroupBox + エミュレーター言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 + + + + fullscreenCheckBox + 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 + + + + showSplashCheckBox + スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 + + + + ps4proCheckBox + PS4 Proです:\nエミュレーターがPS4 PROとして動作するようにし、これをサポートするゲームで特別な機能を有効にする場合があります。 + + + + userName + ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 + + + + logTypeGroupBox + ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 + + + + logFilter + ログフィルター: 特定の情報のみを印刷するようにログをフィルタリングします。例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" レベル: Trace, Debug, Info, Warning, Error, Critical - この順序で、特定のレベルはリスト内のすべての前のレベルをサイレンスし、その後のすべてのレベルをログに記録します。 + + + + updaterGroupBox + 更新:\nRelease: 非常に古いかもしれないが、より信頼性が高くテスト済みの公式バージョンを毎月リリースします。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 + + + + GUIgroupBox + タイトルミュージックを再生:\nゲームがそれをサポートしている場合、GUIでゲームを選択したときに特別な音楽を再生することを有効にします。 + + + + graphicsAdapterGroupBox + グラフィックデバイス:\n複数のGPUシステムで、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 + + + + resolutionLayout + 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中にサイズ変更できます。\nこれはゲーム内の解像度とは異なります。 + + + + heightDivider + Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! + + + + dumpShadersCheckBox + シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 + + + + nullGpuCheckBox + Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 + + + + dumpPM4CheckBox + PM4ダンプを有効にする:\n技術的なデバッグの目的で、エミュレーターが処理している間に生のGPU命令データをフォルダーに保存します。 + + + + debugDump + デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 + + + + vkValidationCheckBox + Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 + + + + vkSyncValidationCheckBox + Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 + + + + rdocCheckBox + RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 + GameListFrame @@ -975,4 +1122,132 @@ パス + + CheckUpdate + + + Auto Updater + 自動アップデーター + + + + Error + エラー + + + + Network error: + ネットワークエラー: + + + + Failed to parse update information. + アップデート情報の解析に失敗しました。 + + + + No pre-releases found. + プレリリースは見つかりませんでした。 + + + + Invalid release data. + リリースデータが無効です。 + + + + No download URL found for the specified asset. + 指定されたアセットのダウンロードURLが見つかりませんでした。 + + + + Your version is already up to date! + あなたのバージョンはすでに最新です! + + + + Update Available + アップデートがあります + + + + Update Channel + アップデートチャネル + + + + Current Version + 現在のバージョン + + + + Latest Version + 最新バージョン + + + + Do you want to update? + アップデートしますか? + + + + Show Changelog + 変更ログを表示 + + + + Check for Updates at Startup + 起動時に更新確認 + + + + Update + アップデート + + + + No + いいえ + + + + Hide Changelog + 変更ログを隠す + + + + Changes + 変更点 + + + + Network error occurred while trying to access the URL + URLにアクセス中にネットワークエラーが発生しました + + + + Download Complete + ダウンロード完了 + + + + The update has been downloaded, press OK to install. + アップデートがダウンロードされました。インストールするにはOKを押してください。 + + + + Failed to save the update file at + 更新ファイルの保存に失敗しました + + + + Starting Update... + アップデートを開始しています... + + + + Failed to create the update script file + アップデートスクリプトファイルの作成に失敗しました + + \ No newline at end of file diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index a167311b9..93ceb9e35 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - 치트 / 패치 - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - 치트 / 패치 다운로드 - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - MainWindow + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + 치트 / 패치 + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Check for Updates + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + 치트 / 패치 다운로드 + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Help + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Update + + + + Check for Updates at Startup + Check for Updates at Startup + + + + Update Channel + Update Channel + + + + Check for Updates + Check for Updates + + + + GUI Settings + GUI Settings + + + + Play title music + Play title music + + + + Volume + 음량 + + + + MainWindow Game List Game List - - - * Unsupported Vulkan Version - * Unsupported Vulkan Version - - - - Download Cheats For All Installed Games - Download Cheats For All Installed Games - - - - Download Patches For All Games - Download Patches For All Games - - - - Download Complete - Download Complete - - - - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. - - - - Patches Downloaded Successfully! - Patches Downloaded Successfully! - - - - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. - - - - Games: - Games: - - - - PKG File (*.PKG) - PKG File (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) - - - - Game Boot - Game Boot - - - - Only one file can be selected! - Only one file can be selected! - - - - PKG Extraction - PKG Extraction - - - - Patch detected! - Patch detected! - - - - PKG and Game versions match: - PKG and Game versions match: - - - - Would you like to overwrite? - Would you like to overwrite? - - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - - Game is installed: - Game is installed: - - - - Would you like to install Patch: - Would you like to install Patch: - - - - DLC Installation - DLC Installation - - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - - DLC already installed: - DLC already installed: - - - - Game already installed - Game already installed - - - - PKG is a patch, please install the game first! - PKG is a patch, please install the game first! - - - - PKG ERROR - PKG ERROR - - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - - Extraction Finished - Extraction Finished - - - - Game successfully installed at %1 - Game successfully installed at %1 - - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + + Download Patches For All Games + Download Patches For All Games + + + + Download Complete + Download Complete + + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + + Games: + Games: + + + + PKG File (*.PKG) + PKG File (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + + Game Boot + Game Boot + + + + Only one file can be selected! + Only one file can be selected! + + + + PKG Extraction + PKG Extraction + + + + Patch detected! + Patch detected! + + + + PKG and Game versions match: + PKG and Game versions match: + + + + Would you like to overwrite? + Would you like to overwrite? + + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + + Game is installed: + Game is installed: + + + + Would you like to install Patch: + Would you like to install Patch: + + + + DLC Installation + DLC Installation + + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + + DLC already installed: + DLC already installed: + + + + Game already installed + Game already installed + + + + PKG is a patch, please install the game first! + PKG is a patch, please install the game first! + + + + PKG ERROR + PKG ERROR + + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + + Extraction Finished + Extraction Finished + + + + Game successfully installed at %1 + Game successfully installed at %1 + + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - No Image Available - - - - Serial: - Serial: - - - - Version: - Version: - - - - Size: - Size: - - - - Select Cheat File: - Select Cheat File: - - - - Repository: - Repository: - - - - Download Cheats - Download Cheats - - - - Delete File - Delete File - - - - No files selected. - No files selected. - - - - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. - - - - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 - - - - Select Patch File: - Select Patch File: - - - - Download Patches - Download Patches - - - - Save - Save - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Error - - - - No patch selected. - No patch selected. - - - - Unable to open files.json for reading. - Unable to open files.json for reading. - - - - No patch file found for the current serial. - No patch file found for the current serial. - - - - Unable to open the file for reading. - Unable to open the file for reading. - - - - Unable to open the file for writing. - Unable to open the file for writing. - - - - Failed to parse XML: - Failed to parse XML: - - - - Success - Success - - - - Options saved successfully. - Options saved successfully. - - - - Invalid Source - Invalid Source - - - - The selected source is invalid. - The selected source is invalid. - - - - File Exists - File Exists - - - - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? - - - - Failed to save file: - Failed to save file: - - - - Failed to download file: - Failed to download file: - - - - Cheats Not Found - Cheats Not Found - - - - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - - - - Cheats Downloaded Successfully - Cheats Downloaded Successfully - - - - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - - - - Failed to save: - Failed to save: - - - - Failed to download: - Failed to download: - - - - Download Complete - Download Complete - - - - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. It may be necessary to update the game. - - - - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. - - - - Failed to retrieve HTML page. - Failed to retrieve HTML page. - - - - Failed to open file: - Failed to open file: - - - - XML ERROR: - XML ERROR: - - - - Failed to open files.json for writing - Failed to open files.json for writing - - - - Author: - Author: - - - - Directory does not exist: - Directory does not exist: - - - - Failed to open files.json for reading. - Failed to open files.json for reading. - - - - Name: - Name: - + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + No Image Available + + + + Serial: + Serial: + + + + Version: + Version: + + + + Size: + Size: + + + + Select Cheat File: + Select Cheat File: + + + + Repository: + Repository: + + + + Download Cheats + Download Cheats + + + + Delete File + Delete File + + + + No files selected. + No files selected. + + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + + Select Patch File: + Select Patch File: + + + + Download Patches + Download Patches + + + + Save + Save + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Error + + + + No patch selected. + No patch selected. + + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + + No patch file found for the current serial. + No patch file found for the current serial. + + + + Unable to open the file for reading. + Unable to open the file for reading. + + + + Unable to open the file for writing. + Unable to open the file for writing. + + + + Failed to parse XML: + Failed to parse XML: + + + + Success + Success + + + + Options saved successfully. + Options saved successfully. + + + + Invalid Source + Invalid Source + + + + The selected source is invalid. + The selected source is invalid. + + + + File Exists + File Exists + + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + + Failed to save file: + Failed to save file: + + + + Failed to download file: + Failed to download file: + + + + Cheats Not Found + Cheats Not Found + + + + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + + Failed to save: + Failed to save: + + + + Failed to download: + Failed to download: + + + + Download Complete + Download Complete + + + + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. It may be necessary to update the game. + + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + + Failed to open file: + Failed to open file: + + + + XML ERROR: + XML ERROR: + + + + Failed to open files.json for writing + Failed to open files.json for writing + + + + Author: + Author: + + + + Directory does not exist: + Directory does not exist: + + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + + Name: + Name: + Can't apply cheats before the game is started @@ -931,6 +973,111 @@ Close Close + + + Point your mouse at an option to display its description. + Point your mouse at an option to display its description. + + + + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + + emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. + + + + fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + + + + showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + + + + ps4proCheckBox + Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. + + + + userName + Username:\nSets the PS4's account username, which may be displayed by some games. + + + + logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + + + + logFilter + Log Filter: Filters the log to only print specific information. Examples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + + updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + + + GUIgroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + + + + graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + + + + resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + + + + heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + + + + dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + + + + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + + dumpPM4CheckBox + Enable PM4 Dumping:\nFor the sake of technical debugging, saves raw GPU instruction data to a folder as the emulator processes it. + + + + debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + + + + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + + + + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + + + + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + GameListFrame @@ -975,4 +1122,132 @@ Path + + CheckUpdate + + + Auto Updater + Auto Updater + + + + Error + Error + + + + Network error: + Network error: + + + + Failed to parse update information. + Failed to parse update information. + + + + No pre-releases found. + No pre-releases found. + + + + Invalid release data. + Invalid release data. + + + + No download URL found for the specified asset. + No download URL found for the specified asset. + + + + Your version is already up to date! + Your version is already up to date! + + + + Update Available + Update Available + + + + Update Channel + Update Channel + + + + Current Version + Current Version + + + + Latest Version + Latest Version + + + + Do you want to update? + Do you want to update? + + + + Show Changelog + Show Changelog + + + + Check for Updates at Startup + Check for Updates at Startup + + + + Update + Update + + + + No + No + + + + Hide Changelog + Hide Changelog + + + + Changes + Changes + + + + Network error occurred while trying to access the URL + Network error occurred while trying to access the URL + + + + Download Complete + Download Complete + + + + The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. + + + + Failed to save the update file at + Failed to save the update file at + + + + Starting Update... + Starting Update... + + + + Failed to create the update script file + Failed to create the update script file + + \ No newline at end of file diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 2c86ec0a0..cac8ebbfc 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Apgaulės / Pleistrai - Cheats / Patches - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Atsisiųsti Apgaules / Pleistrus - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + - MainWindow + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Apgaulės / Pleistrai + Cheats / Patches + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Patikrinti atnaujinimus + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Atsisiųsti Apgaules / Pleistrus + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Pagalba + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Atnaujinimas + + + + Check for Updates at Startup + Tikrinti naujinimus paleidus + + + + Update Channel + Atnaujinimo Kanalas + + + + Check for Updates + Patikrinkite atnaujinimus + + + + GUI Settings + GUI Nustatymai + + + + Play title music + Groti antraštės muziką + + + + Volume + Garsumas + + + + MainWindow Game List Žaidimų sąrašas - - - * Unsupported Vulkan Version - * Nepalaikoma Vulkan versija - - - - Download Cheats For All Installed Games - Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams - - - - Download Patches For All Games - Atsisiųsti pataisas visiems žaidimams - - - - Download Complete - Atsisiuntimas baigtas - - - - You have downloaded cheats for all the games you have installed. - Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. - - - - Patches Downloaded Successfully! - Pataisos sėkmingai atsisiųstos! - - - - All Patches available for all games have been downloaded. - Visos pataisos visiems žaidimams buvo atsisiųstos. - - - - Games: - Žaidimai: - - - - PKG File (*.PKG) - PKG failas (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF failai (*.bin *.elf *.oelf) - - - - Game Boot - Žaidimo paleidimas - - - - Only one file can be selected! - Galite pasirinkti tik vieną failą! - - - - PKG Extraction - PKG ištraukimas - - - - Patch detected! - Rasta atnaujinimą! - - - - PKG and Game versions match: - PKG ir žaidimo versijos sutampa: - - - - Would you like to overwrite? - Ar norite perrašyti? - - - - PKG Version %1 is older than installed version: - PKG versija %1 yra senesnė nei įdiegta versija: - - - - Game is installed: - Žaidimas įdiegtas: - - - - Would you like to install Patch: - Ar norite įdiegti atnaujinimą: - - - - DLC Installation - DLC diegimas - - - - Would you like to install DLC: %1? - Ar norite įdiegti DLC: %1? - - - - DLC already installed: - DLC jau įdiegtas: - - - - Game already installed - Žaidimas jau įdiegtas - - - - PKG is a patch, please install the game first! - PKG yra pataisa, prašome pirmiausia įdiegti žaidimą! - - - - PKG ERROR - PKG KLAIDA - - - - Extracting PKG %1/%2 - Ekstrakcinis PKG %1/%2 - - - - Extraction Finished - Ekstrakcija baigta - - - - Game successfully installed at %1 - Žaidimas sėkmingai įdiegtas %1 - - - - File doesn't appear to be a valid PKG file - Failas atrodo, kad nėra galiojantis PKG failas - + + + * Unsupported Vulkan Version + * Nepalaikoma Vulkan versija + + + + Download Cheats For All Installed Games + Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams + + + + Download Patches For All Games + Atsisiųsti pataisas visiems žaidimams + + + + Download Complete + Atsisiuntimas baigtas + + + + You have downloaded cheats for all the games you have installed. + Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. + + + + Patches Downloaded Successfully! + Pataisos sėkmingai atsisiųstos! + + + + All Patches available for all games have been downloaded. + Visos pataisos visiems žaidimams buvo atsisiųstos. + + + + Games: + Žaidimai: + + + + PKG File (*.PKG) + PKG failas (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF failai (*.bin *.elf *.oelf) + + + + Game Boot + Žaidimo paleidimas + + + + Only one file can be selected! + Galite pasirinkti tik vieną failą! + + + + PKG Extraction + PKG ištraukimas + + + + Patch detected! + Rasta atnaujinimą! + + + + PKG and Game versions match: + PKG ir žaidimo versijos sutampa: + + + + Would you like to overwrite? + Ar norite perrašyti? + + + + PKG Version %1 is older than installed version: + PKG versija %1 yra senesnė nei įdiegta versija: + + + + Game is installed: + Žaidimas įdiegtas: + + + + Would you like to install Patch: + Ar norite įdiegti atnaujinimą: + + + + DLC Installation + DLC diegimas + + + + Would you like to install DLC: %1? + Ar norite įdiegti DLC: %1? + + + + DLC already installed: + DLC jau įdiegtas: + + + + Game already installed + Žaidimas jau įdiegtas + + + + PKG is a patch, please install the game first! + PKG yra pataisa, prašome pirmiausia įdiegti žaidimą! + + + + PKG ERROR + PKG KLAIDA + + + + Extracting PKG %1/%2 + Ekstrakcinis PKG %1/%2 + + + + Extraction Finished + Ekstrakcija baigta + + + + Game successfully installed at %1 + Žaidimas sėkmingai įdiegtas %1 + + + + File doesn't appear to be a valid PKG file + Failas atrodo, kad nėra galiojantis PKG failas + - CheatsPatches - - - Cheats / Patches - Sukčiavimai / Pataisos - - - - defaultTextEdit_MSG - Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nuotrauka neprieinama - - - - Serial: - Seriinis numeris: - - - - Version: - Versija: - - - - Size: - Dydis: - - - - Select Cheat File: - Pasirinkite sukčiavimo failą: - - - - Repository: - Saugykla: - - - - Download Cheats - Atsisiųsti sukčiavimus - - - - Delete File - Pašalinti failą - - - - No files selected. - Failai nepasirinkti. - - - - You can delete the cheats you don't want after downloading them. - Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. - - - - Do you want to delete the selected file?\n%1 - Ar norite ištrinti pasirinktą failą?\n%1 - - - - Select Patch File: - Pasirinkite pataisos failą: - - - - Download Patches - Atsisiųsti pataisas - - - - Save - Įrašyti - - - - Cheats - Sukčiavimai - - - - Patches - Pataisos - - - - Error - Klaida - - - - No patch selected. - Nieko nepataisyta. - - - - Unable to open files.json for reading. - Neįmanoma atidaryti files.json skaitymui. - - - - No patch file found for the current serial. - Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. - - - - Unable to open the file for reading. - Neįmanoma atidaryti failo skaitymui. - - - - Unable to open the file for writing. - Neįmanoma atidaryti failo rašymui. - - - - Failed to parse XML: - Nepavyko išanalizuoti XML: - - - - Success - Sėkmė - - - - Options saved successfully. - Nustatymai sėkmingai išsaugoti. - - - - Invalid Source - Netinkamas šaltinis - - - - The selected source is invalid. - Pasirinktas šaltinis yra netinkamas. - - - - File Exists - Failas egzistuoja - - - - File already exists. Do you want to replace it? - Failas jau egzistuoja. Ar norite jį pakeisti? - - - - Failed to save file: - Nepavyko išsaugoti failo: - - - - Failed to download file: - Nepavyko atsisiųsti failo: - - - - Cheats Not Found - Sukčiavimai nerasti - - - - CheatsNotFound_MSG - Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. - - - - Cheats Downloaded Successfully - Sukčiavimai sėkmingai atsisiųsti - - - - CheatsDownloadedSuccessfully_MSG - Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. - - - - Failed to save: - Nepavyko išsaugoti: - - - - Failed to download: - Nepavyko atsisiųsti: - - - - Download Complete - Atsisiuntimas baigtas - - - - DownloadComplete_MSG - Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. Gali prireikti atnaujinti žaidimą. - - - - Failed to parse JSON data from HTML. - Nepavyko išanalizuoti JSON duomenų iš HTML. - - - - Failed to retrieve HTML page. - Nepavyko gauti HTML puslapio. - - - - Failed to open file: - Nepavyko atidaryti failo: - - - - XML ERROR: - XML KLAIDA: - - - - Failed to open files.json for writing - Nepavyko atidaryti files.json rašymui - - - - Author: - Autorius: - - - - Directory does not exist: - Katalogas neegzistuoja: - - - - Failed to open files.json for reading. - Nepavyko atidaryti files.json skaitymui. - - - - Name: - Pavadinimas: - + CheatsPatches + + + Cheats / Patches + Sukčiavimai / Pataisos + + + + defaultTextEdit_MSG + Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Nuotrauka neprieinama + + + + Serial: + Seriinis numeris: + + + + Version: + Versija: + + + + Size: + Dydis: + + + + Select Cheat File: + Pasirinkite sukčiavimo failą: + + + + Repository: + Saugykla: + + + + Download Cheats + Atsisiųsti sukčiavimus + + + + Delete File + Pašalinti failą + + + + No files selected. + Failai nepasirinkti. + + + + You can delete the cheats you don't want after downloading them. + Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. + + + + Do you want to delete the selected file?\n%1 + Ar norite ištrinti pasirinktą failą?\n%1 + + + + Select Patch File: + Pasirinkite pataisos failą: + + + + Download Patches + Atsisiųsti pataisas + + + + Save + Įrašyti + + + + Cheats + Sukčiavimai + + + + Patches + Pataisos + + + + Error + Klaida + + + + No patch selected. + Nieko nepataisyta. + + + + Unable to open files.json for reading. + Neįmanoma atidaryti files.json skaitymui. + + + + No patch file found for the current serial. + Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. + + + + Unable to open the file for reading. + Neįmanoma atidaryti failo skaitymui. + + + + Unable to open the file for writing. + Neįmanoma atidaryti failo rašymui. + + + + Failed to parse XML: + Nepavyko išanalizuoti XML: + + + + Success + Sėkmė + + + + Options saved successfully. + Nustatymai sėkmingai išsaugoti. + + + + Invalid Source + Netinkamas šaltinis + + + + The selected source is invalid. + Pasirinktas šaltinis yra netinkamas. + + + + File Exists + Failas egzistuoja + + + + File already exists. Do you want to replace it? + Failas jau egzistuoja. Ar norite jį pakeisti? + + + + Failed to save file: + Nepavyko išsaugoti failo: + + + + Failed to download file: + Nepavyko atsisiųsti failo: + + + + Cheats Not Found + Sukčiavimai nerasti + + + + CheatsNotFound_MSG + Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. + + + + Cheats Downloaded Successfully + Sukčiavimai sėkmingai atsisiųsti + + + + CheatsDownloadedSuccessfully_MSG + Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. + + + + Failed to save: + Nepavyko išsaugoti: + + + + Failed to download: + Nepavyko atsisiųsti: + + + + Download Complete + Atsisiuntimas baigtas + + + + DownloadComplete_MSG + Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. Gali prireikti atnaujinti žaidimą. + + + + Failed to parse JSON data from HTML. + Nepavyko išanalizuoti JSON duomenų iš HTML. + + + + Failed to retrieve HTML page. + Nepavyko gauti HTML puslapio. + + + + Failed to open file: + Nepavyko atidaryti failo: + + + + XML ERROR: + XML KLAIDA: + + + + Failed to open files.json for writing + Nepavyko atidaryti files.json rašymui + + + + Author: + Autorius: + + + + Directory does not exist: + Katalogas neegzistuoja: + + + + Failed to open files.json for reading. + Nepavyko atidaryti files.json skaitymui. + + + + Name: + Pavadinimas: + Can't apply cheats before the game is started @@ -931,6 +973,111 @@ Close Uždaryti + + + Point your mouse at an option to display its description. + Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. + + + + consoleLanguageGroupBox + Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. + + + + emulatorLanguageGroupBox + Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. + + + + fullscreenCheckBox + Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. + + + + showSplashCheckBox + Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). + + + + ps4proCheckBox + Ar PS4 Pro:\nPadaro, kad emuliatorius veiktų kaip PS4 PRO, kas gali įjungti specialias funkcijas žaidimuose, kurie tai palaiko. + + + + userName + Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. + + + + logTypeGroupBox + Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. + + + + logFilter + Žurnalo filtras: Filtruojamas žurnalas, kad būtų spausdinama tik konkreti informacija. Pavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. + + + + updaterGroupBox + Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. + + + + GUIgroupBox + Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. + + + + graphicsAdapterGroupBox + Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. + + + + resolutionLayout + Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. + + + + heightDivider + Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! + + + + dumpShadersCheckBox + Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. + + + + nullGpuCheckBox + Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. + + + + dumpPM4CheckBox + Įjungti PM4 išmetimą:\nTechninio derinimo tikslais saugo žalius GPU nurodymų duomenis į aplanką, kai emuliatorius juos apdoroja. + + + + debugDump + Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. + + + + vkValidationCheckBox + Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + + + + vkSyncValidationCheckBox + Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + + + + rdocCheckBox + Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. + GameListFrame @@ -975,4 +1122,132 @@ Kelias + + CheckUpdate + + + Auto Updater + Automatinis atnaujinimas + + + + Error + Klaida + + + + Network error: + Tinklo klaida: + + + + Failed to parse update information. + Nepavyko išanalizuoti atnaujinimo informacijos. + + + + No pre-releases found. + Išankstinių leidimų nerasta. + + + + Invalid release data. + Neteisingi leidimo duomenys. + + + + No download URL found for the specified asset. + Nerasta atsisiuntimo URL nurodytam turtui. + + + + Your version is already up to date! + Jūsų versija jau atnaujinta! + + + + Update Available + Prieinama atnaujinimas + + + + Update Channel + Atnaujinimo Kanalas + + + + Current Version + Esama versija + + + + Latest Version + Paskutinė versija + + + + Do you want to update? + Ar norite atnaujinti? + + + + Show Changelog + Rodyti pakeitimų sąrašą + + + + Check for Updates at Startup + Tikrinti naujinimus paleidus + + + + Update + Atnaujinti + + + + No + Ne + + + + Hide Changelog + Slėpti pakeitimų sąrašą + + + + Changes + Pokyčiai + + + + Network error occurred while trying to access the URL + Tinklo klaida bandant pasiekti URL + + + + Download Complete + Atsisiuntimas baigtas + + + + The update has been downloaded, press OK to install. + Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte. + + + + Failed to save the update file at + Nepavyko išsaugoti atnaujinimo failo + + + + Starting Update... + Pradedama atnaujinimas... + + + + Failed to create the update script file + Nepavyko sukurti atnaujinimo scenarijaus failo + + \ No newline at end of file diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index b62791e05..e0bc1a550 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Juks / Oppdateringer - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Last ned Juks / Oppdateringer - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + - - MainWindow + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Juks / Oppdateringer + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Sjekk etter oppdateringer + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Last ned Juks / Oppdateringer + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Hjelp + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Oppdatering + + + + Check for Updates at Startup + Sjekk etter oppdateringer ved oppstart + + + + Update Channel + Oppdateringskanal + + + + Check for Updates + Sjekk for oppdateringer + + + + GUI Settings + GUI-Innstillinger + + + + Play title music + Spill tittelmusikk + + + + Volume + Volum + + + + MainWindow Game List Spilliste - - - * Unsupported Vulkan Version - * Ikke støttet Vulkan-versjon - - - - Download Cheats For All Installed Games - Last ned jukser for alle installerte spill - - - - Download Patches For All Games - Last ned oppdateringer for alle spill - - - - Download Complete - Nedlasting fullført - - - - You have downloaded cheats for all the games you have installed. - Du har lastet ned jukser for alle spillene du har installert. - - - - Patches Downloaded Successfully! - Oppdateringer lastet ned vellykket! - - - - All Patches available for all games have been downloaded. - Alle oppdateringer tilgjengelige for alle spillene har blitt lastet ned. - - - - Games: - Spill: - - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - - Game Boot - Spilloppstart - - - - Only one file can be selected! - Kun én fil kan velges! - - - - PKG Extraction - PKG-ekstraksjon - - - - Patch detected! - Oppdatering oppdaget! - - - - PKG and Game versions match: - PKG- og spillversjoner stemmer overens: - - - - Would you like to overwrite? - Ønsker du å overskrive? - - - - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: - - - - Game is installed: - Spillet er installert: - - - - Would you like to install Patch: - Ønsker du å installere oppdateringen: - - - - DLC Installation - DLC-installasjon - - - - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? - - - - DLC already installed: - DLC allerede installert: - - - - Game already installed - Spillet er allerede installert - - - - PKG is a patch, please install the game first! - PKG er en oppdatering, vennligst installer spillet først! - - - - PKG ERROR - PKG FEIL - - - - Extracting PKG %1/%2 - Ekstraherer PKG %1/%2 - - - - Extraction Finished - Ekstrahering fullført - - - - Game successfully installed at %1 - Spillet ble installert vellykket på %1 - - - - File doesn't appear to be a valid PKG file - Fil ser ikke ut til å være en gyldig PKG-fil - - - - CheatsPatches - - - Cheats / Patches - Jukser / Oppdateringer - - - - defaultTextEdit_MSG - Cheats/Patches er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned cheats individuelt ved å velge depotet og klikke på nedlastingsknappen.\nPå fanen Patches kan du laste ned alle patches samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Cheats/Patches,\nvær vennlig å rapportere problemer til cheat-utvikleren.\n\nHar du laget en ny cheat? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Ingen bilde tilgjengelig - - - - Serial: - Serienummer: - - - - Version: - Versjon: - - - - Size: - Størrelse: - - - - Select Cheat File: - Velg juksfil: - - - - Repository: - Depot: - - - - Download Cheats - Last ned jukser - - - - Delete File - Slett fil - - - - No files selected. - Ingen filer valgt. - - - - You can delete the cheats you don't want after downloading them. - Du kan slette jukser du ikke ønsker etter å ha lastet dem ned. - - - - Do you want to delete the selected file?\n%1 - Ønsker du å slette den valgte filen?\n%1 - - - - Select Patch File: - Velg oppdateringsfil: - - - - Download Patches - Last ned oppdateringer - - - - Save - Lagre - - - - Cheats - Jukser - - - - Patches - Oppdateringer - - - - Error - Feil - - - - No patch selected. - Ingen oppdatering valgt. - - - - Unable to open files.json for reading. - Kan ikke åpne files.json for lesing. - - - - No patch file found for the current serial. - Ingen oppdateringsfil funnet for det aktuelle serienummeret. - - - - Unable to open the file for reading. - Kan ikke åpne filen for lesing. - - - - Unable to open the file for writing. - Kan ikke åpne filen for skriving. - - - - Failed to parse XML: - Feil ved parsing av XML: - - - - Success - Vellykket - - - - Options saved successfully. - Alternativer lagret vellykket. - - - - Invalid Source - Ugyldig kilde - - - - The selected source is invalid. - Den valgte kilden er ugyldig. - - - - File Exists - Fil eksisterer - - - - File already exists. Do you want to replace it? - Fil eksisterer allerede. Ønsker du å erstatte den? - - - - Failed to save file: - Kunne ikke lagre fil: - - - - Failed to download file: - Kunne ikke laste ned fil: - - - - Cheats Not Found - Jukser ikke funnet - - - - CheatsNotFound_MSG - Ingen jukser funnet for dette spillet i denne versjonen av det valgte depotet,prøv et annet depot eller en annen versjon av spillet. - - - - Cheats Downloaded Successfully - Jukser lastet ned vellykket - - - - CheatsDownloadedSuccessfully_MSG - Du har lastet ned jukser vellykket for denne versjonen av spillet fra det valgte depotet. Du kan prøve å laste ned fra et annet depot, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. - - - - Failed to save: - Kunne ikke lagre: - - - - Failed to download: - Kunne ikke laste ned: - - - - Download Complete - Nedlasting fullført - - - - DownloadComplete_MSG - Oppdateringer lastet ned vellykket! Alle oppdateringer tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med jukser. Hvis oppdateringen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. Det kan være nødvendig å oppdatere spillet. - - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - - Failed to open file: - Kunne ikke åpne fil: - - - - XML ERROR: - XML FEIL: - - - - Failed to open files.json for writing - Kunne ikke åpne files.json for skriving - - - - Author: - Forfatter: - - - - Directory does not exist: - Direktory eksisterer ikke: - - - - Failed to open files.json for reading. - Kunne ikke åpne files.json for lesing. - - - - Name: - Navn: - + + + * Unsupported Vulkan Version + * Ikke støttet Vulkan-versjon + + + + Download Cheats For All Installed Games + Last ned jukser for alle installerte spill + + + + Download Patches For All Games + Last ned oppdateringer for alle spill + + + + Download Complete + Nedlasting fullført + + + + You have downloaded cheats for all the games you have installed. + Du har lastet ned jukser for alle spillene du har installert. + + + + Patches Downloaded Successfully! + Oppdateringer lastet ned vellykket! + + + + All Patches available for all games have been downloaded. + Alle oppdateringer tilgjengelige for alle spillene har blitt lastet ned. + + + + Games: + Spill: + + + + PKG File (*.PKG) + PKG-fil (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + + Game Boot + Spilloppstart + + + + Only one file can be selected! + Kun én fil kan velges! + + + + PKG Extraction + PKG-ekstraksjon + + + + Patch detected! + Oppdatering oppdaget! + + + + PKG and Game versions match: + PKG- og spillversjoner stemmer overens: + + + + Would you like to overwrite? + Ønsker du å overskrive? + + + + PKG Version %1 is older than installed version: + PKG-versjon %1 er eldre enn installert versjon: + + + + Game is installed: + Spillet er installert: + + + + Would you like to install Patch: + Ønsker du å installere oppdateringen: + + + + DLC Installation + DLC-installasjon + + + + Would you like to install DLC: %1? + Ønsker du å installere DLC: %1? + + + + DLC already installed: + DLC allerede installert: + + + + Game already installed + Spillet er allerede installert + + + + PKG is a patch, please install the game first! + PKG er en oppdatering, vennligst installer spillet først! + + + + PKG ERROR + PKG FEIL + + + + Extracting PKG %1/%2 + Ekstraherer PKG %1/%2 + + + + Extraction Finished + Ekstrahering fullført + + + + Game successfully installed at %1 + Spillet ble installert vellykket på %1 + + + + File doesn't appear to be a valid PKG file + Fil ser ikke ut til å være en gyldig PKG-fil + + + + CheatsPatches + + + Cheats / Patches + Jukser / Oppdateringer + + + + defaultTextEdit_MSG + Cheats/Patches er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned cheats individuelt ved å velge depotet og klikke på nedlastingsknappen.\nPå fanen Patches kan du laste ned alle patches samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Cheats/Patches,\nvær vennlig å rapportere problemer til cheat-utvikleren.\n\nHar du laget en ny cheat? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Ingen bilde tilgjengelig + + + + Serial: + Serienummer: + + + + Version: + Versjon: + + + + Size: + Størrelse: + + + + Select Cheat File: + Velg juksfil: + + + + Repository: + Depot: + + + + Download Cheats + Last ned jukser + + + + Delete File + Slett fil + + + + No files selected. + Ingen filer valgt. + + + + You can delete the cheats you don't want after downloading them. + Du kan slette jukser du ikke ønsker etter å ha lastet dem ned. + + + + Do you want to delete the selected file?\n%1 + Ønsker du å slette den valgte filen?\n%1 + + + + Select Patch File: + Velg oppdateringsfil: + + + + Download Patches + Last ned oppdateringer + + + + Save + Lagre + + + + Cheats + Jukser + + + + Patches + Oppdateringer + + + + Error + Feil + + + + No patch selected. + Ingen oppdatering valgt. + + + + Unable to open files.json for reading. + Kan ikke åpne files.json for lesing. + + + + No patch file found for the current serial. + Ingen oppdateringsfil funnet for det aktuelle serienummeret. + + + + Unable to open the file for reading. + Kan ikke åpne filen for lesing. + + + + Unable to open the file for writing. + Kan ikke åpne filen for skriving. + + + + Failed to parse XML: + Feil ved parsing av XML: + + + + Success + Vellykket + + + + Options saved successfully. + Alternativer lagret vellykket. + + + + Invalid Source + Ugyldig kilde + + + + The selected source is invalid. + Den valgte kilden er ugyldig. + + + + File Exists + Fil eksisterer + + + + File already exists. Do you want to replace it? + Fil eksisterer allerede. Ønsker du å erstatte den? + + + + Failed to save file: + Kunne ikke lagre fil: + + + + Failed to download file: + Kunne ikke laste ned fil: + + + + Cheats Not Found + Jukser ikke funnet + + + + CheatsNotFound_MSG + Ingen jukser funnet for dette spillet i denne versjonen av det valgte depotet,prøv et annet depot eller en annen versjon av spillet. + + + + Cheats Downloaded Successfully + Jukser lastet ned vellykket + + + + CheatsDownloadedSuccessfully_MSG + Du har lastet ned jukser vellykket for denne versjonen av spillet fra det valgte depotet. Du kan prøve å laste ned fra et annet depot, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. + + + + Failed to save: + Kunne ikke lagre: + + + + Failed to download: + Kunne ikke laste ned: + + + + Download Complete + Nedlasting fullført + + + + DownloadComplete_MSG + Oppdateringer lastet ned vellykket! Alle oppdateringer tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med jukser. Hvis oppdateringen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. Det kan være nødvendig å oppdatere spillet. + + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + + Failed to open file: + Kunne ikke åpne fil: + + + + XML ERROR: + XML FEIL: + + + + Failed to open files.json for writing + Kunne ikke åpne files.json for skriving + + + + Author: + Forfatter: + + + + Directory does not exist: + Direktory eksisterer ikke: + + + + Failed to open files.json for reading. + Kunne ikke åpne files.json for lesing. + + + + Name: + Navn: + Can't apply cheats before the game is started Kan ikke bruke juksetriks før spillet er startet. - + SettingsDialog @@ -931,6 +973,111 @@ Close Lukk + + + Point your mouse at an option to display its description. + Hold musen over et valg for at vise beskrivelsen. + + + + consoleLanguageGroupBox + Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. + + + + emulatorLanguageGroupBox + Emulatorspråk:\nAngir språket for emulatorens brukergrensesnitt. + + + + fullscreenCheckBox + Aktiver fullskjerm:\nSetter automatisk spillvinduet i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. + + + + showSplashCheckBox + Vis startskjerm:\nViser spillets startskjerm (et spesialbilde) når spillet starter. + + + + ps4proCheckBox + Er PS4 Pro:\nFår emulatoren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter det. + + + + userName + Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. + + + + logTypeGroupBox + Logtype:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter på emulering. + + + + logFilter + Loggfilter: Filtrerer loggen for å kun skrive ut spesifikk informasjon. Eksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. + + + + updaterGroupBox + Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. + + + + GUIgroupBox + Spille tittelmusikk:\nHvis et spill støtter det, aktiverer det å spille spesiell musikk når du velger spillet i GUI. + + + + graphicsAdapterGroupBox + Grafikkdevice:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å bestemme det automatisk. + + + + resolutionLayout + Bredde/Høyde:\nAngir størrelsen på emulatorkvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. + + + + heightDivider + Vblank divider:\nBilderaten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten på spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! + + + + dumpShadersCheckBox + Aktiver shaderdumping:\nFor teknisk feilsøking lagrer shaderne fra spillet i en mappe mens de gjengis. + + + + nullGpuCheckBox + Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillrendering som om det ikke var noe grafikkort. + + + + dumpPM4CheckBox + Aktiver PM4 dumping:\nFor teknisk feilsøking lagrer rå GPU-instruksjonsdata i en mappe mens emulatoren behandler dem. + + + + debugDump + Aktiver feilsøking dumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. + + + + vkValidationCheckBox + Aktiver Vulkan valideringslag:\nAktiverer et system som validerer tilstanden til Vulkan-rendereren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emuleringens oppførsel. + + + + vkSyncValidationCheckBox + Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer timingen av Vulkan-renderingsoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emuleringens oppførsel. + + + + rdocCheckBox + Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med Renderdoc for å tillate opptak og analyse av det nåværende renderte bildet. + GameListFrame @@ -975,4 +1122,132 @@ Sti + + CheckUpdate + + + Auto Updater + Automatisk oppdaterer + + + + Error + Feil + + + + Network error: + Nettverksfeil: + + + + Failed to parse update information. + Kunne ikke analysere oppdateringsinformasjonen. + + + + No pre-releases found. + Fant ingen forhåndsutgivelser. + + + + Invalid release data. + Ugyldige utgivelsesdata. + + + + No download URL found for the specified asset. + Ingen nedlastings-URL funnet for den spesifiserte ressursen. + + + + Your version is already up to date! + Din versjon er allerede oppdatert! + + + + Update Available + Oppdatering tilgjengelig + + + + Update Channel + Oppdateringskanal + + + + Current Version + Gjeldende versjon + + + + Latest Version + Nyeste versjon + + + + Do you want to update? + Vil du oppdatere? + + + + Show Changelog + Vis endringslogg + + + + Check for Updates at Startup + Sjekk etter oppdateringer ved oppstart + + + + Update + Oppdater + + + + No + Nei + + + + Hide Changelog + Skjul endringslogg + + + + Changes + Endringer + + + + Network error occurred while trying to access the URL + Nettverksfeil oppstod mens du prøvde å få tilgang til URL + + + + Download Complete + Nedlasting fullført + + + + The update has been downloaded, press OK to install. + Oppdateringen har blitt lastet ned, trykk OK for å installere. + + + + Failed to save the update file at + Kunne ikke lagre oppdateringsfilen på + + + + Starting Update... + Starter oppdatering... + + + + Failed to create the update script file + Kunne ikke opprette oppdateringsskriptfilen + + \ No newline at end of file diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 3d5edfc5d..29a60ecc8 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Cheats / Patches - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Download Cheats/Patches - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + - - MainWindow + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Cheats / Patches + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Controleren op updates + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Download Cheats/Patches + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Help + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Bijwerken + + + + Check for Updates at Startup + Bij opstart op updates controleren + + + + Update Channel + Updatekanaal + + + + Check for Updates + Controleren op updates + + + + GUI Settings + GUI-Instellingen + + + + Play title music + Titelmuziek afspelen + + + + Volume + Volume + + + + MainWindow Game List Lijst met spellen - - - * Unsupported Vulkan Version - * Niet ondersteunde Vulkan-versie - - - - Download Cheats For All Installed Games - Download cheats voor alle geïnstalleerde spellen - - - - Download Patches For All Games - Download patches voor alle spellen - - - - Download Complete - Download voltooid - - - - You have downloaded cheats for all the games you have installed. - Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. - - - - Patches Downloaded Successfully! - Patches succesvol gedownload! - - - - All Patches available for all games have been downloaded. - Alle patches voor alle spellen zijn gedownload. - - - - Games: - Spellen: - - - - PKG File (*.PKG) - PKG-bestand (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-bestanden (*.bin *.elf *.oelf) - - - - Game Boot - Spelopstart - - - - Only one file can be selected! - Je kunt slechts één bestand selecteren! - - - - PKG Extraction - PKG-extractie - - - - Patch detected! - Patch gedetecteerd! - - - - PKG and Game versions match: - PKG- en gameversies komen overeen: - - - - Would you like to overwrite? - Wilt u overschrijven? - - - - PKG Version %1 is older than installed version: - PKG-versie %1 is ouder dan de geïnstalleerde versie: - - - - Game is installed: - Game is geïnstalleerd: - - - - Would you like to install Patch: - Wilt u de patch installeren: - - - - DLC Installation - DLC-installatie - - - - Would you like to install DLC: %1? - Wilt u DLC installeren: %1? - - - - DLC already installed: - DLC al geïnstalleerd: - - - - Game already installed - Game al geïnstalleerd - - - - PKG is a patch, please install the game first! - PKG is een patch, installeer eerst het spel! - - - - PKG ERROR - PKG FOUT - - - - Extracting PKG %1/%2 - PKG %1/%2 aan het extraheren - - - - Extraction Finished - Extractie voltooid - - - - Game successfully installed at %1 - Spel succesvol geïnstalleerd op %1 - - - - File doesn't appear to be a valid PKG file - Het bestand lijkt geen geldig PKG-bestand te zijn - - - - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Geen afbeelding beschikbaar - - - - Serial: - Serie: - - - - Version: - Versie: - - - - Size: - Grootte: - - - - Select Cheat File: - Selecteer cheatbestand: - - - - Repository: - Repository: - - - - Download Cheats - Download cheats - - - - Delete File - Bestand verwijderen - - - - No files selected. - Geen bestanden geselecteerd. - - - - You can delete the cheats you don't want after downloading them. - Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. - - - - Do you want to delete the selected file?\n%1 - Wil je het geselecteerde bestand verwijderen?\n%1 - - - - Select Patch File: - Selecteer patchbestand: - - - - Download Patches - Download patches - - - - Save - Opslaan - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Fout - - - - No patch selected. - Geen patch geselecteerd. - - - - Unable to open files.json for reading. - Kan files.json niet openen voor lezen. - - - - No patch file found for the current serial. - Geen patchbestand gevonden voor het huidige serienummer. - - - - Unable to open the file for reading. - Kan het bestand niet openen voor lezen. - - - - Unable to open the file for writing. - Kan het bestand niet openen voor schrijven. - - - - Failed to parse XML: - XML parsing mislukt: - - - - Success - Succes - - - - Options saved successfully. - Opties succesvol opgeslagen. - - - - Invalid Source - Ongeldige bron - - - - The selected source is invalid. - De geselecteerde bron is ongeldig. - - - - File Exists - Bestand bestaat - - - - File already exists. Do you want to replace it? - Bestand bestaat al. Wil je het vervangen? - - - - Failed to save file: - Kan bestand niet opslaan: - - - - Failed to download file: - Kan bestand niet downloaden: - - - - Cheats Not Found - Cheats niet gevonden - - - - CheatsNotFound_MSG - Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. - - - - Cheats Downloaded Successfully - Cheats succesvol gedownload - - - - CheatsDownloadedSuccessfully_MSG - Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. - - - - Failed to save: - Opslaan mislukt: - - - - Failed to download: - Downloaden mislukt: - - - - Download Complete - Download voltooid - - - - DownloadComplete_MSG - Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. Het kan nodig zijn om het spel bij te werken. - - - - Failed to parse JSON data from HTML. - Kan JSON-gegevens uit HTML niet parseren. - - - - Failed to retrieve HTML page. - Kan HTML-pagina niet ophalen. - - - - Failed to open file: - Kan bestand niet openen: - - - - XML ERROR: - XML FOUT: - - - - Failed to open files.json for writing - Kan files.json niet openen voor schrijven - - - - Author: - Auteur: - - - - Directory does not exist: - Map bestaat niet: - - - - Failed to open files.json for reading. - Kan files.json niet openen voor lezen. - - - - Name: - Naam: - + + + * Unsupported Vulkan Version + * Niet ondersteunde Vulkan-versie + + + + Download Cheats For All Installed Games + Download cheats voor alle geïnstalleerde spellen + + + + Download Patches For All Games + Download patches voor alle spellen + + + + Download Complete + Download voltooid + + + + You have downloaded cheats for all the games you have installed. + Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. + + + + Patches Downloaded Successfully! + Patches succesvol gedownload! + + + + All Patches available for all games have been downloaded. + Alle patches voor alle spellen zijn gedownload. + + + + Games: + Spellen: + + + + PKG File (*.PKG) + PKG-bestand (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF-bestanden (*.bin *.elf *.oelf) + + + + Game Boot + Spelopstart + + + + Only one file can be selected! + Je kunt slechts één bestand selecteren! + + + + PKG Extraction + PKG-extractie + + + + Patch detected! + Patch gedetecteerd! + + + + PKG and Game versions match: + PKG- en gameversies komen overeen: + + + + Would you like to overwrite? + Wilt u overschrijven? + + + + PKG Version %1 is older than installed version: + PKG-versie %1 is ouder dan de geïnstalleerde versie: + + + + Game is installed: + Game is geïnstalleerd: + + + + Would you like to install Patch: + Wilt u de patch installeren: + + + + DLC Installation + DLC-installatie + + + + Would you like to install DLC: %1? + Wilt u DLC installeren: %1? + + + + DLC already installed: + DLC al geïnstalleerd: + + + + Game already installed + Game al geïnstalleerd + + + + PKG is a patch, please install the game first! + PKG is een patch, installeer eerst het spel! + + + + PKG ERROR + PKG FOUT + + + + Extracting PKG %1/%2 + PKG %1/%2 aan het extraheren + + + + Extraction Finished + Extractie voltooid + + + + Game successfully installed at %1 + Spel succesvol geïnstalleerd op %1 + + + + File doesn't appear to be a valid PKG file + Het bestand lijkt geen geldig PKG-bestand te zijn + + + + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Geen afbeelding beschikbaar + + + + Serial: + Serie: + + + + Version: + Versie: + + + + Size: + Grootte: + + + + Select Cheat File: + Selecteer cheatbestand: + + + + Repository: + Repository: + + + + Download Cheats + Download cheats + + + + Delete File + Bestand verwijderen + + + + No files selected. + Geen bestanden geselecteerd. + + + + You can delete the cheats you don't want after downloading them. + Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. + + + + Do you want to delete the selected file?\n%1 + Wil je het geselecteerde bestand verwijderen?\n%1 + + + + Select Patch File: + Selecteer patchbestand: + + + + Download Patches + Download patches + + + + Save + Opslaan + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Fout + + + + No patch selected. + Geen patch geselecteerd. + + + + Unable to open files.json for reading. + Kan files.json niet openen voor lezen. + + + + No patch file found for the current serial. + Geen patchbestand gevonden voor het huidige serienummer. + + + + Unable to open the file for reading. + Kan het bestand niet openen voor lezen. + + + + Unable to open the file for writing. + Kan het bestand niet openen voor schrijven. + + + + Failed to parse XML: + XML parsing mislukt: + + + + Success + Succes + + + + Options saved successfully. + Opties succesvol opgeslagen. + + + + Invalid Source + Ongeldige bron + + + + The selected source is invalid. + De geselecteerde bron is ongeldig. + + + + File Exists + Bestand bestaat + + + + File already exists. Do you want to replace it? + Bestand bestaat al. Wil je het vervangen? + + + + Failed to save file: + Kan bestand niet opslaan: + + + + Failed to download file: + Kan bestand niet downloaden: + + + + Cheats Not Found + Cheats niet gevonden + + + + CheatsNotFound_MSG + Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. + + + + Cheats Downloaded Successfully + Cheats succesvol gedownload + + + + CheatsDownloadedSuccessfully_MSG + Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. + + + + Failed to save: + Opslaan mislukt: + + + + Failed to download: + Downloaden mislukt: + + + + Download Complete + Download voltooid + + + + DownloadComplete_MSG + Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. Het kan nodig zijn om het spel bij te werken. + + + + Failed to parse JSON data from HTML. + Kan JSON-gegevens uit HTML niet parseren. + + + + Failed to retrieve HTML page. + Kan HTML-pagina niet ophalen. + + + + Failed to open file: + Kan bestand niet openen: + + + + XML ERROR: + XML FOUT: + + + + Failed to open files.json for writing + Kan files.json niet openen voor schrijven + + + + Author: + Auteur: + + + + Directory does not exist: + Map bestaat niet: + + + + Failed to open files.json for reading. + Kan files.json niet openen voor lezen. + + + + Name: + Naam: + Can't apply cheats before the game is started Je kunt geen cheats toepassen voordat het spel is gestart. - + SettingsDialog @@ -931,6 +973,111 @@ Close Sluiten + + + Point your mouse at an option to display its description. + Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. + + + + consoleLanguageGroupBox + Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. + + + + emulatorLanguageGroupBox + Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. + + + + fullscreenCheckBox + Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. + + + + showSplashCheckBox + Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. + + + + ps4proCheckBox + Is PS4 Pro:\nLaat de emulator zich gedragen als een PS4 PRO, wat speciale functies kan inschakelen in games die dit ondersteunen. + + + + userName + Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. + + + + logTypeGroupBox + Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. + + + + logFilter + Logfilter: Filtert het logboek om alleen specifieke informatie af te drukken. Voorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. + + + + updaterGroupBox + Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. + + + + GUIgroupBox + Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. + + + + graphicsAdapterGroupBox + Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. + + + + resolutionLayout + Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. + + + + heightDivider + Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! + + + + dumpShadersCheckBox + Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. + + + + nullGpuCheckBox + Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. + + + + dumpPM4CheckBox + PM4 dumpen inschakelen:\nVoor technische foutopsporing slaat het ruwe GPU-instructiegegevens op in een map terwijl de emulator ze verwerkt. + + + + debugDump + Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. + + + + vkValidationCheckBox + Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. + + + + vkSyncValidationCheckBox + Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. + + + + rdocCheckBox + RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. + GameListFrame @@ -975,4 +1122,132 @@ Pad + + CheckUpdate + + + Auto Updater + Automatische updater + + + + Error + Fout + + + + Network error: + Netwerkfout: + + + + Failed to parse update information. + Kon update-informatie niet parseren. + + + + No pre-releases found. + Geen pre-releases gevonden. + + + + Invalid release data. + Ongeldige releasegegevens. + + + + No download URL found for the specified asset. + Geen download-URL gevonden voor het opgegeven bestand. + + + + Your version is already up to date! + Uw versie is al up-to-date! + + + + Update Available + Update beschikbaar + + + + Update Channel + Updatekanaal + + + + Current Version + Huidige versie + + + + Latest Version + Laatste versie + + + + Do you want to update? + Wilt u updaten? + + + + Show Changelog + Toon changelog + + + + Check for Updates at Startup + Bij opstart op updates controleren + + + + Update + Bijwerken + + + + No + Nee + + + + Hide Changelog + Verberg changelog + + + + Changes + Wijzigingen + + + + Network error occurred while trying to access the URL + Netwerkfout opgetreden tijdens toegang tot de URL + + + + Download Complete + Download compleet + + + + The update has been downloaded, press OK to install. + De update is gedownload, druk op OK om te installeren. + + + + Failed to save the update file at + Kon het updatebestand niet opslaan op + + + + Starting Update... + Starten van update... + + + + Failed to create the update script file + Kon het update-scriptbestand niet maken + + \ No newline at end of file diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index af8330bbd..bd772b0fe 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - O programie - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. - + + AboutDialog + + + About shadPS4 + O programie + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. + - ElfViewer - - - Open Folder - Otwórz folder - + ElfViewer + + + Open Folder + Otwórz folder + - GameInfoClass - - - Loading game list, please wait :3 - Ładowanie listy gier, proszę poczekaj :3 - - - - Cancel - Anuluj - - - - Loading... - Ładowanie... - + GameInfoClass + + + Loading game list, please wait :3 + Ładowanie listy gier, proszę poczekaj :3 + + + + Cancel + Anuluj + + + + Loading... + Ładowanie... + - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Wybierz katalog - - - - Directory to install games - Katalog do instalacji gier - - - - Browse - Przeglądaj - - - - Error - Błąd - - - - The value for location to install games is not valid. - Podana ścieżka do instalacji gier nie jest prawidłowa. - + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Wybierz katalog + + + + Directory to install games + Katalog do instalacji gier + + + + Browse + Przeglądaj + + + + Error + Błąd + + + + The value for location to install games is not valid. + Podana ścieżka do instalacji gier nie jest prawidłowa. + - GuiContextMenus - - - Create Shortcut - Utwórz skrót - - - - Open Game Folder - Otwórz katalog gry - - - - Cheats / Patches - Kody / poprawki - - - - SFO Viewer - Menedżer plików SFO - - - - Trophy Viewer - Menedżer trofeów - - - - Copy info - Kopiuj informacje - - - - Copy Name - Kopiuj nazwę - - - - Copy Serial - Kopiuj numer seryjny - - - - Copy All - Kopiuj wszystko - - - - Shortcut creation - Tworzenie skrótu - - - - Shortcut created successfully!\n %1 - Utworzenie skrótu zakończone pomyślnie!\n %1 - - - - Error - Błąd - - - - Error creating shortcut!\n %1 - Utworzenie skrótu zakończone niepowodzeniem!\n %1 - - - - Install PKG - Zainstaluj PKG - + GuiContextMenus + + + Create Shortcut + Utwórz skrót + + + + Open Game Folder + Otwórz katalog gry + + + + Cheats / Patches + Kody / poprawki + + + + SFO Viewer + Menedżer plików SFO + + + + Trophy Viewer + Menedżer trofeów + + + + Copy info + Kopiuj informacje + + + + Copy Name + Kopiuj nazwę + + + + Copy Serial + Kopiuj numer seryjny + + + + Copy All + Kopiuj wszystko + + + + Shortcut creation + Tworzenie skrótu + + + + Shortcut created successfully!\n %1 + Utworzenie skrótu zakończone pomyślnie!\n %1 + + + + Error + Błąd + + + + Error creating shortcut!\n %1 + Utworzenie skrótu zakończone niepowodzeniem!\n %1 + + + + Install PKG + Zainstaluj PKG + - MainWindow - - - Open/Add Elf Folder - Otwórz/Dodaj folder Elf - - - - Install Packages (PKG) - Zainstaluj paczkę (PKG) - - - - Boot Game - Uruchom grę - - - - About shadPS4 - O programie - - - - Configure... - Konfiguruj... - - - - Install application from a .pkg file - Zainstaluj aplikacje z pliku .pkg - - - - Recent Games - Ostatnie gry - - - - Exit - Wyjdź - - - - Exit shadPS4 - Wyjdź z shadPS4 - - - - Exit the application. - Wyjdź z aplikacji. - - - - Show Game List - Pokaż listę gier - - - - Game List Refresh - Odśwież listę gier - - - - Tiny - Malutkie - - - - Small - Małe - - - - Medium - Średnie - - - - Large - Wielkie - - - - List View - Widok listy - - - - Grid View - Widok siatki - - - - Elf Viewer - Menedżer plików ELF - - - - Game Install Directory - Katalog zainstalowanych gier - - - - Download Cheats/Patches - Pobierz kody / poprawki - - - - Dump Game List - Zgraj listę gier - - - - PKG Viewer - Menedżer plików PKG - - - - Search... - Szukaj... - - - - File - Plik - - - - View - Widok - - - - Game List Icons - Ikony w widoku listy - - - - Game List Mode - Tryb listy gier - - - - Settings - Ustawienia - - - - Utils - Narzędzia - - - - Themes - Motywy - - - - About - O programie - - - - Dark - Ciemny - - - - Light - Jasny - - - - Green - Zielony - - - - Blue - Niebieski - - - - Violet - Fioletowy - - - - toolBar - Pasek narzędzi - + MainWindow + + + Open/Add Elf Folder + Otwórz/Dodaj folder Elf + + + + Install Packages (PKG) + Zainstaluj paczkę (PKG) + + + + Boot Game + Uruchom grę + + + + Check for Updates + Sprawdź aktualizacje + + + + About shadPS4 + O programie + + + + Configure... + Konfiguruj... + + + + Install application from a .pkg file + Zainstaluj aplikacje z pliku .pkg + + + + Recent Games + Ostatnie gry + + + + Exit + Wyjdź + + + + Exit shadPS4 + Wyjdź z shadPS4 + + + + Exit the application. + Wyjdź z aplikacji. + + + + Show Game List + Pokaż listę gier + + + + Game List Refresh + Odśwież listę gier + + + + Tiny + Malutkie + + + + Small + Małe + + + + Medium + Średnie + + + + Large + Wielkie + + + + List View + Widok listy + + + + Grid View + Widok siatki + + + + Elf Viewer + Menedżer plików ELF + + + + Game Install Directory + Katalog zainstalowanych gier + + + + Download Cheats/Patches + Pobierz kody / poprawki + + + + Dump Game List + Zgraj listę gier + + + + PKG Viewer + Menedżer plików PKG + + + + Search... + Szukaj... + + + + File + Plik + + + + View + Widok + + + + Game List Icons + Ikony w widoku listy + + + + Game List Mode + Tryb listy gier + + + + Settings + Ustawienia + + + + Utils + Narzędzia + + + + Themes + Motywy + + + + Help + Pomoc + + + + Dark + Ciemny + + + + Light + Jasny + + + + Green + Zielony + + + + Blue + Niebieski + + + + Violet + Fioletowy + + + + toolBar + Pasek narzędzi + - PKGViewer - - - Open Folder - Otwórz folder - + PKGViewer + + + Open Folder + Otwórz folder + - TrophyViewer - - - Trophy Viewer - Menedżer trofeów - + TrophyViewer + + + Trophy Viewer + Menedżer trofeów + - SettingsDialog - - - Settings - Ustawienia - - - - General - Ogólne - - - - System - System - - - - Console Language - Język konsoli - - - - Emulator Language - Język emulatora - - - - Emulator - Emulator - - - - Enable Fullscreen - Włącz pełny ekran - - - - Show Splash - Pokaż ekran powitania - - - - Is PS4 Pro - Emulacja PS4 Pro - - - - Username - Nazwa użytkownika - - - - Logger - Dziennik zdarzeń - - - - Log Type - Typ dziennika - - - - Log Filter - Filtrowanie dziennika - - - - Graphics - Grafika - - - - Graphics Device - Karta graficzna - - - - Width - Szerokość - - - - Height - Wysokość - - - - Vblank Divider - Dzielnik przerwy pionowej (Vblank) - - - - Advanced - Zaawansowane - - - - Enable Shaders Dumping - Włącz zgrywanie cieni - - - - Enable NULL GPU - Wyłącz kartę graficzną - - - - Enable PM4 Dumping - Włącz zgrywanie PM4 - - - - Debug - Debugowanie - - - - Enable Debug Dumping - Włącz zgrywanie debugowania - - - - Enable Vulkan Validation Layers - Włącz warstwy walidacji Vulkan - - - - Enable Vulkan Synchronization Validation - Włącz walidację synchronizacji Vulkan - - - - Enable RenderDoc Debugging - Włącz debugowanie RenderDoc - + SettingsDialog + + + Settings + Ustawienia + + + + General + Ogólne + + + + System + System + + + + Console Language + Język konsoli + + + + Emulator Language + Język emulatora + + + + Emulator + Emulator + + + + Enable Fullscreen + Włącz pełny ekran + + + + Show Splash + Pokaż ekran powitania + + + + Is PS4 Pro + Emulacja PS4 Pro + + + + Username + Nazwa użytkownika + + + + Logger + Dziennik zdarzeń + + + + Log Type + Typ dziennika + + + + Log Filter + Filtrowanie dziennika + + + + Graphics + Grafika + + + + Graphics Device + Karta graficzna + + + + Width + Szerokość + + + + Height + Wysokość + + + + Vblank Divider + Dzielnik przerwy pionowej (Vblank) + + + + Advanced + Zaawansowane + + + + Enable Shaders Dumping + Włącz zgrywanie cieni + + + + Enable NULL GPU + Wyłącz kartę graficzną + + + + Enable PM4 Dumping + Włącz zgrywanie PM4 + + + + Debug + Debugowanie + + + + Enable Debug Dumping + Włącz zgrywanie debugowania + + + + Enable Vulkan Validation Layers + Włącz warstwy walidacji Vulkan + + + + Enable Vulkan Synchronization Validation + Włącz walidację synchronizacji Vulkan + + + + Enable RenderDoc Debugging + Włącz debugowanie RenderDoc + + + + Update + Aktualizacja + + + + Check for Updates at Startup + Sprawdź aktualizacje przy starcie + + + + Update Channel + Kanał Aktualizacji + + + + Check for Updates + Sprawdź aktualizacje + + + + GUI Settings + Ustawienia Interfejsu + + + + Play title music + Odtwórz muzykę tytułową + + + + Volume + Głośność + - - MainWindow + + MainWindow Game List Lista gier - - - * Unsupported Vulkan Version - * Nieobsługiwana wersja Vulkan - - - - Download Cheats For All Installed Games - Pobierz kody do wszystkich zainstalowanych gier - - - - Download Patches For All Games - Pobierz poprawki do wszystkich gier - - - - Download Complete - Pobieranie zakończone - - - - You have downloaded cheats for all the games you have installed. - Pobrałeś kody do wszystkich zainstalowanych gier. - - - - Patches Downloaded Successfully! - Poprawki pobrane pomyślnie! - - - - All Patches available for all games have been downloaded. - Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. - - - - Games: - Gry: - - - - PKG File (*.PKG) - Plik PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Pliki ELF (*.bin *.elf *.oelf) - - - - Game Boot - Uruchomienie gry - - - - Only one file can be selected! - Można wybrać tylko jeden plik! - - - - PKG Extraction - Wypakowywanie PKG - - - - Patch detected! - Wykryto łatkę! - - - - PKG and Game versions match: - Wersje PKG i gry są zgodne: - - - - Would you like to overwrite? - Czy chcesz nadpisać? - - - - PKG Version %1 is older than installed version: - Wersja PKG %1 jest starsza niż zainstalowana wersja: - - - - Game is installed: - Gra jest zainstalowana: - - - - Would you like to install Patch: - Czy chcesz zainstalować łatkę: - - - - DLC Installation - Instalacja DLC - - - - Would you like to install DLC: %1? - Czy chcesz zainstalować DLC: %1? - - - - DLC already installed: - DLC już zainstalowane: - - - - Game already installed - Gra już zainstalowana - - - - PKG is a patch, please install the game first! - PKG jest poprawką, proszę najpierw zainstalować grę! - - - - PKG ERROR - BŁĄD PKG - - - - Extracting PKG %1/%2 - Wypakowywanie PKG %1/%2 - - - - Extraction Finished - Wypakowywanie zakończone - - - - Game successfully installed at %1 - Gra pomyślnie zainstalowana w %1 - - - - File doesn't appear to be a valid PKG file - Plik nie wydaje się być prawidłowym plikiem PKG - - - - CheatsPatches - - - Cheats / Patches - Kody / poprawki - - - - defaultTextEdit_MSG - Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Brak dostępnego obrazu - - - - Serial: - Numer seryjny: - - - - Version: - Wersja: - - - - Size: - Rozmiar: - - - - Select Cheat File: - Wybierz plik kodu: - - - - Repository: - Repozytorium: - - - - Download Cheats - Pobierz kody - - - - Remove Old Files - Usuń stare pliki - - - - Do you want to delete the files after downloading them? - Czy chcesz usunąć pliki po ich pobraniu? - - - - Do you want to delete the files after downloading them?\n%1 - Czy chcesz usunąć pliki po ich pobraniu?\n%1 - - - - Do you want to delete the selected file?\n%1 - Czy chcesz usunąć wybrany plik?\n%1 - - - - Select Patch File: - Wybierz plik poprawki: - - - - Download Patches - Pobierz poprawki - - - - Save - Zapisz - - - - Cheats - Kody - - - - Patches - Poprawki - - - - Error - Błąd - - - - No patch selected. - Nie wybrano poprawki. - - - - Unable to open files.json for reading. - Nie można otworzyć pliku files.json do odczytu. - - - - No patch file found for the current serial. - Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. - - - - Unable to open the file for reading. - Nie można otworzyć pliku do odczytu. - - - - Unable to open the file for writing. - Nie można otworzyć pliku do zapisu. - - - - Failed to parse XML: - Nie udało się przeanalizować XML: - - - - Success - Sukces - - - - Options saved successfully. - Opcje zostały pomyślnie zapisane. - - - - Invalid Source - Nieprawidłowe źródło - - - - The selected source is invalid. - Wybrane źródło jest nieprawidłowe. - - - - File Exists - Plik istnieje - - - - File already exists. Do you want to replace it? - Plik już istnieje. Czy chcesz go zastąpić? - - - - Failed to save file: - Nie udało się zapisać pliku: - - - - Failed to download file: - Nie udało się pobrać pliku: - - - - Cheats Not Found - Nie znaleziono kodów - - - - CheatsNotFound_MSG - Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. - - - - Cheats Downloaded Successfully - Kody pobrane pomyślnie - - - - CheatsDownloadedSuccessfully_MSG - Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. - - - - Failed to save: - Nie udało się zapisać: - - - - Failed to download: - Nie udało się pobrać: - - - - Download Complete - Pobieranie zakończone - - - - DownloadComplete_MSG - Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. Może być konieczne zaktualizowanie gry. - - - - Failed to parse JSON data from HTML. - Nie udało się przeanalizować danych JSON z HTML. - - - - Failed to retrieve HTML page. - Nie udało się pobrać strony HTML. - - - - Failed to open file: - Nie udało się otworzyć pliku: - - - - XML ERROR: - BŁĄD XML: - - - - Failed to open files.json for writing - Nie udało się otworzyć pliku files.json do zapisu - - - - Author: - Autor: - - - - Directory does not exist: - Katalog nie istnieje: - - - - Directory does not exist: %1 - Katalog nie istnieje: %1 - - - - Failed to parse JSON: - Nie udało się przeanlizować JSON: - + + + * Unsupported Vulkan Version + * Nieobsługiwana wersja Vulkan + + + + Download Cheats For All Installed Games + Pobierz kody do wszystkich zainstalowanych gier + + + + Download Patches For All Games + Pobierz poprawki do wszystkich gier + + + + Download Complete + Pobieranie zakończone + + + + You have downloaded cheats for all the games you have installed. + Pobrałeś kody do wszystkich zainstalowanych gier. + + + + Patches Downloaded Successfully! + Poprawki pobrane pomyślnie! + + + + All Patches available for all games have been downloaded. + Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. + + + + Games: + Gry: + + + + PKG File (*.PKG) + Plik PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Pliki ELF (*.bin *.elf *.oelf) + + + + Game Boot + Uruchomienie gry + + + + Only one file can be selected! + Można wybrać tylko jeden plik! + + + + PKG Extraction + Wypakowywanie PKG + + + + Patch detected! + Wykryto łatkę! + + + + PKG and Game versions match: + Wersje PKG i gry są zgodne: + + + + Would you like to overwrite? + Czy chcesz nadpisać? + + + + PKG Version %1 is older than installed version: + Wersja PKG %1 jest starsza niż zainstalowana wersja: + + + + Game is installed: + Gra jest zainstalowana: + + + + Would you like to install Patch: + Czy chcesz zainstalować łatkę: + + + + DLC Installation + Instalacja DLC + + + + Would you like to install DLC: %1? + Czy chcesz zainstalować DLC: %1? + + + + DLC already installed: + DLC już zainstalowane: + + + + Game already installed + Gra już zainstalowana + + + + PKG is a patch, please install the game first! + PKG jest poprawką, proszę najpierw zainstalować grę! + + + + PKG ERROR + BŁĄD PKG + + + + Extracting PKG %1/%2 + Wypakowywanie PKG %1/%2 + + + + Extraction Finished + Wypakowywanie zakończone + + + + Game successfully installed at %1 + Gra pomyślnie zainstalowana w %1 + + + + File doesn't appear to be a valid PKG file + Plik nie wydaje się być prawidłowym plikiem PKG + + + + CheatsPatches + + + Cheats / Patches + Kody / poprawki + + + + defaultTextEdit_MSG + Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Brak dostępnego obrazu + + + + Serial: + Numer seryjny: + + + + Version: + Wersja: + + + + Size: + Rozmiar: + + + + Select Cheat File: + Wybierz plik kodu: + + + + Repository: + Repozytorium: + + + + Download Cheats + Pobierz kody + + + + Remove Old Files + Usuń stare pliki + + + + Do you want to delete the files after downloading them? + Czy chcesz usunąć pliki po ich pobraniu? + + + + Do you want to delete the files after downloading them?\n%1 + Czy chcesz usunąć pliki po ich pobraniu?\n%1 + + + + Do you want to delete the selected file?\n%1 + Czy chcesz usunąć wybrany plik?\n%1 + + + + Select Patch File: + Wybierz plik poprawki: + + + + Download Patches + Pobierz poprawki + + + + Save + Zapisz + + + + Cheats + Kody + + + + Patches + Poprawki + + + + Error + Błąd + + + + No patch selected. + Nie wybrano poprawki. + + + + Unable to open files.json for reading. + Nie można otworzyć pliku files.json do odczytu. + + + + No patch file found for the current serial. + Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. + + + + Unable to open the file for reading. + Nie można otworzyć pliku do odczytu. + + + + Unable to open the file for writing. + Nie można otworzyć pliku do zapisu. + + + + Failed to parse XML: + Nie udało się przeanalizować XML: + + + + Success + Sukces + + + + Options saved successfully. + Opcje zostały pomyślnie zapisane. + + + + Invalid Source + Nieprawidłowe źródło + + + + The selected source is invalid. + Wybrane źródło jest nieprawidłowe. + + + + File Exists + Plik istnieje + + + + File already exists. Do you want to replace it? + Plik już istnieje. Czy chcesz go zastąpić? + + + + Failed to save file: + Nie udało się zapisać pliku: + + + + Failed to download file: + Nie udało się pobrać pliku: + + + + Cheats Not Found + Nie znaleziono kodów + + + + CheatsNotFound_MSG + Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. + + + + Cheats Downloaded Successfully + Kody pobrane pomyślnie + + + + CheatsDownloadedSuccessfully_MSG + Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. + + + + Failed to save: + Nie udało się zapisać: + + + + Failed to download: + Nie udało się pobrać: + + + + Download Complete + Pobieranie zakończone + + + + DownloadComplete_MSG + Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. Może być konieczne zaktualizowanie gry. + + + + Failed to parse JSON data from HTML. + Nie udało się przeanalizować danych JSON z HTML. + + + + Failed to retrieve HTML page. + Nie udało się pobrać strony HTML. + + + + Failed to open file: + Nie udało się otworzyć pliku: + + + + XML ERROR: + BŁĄD XML: + + + + Failed to open files.json for writing + Nie udało się otworzyć pliku files.json do zapisu + + + + Author: + Autor: + + + + Directory does not exist: + Katalog nie istnieje: + + + + Directory does not exist: %1 + Katalog nie istnieje: %1 + + + + Failed to parse JSON: + Nie udało się przeanlizować JSON: + Can't apply cheats before the game is started Nie można zastosować kodów przed uruchomieniem gry. - + SettingsDialog @@ -931,6 +973,111 @@ Close Zamknij + + + Point your mouse at an option to display its description. + Najedź kursorem na opcję, aby wyświetlić jej opis. + + + + consoleLanguageGroupBox + Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. + + + + emulatorLanguageGroupBox + Język emulatora:\nUstala język interfejsu użytkownika emulatora. + + + + fullscreenCheckBox + Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. + + + + showSplashCheckBox + Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). + + + + ps4proCheckBox + Czy PS4 Pro:\nSprawia, że emulator działa jak PS4 PRO, co może aktywować specjalne funkcje w grach, które to obsługują. + + + + userName + Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. + + + + logTypeGroupBox + Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. + + + + logFilter + Filtr logu: Filtruje dziennik, aby drukować tylko określone informacje. Przykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. + + + + updaterGroupBox + Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. + + + + GUIgroupBox + Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. + + + + graphicsAdapterGroupBox + Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. + + + + resolutionLayout + Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. + + + + heightDivider + Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! + + + + dumpShadersCheckBox + Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. + + + + nullGpuCheckBox + Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. + + + + dumpPM4CheckBox + Włącz zrzucanie PM4:\nDla technicznego debugowania zapisuje surowe dane instrukcji GPU w folderze, gdy emulator je przetwarza. + + + + debugDump + Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. + + + + vkValidationCheckBox + Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. + + + + vkSyncValidationCheckBox + Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. + + + + rdocCheckBox + Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. + GameListFrame @@ -975,4 +1122,132 @@ Ścieżka - + + CheckUpdate + + + Auto Updater + Automatyczne aktualizacje + + + + Error + Błąd + + + + Network error: + Błąd sieci: + + + + Failed to parse update information. + Nie udało się sparsować informacji o aktualizacji. + + + + No pre-releases found. + Nie znaleziono wersji przedpremierowych. + + + + Invalid release data. + Nieprawidłowe dane wydania. + + + + No download URL found for the specified asset. + Nie znaleziono adresu URL do pobrania dla określonego zasobu. + + + + Your version is already up to date! + Twoja wersja jest już aktualna! + + + + Update Available + Dostępna aktualizacja + + + + Update Channel + Kanał Aktualizacji + + + + Current Version + Aktualna wersja + + + + Latest Version + Ostatnia wersja + + + + Do you want to update? + Czy chcesz zaktualizować? + + + + Show Changelog + Pokaż zmiany + + + + Check for Updates at Startup + Sprawdź aktualizacje przy starcie + + + + Update + Aktualizuj + + + + No + Nie + + + + Hide Changelog + Ukryj zmiany + + + + Changes + Zmiany + + + + Network error occurred while trying to access the URL + Błąd sieci wystąpił podczas próby uzyskania dostępu do URL + + + + Download Complete + Pobieranie zakończone + + + + The update has been downloaded, press OK to install. + Aktualizacja została pobrana, naciśnij OK, aby zainstalować. + + + + Failed to save the update file at + Nie udało się zapisać pliku aktualizacji w + + + + Starting Update... + Rozpoczynanie aktualizacji... + + + + Failed to create the update script file + Nie udało się utworzyć pliku skryptu aktualizacji + + + \ No newline at end of file diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index e774a30b4..38836b1d0 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1,908 +1,950 @@ - - - - AboutDialog - - - About shadPS4 - Sobre o shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - Este software não deve ser usado para jogar jogos piratas. - - - - ElfViewer - - - Open Folder - Abrir Pasta - - - - GameInfoClass - - - Loading game list, please wait :3 - Carregando a lista de jogos, por favor aguarde :3 - - - - Cancel - Cancelar - - - - Loading... - Carregando... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Escolha o diretório - - - - Directory to install games - Diretório para instalar jogos - - - - Browse - Procurar - - - - Error - Erro - - - - The value for location to install games is not valid. - O diretório da instalação dos jogos não é válido. - - - - GuiContextMenus - - - Create Shortcut - Criar Atalho - - - - Open Game Folder - Abrir Pasta do Jogo - - - - Cheats / Patches - Cheats / Patches - - - - SFO Viewer - Visualizador de SFO - - - - Trophy Viewer - Visualizador de Troféu - - - - Copy info - Copiar informação - - - - Copy Name - Copiar Nome - - - - Copy Serial - Copiar Serial - - - - Copy All - Copiar Tudo - - - - Shortcut creation - Criação de atalho - - - - Shortcut created successfully!\n %1 - Atalho criado com sucesso!\n %1 - - - - Error - Erro - - - - Error creating shortcut!\n %1 - Erro ao criar atalho!\n %1 - - - - Install PKG - Instalar PKG - - - - MainWindow - - - Open/Add Elf Folder - Abrir/Adicionar pasta Elf - - - - Install Packages (PKG) - Instalar Pacotes (PKG) - - - - Boot Game - Iniciar Jogo - - - - About shadPS4 - Sobre o shadPS4 - - - - Configure... - Configurar... - - - - Install application from a .pkg file - Instalar aplicação de um arquivo .pkg - - - - Recent Games - Jogos Recentes - - - - Exit - Sair - - - - Exit shadPS4 - Sair do shadPS4 - - - - Exit the application. - Sair da aplicação. - - - - Show Game List - Mostrar Lista de Jogos - - - - Game List Refresh - Atualizar Lista de Jogos - - - - Tiny - Muito pequeno - - - - Small - Pequeno - - - - Medium - Médio - - - - Large - Grande - - - - List View - Visualizar em Lista - - - - Grid View - Visualizar em Grade - - - - Elf Viewer - Visualizador de Elf - - - - Game Install Directory - Diretório de Instalação de Jogos - - - - Download Cheats/Patches - Baixar Cheats/Patches - - - - Dump Game List - Dumpar Lista de Jogos - - - - PKG Viewer - Visualizador de PKG - - - - Search... - Pesquisar... - - - - File - Arquivo - - - - View - Ver - - - - Game List Icons - Ícones da Lista de Jogos - - - - Game List Mode - Modo da Lista de Jogos - - - - Settings - Configurações - - - - Utils - Utilitários - - - - Themes - Temas - - - - About - Sobre - - - - Dark - Escuro - - - - Light - Claro - - - - Green - Verde - - - - Blue - Azul - - - - Violet - Violeta - - - - toolBar - Barra de Ferramentas - - - - PKGViewer - - - Open Folder - Abrir Pasta - - - - TrophyViewer - - - Trophy Viewer - Visualizador de Troféu - - - - SettingsDialog - - - Settings - Configurações - - - - General - Geral - - - - System - Sistema - - - - Console Language - Idioma do Console - - - - Emulator Language - Idioma do Emulador - - - - Emulator - Emulador - - - - Enable Fullscreen - Ativar Tela Cheia - - - - Show Splash - Mostrar Splash Inicial - - - - Is PS4 Pro - Modo PS4 Pro - - - - Username - Nome de usuário - - - - Logger - Registro - - - - Log Type - Tipo de Registro - - - - Log Filter - Filtro do Registro - - - - Graphics - Gráficos - - - - Graphics Device - Placa de Vídeo - - - - Width - Largura - - - - Height - Altura - - - - Vblank Divider - Divisor Vblank - - - - Advanced - Avançado - - - - Enable Shaders Dumping - Ativar Dumping de Shaders - - - - Enable NULL GPU - Ativar GPU NULA - - - - Enable PM4 Dumping - Ativar Dumping de PM4 - - - - Debug - Depuração - - - - Enable Debug Dumping - Ativar Depuração de Dumping - - - - Enable Vulkan Validation Layers - Ativar Camadas de Validação do Vulkan - - - - Enable Vulkan Synchronization Validation - Ativar Validação de Sincronização do Vulkan - - - - Enable RenderDoc Debugging - Ativar Depuração por RenderDoc - - - MainWindow - - - Game List - Lista de Jogos - - - - * Unsupported Vulkan Version - * Versão Vulkan não suportada - - - - Download Cheats For All Installed Games - Baixar Cheats para Todos os Jogos Instalados - - - - Download Patches For All Games - Baixar Patches para Todos os Jogos - - - - Download Complete - Download Completo - - - - You have downloaded cheats for all the games you have installed. - Você baixou cheats para todos os jogos que instalou. - - - - Patches Downloaded Successfully! - Patches Baixados com Sucesso! - - - - All Patches available for all games have been downloaded. - Todos os patches disponíveis para todos os jogos foram baixados. - - - - Games: - Jogos: - - - - PKG File (*.PKG) - Arquivo PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Arquivos ELF (*.bin *.elf *.oelf) - - - - Game Boot - Inicialização do Jogo - - - - Only one file can be selected! - Apenas um arquivo pode ser selecionado! - - - - PKG Extraction - Extração de PKG - - - - Patch detected! - Atualização detectada! - - - - PKG and Game versions match: - As versões do PKG e do Jogo são igual: - - - - Would you like to overwrite? - Gostaria de substituir? - - - - PKG Version %1 is older than installed version: - Versão do PKG %1 é mais antiga do que a versão instalada: - - - - Game is installed: - Jogo instalado: - - - - Would you like to install Patch: - Você gostaria de instalar a atualização: - - - - DLC Installation - Instalação de DLC - - - - Would you like to install DLC: %1? - Você gostaria de instalar o DLC: %1? - - - - DLC already installed: - DLC já instalada: - - - - Game already installed - O jogo já está instalado: - - - - PKG is a patch, please install the game first! - O PKG é um patch, por favor, instale o jogo primeiro! - - - - PKG ERROR - ERRO de PKG - - - - Extracting PKG %1/%2 - Extraindo PKG %1/%2 - - - - Extraction Finished - Extração Concluída - - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - - File doesn't appear to be a valid PKG file - O arquivo não parece ser um arquivo PKG válido - + AboutDialog + + + About shadPS4 + Sobre o shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + Este software não deve ser usado para jogar jogos piratas. + - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Imagem Não Disponível - - - - Serial: - Serial: - - - - Version: - Versão: - - - - Size: - Tamanho: - - - - Select Cheat File: - Selecione o Arquivo de Cheat: - - - - Repository: - Repositório: - - - - Download Cheats - Baixar Cheats - - - - Delete File - Excluir Arquivo - - - - No files selected. - Nenhum arquivo selecionado. - - - - You can delete the cheats you don't want after downloading them. - Você pode excluir os cheats que não deseja após baixá-las. - - - - Do you want to delete the selected file?\n%1 - Deseja excluir o arquivo selecionado?\n%1 - - - - Select Patch File: - Selecione o Arquivo de Patch: - - - - Download Patches - Baixar Patches - - - - Save - Salvar - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Erro - - - - No patch selected. - Nenhum patch selecionado. - - - - Unable to open files.json for reading. - Não foi possível abrir files.json para leitura. - - - - No patch file found for the current serial. - Nenhum arquivo de patch encontrado para o serial atual. - - - - Unable to open the file for reading. - Não foi possível abrir o arquivo para leitura. - - - - Unable to open the file for writing. - Não foi possível abrir o arquivo para gravação. - - - - Failed to parse XML: - Falha ao analisar XML: - - - - Success - Sucesso - - - - Options saved successfully. - Opções salvas com sucesso. - - - - Invalid Source - Fonte Inválida - - - - The selected source is invalid. - A fonte selecionada é inválida. - - - - File Exists - Arquivo Existe - - - - File already exists. Do you want to replace it? - O arquivo já existe. Deseja substituí-lo? - - - - Failed to save file: - Falha ao salvar o arquivo: - - - - Failed to download file: - Falha ao baixar o arquivo: - - - - Cheats Not Found - Cheats Não Encontrados - - - - CheatsNotFound_MSG - Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. - - - - Cheats Downloaded Successfully - Cheats Baixados com Sucesso - - - - CheatsDownloadedSuccessfully_MSG - Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. - - - - Failed to save: - Falha ao salvar: - - - - Failed to download: - Falha ao baixar: - - - - Download Complete - Download Completo - - - - DownloadComplete_MSG - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. Pode ser necessário atualizar o jogo. - - - - Failed to parse JSON data from HTML. - Falha ao analisar dados JSON do HTML. - - - - Failed to retrieve HTML page. - Falha ao recuperar a página HTML. - - - - Failed to open file: - Falha ao abrir o arquivo: - - - - XML ERROR: - ERRO de XML: - - - - Failed to open files.json for writing - Falha ao abrir files.json para gravação - - - - Author: - Autor: - - - - Directory does not exist: - O Diretório não existe: - - - - Failed to open files.json for reading. - Falha ao abrir files.json para leitura. - - - - Name: - Nome: - + ElfViewer + + + Open Folder + Abrir Pasta + + + + GameInfoClass + + + Loading game list, please wait :3 + Carregando a lista de jogos, por favor aguarde :3 + + + + Cancel + Cancelar + + + + Loading... + Carregando... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Escolha o diretório + + + + Directory to install games + Diretório para instalar jogos + + + + Browse + Procurar + + + + Error + Erro + + + + The value for location to install games is not valid. + O diretório da instalação dos jogos não é válido. + + + + GuiContextMenus + + + Create Shortcut + Criar Atalho + + + + Open Game Folder + Abrir Pasta do Jogo + + + + Cheats / Patches + Cheats / Patches + + + + SFO Viewer + Visualizador de SFO + + + + Trophy Viewer + Visualizador de Troféu + + + + Copy info + Copiar informação + + + + Copy Name + Copiar Nome + + + + Copy Serial + Copiar Serial + + + + Copy All + Copiar Tudo + + + + Shortcut creation + Criação de atalho + + + + Shortcut created successfully!\n %1 + Atalho criado com sucesso!\n %1 + + + + Error + Erro + + + + Error creating shortcut!\n %1 + Erro ao criar atalho!\n %1 + + + + Install PKG + Instalar PKG + + + + MainWindow + + + Open/Add Elf Folder + Abrir/Adicionar pasta Elf + + + + Install Packages (PKG) + Instalar Pacotes (PKG) + + + + Boot Game + Iniciar Jogo + + + + Check for Updates + Verificar atualizações + + + + About shadPS4 + Sobre o shadPS4 + + + + Configure... + Configurar... + + + + Install application from a .pkg file + Instalar aplicação de um arquivo .pkg + + + + Recent Games + Jogos Recentes + + + + Exit + Sair + + + + Exit shadPS4 + Sair do shadPS4 + + + + Exit the application. + Sair da aplicação. + + + + Show Game List + Mostrar Lista de Jogos + + + + Game List Refresh + Atualizar Lista de Jogos + + + + Tiny + Muito pequeno + + + + Small + Pequeno + + + + Medium + Médio + + + + Large + Grande + + + + List View + Visualizar em Lista + + + + Grid View + Visualizar em Grade + + + + Elf Viewer + Visualizador de Elf + + + + Game Install Directory + Diretório de Instalação de Jogos + + + + Download Cheats/Patches + Baixar Cheats/Patches + + + + Dump Game List + Dumpar Lista de Jogos + + + + PKG Viewer + Visualizador de PKG + + + + Search... + Pesquisar... + + + + File + Arquivo + + + + View + Ver + + + + Game List Icons + Ícones da Lista de Jogos + + + + Game List Mode + Modo da Lista de Jogos + + + + Settings + Configurações + + + + Utils + Utilitários + + + + Themes + Temas + + + + Help + Ajuda + + + + Dark + Escuro + + + + Light + Claro + + + + Green + Verde + + + + Blue + Azul + + + + Violet + Violeta + + + + toolBar + Barra de Ferramentas + + + + PKGViewer + + + Open Folder + Abrir Pasta + + + + TrophyViewer + + + Trophy Viewer + Visualizador de Troféu + + + + SettingsDialog + + + Settings + Configurações + + + + General + Geral + + + + System + Sistema + + + + Console Language + Idioma do Console + + + + Emulator Language + Idioma do Emulador + + + + Emulator + Emulador + + + + Enable Fullscreen + Ativar Tela Cheia + + + + Show Splash + Mostrar Splash Inicial + + + + Is PS4 Pro + Modo PS4 Pro + + + + Username + Nome de usuário + + + + Logger + Registro + + + + Log Type + Tipo de Registro + + + + Log Filter + Filtro do Registro + + + + Graphics + Gráficos + + + + Graphics Device + Placa de Vídeo + + + + Width + Largura + + + + Height + Altura + + + + Vblank Divider + Divisor Vblank + + + + Advanced + Avançado + + + + Enable Shaders Dumping + Ativar Dumping de Shaders + + + + Enable NULL GPU + Ativar GPU NULA + + + + Enable PM4 Dumping + Ativar Dumping de PM4 + + + + Debug + Depuração + + + + Enable Debug Dumping + Ativar Depuração de Dumping + + + + Enable Vulkan Validation Layers + Ativar Camadas de Validação do Vulkan + + + + Enable Vulkan Synchronization Validation + Ativar Validação de Sincronização do Vulkan + + + + Enable RenderDoc Debugging + Ativar Depuração por RenderDoc + + + + Update + Atualização + + + + Check for Updates at Startup + Verificar Atualizações ao Iniciar + + + + Update Channel + Canal de Atualização + + + + Check for Updates + Verificar atualizações + + + + GUI Settings + Configurações da Interface + + + + Play title music + Reproduzir música de abertura + + + + Volume + Volume + + + + MainWindow + + + Game List + Lista de Jogos + + + + * Unsupported Vulkan Version + * Versão Vulkan não suportada + + + + Download Cheats For All Installed Games + Baixar Cheats para Todos os Jogos Instalados + + + + Download Patches For All Games + Baixar Patches para Todos os Jogos + + + + Download Complete + Download Completo + + + + You have downloaded cheats for all the games you have installed. + Você baixou cheats para todos os jogos que instalou. + + + + Patches Downloaded Successfully! + Patches Baixados com Sucesso! + + + + All Patches available for all games have been downloaded. + Todos os patches disponíveis para todos os jogos foram baixados. + + + + Games: + Jogos: + + + + PKG File (*.PKG) + Arquivo PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Arquivos ELF (*.bin *.elf *.oelf) + + + + Game Boot + Inicialização do Jogo + + + + Only one file can be selected! + Apenas um arquivo pode ser selecionado! + + + + PKG Extraction + Extração de PKG + + + + Patch detected! + Atualização detectada! + + + + PKG and Game versions match: + As versões do PKG e do Jogo são igual: + + + + Would you like to overwrite? + Gostaria de substituir? + + + + PKG Version %1 is older than installed version: + Versão do PKG %1 é mais antiga do que a versão instalada: + + + + Game is installed: + Jogo instalado: + + + + Would you like to install Patch: + Você gostaria de instalar a atualização: + + + + DLC Installation + Instalação de DLC + + + + Would you like to install DLC: %1? + Você gostaria de instalar o DLC: %1? + + + + DLC already installed: + DLC já instalada: + + + + Game already installed + O jogo já está instalado: + + + + PKG is a patch, please install the game first! + O PKG é um patch, por favor, instale o jogo primeiro! + + + + PKG ERROR + ERRO de PKG + + + + Extracting PKG %1/%2 + Extraindo PKG %1/%2 + + + + Extraction Finished + Extração Concluída + + + + Game successfully installed at %1 + Jogo instalado com sucesso em %1 + + + + File doesn't appear to be a valid PKG file + O arquivo não parece ser um arquivo PKG válido + + + + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Imagem Não Disponível + + + + Serial: + Serial: + + + + Version: + Versão: + + + + Size: + Tamanho: + + + + Select Cheat File: + Selecione o Arquivo de Cheat: + + + + Repository: + Repositório: + + + + Download Cheats + Baixar Cheats + + + + Delete File + Excluir Arquivo + + + + No files selected. + Nenhum arquivo selecionado. + + + + You can delete the cheats you don't want after downloading them. + Você pode excluir os cheats que não deseja após baixá-las. + + + + Do you want to delete the selected file?\n%1 + Deseja excluir o arquivo selecionado?\n%1 + + + + Select Patch File: + Selecione o Arquivo de Patch: + + + + Download Patches + Baixar Patches + + + + Save + Salvar + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Erro + + + + No patch selected. + Nenhum patch selecionado. + + + + Unable to open files.json for reading. + Não foi possível abrir files.json para leitura. + + + + No patch file found for the current serial. + Nenhum arquivo de patch encontrado para o serial atual. + + + + Unable to open the file for reading. + Não foi possível abrir o arquivo para leitura. + + + + Unable to open the file for writing. + Não foi possível abrir o arquivo para gravação. + + + + Failed to parse XML: + Falha ao analisar XML: + + + + Success + Sucesso + + + + Options saved successfully. + Opções salvas com sucesso. + + + + Invalid Source + Fonte Inválida + + + + The selected source is invalid. + A fonte selecionada é inválida. + + + + File Exists + Arquivo Existe + + + + File already exists. Do you want to replace it? + O arquivo já existe. Deseja substituí-lo? + + + + Failed to save file: + Falha ao salvar o arquivo: + + + + Failed to download file: + Falha ao baixar o arquivo: + + + + Cheats Not Found + Cheats Não Encontrados + + + + CheatsNotFound_MSG + Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. + + + + Cheats Downloaded Successfully + Cheats Baixados com Sucesso + + + + CheatsDownloadedSuccessfully_MSG + Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. + + + + Failed to save: + Falha ao salvar: + + + + Failed to download: + Falha ao baixar: + + + + Download Complete + Download Completo + + + + DownloadComplete_MSG + Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. Pode ser necessário atualizar o jogo. + + + + Failed to parse JSON data from HTML. + Falha ao analisar dados JSON do HTML. + + + + Failed to retrieve HTML page. + Falha ao recuperar a página HTML. + + + + Failed to open file: + Falha ao abrir o arquivo: + + + + XML ERROR: + ERRO de XML: + + + + Failed to open files.json for writing + Falha ao abrir files.json para gravação + + + + Author: + Autor: + + + + Directory does not exist: + O Diretório não existe: + + + + Failed to open files.json for reading. + Falha ao abrir files.json para leitura. + + + + Name: + Nome: + Can't apply cheats before the game is started @@ -910,69 +952,302 @@ - SettingsDialog - - - Save - Salvar - + SettingsDialog - - Apply - Aplicar - + + Save + Salvar + - - Restore Defaults - Restaurar Padrões - + + Apply + Aplicar + - - Close - Fechar - + + Restore Defaults + Restaurar Padrões + + + + Close + Fechar + + + + Point your mouse at an option to display its description. + Passe o mouse sobre uma opção para exibir sua descrição. + + + + consoleLanguageGroupBox + Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. + + + + emulatorLanguageGroupBox + Idioma do emulador:\nDefine o idioma da interface do emulador. + + + + fullscreenCheckBox + Ativar modo tela cheia:\nMove automaticamente a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. + + + + showSplashCheckBox + Mostrar tela inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. + + + + ps4proCheckBox + É um PS4 Pro:\nFaz o emulador agir como um PS4 PRO, o que pode ativar recursos especiais em jogos que o suportam. + + + + userName + Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. + + + + logTypeGroupBox + Tipo de log:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. + + + + logFilter + Filtro de log: Imprime apenas informações específicas. Exemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Níveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. + + + + updaterGroupBox + Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. + + + + GUIgroupBox + Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. + + + + graphicsAdapterGroupBox + Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. + + + + resolutionLayout + Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. + + + + heightDivider + Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! + + + + dumpShadersCheckBox + Ativar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. + + + + nullGpuCheckBox + Ativar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. + + + + dumpPM4CheckBox + Ativar Dumping de PM4:\nArmazena os dados de instrução bruta da GPU em uma pasta enquanto o emulador os processa, para fins de depuração técnica. Recomendado deixar desativado. + + + + debugDump + Ativar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. + + + + vkValidationCheckBox + Ativar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + + + + vkSyncValidationCheckBox + Ativar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + + + + rdocCheckBox + Ativar depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + - GameListFrame - - - Icon - Icone - - - - Name - Nome - - - - Serial - Serial - - - - Region - Região - - - - Firmware - Firmware - - - - Size - Tamanho - - - - Version - Versão - - - - Path - Diretório - + GameListFrame + + + Icon + Icone + + + + Name + Nome + + + + Serial + Serial + + + + Region + Região + + + + Firmware + Firmware + + + + Size + Tamanho + + + + Version + Versão + + + + Path + Diretório + + + + CheckUpdate + + + Auto Updater + Atualizador automático + + + + Error + Erro + + + + Network error: + Erro de rede: + + + + Failed to parse update information. + Falha ao analisar as informações de atualização. + + + + No pre-releases found. + Nenhuma pre-release encontrada. + + + + Invalid release data. + Dados da release inválidos. + + + + No download URL found for the specified asset. + Nenhuma URL de download encontrada para o asset especificado. + + + + Your version is already up to date! + Sua versão já está atualizada! + + + + Update Available + Atualização disponível + + + + Update Channel + Canal de Atualização + + + + Current Version + Versão atual + + + + Latest Version + Última versão + + + + Do you want to update? + Você quer atualizar? + + + + Show Changelog + Mostrar Changelog + + + + Check for Updates at Startup + Verificar Atualizações ao Iniciar + + + + Update + Atualizar + + + + No + Não + + + + Hide Changelog + Ocultar Changelog + + + + Changes + Alterações + + + + Network error occurred while trying to access the URL + Ocorreu um erro de rede ao tentar acessar o URL + + + + Download Complete + Download Completo + + + + The update has been downloaded, press OK to install. + A atualização foi baixada, pressione OK para instalar. + + + + Failed to save the update file at + Falha ao salvar o arquivo de atualização em + + + + Starting Update... + Iniciando atualização... + + + + Failed to create the update script file + Falha ao criar o arquivo de script de atualização + \ No newline at end of file diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 56df113f5..a5c3783bb 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Trapaças / Patches - Coduri / Patch-uri - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Descarcă Coduri / Patch-uri - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + - + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Trapaças / Patches + Coduri / Patch-uri + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Verifică actualizările + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Descarcă Coduri / Patch-uri + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Ajutor + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Actualizare + + + + Check for Updates at Startup + Verifică actualizări la pornire + + + + Update Channel + Canal de Actualizare + + + + Check for Updates + Verifică actualizări + + + + GUI Settings + Setări GUI + + + + Play title music + Redă muzica titlului + + + + Volume + Volum + + + + MainWindow Game List Lista jocurilor - MainWindow - - - * Unsupported Vulkan Version - * Versiune Vulkan nesuportată - - - - Download Cheats For All Installed Games - Descarcă Cheats pentru toate jocurile instalate - - - - Download Patches For All Games - Descarcă Patches pentru toate jocurile - - - - Download Complete - Descărcare completă - - - - You have downloaded cheats for all the games you have installed. - Ai descărcat cheats pentru toate jocurile instalate. - - - - Patches Downloaded Successfully! - Patches descărcate cu succes! - - - - All Patches available for all games have been downloaded. - Toate Patches disponibile pentru toate jocurile au fost descărcate. - - - - Games: - Jocuri: - - - - PKG File (*.PKG) - Fișier PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Fișiere ELF (*.bin *.elf *.oelf) - - - - Game Boot - Boot Joc - - - - Only one file can be selected! - Numai un fișier poate fi selectat! - - - - PKG Extraction - Extracție PKG - - - - Patch detected! - Patch detectat! - - - - PKG and Game versions match: - Versiunile PKG și ale jocului sunt compatibile: - - - - Would you like to overwrite? - Doriți să suprascrieți? - - - - PKG Version %1 is older than installed version: - Versiunea PKG %1 este mai veche decât versiunea instalată: - - - - Game is installed: - Jocul este instalat: - - - - Would you like to install Patch: - Doriți să instalați patch-ul: - - - - DLC Installation - Instalare DLC - - - - Would you like to install DLC: %1? - Doriți să instalați DLC-ul: %1? - - - - DLC already installed: - DLC deja instalat: - - - - Game already installed - Jocul deja instalat - - - - PKG is a patch, please install the game first! - PKG este un patch, te rugăm să instalezi mai întâi jocul! - - - - PKG ERROR - EROARE PKG - - - - Extracting PKG %1/%2 - Extracție PKG %1/%2 - - - - Extraction Finished - Extracție terminată - - - - Game successfully installed at %1 - Jocul a fost instalat cu succes la %1 - - - - File doesn't appear to be a valid PKG file - Fișierul nu pare să fie un fișier PKG valid - - - - CheatsPatches - - - Cheats / Patches - Cheats / Patches - - - - defaultTextEdit_MSG - Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nu este disponibilă imaginea - - - - Serial: - Serial: - - - - Version: - Versiune: - - - - Size: - Dimensiune: - - - - Select Cheat File: - Selectează fișierul Cheat: - - - - Repository: - Repository: - - - - Download Cheats - Descarcă Cheats - - - - Delete File - Șterge Fișierul - - - - No files selected. - Nu sunt fișiere selectate. - - - - You can delete the cheats you don't want after downloading them. - Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. - - - - Do you want to delete the selected file?\n%1 - Vrei să ștergi fișierul selectat?\n%1 - - - - Select Patch File: - Selectează fișierul Patch: - - - - Download Patches - Descarcă Patches - - - - Save - Salvează - - - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Eroare - - - - No patch selected. - Nu este selectat niciun patch. - - - - Unable to open files.json for reading. - Imposibil de deschis files.json pentru citire. - - - - No patch file found for the current serial. - Nu s-a găsit niciun fișier patch pentru serialul curent. - - - - Unable to open the file for reading. - Imposibil de deschis fișierul pentru citire. - - - - Unable to open the file for writing. - Imposibil de deschis fișierul pentru scriere. - - - - Failed to parse XML: - Nu s-a reușit pararea XML: - - - - Success - Succes - - - - Options saved successfully. - Opțiunile au fost salvate cu succes. - - - - Invalid Source - Sursă invalidă - - - - The selected source is invalid. - Sursa selectată este invalidă. - - - - File Exists - Fișier existent - - - - File already exists. Do you want to replace it? - Fișierul există deja. Vrei să-l înlocuiești? - - - - Failed to save file: - Nu s-a reușit salvarea fișierului: - - - - Failed to download file: - Nu s-a reușit descărcarea fișierului: - - - - Cheats Not Found - Cheats Nu au fost găsite - - - - CheatsNotFound_MSG - Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. - - - - Cheats Downloaded Successfully - Cheats descărcate cu succes - - - - CheatsDownloadedSuccessfully_MSG - Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. - - - - Failed to save: - Nu s-a reușit salvarea: - - - - Failed to download: - Nu s-a reușit descărcarea: - - - - Download Complete - Descărcare completă - - - - DownloadComplete_MSG - Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. Poate fi necesar să actualizați jocul. - - - - Failed to parse JSON data from HTML. - Nu s-a reușit pararea datelor JSON din HTML. - - - - Failed to retrieve HTML page. - Nu s-a reușit obținerea paginii HTML. - - - - Failed to open file: - Nu s-a reușit deschiderea fișierului: - - - - XML ERROR: - EROARE XML: - - - - Failed to open files.json for writing - Nu s-a reușit deschiderea files.json pentru scriere - - - - Author: - Autor: - - - - Directory does not exist: - Directorul nu există: - - - - Failed to open files.json for reading. - Nu s-a reușit deschiderea files.json pentru citire. - - - - Name: - Nume: - + + + * Unsupported Vulkan Version + * Versiune Vulkan nesuportată + + + + Download Cheats For All Installed Games + Descarcă Cheats pentru toate jocurile instalate + + + + Download Patches For All Games + Descarcă Patches pentru toate jocurile + + + + Download Complete + Descărcare completă + + + + You have downloaded cheats for all the games you have installed. + Ai descărcat cheats pentru toate jocurile instalate. + + + + Patches Downloaded Successfully! + Patches descărcate cu succes! + + + + All Patches available for all games have been downloaded. + Toate Patches disponibile pentru toate jocurile au fost descărcate. + + + + Games: + Jocuri: + + + + PKG File (*.PKG) + Fișier PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Fișiere ELF (*.bin *.elf *.oelf) + + + + Game Boot + Boot Joc + + + + Only one file can be selected! + Numai un fișier poate fi selectat! + + + + PKG Extraction + Extracție PKG + + + + Patch detected! + Patch detectat! + + + + PKG and Game versions match: + Versiunile PKG și ale jocului sunt compatibile: + + + + Would you like to overwrite? + Doriți să suprascrieți? + + + + PKG Version %1 is older than installed version: + Versiunea PKG %1 este mai veche decât versiunea instalată: + + + + Game is installed: + Jocul este instalat: + + + + Would you like to install Patch: + Doriți să instalați patch-ul: + + + + DLC Installation + Instalare DLC + + + + Would you like to install DLC: %1? + Doriți să instalați DLC-ul: %1? + + + + DLC already installed: + DLC deja instalat: + + + + Game already installed + Jocul deja instalat + + + + PKG is a patch, please install the game first! + PKG este un patch, te rugăm să instalezi mai întâi jocul! + + + + PKG ERROR + EROARE PKG + + + + Extracting PKG %1/%2 + Extracție PKG %1/%2 + + + + Extraction Finished + Extracție terminată + + + + Game successfully installed at %1 + Jocul a fost instalat cu succes la %1 + + + + File doesn't appear to be a valid PKG file + Fișierul nu pare să fie un fișier PKG valid + + + + CheatsPatches + + + Cheats / Patches + Cheats / Patches + + + + defaultTextEdit_MSG + Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Nu este disponibilă imaginea + + + + Serial: + Serial: + + + + Version: + Versiune: + + + + Size: + Dimensiune: + + + + Select Cheat File: + Selectează fișierul Cheat: + + + + Repository: + Repository: + + + + Download Cheats + Descarcă Cheats + + + + Delete File + Șterge Fișierul + + + + No files selected. + Nu sunt fișiere selectate. + + + + You can delete the cheats you don't want after downloading them. + Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. + + + + Do you want to delete the selected file?\n%1 + Vrei să ștergi fișierul selectat?\n%1 + + + + Select Patch File: + Selectează fișierul Patch: + + + + Download Patches + Descarcă Patches + + + + Save + Salvează + + + + Cheats + Cheats + + + + Patches + Patches + + + + Error + Eroare + + + + No patch selected. + Nu este selectat niciun patch. + + + + Unable to open files.json for reading. + Imposibil de deschis files.json pentru citire. + + + + No patch file found for the current serial. + Nu s-a găsit niciun fișier patch pentru serialul curent. + + + + Unable to open the file for reading. + Imposibil de deschis fișierul pentru citire. + + + + Unable to open the file for writing. + Imposibil de deschis fișierul pentru scriere. + + + + Failed to parse XML: + Nu s-a reușit pararea XML: + + + + Success + Succes + + + + Options saved successfully. + Opțiunile au fost salvate cu succes. + + + + Invalid Source + Sursă invalidă + + + + The selected source is invalid. + Sursa selectată este invalidă. + + + + File Exists + Fișier existent + + + + File already exists. Do you want to replace it? + Fișierul există deja. Vrei să-l înlocuiești? + + + + Failed to save file: + Nu s-a reușit salvarea fișierului: + + + + Failed to download file: + Nu s-a reușit descărcarea fișierului: + + + + Cheats Not Found + Cheats Nu au fost găsite + + + + CheatsNotFound_MSG + Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. + + + + Cheats Downloaded Successfully + Cheats descărcate cu succes + + + + CheatsDownloadedSuccessfully_MSG + Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. + + + + Failed to save: + Nu s-a reușit salvarea: + + + + Failed to download: + Nu s-a reușit descărcarea: + + + + Download Complete + Descărcare completă + + + + DownloadComplete_MSG + Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. Poate fi necesar să actualizați jocul. + + + + Failed to parse JSON data from HTML. + Nu s-a reușit pararea datelor JSON din HTML. + + + + Failed to retrieve HTML page. + Nu s-a reușit obținerea paginii HTML. + + + + Failed to open file: + Nu s-a reușit deschiderea fișierului: + + + + XML ERROR: + EROARE XML: + + + + Failed to open files.json for writing + Nu s-a reușit deschiderea files.json pentru scriere + + + + Author: + Autor: + + + + Directory does not exist: + Directorul nu există: + + + + Failed to open files.json for reading. + Nu s-a reușit deschiderea files.json pentru citire. + + + + Name: + Nume: + Can't apply cheats before the game is started Nu poți aplica cheats înainte ca jocul să înceapă. - + SettingsDialog @@ -931,6 +973,111 @@ Close Închide + + + Point your mouse at an option to display its description. + Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. + + + + consoleLanguageGroupBox + Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. + + + + emulatorLanguageGroupBox + Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. + + + + fullscreenCheckBox + Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. + + + + showSplashCheckBox + Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. + + + + ps4proCheckBox + Este PS4 Pro:\nFace ca emulatorul să se comporte ca un PS4 PRO, ceea ce poate activa funcții speciale în jocurile care o suportă. + + + + userName + Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. + + + + logTypeGroupBox + Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. + + + + logFilter + Filtrul jurnalului: Filtrează jurnalul pentru a imprima doar informații specifice. Exemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. + + + + updaterGroupBox + Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. + + + + GUIgroupBox + Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. + + + + graphicsAdapterGroupBox + Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. + + + + resolutionLayout + Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. + + + + heightDivider + Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! + + + + dumpShadersCheckBox + Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. + + + + nullGpuCheckBox + Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. + + + + dumpPM4CheckBox + Activează salvarea PM4:\nÎn scopuri de depanare tehnică, salvează datele brute ale instrucțiunilor GPU într-un folder pe măsură ce emulatorul le procesează. + + + + debugDump + Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. + + + + vkValidationCheckBox + Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. + + + + vkSyncValidationCheckBox + Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. + + + + rdocCheckBox + Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. + GameListFrame @@ -975,4 +1122,132 @@ Drum + + CheckUpdate + + + Auto Updater + Actualizator automat + + + + Error + Eroare + + + + Network error: + Eroare de rețea: + + + + Failed to parse update information. + Nu s-au putut analiza informațiile de actualizare. + + + + No pre-releases found. + Nu au fost găsite pre-lansări. + + + + Invalid release data. + Datele versiunii sunt invalide. + + + + No download URL found for the specified asset. + Nu s-a găsit URL de descărcare pentru resursa specificată. + + + + Your version is already up to date! + Versiunea ta este deja actualizată! + + + + Update Available + Actualizare disponibilă + + + + Update Channel + Canal de Actualizare + + + + Current Version + Versiunea curentă + + + + Latest Version + Ultima versiune + + + + Do you want to update? + Doriți să actualizați? + + + + Show Changelog + Afișați jurnalul de modificări + + + + Check for Updates at Startup + Verifică actualizări la pornire + + + + Update + Actualizare + + + + No + Nu + + + + Hide Changelog + Ascunde jurnalul de modificări + + + + Changes + Modificări + + + + Network error occurred while trying to access the URL + A apărut o eroare de rețea în timpul încercării de a accesa URL-ul + + + + Download Complete + Descărcare completă + + + + The update has been downloaded, press OK to install. + Actualizarea a fost descărcată, apăsați OK pentru a instala. + + + + Failed to save the update file at + Nu s-a putut salva fișierul de actualizare la + + + + Starting Update... + Încep actualizarea... + + + + Failed to create the update script file + Nu s-a putut crea fișierul script de actualizare + + \ No newline at end of file diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 1eac3e515..13cc49f20 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1,912 +1,954 @@ - - - - AboutDialog - - - About shadPS4 - О shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - Это програмное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. - - - - ElfViewer - - - Open Folder - Открыть папку - - - - GameInfoClass - - - Loading game list, please wait :3 - Загрузка списка игр, пожалуйста подождите :3 - - - - Cancel - Отмена - - - - Loading... - Загрузка... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - - Directory to install games - Папка для установки игр - - - - Browse - Обзор - - - - Error - Ошибка - - - - The value for location to install games is not valid. - Недопустимое значение местоположения для установки игр. - - - - GuiContextMenus - - - Create Shortcut - Создать ярлык - - - - Open Game Folder - Открыть папку с игрой - - - - Cheats / Patches - Читы и патчи - - - - SFO Viewer - Просмотр SFO - - - - Trophy Viewer - Просмотр трофеев - - - - Copy info - Копировать информацию - - - - Copy Name - Копировать имя - - - - Copy Serial - Копировать серийный номер - - - - Copy All - Копировать все - - - - Shortcut creation - Создание ярлыка - - - - Shortcut created successfully!\n %1 - Ярлык создан успешно!\n %1 - - - - Error - Ошибка - - - - Error creating shortcut!\n %1 - Ошибка создания ярлыка!\n %1 - - - - Install PKG - Установить PKG - - - - MainWindow - - - Open/Add Elf Folder - Открыть/Добавить папку Elf - - - - Install Packages (PKG) - Установить пакеты (PKG) - - - - Boot Game - Запустить игру - - - - About shadPS4 - О shadPS4 - - - - Configure... - Настроить... - - - - Install application from a .pkg file - Установить приложение из файла .pkg - - - - Recent Games - Недавние игры - - - - Exit - Выход - - - - Exit shadPS4 - Выйти из shadPS4 - - - - Exit the application. - Выйти из приложения. - - - - Show Game List - Показать список игр - - - - Game List Refresh - Обновить список игр - - - - Tiny - Крошечный - - - - Small - Маленький - - - - Medium - Средний - - - - Large - Большой - - - - List View - Список - - - - Grid View - Сетка - - - - Elf Viewer - Elf - - - - Game Install Directory - Каталог установки игры - - - - Download Cheats/Patches - Скачать читы или патчи - - - - Dump Game List - Дамп списка игр - - - - PKG Viewer - Просмотр PKG - - - - Search... - Поиск... - - - - File - Файл - - - - View - Вид - - - - Game List Icons - Размер иконок списка игр - - - - Game List Mode - Вид списка игр - - - - Settings - Настройки - - - - Utils - Утилиты - - - - Themes - Темы - - - - About - Справка - - - - Dark - Темная - - - - Light - Светлая - - - - Green - Зеленая - - - - Blue - Синяя - - - - Violet - Фиолетовая - - - - toolBar - Панель инструментов - - - - PKGViewer - - - Open Folder - Открыть папку - - - - TrophyViewer - - - Trophy Viewer - Трофеи - - - - SettingsDialog - - - Settings - Настройки - - - - General - Общее - - - - System - Система - - - - Console Language - Язык консоли - - - - Emulator Language - Язык эмулятора - - - - Emulator - Эмулятор - - - - Enable Fullscreen - Включить полноэкранный режим - - - - Show Splash - Показать заставку - - - - Is PS4 Pro - Режим PS4 Pro - - - - Username - Имя пользователя - - - - Logger - Логирование - - - - Log Type - Тип логов - - - - Log Filter - Фильтр логов - - - - Graphics - Графика - - - - Graphics Device - Графическое устройство - - - - Width - Ширина - - - - Height - Высота - - - - Vblank Divider - Разделитель Vblank - - - - Advanced - Продвинутые - - - - Enable Shaders Dumping - Включить дамп шейдеров - - - - Enable NULL GPU - Включить NULL GPU - - - - Enable PM4 Dumping - Включить дамп PM4 - - - - Debug - Отладка - - - - Enable Debug Dumping - Включить отладочные дампы - - - - Enable Vulkan Validation Layers - Включить слои валидации Vulkan - - - - Enable Vulkan Synchronization Validation - Включить валидацию синхронизации Vulkan - - - - Enable RenderDoc Debugging - Включить отладку RenderDoc - - - MainWindow + AboutDialog + + + About shadPS4 + О shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + Это програмное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. + + + + ElfViewer + + + Open Folder + Открыть папку + + + + GameInfoClass + + + Loading game list, please wait :3 + Загрузка списка игр, пожалуйста подождите :3 + + + + Cancel + Отмена + + + + Loading... + Загрузка... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Выберите папку + + + + Directory to install games + Папка для установки игр + + + + Browse + Обзор + + + + Error + Ошибка + + + + The value for location to install games is not valid. + Недопустимое значение местоположения для установки игр. + + + + GuiContextMenus + + + Create Shortcut + Создать ярлык + + + + Open Game Folder + Открыть папку с игрой + + + + Cheats / Patches + Читы и патчи + + + + SFO Viewer + Просмотр SFO + + + + Trophy Viewer + Просмотр трофеев + + + + Copy info + Копировать информацию + + + + Copy Name + Копировать имя + + + + Copy Serial + Копировать серийный номер + + + + Copy All + Копировать все + + + + Shortcut creation + Создание ярлыка + + + + Shortcut created successfully!\n %1 + Ярлык создан успешно!\n %1 + + + + Error + Ошибка + + + + Error creating shortcut!\n %1 + Ошибка создания ярлыка!\n %1 + + + + Install PKG + Установить PKG + + + + MainWindow + + + Open/Add Elf Folder + Открыть/Добавить папку Elf + + + + Install Packages (PKG) + Установить пакеты (PKG) + + + + Boot Game + Запустить игру + + + + Check for Updates + Проверить обновления + + + + About shadPS4 + О shadPS4 + + + + Configure... + Настроить... + + + + Install application from a .pkg file + Установить приложение из файла .pkg + + + + Recent Games + Недавние игры + + + + Exit + Выход + + + + Exit shadPS4 + Выйти из shadPS4 + + + + Exit the application. + Выйти из приложения. + + + + Show Game List + Показать список игр + + + + Game List Refresh + Обновить список игр + + + + Tiny + Крошечный + + + + Small + Маленький + + + + Medium + Средний + + + + Large + Большой + + + + List View + Список + + + + Grid View + Сетка + + + + Elf Viewer + Elf + + + + Game Install Directory + Каталог установки игры + + + + Download Cheats/Patches + Скачать читы или патчи + + + + Dump Game List + Дамп списка игр + + + + PKG Viewer + Просмотр PKG + + + + Search... + Поиск... + + + + File + Файл + + + + View + Вид + + + + Game List Icons + Размер иконок списка игр + + + + Game List Mode + Вид списка игр + + + + Settings + Настройки + + + + Utils + Утилиты + + + + Themes + Темы + + + + Help + Помощь + + + + Dark + Темная + + + + Light + Светлая + + + + Green + Зеленая + + + + Blue + Синяя + + + + Violet + Фиолетовая + + + + toolBar + Панель инструментов + + + + PKGViewer + + + Open Folder + Открыть папку + + + + TrophyViewer + + + Trophy Viewer + Трофеи + + + + SettingsDialog + + + Settings + Настройки + + + + General + Общее + + + + System + Система + + + + Console Language + Язык консоли + + + + Emulator Language + Язык эмулятора + + + + Emulator + Эмулятор + + + + Enable Fullscreen + Полноэкранный режим + + + + Show Splash + Показывать заставку + + + + Is PS4 Pro + Режим PS4 Pro + + + + Username + Имя пользователя + + + + Logger + Логирование + + + + Log Type + Тип логов + + + + Log Filter + Фильтр логов + + + + Graphics + Графика + + + + Graphics Device + Графическое устройство + + + + Width + Ширина + + + + Height + Высота + + + + Vblank Divider + Делитель Vblank + + + + Advanced + Продвинутые + + + + Enable Shaders Dumping + Включить дамп шейдеров + + + + Enable NULL GPU + Включить NULL GPU + + + + Enable PM4 Dumping + Включить дамп PM4 + + + + Debug + Отладка + + + + Enable Debug Dumping + Включить отладочные дампы + + + + Enable Vulkan Validation Layers + Включить слои валидации Vulkan + + + + Enable Vulkan Synchronization Validation + Включить валидацию синхронизации Vulkan + + + + Enable RenderDoc Debugging + Включить отладку RenderDoc + + + + Update + Обновление + + + + Check for Updates at Startup + Проверка обновлений при запуске + + + + Update Channel + Канал обновления + + + + Check for Updates + Проверить обновления + + + + GUI Settings + Настройки интерфейса + + + + Play title music + Воспроизведение заглавной музыки + + + + Volume + Громкость + + + + MainWindow Game List Список игр - - - * Unsupported Vulkan Version - * Неподдерживаемая версия Vulkan - - - - Download Cheats For All Installed Games - Скачать читы для всех установленных игр - - - - Download Patches For All Games - Скачать патчи для всех игр - - - - Download Complete - Скачивание завершено - - - - You have downloaded cheats for all the games you have installed. - Вы скачали читы для всех установленных игр. - - - - Patches Downloaded Successfully! - Патчи успешно скачаны! - - - - All Patches available for all games have been downloaded. - Все доступные патчи для всех игр были скачаны. - - - - Games: - Игры: - - - - PKG File (*.PKG) - Файл PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Файл ELF (*.bin *.elf *.oelf) - - - - Game Boot - Запуск игры - - - - Only one file can be selected! - Можно выбрать только один файл! - - - - PKG Extraction - Извлечение PKG - - - - Patch detected! - Обнаружен патч! - - - - PKG and Game versions match: - Версии PKG и игры совпадают: - - - - Would you like to overwrite? - Хотите перезаписать? - - - - PKG Version %1 is older than installed version: - Версия PKG %1 старее установленной версии: - - - - Game is installed: - Игра установлена: - - - - Would you like to install Patch: - Хотите установить патч: - - - - DLC Installation - Установка DLC - - - - Would you like to install DLC: %1? - Вы хотите установить DLC: %1?? - - - - DLC already installed: - DLC уже установлен: - - - - Game already installed - Игра уже установлена - - - - PKG is a patch, please install the game first! - PKG - это патч, сначала установите игру! - - - - PKG ERROR - ОШИБКА PKG - - - - Extracting PKG %1/%2 - Извлечение PKG %1/%2 - - - - Extraction Finished - Извлечение завершено - - - - Game successfully installed at %1 - Игра успешно установлена в %1 - - - - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG - + + + * Unsupported Vulkan Version + * Неподдерживаемая версия Vulkan + + + + Download Cheats For All Installed Games + Скачать читы для всех установленных игр + + + + Download Patches For All Games + Скачать патчи для всех игр + + + + Download Complete + Скачивание завершено + + + + You have downloaded cheats for all the games you have installed. + Вы скачали читы для всех установленных игр. + + + + Patches Downloaded Successfully! + Патчи успешно скачаны! + + + + All Patches available for all games have been downloaded. + Все доступные патчи для всех игр были скачаны. + + + + Games: + Игры: + + + + PKG File (*.PKG) + Файл PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Файл ELF (*.bin *.elf *.oelf) + + + + Game Boot + Запуск игры + + + + Only one file can be selected! + Можно выбрать только один файл! + + + + PKG Extraction + Извлечение PKG + + + + Patch detected! + Обнаружен патч! + + + + PKG and Game versions match: + Версии PKG и игры совпадают: + + + + Would you like to overwrite? + Хотите перезаписать? + + + + PKG Version %1 is older than installed version: + Версия PKG %1 старее установленной версии: + + + + Game is installed: + Игра установлена: + + + + Would you like to install Patch: + Хотите установить патч: + + + + DLC Installation + Установка DLC + + + + Would you like to install DLC: %1? + Вы хотите установить DLC: %1?? + + + + DLC already installed: + DLC уже установлен: + + + + Game already installed + Игра уже установлена + + + + PKG is a patch, please install the game first! + PKG - это патч, сначала установите игру! + + + + PKG ERROR + ОШИБКА PKG + + + + Extracting PKG %1/%2 + Извлечение PKG %1/%2 + + + + Extraction Finished + Извлечение завершено + + + + Game successfully installed at %1 + Игра успешно установлена в %1 + + + + File doesn't appear to be a valid PKG file + Файл не является допустимым файлом PKG + - CheatsPatches - - - Cheats / Patches - Читы и патчи - - - - defaultTextEdit_MSG - Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Изображение недоступно - - - - Serial: - Серийный номер: - - - - Version: - Версия: - - - - Size: - Размер: - - - - Select Cheat File: - Выберите файл чита: - - - - Repository: - Репозиторий: - - - - Download Cheats - Скачать читы - - - - Delete File - Удалить файл - - - - No files selected. - Файлы не выбраны. - - - - You can delete the cheats you don't want after downloading them. - Вы можете удалить ненужные читы после их скачивания. - - - - Do you want to delete the selected file?\n%1 - Вы хотите удалить выбранный файл?\n%1 - - - - Select Patch File: - Выберите файл патча: - - - - Download Patches - Скачать патчи - - - - Save - Сохранить - - - - Cheats - Читы - - - - Patches - Патчи - - - - Error - Ошибка - - - - No patch selected. - Патч не выбран. - - - - Unable to open files.json for reading. - Не удалось открыть файл files.json для чтения. - - - - No patch file found for the current serial. - Не найден файл патча для текущего серийного номера. - - - - Unable to open the file for reading. - Не удалось открыть файл для чтения. - - - - Unable to open the file for writing. - Не удалось открыть файл для записи. - - - - Failed to parse XML: - Не удалось разобрать XML: - - - - Success - Успех - - - - Options saved successfully. - Опции успешно сохранены. - - - - Invalid Source - Неверный источник - - - - The selected source is invalid. - Выбранный источник недействителен. - - - - File Exists - Файл существует - - - - File already exists. Do you want to replace it? - Файл уже существует. Хотите заменить его? - - - - Failed to save file: - Не удалось сохранить файл: - - - - Failed to download file: - Не удалось скачать файл: - - - - Cheats Not Found - Читы не найдены - - - - CheatsNotFound_MSG - Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. - - - - Cheats Downloaded Successfully - Читы успешно скачаны - - - - CheatsDownloadedSuccessfully_MSG - Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. - - - - Failed to save: - Не удалось сохранить: - - - - Failed to download: - Не удалось скачать: - - - - Download Complete - Скачивание завершено - - - - DownloadComplete_MSG - Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. Возможно, потребуется обновить игру. - - - - Failed to parse JSON data from HTML. - Не удалось разобрать данные JSON из HTML. - - - - Failed to retrieve HTML page. - Не удалось получить HTML-страницу. - - - - Failed to open file: - Не удалось открыть файл: - - - - XML ERROR: - ОШИБКА XML: - - - - Failed to open files.json for writing - Не удалось открыть файл files.json для записи - - - - Author: - Автор: - - - - Directory does not exist: - Каталог не существует: - - - - Failed to open files.json for reading. - Не удалось открыть файл files.json для чтения. - - - - Name: - Имя: - + CheatsPatches + + + Cheats / Patches + Читы и патчи + + + + defaultTextEdit_MSG + Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Изображение недоступно + + + + Serial: + Серийный номер: + + + + Version: + Версия: + + + + Size: + Размер: + + + + Select Cheat File: + Выберите файл чита: + + + + Repository: + Репозиторий: + + + + Download Cheats + Скачать читы + + + + Delete File + Удалить файл + + + + No files selected. + Файлы не выбраны. + + + + You can delete the cheats you don't want after downloading them. + Вы можете удалить ненужные читы после их скачивания. + + + + Do you want to delete the selected file?\n%1 + Вы хотите удалить выбранный файл?\n%1 + + + + Select Patch File: + Выберите файл патча: + + + + Download Patches + Скачать патчи + + + + Save + Сохранить + + + + Cheats + Читы + + + + Patches + Патчи + + + + Error + Ошибка + + + + No patch selected. + Патч не выбран. + + + + Unable to open files.json for reading. + Не удалось открыть файл files.json для чтения. + + + + No patch file found for the current serial. + Не найден файл патча для текущего серийного номера. + + + + Unable to open the file for reading. + Не удалось открыть файл для чтения. + + + + Unable to open the file for writing. + Не удалось открыть файл для записи. + + + + Failed to parse XML: + Не удалось разобрать XML: + + + + Success + Успех + + + + Options saved successfully. + Опции успешно сохранены. + + + + Invalid Source + Неверный источник + + + + The selected source is invalid. + Выбранный источник недействителен. + + + + File Exists + Файл существует + + + + File already exists. Do you want to replace it? + Файл уже существует. Хотите заменить его? + + + + Failed to save file: + Не удалось сохранить файл: + + + + Failed to download file: + Не удалось скачать файл: + + + + Cheats Not Found + Читы не найдены + + + + CheatsNotFound_MSG + Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. + + + + Cheats Downloaded Successfully + Читы успешно скачаны + + + + CheatsDownloadedSuccessfully_MSG + Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. + + + + Failed to save: + Не удалось сохранить: + + + + Failed to download: + Не удалось скачать: + + + + Download Complete + Скачивание завершено + + + + DownloadComplete_MSG + Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. Возможно, потребуется обновить игру. + + + + Failed to parse JSON data from HTML. + Не удалось разобрать данные JSON из HTML. + + + + Failed to retrieve HTML page. + Не удалось получить HTML-страницу. + + + + Failed to open file: + Не удалось открыть файл: + + + + XML ERROR: + ОШИБКА XML: + + + + Failed to open files.json for writing + Не удалось открыть файл files.json для записи + + + + Author: + Автор: + + + + Directory does not exist: + Каталог не существует: + + + + Failed to open files.json for reading. + Не удалось открыть файл files.json для чтения. + + + + Name: + Имя: + Can't apply cheats before the game is started - Невозможно применить читы до начала игрыs + Невозможно применить читы до начала игры @@ -924,13 +966,118 @@ Restore Defaults - Восстановить умолчания + По умолчанию Close Закрыть + + + Point your mouse at an option to display its description. + Наведите указатель мыши на опцию, чтобы отобразить ее описание. + + + + consoleLanguageGroupBox + Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык который поддерживается игрой, так как он может отличаться в зависимости от региона. + + + + emulatorLanguageGroupBox + Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. + + + + fullscreenCheckBox + Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nВы можете отключить это, нажав клавишу F11. + + + + showSplashCheckBox + Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска игры. + + + + ps4proCheckBox + Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это. + + + + userName + Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. + + + + logTypeGroupBox + Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. + + + + logFilter + Фильтр логов: Фильтрует логи, чтобы показывать только определенную информацию. Примеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. + + + + updaterGroupBox + Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. + + + + GUIgroupBox + Воспроизведение заглавной музыки:\nЕсли игра это поддерживает, включает воспроизведение специальной музыки при выборе игры в интерфейсе. + + + + graphicsAdapterGroupBox + Графическое устройство:\nВ системах с несколькими GPU выберите GPU, который будет использовать эмулятор из выпадающего списка,\nили выберите "Auto Select", чтобы определить его автоматически. + + + + resolutionLayout + Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. + + + + heightDivider + Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! + + + + dumpShadersCheckBox + Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. + + + + nullGpuCheckBox + Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. + + + + dumpPM4CheckBox + Включить дамп PM4:\nДля технической отладки сохраняет необработанные данные инструкций GPU в папку, пока эмулятор их обрабатывает. + + + + debugDump + Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. + + + + vkValidationCheckBox + Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. + + + + vkSyncValidationCheckBox + Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. + + + + rdocCheckBox + Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с Renderdoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. + GameListFrame @@ -975,4 +1122,132 @@ Путь + + CheckUpdate + + + Auto Updater + Автообновление + + + + Error + Ошибка + + + + Network error: + Сетевая ошибка: + + + + Failed to parse update information. + Не удалось разобрать информацию об обновлении. + + + + No pre-releases found. + Предварительных версий не найдено. + + + + Invalid release data. + Недопустимые данные релиза. + + + + No download URL found for the specified asset. + Не найден URL для загрузки указанного ресурса. + + + + Your version is already up to date! + Ваша версия уже обновлена! + + + + Update Available + Доступно обновление + + + + Update Channel + Канал обновления + + + + Current Version + Текущая версия + + + + Latest Version + Последняя версия + + + + Do you want to update? + Вы хотите обновиться? + + + + Show Changelog + Показать журнал изменений + + + + Check for Updates at Startup + Проверка обновлений при запуске + + + + Update + Обновиться + + + + No + Нет + + + + Hide Changelog + Скрыть журнал изменений + + + + Changes + Журнал изменений + + + + Network error occurred while trying to access the URL + Произошла сетевая ошибка при попытке доступа к URL + + + + Download Complete + Скачивание завершено + + + + The update has been downloaded, press OK to install. + Обновление загружено, нажмите OK для установки. + + + + Failed to save the update file at + Не удалось сохранить файл обновления в + + + + Starting Update... + Начало обновления... + + + + Failed to create the update script file + Не удалось создать файл скрипта обновления + + \ No newline at end of file diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 85110c6ae..d9f1d3859 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - Rreth shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. - - - - ElfViewer - - - Open Folder - Hap Dosjen - - - - GameInfoClass - - - Loading game list, please wait :3 - Po ngarkohet lista e lojërave, të lutem prit :3 - - - - Cancel - Anulo - - - - Loading... - Duke ngarkuar... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen - - - - Directory to install games - Dosja ku do instalohen lojërat - - - - Browse - Shfleto - - - - Error - Gabim - - - - The value for location to install games is not valid. - Vlera për vendndodhjen e instalimit të lojërave nuk është e vlefshme. - - - - GuiContextMenus - - - Create Shortcut - Krijo Shkurtore - - - - Open Game Folder - Hap Dosjen e Lojës - - - - Cheats / Patches - Mashtrime / Arna - - - - SFO Viewer - Shikuesi i SFO - - - - Trophy Viewer - Shikuesi i Trofeve - - - - Copy info - Kopjo informacionin - - - - Copy Name - Kopjo Emrin - - - - Copy Serial - Kopjo Serikun - - - - Copy All - Kopjo të Gjitha - - - - Shortcut creation - Krijim i shkurtores - - - - Shortcut created successfully!\n %1 - Shkurtorja u krijua me sukses!\n %1 - - - - Error - Gabim - - - - Error creating shortcut!\n %1 - Gabim në krijimin e shkurtores!\n %1 - - - - Install PKG - Instalo PKG - - - - MainWindow - - - Open/Add Elf Folder - Hap/Shto Dosje ELF - - - - Install Packages (PKG) - Instalo Paketat (PKG) - - - - Boot Game - Nis Lojën - - - - About shadPS4 - Rreth shadPS4 - - - - Configure... - Formëso... - - - - Install application from a .pkg file - Instalo aplikacionin nga një skedar .pkg - - - - Recent Games - Lojërat e fundit - - - - Exit - Dil - - - - Exit shadPS4 - Dil nga shadPS4 - - - - Exit the application. - Dil nga aplikacioni. - - - - Show Game List - Shfaq Listën e Lojërave - - - - Game List Refresh - Rifresko Listën e Lojërave - - - - Tiny - Të vockla - - - - Small - Të vogla - - - - Medium - Të mesme - - - - Large - Të mëdha - - - - List View - Pamja e Listës - - - - Grid View - Pamja e Rrjetës - - - - Elf Viewer - Shikuesi i Elf - - - - Game Install Directory - Dosja e Instalimit të Lojës - - - - Download Cheats/Patches - Shkarko Mashtrime/Arna - - - - Dump Game List - Zbraz Listën e Lojërave - - - - PKG Viewer - Shikuesi i PKG - - - - Search... - Kërko... - - - - File - Skedari - - - - View - Pamja - - - - Game List Icons - Ikonat e Listës së Lojërave - - - - Game List Mode - Mënyra e Listës së Lojërave - - - - Settings - Cilësimet - - - - Utils - Shërbimet - - - - Themes - Motivet - - - - About - Rreth - - - - Dark - E errët - - - - Light - E çelët - - - - Green - E gjelbër - - - - Blue - E kaltër - - - - Violet - Vjollcë - - - - toolBar - Shiriti i veglave - - - - PKGViewer - - - Open Folder - Hap Dosjen - - - - TrophyViewer - - - Trophy Viewer - Shikuesi i Trofeve - - - - SettingsDialog - - - Settings - Cilësimet - - - - General - Të përgjithshme - - - - System - Sistemi - - - - Console Language - Gjuha e Konsolës - - - - Emulator Language - Gjuha e emulatorit - - - - Emulator - Emulatori - - - - Enable Fullscreen - Aktivizo Ekranin e plotë - - - - Show Splash - Shfaq Pamjen e nisjes - - - - Is PS4 Pro - Mënyra PS4 Pro - - - - Username - Nofka - - - - Logger - Regjistruesi i të dhënave - - - - Log Type - Lloji i Ditarit - - - - Log Filter - Filtri i Ditarit - - - - Graphics - Grafika - - - - Graphics Device - Pajisja e Grafikës - - - - Width - Gjerësia - - - - Height - Lartësia - - - - Vblank Divider - Ndarës Vblank - - - - Advanced - Të përparuara - - - - Enable Shaders Dumping - Aktivizo Zbrazjen e Shaders-ave - - - - Enable NULL GPU - Aktivizo GPU-në NULL - - - - Enable PM4 Dumping - Aktivizo Zbrazjen PM4 - - - - Debug - Korrigjim - - - - Enable Debug Dumping - Aktivizo Zbrazjen për Korrigjim - - - - Enable Vulkan Validation Layers - Aktivizo Shtresat e Vlefshmërisë Vulkan - - - - Enable Vulkan Synchronization Validation - Aktivizo Vërtetimin e Sinkronizimit Vulkan - - - - Enable RenderDoc Debugging - Aktivizo Korrigjimin RenderDoc - - - MainWindow + AboutDialog + + + About shadPS4 + Rreth shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. + + + + ElfViewer + + + Open Folder + Hap Dosjen + + + + GameInfoClass + + + Loading game list, please wait :3 + Po ngarkohet lista e lojërave, të lutem prit :3 + + + + Cancel + Anulo + + + + Loading... + Duke ngarkuar... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Përzgjidh dosjen + + + + Directory to install games + Dosja ku do instalohen lojërat + + + + Browse + Shfleto + + + + Error + Gabim + + + + The value for location to install games is not valid. + Vlera për vendndodhjen e instalimit të lojërave nuk është e vlefshme. + + + + GuiContextMenus + + + Create Shortcut + Krijo Shkurtore + + + + Open Game Folder + Hap Dosjen e Lojës + + + + Cheats / Patches + Mashtrime / Arna + + + + SFO Viewer + Shikuesi i SFO + + + + Trophy Viewer + Shikuesi i Trofeve + + + + Copy info + Kopjo informacionin + + + + Copy Name + Kopjo Emrin + + + + Copy Serial + Kopjo Serikun + + + + Copy All + Kopjo të Gjitha + + + + Shortcut creation + Krijim i shkurtores + + + + Shortcut created successfully!\n %1 + Shkurtorja u krijua me sukses!\n %1 + + + + Error + Gabim + + + + Error creating shortcut!\n %1 + Gabim në krijimin e shkurtores!\n %1 + + + + Install PKG + Instalo PKG + + + + MainWindow + + + Open/Add Elf Folder + Hap/Shto Dosje ELF + + + + Install Packages (PKG) + Instalo Paketat (PKG) + + + + Boot Game + Nis Lojën + + + + Check for Updates + Kontrollo për përditësime + + + + About shadPS4 + Rreth shadPS4 + + + + Configure... + Formëso... + + + + Install application from a .pkg file + Instalo aplikacionin nga një skedar .pkg + + + + Recent Games + Lojërat e fundit + + + + Exit + Dil + + + + Exit shadPS4 + Dil nga shadPS4 + + + + Exit the application. + Dil nga aplikacioni. + + + + Show Game List + Shfaq Listën e Lojërave + + + + Game List Refresh + Rifresko Listën e Lojërave + + + + Tiny + Të vockla + + + + Small + Të vogla + + + + Medium + Të mesme + + + + Large + Të mëdha + + + + List View + Pamja e Listës + + + + Grid View + Pamja e Rrjetës + + + + Elf Viewer + Shikuesi i Elf + + + + Game Install Directory + Dosja e Instalimit të Lojës + + + + Download Cheats/Patches + Shkarko Mashtrime/Arna + + + + Dump Game List + Zbraz Listën e Lojërave + + + + PKG Viewer + Shikuesi i PKG + + + + Search... + Kërko... + + + + File + Skedari + + + + View + Pamja + + + + Game List Icons + Ikonat e Listës së Lojërave + + + + Game List Mode + Mënyra e Listës së Lojërave + + + + Settings + Cilësimet + + + + Utils + Shërbimet + + + + Themes + Motivet + + + + Help + Ndihmë + + + + Dark + E errët + + + + Light + E çelët + + + + Green + E gjelbër + + + + Blue + E kaltër + + + + Violet + Vjollcë + + + + toolBar + Shiriti i veglave + + + + PKGViewer + + + Open Folder + Hap Dosjen + + + + TrophyViewer + + + Trophy Viewer + Shikuesi i Trofeve + + + + SettingsDialog + + + Settings + Cilësimet + + + + General + Të përgjithshme + + + + System + Sistemi + + + + Console Language + Gjuha e Konsolës + + + + Emulator Language + Gjuha e emulatorit + + + + Emulator + Emulatori + + + + Enable Fullscreen + Aktivizo Ekranin e plotë + + + + Show Splash + Shfaq Pamjen e nisjes + + + + Is PS4 Pro + Mënyra PS4 Pro + + + + Username + Nofka + + + + Logger + Regjistruesi i të dhënave + + + + Log Type + Lloji i Ditarit + + + + Log Filter + Filtri i Ditarit + + + + Graphics + Grafika + + + + Graphics Device + Pajisja e Grafikës + + + + Width + Gjerësia + + + + Height + Lartësia + + + + Vblank Divider + Ndarës Vblank + + + + Advanced + Të përparuara + + + + Enable Shaders Dumping + Aktivizo Zbrazjen e Shaders-ave + + + + Enable NULL GPU + Aktivizo GPU-në NULL + + + + Enable PM4 Dumping + Aktivizo Zbrazjen PM4 + + + + Debug + Korrigjim + + + + Enable Debug Dumping + Aktivizo Zbrazjen për Korrigjim + + + + Enable Vulkan Validation Layers + Aktivizo Shtresat e Vlefshmërisë Vulkan + + + + Enable Vulkan Synchronization Validation + Aktivizo Vërtetimin e Sinkronizimit Vulkan + + + + Enable RenderDoc Debugging + Aktivizo Korrigjimin RenderDoc + + + + Update + Përditëso + + + + Check for Updates at Startup + Kontrollo për përditësime në nisje + + + + Update Channel + Kanali i Përditësimit + + + + Check for Updates + Kontrollo për përditësime + + + + GUI Settings + Parametrat e GUI + + + + Play title music + Luaj muzikën e titullit + + + + Volume + Volumi + + + + MainWindow Game List Lista e lojërave - - - * Unsupported Vulkan Version - * Version i pambështetur i Vulkan - - - - Download Cheats For All Installed Games - Shkarko Mashtrime Për Të Gjitha Lojërat e Instaluara - - - - Download Patches For All Games - Shkarko Arna Për Të Gjitha Lojërat e Instaluara - - - - Download Complete - Shkarkimi Përfundoi - - - - You have downloaded cheats for all the games you have installed. - Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. - - - - Patches Downloaded Successfully! - Arnat u shkarkuan me sukses! - - - - All Patches available for all games have been downloaded. - Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. - - - - Games: - Lojërat: - - - - PKG File (*.PKG) - Skedar PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Skedarë ELF (*.bin *.elf *.oelf) - - - - Game Boot - Nis Lojën - - - - Only one file can be selected! - Mund të përzgjidhet vetëm një skedar! - - - - PKG Extraction - Nxjerrja e PKG-së - - - - Patch detected! - U zbulua një arnë! - - - - PKG and Game versions match: - PKG-ja dhe versioni i Lojës përputhen: - - - - Would you like to overwrite? - Dëshiron të mbishkruash? - - - - PKG Version %1 is older than installed version: - Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: - - - - Game is installed: - Loja është instaluar: - - - - Would you like to install Patch: - Dëshiron të instalosh Arnën: - - - - DLC Installation - Instalimi i DLC-ve - - - - Would you like to install DLC: %1? - Dëshiron të instalosh DLC-në: %1? - - - - DLC already installed: - DLC-ja është instaluar tashmë: - - - - Game already installed - Loja është instaluar tashmë - - - - PKG is a patch, please install the game first! - PKG-ja është një arnë, të lutem instalo lojën fillimisht! - - - - PKG ERROR - GABIM PKG - - - - Extracting PKG %1/%2 - Po nxirret PKG-ja %1/%2 - - - - Extraction Finished - Nxjerrja Përfundoi - - - - Game successfully installed at %1 - Loja u instalua me sukses në %1 - - - - File doesn't appear to be a valid PKG file - Skedari nuk duket si skedar PKG i vlefshëm - + + + * Unsupported Vulkan Version + * Version i pambështetur i Vulkan + + + + Download Cheats For All Installed Games + Shkarko Mashtrime Për Të Gjitha Lojërat e Instaluara + + + + Download Patches For All Games + Shkarko Arna Për Të Gjitha Lojërat e Instaluara + + + + Download Complete + Shkarkimi Përfundoi + + + + You have downloaded cheats for all the games you have installed. + Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. + + + + Patches Downloaded Successfully! + Arnat u shkarkuan me sukses! + + + + All Patches available for all games have been downloaded. + Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. + + + + Games: + Lojërat: + + + + PKG File (*.PKG) + Skedar PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Skedarë ELF (*.bin *.elf *.oelf) + + + + Game Boot + Nis Lojën + + + + Only one file can be selected! + Mund të përzgjidhet vetëm një skedar! + + + + PKG Extraction + Nxjerrja e PKG-së + + + + Patch detected! + U zbulua një arnë! + + + + PKG and Game versions match: + PKG-ja dhe versioni i Lojës përputhen: + + + + Would you like to overwrite? + Dëshiron të mbishkruash? + + + + PKG Version %1 is older than installed version: + Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: + + + + Game is installed: + Loja është instaluar: + + + + Would you like to install Patch: + Dëshiron të instalosh Arnën: + + + + DLC Installation + Instalimi i DLC-ve + + + + Would you like to install DLC: %1? + Dëshiron të instalosh DLC-në: %1? + + + + DLC already installed: + DLC-ja është instaluar tashmë: + + + + Game already installed + Loja është instaluar tashmë + + + + PKG is a patch, please install the game first! + PKG-ja është një arnë, të lutem instalo lojën fillimisht! + + + + PKG ERROR + GABIM PKG + + + + Extracting PKG %1/%2 + Po nxirret PKG-ja %1/%2 + + + + Extraction Finished + Nxjerrja Përfundoi + + + + Game successfully installed at %1 + Loja u instalua me sukses në %1 + + + + File doesn't appear to be a valid PKG file + Skedari nuk duket si skedar PKG i vlefshëm + - CheatsPatches - - - Cheats / Patches - Mashtrime / Arna - - - - defaultTextEdit_MSG - Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nuk ofrohet asnjë imazh - - - - Serial: - Seriku: - - - - Version: - Versioni: - - - - Size: - Madhësia: - - - - Select Cheat File: - Përzgjidh Skedarin e Mashtrimit: - - - - Repository: - Depo: - - - - Download Cheats - Shkarko Mashtrimet - - - - Delete File - Fshi Skedarin - - - - No files selected. - Nuk u zgjodh asnjë skedar. - - - - You can delete the cheats you don't want after downloading them. - Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. - - - - Do you want to delete the selected file?\n%1 - Dëshiron të fshish skedarin e përzgjedhur?\n%1 - - - - Select Patch File: - Përzgjidh Skedarin e Arnës: - - - - Download Patches - Shkarko Arnat - - - - Save - Ruaj - - - - Cheats - Mashtrime - - - - Patches - Arna - - - - Error - Gabim - - - - No patch selected. - Asnjë arnë e përzgjedhur. - - - - Unable to open files.json for reading. - files.json nuk mund të hapet për lexim. - - - - No patch file found for the current serial. - Nuk u gjet asnjë skedar patch për serikun aktual. - - - - Unable to open the file for reading. - Skedari nuk mund të hapet për lexim. - - - - Unable to open the file for writing. - Skedari nuk mund të hapet për shkrim. - - - - Failed to parse XML: - Analiza e XML-së dështoi: - - - - Success - Sukses - - - - Options saved successfully. - Rregullimet u ruajtën me sukses. - - - - Invalid Source - Burim i pavlefshëm - - - - The selected source is invalid. - Burimi i përzgjedhur është i pavlefshëm. - - - - File Exists - Skedari Ekziston - - - - File already exists. Do you want to replace it? - Skedari ekziston tashmë. Dëshiron ta zëvendësosh? - - - - Failed to save file: - Ruajtja e skedarit dështoi: - - - - Failed to download file: - Shkarkimi i skedarit dështoi: - - - - Cheats Not Found - Mashtrimet nuk u gjetën - - - - CheatsNotFound_MSG - Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. - - - - Cheats Downloaded Successfully - Mashtrimet u shkarkuan me sukses - - - - CheatsDownloadedSuccessfully_MSG - Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. - - - - Failed to save: - Ruajtja dështoi: - - - - Failed to download: - Shkarkimi dështoi: - - - - Download Complete - Shkarkimi përfundoi - - - - DownloadComplete_MSG - Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse patch-i nuk shfaqet, mund të mos ekzistojë për numrin e serisë dhe versionin specifik të lojës. Mund të jetë e nevojshme të përditësosh lojën. - - - - Failed to parse JSON data from HTML. - Analiza e të dhënave JSON nga HTML dështoi. - - - - Failed to retrieve HTML page. - Gjetja e faqes HTML dështoi. - - - - Failed to open file: - Hapja e skedarit dështoi: - - - - XML ERROR: - GABIM XML: - - - - Failed to open files.json for writing - Hapja e files.json për shkrim dështoi - - - - Author: - Autori: - - - - Directory does not exist: - Dosja nuk ekziston: - - - - Failed to open files.json for reading. - Hapja e files.json për lexim dështoi. - - - - Name: - Emri: - + CheatsPatches + + + Cheats / Patches + Mashtrime / Arna + + + + defaultTextEdit_MSG + Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Nuk ofrohet asnjë imazh + + + + Serial: + Seriku: + + + + Version: + Versioni: + + + + Size: + Madhësia: + + + + Select Cheat File: + Përzgjidh Skedarin e Mashtrimit: + + + + Repository: + Depo: + + + + Download Cheats + Shkarko Mashtrimet + + + + Delete File + Fshi Skedarin + + + + No files selected. + Nuk u zgjodh asnjë skedar. + + + + You can delete the cheats you don't want after downloading them. + Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. + + + + Do you want to delete the selected file?\n%1 + Dëshiron të fshish skedarin e përzgjedhur?\n%1 + + + + Select Patch File: + Përzgjidh Skedarin e Arnës: + + + + Download Patches + Shkarko Arnat + + + + Save + Ruaj + + + + Cheats + Mashtrime + + + + Patches + Arna + + + + Error + Gabim + + + + No patch selected. + Asnjë arnë e përzgjedhur. + + + + Unable to open files.json for reading. + files.json nuk mund të hapet për lexim. + + + + No patch file found for the current serial. + Nuk u gjet asnjë skedar patch për serikun aktual. + + + + Unable to open the file for reading. + Skedari nuk mund të hapet për lexim. + + + + Unable to open the file for writing. + Skedari nuk mund të hapet për shkrim. + + + + Failed to parse XML: + Analiza e XML-së dështoi: + + + + Success + Sukses + + + + Options saved successfully. + Rregullimet u ruajtën me sukses. + + + + Invalid Source + Burim i pavlefshëm + + + + The selected source is invalid. + Burimi i përzgjedhur është i pavlefshëm. + + + + File Exists + Skedari Ekziston + + + + File already exists. Do you want to replace it? + Skedari ekziston tashmë. Dëshiron ta zëvendësosh? + + + + Failed to save file: + Ruajtja e skedarit dështoi: + + + + Failed to download file: + Shkarkimi i skedarit dështoi: + + + + Cheats Not Found + Mashtrimet nuk u gjetën + + + + CheatsNotFound_MSG + Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. + + + + Cheats Downloaded Successfully + Mashtrimet u shkarkuan me sukses + + + + CheatsDownloadedSuccessfully_MSG + Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. + + + + Failed to save: + Ruajtja dështoi: + + + + Failed to download: + Shkarkimi dështoi: + + + + Download Complete + Shkarkimi përfundoi + + + + DownloadComplete_MSG + Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse patch-i nuk shfaqet, mund të mos ekzistojë për numrin e serisë dhe versionin specifik të lojës. Mund të jetë e nevojshme të përditësosh lojën. + + + + Failed to parse JSON data from HTML. + Analiza e të dhënave JSON nga HTML dështoi. + + + + Failed to retrieve HTML page. + Gjetja e faqes HTML dështoi. + + + + Failed to open file: + Hapja e skedarit dështoi: + + + + XML ERROR: + GABIM XML: + + + + Failed to open files.json for writing + Hapja e files.json për shkrim dështoi + + + + Author: + Autori: + + + + Directory does not exist: + Dosja nuk ekziston: + + + + Failed to open files.json for reading. + Hapja e files.json për lexim dështoi. + + + + Name: + Emri: + Can't apply cheats before the game is started Nuk mund të zbatohen mashtrime para se të fillojë loja. - + SettingsDialog @@ -931,6 +973,111 @@ Close Mbyll + + + Point your mouse at an option to display its description. + Hidhni mouse-in mbi një opsion për të shfaqur përshkrimin e tij. + + + + consoleLanguageGroupBox + Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nRrekomandohet të vendosni këtë në një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. + + + + emulatorLanguageGroupBox + Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. + + + + fullscreenCheckBox + Aktivizo ekranin e plotë:\nAutomatikisht vendos dritaren e lojës në modalitetin e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur çelësin F11. + + + + showSplashCheckBox + Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një imazh special) gjatë fillimit të lojës. + + + + ps4proCheckBox + Është PS4 Pro:\nBën që emulatori të veprojë si një PS4 PRO, i cili mund të aktivizojë karakteristika speciale në lojrat që e mbështesin atë. + + + + userName + Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. + + + + logTypeGroupBox + Tipi i logut:\nPërcakton nëse të sinkronizoni daljen e dritares së logut për performancën. Mund të ketë efekte të këqija në emulim. + + + + logFilter + Filtri i logut: Filtron logun për të printuar vetëm informacione specifike. Shembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas saj. + + + + updaterGroupBox + Aktualizimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të testuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. + + + + GUIgroupBox + Lojë muzikë titulli:\nNëse një lojë e mbështet, aktivizoja luajtjen e muzikës speciale kur të zgjidhni lojën në GUI. + + + + graphicsAdapterGroupBox + Dispositivi grafik:\nNë sistemet me GPU të shumëfishta, zgjidhni GPU-në që do të përdorë emulatori nga lista e rënies,\nor zgjidhni "Auto Select" për ta përcaktuar automatikisht. + + + + resolutionLayout + Gjerësia/ Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. + + + + heightDivider + Pjesëtari Vblank:\nShpejtësia e kuadrit me të cilën refreshohet emulatori është shumëzuar me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose shkatërrimi i funksionalitetit kritik të lojës që nuk e pret këtë të ndryshojë! + + + + dumpShadersCheckBox + Aktivizo dump-in e shaders:\nPër qëllime të debugimit teknik, ruan shaders e lojës në një folder ndërsa ato renditen. + + + + nullGpuCheckBox + Aktivizo GPU Null:\nPër qëllime të debugimit teknik, deaktivizon renditjen e lojës sikur nuk do të kishte një kartë grafike. + + + + dumpPM4CheckBox + Aktivizo dump-in e PM4:\nPër qëllime të debugimit teknik, ruan të dhënat e instruksioneve të GPU-së në një folder ndërsa emulatori i përpunon ato. + + + + debugDump + Aktivizo dump-in e debugimit:\nRuani simbolet e importit dhe eksportit dhe informacionin e titullit të skedarit për aplikacionin aktual PS4 që po punon në një katalog. + + + + vkValidationCheckBox + Aktivizo stratet e validimit Vulkan:\nAktivizon një sistem që validon gjendjen e renderizuesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ulet performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + + + + vkSyncValidationCheckBox + Aktivizo validimin e sinkronizimit Vulkan:\nAktivizon një sistem që validon kohën e detyrave të renderizimit Vulkan. Kjo do të ulet performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + + + + rdocCheckBox + Aktivizo debugimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e kornizës aktuale të renderizuar. + GameListFrame @@ -975,4 +1122,132 @@ Shtegu - + + CheckUpdate + + + Auto Updater + Përditësues automatik + + + + Error + Gabim + + + + Network error: + Gabim rrjeti: + + + + Failed to parse update information. + Analizimi i informacionit të përditësimit deshtoi. + + + + No pre-releases found. + Nuk u gjetën botime paraprake. + + + + Invalid release data. + Të dhënat e lëshimit janë të pavlefshme. + + + + No download URL found for the specified asset. + Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar. + + + + Your version is already up to date! + Versioni jotë është i përditësuar tashmë! + + + + Update Available + Ofrohet një përditësim + + + + Update Channel + Kanali i Përditësimit + + + + Current Version + Versioni i tanishëm + + + + Latest Version + Versioni më i fundit + + + + Do you want to update? + Do të përditësosh? + + + + Show Changelog + Trego ndryshimet + + + + Check for Updates at Startup + Kontrollo për përditësime në nisje + + + + Update + Përditëso + + + + No + Jo + + + + Hide Changelog + Fshih ndryshimet + + + + Changes + Ndryshimet + + + + Network error occurred while trying to access the URL + Ka ndodhur një gabim rrjeti gjatë përpjekjes për të qasur në URL-në + + + + Download Complete + Shkarkimi përfundoi + + + + The update has been downloaded, press OK to install. + Përditësimi është shkarkuar, shtyp OK për ta instaluar. + + + + Failed to save the update file at + Dështoi ruajtja e skedarit të përditësimit në + + + + Starting Update... + Po fillon përditësimi... + + + + Failed to create the update script file + Krijimi i skedarit skript të përditësimit dështoi + + + \ No newline at end of file diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 83f62c85e..32e5c4bd6 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1,985 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - shadPS4 Hakkında - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. - - - - This software should not be used to play games you have not legally obtained. - Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. - - - - ElfViewer - - - Open Folder - Klasörü Aç - - - - GameInfoClass - - - Loading game list, please wait :3 - Oyun listesi yükleniyor, lütfen bekleyin :3 - - - - Cancel - İptal - - - - Loading... - Yükleniyor... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Klasörü Seç - - - - Directory to install games - Oyunların yükleneceği klasör - - - - Browse - Gözat - - - - Error - Hata - - - - The value for location to install games is not valid. - Oyunların yükleneceği konum için girilen klasör geçerli değil. - - - - GuiContextMenus - - - Create Shortcut - Kısayol Oluştur - - - - Open Game Folder - Oyun Klasörünü Aç - - - - Cheats / Patches - Hileler / Yamanlar - - - - SFO Viewer - SFO Görüntüleyici - - - - Trophy Viewer - Kupa Görüntüleyici - - - - Copy info - Bilgiyi Kopyala - - - - Copy Name - Adı Kopyala - - - - Copy Serial - Seri Numarasını Kopyala - - - - Copy All - Tümünü Kopyala - - - - Shortcut creation - Kısayol oluşturma - - - - Shortcut created successfully!\n %1 - Kısayol başarıyla oluşturuldu!\n %1 - - - - Error - Hata - - - - Error creating shortcut!\n %1 - Kısayol oluşturulurken hata oluştu!\n %1 - - - - Install PKG - PKG Yükle - - - - MainWindow - - - Open/Add Elf Folder - Elf Klasörünü Aç/Ekle - - - - Install Packages (PKG) - Paketleri Kur (PKG) - - - - Boot Game - Oyunu Başlat - - - - About shadPS4 - shadPS4 Hakkında - - - - Configure... - Yapılandır... - - - - Install application from a .pkg file - .pkg dosyasından uygulama yükle - - - - Recent Games - Son Oyunlar - - - - Exit - Çıkış - - - - Exit shadPS4 - shadPS4'ten Çık - - - - Exit the application. - Uygulamadan çık. - - - - Show Game List - Oyun Listesini Göster - - - - Game List Refresh - Oyun Listesini Yenile - - - - Tiny - Küçük - - - - Small - Ufak - - - - Medium - Orta - - - - Large - Büyük - - - - List View - Liste Görünümü - - - - Grid View - Izgara Görünümü - - - - Elf Viewer - Elf Görüntüleyici - - - - Game Install Directory - Oyun Kurulum Klasörü - - - - Download Cheats/Patches - Hileler / Yamanlar İndir - - - - Dump Game List - Oyun Listesini Kaydet - - - - PKG Viewer - PKG Görüntüleyici - - - - Search... - Ara... - - - - File - Dosya - - - - View - Görünüm - - - - Game List Icons - Oyun Listesi Simgeleri - - - - Game List Mode - Oyun Listesi Modu - - - - Settings - Ayarlar - - - - Utils - Yardımcı Araçlar - - - - Themes - Temalar - - - - About - Hakkında - - - - Dark - Koyu - - - - Light - Açık - - - - Green - Yeşil - - - - Blue - Mavi - - - - Violet - Mor - - - - toolBar - Araç Çubuğu - - - - PKGViewer - - - Open Folder - Klasörü Aç - - - - TrophyViewer - - - Trophy Viewer - Kupa Görüntüleyici - - - - SettingsDialog - - - Settings - Ayarlar - - - - General - Genel - - - - System - Sistem - - - - Console Language - Konsol Dili - - - - Emulator Language - Emülatör Dili - - - - Emulator - Emülatör - - - - Enable Fullscreen - Tam Ekranı Etkinleştir - - - - Show Splash - Başlangıç Ekranını Göster - - - - Is PS4 Pro - PS4 Pro mu - - - - Username - Kullanıcı Adı - - - - Logger - Kayıt Tutucu - - - - Log Type - Kayıt Türü - - - - Log Filter - Kayıt Filtresi - - - - Graphics - Grafikler - - - - Graphics Device - Grafik Cihazı - - - - Width - Genişlik - - - - Height - Yükseklik - - - - Vblank Divider - Vblank Bölücü - - - - Advanced - Gelişmiş - - - - Enable Shaders Dumping - Shader Kaydını Etkinleştir - - - - Enable NULL GPU - NULL GPU'yu Etkinleştir - - - - Enable PM4 Dumping - PM4 Kaydını Etkinleştir - - - - Debug - Hata Ayıklama - - - - Enable Debug Dumping - Hata Ayıklama Dökümü Etkinleştir - - - - Enable Vulkan Validation Layers - Vulkan Doğrulama Katmanlarını Etkinleştir - - - - Enable Vulkan Synchronization Validation - Vulkan Senkronizasyon Doğrulamasını Etkinleştir - - - - Enable RenderDoc Debugging - RenderDoc Hata Ayıklamayı Etkinleştir - - - MainWindow + AboutDialog + + + About shadPS4 + shadPS4 Hakkında + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. + + + + This software should not be used to play games you have not legally obtained. + Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. + + + + ElfViewer + + + Open Folder + Klasörü Aç + + + + GameInfoClass + + + Loading game list, please wait :3 + Oyun listesi yükleniyor, lütfen bekleyin :3 + + + + Cancel + İptal + + + + Loading... + Yükleniyor... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Klasörü Seç + + + + Directory to install games + Oyunların yükleneceği klasör + + + + Browse + Gözat + + + + Error + Hata + + + + The value for location to install games is not valid. + Oyunların yükleneceği konum için girilen klasör geçerli değil. + + + + GuiContextMenus + + + Create Shortcut + Kısayol Oluştur + + + + Open Game Folder + Oyun Klasörünü Aç + + + + Cheats / Patches + Hileler / Yamanlar + + + + SFO Viewer + SFO Görüntüleyici + + + + Trophy Viewer + Kupa Görüntüleyici + + + + Copy info + Bilgiyi Kopyala + + + + Copy Name + Adı Kopyala + + + + Copy Serial + Seri Numarasını Kopyala + + + + Copy All + Tümünü Kopyala + + + + Shortcut creation + Kısayol oluşturma + + + + Shortcut created successfully!\n %1 + Kısayol başarıyla oluşturuldu!\n %1 + + + + Error + Hata + + + + Error creating shortcut!\n %1 + Kısayol oluşturulurken hata oluştu!\n %1 + + + + Install PKG + PKG Yükle + + + + MainWindow + + + Open/Add Elf Folder + Elf Klasörünü Aç/Ekle + + + + Install Packages (PKG) + Paketleri Kur (PKG) + + + + Boot Game + Oyunu Başlat + + + + Check for Updates + Güncellemeleri kontrol et + + + + About shadPS4 + shadPS4 Hakkında + + + + Configure... + Yapılandır... + + + + Install application from a .pkg file + .pkg dosyasından uygulama yükle + + + + Recent Games + Son Oyunlar + + + + Exit + Çıkış + + + + Exit shadPS4 + shadPS4'ten Çık + + + + Exit the application. + Uygulamadan çık. + + + + Show Game List + Oyun Listesini Göster + + + + Game List Refresh + Oyun Listesini Yenile + + + + Tiny + Küçük + + + + Small + Ufak + + + + Medium + Orta + + + + Large + Büyük + + + + List View + Liste Görünümü + + + + Grid View + Izgara Görünümü + + + + Elf Viewer + Elf Görüntüleyici + + + + Game Install Directory + Oyun Kurulum Klasörü + + + + Download Cheats/Patches + Hileler / Yamanlar İndir + + + + Dump Game List + Oyun Listesini Kaydet + + + + PKG Viewer + PKG Görüntüleyici + + + + Search... + Ara... + + + + File + Dosya + + + + View + Görünüm + + + + Game List Icons + Oyun Listesi Simgeleri + + + + Game List Mode + Oyun Listesi Modu + + + + Settings + Ayarlar + + + + Utils + Yardımcı Araçlar + + + + Themes + Temalar + + + + Help + Yardım + + + + Dark + Koyu + + + + Light + Açık + + + + Green + Yeşil + + + + Blue + Mavi + + + + Violet + Mor + + + + toolBar + Araç Çubuğu + + + + PKGViewer + + + Open Folder + Klasörü Aç + + + + TrophyViewer + + + Trophy Viewer + Kupa Görüntüleyici + + + + SettingsDialog + + + Settings + Ayarlar + + + + General + Genel + + + + System + Sistem + + + + Console Language + Konsol Dili + + + + Emulator Language + Emülatör Dili + + + + Emulator + Emülatör + + + + Enable Fullscreen + Tam Ekranı Etkinleştir + + + + Show Splash + Başlangıç Ekranını Göster + + + + Is PS4 Pro + PS4 Pro mu + + + + Username + Kullanıcı Adı + + + + Logger + Kayıt Tutucu + + + + Log Type + Kayıt Türü + + + + Log Filter + Kayıt Filtresi + + + + Graphics + Grafikler + + + + Graphics Device + Grafik Cihazı + + + + Width + Genişlik + + + + Height + Yükseklik + + + + Vblank Divider + Vblank Bölücü + + + + Advanced + Gelişmiş + + + + Enable Shaders Dumping + Shader Kaydını Etkinleştir + + + + Enable NULL GPU + NULL GPU'yu Etkinleştir + + + + Enable PM4 Dumping + PM4 Kaydını Etkinleştir + + + + Debug + Hata Ayıklama + + + + Enable Debug Dumping + Hata Ayıklama Dökümü Etkinleştir + + + + Enable Vulkan Validation Layers + Vulkan Doğrulama Katmanlarını Etkinleştir + + + + Enable Vulkan Synchronization Validation + Vulkan Senkronizasyon Doğrulamasını Etkinleştir + + + + Enable RenderDoc Debugging + RenderDoc Hata Ayıklamayı Etkinleştir + + + + Update + Güncelle + + + + Check for Updates at Startup + Başlangıçta güncellemeleri kontrol et + + + + Update Channel + Güncelleme Kanalı + + + + Check for Updates + Güncellemeleri kontrol et + + + + GUI Settings + GUI Ayarları + + + + Play title music + Başlık müziğini çal + + + + Volume + Ses seviyesi + + + + MainWindow Game List Oyun Listesi - - - * Unsupported Vulkan Version - * Desteklenmeyen Vulkan Sürümü - - - - Download Cheats For All Installed Games - Tüm Yüklenmiş Oyunlar İçin Hileleri İndir - - - - Download Patches For All Games - Tüm Oyunlar İçin Yamanları İndir - - - - Download Complete - İndirme Tamamlandı - - - - You have downloaded cheats for all the games you have installed. - Yüklediğiniz tüm oyunlar için hileleri indirdiniz. - - - - Patches Downloaded Successfully! - Yamalar Başarıyla İndirildi! - - - - All Patches available for all games have been downloaded. - Tüm oyunlar için mevcut tüm yamalar indirildi. - - - - Games: - Oyunlar: - - - - PKG File (*.PKG) - PKG Dosyası (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF Dosyaları (*.bin *.elf *.oelf) - - - - Game Boot - Oyun Başlatma - - - - Only one file can be selected! - Sadece bir dosya seçilebilir! - - - - PKG Extraction - PKG Çıkartma - - - - Patch detected! - Yamanın tespit edildi! - - - - PKG and Game versions match: - PKG ve oyun sürümleri uyumlu: - - - - Would you like to overwrite? - Üzerine yazmak ister misiniz? - - - - PKG Version %1 is older than installed version: - PKG Sürümü %1, kurulu sürümden daha eski: - - - - Game is installed: - Oyun yüklendi: - - - - Would you like to install Patch: - Yamanın yüklenmesini ister misiniz: - - - - DLC Installation - DLC Yükleme - - - - Would you like to install DLC: %1? - DLC'yi yüklemek ister misiniz: %1? - - - - DLC already installed: - DLC zaten yüklü: - - - - Game already installed - Oyun zaten yüklü - - - - PKG is a patch, please install the game first! - PKG bir yama, lütfen önce oyunu yükleyin! - - - - PKG ERROR - PKG HATASI - - - - Extracting PKG %1/%2 - PKG Çıkarılıyor %1/%2 - - - - Extraction Finished - Çıkarma Tamamlandı - - - - Game successfully installed at %1 - Oyun başarıyla %1 konumuna yüklendi - - - - File doesn't appear to be a valid PKG file - Dosya geçerli bir PKG dosyası gibi görünmüyor - + + + * Unsupported Vulkan Version + * Desteklenmeyen Vulkan Sürümü + + + + Download Cheats For All Installed Games + Tüm Yüklenmiş Oyunlar İçin Hileleri İndir + + + + Download Patches For All Games + Tüm Oyunlar İçin Yamanları İndir + + + + Download Complete + İndirme Tamamlandı + + + + You have downloaded cheats for all the games you have installed. + Yüklediğiniz tüm oyunlar için hileleri indirdiniz. + + + + Patches Downloaded Successfully! + Yamalar Başarıyla İndirildi! + + + + All Patches available for all games have been downloaded. + Tüm oyunlar için mevcut tüm yamalar indirildi. + + + + Games: + Oyunlar: + + + + PKG File (*.PKG) + PKG Dosyası (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF Dosyaları (*.bin *.elf *.oelf) + + + + Game Boot + Oyun Başlatma + + + + Only one file can be selected! + Sadece bir dosya seçilebilir! + + + + PKG Extraction + PKG Çıkartma + + + + Patch detected! + Yamanın tespit edildi! + + + + PKG and Game versions match: + PKG ve oyun sürümleri uyumlu: + + + + Would you like to overwrite? + Üzerine yazmak ister misiniz? + + + + PKG Version %1 is older than installed version: + PKG Sürümü %1, kurulu sürümden daha eski: + + + + Game is installed: + Oyun yüklendi: + + + + Would you like to install Patch: + Yamanın yüklenmesini ister misiniz: + + + + DLC Installation + DLC Yükleme + + + + Would you like to install DLC: %1? + DLC'yi yüklemek ister misiniz: %1? + + + + DLC already installed: + DLC zaten yüklü: + + + + Game already installed + Oyun zaten yüklü + + + + PKG is a patch, please install the game first! + PKG bir yama, lütfen önce oyunu yükleyin! + + + + PKG ERROR + PKG HATASI + + + + Extracting PKG %1/%2 + PKG Çıkarılıyor %1/%2 + + + + Extraction Finished + Çıkarma Tamamlandı + + + + Game successfully installed at %1 + Oyun başarıyla %1 konumuna yüklendi + + + + File doesn't appear to be a valid PKG file + Dosya geçerli bir PKG dosyası gibi görünmüyor + - CheatsPatches - - - Cheats / Patches - Hileler / Yamalar - - - - defaultTextEdit_MSG - Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Görüntü Mevcut Değil - - - - Serial: - Seri Numarası: - - - - Version: - Sürüm: - - - - Size: - Boyut: - - - - Select Cheat File: - Hile Dosyasını Seçin: - - - - Repository: - Depo: - - - - Download Cheats - Hileleri İndir - - - - Confirm Delete - Silme Onayı - - - - Are you sure you want to delete the selected cheat?\n%1 - Seçilen hileyi silmek istediğinizden emin misiniz?\n%1 - - - - You can delete the cheats you don't want after downloading them. - İndirdikten sonra istemediğiniz hileleri silebilirsiniz. - - - - Do you want to delete the selected file?\n%1 - Seçilen dosyayı silmek istiyor musunuz?\n%1 - - - - Select Patch File: - Yama Dosyasını Seçin: - - - - Download Patches - Yamaları İndir - - - - Save - Kaydet - - - - Cheats - Hileler - - - - Patches - Yamalar - - - - Error - Hata - - - - No patch selected. - Hiç yama seçilmedi. - - - - Unable to open files.json for reading. - files.json dosyasını okumak için açılamadı. - - - - No patch file found for the current serial. - Mevcut seri numarası için hiç yama dosyası bulunamadı. - - - - Unable to open the file for reading. - Dosya okumak için açılamadı. - - - - Unable to open the file for writing. - Dosya yazmak için açılamadı. - - - - Failed to parse XML: - XML ayrıştırılamadı: - - - - Success - Başarı - - - - Options saved successfully. - Ayarlar başarıyla kaydedildi. - - - - Invalid Source - Geçersiz Kaynak - - - - The selected source is invalid. - Seçilen kaynak geçersiz. - - - - File Exists - Dosya Var - - - - File already exists. Do you want to replace it? - Dosya zaten var. Üzerine yazmak ister misiniz? - - - - Failed to save file: - Dosya kaydedilemedi: - - - - Failed to download file: - Dosya indirilemedi: - - - - Cheats Not Found - Hileler Bulunamadı - - - - CheatsNotFound_MSG - Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. - - - - Cheats Downloaded Successfully - Hileler Başarıyla İndirildi - - - - CheatsDownloadedSuccessfully_MSG - Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. - - - - Failed to save: - Kaydedilemedi: - - - - Failed to download: - İndirilemedi: - - - - Download Complete - İndirme Tamamlandı - - - - DownloadComplete_MSG - Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. Oyunu güncellemeniz gerekebilir. - - - - Failed to parse JSON data from HTML. - HTML'den JSON verileri ayrıştırılamadı. - - - - Failed to retrieve HTML page. - HTML sayfası alınamadı. - - - - Failed to open file: - Dosya açılamadı: - - - - XML ERROR: - XML HATASI: - - - - Failed to open files.json for writing - files.json dosyası yazmak için açılamadı - - - - Author: - Yazar: - - - - Directory does not exist: - Klasör mevcut değil: - - - - Failed to open files.json for reading. - files.json dosyası okumak için açılamadı. - - - - Name: - İsim: - - - - Version: - Sürüm: - - - - Size: - Boyut: - - - - LangDialog - - - Language Settings - Dil Ayarları - - - - Select Language: - Dil Seçin: - - - - Restart Required - Yeniden Başlatma Gerekiyor - - - - Changes will take effect after restarting the application. - Değişiklikler uygulama yeniden başlatıldığında geçerli olacaktır. - - - - SettingsDialog - - - Settings - Ayarlar - - - - General - Genel - - - - Cheats - Hileler - - - - Update - Güncelleme - - - - Save - Kaydet - - - - Reset to Default - Varsayılana Sıfırla - - - - Apply Changes - Değişiklikleri Uygula - + CheatsPatches + + + Cheats / Patches + Hileler / Yamalar + + + + defaultTextEdit_MSG + Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Görüntü Mevcut Değil + + + + Serial: + Seri Numarası: + + + + Version: + Sürüm: + + + + Size: + Boyut: + + + + Select Cheat File: + Hile Dosyasını Seçin: + + + + Repository: + Depo: + + + + Download Cheats + Hileleri İndir + + + + Delete File + Dosyayı Sil + + + + No files selected. + Hiçbir dosya seçilmedi. + + + + You can delete the cheats you don't want after downloading them. + İndirdikten sonra istemediğiniz hileleri silebilirsiniz. + + + + Do you want to delete the selected file?\n%1 + Seçilen dosyayı silmek istiyor musunuz?\n%1 + + + + Select Patch File: + Yama Dosyasını Seçin: + + + + Download Patches + Yamaları İndir + + + + Save + Kaydet + + + + Cheats + Hileler + + + + Patches + Yamalar + + + + Error + Hata + + + + No patch selected. + Hiç yama seçilmedi. + + + + Unable to open files.json for reading. + files.json dosyasını okumak için açılamadı. + + + + No patch file found for the current serial. + Mevcut seri numarası için hiç yama dosyası bulunamadı. + + + + Unable to open the file for reading. + Dosya okumak için açılamadı. + + + + Unable to open the file for writing. + Dosya yazmak için açılamadı. + + + + Failed to parse XML: + XML ayrıştırılamadı: + + + + Success + Başarı + + + + Options saved successfully. + Ayarlar başarıyla kaydedildi. + + + + Invalid Source + Geçersiz Kaynak + + + + The selected source is invalid. + Seçilen kaynak geçersiz. + + + + File Exists + Dosya Var + + + + File already exists. Do you want to replace it? + Dosya zaten var. Üzerine yazmak ister misiniz? + + + + Failed to save file: + Dosya kaydedilemedi: + + + + Failed to download file: + Dosya indirilemedi: + + + + Cheats Not Found + Hileler Bulunamadı + + + + CheatsNotFound_MSG + Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. + + + + Cheats Downloaded Successfully + Hileler Başarıyla İndirildi + + + + CheatsDownloadedSuccessfully_MSG + Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. + + + + Failed to save: + Kaydedilemedi: + + + + Failed to download: + İndirilemedi: + + + + Download Complete + İndirme Tamamlandı + + + + DownloadComplete_MSG + Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. Oyunu güncellemeniz gerekebilir. + + + + Failed to parse JSON data from HTML. + HTML'den JSON verileri ayrıştırılamadı. + + + + Failed to retrieve HTML page. + HTML sayfası alınamadı. + + + + Failed to open file: + Dosya açılamadı: + + + + XML ERROR: + XML HATASI: + + + + Failed to open files.json for writing + files.json dosyası yazmak için açılamadı + + + + Author: + Yazar: + + + + Directory does not exist: + Klasör mevcut değil: + + + + Failed to open files.json for reading. + files.json dosyası okumak için açılamadı. + + + + Name: + İsim: + Can't apply cheats before the game is started Hileleri oyuna başlamadan önce uygulayamazsınız. - + SettingsDialog @@ -1002,6 +973,111 @@ Close Kapat + + + Point your mouse at an option to display its description. + Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. + + + + consoleLanguageGroupBox + Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. + + + + emulatorLanguageGroupBox + Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. + + + + fullscreenCheckBox + Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. + + + + showSplashCheckBox + Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. + + + + ps4proCheckBox + PS4 Pro Mu:\nEmülatörü bir PS4 PRO gibi çalıştırır; bu, bunu destekleyen oyunlarda özel özellikleri etkinleştirebilir. + + + + userName + Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. + + + + logTypeGroupBox + Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. + + + + logFilter + Günlük Filtre: Sadece belirli bilgileri yazdırmak için günlüğü filtreler. Örnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. + + + + updaterGroupBox + Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. + + + + GUIgroupBox + Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. + + + + graphicsAdapterGroupBox + Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. + + + + resolutionLayout + Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. + + + + heightDivider + Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! + + + + dumpShadersCheckBox + Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. + + + + nullGpuCheckBox + Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. + + + + dumpPM4CheckBox + PM4 Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, emülatör bunları işlerken GPU komut verilerini bir klasöre kaydeder. + + + + debugDump + Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. + + + + vkValidationCheckBox + Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. + + + + vkSyncValidationCheckBox + Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. + + + + rdocCheckBox + RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. + GameListFrame @@ -1046,4 +1122,132 @@ Yol + + CheckUpdate + + + Auto Updater + Otomatik Güncelleyici + + + + Error + Hata + + + + Network error: + Ağ hatası: + + + + Failed to parse update information. + Güncelleme bilgilerini ayrıştırma başarısız oldu. + + + + No pre-releases found. + Ön sürüm bulunamadı. + + + + Invalid release data. + Geçersiz sürüm verisi. + + + + No download URL found for the specified asset. + Belirtilen varlık için hiçbir indirme URL'si bulunamadı. + + + + Your version is already up to date! + Versiyonunuz zaten güncel! + + + + Update Available + Güncelleme Mevcut + + + + Update Channel + Güncelleme Kanalı + + + + Current Version + Mevcut Versiyon + + + + Latest Version + Son Versiyon + + + + Do you want to update? + Güncellemek istiyor musunuz? + + + + Show Changelog + Değişiklik Günlüğünü Göster + + + + Check for Updates at Startup + Başlangıçta güncellemeleri kontrol et + + + + Update + Güncelle + + + + No + Hayır + + + + Hide Changelog + Değişiklik Günlüğünü Gizle + + + + Changes + Değişiklikler + + + + Network error occurred while trying to access the URL + URL'ye erişmeye çalışırken bir ağ hatası oluştu + + + + Download Complete + İndirme Tamamlandı + + + + The update has been downloaded, press OK to install. + Güncelleme indirildi, yüklemek için Tamam'a basın. + + + + Failed to save the update file at + Güncelleme dosyası kaydedilemedi + + + + Starting Update... + Güncelleme Başlatılıyor... + + + + Failed to create the update script file + Güncelleme betiği dosyası oluşturulamadı + + \ No newline at end of file diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 017e61af5..8f377f2a7 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Mẹo / Bản vá - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Tải Mẹo / Bản vá - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - - MainWindow + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Mẹo / Bản vá + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + Kiểm tra bản cập nhật + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Tải Mẹo / Bản vá + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + Giúp đỡ + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + Cập nhật + + + + Check for Updates at Startup + Kiểm tra cập nhật khi khởi động + + + + Update Channel + Kênh Cập Nhật + + + + Check for Updates + Kiểm tra cập nhật + + + + GUI Settings + Cài đặt GUI + + + + Play title music + Phát nhạc tiêu đề + + + + Volume + Âm lượng + + + + MainWindow Game List Danh sách trò chơi - - - * Unsupported Vulkan Version - * Phiên bản Vulkan không được hỗ trợ - - - - Download Cheats For All Installed Games - Tải xuống cheat cho tất cả các trò chơi đã cài đặt - - - - Download Patches For All Games - Tải xuống bản vá cho tất cả các trò chơi - - - - Download Complete - Tải xuống hoàn tất - - - - You have downloaded cheats for all the games you have installed. - Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. - - - - Patches Downloaded Successfully! - Bản vá đã tải xuống thành công! - - - - All Patches available for all games have been downloaded. - Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. - - - - Games: - Trò chơi: - - - - PKG File (*.PKG) - Tệp PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Tệp ELF (*.bin *.elf *.oelf) - - - - Game Boot - Khởi động trò chơi - - - - Only one file can be selected! - Chỉ có thể chọn một tệp duy nhất! - - - - PKG Extraction - Giải nén PKG - - - - Patch detected! - Đã phát hiện bản vá! - - - - PKG and Game versions match: - Các phiên bản PKG và trò chơi khớp nhau: - - - - Would you like to overwrite? - Bạn có muốn ghi đè không? - - - - PKG Version %1 is older than installed version: - Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: - - - - Game is installed: - Trò chơi đã được cài đặt: - - - - Would you like to install Patch: - Bạn có muốn cài đặt bản vá: - - - - DLC Installation - Cài đặt DLC - - - - Would you like to install DLC: %1? - Bạn có muốn cài đặt DLC: %1? - - - - DLC already installed: - DLC đã được cài đặt: - - - - Game already installed - Trò chơi đã được cài đặt - - - - PKG is a patch, please install the game first! - PKG là bản vá, vui lòng cài đặt trò chơi trước! - - - - PKG ERROR - LOI PKG - - - - Extracting PKG %1/%2 - Đang giải nén PKG %1/%2 - - - - Extraction Finished - Giải nén hoàn tất - - - - Game successfully installed at %1 - Trò chơi đã được cài đặt thành công tại %1 - - - - File doesn't appear to be a valid PKG file - Tệp không có vẻ là tệp PKG hợp lệ - - - - CheatsPatches - - - Cheats / Patches - Cheat / Bản vá - - - - defaultTextEdit_MSG - Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Không có hình ảnh - - - - Serial: - Số seri: - - - - Version: - Phiên bản: - - - - Size: - Kích thước: - - - - Select Cheat File: - Chọn tệp Cheat: - - - - Repository: - Kho lưu trữ: - - - - Download Cheats - Tải xuống Cheat - - - - Delete File - Xóa tệp - - - - No files selected. - Không có tệp nào được chọn. - - - - You can delete the cheats you don't want after downloading them. - Bạn có thể xóa các cheat không muốn sau khi tải xuống. - - - - Do you want to delete the selected file?\n%1 - Bạn có muốn xóa tệp đã chọn?\n%1 - - - - Select Patch File: - Chọn tệp Bản vá: - - - - Download Patches - Tải xuống Bản vá - - - - Save - Lưu - - - - Cheats - Cheat - - - - Patches - Bản vá - - - - Error - Lỗi - - - - No patch selected. - Không có bản vá nào được chọn. - - - - Unable to open files.json for reading. - Không thể mở files.json để đọc. - - - - No patch file found for the current serial. - Không tìm thấy tệp bản vá cho số seri hiện tại. - - - - Unable to open the file for reading. - Không thể mở tệp để đọc. - - - - Unable to open the file for writing. - Không thể mở tệp để ghi. - - - - Failed to parse XML: - Không thể phân tích XML: - - - - Success - Thành công - - - - Options saved successfully. - Các tùy chọn đã được lưu thành công. - - - - Invalid Source - Nguồn không hợp lệ - - - - The selected source is invalid. - Nguồn đã chọn không hợp lệ. - - - - File Exists - Tệp đã tồn tại - - - - File already exists. Do you want to replace it? - Tệp đã tồn tại. Bạn có muốn thay thế nó không? - - - - Failed to save file: - Không thể lưu tệp: - - - - Failed to download file: - Không thể tải xuống tệp: - - - - Cheats Not Found - Không tìm thấy Cheat - - - - CheatsNotFound_MSG - Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. - - - - Cheats Downloaded Successfully - Cheat đã tải xuống thành công - - - - CheatsDownloadedSuccessfully_MSG - Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. - - - - Failed to save: - Không thể lưu: - - - - Failed to download: - Không thể tải xuống: - - - - Download Complete - Tải xuống hoàn tất - - - - DownloadComplete_MSG - Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. Có thể bạn cần phải cập nhật trò chơi. - - - - Failed to parse JSON data from HTML. - Không thể phân tích dữ liệu JSON từ HTML. - - - - Failed to retrieve HTML page. - Không thể lấy trang HTML. - - - - Failed to open file: - Không thể mở tệp: - - - - XML ERROR: - LỖI XML: - - - - Failed to open files.json for writing - Không thể mở files.json để ghi - - - - Author: - Tác giả: - - - - Directory does not exist: - Thư mục không tồn tại: - - - - Failed to open files.json for reading. - Không thể mở files.json để đọc. - - - - Name: - Tên: - + + + * Unsupported Vulkan Version + * Phiên bản Vulkan không được hỗ trợ + + + + Download Cheats For All Installed Games + Tải xuống cheat cho tất cả các trò chơi đã cài đặt + + + + Download Patches For All Games + Tải xuống bản vá cho tất cả các trò chơi + + + + Download Complete + Tải xuống hoàn tất + + + + You have downloaded cheats for all the games you have installed. + Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. + + + + Patches Downloaded Successfully! + Bản vá đã tải xuống thành công! + + + + All Patches available for all games have been downloaded. + Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. + + + + Games: + Trò chơi: + + + + PKG File (*.PKG) + Tệp PKG (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + Tệp ELF (*.bin *.elf *.oelf) + + + + Game Boot + Khởi động trò chơi + + + + Only one file can be selected! + Chỉ có thể chọn một tệp duy nhất! + + + + PKG Extraction + Giải nén PKG + + + + Patch detected! + Đã phát hiện bản vá! + + + + PKG and Game versions match: + Các phiên bản PKG và trò chơi khớp nhau: + + + + Would you like to overwrite? + Bạn có muốn ghi đè không? + + + + PKG Version %1 is older than installed version: + Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: + + + + Game is installed: + Trò chơi đã được cài đặt: + + + + Would you like to install Patch: + Bạn có muốn cài đặt bản vá: + + + + DLC Installation + Cài đặt DLC + + + + Would you like to install DLC: %1? + Bạn có muốn cài đặt DLC: %1? + + + + DLC already installed: + DLC đã được cài đặt: + + + + Game already installed + Trò chơi đã được cài đặt + + + + PKG is a patch, please install the game first! + PKG là bản vá, vui lòng cài đặt trò chơi trước! + + + + PKG ERROR + LOI PKG + + + + Extracting PKG %1/%2 + Đang giải nén PKG %1/%2 + + + + Extraction Finished + Giải nén hoàn tất + + + + Game successfully installed at %1 + Trò chơi đã được cài đặt thành công tại %1 + + + + File doesn't appear to be a valid PKG file + Tệp không có vẻ là tệp PKG hợp lệ + + + + CheatsPatches + + + Cheats / Patches + Cheat / Bản vá + + + + defaultTextEdit_MSG + Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + Không có hình ảnh + + + + Serial: + Số seri: + + + + Version: + Phiên bản: + + + + Size: + Kích thước: + + + + Select Cheat File: + Chọn tệp Cheat: + + + + Repository: + Kho lưu trữ: + + + + Download Cheats + Tải xuống Cheat + + + + Delete File + Xóa tệp + + + + No files selected. + Không có tệp nào được chọn. + + + + You can delete the cheats you don't want after downloading them. + Bạn có thể xóa các cheat không muốn sau khi tải xuống. + + + + Do you want to delete the selected file?\n%1 + Bạn có muốn xóa tệp đã chọn?\n%1 + + + + Select Patch File: + Chọn tệp Bản vá: + + + + Download Patches + Tải xuống Bản vá + + + + Save + Lưu + + + + Cheats + Cheat + + + + Patches + Bản vá + + + + Error + Lỗi + + + + No patch selected. + Không có bản vá nào được chọn. + + + + Unable to open files.json for reading. + Không thể mở files.json để đọc. + + + + No patch file found for the current serial. + Không tìm thấy tệp bản vá cho số seri hiện tại. + + + + Unable to open the file for reading. + Không thể mở tệp để đọc. + + + + Unable to open the file for writing. + Không thể mở tệp để ghi. + + + + Failed to parse XML: + Không thể phân tích XML: + + + + Success + Thành công + + + + Options saved successfully. + Các tùy chọn đã được lưu thành công. + + + + Invalid Source + Nguồn không hợp lệ + + + + The selected source is invalid. + Nguồn đã chọn không hợp lệ. + + + + File Exists + Tệp đã tồn tại + + + + File already exists. Do you want to replace it? + Tệp đã tồn tại. Bạn có muốn thay thế nó không? + + + + Failed to save file: + Không thể lưu tệp: + + + + Failed to download file: + Không thể tải xuống tệp: + + + + Cheats Not Found + Không tìm thấy Cheat + + + + CheatsNotFound_MSG + Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. + + + + Cheats Downloaded Successfully + Cheat đã tải xuống thành công + + + + CheatsDownloadedSuccessfully_MSG + Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. + + + + Failed to save: + Không thể lưu: + + + + Failed to download: + Không thể tải xuống: + + + + Download Complete + Tải xuống hoàn tất + + + + DownloadComplete_MSG + Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. Có thể bạn cần phải cập nhật trò chơi. + + + + Failed to parse JSON data from HTML. + Không thể phân tích dữ liệu JSON từ HTML. + + + + Failed to retrieve HTML page. + Không thể lấy trang HTML. + + + + Failed to open file: + Không thể mở tệp: + + + + XML ERROR: + LỖI XML: + + + + Failed to open files.json for writing + Không thể mở files.json để ghi + + + + Author: + Tác giả: + + + + Directory does not exist: + Thư mục không tồn tại: + + + + Failed to open files.json for reading. + Không thể mở files.json để đọc. + + + + Name: + Tên: + Can't apply cheats before the game is started Không thể áp dụng cheat trước khi trò chơi bắt đầu. - + SettingsDialog @@ -931,6 +973,111 @@ Close Đóng + + + Point your mouse at an option to display its description. + Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. + + + + consoleLanguageGroupBox + Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. + + + + emulatorLanguageGroupBox + Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. + + + + fullscreenCheckBox + Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. + + + + showSplashCheckBox + Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. + + + + ps4proCheckBox + Là PS4 Pro:\nKhiến trình giả lập hoạt động như một PS4 PRO, điều này có thể kích hoạt các tính năng đặc biệt trong các trò chơi hỗ trợ điều này. + + + + userName + Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. + + + + logTypeGroupBox + Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. + + + + logFilter + Bộ lọc nhật ký: Lọc nhật ký để in chỉ thông tin cụ thể. Ví dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. + + + + updaterGroupBox + Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. + + + + GUIgroupBox + Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. + + + + graphicsAdapterGroupBox + Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. + + + + resolutionLayout + Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. + + + + heightDivider + Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! + + + + dumpShadersCheckBox + Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. + + + + nullGpuCheckBox + Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. + + + + dumpPM4CheckBox + Bật xuất PM4:\nĐể mục đích gỡ lỗi kỹ thuật, lưu dữ liệu lệnh GPU vào một thư mục khi trình giả lập xử lý chúng. + + + + debugDump + Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. + + + + vkValidationCheckBox + Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. + + + + vkSyncValidationCheckBox + Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. + + + + rdocCheckBox + Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. + GameListFrame @@ -975,4 +1122,132 @@ Đường dẫn + + CheckUpdate + + + Auto Updater + Trình cập nhật tự động + + + + Error + Lỗi + + + + Network error: + Lỗi mạng: + + + + Failed to parse update information. + Không thể phân tích thông tin cập nhật. + + + + No pre-releases found. + Không tìm thấy bản phát hành trước. + + + + Invalid release data. + Dữ liệu bản phát hành không hợp lệ. + + + + No download URL found for the specified asset. + Không tìm thấy URL tải xuống cho tài sản đã chỉ định. + + + + Your version is already up to date! + Phiên bản của bạn đã được cập nhật! + + + + Update Available + Có bản cập nhật + + + + Update Channel + Kênh Cập Nhật + + + + Current Version + Phiên bản hiện tại + + + + Latest Version + Phiên bản mới nhất + + + + Do you want to update? + Bạn có muốn cập nhật không? + + + + Show Changelog + Hiện nhật ký thay đổi + + + + Check for Updates at Startup + Kiểm tra cập nhật khi khởi động + + + + Update + Cập nhật + + + + No + Không + + + + Hide Changelog + Ẩn nhật ký thay đổi + + + + Changes + Thay đổi + + + + Network error occurred while trying to access the URL + Xảy ra lỗi mạng khi cố gắng truy cập URL + + + + Download Complete + Tải xuống hoàn tất + + + + The update has been downloaded, press OK to install. + Bản cập nhật đã được tải xuống, nhấn OK để cài đặt. + + + + Failed to save the update file at + Không thể lưu tệp cập nhật tại + + + + Starting Update... + Đang bắt đầu cập nhật... + + + + Failed to create the update script file + Không thể tạo tệp kịch bản cập nhật + + \ No newline at end of file diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index f8675ed01..0eae5a5bd 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - 关于 shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 是一款实验性质的开源 PlayStation 4模拟器软件。 - - - - This software should not be used to play games you have not legally obtained. - 本软件不得用于运行未经合法授权而获得的游戏。 - - - - ElfViewer - - - Open Folder - 打开文件夹 - - - - GameInfoClass - - - Loading game list, please wait :3 - 加载游戏列表中, 请稍等 :3 - - - - Cancel - 取消 - - - - Loading... - 加载中... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - 选择文件目录 - - - - Directory to install games - 要安装游戏的目录 - - - - Browse - 浏览 - - - - Error - 错误 - - - - The value for location to install games is not valid. - 游戏安装位置无效。 - - - - GuiContextMenus - - - Create Shortcut - 创建快捷方式 - - - - Open Game Folder - 打开游戏文件夹 - - - - Cheats / Patches - 作弊码 / 补丁 - - - - SFO Viewer - SFO 查看器 - - - - Trophy Viewer - Trophy 查看器 - - - - Copy info - 复制信息 - - - - Copy Name - 复制名称 - - - - Copy Serial - 复制序列号 - - - - Copy All - 复制全部 - - - - Shortcut creation - 创建快捷方式 - - - - Shortcut created successfully!\n %1 - 创建快捷方式成功!\n %1 - - - - Error - 错误 - - - - Error creating shortcut!\n %1 - 创建快捷方式出错!\n %1 - - - - Install PKG - 安装 PKG - - - - MainWindow - - - Open/Add Elf Folder - 打开/添加Elf文件夹 - - - - Install Packages (PKG) - 安装 Packages (PKG) - - - - Boot Game - 启动游戏 - - - - About shadPS4 - 关于 shadPS4 - - - - Configure... - 设置... - - - - Install application from a .pkg file - 从 .pkg 文件安装应用程序 - - - - Recent Games - 最近启动的游戏 - - - - Exit - 退出 - - - - Exit shadPS4 - 退出 shadPS4 - - - - Exit the application. - 退出应用程序. - - - - Show Game List - 显示游戏列表 - - - - Game List Refresh - 刷新游戏列表 - - - - Tiny - 微小 - - - - Small - - - - - Medium - 中等 - - - - Large - 巨大 - - - - List View - 列表视图 - - - - Grid View - 表格视图 - - - - Elf Viewer - Elf 查看器 - - - - Game Install Directory - 游戏安装目录 - - - - Download Cheats/Patches - 下载作弊码/补丁 - - - - Dump Game List - 转储游戏列表 - - - - PKG Viewer - PKG 查看器 - - - - Search... - 搜索... - - - - File - 文件 - - - - View - 显示 - - - - Game List Icons - 游戏列表图标 - - - - Game List Mode - 游戏列表模式 - - - - Settings - 设置 - - - - Utils - 工具 - - - - Themes - 主题 - - - - About - 关于 - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - 工具栏 - - - - PKGViewer - - - Open Folder - 打开文件夹 - - - - TrophyViewer - - - Trophy Viewer - Trophy 查看器 - - - - SettingsDialog - - - Settings - 设置 - - - - General - 通用 - - - - System - 系统 - - - - Console Language - 主机语言 - - - - Emulator Language - 模拟器语言 - - - - Emulator - 模拟器 - - - - Enable Fullscreen - 启用全屏 - - - - Show Splash - 显示Splash - - - - Is PS4 Pro - 是否是 PS4 Pro - - - - Username - 用户名 - - - - Logger - 日志 - - - - Log Type - 日志类型 - - - - Log Filter - 日志过滤 - - - - Graphics - 图像 - - - - Graphics Device - 图像设备 - - - - Width - 宽带 - - - - Height - 高度 - - - - Vblank Divider - Vblank Divider - - - - Advanced - 高级 - - - - Enable Shaders Dumping - 启用着色器转储 - - - - Enable NULL GPU - 启用 NULL GPU - - - - Enable PM4 Dumping - 启用 PM4 转储 - - - - Debug - 调试 - - - - Enable Debug Dumping - 启用调试转储 - - - - Enable Vulkan Validation Layers - 启用 Vulkan 验证层 - - - - Enable Vulkan Synchronization Validation - 启用 Vulkan 同步验证 - - - - Enable RenderDoc Debugging - 启用 RenderDoc 调试 - - - - MainWindow + + AboutDialog + + + About shadPS4 + 关于 shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 是一款实验性质的开源 PlayStation 4模拟器软件。 + + + + This software should not be used to play games you have not legally obtained. + 本软件不得用于运行未经合法授权而获得的游戏。 + + + + ElfViewer + + + Open Folder + 打开文件夹 + + + + GameInfoClass + + + Loading game list, please wait :3 + 加载游戏列表中, 请稍等 :3 + + + + Cancel + 取消 + + + + Loading... + 加载中... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - 选择文件目录 + + + + Directory to install games + 要安装游戏的目录 + + + + Browse + 浏览 + + + + Error + 错误 + + + + The value for location to install games is not valid. + 游戏安装位置无效。 + + + + GuiContextMenus + + + Create Shortcut + 创建快捷方式 + + + + Open Game Folder + 打开游戏文件夹 + + + + Cheats / Patches + 作弊码 / 补丁 + + + + SFO Viewer + SFO 查看器 + + + + Trophy Viewer + Trophy 查看器 + + + + Copy info + 复制信息 + + + + Copy Name + 复制名称 + + + + Copy Serial + 复制序列号 + + + + Copy All + 复制全部 + + + + Shortcut creation + 创建快捷方式 + + + + Shortcut created successfully!\n %1 + 创建快捷方式成功!\n %1 + + + + Error + 错误 + + + + Error creating shortcut!\n %1 + 创建快捷方式出错!\n %1 + + + + Install PKG + 安装 PKG + + + + MainWindow + + + Open/Add Elf Folder + 打开/添加Elf文件夹 + + + + Install Packages (PKG) + 安装 Packages (PKG) + + + + Boot Game + 启动游戏 + + + + Check for Updates + 检查更新 + + + + About shadPS4 + 关于 shadPS4 + + + + Configure... + 设置... + + + + Install application from a .pkg file + 从 .pkg 文件安装应用程序 + + + + Recent Games + 最近启动的游戏 + + + + Exit + 退出 + + + + Exit shadPS4 + 退出 shadPS4 + + + + Exit the application. + 退出应用程序. + + + + Show Game List + 显示游戏列表 + + + + Game List Refresh + 刷新游戏列表 + + + + Tiny + 微小 + + + + Small + + + + + Medium + 中等 + + + + Large + 巨大 + + + + List View + 列表视图 + + + + Grid View + 表格视图 + + + + Elf Viewer + Elf 查看器 + + + + Game Install Directory + 游戏安装目录 + + + + Download Cheats/Patches + 下载作弊码/补丁 + + + + Dump Game List + 转储游戏列表 + + + + PKG Viewer + PKG 查看器 + + + + Search... + 搜索... + + + + File + 文件 + + + + View + 显示 + + + + Game List Icons + 游戏列表图标 + + + + Game List Mode + 游戏列表模式 + + + + Settings + 设置 + + + + Utils + 工具 + + + + Themes + 主题 + + + + Help + 帮助 + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + 工具栏 + + + + PKGViewer + + + Open Folder + 打开文件夹 + + + + TrophyViewer + + + Trophy Viewer + Trophy 查看器 + + + + SettingsDialog + + + Settings + 设置 + + + + General + 通用 + + + + System + 系统 + + + + Console Language + 主机语言 + + + + Emulator Language + 模拟器语言 + + + + Emulator + 模拟器 + + + + Enable Fullscreen + 启用全屏 + + + + Show Splash + 显示Splash + + + + Is PS4 Pro + 是否是 PS4 Pro + + + + Username + 用户名 + + + + Logger + 日志 + + + + Log Type + 日志类型 + + + + Log Filter + 日志过滤 + + + + Graphics + 图像 + + + + Graphics Device + 图像设备 + + + + Width + 宽带 + + + + Height + 高度 + + + + Vblank Divider + Vblank Divider + + + + Advanced + 高级 + + + + Enable Shaders Dumping + 启用着色器转储 + + + + Enable NULL GPU + 启用 NULL GPU + + + + Enable PM4 Dumping + 启用 PM4 转储 + + + + Debug + 调试 + + + + Enable Debug Dumping + 启用调试转储 + + + + Enable Vulkan Validation Layers + 启用 Vulkan 验证层 + + + + Enable Vulkan Synchronization Validation + 启用 Vulkan 同步验证 + + + + Enable RenderDoc Debugging + 启用 RenderDoc 调试 + + + + Update + 更新 + + + + Check for Updates at Startup + 启动时检查更新 + + + + Update Channel + 更新频道 + + + + Check for Updates + 检查更新 + + + + GUI Settings + 界面设置 + + + + Play title music + 播放标题音乐 + + + + Volume + 音量 + + + + MainWindow Game List 游戏列表 - - - * Unsupported Vulkan Version - * 不支持的 Vulkan 版本 - - - - Download Cheats For All Installed Games - 下载所有已安装游戏的作弊码 - - - - Download Patches For All Games - 下载所有游戏的补丁 - - - - Download Complete - 下载完成 - - - - You have downloaded cheats for all the games you have installed. - 您已下载了所有已安装游戏的作弊码。 - - - - Patches Downloaded Successfully! - 补丁下载成功! - - - - All Patches available for all games have been downloaded. - 所有游戏的所有补丁都已下载。 - - - - Games: - 游戏: - - - - PKG File (*.PKG) - PKG 文件 (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF 文件 (*.bin *.elf *.oelf) - - - - Game Boot - 游戏启动 - - - - Only one file can be selected! - 只能选择一个文件! - - - - PKG Extraction - PKG 解压 - - - - Patch detected! - 检测到补丁! - - - - PKG and Game versions match: - PKG 和游戏版本匹配: - - - - Would you like to overwrite? - 您想要覆盖吗? - - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安装版本更旧: - - - - Game is installed: - 游戏已安装: - - - - Would you like to install Patch: - 您想安装补丁吗: - - - - DLC Installation - DLC 安装 - - - - Would you like to install DLC: %1? - 您想安装 DLC: %1 吗? - - - - DLC already installed: - DLC 已经安装: - - - - Game already installed - 游戏已经安装 - - - - PKG is a patch, please install the game first! - PKG 是一个补丁,请先安装游戏! - - - - PKG ERROR - PKG 错误 - - - - Extracting PKG %1/%2 - 正在解压 PKG %1/%2 - - - - Extraction Finished - 解压完成 - - - - Game successfully installed at %1 - 游戏成功安装在 %1 - - - - File doesn't appear to be a valid PKG file - 文件似乎不是有效的 PKG 文件 - - - - CheatsPatches - - - Cheats / Patches - 作弊码 / 补丁 - - - - defaultTextEdit_MSG - 作弊/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,单独下载作弊程序。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊程序/补丁,\n请将问题报告给作弊程序的作者。\n\n创建了新的作弊程序?访问:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - 没有可用的图像 - - - - Serial: - 序列号: - - - - Version: - 版本: - - - - Size: - 大小: - - - - Select Cheat File: - 选择作弊码文件: - - - - Repository: - 存储库: - - - - Download Cheats - 下载作弊码 - - - - Delete File - 删除文件 - - - - No files selected. - 没有选择文件。 - - - - You can delete the cheats you don't want after downloading them. - 您可以在下载后删除不想要的作弊码。 - - - - Do you want to delete the selected file?\n%1 - 您要删除选中的文件吗?\n%1 - - - - Select Patch File: - 选择补丁文件: - - - - Download Patches - 下载补丁 - - - - Save - 保存 - - - - Cheats - 作弊码 - - - - Patches - 补丁 - - - - Error - 错误 - - - - No patch selected. - 没有选择补丁。 - - - - Unable to open files.json for reading. - 无法打开 files.json 进行读取。 - - - - No patch file found for the current serial. - 未找到当前序列号的补丁文件。 - - - - Unable to open the file for reading. - 无法打开文件进行读取。 - - - - Unable to open the file for writing. - 无法打开文件进行写入。 - - - - Failed to parse XML: - 解析 XML 失败: - - - - Success - 成功 - - - - Options saved successfully. - 选项已成功保存。 - - - - Invalid Source - 无效的来源 - - - - The selected source is invalid. - 选择的来源无效。 - - - - File Exists - 文件已存在 - - - - File already exists. Do you want to replace it? - 文件已存在。您要替换它吗? - - - - Failed to save file: - 保存文件失败: - - - - Failed to download file: - 下载文件失败: - - - - Cheats Not Found - 未找到作弊码 - - - - CheatsNotFound_MSG - 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 - - - - Cheats Downloaded Successfully - 作弊码下载成功 - - - - CheatsDownloadedSuccessfully_MSG - 您已成功下载了该游戏版本的作弊码 从所选存储库中。如果有,您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 - - - - Failed to save: - 保存失败: - - - - Failed to download: - 下载失败: - - - - Download Complete - 下载完成 - - - - DownloadComplete_MSG - 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不存在于特定的序列号和游戏版本中。可能需要更新游戏。 - - - - Failed to parse JSON data from HTML. - 无法解析 HTML 中的 JSON 数据。 - - - - Failed to retrieve HTML page. - 无法获取 HTML 页面。 - - - - Failed to open file: - 无法打开文件: - - - - XML ERROR: - XML 错误: - - - - Failed to open files.json for writing - 无法打开 files.json 进行写入 - - - - Author: - 作者: - - - - Directory does not exist: - 目录不存在: - - - - Failed to open files.json for reading. - 无法打开 files.json 进行读取。 - - - - Name: - 名称: - + + + * Unsupported Vulkan Version + * 不支持的 Vulkan 版本 + + + + Download Cheats For All Installed Games + 下载所有已安装游戏的作弊码 + + + + Download Patches For All Games + 下载所有游戏的补丁 + + + + Download Complete + 下载完成 + + + + You have downloaded cheats for all the games you have installed. + 您已下载了所有已安装游戏的作弊码。 + + + + Patches Downloaded Successfully! + 补丁下载成功! + + + + All Patches available for all games have been downloaded. + 所有游戏的所有补丁都已下载。 + + + + Games: + 游戏: + + + + PKG File (*.PKG) + PKG 文件 (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF 文件 (*.bin *.elf *.oelf) + + + + Game Boot + 游戏启动 + + + + Only one file can be selected! + 只能选择一个文件! + + + + PKG Extraction + PKG 解压 + + + + Patch detected! + 检测到补丁! + + + + PKG and Game versions match: + PKG 和游戏版本匹配: + + + + Would you like to overwrite? + 您想要覆盖吗? + + + + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安装版本更旧: + + + + Game is installed: + 游戏已安装: + + + + Would you like to install Patch: + 您想安装补丁吗: + + + + DLC Installation + DLC 安装 + + + + Would you like to install DLC: %1? + 您想安装 DLC: %1 吗? + + + + DLC already installed: + DLC 已经安装: + + + + Game already installed + 游戏已经安装 + + + + PKG is a patch, please install the game first! + PKG 是一个补丁,请先安装游戏! + + + + PKG ERROR + PKG 错误 + + + + Extracting PKG %1/%2 + 正在解压 PKG %1/%2 + + + + Extraction Finished + 解压完成 + + + + Game successfully installed at %1 + 游戏成功安装在 %1 + + + + File doesn't appear to be a valid PKG file + 文件似乎不是有效的 PKG 文件 + + + + CheatsPatches + + + Cheats / Patches + 作弊码 / 补丁 + + + + defaultTextEdit_MSG + 作弊/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,单独下载作弊程序。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊程序/补丁,\n请将问题报告给作弊程序的作者。\n\n创建了新的作弊程序?访问:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + 没有可用的图像 + + + + Serial: + 序列号: + + + + Version: + 版本: + + + + Size: + 大小: + + + + Select Cheat File: + 选择作弊码文件: + + + + Repository: + 存储库: + + + + Download Cheats + 下载作弊码 + + + + Delete File + 删除文件 + + + + No files selected. + 没有选择文件。 + + + + You can delete the cheats you don't want after downloading them. + 您可以在下载后删除不想要的作弊码。 + + + + Do you want to delete the selected file?\n%1 + 您要删除选中的文件吗?\n%1 + + + + Select Patch File: + 选择补丁文件: + + + + Download Patches + 下载补丁 + + + + Save + 保存 + + + + Cheats + 作弊码 + + + + Patches + 补丁 + + + + Error + 错误 + + + + No patch selected. + 没有选择补丁。 + + + + Unable to open files.json for reading. + 无法打开 files.json 进行读取。 + + + + No patch file found for the current serial. + 未找到当前序列号的补丁文件。 + + + + Unable to open the file for reading. + 无法打开文件进行读取。 + + + + Unable to open the file for writing. + 无法打开文件进行写入。 + + + + Failed to parse XML: + 解析 XML 失败: + + + + Success + 成功 + + + + Options saved successfully. + 选项已成功保存。 + + + + Invalid Source + 无效的来源 + + + + The selected source is invalid. + 选择的来源无效。 + + + + File Exists + 文件已存在 + + + + File already exists. Do you want to replace it? + 文件已存在。您要替换它吗? + + + + Failed to save file: + 保存文件失败: + + + + Failed to download file: + 下载文件失败: + + + + Cheats Not Found + 未找到作弊码 + + + + CheatsNotFound_MSG + 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 + + + + Cheats Downloaded Successfully + 作弊码下载成功 + + + + CheatsDownloadedSuccessfully_MSG + 您已成功下载了该游戏版本的作弊码 从所选存储库中。如果有,您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 + + + + Failed to save: + 保存失败: + + + + Failed to download: + 下载失败: + + + + Download Complete + 下载完成 + + + + DownloadComplete_MSG + 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不存在于特定的序列号和游戏版本中。可能需要更新游戏。 + + + + Failed to parse JSON data from HTML. + 无法解析 HTML 中的 JSON 数据。 + + + + Failed to retrieve HTML page. + 无法获取 HTML 页面。 + + + + Failed to open file: + 无法打开文件: + + + + XML ERROR: + XML 错误: + + + + Failed to open files.json for writing + 无法打开 files.json 进行写入 + + + + Author: + 作者: + + + + Directory does not exist: + 目录不存在: + + + + Failed to open files.json for reading. + 无法打开 files.json 进行读取。 + + + + Name: + 名称: + Can't apply cheats before the game is started 在游戏开始之前无法应用作弊。 - + SettingsDialog @@ -931,6 +973,111 @@ Close 关闭 + + + Point your mouse at an option to display its description. + 将鼠标指针指向选项以显示其描述。 + + + + consoleLanguageGroupBox + 控制台语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,因为可能因地区而异。 + + + + emulatorLanguageGroupBox + 模拟器语言:\n设置模拟器用户界面的语言。 + + + + fullscreenCheckBox + 启用全屏模式:\n自动将游戏窗口设置为全屏模式。\n您可以按 F11 键禁用此选项。 + + + + showSplashCheckBox + 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 + + + + ps4proCheckBox + 这是 PS4 Pro:\n使模拟器作为 PS4 PRO 运行,可以在支持的游戏中激活特殊功能。 + + + + userName + 用户名:\n设置 PS4 帐户的用户名。某些游戏中可能会显示此名称。 + + + + logTypeGroupBox + 日志类型:\n设置是否同步日志窗口的输出以提高性能。这可能会对模拟产生负面影响。 + + + + logFilter + 日志过滤器: 过滤日志,仅打印特定信息。例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 + + + + updaterGroupBox + 更新:\nRelease: 官方版本,可能非常旧,并且每月发布,但更可靠且经过测试。\nNightly: 开发版本,包含所有最新功能和修复,但可能包含错误且不够稳定。 + + + + GUIgroupBox + 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时启用播放特殊音乐。 + + + + graphicsAdapterGroupBox + 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动检测”以自动确定。 + + + + resolutionLayout + 宽度/高度:\n设置启动时模拟器的窗口大小,该大小可以在游戏中更改。\n这与游戏中的分辨率不同。 + + + + heightDivider + Vblank 除数:\n模拟器更新的帧速率乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! + + + + dumpShadersCheckBox + 启用着色器转储:\n为了技术调试,在渲染期间将游戏着色器保存到文件夹中。 + + + + nullGpuCheckBox + 启用空 GPU:\n为了技术调试,将游戏渲染禁用,仿佛没有图形卡。 + + + + dumpPM4CheckBox + 启用 PM4 转储:\n为了技术调试,在模拟器处理时将原始 GPU 指令数据保存到文件夹中。 + + + + debugDump + 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 + + + + vkValidationCheckBox + 启用 Vulkan 验证层:\n启用验证 Vulkan 渲染器状态并记录内部状态信息的系统。这可能会降低性能,并可能更改模拟行为。 + + + + vkSyncValidationCheckBox + 启用 Vulkan 同步验证:\n启用验证 Vulkan 渲染任务时间的系统。这可能会降低性能,并可能更改模拟行为。 + + + + rdocCheckBox + 启用 RenderDoc 调试:\n如果启用,模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 + GameListFrame @@ -975,4 +1122,132 @@ 路径 + + CheckUpdate + + + Auto Updater + 自动更新程序 + + + + Error + 错误 + + + + Network error: + 网络错误: + + + + Failed to parse update information. + 无法解析更新信息。 + + + + No pre-releases found. + 未找到预发布版本。 + + + + Invalid release data. + 无效的发布数据。 + + + + No download URL found for the specified asset. + 未找到指定资产的下载 URL。 + + + + Your version is already up to date! + 您的版本已经是最新的! + + + + Update Available + 可用更新 + + + + Update Channel + 更新频道 + + + + Current Version + 当前版本 + + + + Latest Version + 最新版本 + + + + Do you want to update? + 您想要更新吗? + + + + Show Changelog + 显示变更日志 + + + + Check for Updates at Startup + 启动时检查更新 + + + + Update + 更新 + + + + No + + + + + Hide Changelog + 隐藏变更日志 + + + + Changes + 变更 + + + + Network error occurred while trying to access the URL + 尝试访问 URL 时发生网络错误 + + + + Download Complete + 下载完成 + + + + The update has been downloaded, press OK to install. + 更新已下载,请按 OK 安装。 + + + + Failed to save the update file at + 无法保存更新文件到 + + + + Starting Update... + 正在开始更新... + + + + Failed to create the update script file + 无法创建更新脚本文件 + + \ No newline at end of file diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 77fe691fe..cead22ecf 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1,914 +1,956 @@ - - - - AboutDialog - - - About shadPS4 - About shadPS4 - - - - shadPS4 - shadPS4 - - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - - Open Folder - Open Folder - - - - GameInfoClass - - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - - Cancel - Cancel - - - - Loading... - Loading... - - - - GameInstallDialog - - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - - Directory to install games - Directory to install games - - - - Browse - Browse - - - - Error - Error - - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - - Create Shortcut - Create Shortcut - - - - Open Game Folder - Open Game Folder - - - - Cheats / Patches - Zuòbì / Xiūbǔ chéngshì - - - - SFO Viewer - SFO Viewer - - - - Trophy Viewer - Trophy Viewer - - - - Copy info - Copy info - - - - Copy Name - Copy Name - - - - Copy Serial - Copy Serial - - - - Copy All - Copy All - - - - Shortcut creation - Shortcut creation - - - - Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 - - - - Error - Error - - - - Error creating shortcut!\n %1 - Error creating shortcut!\n %1 - - - - Install PKG - Install PKG - - - - MainWindow - - - Open/Add Elf Folder - Open/Add Elf Folder - - - - Install Packages (PKG) - Install Packages (PKG) - - - - Boot Game - Boot Game - - - - About shadPS4 - About shadPS4 - - - - Configure... - Configure... - - - - Install application from a .pkg file - Install application from a .pkg file - - - - Recent Games - Recent Games - - - - Exit - Exit - - - - Exit shadPS4 - Exit shadPS4 - - - - Exit the application. - Exit the application. - - - - Show Game List - Show Game List - - - - Game List Refresh - Game List Refresh - - - - Tiny - Tiny - - - - Small - Small - - - - Medium - Medium - - - - Large - Large - - - - List View - List View - - - - Grid View - Grid View - - - - Elf Viewer - Elf Viewer - - - - Game Install Directory - Game Install Directory - - - - Download Cheats/Patches - Xiàzài Zuòbì / Xiūbǔ chéngshì - - - - Dump Game List - Dump Game List - - - - PKG Viewer - PKG Viewer - - - - Search... - Search... - - - - File - File - - - - View - View - - - - Game List Icons - Game List Icons - - - - Game List Mode - Game List Mode - - - - Settings - Settings - - - - Utils - Utils - - - - Themes - Themes - - - - About - About - - - - Dark - Dark - - - - Light - Light - - - - Green - Green - - - - Blue - Blue - - - - Violet - Violet - - - - toolBar - toolBar - - - - PKGViewer - - - Open Folder - Open Folder - - - - TrophyViewer - - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - - Settings - Settings - - - - General - General - - - - System - System - - - - Console Language - Console Language - - - - Emulator Language - Emulator Language - - - - Emulator - Emulator - - - - Enable Fullscreen - Enable Fullscreen - - - - Show Splash - Show Splash - - - - Is PS4 Pro - Is PS4 Pro - - - - Username - Username - - - - Logger - Logger - - - - Log Type - Log Type - - - - Log Filter - Log Filter - - - - Graphics - Graphics - - - - Graphics Device - Graphics Device - - - - Width - Width - - - - Height - Height - - - - Vblank Divider - Vblank Divider - - - - Advanced - Advanced - - - - Enable Shaders Dumping - Enable Shaders Dumping - - - - Enable NULL GPU - Enable NULL GPU - - - - Enable PM4 Dumping - Enable PM4 Dumping - - - - Debug - Debug - - - - Enable Debug Dumping - Enable Debug Dumping - - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - - MainWindow + + AboutDialog + + + About shadPS4 + About shadPS4 + + + + shadPS4 + shadPS4 + + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + ElfViewer + + + Open Folder + Open Folder + + + + GameInfoClass + + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + + Cancel + Cancel + + + + Loading... + Loading... + + + + GameInstallDialog + + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + + Directory to install games + Directory to install games + + + + Browse + Browse + + + + Error + Error + + + + The value for location to install games is not valid. + The value for location to install games is not valid. + + + + GuiContextMenus + + + Create Shortcut + Create Shortcut + + + + Open Game Folder + Open Game Folder + + + + Cheats / Patches + Zuòbì / Xiūbǔ chéngshì + + + + SFO Viewer + SFO Viewer + + + + Trophy Viewer + Trophy Viewer + + + + Copy info + Copy info + + + + Copy Name + Copy Name + + + + Copy Serial + Copy Serial + + + + Copy All + Copy All + + + + Shortcut creation + Shortcut creation + + + + Shortcut created successfully!\n %1 + Shortcut created successfully!\n %1 + + + + Error + Error + + + + Error creating shortcut!\n %1 + Error creating shortcut!\n %1 + + + + Install PKG + Install PKG + + + + MainWindow + + + Open/Add Elf Folder + Open/Add Elf Folder + + + + Install Packages (PKG) + Install Packages (PKG) + + + + Boot Game + Boot Game + + + + Check for Updates + 檢查更新 + + + + About shadPS4 + About shadPS4 + + + + Configure... + Configure... + + + + Install application from a .pkg file + Install application from a .pkg file + + + + Recent Games + Recent Games + + + + Exit + Exit + + + + Exit shadPS4 + Exit shadPS4 + + + + Exit the application. + Exit the application. + + + + Show Game List + Show Game List + + + + Game List Refresh + Game List Refresh + + + + Tiny + Tiny + + + + Small + Small + + + + Medium + Medium + + + + Large + Large + + + + List View + List View + + + + Grid View + Grid View + + + + Elf Viewer + Elf Viewer + + + + Game Install Directory + Game Install Directory + + + + Download Cheats/Patches + Xiàzài Zuòbì / Xiūbǔ chéngshì + + + + Dump Game List + Dump Game List + + + + PKG Viewer + PKG Viewer + + + + Search... + Search... + + + + File + File + + + + View + View + + + + Game List Icons + Game List Icons + + + + Game List Mode + Game List Mode + + + + Settings + Settings + + + + Utils + Utils + + + + Themes + Themes + + + + Help + 幫助 + + + + Dark + Dark + + + + Light + Light + + + + Green + Green + + + + Blue + Blue + + + + Violet + Violet + + + + toolBar + toolBar + + + + PKGViewer + + + Open Folder + Open Folder + + + + TrophyViewer + + + Trophy Viewer + Trophy Viewer + + + + SettingsDialog + + + Settings + Settings + + + + General + General + + + + System + System + + + + Console Language + Console Language + + + + Emulator Language + Emulator Language + + + + Emulator + Emulator + + + + Enable Fullscreen + Enable Fullscreen + + + + Show Splash + Show Splash + + + + Is PS4 Pro + Is PS4 Pro + + + + Username + Username + + + + Logger + Logger + + + + Log Type + Log Type + + + + Log Filter + Log Filter + + + + Graphics + Graphics + + + + Graphics Device + Graphics Device + + + + Width + Width + + + + Height + Height + + + + Vblank Divider + Vblank Divider + + + + Advanced + Advanced + + + + Enable Shaders Dumping + Enable Shaders Dumping + + + + Enable NULL GPU + Enable NULL GPU + + + + Enable PM4 Dumping + Enable PM4 Dumping + + + + Debug + Debug + + + + Enable Debug Dumping + Enable Debug Dumping + + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + + Update + 更新 + + + + Check for Updates at Startup + 啟動時檢查更新 + + + + Update Channel + 更新頻道 + + + + Check for Updates + 檢查更新 + + + + GUI Settings + 介面設置 + + + + Play title music + 播放標題音樂 + + + + Volume + 音量 + + + + MainWindow Game List 遊戲列表 - - - * Unsupported Vulkan Version - * 不支援的 Vulkan 版本 - - - - Download Cheats For All Installed Games - 下載所有已安裝遊戲的作弊碼 - - - - Download Patches For All Games - 下載所有遊戲的修補檔 - - - - Download Complete - 下載完成 - - - - You have downloaded cheats for all the games you have installed. - 您已經下載了所有已安裝遊戲的作弊碼。 - - - - Patches Downloaded Successfully! - 修補檔下載成功! - - - - All Patches available for all games have been downloaded. - 所有遊戲的修補檔已經下載完成。 - - - - Games: - 遊戲: - - - - PKG File (*.PKG) - PKG 檔案 (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF 檔案 (*.bin *.elf *.oelf) - - - - Game Boot - 遊戲啟動 - - - - Only one file can be selected! - 只能選擇一個檔案! - - - - PKG Extraction - PKG 解壓縮 - - - - Patch detected! - 檢測到補丁! - - - - PKG and Game versions match: - PKG 和遊戲版本匹配: - - - - Would you like to overwrite? - 您想要覆蓋嗎? - - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安裝版本更舊: - - - - Game is installed: - 遊戲已安裝: - - - - Would you like to install Patch: - 您想要安裝補丁嗎: - - - - DLC Installation - DLC 安裝 - - - - Would you like to install DLC: %1? - 您想要安裝 DLC: %1 嗎? - - - - DLC already installed: - DLC 已經安裝: - - - - Game already installed - 遊戲已經安裝 - - - - PKG is a patch, please install the game first! - PKG 是修補檔,請先安裝遊戲! - - - - PKG ERROR - PKG 錯誤 - - - - Extracting PKG %1/%2 - 正在解壓縮 PKG %1/%2 - - - - Extraction Finished - 解壓縮完成 - - - - Game successfully installed at %1 - 遊戲成功安裝於 %1 - - - - File doesn't appear to be a valid PKG file - 檔案似乎不是有效的 PKG 檔案 - - - - CheatsPatches - - - Cheats / Patches - 作弊碼 / 修補檔 - - - - defaultTextEdit_MSG - 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - 沒有可用的圖片 - - - - Serial: - 序號: - - - - Version: - 版本: - - - - Size: - 大小: - - - - Select Cheat File: - 選擇作弊檔案: - - - - Repository: - 儲存庫: - - - - Download Cheats - 下載作弊碼 - - - - Delete File - 刪除檔案 - - - - No files selected. - 沒有選擇檔案。 - - - - You can delete the cheats you don't want after downloading them. - 您可以在下載後刪除不需要的作弊碼。 - - - - Do you want to delete the selected file?\n%1 - 您是否要刪除選定的檔案?\n%1 - - - - Select Patch File: - 選擇修補檔案: - - - - Download Patches - 下載修補檔 - - - - Save - 儲存 - - - - Cheats - 作弊碼 - - - - Patches - 修補檔 - - - - Error - 錯誤 - - - - No patch selected. - 未選擇修補檔。 - - - - Unable to open files.json for reading. - 無法打開 files.json 進行讀取。 - - - - No patch file found for the current serial. - 找不到當前序號的修補檔。 - - - - Unable to open the file for reading. - 無法打開檔案進行讀取。 - - - - Unable to open the file for writing. - 無法打開檔案進行寫入。 - - - - Failed to parse XML: - 解析 XML 失敗: - - - - Success - 成功 - - - - Options saved successfully. - 選項已成功儲存。 - - - - Invalid Source - 無效的來源 - - - - The selected source is invalid. - 選擇的來源無效。 - - - - File Exists - 檔案已存在 - - - - File already exists. Do you want to replace it? - 檔案已存在。您是否希望替換它? - - - - Failed to save file: - 無法儲存檔案: - - - - Failed to download file: - 無法下載檔案: - - - - Cheats Not Found - 未找到作弊碼 - - - - CheatsNotFound_MSG - 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 - - - - Cheats Downloaded Successfully - 作弊碼下載成功 - - - - CheatsDownloadedSuccessfully_MSG - 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 - - - - Failed to save: - 儲存失敗: - - - - Failed to download: - 下載失敗: - - - - Download Complete - 下載完成 - - - - DownloadComplete_MSG - 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。可能需要更新遊戲。 - - - - Failed to parse JSON data from HTML. - 無法從 HTML 解析 JSON 數據。 - - - - Failed to retrieve HTML page. - 無法檢索 HTML 頁面。 - - - - Failed to open file: - 無法打開檔案: - - - - XML ERROR: - XML 錯誤: - - - - Failed to open files.json for writing - 無法打開 files.json 進行寫入 - - - - Author: - 作者: - - - - Directory does not exist: - 目錄不存在: - - - - Failed to open files.json for reading. - 無法打開 files.json 進行讀取。 - - - - Name: - 名稱: - + + + * Unsupported Vulkan Version + * 不支援的 Vulkan 版本 + + + + Download Cheats For All Installed Games + 下載所有已安裝遊戲的作弊碼 + + + + Download Patches For All Games + 下載所有遊戲的修補檔 + + + + Download Complete + 下載完成 + + + + You have downloaded cheats for all the games you have installed. + 您已經下載了所有已安裝遊戲的作弊碼。 + + + + Patches Downloaded Successfully! + 修補檔下載成功! + + + + All Patches available for all games have been downloaded. + 所有遊戲的修補檔已經下載完成。 + + + + Games: + 遊戲: + + + + PKG File (*.PKG) + PKG 檔案 (*.PKG) + + + + ELF files (*.bin *.elf *.oelf) + ELF 檔案 (*.bin *.elf *.oelf) + + + + Game Boot + 遊戲啟動 + + + + Only one file can be selected! + 只能選擇一個檔案! + + + + PKG Extraction + PKG 解壓縮 + + + + Patch detected! + 檢測到補丁! + + + + PKG and Game versions match: + PKG 和遊戲版本匹配: + + + + Would you like to overwrite? + 您想要覆蓋嗎? + + + + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安裝版本更舊: + + + + Game is installed: + 遊戲已安裝: + + + + Would you like to install Patch: + 您想要安裝補丁嗎: + + + + DLC Installation + DLC 安裝 + + + + Would you like to install DLC: %1? + 您想要安裝 DLC: %1 嗎? + + + + DLC already installed: + DLC 已經安裝: + + + + Game already installed + 遊戲已經安裝 + + + + PKG is a patch, please install the game first! + PKG 是修補檔,請先安裝遊戲! + + + + PKG ERROR + PKG 錯誤 + + + + Extracting PKG %1/%2 + 正在解壓縮 PKG %1/%2 + + + + Extraction Finished + 解壓縮完成 + + + + Game successfully installed at %1 + 遊戲成功安裝於 %1 + + + + File doesn't appear to be a valid PKG file + 檔案似乎不是有效的 PKG 檔案 + + + + CheatsPatches + + + Cheats / Patches + 作弊碼 / 修補檔 + + + + defaultTextEdit_MSG + 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats + + + + No Image Available + 沒有可用的圖片 + + + + Serial: + 序號: + + + + Version: + 版本: + + + + Size: + 大小: + + + + Select Cheat File: + 選擇作弊檔案: + + + + Repository: + 儲存庫: + + + + Download Cheats + 下載作弊碼 + + + + Delete File + 刪除檔案 + + + + No files selected. + 沒有選擇檔案。 + + + + You can delete the cheats you don't want after downloading them. + 您可以在下載後刪除不需要的作弊碼。 + + + + Do you want to delete the selected file?\n%1 + 您是否要刪除選定的檔案?\n%1 + + + + Select Patch File: + 選擇修補檔案: + + + + Download Patches + 下載修補檔 + + + + Save + 儲存 + + + + Cheats + 作弊碼 + + + + Patches + 修補檔 + + + + Error + 錯誤 + + + + No patch selected. + 未選擇修補檔。 + + + + Unable to open files.json for reading. + 無法打開 files.json 進行讀取。 + + + + No patch file found for the current serial. + 找不到當前序號的修補檔。 + + + + Unable to open the file for reading. + 無法打開檔案進行讀取。 + + + + Unable to open the file for writing. + 無法打開檔案進行寫入。 + + + + Failed to parse XML: + 解析 XML 失敗: + + + + Success + 成功 + + + + Options saved successfully. + 選項已成功儲存。 + + + + Invalid Source + 無效的來源 + + + + The selected source is invalid. + 選擇的來源無效。 + + + + File Exists + 檔案已存在 + + + + File already exists. Do you want to replace it? + 檔案已存在。您是否希望替換它? + + + + Failed to save file: + 無法儲存檔案: + + + + Failed to download file: + 無法下載檔案: + + + + Cheats Not Found + 未找到作弊碼 + + + + CheatsNotFound_MSG + 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 + + + + Cheats Downloaded Successfully + 作弊碼下載成功 + + + + CheatsDownloadedSuccessfully_MSG + 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 + + + + Failed to save: + 儲存失敗: + + + + Failed to download: + 下載失敗: + + + + Download Complete + 下載完成 + + + + DownloadComplete_MSG + 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。可能需要更新遊戲。 + + + + Failed to parse JSON data from HTML. + 無法從 HTML 解析 JSON 數據。 + + + + Failed to retrieve HTML page. + 無法檢索 HTML 頁面。 + + + + Failed to open file: + 無法打開檔案: + + + + XML ERROR: + XML 錯誤: + + + + Failed to open files.json for writing + 無法打開 files.json 進行寫入 + + + + Author: + 作者: + + + + Directory does not exist: + 目錄不存在: + + + + Failed to open files.json for reading. + 無法打開 files.json 進行讀取。 + + + + Name: + 名稱: + Can't apply cheats before the game is started 在遊戲開始之前無法應用作弊。 - + SettingsDialog @@ -931,6 +973,111 @@ Close 關閉 + + + Point your mouse at an option to display its description. + 將鼠標指向選項以顯示其描述。 + + + + consoleLanguageGroupBox + 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 + + + + emulatorLanguageGroupBox + 模擬器語言:\n設定模擬器的用戶介面的語言。 + + + + fullscreenCheckBox + 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 + + + + showSplashCheckBox + 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 + + + + ps4proCheckBox + 為PS4 Pro:\n讓模擬器像PS4 PRO一樣運作,這可能啟用支持此功能的遊戲中的特殊功能。 + + + + userName + 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 + + + + logTypeGroupBox + 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 + + + + logFilter + 日誌過濾器: 過濾日誌以僅打印特定信息。範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 + + + + updaterGroupBox + 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 + + + + GUIgroupBox + 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 + + + + graphicsAdapterGroupBox + 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 + + + + resolutionLayout + 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 + + + + heightDivider + Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! + + + + dumpShadersCheckBox + 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 + + + + nullGpuCheckBox + 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 + + + + dumpPM4CheckBox + 啟用PM4轉儲:\n為了技術調試,將原始GPU指令數據在模擬器處理時保存到文件夾中。 + + + + debugDump + 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 + + + + vkValidationCheckBox + 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 + + + + vkSyncValidationCheckBox + 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 + + + + rdocCheckBox + 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 + GameListFrame @@ -975,4 +1122,132 @@ 路徑 + + CheckUpdate + + + Auto Updater + 自動更新程式 + + + + Error + 錯誤 + + + + Network error: + 網路錯誤: + + + + Failed to parse update information. + 無法解析更新資訊。 + + + + No pre-releases found. + 未找到預發布版本。 + + + + Invalid release data. + 無效的發行數據。 + + + + No download URL found for the specified asset. + 未找到指定資產的下載 URL。 + + + + Your version is already up to date! + 您的版本已經是最新的! + + + + Update Available + 可用更新 + + + + Update Channel + 更新頻道 + + + + Current Version + 當前版本 + + + + Latest Version + 最新版本 + + + + Do you want to update? + 您想要更新嗎? + + + + Show Changelog + 顯示變更日誌 + + + + Check for Updates at Startup + 啟動時檢查更新 + + + + Update + 更新 + + + + No + + + + + Hide Changelog + 隱藏變更日誌 + + + + Changes + 變更 + + + + Network error occurred while trying to access the URL + 嘗試訪問 URL 時發生網路錯誤 + + + + Download Complete + 下載完成 + + + + The update has been downloaded, press OK to install. + 更新已下載,按 OK 安裝。 + + + + Failed to save the update file at + 無法將更新文件保存到 + + + + Starting Update... + 正在開始更新... + + + + Failed to create the update script file + 無法創建更新腳本文件 + + \ No newline at end of file diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 6fd5322c6..49fb993eb 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -9,7 +9,8 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo this->setAttribute(Qt::WA_DeleteOnClose); tabWidget = new QTabWidget(this); gameTrpPath_ = gameTrpPath; - headers << "Trophy" + headers << "Unlocked" + << "Trophy" << "Name" << "Description" << "ID" @@ -20,23 +21,15 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo } void TrophyViewer::PopulateTrophyWidget(QString title) { -#ifdef _WIN32 const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - title.toStdWString() / "TrophyFiles"; - const auto trophyDirQt = QString::fromStdWString(trophyDir.wstring()); -#else - const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - title.toStdString() / "TrophyFiles"; - const auto trophyDirQt = QString::fromStdString(trophyDir.string()); -#endif + Common::FS::PathFromQString(title) / "TrophyFiles"; + QString trophyDirQt; + Common::FS::PathToQString(trophyDirQt, trophyDir); QDir dir(trophyDirQt); if (!dir.exists()) { - std::filesystem::path path(gameTrpPath_.toStdString()); -#ifdef _WIN64 - path = std::filesystem::path(gameTrpPath_.toStdWString()); -#endif - if (!trp.Extract(path)) + std::filesystem::path path = Common::FS::PathFromQString(gameTrpPath_); + if (!trp.Extract(path, title.toStdString())) return; } QFileInfoList dirList = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); @@ -61,6 +54,7 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { QStringList trpId; QStringList trpHidden; + QStringList trpUnlocked; QStringList trpType; QStringList trpPid; QStringList trophyNames; @@ -81,6 +75,15 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { trpHidden.append(reader.attributes().value("hidden").toString()); trpType.append(reader.attributes().value("ttype").toString()); trpPid.append(reader.attributes().value("pid").toString()); + if (reader.attributes().hasAttribute("unlockstate")) { + if (reader.attributes().value("unlockstate").toString() == "true") { + trpUnlocked.append("unlocked"); + } else { + trpUnlocked.append("locked"); + } + } else { + trpUnlocked.append("locked"); + } } if (reader.name().toString() == "name" && !trpId.isEmpty()) { @@ -93,7 +96,7 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { } QTableWidget* tableWidget = new QTableWidget(this); tableWidget->setShowGrid(false); - tableWidget->setColumnCount(7); + tableWidget->setColumnCount(8); tableWidget->setHorizontalHeaderLabels(headers); tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); @@ -105,21 +108,22 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { QTableWidgetItem* item = new QTableWidgetItem(); item->setData(Qt::DecorationRole, icon); item->setFlags(item->flags() & ~Qt::ItemIsEditable); - tableWidget->setItem(row, 0, item); + tableWidget->setItem(row, 1, item); if (!trophyNames.isEmpty() && !trophyDetails.isEmpty()) { - SetTableItem(tableWidget, row, 1, trophyNames[row]); - SetTableItem(tableWidget, row, 2, trophyDetails[row]); - SetTableItem(tableWidget, row, 3, trpId[row]); - SetTableItem(tableWidget, row, 4, trpHidden[row]); - SetTableItem(tableWidget, row, 5, GetTrpType(trpType[row].at(0))); - SetTableItem(tableWidget, row, 6, trpPid[row]); + SetTableItem(tableWidget, row, 0, trpUnlocked[row]); + SetTableItem(tableWidget, row, 2, trophyNames[row]); + SetTableItem(tableWidget, row, 3, trophyDetails[row]); + SetTableItem(tableWidget, row, 4, trpId[row]); + SetTableItem(tableWidget, row, 5, trpHidden[row]); + SetTableItem(tableWidget, row, 6, GetTrpType(trpType[row].at(0))); + SetTableItem(tableWidget, row, 7, trpPid[row]); } tableWidget->verticalHeader()->resizeSection(row, icon.height()); row++; } tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); int width = 16; - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 8; i++) { width += tableWidget->horizontalHeader()->sectionSize(i); } tableWidget->resize(width, 720); diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index f3418c8f9..4a4020a42 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -23,7 +23,7 @@ namespace Frontend { WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_, std::string_view window_title) : width{width_}, height{height_}, controller{controller_} { - if (SDL_Init(SDL_INIT_VIDEO) < 0) { + if (!SDL_Init(SDL_INIT_VIDEO)) { UNREACHABLE_MSG("Failed to initialize SDL video subsystem: {}", SDL_GetError()); } SDL_InitSubSystem(SDL_INIT_AUDIO); @@ -36,6 +36,7 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, width); SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, height); SDL_SetNumberProperty(props, "flags", SDL_WINDOW_VULKAN); + SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN, true); window = SDL_CreateWindowWithProperties(props); SDL_DestroyProperties(props); if (window == nullptr) { @@ -303,6 +304,9 @@ void WindowSDL::onKeyPress(const SDL_Event* event) { if (axis != Input::Axis::AxisMax) { controller->Axis(0, axis, ax); } + if (SDL_GetCursor() != NULL) { + SDL_HideCursor(); + } } void WindowSDL::onGamepadEvent(const SDL_Event* event) { @@ -328,6 +332,9 @@ void WindowSDL::onGamepadEvent(const SDL_Event* event) { if (button != 0) { controller->CheckButton(0, button, event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN); } + if (SDL_GetCursor() != NULL) { + SDL_HideCursor(); + } break; case SDL_EVENT_GAMEPAD_AXIS_MOTION: axis = event->gaxis.axis == SDL_GAMEPAD_AXIS_LEFTX ? Input::Axis::LeftX diff --git a/src/shader_recompiler/backend/bindings.h b/src/shader_recompiler/backend/bindings.h index 1b53c74eb..510b0c0ec 100644 --- a/src/shader_recompiler/backend/bindings.h +++ b/src/shader_recompiler/backend/bindings.h @@ -9,10 +9,10 @@ namespace Shader::Backend { struct Bindings { u32 unified{}; - u32 uniform_buffer{}; - u32 storage_buffer{}; - u32 texture{}; - u32 image{}; + u32 buffer{}; + u32 user_data{}; + + auto operator<=>(const Bindings&) const = default; }; } // namespace Shader::Backend diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 11d2a1dde..a585f3283 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "common/assert.h" #include "common/func_traits.h" #include "shader_recompiler/backend/spirv/emit_spirv.h" #include "shader_recompiler/backend/spirv/emit_spirv_instructions.h" @@ -12,10 +13,38 @@ #include "shader_recompiler/frontend/translate/translate.h" #include "shader_recompiler/ir/basic_block.h" #include "shader_recompiler/ir/program.h" +#include "video_core/amdgpu/types.h" namespace Shader::Backend::SPIRV { namespace { +static constexpr spv::ExecutionMode GetInputPrimitiveType(AmdGpu::PrimitiveType type) { + switch (type) { + case AmdGpu::PrimitiveType::PointList: + return spv::ExecutionMode::InputPoints; + case AmdGpu::PrimitiveType::LineList: + return spv::ExecutionMode::InputLines; + case AmdGpu::PrimitiveType::TriangleList: + case AmdGpu::PrimitiveType::TriangleStrip: + return spv::ExecutionMode::Triangles; + default: + UNREACHABLE(); + } +} + +static constexpr spv::ExecutionMode GetOutputPrimitiveType(AmdGpu::GsOutputPrimitiveType type) { + switch (type) { + case AmdGpu::GsOutputPrimitiveType::PointList: + return spv::ExecutionMode::OutputVertices; + case AmdGpu::GsOutputPrimitiveType::LineStrip: + return spv::ExecutionMode::OutputLineStrip; + case AmdGpu::GsOutputPrimitiveType::TriangleStrip: + return spv::ExecutionMode::OutputTriangleStrip; + default: + UNREACHABLE(); + } +} + template void SetDefinition(EmitContext& ctx, IR::Inst* inst, Args... args) { inst->SetDefinition(func(ctx, std::forward(args)...)); @@ -184,6 +213,9 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) { ctx.AddCapability(spv::Capability::Float16); ctx.AddCapability(spv::Capability::Int16); } + if (info.uses_fp64) { + ctx.AddCapability(spv::Capability::Float64); + } ctx.AddCapability(spv::Capability::Int64); if (info.has_storage_images || info.has_image_buffers) { ctx.AddCapability(spv::Capability::StorageImageExtendedFormats); @@ -219,6 +251,7 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) { workgroup_size[1], workgroup_size[2]); break; } + case Stage::Export: case Stage::Vertex: execution_model = spv::ExecutionModel::Vertex; break; @@ -230,12 +263,23 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) { ctx.AddExecutionMode(main, spv::ExecutionMode::OriginUpperLeft); } if (info.has_discard) { + ctx.AddExtension("SPV_EXT_demote_to_helper_invocation"); ctx.AddCapability(spv::Capability::DemoteToHelperInvocationEXT); } if (info.stores.Get(IR::Attribute::Depth)) { ctx.AddExecutionMode(main, spv::ExecutionMode::DepthReplacing); } break; + case Stage::Geometry: + execution_model = spv::ExecutionModel::Geometry; + ctx.AddExecutionMode(main, GetInputPrimitiveType(ctx.runtime_info.gs_info.in_primitive)); + ctx.AddExecutionMode(main, + GetOutputPrimitiveType(ctx.runtime_info.gs_info.out_primitive[0])); + ctx.AddExecutionMode(main, spv::ExecutionMode::OutputVertices, + ctx.runtime_info.gs_info.output_vertices); + ctx.AddExecutionMode(main, spv::ExecutionMode::Invocations, + ctx.runtime_info.gs_info.num_invocations); + break; default: throw NotImplementedException("Stage {}", u32(program.info.stage)); } @@ -262,15 +306,24 @@ void PatchPhiNodes(const IR::Program& program, EmitContext& ctx) { } // Anonymous namespace std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_info, - const IR::Program& program, u32& binding) { + const IR::Program& program, Bindings& binding) { EmitContext ctx{profile, runtime_info, program.info, binding}; const Id main{DefineMain(ctx, program)}; DefineEntryPoint(program, ctx, main); - if (program.info.stage == Stage::Vertex) { + switch (program.info.stage) { + case Stage::Export: + case Stage::Vertex: ctx.AddExtension("SPV_KHR_shader_draw_parameters"); ctx.AddCapability(spv::Capability::DrawParameters); + break; + case Stage::Geometry: + ctx.AddCapability(spv::Capability::Geometry); + break; + default: + break; } PatchPhiNodes(program, ctx); + binding.user_data += program.info.ud_mask.NumRegs(); return ctx.Assemble(); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h index aada0ff67..5b8da4496 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv.h @@ -4,12 +4,13 @@ #pragma once #include +#include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/ir/program.h" #include "shader_recompiler/profile.h" namespace Shader::Backend::SPIRV { [[nodiscard]] std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_info, - const IR::Program& program, u32& binding); + const IR::Program& program, Bindings& binding); } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp index 03a0a00f0..02ac74e19 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp @@ -14,8 +14,8 @@ Id EmitBitCastU32F32(EmitContext& ctx, Id value) { return ctx.OpBitcast(ctx.U32[1], value); } -void EmitBitCastU64F64(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +Id EmitBitCastU64F64(EmitContext& ctx, Id value) { + return ctx.OpBitcast(ctx.U64, value); } Id EmitBitCastF16U16(EmitContext& ctx, Id value) { @@ -38,6 +38,10 @@ Id EmitUnpackUint2x32(EmitContext& ctx, Id value) { return ctx.OpBitcast(ctx.U32[2], value); } +Id EmitPackFloat2x32(EmitContext& ctx, Id value) { + return ctx.OpBitcast(ctx.F64[1], value); +} + Id EmitPackFloat2x16(EmitContext& ctx, Id value) { return ctx.OpBitcast(ctx.U32[1], value); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 5fed9b4db..2d48999c0 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -46,47 +46,72 @@ Id OutputAttrPointer(EmitContext& ctx, IR::Attribute attr, u32 element) { if (IR::IsParam(attr)) { const u32 index{u32(attr) - u32(IR::Attribute::Param0)}; const auto& info{ctx.output_params.at(index)}; + ASSERT(info.num_components > 0); if (info.num_components == 1) { return info.id; } else { - return ctx.OpAccessChain(ctx.output_f32, info.id, ctx.ConstU32(element)); + return ctx.OpAccessChain(info.pointer_type, info.id, ctx.ConstU32(element)); + } + } + if (IR::IsMrt(attr)) { + const u32 index{u32(attr) - u32(IR::Attribute::RenderTarget0)}; + const auto& info{ctx.frag_outputs.at(index)}; + if (info.num_components == 1) { + return info.id; + } else { + return ctx.OpAccessChain(info.pointer_type, info.id, ctx.ConstU32(element)); } } switch (attr) { case IR::Attribute::Position0: { return ctx.OpAccessChain(ctx.output_f32, ctx.output_position, ctx.ConstU32(element)); + } case IR::Attribute::Position1: case IR::Attribute::Position2: case IR::Attribute::Position3: { const u32 index = u32(attr) - u32(IR::Attribute::Position1); return VsOutputAttrPointer(ctx, ctx.runtime_info.vs_info.outputs[index][element]); } - case IR::Attribute::RenderTarget0: - case IR::Attribute::RenderTarget1: - case IR::Attribute::RenderTarget2: - case IR::Attribute::RenderTarget3: - case IR::Attribute::RenderTarget4: - case IR::Attribute::RenderTarget5: - case IR::Attribute::RenderTarget6: - case IR::Attribute::RenderTarget7: { - const u32 index = u32(attr) - u32(IR::Attribute::RenderTarget0); - if (ctx.frag_num_comp[index] > 1) { - return ctx.OpAccessChain(ctx.output_f32, ctx.frag_color[index], ctx.ConstU32(element)); - } else { - return ctx.frag_color[index]; - } - } case IR::Attribute::Depth: return ctx.frag_depth; default: - throw NotImplementedException("Read attribute {}", attr); + throw NotImplementedException("Write attribute {}", attr); } +} + +std::pair OutputAttrComponentType(EmitContext& ctx, IR::Attribute attr) { + if (IR::IsParam(attr)) { + const u32 index{u32(attr) - u32(IR::Attribute::Param0)}; + const auto& info{ctx.output_params.at(index)}; + return {info.component_type, info.is_integer}; + } + if (IR::IsMrt(attr)) { + const u32 index{u32(attr) - u32(IR::Attribute::RenderTarget0)}; + const auto& info{ctx.frag_outputs.at(index)}; + return {info.component_type, info.is_integer}; + } + switch (attr) { + case IR::Attribute::Position0: + case IR::Attribute::Position1: + case IR::Attribute::Position2: + case IR::Attribute::Position3: + case IR::Attribute::Depth: + return {ctx.F32[1], false}; + default: + throw NotImplementedException("Write attribute {}", attr); } } } // Anonymous namespace Id EmitGetUserData(EmitContext& ctx, IR::ScalarReg reg) { - return ctx.ConstU32(ctx.info.user_data[static_cast(reg)]); + const u32 index = ctx.binding.user_data + ctx.info.ud_mask.Index(reg); + const u32 half = PushData::UdRegsIndex + (index >> 2); + const Id ud_ptr{ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, ctx.U32[1]), + ctx.push_data_block, ctx.ConstU32(half), + ctx.ConstU32(index & 3))}; + const Id ud_reg{ctx.OpLoad(ctx.U32[1], ud_ptr)}; + ctx.Name(ud_reg, fmt::format("ud_{}", u32(reg))); + return ud_reg; } void EmitGetThreadBitScalarReg(EmitContext& ctx) { @@ -140,7 +165,30 @@ Id EmitReadStepRate(EmitContext& ctx, int rate_idx) { rate_idx == 0 ? ctx.u32_zero_value : ctx.u32_one_value)); } -Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp) { +Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp, u32 index) { + if (ctx.info.stage == Stage::Geometry) { + if (IR::IsPosition(attr)) { + ASSERT(attr == IR::Attribute::Position0); + const auto position_arr_ptr = ctx.TypePointer(spv::StorageClass::Input, ctx.F32[4]); + const auto pointer{ctx.OpAccessChain(position_arr_ptr, ctx.gl_in, ctx.ConstU32(index), + ctx.ConstU32(0u))}; + const auto position_comp_ptr = ctx.TypePointer(spv::StorageClass::Input, ctx.F32[1]); + return ctx.OpLoad(ctx.F32[1], + ctx.OpAccessChain(position_comp_ptr, pointer, ctx.ConstU32(comp))); + } + + if (IR::IsParam(attr)) { + const u32 param_id{u32(attr) - u32(IR::Attribute::Param0)}; + const auto param = ctx.input_params.at(param_id).id; + const auto param_arr_ptr = ctx.TypePointer(spv::StorageClass::Input, ctx.F32[4]); + const auto pointer{ctx.OpAccessChain(param_arr_ptr, param, ctx.ConstU32(index))}; + const auto position_comp_ptr = ctx.TypePointer(spv::StorageClass::Input, ctx.F32[1]); + return ctx.OpLoad(ctx.F32[1], + ctx.OpAccessChain(position_comp_ptr, pointer, ctx.ConstU32(comp))); + } + UNREACHABLE(); + } + if (IR::IsParam(attr)) { const u32 index{u32(attr) - u32(IR::Attribute::Param0)}; const auto& param{ctx.input_params.at(index)}; @@ -149,17 +197,21 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp) { // Attribute is disabled or varying component is not written return ctx.ConstF32(comp == 3 ? 1.0f : 0.0f); } - if (param.is_default) { - return ctx.OpCompositeExtract(param.component_type, param.id, comp); - } - if (param.num_components > 1) { + Id result; + if (param.is_default) { + result = ctx.OpCompositeExtract(param.component_type, param.id, comp); + } else if (param.num_components > 1) { const Id pointer{ ctx.OpAccessChain(param.pointer_type, param.id, ctx.ConstU32(comp))}; - return ctx.OpLoad(param.component_type, pointer); + result = ctx.OpLoad(param.component_type, pointer); } else { - return ctx.OpLoad(param.component_type, param.id); + result = ctx.OpLoad(param.component_type, param.id); } + if (param.is_integer) { + result = ctx.OpBitcast(ctx.F32[1], result); + } + return result; } else { const auto step_rate = EmitReadStepRate(ctx, param.id.value); const auto offset = ctx.OpIAdd( @@ -204,6 +256,9 @@ Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, u32 comp) { case IR::Attribute::IsFrontFace: return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1[1], ctx.front_facing), ctx.u32_one_value, ctx.u32_zero_value); + case IR::Attribute::PrimitiveId: + ASSERT(ctx.info.stage == Stage::Geometry); + return ctx.OpLoad(ctx.U32[1], ctx.primitive_id); default: throw NotImplementedException("Read U32 attribute {}", attr); } @@ -215,7 +270,12 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, u32 elemen return; } const Id pointer{OutputAttrPointer(ctx, attr, element)}; - ctx.OpStore(pointer, ctx.OpBitcast(ctx.F32[1], value)); + const auto component_type{OutputAttrComponentType(ctx, attr)}; + if (component_type.second) { + ctx.OpStore(pointer, ctx.OpBitcast(component_type.first, value)); + } else { + ctx.OpStore(pointer, value); + } } template diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 26c5c72d6..8f062d6e7 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -76,77 +76,89 @@ Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id c const IR::Value& offset) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(4); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); ImageOperands operands; operands.Add(spv::ImageOperandsMask::Bias, bias); operands.AddOffset(ctx, offset); - return ctx.OpImageSampleImplicitLod(ctx.F32[4], sampled_image, coords, operands.mask, - operands.operands); + const Id sample = ctx.OpImageSampleImplicitLod(result_type, sampled_image, coords, + operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], sample) : sample; } Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id lod, const IR::Value& offset) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(4); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); ImageOperands operands; operands.Add(spv::ImageOperandsMask::Lod, lod); operands.AddOffset(ctx, offset); - return ctx.OpImageSampleExplicitLod(ctx.F32[4], sampled_image, coords, operands.mask, - operands.operands); + const Id sample = ctx.OpImageSampleExplicitLod(result_type, sampled_image, coords, + operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], sample) : sample; } Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id dref, Id bias, const IR::Value& offset) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(1); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); ImageOperands operands; operands.Add(spv::ImageOperandsMask::Bias, bias); operands.AddOffset(ctx, offset); - return ctx.OpImageSampleDrefImplicitLod(ctx.F32[1], sampled_image, coords, dref, operands.mask, - operands.operands); + const Id sample = ctx.OpImageSampleDrefImplicitLod(result_type, sampled_image, coords, dref, + operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[1], sample) : sample; } Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id dref, Id lod, const IR::Value& offset) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(1); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); ImageOperands operands; operands.AddOffset(ctx, offset); operands.Add(spv::ImageOperandsMask::Lod, lod); - return ctx.OpImageSampleDrefExplicitLod(ctx.F32[1], sampled_image, coords, dref, operands.mask, - operands.operands); + const Id sample = ctx.OpImageSampleDrefExplicitLod(result_type, sampled_image, coords, dref, + operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[1], sample) : sample; } Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const IR::Value& offset) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(4); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); const u32 comp = inst->Flags().gather_comp.Value(); ImageOperands operands; operands.AddOffset(ctx, offset, true); - return ctx.OpImageGather(ctx.F32[4], sampled_image, coords, ctx.ConstU32(comp), operands.mask, - operands.operands); + const Id texels = ctx.OpImageGather(result_type, sampled_image, coords, ctx.ConstU32(comp), + operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], texels) : texels; } Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const IR::Value& offset, Id dref) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(4); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); ImageOperands operands; operands.AddOffset(ctx, offset, true); - return ctx.OpImageDrefGather(ctx.F32[4], sampled_image, coords, dref, operands.mask, - operands.operands); + const Id texels = ctx.OpImageDrefGather(result_type, sampled_image, coords, dref, operands.mask, + operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], texels) : texels; } Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const IR::Value& offset, @@ -157,19 +169,20 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const ImageOperands operands; operands.AddOffset(ctx, offset); operands.Add(spv::ImageOperandsMask::Lod, lod); - const Id texel = texture.is_storage ? ctx.OpImageRead(result_type, image, coords) - : ctx.OpImageFetch(result_type, image, coords, - operands.mask, operands.operands); - return ctx.OpBitcast(ctx.F32[4], texel); + const Id texel = + texture.is_storage + ? ctx.OpImageRead(result_type, image, coords, operands.mask, operands.operands) + : ctx.OpImageFetch(result_type, image, coords, operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], texel) : texel; } -Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool skip_mips) { +Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool has_mips) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); const auto type = ctx.info.images[handle & 0xFFFF].type; const Id zero = ctx.u32_zero_value; - const auto mips{[&] { return skip_mips ? zero : ctx.OpImageQueryLevels(ctx.U32[1], image); }}; - const bool uses_lod{type != AmdGpu::ImageType::Color2DMsaa}; + const auto mips{[&] { return has_mips ? ctx.OpImageQueryLevels(ctx.U32[1], image) : zero; }}; + const bool uses_lod{type != AmdGpu::ImageType::Color2DMsaa && !texture.is_storage}; const auto query{[&](Id type) { return uses_lod ? ctx.OpImageQuerySizeLod(type, image, lod) : ctx.OpImageQuerySize(type, image); @@ -180,6 +193,7 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod case AmdGpu::ImageType::Color1DArray: case AmdGpu::ImageType::Color2D: case AmdGpu::ImageType::Cube: + case AmdGpu::ImageType::Color2DMsaa: return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[2]), zero, mips()); case AmdGpu::ImageType::Color2DArray: case AmdGpu::ImageType::Color3D: @@ -202,13 +216,15 @@ Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id const IR::Value& offset, Id lod_clamp) { const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); + const Id result_type = texture.data_types->Get(4); const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]); const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler); ImageOperands operands; operands.AddDerivatives(ctx, derivatives); operands.AddOffset(ctx, offset); - return ctx.OpImageSampleExplicitLod(ctx.F32[4], sampled_image, coords, operands.mask, - operands.operands); + const Id sample = ctx.OpImageSampleExplicitLod(result_type, sampled_image, coords, + operands.mask, operands.operands); + return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], sample) : sample; } Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords) { diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index e506ced3a..ec86e5cc9 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -27,7 +27,6 @@ Id EmitConditionRef(EmitContext& ctx, const IR::Value& value); void EmitReference(EmitContext&); void EmitPhiMove(EmitContext&); void EmitJoin(EmitContext& ctx); -void EmitBarrier(EmitContext& ctx); void EmitWorkgroupMemoryBarrier(EmitContext& ctx); void EmitDeviceMemoryBarrier(EmitContext& ctx); void EmitGetScc(EmitContext& ctx); @@ -85,7 +84,7 @@ Id EmitBufferAtomicAnd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id addres Id EmitBufferAtomicOr32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); Id EmitBufferAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); Id EmitBufferAtomicSwap32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); -Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp); +Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp, u32 index); Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, u32 comp); void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, u32 comp); void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value); @@ -158,12 +157,13 @@ Id EmitSelectF32(EmitContext& ctx, Id cond, Id true_value, Id false_value); Id EmitSelectF64(EmitContext& ctx, Id cond, Id true_value, Id false_value); Id EmitBitCastU16F16(EmitContext& ctx, Id value); Id EmitBitCastU32F32(EmitContext& ctx, Id value); -void EmitBitCastU64F64(EmitContext& ctx); +Id EmitBitCastU64F64(EmitContext& ctx, Id value); Id EmitBitCastF16U16(EmitContext& ctx, Id value); Id EmitBitCastF32U32(EmitContext& ctx, Id value); void EmitBitCastF64U64(EmitContext& ctx); Id EmitPackUint2x32(EmitContext& ctx, Id value); Id EmitUnpackUint2x32(EmitContext& ctx, Id value); +Id EmitPackFloat2x32(EmitContext& ctx, Id value); Id EmitPackFloat2x16(EmitContext& ctx, Id value); Id EmitUnpackFloat2x16(EmitContext& ctx, Id value); Id EmitPackHalf2x16(EmitContext& ctx, Id value); @@ -269,6 +269,8 @@ Id EmitIMul32(EmitContext& ctx, Id a, Id b); Id EmitIMul64(EmitContext& ctx, Id a, Id b); Id EmitSDiv32(EmitContext& ctx, Id a, Id b); Id EmitUDiv32(EmitContext& ctx, Id a, Id b); +Id EmitSMod32(EmitContext& ctx, Id a, Id b); +Id EmitUMod32(EmitContext& ctx, Id a, Id b); Id EmitINeg32(EmitContext& ctx, Id value); Id EmitINeg64(EmitContext& ctx, Id value); Id EmitIAbs32(EmitContext& ctx, Id value); @@ -406,4 +408,7 @@ Id EmitWriteLane(EmitContext& ctx, Id value, Id write_value, u32 lane); Id EmitDataAppend(EmitContext& ctx, u32 gds_addr, u32 binding); Id EmitDataConsume(EmitContext& ctx, u32 gds_addr, u32 binding); +void EmitEmitVertex(EmitContext& ctx); +void EmitEmitPrimitive(EmitContext& ctx); + } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp index a9becb1eb..02af92385 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp @@ -96,6 +96,14 @@ Id EmitUDiv32(EmitContext& ctx, Id a, Id b) { return ctx.OpUDiv(ctx.U32[1], a, b); } +Id EmitSMod32(EmitContext& ctx, Id a, Id b) { + return ctx.OpSMod(ctx.U32[1], a, b); +} + +Id EmitUMod32(EmitContext& ctx, Id a, Id b) { + return ctx.OpUMod(ctx.U32[1], a, b); +} + Id EmitINeg32(EmitContext& ctx, Id value) { return ctx.OpSNegate(ctx.U32[1], value); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp index 283c9b16f..c12e4997f 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp @@ -41,6 +41,14 @@ void EmitDiscardCond(EmitContext& ctx, Id condition) { ctx.AddLabel(merge_label); } +void EmitEmitVertex(EmitContext& ctx) { + ctx.OpEmitVertex(); +} + +void EmitEmitPrimitive(EmitContext& ctx) { + ctx.OpEndPrimitive(); +} + void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream) { throw NotImplementedException("Geometry streams"); } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 3838d614e..f5b60d51d 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -1,8 +1,10 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "common/assert.h" #include "common/div_ceil.h" #include "shader_recompiler/backend/spirv/spirv_emit_context.h" +#include "video_core/amdgpu/types.h" #include #include @@ -32,6 +34,19 @@ std::string_view StageName(Stage stage) { throw InvalidArgument("Invalid stage {}", u32(stage)); } +static constexpr u32 NumVertices(AmdGpu::GsOutputPrimitiveType type) { + switch (type) { + case AmdGpu::GsOutputPrimitiveType::PointList: + return 1u; + case AmdGpu::GsOutputPrimitiveType::LineStrip: + return 2u; + case AmdGpu::GsOutputPrimitiveType::TriangleStrip: + return 3u; + default: + UNREACHABLE(); + } +} + template void Name(EmitContext& ctx, Id object, std::string_view format_str, Args&&... args) { ctx.Name(object, fmt::format(fmt::runtime(format_str), StageName(ctx.stage), @@ -42,7 +57,7 @@ void Name(EmitContext& ctx, Id object, std::string_view format_str, Args&&... ar } // Anonymous namespace EmitContext::EmitContext(const Profile& profile_, const RuntimeInfo& runtime_info_, - const Info& info_, u32& binding_) + const Info& info_, Bindings& binding_) : Sirit::Module(profile_.supported_spirv), info{info_}, runtime_info{runtime_info_}, profile{profile_}, stage{info.stage}, binding{binding_} { AddCapability(spv::Capability::Shader); @@ -85,6 +100,9 @@ void EmitContext::DefineArithmeticTypes() { F16[1] = Name(TypeFloat(16), "f16_id"); U16 = Name(TypeUInt(16), "u16_id"); } + if (info.uses_fp64) { + F64[1] = Name(TypeFloat(64), "f64_id"); + } F32[1] = Name(TypeFloat(32), "f32_id"); S32[1] = Name(TypeSInt(32), "i32_id"); U32[1] = Name(TypeUInt(32), "u32_id"); @@ -94,6 +112,9 @@ void EmitContext::DefineArithmeticTypes() { if (info.uses_fp16) { F16[i] = Name(TypeVector(F16[1], i), fmt::format("f16vec{}_id", i)); } + if (info.uses_fp64) { + F64[i] = Name(TypeVector(F64[1], i), fmt::format("f64vec{}_id", i)); + } F32[i] = Name(TypeVector(F32[1], i), fmt::format("f32vec{}_id", i)); S32[i] = Name(TypeVector(S32[1], i), fmt::format("i32vec{}_id", i)); U32[i] = Name(TypeVector(U32[1], i), fmt::format("u32vec{}_id", i)); @@ -114,6 +135,7 @@ void EmitContext::DefineArithmeticTypes() { output_f32 = Name(TypePointer(spv::StorageClass::Output, F32[1]), "output_f32"); output_u32 = Name(TypePointer(spv::StorageClass::Output, U32[1]), "output_u32"); + output_s32 = Name(TypePointer(spv::StorageClass::Output, S32[1]), "output_s32"); full_result_i32x2 = Name(TypeStruct(S32[1], S32[1]), "full_result_i32x2"); full_result_u32x2 = Name(TypeStruct(U32[1], U32[1]), "full_result_u32x2"); @@ -145,21 +167,21 @@ const VectorIds& GetAttributeType(EmitContext& ctx, AmdGpu::NumberFormat fmt) { UNREACHABLE_MSG("Invalid attribute type {}", fmt); } -EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id) { +EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id, + u32 num_components, bool output) { switch (fmt) { case AmdGpu::NumberFormat::Float: case AmdGpu::NumberFormat::Unorm: case AmdGpu::NumberFormat::Snorm: case AmdGpu::NumberFormat::SnormNz: - return {id, input_f32, F32[1], 4}; - case AmdGpu::NumberFormat::Uint: - return {id, input_u32, U32[1], 4}; - case AmdGpu::NumberFormat::Sint: - return {id, input_s32, S32[1], 4}; case AmdGpu::NumberFormat::Sscaled: - return {id, input_f32, F32[1], 4}; case AmdGpu::NumberFormat::Uscaled: - return {id, input_f32, F32[1], 4}; + case AmdGpu::NumberFormat::Srgb: + return {id, output ? output_f32 : input_f32, F32[1], num_components, false}; + case AmdGpu::NumberFormat::Uint: + return {id, output ? output_u32 : input_u32, U32[1], num_components, true}; + case AmdGpu::NumberFormat::Sint: + return {id, output ? output_s32 : input_s32, S32[1], num_components, true}; default: break; } @@ -167,7 +189,7 @@ EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat f } void EmitContext::DefineBufferOffsets() { - for (auto& buffer : buffers) { + for (BufferDefinition& buffer : buffers) { const u32 binding = buffer.binding; const u32 half = PushData::BufOffsetIndex + (binding >> 4); const u32 comp = (binding & 0xf) >> 2; @@ -176,9 +198,11 @@ void EmitContext::DefineBufferOffsets() { push_data_block, ConstU32(half), ConstU32(comp))}; const Id value{OpLoad(U32[1], ptr)}; buffer.offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(8U)); + Name(buffer.offset, fmt::format("buf{}_off", binding)); buffer.offset_dwords = OpShiftRightLogical(U32[1], buffer.offset, ConstU32(2U)); + Name(buffer.offset_dwords, fmt::format("buf{}_dword_off", binding)); } - for (auto& tex_buffer : texture_buffers) { + for (TextureBufferDefinition& tex_buffer : texture_buffers) { const u32 binding = tex_buffer.binding; const u32 half = PushData::BufOffsetIndex + (binding >> 4); const u32 comp = (binding & 0xf) >> 2; @@ -186,7 +210,8 @@ void EmitContext::DefineBufferOffsets() { const Id ptr{OpAccessChain(TypePointer(spv::StorageClass::PushConstant, U32[1]), push_data_block, ConstU32(half), ConstU32(comp))}; const Id value{OpLoad(U32[1], ptr)}; - tex_buffer.coord_offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(8U)); + tex_buffer.coord_offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(6U)); + Name(tex_buffer.coord_offset, fmt::format("texbuf{}_off", binding)); } } @@ -212,12 +237,14 @@ void EmitContext::DefineInputs() { Decorate(subgroup_local_invocation_id, spv::Decoration::Flat); } switch (stage) { + case Stage::Export: case Stage::Vertex: { vertex_index = DefineVariable(U32[1], spv::BuiltIn::VertexIndex, spv::StorageClass::Input); base_vertex = DefineVariable(U32[1], spv::BuiltIn::BaseVertex, spv::StorageClass::Input); instance_id = DefineVariable(U32[1], spv::BuiltIn::InstanceIndex, spv::StorageClass::Input); for (const auto& input : info.vs_inputs) { + ASSERT(input.binding < IR::NumParams); const Id type{GetAttributeType(*this, input.fmt)[4]}; if (input.instance_step_rate == Info::VsInput::InstanceIdType::OverStepRate0 || input.instance_step_rate == Info::VsInput::InstanceIdType::OverStepRate1) { @@ -227,9 +254,13 @@ void EmitContext::DefineInputs() { : 1; // Note that we pass index rather than Id input_params[input.binding] = { - rate_idx, input_u32, - U32[1], input.num_components, - false, input.instance_data_buf, + rate_idx, + input_u32, + U32[1], + input.num_components, + true, + false, + input.instance_data_buf, }; } else { Id id{DefineInput(type, input.binding)}; @@ -238,7 +269,7 @@ void EmitContext::DefineInputs() { } else { Name(id, fmt::format("vs_in_attr{}", input.binding)); } - input_params[input.binding] = GetAttributeInfo(input.fmt, id); + input_params[input.binding] = GetAttributeInfo(input.fmt, id, 4, false); interfaces.push_back(id); } } @@ -250,9 +281,11 @@ void EmitContext::DefineInputs() { front_facing = DefineVariable(U1[1], spv::BuiltIn::FrontFacing, spv::StorageClass::Input); for (const auto& input : runtime_info.fs_info.inputs) { const u32 semantic = input.param_index; + ASSERT(semantic < IR::NumParams); if (input.is_default && !input.is_flat) { - input_params[semantic] = {MakeDefaultValue(*this, input.default_value), F32[1], - F32[1], 4, true}; + input_params[semantic] = { + MakeDefaultValue(*this, input.default_value), input_f32, F32[1], 4, false, true, + }; continue; } const IR::Attribute param{IR::Attribute::Param0 + input.param_index}; @@ -263,7 +296,8 @@ void EmitContext::DefineInputs() { Decorate(id, spv::Decoration::Flat); } Name(id, fmt::format("fs_in_attr{}", semantic)); - input_params[semantic] = {id, input_f32, F32[1], num_components}; + input_params[semantic] = + GetAttributeInfo(AmdGpu::NumberFormat::Float, id, num_components, false); interfaces.push_back(id); } break; @@ -272,6 +306,38 @@ void EmitContext::DefineInputs() { local_invocation_id = DefineVariable(U32[3], spv::BuiltIn::LocalInvocationId, spv::StorageClass::Input); break; + case Stage::Geometry: { + primitive_id = DefineVariable(U32[1], spv::BuiltIn::PrimitiveId, spv::StorageClass::Input); + const auto gl_per_vertex = + Name(TypeStruct(TypeVector(F32[1], 4), F32[1], TypeArray(F32[1], ConstU32(1u))), + "gl_PerVertex"); + MemberName(gl_per_vertex, 0, "gl_Position"); + MemberName(gl_per_vertex, 1, "gl_PointSize"); + MemberName(gl_per_vertex, 2, "gl_ClipDistance"); + MemberDecorate(gl_per_vertex, 0, spv::Decoration::BuiltIn, + static_cast(spv::BuiltIn::Position)); + MemberDecorate(gl_per_vertex, 1, spv::Decoration::BuiltIn, + static_cast(spv::BuiltIn::PointSize)); + MemberDecorate(gl_per_vertex, 2, spv::Decoration::BuiltIn, + static_cast(spv::BuiltIn::ClipDistance)); + Decorate(gl_per_vertex, spv::Decoration::Block); + const auto vertices_in = + TypeArray(gl_per_vertex, ConstU32(NumVertices(runtime_info.gs_info.out_primitive[0]))); + gl_in = Name(DefineVar(vertices_in, spv::StorageClass::Input), "gl_in"); + interfaces.push_back(gl_in); + + const auto num_params = runtime_info.gs_info.in_vertex_data_size / 4 - 1u; + for (int param_id = 0; param_id < num_params; ++param_id) { + const IR::Attribute param{IR::Attribute::Param0 + param_id}; + const Id type{ + TypeArray(F32[4], ConstU32(NumVertices(runtime_info.gs_info.out_primitive[0])))}; + const Id id{DefineInput(type, param_id)}; + Name(id, fmt::format("in_attr{}", param_id)); + input_params[param_id] = {id, input_f32, F32[1], 4}; + interfaces.push_back(id); + } + break; + } default: break; } @@ -279,6 +345,7 @@ void EmitContext::DefineInputs() { void EmitContext::DefineOutputs() { switch (stage) { + case Stage::Export: case Stage::Vertex: { output_position = DefineVariable(F32[4], spv::BuiltIn::Position, spv::StorageClass::Output); const bool has_extra_pos_stores = info.stores.Get(IR::Attribute::Position1) || @@ -299,7 +366,8 @@ void EmitContext::DefineOutputs() { const u32 num_components = info.stores.NumComponents(param); const Id id{DefineOutput(F32[num_components], i)}; Name(id, fmt::format("out_attr{}", i)); - output_params[i] = {id, output_f32, F32[1], num_components}; + output_params[i] = + GetAttributeInfo(AmdGpu::NumberFormat::Float, id, num_components, true); interfaces.push_back(id); } break; @@ -311,12 +379,26 @@ void EmitContext::DefineOutputs() { continue; } const u32 num_components = info.stores.NumComponents(mrt); - frag_color[i] = DefineOutput(F32[num_components], i); - frag_num_comp[i] = num_components; - Name(frag_color[i], fmt::format("frag_color{}", i)); - interfaces.push_back(frag_color[i]); + const AmdGpu::NumberFormat num_format{runtime_info.fs_info.color_buffers[i].num_format}; + const Id type{GetAttributeType(*this, num_format)[num_components]}; + const Id id{DefineOutput(type, i)}; + Name(id, fmt::format("frag_color{}", i)); + frag_outputs[i] = GetAttributeInfo(num_format, id, num_components, true); + interfaces.push_back(id); } break; + case Stage::Geometry: { + output_position = DefineVariable(F32[4], spv::BuiltIn::Position, spv::StorageClass::Output); + + for (u32 attr_id = 0; attr_id < runtime_info.gs_info.copy_data.num_attrs; attr_id++) { + const IR::Attribute param{IR::Attribute::Param0 + attr_id}; + const Id id{DefineOutput(F32[4], attr_id)}; + Name(id, fmt::format("out_attr{}", attr_id)); + output_params[attr_id] = {id, output_f32, F32[1], 4u}; + interfaces.push_back(id); + } + break; + } default: break; } @@ -324,18 +406,25 @@ void EmitContext::DefineOutputs() { void EmitContext::DefinePushDataBlock() { // Create push constants block for instance steps rates - const Id struct_type{Name(TypeStruct(U32[1], U32[1], U32[4], U32[4], U32[4]), "AuxData")}; + const Id struct_type{Name( + TypeStruct(U32[1], U32[1], U32[4], U32[4], U32[4], U32[4], U32[4], U32[4]), "AuxData")}; Decorate(struct_type, spv::Decoration::Block); MemberName(struct_type, 0, "sr0"); MemberName(struct_type, 1, "sr1"); MemberName(struct_type, 2, "buf_offsets0"); MemberName(struct_type, 3, "buf_offsets1"); - MemberName(struct_type, 4, "buf_offsets2"); + MemberName(struct_type, 4, "ud_regs0"); + MemberName(struct_type, 5, "ud_regs1"); + MemberName(struct_type, 6, "ud_regs2"); + MemberName(struct_type, 7, "ud_regs3"); MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U); MemberDecorate(struct_type, 1, spv::Decoration::Offset, 4U); MemberDecorate(struct_type, 2, spv::Decoration::Offset, 8U); MemberDecorate(struct_type, 3, spv::Decoration::Offset, 24U); MemberDecorate(struct_type, 4, spv::Decoration::Offset, 40U); + MemberDecorate(struct_type, 5, spv::Decoration::Offset, 56U); + MemberDecorate(struct_type, 6, spv::Decoration::Offset, 72U); + MemberDecorate(struct_type, 7, spv::Decoration::Offset, 88U); push_data_block = DefineVar(struct_type, spv::StorageClass::PushConstant); Name(push_data_block, "push_data"); interfaces.push_back(push_data_block); @@ -362,10 +451,11 @@ void EmitContext::DefineBuffers() { for (const auto& desc : info.buffers) { const auto sharp = desc.GetSharp(info); const bool is_storage = desc.IsStorage(sharp); + const u32 array_size = sharp.NumDwords() != 0 ? sharp.NumDwords() : MaxUboDwords; const auto* data_types = True(desc.used_types & IR::Type::F32) ? &F32 : &U32; const Id data_type = (*data_types)[1]; const Id record_array_type{is_storage ? TypeRuntimeArray(data_type) - : TypeArray(data_type, ConstU32(16384U))}; + : TypeArray(data_type, ConstU32(array_size))}; const Id struct_type{define_struct(record_array_type, desc.is_instance_data)}; const auto storage_class = @@ -373,7 +463,7 @@ void EmitContext::DefineBuffers() { const Id struct_pointer_type{TypePointer(storage_class, struct_type)}; const Id pointer_type = TypePointer(storage_class, data_type); const Id id{AddGlobalVariable(struct_pointer_type, storage_class)}; - Decorate(id, spv::Decoration::Binding, binding); + Decorate(id, spv::Decoration::Binding, binding.unified++); Decorate(id, spv::Decoration::DescriptorSet, 0U); if (is_storage && !desc.is_written) { Decorate(id, spv::Decoration::NonWritable); @@ -382,7 +472,7 @@ void EmitContext::DefineBuffers() { buffers.push_back({ .id = id, - .binding = binding++, + .binding = binding.buffer++, .data_types = data_types, .pointer_type = pointer_type, }); @@ -400,12 +490,12 @@ void EmitContext::DefineTextureBuffers() { sampled, spv::ImageFormat::Unknown)}; const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)}; const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)}; - Decorate(id, spv::Decoration::Binding, binding); + Decorate(id, spv::Decoration::Binding, binding.unified++); Decorate(id, spv::Decoration::DescriptorSet, 0U); Name(id, fmt::format("{}_{}", desc.is_written ? "imgbuf" : "texbuf", desc.sgpr_base)); texture_buffers.push_back({ .id = id, - .binding = binding++, + .binding = binding.buffer++, .image_type = image_type, .result_type = sampled_type[4], .is_integer = is_integer, @@ -506,7 +596,8 @@ Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) { case AmdGpu::ImageType::Color3D: return ctx.TypeImage(sampled_type, spv::Dim::Dim3D, false, false, false, sampled, format); case AmdGpu::ImageType::Cube: - return ctx.TypeImage(sampled_type, spv::Dim::Cube, false, false, false, sampled, format); + return ctx.TypeImage(sampled_type, spv::Dim::Cube, false, desc.is_array, false, sampled, + format); default: break; } @@ -515,12 +606,14 @@ Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) { void EmitContext::DefineImagesAndSamplers() { for (const auto& image_desc : info.images) { + const bool is_integer = image_desc.nfmt == AmdGpu::NumberFormat::Uint || + image_desc.nfmt == AmdGpu::NumberFormat::Sint; const VectorIds& data_types = GetAttributeType(*this, image_desc.nfmt); const Id sampled_type = data_types[1]; const Id image_type{ImageType(*this, image_desc, sampled_type)}; const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)}; const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)}; - Decorate(id, spv::Decoration::Binding, binding); + Decorate(id, spv::Decoration::Binding, binding.unified++); Decorate(id, spv::Decoration::DescriptorSet, 0U); Name(id, fmt::format("{}_{}{}_{:02x}", stage, "img", image_desc.sgpr_base, image_desc.dword_offset)); @@ -530,10 +623,10 @@ void EmitContext::DefineImagesAndSamplers() { .sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type), .pointer_type = pointer_type, .image_type = image_type, + .is_integer = is_integer, .is_storage = image_desc.is_storage, }); interfaces.push_back(id); - ++binding; } if (std::ranges::any_of(info.images, &ImageResource::is_atomic)) { image_u32 = TypePointer(spv::StorageClass::Image, U32[1]); @@ -545,13 +638,12 @@ void EmitContext::DefineImagesAndSamplers() { sampler_pointer_type = TypePointer(spv::StorageClass::UniformConstant, sampler_type); for (const auto& samp_desc : info.samplers) { const Id id{AddGlobalVariable(sampler_pointer_type, spv::StorageClass::UniformConstant)}; - Decorate(id, spv::Decoration::Binding, binding); + Decorate(id, spv::Decoration::Binding, binding.unified++); Decorate(id, spv::Decoration::DescriptorSet, 0U); Name(id, fmt::format("{}_{}{}_{:02x}", stage, "samp", samp_desc.sgpr_base, samp_desc.dword_offset)); samplers.push_back(id); interfaces.push_back(id); - ++binding; } } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 06faeb13a..147b4c845 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -6,6 +6,7 @@ #include #include +#include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/info.h" #include "shader_recompiler/ir/program.h" #include "shader_recompiler/profile.h" @@ -37,7 +38,7 @@ struct VectorIds { class EmitContext final : public Sirit::Module { public: explicit EmitContext(const Profile& profile, const RuntimeInfo& runtime_info, const Info& info, - u32& binding); + Bindings& binding); ~EmitContext(); Id Def(const IR::Value& value); @@ -165,10 +166,14 @@ public: Id input_s32{}; Id output_u32{}; Id output_f32{}; + Id output_s32{}; + + Id gl_in{}; boost::container::small_vector interfaces; Id output_position{}; + Id primitive_id{}; Id vertex_index{}; Id instance_id{}; Id push_data_block{}; @@ -176,8 +181,6 @@ public: Id frag_coord{}; Id front_facing{}; Id frag_depth{}; - std::array frag_color{}; - std::array frag_num_comp{}; Id clip_distances{}; Id cull_distances{}; @@ -200,7 +203,8 @@ public: Id sampled_type; Id pointer_type; Id image_type; - bool is_storage; + bool is_integer = false; + bool is_storage = false; }; struct BufferDefinition { @@ -217,11 +221,11 @@ public: u32 binding; Id image_type; Id result_type; - bool is_integer; - bool is_storage; + bool is_integer = false; + bool is_storage = false; }; - u32& binding; + Bindings& binding; boost::container::small_vector buffers; boost::container::small_vector texture_buffers; boost::container::small_vector images; @@ -235,11 +239,13 @@ public: Id pointer_type; Id component_type; u32 num_components; + bool is_integer{}; bool is_default{}; s32 buffer_handle{-1}; }; - std::array input_params{}; - std::array output_params{}; + std::array input_params{}; + std::array output_params{}; + std::array frag_outputs{}; private: void DefineArithmeticTypes(); @@ -252,7 +258,8 @@ private: void DefineImagesAndSamplers(); void DefineSharedMemory(); - SpirvAttribute GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id); + SpirvAttribute GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id, u32 num_components, + bool output); }; } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/frontend/control_flow_graph.cpp b/src/shader_recompiler/frontend/control_flow_graph.cpp index 03017762c..d6bfd288d 100644 --- a/src/shader_recompiler/frontend/control_flow_graph.cpp +++ b/src/shader_recompiler/frontend/control_flow_graph.cpp @@ -108,8 +108,7 @@ void CFG::EmitDivergenceLabels() { // Sometimes compiler might insert instructions between the SAVEEXEC and the branch. // Those instructions need to be wrapped in the condition as well so allow branch // as end scope instruction. - inst.opcode == Opcode::S_CBRANCH_EXECZ || - inst.opcode == Opcode::S_ENDPGM || + inst.opcode == Opcode::S_CBRANCH_EXECZ || inst.opcode == Opcode::S_ENDPGM || (inst.opcode == Opcode::S_ANDN2_B64 && inst.dst[0].field == OperandField::ExecLo); }; @@ -128,7 +127,7 @@ void CFG::EmitDivergenceLabels() { for (size_t index = GetIndex(start); index < end_index; index++) { const auto& inst = inst_list[index]; const bool is_close = is_close_scope(inst); - if (is_close && curr_begin != -1) { + if ((is_close || index == end_index - 1) && curr_begin != -1) { // If there are no instructions inside scope don't do anything. if (index - curr_begin == 1) { curr_begin = -1; @@ -140,12 +139,12 @@ void CFG::EmitDivergenceLabels() { const Label label = index_to_pc[curr_begin] + save_inst.length; AddLabel(label); // Add a label to the close scope instruction. - // There are 3 cases of when we need to close a scope. + // There are 3 cases where we need to close a scope. // * Close scope instruction inside the block - // * Close scope instruction at end of the block (cbranch of endpgm) - // * Normal instruction at end of block + // * Close scope instruction at the end of the block (cbranch or endpgm) + // * Normal instruction at the end of the block // For the last case we must NOT add a label as that would cause - // the last instruction to be separated into its own basic block + // the instruction to be separated into its own basic block. if (is_close) { AddLabel(index_to_pc[index]); } diff --git a/src/shader_recompiler/frontend/copy_shader.cpp b/src/shader_recompiler/frontend/copy_shader.cpp new file mode 100644 index 000000000..a194aec95 --- /dev/null +++ b/src/shader_recompiler/frontend/copy_shader.cpp @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/frontend/copy_shader.h" +#include "shader_recompiler/frontend/decode.h" +#include "shader_recompiler/ir/attribute.h" + +namespace Shader { + +CopyShaderData ParseCopyShader(const std::span& code) { + Gcn::GcnCodeSlice code_slice{code.data(), code.data() + code.size()}; + Gcn::GcnDecodeContext decoder; + + constexpr u32 token_mov_vcchi = 0xBEEB03FF; + ASSERT_MSG(code[0] == token_mov_vcchi, "First instruction is not s_mov_b32 vcc_hi, #imm"); + + std::array offsets{}; + std::fill(offsets.begin(), offsets.end(), -1); + + CopyShaderData data{}; + Gcn::OperandField sgpr{}; + auto last_attr{IR::Attribute::Position0}; + s32 soffset{0}; + while (!code_slice.atEnd()) { + auto inst = decoder.decodeInstruction(code_slice); + switch (inst.opcode) { + case Gcn::Opcode::S_MOVK_I32: { + sgpr = inst.dst[0].field; + soffset = inst.control.sopk.simm; + break; + } + case Gcn::Opcode::EXP: { + const auto& exp = inst.control.exp; + const IR::Attribute semantic = static_cast(exp.target); + for (int i = 0; i < inst.src_count; ++i) { + const auto ofs = offsets[inst.src[i].code]; + if (ofs != -1) { + data.attr_map[ofs] = {semantic, i}; + if (semantic > last_attr) { + last_attr = semantic; + } + } + } + break; + } + case Gcn::Opcode::BUFFER_LOAD_DWORD: { + offsets[inst.src[1].code] = inst.control.mubuf.offset; + if (inst.src[3].field != Gcn::OperandField::ConstZero) { + ASSERT(inst.src[3].field == sgpr); + offsets[inst.src[1].code] += soffset; + } + break; + } + default: + break; + } + } + + if (last_attr != IR::Attribute::Position0) { + data.num_attrs = static_cast(last_attr) - static_cast(IR::Attribute::Param0) + 1; + } + return data; +} + +} // namespace Shader diff --git a/src/shader_recompiler/frontend/copy_shader.h b/src/shader_recompiler/frontend/copy_shader.h new file mode 100644 index 000000000..ca3e1ac3e --- /dev/null +++ b/src/shader_recompiler/frontend/copy_shader.h @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "common/types.h" +#include "shader_recompiler/ir/attribute.h" + +namespace Shader { + +struct CopyShaderData { + std::unordered_map> attr_map; + u32 num_attrs{0}; +}; + +CopyShaderData ParseCopyShader(const std::span& code); + +} // namespace Shader diff --git a/src/shader_recompiler/frontend/decode.cpp b/src/shader_recompiler/frontend/decode.cpp index 4452b4fda..98f97dd12 100644 --- a/src/shader_recompiler/frontend/decode.cpp +++ b/src/shader_recompiler/frontend/decode.cpp @@ -162,6 +162,8 @@ uint32_t GcnDecodeContext::getEncodingLength(InstEncoding encoding) { case InstEncoding::EXP: instLength = sizeof(uint64_t); break; + default: + break; } return instLength; } @@ -217,6 +219,8 @@ uint32_t GcnDecodeContext::getOpMapOffset(InstEncoding encoding) { case InstEncoding::VOP2: offset = (uint32_t)OpcodeMap::OP_MAP_VOP2; break; + default: + break; } return offset; } @@ -309,8 +313,11 @@ void GcnDecodeContext::repairOperandType() { m_instruction.src[2].type = ScalarType::Uint64; break; case Opcode::IMAGE_GATHER4_C: + case Opcode::IMAGE_GATHER4_C_O: m_instruction.src[0].type = ScalarType::Any; break; + default: + break; } } @@ -363,6 +370,8 @@ void GcnDecodeContext::decodeInstruction32(InstEncoding encoding, GcnCodeSlice& case InstEncoding::VINTRP: decodeInstructionVINTRP(hexInstruction); break; + default: + break; } } @@ -387,6 +396,8 @@ void GcnDecodeContext::decodeInstruction64(InstEncoding encoding, GcnCodeSlice& case InstEncoding::EXP: decodeInstructionEXP(hexInstruction); break; + default: + break; } } @@ -493,9 +504,8 @@ void GcnDecodeContext::decodeInstructionVOP1(u32 hexInstruction) { OpcodeVOP1 vop1Op = static_cast(op); if (vop1Op == OpcodeVOP1::V_READFIRSTLANE_B32) { - m_instruction.dst[1].field = getOperandField(vdst); - m_instruction.dst[1].type = ScalarType::Uint32; - m_instruction.dst[1].code = vdst; + m_instruction.dst[0].field = getOperandField(vdst); + m_instruction.dst[0].type = ScalarType::Uint32; } } @@ -537,13 +547,15 @@ void GcnDecodeContext::decodeInstructionVOP2(u32 hexInstruction) { m_instruction.dst_count = 1; OpcodeVOP2 vop2Op = static_cast(op); - if (vop2Op == OpcodeVOP2::V_READLANE_B32 || vop2Op == OpcodeVOP2::V_WRITELANE_B32) { + if (vop2Op == OpcodeVOP2::V_READLANE_B32) { // vsrc1 is scalar for lane instructions m_instruction.src[1].field = getOperandField(vsrc1); // dst is sgpr - m_instruction.dst[1].field = OperandField::ScalarGPR; - m_instruction.dst[1].type = ScalarType::Uint32; - m_instruction.dst[1].code = vdst; + m_instruction.dst[0].field = getOperandField(vdst); + m_instruction.dst[0].type = ScalarType::Uint32; + } else if (vop2Op == OpcodeVOP2::V_WRITELANE_B32) { + m_instruction.src[1].field = getOperandField(vsrc1); + // dst is vgpr, as normal } else if (IsVop3BEncoding(m_instruction.opcode)) { m_instruction.dst[1].field = OperandField::VccLo; m_instruction.dst[1].type = ScalarType::Uint64; @@ -650,13 +662,11 @@ void GcnDecodeContext::decodeInstructionVOP3(uint64_t hexInstruction) { m_instruction.dst[1].field = getOperandField(vdst); m_instruction.dst[1].type = ScalarType::Uint64; m_instruction.dst[1].code = vdst; - } else if (vop3Op >= OpcodeVOP3::V_READLANE_B32 && vop3Op <= OpcodeVOP3::V_WRITELANE_B32) { - // vsrc1 is scalar for lane instructions - m_instruction.src[1].field = getOperandField(src1); - // dst is sgpr for lane instruction - m_instruction.dst[1].field = OperandField::ScalarGPR; - m_instruction.dst[1].type = ScalarType::Uint32; - m_instruction.dst[1].code = vdst; + } else if (vop3Op == OpcodeVOP3::V_READLANE_B32 || + vop3Op == OpcodeVOP3::V_READFIRSTLANE_B32) { + m_instruction.dst[0].field = getOperandField(vdst); + m_instruction.dst[0].type = ScalarType::Uint32; + // WRITELANE can be decoded like other VOP3's } } @@ -995,6 +1005,8 @@ u32 GcnDecodeContext::getMimgModifier(Opcode opcode) { flags.set(MimgModifier::Pcf, MimgModifier::CoarseDerivative, MimgModifier::LodClamp, MimgModifier::Offset); break; + default: + break; } return flags.raw(); @@ -1020,6 +1032,7 @@ void GcnDecodeContext::decodeInstructionMIMG(uint64_t hexInstruction) { m_instruction.control.mimg = *reinterpret_cast(&hexInstruction); m_instruction.control.mimg.mod = getMimgModifier(m_instruction.opcode); + ASSERT(m_instruction.control.mimg.r128 == 0); } void GcnDecodeContext::decodeInstructionDS(uint64_t hexInstruction) { diff --git a/src/shader_recompiler/frontend/format.cpp b/src/shader_recompiler/frontend/format.cpp index 34bd618cc..7b3ad00ba 100644 --- a/src/shader_recompiler/frontend/format.cpp +++ b/src/shader_recompiler/frontend/format.cpp @@ -3625,8 +3625,8 @@ constexpr std::array InstructionFormatMIMG = {{ {InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32, ScalarType::Float32}, // 88 = IMAGE_GATHER4_C_O - {InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined, - ScalarType::Undefined}, + {InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32, + ScalarType::Float32}, // 89 = IMAGE_GATHER4_C_CL_O {InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined, ScalarType::Undefined}, @@ -3718,8 +3718,9 @@ InstFormat InstructionFormat(InstEncoding encoding, uint32_t opcode) { return InstructionFormatSOP2[opcode]; case InstEncoding::VOP2: return InstructionFormatVOP2[opcode]; + default: + UNREACHABLE(); } - UNREACHABLE(); return {}; } diff --git a/src/shader_recompiler/frontend/opcodes.h b/src/shader_recompiler/frontend/opcodes.h index cdc1e4746..7390a3940 100644 --- a/src/shader_recompiler/frontend/opcodes.h +++ b/src/shader_recompiler/frontend/opcodes.h @@ -2491,4 +2491,23 @@ enum class ImageAddrComponent : u32 { Clamp, }; +struct SendMsgSimm { + enum class Message : u32 { + Interrupt = 1, + Gs = 2, + GsDone = 3, + System = 15, + }; + + enum class GsOp : u32 { + Nop = 0, + Cut = 1, + Emit = 2, + EmitCut = 3, + }; + + Message msg : 4; + GsOp op : 2; +}; + } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/data_share.cpp b/src/shader_recompiler/frontend/translate/data_share.cpp index d01c1977a..a453023fc 100644 --- a/src/shader_recompiler/frontend/translate/data_share.cpp +++ b/src/shader_recompiler/frontend/translate/data_share.cpp @@ -7,95 +7,113 @@ namespace Shader::Gcn { void Translator::EmitDataShare(const GcnInst& inst) { switch (inst.opcode) { - case Opcode::DS_SWIZZLE_B32: - return DS_SWIZZLE_B32(inst); - case Opcode::DS_READ_B32: - return DS_READ(32, false, false, inst); - case Opcode::DS_READ_B64: - return DS_READ(64, false, false, inst); - case Opcode::DS_READ2_B32: - return DS_READ(32, false, true, inst); - case Opcode::DS_READ2_B64: - return DS_READ(64, false, true, inst); - case Opcode::DS_WRITE_B32: - return DS_WRITE(32, false, false, false, inst); - case Opcode::DS_WRITE2ST64_B32: - return DS_WRITE(32, false, true, true, inst); - case Opcode::DS_WRITE_B64: - return DS_WRITE(64, false, false, false, inst); - case Opcode::DS_WRITE2_B32: - return DS_WRITE(32, false, true, false, inst); - case Opcode::DS_WRITE2_B64: - return DS_WRITE(64, false, true, false, inst); + // DS case Opcode::DS_ADD_U32: return DS_ADD_U32(inst, false); - case Opcode::DS_MIN_U32: - return DS_MIN_U32(inst, false, false); case Opcode::DS_MIN_I32: return DS_MIN_U32(inst, true, false); - case Opcode::DS_MAX_U32: - return DS_MAX_U32(inst, false, false); case Opcode::DS_MAX_I32: return DS_MAX_U32(inst, true, false); + case Opcode::DS_MIN_U32: + return DS_MIN_U32(inst, false, false); + case Opcode::DS_MAX_U32: + return DS_MAX_U32(inst, false, false); + case Opcode::DS_WRITE_B32: + return DS_WRITE(32, false, false, false, inst); + case Opcode::DS_WRITE2_B32: + return DS_WRITE(32, false, true, false, inst); + case Opcode::DS_WRITE2ST64_B32: + return DS_WRITE(32, false, true, true, inst); case Opcode::DS_ADD_RTN_U32: return DS_ADD_U32(inst, true); case Opcode::DS_MIN_RTN_U32: return DS_MIN_U32(inst, false, true); case Opcode::DS_MAX_RTN_U32: return DS_MAX_U32(inst, false, true); - case Opcode::DS_APPEND: - return DS_APPEND(inst); + case Opcode::DS_SWIZZLE_B32: + return DS_SWIZZLE_B32(inst); + case Opcode::DS_READ_B32: + return DS_READ(32, false, false, false, inst); + case Opcode::DS_READ2_B32: + return DS_READ(32, false, true, false, inst); + case Opcode::DS_READ2ST64_B32: + return DS_READ(32, false, true, true, inst); case Opcode::DS_CONSUME: return DS_CONSUME(inst); + case Opcode::DS_APPEND: + return DS_APPEND(inst); + case Opcode::DS_WRITE_B64: + return DS_WRITE(64, false, false, false, inst); + case Opcode::DS_WRITE2_B64: + return DS_WRITE(64, false, true, false, inst); + case Opcode::DS_READ_B64: + return DS_READ(64, false, false, false, inst); + case Opcode::DS_READ2_B64: + return DS_READ(64, false, true, false, inst); default: LogMissingOpcode(inst); } } -void Translator::DS_SWIZZLE_B32(const GcnInst& inst) { - const u8 offset0 = inst.control.ds.offset0; - const u8 offset1 = inst.control.ds.offset1; - const IR::U32 src{GetSrc(inst.src[1])}; - ASSERT(offset1 & 0x80); - const IR::U32 lane_id = ir.LaneId(); - const IR::U32 id_in_group = ir.BitwiseAnd(lane_id, ir.Imm32(0b11)); - const IR::U32 base = ir.ShiftLeftLogical(id_in_group, ir.Imm32(1)); - const IR::U32 index = - ir.IAdd(lane_id, ir.BitFieldExtract(ir.Imm32(offset0), base, ir.Imm32(2))); - SetDst(inst.dst[0], ir.QuadShuffle(src, index)); +// VOP2 + +void Translator::V_READFIRSTLANE_B32(const GcnInst& inst) { + const IR::U32 value{GetSrc(inst.src[0])}; + + if (info.stage != Stage::Compute) { + SetDst(inst.dst[0], value); + } else { + SetDst(inst.dst[0], ir.ReadFirstLane(value)); + } } -void Translator::DS_READ(int bit_size, bool is_signed, bool is_pair, const GcnInst& inst) { - const IR::U32 addr{ir.GetVectorReg(IR::VectorReg(inst.src[0].code))}; - IR::VectorReg dst_reg{inst.dst[0].code}; - if (is_pair) { - // Pair loads are either 32 or 64-bit - const u32 adj = bit_size == 32 ? 4 : 8; - const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0 * adj))); - const IR::Value data0 = ir.LoadShared(bit_size, is_signed, addr0); - if (bit_size == 32) { - ir.SetVectorReg(dst_reg++, IR::U32{data0}); - } else { - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data0, 0)}); - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data0, 1)}); - } - const IR::U32 addr1 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset1 * adj))); - const IR::Value data1 = ir.LoadShared(bit_size, is_signed, addr1); - if (bit_size == 32) { - ir.SetVectorReg(dst_reg++, IR::U32{data1}); - } else { - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data1, 0)}); - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data1, 1)}); - } - } else if (bit_size == 64) { - const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0))); - const IR::Value data = ir.LoadShared(bit_size, is_signed, addr0); - ir.SetVectorReg(dst_reg, IR::U32{ir.CompositeExtract(data, 0)}); - ir.SetVectorReg(dst_reg + 1, IR::U32{ir.CompositeExtract(data, 1)}); - } else { - const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0))); - const IR::U32 data = IR::U32{ir.LoadShared(bit_size, is_signed, addr0)}; - ir.SetVectorReg(dst_reg, data); +void Translator::V_READLANE_B32(const GcnInst& inst) { + const IR::ScalarReg dst{inst.dst[0].code}; + const IR::U32 value{GetSrc(inst.src[0])}; + const IR::U32 lane{GetSrc(inst.src[1])}; + ir.SetScalarReg(dst, ir.ReadLane(value, lane)); +} + +void Translator::V_WRITELANE_B32(const GcnInst& inst) { + const IR::VectorReg dst{inst.dst[0].code}; + const IR::U32 value{GetSrc(inst.src[0])}; + const IR::U32 lane{GetSrc(inst.src[1])}; + const IR::U32 old_value{GetSrc(inst.dst[0])}; + ir.SetVectorReg(dst, ir.WriteLane(old_value, value, lane)); +} + +// DS + +void Translator::DS_ADD_U32(const GcnInst& inst, bool rtn) { + const IR::U32 addr{GetSrc(inst.src[0])}; + const IR::U32 data{GetSrc(inst.src[1])}; + const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); + const IR::U32 addr_offset = ir.IAdd(addr, offset); + const IR::Value original_val = ir.SharedAtomicIAdd(addr_offset, data); + if (rtn) { + SetDst(inst.dst[0], IR::U32{original_val}); + } +} + +void Translator::DS_MIN_U32(const GcnInst& inst, bool is_signed, bool rtn) { + const IR::U32 addr{GetSrc(inst.src[0])}; + const IR::U32 data{GetSrc(inst.src[1])}; + const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); + const IR::U32 addr_offset = ir.IAdd(addr, offset); + const IR::Value original_val = ir.SharedAtomicIMin(addr_offset, data, is_signed); + if (rtn) { + SetDst(inst.dst[0], IR::U32{original_val}); + } +} + +void Translator::DS_MAX_U32(const GcnInst& inst, bool is_signed, bool rtn) { + const IR::U32 addr{GetSrc(inst.src[0])}; + const IR::U32 data{GetSrc(inst.src[1])}; + const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); + const IR::U32 addr_offset = ir.IAdd(addr, offset); + const IR::Value original_val = ir.SharedAtomicIMax(addr_offset, data, is_signed); + if (rtn) { + SetDst(inst.dst[0], IR::U32{original_val}); } } @@ -133,69 +151,54 @@ void Translator::DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool strid } } -void Translator::DS_ADD_U32(const GcnInst& inst, bool rtn) { - const IR::U32 addr{GetSrc(inst.src[0])}; - const IR::U32 data{GetSrc(inst.src[1])}; - const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); - const IR::U32 addr_offset = ir.IAdd(addr, offset); - const IR::Value original_val = ir.SharedAtomicIAdd(addr_offset, data); - if (rtn) { - SetDst(inst.dst[0], IR::U32{original_val}); - } +void Translator::DS_SWIZZLE_B32(const GcnInst& inst) { + const u8 offset0 = inst.control.ds.offset0; + const u8 offset1 = inst.control.ds.offset1; + const IR::U32 src{GetSrc(inst.src[1])}; + ASSERT(offset1 & 0x80); + const IR::U32 lane_id = ir.LaneId(); + const IR::U32 id_in_group = ir.BitwiseAnd(lane_id, ir.Imm32(0b11)); + const IR::U32 base = ir.ShiftLeftLogical(id_in_group, ir.Imm32(1)); + const IR::U32 index = + ir.IAdd(lane_id, ir.BitFieldExtract(ir.Imm32(offset0), base, ir.Imm32(2))); + SetDst(inst.dst[0], ir.QuadShuffle(src, index)); } -void Translator::DS_MIN_U32(const GcnInst& inst, bool is_signed, bool rtn) { - const IR::U32 addr{GetSrc(inst.src[0])}; - const IR::U32 data{GetSrc(inst.src[1])}; - const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); - const IR::U32 addr_offset = ir.IAdd(addr, offset); - const IR::Value original_val = ir.SharedAtomicIMin(addr_offset, data, is_signed); - if (rtn) { - SetDst(inst.dst[0], IR::U32{original_val}); - } -} - -void Translator::DS_MAX_U32(const GcnInst& inst, bool is_signed, bool rtn) { - const IR::U32 addr{GetSrc(inst.src[0])}; - const IR::U32 data{GetSrc(inst.src[1])}; - const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); - const IR::U32 addr_offset = ir.IAdd(addr, offset); - const IR::Value original_val = ir.SharedAtomicIMax(addr_offset, data, is_signed); - if (rtn) { - SetDst(inst.dst[0], IR::U32{original_val}); - } -} - -void Translator::S_BARRIER() { - ir.Barrier(); -} - -void Translator::V_READFIRSTLANE_B32(const GcnInst& inst) { - const IR::ScalarReg dst{inst.dst[0].code}; - const IR::U32 value{GetSrc(inst.src[0])}; - - if (info.stage != Stage::Compute) { - SetDst(inst.dst[0], value); +void Translator::DS_READ(int bit_size, bool is_signed, bool is_pair, bool stride64, + const GcnInst& inst) { + const IR::U32 addr{ir.GetVectorReg(IR::VectorReg(inst.src[0].code))}; + IR::VectorReg dst_reg{inst.dst[0].code}; + if (is_pair) { + // Pair loads are either 32 or 64-bit + const u32 adj = (bit_size == 32 ? 4 : 8) * (stride64 ? 64 : 1); + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0 * adj))); + const IR::Value data0 = ir.LoadShared(bit_size, is_signed, addr0); + if (bit_size == 32) { + ir.SetVectorReg(dst_reg++, IR::U32{data0}); + } else { + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data0, 0)}); + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data0, 1)}); + } + const IR::U32 addr1 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset1 * adj))); + const IR::Value data1 = ir.LoadShared(bit_size, is_signed, addr1); + if (bit_size == 32) { + ir.SetVectorReg(dst_reg++, IR::U32{data1}); + } else { + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data1, 0)}); + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data1, 1)}); + } + } else if (bit_size == 64) { + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0))); + const IR::Value data = ir.LoadShared(bit_size, is_signed, addr0); + ir.SetVectorReg(dst_reg, IR::U32{ir.CompositeExtract(data, 0)}); + ir.SetVectorReg(dst_reg + 1, IR::U32{ir.CompositeExtract(data, 1)}); } else { - SetDst(inst.dst[0], ir.ReadFirstLane(value)); + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0))); + const IR::U32 data = IR::U32{ir.LoadShared(bit_size, is_signed, addr0)}; + ir.SetVectorReg(dst_reg, data); } } -void Translator::V_READLANE_B32(const GcnInst& inst) { - const IR::ScalarReg dst{inst.dst[0].code}; - const IR::U32 value{GetSrc(inst.src[0])}; - const IR::U32 lane{GetSrc(inst.src[1])}; - ir.SetScalarReg(dst, ir.ReadLane(value, lane)); -} - -void Translator::V_WRITELANE_B32(const GcnInst& inst) { - const IR::VectorReg dst{inst.dst[0].code}; - const IR::U32 value{GetSrc(inst.src[0])}; - const IR::U32 lane{GetSrc(inst.src[1])}; - const IR::U32 old_value{GetSrc(inst.dst[0])}; - ir.SetVectorReg(dst, ir.WriteLane(old_value, value, lane)); -} - void Translator::DS_APPEND(const GcnInst& inst) { const u32 inst_offset = inst.control.ds.offset0; const IR::U32 gds_offset = ir.IAdd(ir.GetM0(), ir.Imm32(inst_offset)); diff --git a/src/shader_recompiler/frontend/translate/export.cpp b/src/shader_recompiler/frontend/translate/export.cpp index 18e830f7b..f82f8fc1b 100644 --- a/src/shader_recompiler/frontend/translate/export.cpp +++ b/src/shader_recompiler/frontend/translate/export.cpp @@ -25,7 +25,7 @@ void Translator::EmitExport(const GcnInst& inst) { return comp; } const u32 index = u32(attrib) - u32(IR::Attribute::RenderTarget0); - switch (runtime_info.fs_info.mrt_swizzles[index]) { + switch (runtime_info.fs_info.color_buffers[index].mrt_swizzle) { case MrtSwizzle::Identity: return comp; case MrtSwizzle::Alt: @@ -71,6 +71,9 @@ void Translator::EmitExport(const GcnInst& inst) { ir.SetAttribute(attrib, comp, swizzle(i)); } } + if (IR::IsMrt(attrib)) { + info.mrt_mask |= 1u << u8(attrib); + } } } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index 5b194db88..36c1ec85f 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -17,75 +17,83 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { } default: switch (inst.opcode) { - case Opcode::S_MOV_B32: - return S_MOV(inst); - case Opcode::S_MUL_I32: - return S_MUL_I32(inst); - case Opcode::S_AND_SAVEEXEC_B64: - return S_AND_SAVEEXEC_B64(inst); - case Opcode::S_MOV_B64: - return S_MOV_B64(inst); - case Opcode::S_OR_B64: - return S_OR_B64(NegateMode::None, false, inst); - case Opcode::S_NOR_B64: - return S_OR_B64(NegateMode::Result, false, inst); - case Opcode::S_XOR_B64: - return S_OR_B64(NegateMode::None, true, inst); - case Opcode::S_XNOR_B64: - return S_OR_B64(NegateMode::Result, true, inst); - case Opcode::S_ORN2_B64: - return S_OR_B64(NegateMode::Src1, false, inst); - case Opcode::S_AND_B64: - return S_AND_B64(NegateMode::None, inst); - case Opcode::S_NAND_B64: - return S_AND_B64(NegateMode::Result, inst); - case Opcode::S_ANDN2_B64: - return S_AND_B64(NegateMode::Src1, inst); - case Opcode::S_NOT_B64: - return S_NOT_B64(inst); + // SOP2 + case Opcode::S_ADD_U32: + return S_ADD_U32(inst); + case Opcode::S_SUB_U32: + return S_SUB_U32(inst); case Opcode::S_ADD_I32: return S_ADD_I32(inst); - case Opcode::S_AND_B32: - return S_AND_B32(NegateMode::None, inst); - case Opcode::S_NAND_B32: - return S_AND_B32(NegateMode::Result, inst); - case Opcode::S_ANDN2_B32: - return S_AND_B32(NegateMode::Src1, inst); - case Opcode::S_ASHR_I32: - return S_ASHR_I32(inst); - case Opcode::S_OR_B32: - return S_OR_B32(inst); - case Opcode::S_LSHL_B32: - return S_LSHL_B32(inst); - case Opcode::S_LSHR_B32: - return S_LSHR_B32(inst); + case Opcode::S_SUB_I32: + return S_SUB_U32(inst); + case Opcode::S_ADDC_U32: + return S_ADDC_U32(inst); + case Opcode::S_MIN_I32: + return S_MIN_U32(true, inst); + case Opcode::S_MIN_U32: + return S_MIN_U32(false, inst); + case Opcode::S_MAX_I32: + return S_MAX_U32(true, inst); + case Opcode::S_MAX_U32: + return S_MAX_U32(false, inst); case Opcode::S_CSELECT_B32: return S_CSELECT_B32(inst); case Opcode::S_CSELECT_B64: return S_CSELECT_B64(inst); - case Opcode::S_BFE_U32: - return S_BFE_U32(inst); + case Opcode::S_AND_B32: + return S_AND_B32(NegateMode::None, inst); + case Opcode::S_AND_B64: + return S_AND_B64(NegateMode::None, inst); + case Opcode::S_OR_B32: + return S_OR_B32(inst); + case Opcode::S_OR_B64: + return S_OR_B64(NegateMode::None, false, inst); + case Opcode::S_XOR_B32: + return S_XOR_B32(inst); + case Opcode::S_XOR_B64: + return S_OR_B64(NegateMode::None, true, inst); + case Opcode::S_ANDN2_B32: + return S_AND_B32(NegateMode::Src1, inst); + case Opcode::S_ANDN2_B64: + return S_AND_B64(NegateMode::Src1, inst); + case Opcode::S_ORN2_B64: + return S_OR_B64(NegateMode::Src1, false, inst); + case Opcode::S_NAND_B32: + return S_AND_B32(NegateMode::Result, inst); + case Opcode::S_NAND_B64: + return S_AND_B64(NegateMode::Result, inst); + case Opcode::S_NOR_B64: + return S_OR_B64(NegateMode::Result, false, inst); + case Opcode::S_XNOR_B64: + return S_OR_B64(NegateMode::Result, true, inst); + case Opcode::S_LSHL_B32: + return S_LSHL_B32(inst); + case Opcode::S_LSHR_B32: + return S_LSHR_B32(inst); + case Opcode::S_ASHR_I32: + return S_ASHR_I32(inst); case Opcode::S_BFM_B32: return S_BFM_B32(inst); - case Opcode::S_BREV_B32: - return S_BREV_B32(inst); - case Opcode::S_ADD_U32: - return S_ADD_U32(inst); - case Opcode::S_ADDC_U32: - return S_ADDC_U32(inst); - case Opcode::S_SUB_U32: - case Opcode::S_SUB_I32: - return S_SUB_U32(inst); - case Opcode::S_MIN_U32: - return S_MIN_U32(false, inst); - case Opcode::S_MIN_I32: - return S_MIN_U32(true, inst); - case Opcode::S_MAX_U32: - return S_MAX_U32(false, inst); - case Opcode::S_MAX_I32: - return S_MAX_U32(true, inst); + case Opcode::S_MUL_I32: + return S_MUL_I32(inst); + case Opcode::S_BFE_U32: + return S_BFE_U32(inst); + case Opcode::S_ABSDIFF_I32: + return S_ABSDIFF_I32(inst); + + // SOP1 + case Opcode::S_MOV_B32: + return S_MOV(inst); + case Opcode::S_MOV_B64: + return S_MOV_B64(inst); + case Opcode::S_NOT_B64: + return S_NOT_B64(inst); case Opcode::S_WQM_B64: break; + case Opcode::S_BREV_B32: + return S_BREV_B32(inst); + case Opcode::S_AND_SAVEEXEC_B64: + return S_AND_SAVEEXEC_B64(inst); default: LogMissingOpcode(inst); } @@ -127,6 +135,7 @@ void Translator::EmitSOPC(const GcnInst& inst) { void Translator::EmitSOPK(const GcnInst& inst) { switch (inst.opcode) { + // SOPK case Opcode::S_MOVK_I32: return S_MOVK(inst); @@ -165,217 +174,22 @@ void Translator::EmitSOPK(const GcnInst& inst) { } } -void Translator::S_MOVK(const GcnInst& inst) { - const auto simm16 = inst.control.sopk.simm; - if (simm16 & (1 << 15)) { - // TODO: need to verify the case of imm sign extension - UNREACHABLE(); - } - SetDst(inst.dst[0], ir.Imm32(simm16)); +// SOP2 + +void Translator::S_ADD_U32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.IAdd(src0, src1)); + // TODO: Carry out + ir.SetScc(ir.Imm1(false)); } -void Translator::S_ADDK_I32(const GcnInst& inst) { - const s32 simm16 = inst.control.sopk.simm; - SetDst(inst.dst[0], ir.IAdd(GetSrc(inst.dst[0]), ir.Imm32(simm16))); -} - -void Translator::S_MULK_I32(const GcnInst& inst) { - const s32 simm16 = inst.control.sopk.simm; - SetDst(inst.dst[0], ir.IMul(GetSrc(inst.dst[0]), ir.Imm32(simm16))); -} - -void Translator::S_MOV(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[0])); -} - -void Translator::S_MUL_I32(const GcnInst& inst) { - SetDst(inst.dst[0], ir.IMul(GetSrc(inst.src[0]), GetSrc(inst.src[1]))); -} - -void Translator::S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst) { - const IR::U32 lhs = GetSrc(inst.src[0]); - const IR::U32 rhs = GetSrc(inst.src[1]); - const IR::U1 result = [&] { - switch (cond) { - case ConditionOp::EQ: - return ir.IEqual(lhs, rhs); - case ConditionOp::LG: - return ir.INotEqual(lhs, rhs); - case ConditionOp::GT: - return ir.IGreaterThan(lhs, rhs, is_signed); - case ConditionOp::GE: - return ir.IGreaterThanEqual(lhs, rhs, is_signed); - case ConditionOp::LT: - return ir.ILessThan(lhs, rhs, is_signed); - case ConditionOp::LE: - return ir.ILessThanEqual(lhs, rhs, is_signed); - default: - UNREACHABLE(); - } - }(); - ir.SetScc(result); -} - -void Translator::S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst) { - const s32 simm16 = inst.control.sopk.simm; - const IR::U32 lhs = GetSrc(inst.dst[0]); - const IR::U32 rhs = ir.Imm32(simm16); - const IR::U1 result = [&] { - switch (cond) { - case ConditionOp::EQ: - return ir.IEqual(lhs, rhs); - case ConditionOp::LG: - return ir.INotEqual(lhs, rhs); - case ConditionOp::GT: - return ir.IGreaterThan(lhs, rhs, is_signed); - case ConditionOp::GE: - return ir.IGreaterThanEqual(lhs, rhs, is_signed); - case ConditionOp::LT: - return ir.ILessThan(lhs, rhs, is_signed); - case ConditionOp::LE: - return ir.ILessThanEqual(lhs, rhs, is_signed); - default: - UNREACHABLE(); - } - }(); - ir.SetScc(result); -} - -void Translator::S_AND_SAVEEXEC_B64(const GcnInst& inst) { - // This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs) - // However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination - // SGPR we have a special IR opcode for SPGRs that act as thread masks. - const IR::U1 exec{ir.GetExec()}; - const IR::U1 src = [&] { - switch (inst.src[0].field) { - case OperandField::VccLo: - return ir.GetVcc(); - case OperandField::ScalarGPR: - return ir.GetThreadBitScalarReg(IR::ScalarReg(inst.src[0].code)); - default: - UNREACHABLE(); - } - }(); - - switch (inst.dst[0].field) { - case OperandField::ScalarGPR: - ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), exec); - break; - case OperandField::VccLo: - ir.SetVcc(exec); - break; - default: - UNREACHABLE(); - } - - // Update EXEC. - const IR::U1 result = ir.LogicalAnd(exec, src); - ir.SetExec(result); - ir.SetScc(result); -} - -void Translator::S_MOV_B64(const GcnInst& inst) { - const IR::U1 src = [&] { - switch (inst.src[0].field) { - case OperandField::VccLo: - return ir.GetVcc(); - case OperandField::ExecLo: - return ir.GetExec(); - case OperandField::ScalarGPR: - return ir.GetThreadBitScalarReg(IR::ScalarReg(inst.src[0].code)); - case OperandField::ConstZero: - return ir.Imm1(false); - default: - UNREACHABLE(); - } - }(); - switch (inst.dst[0].field) { - case OperandField::ScalarGPR: - ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), src); - break; - case OperandField::ExecLo: - ir.SetExec(src); - break; - case OperandField::VccLo: - ir.SetVcc(src); - break; - default: - UNREACHABLE(); - } -} - -void Translator::S_OR_B64(NegateMode negate, bool is_xor, const GcnInst& inst) { - const auto get_src = [&](const InstOperand& operand) { - switch (operand.field) { - case OperandField::ExecLo: - return ir.GetExec(); - case OperandField::VccLo: - return ir.GetVcc(); - case OperandField::ScalarGPR: - return ir.GetThreadBitScalarReg(IR::ScalarReg(operand.code)); - default: - UNREACHABLE(); - } - }; - - const IR::U1 src0{get_src(inst.src[0])}; - IR::U1 src1{get_src(inst.src[1])}; - if (negate == NegateMode::Src1) { - src1 = ir.LogicalNot(src1); - } - IR::U1 result = is_xor ? ir.LogicalXor(src0, src1) : ir.LogicalOr(src0, src1); - if (negate == NegateMode::Result) { - result = ir.LogicalNot(result); - } - ir.SetScc(result); - switch (inst.dst[0].field) { - case OperandField::VccLo: - ir.SetVcc(result); - break; - case OperandField::ScalarGPR: - ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), result); - break; - default: - UNREACHABLE(); - } -} - -void Translator::S_AND_B64(NegateMode negate, const GcnInst& inst) { - const auto get_src = [&](const InstOperand& operand) { - switch (operand.field) { - case OperandField::VccLo: - return ir.GetVcc(); - case OperandField::ExecLo: - return ir.GetExec(); - case OperandField::ScalarGPR: - return ir.GetThreadBitScalarReg(IR::ScalarReg(operand.code)); - default: - UNREACHABLE(); - } - }; - const IR::U1 src0{get_src(inst.src[0])}; - IR::U1 src1{get_src(inst.src[1])}; - if (negate == NegateMode::Src1) { - src1 = ir.LogicalNot(src1); - } - IR::U1 result = ir.LogicalAnd(src0, src1); - if (negate == NegateMode::Result) { - result = ir.LogicalNot(result); - } - ir.SetScc(result); - switch (inst.dst[0].field) { - case OperandField::VccLo: - ir.SetVcc(result); - break; - case OperandField::ScalarGPR: - ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), result); - break; - case OperandField::ExecLo: - ir.SetExec(result); - break; - default: - UNREACHABLE(); - } +void Translator::S_SUB_U32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ISub(src0, src1)); + // TODO: Carry out + ir.SetScc(ir.Imm1(false)); } void Translator::S_ADD_I32(const GcnInst& inst) { @@ -385,42 +199,27 @@ void Translator::S_ADD_I32(const GcnInst& inst) { // TODO: Overflow flag } -void Translator::S_AND_B32(NegateMode negate, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - IR::U32 src1{GetSrc(inst.src[1])}; - if (negate == NegateMode::Src1) { - src1 = ir.BitwiseNot(src1); - } - IR::U32 result{ir.BitwiseAnd(src0, src1)}; - if (negate == NegateMode::Result) { - result = ir.BitwiseNot(result); - } - SetDst(inst.dst[0], result); - ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); -} - -void Translator::S_ASHR_I32(const GcnInst& inst) { +void Translator::S_ADDC_U32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.ShiftRightArithmetic(src0, src1)}; - SetDst(inst.dst[0], result); - ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); + const IR::U32 carry{ir.Select(ir.GetScc(), ir.Imm32(1U), ir.Imm32(0U))}; + SetDst(inst.dst[0], ir.IAdd(ir.IAdd(src0, src1), carry)); } -void Translator::S_OR_B32(const GcnInst& inst) { +void Translator::S_MIN_U32(bool is_signed, const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.BitwiseOr(src0, src1)}; + const IR::U32 result = ir.IMin(src0, src1, is_signed); SetDst(inst.dst[0], result); - ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); + ir.SetScc(ir.IEqual(result, src0)); } -void Translator::S_LSHR_B32(const GcnInst& inst) { +void Translator::S_MAX_U32(bool is_signed, const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.ShiftRightLogical(src0, src1)}; + const IR::U32 result = ir.IMax(src0, src1, is_signed); SetDst(inst.dst[0], result); - ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); + ir.SetScc(ir.IEqual(result, src0)); } void Translator::S_CSELECT_B32(const GcnInst& inst) { @@ -459,12 +258,112 @@ void Translator::S_CSELECT_B64(const GcnInst& inst) { } } -void Translator::S_BFE_U32(const GcnInst& inst) { +void Translator::S_AND_B32(NegateMode negate, const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + IR::U32 src1{GetSrc(inst.src[1])}; + if (negate == NegateMode::Src1) { + src1 = ir.BitwiseNot(src1); + } + IR::U32 result{ir.BitwiseAnd(src0, src1)}; + if (negate == NegateMode::Result) { + result = ir.BitwiseNot(result); + } + SetDst(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); +} + +void Translator::S_AND_B64(NegateMode negate, const GcnInst& inst) { + const auto get_src = [&](const InstOperand& operand) { + switch (operand.field) { + case OperandField::VccLo: + return ir.GetVcc(); + case OperandField::ExecLo: + return ir.GetExec(); + case OperandField::ScalarGPR: + return ir.GetThreadBitScalarReg(IR::ScalarReg(operand.code)); + case OperandField::ConstZero: + return ir.Imm1(false); + case OperandField::SignedConstIntNeg: + ASSERT_MSG(-s32(operand.code) + SignedConstIntNegMin - 1 == -1, + "SignedConstIntNeg must be -1"); + return ir.Imm1(true); + default: + UNREACHABLE(); + } + }; + const IR::U1 src0{get_src(inst.src[0])}; + IR::U1 src1{get_src(inst.src[1])}; + if (negate == NegateMode::Src1) { + src1 = ir.LogicalNot(src1); + } + IR::U1 result = ir.LogicalAnd(src0, src1); + if (negate == NegateMode::Result) { + result = ir.LogicalNot(result); + } + ir.SetScc(result); + switch (inst.dst[0].field) { + case OperandField::VccLo: + ir.SetVcc(result); + break; + case OperandField::ScalarGPR: + ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), result); + break; + case OperandField::ExecLo: + ir.SetExec(result); + break; + default: + UNREACHABLE(); + } +} + +void Translator::S_OR_B32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 offset{ir.BitwiseAnd(src1, ir.Imm32(0x1F))}; - const IR::U32 count{ir.BitFieldExtract(src1, ir.Imm32(16), ir.Imm32(7))}; - const IR::U32 result{ir.BitFieldExtract(src0, offset, count)}; + const IR::U32 result{ir.BitwiseOr(src0, src1)}; + SetDst(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); +} + +void Translator::S_OR_B64(NegateMode negate, bool is_xor, const GcnInst& inst) { + const auto get_src = [&](const InstOperand& operand) { + switch (operand.field) { + case OperandField::ExecLo: + return ir.GetExec(); + case OperandField::VccLo: + return ir.GetVcc(); + case OperandField::ScalarGPR: + return ir.GetThreadBitScalarReg(IR::ScalarReg(operand.code)); + default: + UNREACHABLE(); + } + }; + + const IR::U1 src0{get_src(inst.src[0])}; + IR::U1 src1{get_src(inst.src[1])}; + if (negate == NegateMode::Src1) { + src1 = ir.LogicalNot(src1); + } + IR::U1 result = is_xor ? ir.LogicalXor(src0, src1) : ir.LogicalOr(src0, src1); + if (negate == NegateMode::Result) { + result = ir.LogicalNot(result); + } + ir.SetScc(result); + switch (inst.dst[0].field) { + case OperandField::VccLo: + ir.SetVcc(result); + break; + case OperandField::ScalarGPR: + ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), result); + break; + default: + UNREACHABLE(); + } +} + +void Translator::S_XOR_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 result{ir.BitwiseXor(src0, src1)}; SetDst(inst.dst[0], result); ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } @@ -477,6 +376,22 @@ void Translator::S_LSHL_B32(const GcnInst& inst) { ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } +void Translator::S_LSHR_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 result{ir.ShiftRightLogical(src0, src1)}; + SetDst(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); +} + +void Translator::S_ASHR_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 result{ir.ShiftRightArithmetic(src0, src1)}; + SetDst(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); +} + void Translator::S_BFM_B32(const GcnInst& inst) { const IR::U32 src0{ir.BitwiseAnd(GetSrc(inst.src[0]), ir.Imm32(0x1F))}; const IR::U32 src1{ir.BitwiseAnd(GetSrc(inst.src[1]), ir.Imm32(0x1F))}; @@ -484,6 +399,110 @@ void Translator::S_BFM_B32(const GcnInst& inst) { SetDst(inst.dst[0], ir.ShiftLeftLogical(mask, src1)); } +void Translator::S_MUL_I32(const GcnInst& inst) { + SetDst(inst.dst[0], ir.IMul(GetSrc(inst.src[0]), GetSrc(inst.src[1]))); +} + +void Translator::S_BFE_U32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 offset{ir.BitwiseAnd(src1, ir.Imm32(0x1F))}; + const IR::U32 count{ir.BitFieldExtract(src1, ir.Imm32(16), ir.Imm32(7))}; + const IR::U32 result{ir.BitFieldExtract(src0, offset, count)}; + SetDst(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); +} + +void Translator::S_ABSDIFF_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 result{ir.IAbs(ir.ISub(src0, src1))}; + SetDst(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); +} + +// SOPK + +void Translator::S_MOVK(const GcnInst& inst) { + const auto simm16 = inst.control.sopk.simm; + if (simm16 & (1 << 15)) { + // TODO: need to verify the case of imm sign extension + UNREACHABLE(); + } + SetDst(inst.dst[0], ir.Imm32(simm16)); +} + +void Translator::S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst) { + const s32 simm16 = inst.control.sopk.simm; + const IR::U32 lhs = GetSrc(inst.dst[0]); + const IR::U32 rhs = ir.Imm32(simm16); + const IR::U1 result = [&] { + switch (cond) { + case ConditionOp::EQ: + return ir.IEqual(lhs, rhs); + case ConditionOp::LG: + return ir.INotEqual(lhs, rhs); + case ConditionOp::GT: + return ir.IGreaterThan(lhs, rhs, is_signed); + case ConditionOp::GE: + return ir.IGreaterThanEqual(lhs, rhs, is_signed); + case ConditionOp::LT: + return ir.ILessThan(lhs, rhs, is_signed); + case ConditionOp::LE: + return ir.ILessThanEqual(lhs, rhs, is_signed); + default: + UNREACHABLE(); + } + }(); + ir.SetScc(result); +} + +void Translator::S_ADDK_I32(const GcnInst& inst) { + const s32 simm16 = inst.control.sopk.simm; + SetDst(inst.dst[0], ir.IAdd(GetSrc(inst.dst[0]), ir.Imm32(simm16))); +} + +void Translator::S_MULK_I32(const GcnInst& inst) { + const s32 simm16 = inst.control.sopk.simm; + SetDst(inst.dst[0], ir.IMul(GetSrc(inst.dst[0]), ir.Imm32(simm16))); +} + +// SOP1 + +void Translator::S_MOV(const GcnInst& inst) { + SetDst(inst.dst[0], GetSrc(inst.src[0])); +} + +void Translator::S_MOV_B64(const GcnInst& inst) { + const IR::U1 src = [&] { + switch (inst.src[0].field) { + case OperandField::VccLo: + return ir.GetVcc(); + case OperandField::ExecLo: + return ir.GetExec(); + case OperandField::ScalarGPR: + return ir.GetThreadBitScalarReg(IR::ScalarReg(inst.src[0].code)); + case OperandField::ConstZero: + return ir.Imm1(false); + default: + UNREACHABLE(); + } + }(); + switch (inst.dst[0].field) { + case OperandField::ScalarGPR: + ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), src); + break; + case OperandField::ExecLo: + ir.SetExec(src); + break; + case OperandField::VccLo: + ir.SetVcc(src); + break; + default: + UNREACHABLE(); + } +} + void Translator::S_NOT_B64(const GcnInst& inst) { const auto get_src = [&](const InstOperand& operand) { switch (operand.field) { @@ -493,6 +512,8 @@ void Translator::S_NOT_B64(const GcnInst& inst) { return ir.GetExec(); case OperandField::ScalarGPR: return ir.GetThreadBitScalarReg(IR::ScalarReg(operand.code)); + case OperandField::ConstZero: + return ir.Imm1(false); default: UNREACHABLE(); } @@ -507,6 +528,9 @@ void Translator::S_NOT_B64(const GcnInst& inst) { case OperandField::ScalarGPR: ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), result); break; + case OperandField::ExecLo: + ir.SetExec(result); + break; default: UNREACHABLE(); } @@ -516,51 +540,63 @@ void Translator::S_BREV_B32(const GcnInst& inst) { SetDst(inst.dst[0], ir.BitReverse(GetSrc(inst.src[0]))); } -void Translator::S_ADD_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IAdd(src0, src1)); - // TODO: Carry out - ir.SetScc(ir.Imm1(false)); +void Translator::S_AND_SAVEEXEC_B64(const GcnInst& inst) { + // This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs) + // However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination + // SGPR we have a special IR opcode for SPGRs that act as thread masks. + const IR::U1 exec{ir.GetExec()}; + const IR::U1 src = [&] { + switch (inst.src[0].field) { + case OperandField::VccLo: + return ir.GetVcc(); + case OperandField::ScalarGPR: + return ir.GetThreadBitScalarReg(IR::ScalarReg(inst.src[0].code)); + default: + UNREACHABLE(); + } + }(); + + switch (inst.dst[0].field) { + case OperandField::ScalarGPR: + ir.SetThreadBitScalarReg(IR::ScalarReg(inst.dst[0].code), exec); + break; + case OperandField::VccLo: + ir.SetVcc(exec); + break; + default: + UNREACHABLE(); + } + + // Update EXEC. + const IR::U1 result = ir.LogicalAnd(exec, src); + ir.SetExec(result); + ir.SetScc(result); } -void Translator::S_SUB_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ISub(src0, src1)); - // TODO: Carry out - ir.SetScc(ir.Imm1(false)); -} +// SOPC -void Translator::S_GETPC_B64(u32 pc, const GcnInst& inst) { - // This only really exists to let resource tracking pass know - // there is an inline cbuf. - const IR::ScalarReg dst{inst.dst[0].code}; - ir.SetScalarReg(dst, ir.Imm32(pc)); - ir.SetScalarReg(dst + 1, ir.Imm32(0)); -} - -void Translator::S_ADDC_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 carry{ir.Select(ir.GetScc(), ir.Imm32(1U), ir.Imm32(0U))}; - SetDst(inst.dst[0], ir.IAdd(ir.IAdd(src0, src1), carry)); -} - -void Translator::S_MAX_U32(bool is_signed, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result = ir.IMax(src0, src1, is_signed); - SetDst(inst.dst[0], result); - ir.SetScc(ir.IEqual(result, src0)); -} - -void Translator::S_MIN_U32(bool is_signed, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result = ir.IMin(src0, src1, is_signed); - SetDst(inst.dst[0], result); - ir.SetScc(ir.IEqual(result, src0)); +void Translator::S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst) { + const IR::U32 lhs = GetSrc(inst.src[0]); + const IR::U32 rhs = GetSrc(inst.src[1]); + const IR::U1 result = [&] { + switch (cond) { + case ConditionOp::EQ: + return ir.IEqual(lhs, rhs); + case ConditionOp::LG: + return ir.INotEqual(lhs, rhs); + case ConditionOp::GT: + return ir.IGreaterThan(lhs, rhs, is_signed); + case ConditionOp::GE: + return ir.IGreaterThanEqual(lhs, rhs, is_signed); + case ConditionOp::LT: + return ir.ILessThan(lhs, rhs, is_signed); + case ConditionOp::LE: + return ir.ILessThanEqual(lhs, rhs, is_signed); + default: + UNREACHABLE(); + } + }(); + ir.SetScc(result); } } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/scalar_flow.cpp b/src/shader_recompiler/frontend/translate/scalar_flow.cpp new file mode 100644 index 000000000..ef8bab789 --- /dev/null +++ b/src/shader_recompiler/frontend/translate/scalar_flow.cpp @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/frontend/opcodes.h" +#include "shader_recompiler/frontend/translate/translate.h" + +namespace Shader::Gcn { + +void Translator::EmitFlowControl(u32 pc, const GcnInst& inst) { + switch (inst.opcode) { + case Opcode::S_BARRIER: + return S_BARRIER(); + case Opcode::S_TTRACEDATA: + LOG_WARNING(Render_Vulkan, "S_TTRACEDATA instruction!"); + return; + case Opcode::S_GETPC_B64: + return S_GETPC_B64(pc, inst); + case Opcode::S_WAITCNT: + case Opcode::S_NOP: + case Opcode::S_ENDPGM: + case Opcode::S_CBRANCH_EXECZ: + case Opcode::S_CBRANCH_SCC0: + case Opcode::S_CBRANCH_SCC1: + case Opcode::S_CBRANCH_VCCNZ: + case Opcode::S_CBRANCH_VCCZ: + case Opcode::S_CBRANCH_EXECNZ: + case Opcode::S_BRANCH: + return; + case Opcode::S_SENDMSG: + S_SENDMSG(inst); + return; + default: + UNREACHABLE(); + } +} + +void Translator::S_BARRIER() { + ir.Barrier(); +} + +void Translator::S_GETPC_B64(u32 pc, const GcnInst& inst) { + // This only really exists to let resource tracking pass know + // there is an inline cbuf. + const IR::ScalarReg dst{inst.dst[0].code}; + ir.SetScalarReg(dst, ir.Imm32(pc)); + ir.SetScalarReg(dst + 1, ir.Imm32(0)); +} + +void Translator::S_SENDMSG(const GcnInst& inst) { + const auto& simm = reinterpret_cast(inst.control.sopp.simm); + switch (simm.msg) { + case SendMsgSimm::Message::Gs: { + switch (simm.op) { + case SendMsgSimm::GsOp::Nop: + break; + case SendMsgSimm::GsOp::Cut: + ir.EmitPrimitive(); + break; + case SendMsgSimm::GsOp::Emit: + ir.EmitVertex(); + break; + default: + UNREACHABLE(); + } + break; + } + case SendMsgSimm::Message::GsDone: { + break; + } + default: + UNREACHABLE(); + } +} + +} // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/scalar_memory.cpp b/src/shader_recompiler/frontend/translate/scalar_memory.cpp index 29f2acc27..a6f8cafd7 100644 --- a/src/shader_recompiler/frontend/translate/scalar_memory.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_memory.cpp @@ -9,6 +9,7 @@ static constexpr u32 SQ_SRC_LITERAL = 0xFF; void Translator::EmitScalarMemory(const GcnInst& inst) { switch (inst.opcode) { + // SMRD case Opcode::S_LOAD_DWORDX4: return S_LOAD_DWORD(4, inst); case Opcode::S_LOAD_DWORDX8: @@ -30,6 +31,8 @@ void Translator::EmitScalarMemory(const GcnInst& inst) { } } +// SMRD + void Translator::S_LOAD_DWORD(int num_dwords, const GcnInst& inst) { const auto& smrd = inst.control.smrd; const u32 dword_offset = [&] -> u32 { diff --git a/src/shader_recompiler/frontend/translate/translate.cpp b/src/shader_recompiler/frontend/translate/translate.cpp index c9144fac1..bae6681cb 100644 --- a/src/shader_recompiler/frontend/translate/translate.cpp +++ b/src/shader_recompiler/frontend/translate/translate.cpp @@ -10,6 +10,7 @@ #include "shader_recompiler/info.h" #include "shader_recompiler/runtime_info.h" #include "video_core/amdgpu/resource.h" +#include "video_core/amdgpu/types.h" #define MAGIC_ENUM_RANGE_MIN 0 #define MAGIC_ENUM_RANGE_MAX 1515 @@ -35,6 +36,7 @@ void Translator::EmitPrologue() { IR::VectorReg dst_vreg = IR::VectorReg::V0; switch (info.stage) { case Stage::Vertex: + case Stage::Export: // v0: vertex ID, always present ir.SetVectorReg(dst_vreg++, ir.GetAttributeU32(IR::Attribute::VertexId)); // v1: instance ID, step rate 0 @@ -76,6 +78,20 @@ void Translator::EmitPrologue() { ir.SetScalarReg(dst_sreg++, ir.GetAttributeU32(IR::Attribute::WorkgroupId, 2)); } break; + case Stage::Geometry: + switch (runtime_info.gs_info.out_primitive[0]) { + case AmdGpu::GsOutputPrimitiveType::TriangleStrip: + ir.SetVectorReg(IR::VectorReg::V3, ir.Imm32(2u)); // vertex 2 + [[fallthrough]]; + case AmdGpu::GsOutputPrimitiveType::LineStrip: + ir.SetVectorReg(IR::VectorReg::V1, ir.Imm32(1u)); // vertex 1 + [[fallthrough]]; + default: + ir.SetVectorReg(IR::VectorReg::V0, ir.Imm32(0u)); // vertex 0 + break; + } + ir.SetVectorReg(IR::VectorReg::V2, ir.GetAttributeU32(IR::Attribute::PrimitiveId)); + break; default: throw NotImplementedException("Unknown shader stage"); } @@ -174,7 +190,7 @@ T Translator::GetSrc(const InstOperand& operand) { value = ir.IAbs(value); } if (operand.input_modifier.neg) { - UNREACHABLE(); + value = ir.INeg(value); } } return value; @@ -211,7 +227,7 @@ T Translator::GetSrc64(const InstOperand& operand) { const auto value_lo = ir.GetVectorReg(IR::VectorReg(operand.code)); const auto value_hi = ir.GetVectorReg(IR::VectorReg(operand.code + 1)); if constexpr (is_float) { - UNREACHABLE(); + value = ir.PackFloat2x32(ir.CompositeConstruct(value_lo, value_hi)); } else { value = ir.PackUint2x32(ir.CompositeConstruct(value_lo, value_hi)); } @@ -281,12 +297,15 @@ template IR::F64 Translator::GetSrc64(const InstOperand&); void Translator::SetDst(const InstOperand& operand, const IR::U32F32& value) { IR::U32F32 result = value; - if (operand.output_modifier.multiplier != 0.f) { - result = ir.FPMul(result, ir.Imm32(operand.output_modifier.multiplier)); - } - if (operand.output_modifier.clamp) { - result = ir.FPSaturate(value); + if (value.Type() == IR::Type::F32) { + if (operand.output_modifier.multiplier != 0.f) { + result = ir.FPMul(result, ir.Imm32(operand.output_modifier.multiplier)); + } + if (operand.output_modifier.clamp) { + result = ir.FPSaturate(value); + } } + switch (operand.field) { case OperandField::ScalarGPR: return ir.SetScalarReg(IR::ScalarReg(operand.code), result); @@ -356,7 +375,7 @@ void Translator::EmitFetch(const GcnInst& inst) { if (!std::filesystem::exists(dump_dir)) { std::filesystem::create_directories(dump_dir); } - const auto filename = fmt::format("vs_{:#018x}_fetch.bin", info.pgm_hash); + const auto filename = fmt::format("vs_{:#018x}.fetch.bin", info.pgm_hash); const auto file = IOFile{dump_dir / filename, FileAccessMode::Write}; file.WriteRaw(code, fetch_size); } @@ -421,31 +440,6 @@ void Translator::EmitFetch(const GcnInst& inst) { } } -void Translator::EmitFlowControl(u32 pc, const GcnInst& inst) { - switch (inst.opcode) { - case Opcode::S_BARRIER: - return S_BARRIER(); - case Opcode::S_TTRACEDATA: - LOG_WARNING(Render_Vulkan, "S_TTRACEDATA instruction!"); - return; - case Opcode::S_GETPC_B64: - return S_GETPC_B64(pc, inst); - case Opcode::S_WAITCNT: - case Opcode::S_NOP: - case Opcode::S_ENDPGM: - case Opcode::S_CBRANCH_EXECZ: - case Opcode::S_CBRANCH_SCC0: - case Opcode::S_CBRANCH_SCC1: - case Opcode::S_CBRANCH_VCCNZ: - case Opcode::S_CBRANCH_VCCZ: - case Opcode::S_CBRANCH_EXECNZ: - case Opcode::S_BRANCH: - return; - default: - UNREACHABLE(); - } -} - void Translator::LogMissingOpcode(const GcnInst& inst) { LOG_ERROR(Render_Recompiler, "Unknown opcode {} ({}, category = {})", magic_enum::enum_name(inst.opcode), u32(inst.opcode), @@ -464,7 +458,7 @@ void Translate(IR::Block* block, u32 pc, std::span inst_list, Inf // Special case for emitting fetch shader. if (inst.opcode == Opcode::S_SWAPPC_B64) { - ASSERT(info.stage == Stage::Vertex); + ASSERT(info.stage == Stage::Vertex || info.stage == Stage::Export); translator.EmitFetch(inst); continue; } diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 4ca2f73af..c77588280 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -61,174 +61,209 @@ public: // Instruction categories void EmitPrologue(); void EmitFetch(const GcnInst& inst); - void EmitDataShare(const GcnInst& inst); - void EmitVectorInterpolation(const GcnInst& inst); - void EmitScalarMemory(const GcnInst& inst); - void EmitVectorMemory(const GcnInst& inst); void EmitExport(const GcnInst& inst); void EmitFlowControl(u32 pc, const GcnInst& inst); void EmitScalarAlu(const GcnInst& inst); + void EmitScalarMemory(const GcnInst& inst); void EmitVectorAlu(const GcnInst& inst); + void EmitVectorInterpolation(const GcnInst& inst); + void EmitDataShare(const GcnInst& inst); + void EmitVectorMemory(const GcnInst& inst); // Instruction encodings void EmitSOPC(const GcnInst& inst); void EmitSOPK(const GcnInst& inst); // Scalar ALU - void S_MOVK(const GcnInst& inst); - void S_MOV(const GcnInst& inst); - void S_MUL_I32(const GcnInst& inst); - void S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst); - void S_AND_SAVEEXEC_B64(const GcnInst& inst); - void S_MOV_B64(const GcnInst& inst); - void S_OR_B64(NegateMode negate, bool is_xor, const GcnInst& inst); - void S_AND_B64(NegateMode negate, const GcnInst& inst); - void S_ADD_I32(const GcnInst& inst); - void S_AND_B32(NegateMode negate, const GcnInst& inst); - void S_ASHR_I32(const GcnInst& inst); - void S_OR_B32(const GcnInst& inst); - void S_LSHR_B32(const GcnInst& inst); - void S_CSELECT_B32(const GcnInst& inst); - void S_CSELECT_B64(const GcnInst& inst); - void S_BFE_U32(const GcnInst& inst); - void S_LSHL_B32(const GcnInst& inst); - void S_BFM_B32(const GcnInst& inst); - void S_NOT_B64(const GcnInst& inst); - void S_BREV_B32(const GcnInst& inst); + // SOP2 void S_ADD_U32(const GcnInst& inst); void S_SUB_U32(const GcnInst& inst); - void S_GETPC_B64(u32 pc, const GcnInst& inst); + void S_ADD_I32(const GcnInst& inst); void S_ADDC_U32(const GcnInst& inst); - void S_MULK_I32(const GcnInst& inst); - void S_ADDK_I32(const GcnInst& inst); - void S_MAX_U32(bool is_signed, const GcnInst& inst); void S_MIN_U32(bool is_signed, const GcnInst& inst); + void S_MAX_U32(bool is_signed, const GcnInst& inst); + void S_CSELECT_B32(const GcnInst& inst); + void S_CSELECT_B64(const GcnInst& inst); + void S_AND_B32(NegateMode negate, const GcnInst& inst); + void S_AND_B64(NegateMode negate, const GcnInst& inst); + void S_OR_B32(const GcnInst& inst); + void S_OR_B64(NegateMode negate, bool is_xor, const GcnInst& inst); + void S_XOR_B32(const GcnInst& inst); + void S_LSHL_B32(const GcnInst& inst); + void S_LSHR_B32(const GcnInst& inst); + void S_ASHR_I32(const GcnInst& inst); + void S_BFM_B32(const GcnInst& inst); + void S_MUL_I32(const GcnInst& inst); + void S_BFE_U32(const GcnInst& inst); + void S_ABSDIFF_I32(const GcnInst& inst); + + // SOPK + void S_MOVK(const GcnInst& inst); void S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst); + void S_ADDK_I32(const GcnInst& inst); + void S_MULK_I32(const GcnInst& inst); + + // SOP1 + void S_MOV(const GcnInst& inst); + void S_MOV_B64(const GcnInst& inst); + void S_NOT_B64(const GcnInst& inst); + void S_BREV_B32(const GcnInst& inst); + void S_GETPC_B64(u32 pc, const GcnInst& inst); + void S_AND_SAVEEXEC_B64(const GcnInst& inst); + + // SOPC + void S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst); + + // SOPP + void S_BARRIER(); + void S_SENDMSG(const GcnInst& inst); // Scalar Memory + // SMRD void S_LOAD_DWORD(int num_dwords, const GcnInst& inst); void S_BUFFER_LOAD_DWORD(int num_dwords, const GcnInst& inst); // Vector ALU - void V_MOV(const GcnInst& inst); - void V_SAD(const GcnInst& inst); - void V_MAC_F32(const GcnInst& inst); - void V_CVT_PKRTZ_F16_F32(const GcnInst& inst); - void V_CVT_F32_F16(const GcnInst& inst); - void V_CVT_F16_F32(const GcnInst& inst); - void V_MUL_F32(const GcnInst& inst); + // VOP2 void V_CNDMASK_B32(const GcnInst& inst); - void V_OR_B32(bool is_xor, const GcnInst& inst); - void V_AND_B32(const GcnInst& inst); - void V_LSHLREV_B32(const GcnInst& inst); + void V_READLANE_B32(const GcnInst& inst); + void V_WRITELANE_B32(const GcnInst& inst); + void V_ADD_F32(const GcnInst& inst); + void V_SUB_F32(const GcnInst& inst); + void V_SUBREV_F32(const GcnInst& inst); + void V_MUL_F32(const GcnInst& inst); + void V_MUL_I32_I24(const GcnInst& inst); + void V_MIN_F32(const GcnInst& inst, bool is_legacy = false); + void V_MAX_F32(const GcnInst& inst, bool is_legacy = false); + void V_MIN_I32(const GcnInst& inst); + void V_MIN_U32(const GcnInst& inst); + void V_MAX_U32(bool is_signed, const GcnInst& inst); + void V_LSHR_B32(const GcnInst& inst); + void V_LSHRREV_B32(const GcnInst& inst); + void V_ASHR_I32(const GcnInst& inst); + void V_ASHRREV_I32(const GcnInst& inst); void V_LSHL_B32(const GcnInst& inst); - void V_LSHL_B64(const GcnInst& inst); + void V_LSHLREV_B32(const GcnInst& inst); + void V_AND_B32(const GcnInst& inst); + void V_OR_B32(bool is_xor, const GcnInst& inst); + void V_BFM_B32(const GcnInst& inst); + void V_MAC_F32(const GcnInst& inst); + void V_MADMK_F32(const GcnInst& inst); + void V_BCNT_U32_B32(const GcnInst& inst); + void V_MBCNT_U32_B32(bool is_low, const GcnInst& inst); void V_ADD_I32(const GcnInst& inst); + void V_SUB_I32(const GcnInst& inst); + void V_SUBREV_I32(const GcnInst& inst); void V_ADDC_U32(const GcnInst& inst); + void V_LDEXP_F32(const GcnInst& inst); + void V_CVT_PKNORM_U16_F32(const GcnInst& inst); + void V_CVT_PKRTZ_F16_F32(const GcnInst& inst); + + // VOP1 + void V_MOV(const GcnInst& inst); + void V_READFIRSTLANE_B32(const GcnInst& inst); + void V_CVT_I32_F64(const GcnInst& inst); + void V_CVT_F64_I32(const GcnInst& inst); void V_CVT_F32_I32(const GcnInst& inst); void V_CVT_F32_U32(const GcnInst& inst); - void V_MAD_F32(const GcnInst& inst); - void V_FRACT_F32(const GcnInst& inst); - void V_ADD_F32(const GcnInst& inst); - void V_CVT_OFF_F32_I4(const GcnInst& inst); - void V_MED3_F32(const GcnInst& inst); - void V_MED3_I32(bool is_signed, const GcnInst& inst); - void V_FLOOR_F32(const GcnInst& inst); - void V_SUB_F32(const GcnInst& inst); - void V_RCP_F32(const GcnInst& inst); - void V_FMA_F32(const GcnInst& inst); - void V_CMP_F32(ConditionOp op, bool set_exec, const GcnInst& inst); - void V_MAX_F32(const GcnInst& inst, bool is_legacy = false); - void V_MAX_U32(bool is_signed, const GcnInst& inst); - void V_RSQ_F32(const GcnInst& inst); - void V_SIN_F32(const GcnInst& inst); - void V_LOG_F32(const GcnInst& inst); - void V_EXP_F32(const GcnInst& inst); - void V_SQRT_F32(const GcnInst& inst); - void V_MIN_F32(const GcnInst& inst, bool is_legacy = false); - void V_MIN3_F32(const GcnInst& inst); - void V_MIN3_I32(const GcnInst& inst); - void V_MADMK_F32(const GcnInst& inst); - void V_CUBEMA_F32(const GcnInst& inst); - void V_CUBESC_F32(const GcnInst& inst); - void V_CUBETC_F32(const GcnInst& inst); - void V_CUBEID_F32(const GcnInst& inst); void V_CVT_U32_F32(const GcnInst& inst); - void V_SUBREV_F32(const GcnInst& inst); - void V_SUBREV_I32(const GcnInst& inst); - void V_MAD_U64_U32(const GcnInst& inst); - void V_CMP_U32(ConditionOp op, bool is_signed, bool set_exec, const GcnInst& inst); - void V_LSHRREV_B32(const GcnInst& inst); - void V_MUL_HI_U32(bool is_signed, const GcnInst& inst); - void V_SAD_U32(const GcnInst& inst); - void V_BFE_U32(bool is_signed, const GcnInst& inst); - void V_MAD_I32_I24(const GcnInst& inst, bool is_signed = true); - void V_MUL_I32_I24(const GcnInst& inst); - void V_SUB_I32(const GcnInst& inst); - void V_LSHR_B32(const GcnInst& inst); - void V_ASHRREV_I32(const GcnInst& inst); - void V_ASHR_I32(const GcnInst& inst); - void V_MAD_U32_U24(const GcnInst& inst); - void V_RNDNE_F32(const GcnInst& inst); - void V_BCNT_U32_B32(const GcnInst& inst); - void V_COS_F32(const GcnInst& inst); - void V_MAX3_F32(const GcnInst& inst); - void V_MAX3_U32(bool is_signed, const GcnInst& inst); void V_CVT_I32_F32(const GcnInst& inst); - void V_MIN_I32(const GcnInst& inst); - void V_MUL_LO_U32(const GcnInst& inst); + void V_CVT_F16_F32(const GcnInst& inst); + void V_CVT_F32_F16(const GcnInst& inst); + void V_CVT_RPI_I32_F32(const GcnInst& inst); + void V_CVT_FLR_I32_F32(const GcnInst& inst); + void V_CVT_OFF_F32_I4(const GcnInst& inst); + void V_CVT_F32_F64(const GcnInst& inst); + void V_CVT_F64_F32(const GcnInst& inst); + void V_CVT_F32_UBYTE(u32 index, const GcnInst& inst); + void V_FRACT_F32(const GcnInst& inst); void V_TRUNC_F32(const GcnInst& inst); void V_CEIL_F32(const GcnInst& inst); - void V_MIN_U32(const GcnInst& inst); - void V_CMP_NE_U64(const GcnInst& inst); - void V_BFI_B32(const GcnInst& inst); + void V_RNDNE_F32(const GcnInst& inst); + void V_FLOOR_F32(const GcnInst& inst); + void V_EXP_F32(const GcnInst& inst); + void V_LOG_F32(const GcnInst& inst); + void V_RCP_F32(const GcnInst& inst); + void V_RCP_F64(const GcnInst& inst); + void V_RSQ_F32(const GcnInst& inst); + void V_SQRT_F32(const GcnInst& inst); + void V_SIN_F32(const GcnInst& inst); + void V_COS_F32(const GcnInst& inst); void V_NOT_B32(const GcnInst& inst); - void V_CVT_F32_UBYTE(u32 index, const GcnInst& inst); void V_BFREV_B32(const GcnInst& inst); - void V_LDEXP_F32(const GcnInst& inst); - void V_CVT_FLR_I32_F32(const GcnInst& inst); - void V_CMP_CLASS_F32(const GcnInst& inst); - void V_FFBL_B32(const GcnInst& inst); - void V_MBCNT_U32_B32(bool is_low, const GcnInst& inst); - void V_BFM_B32(const GcnInst& inst); void V_FFBH_U32(const GcnInst& inst); - void V_MOVRELS_B32(const GcnInst& inst); + void V_FFBL_B32(const GcnInst& inst); void V_MOVRELD_B32(const GcnInst& inst); + void V_MOVRELS_B32(const GcnInst& inst); void V_MOVRELSD_B32(const GcnInst& inst); - // Vector Memory + // VOPC + void V_CMP_F32(ConditionOp op, bool set_exec, const GcnInst& inst); + void V_CMP_U32(ConditionOp op, bool is_signed, bool set_exec, const GcnInst& inst); + void V_CMP_NE_U64(const GcnInst& inst); + void V_CMP_CLASS_F32(const GcnInst& inst); + + // VOP3a + void V_MAD_F32(const GcnInst& inst); + void V_MAD_I32_I24(const GcnInst& inst, bool is_signed = false); + void V_MAD_U32_U24(const GcnInst& inst); + void V_CUBEID_F32(const GcnInst& inst); + void V_CUBESC_F32(const GcnInst& inst); + void V_CUBETC_F32(const GcnInst& inst); + void V_CUBEMA_F32(const GcnInst& inst); + void V_BFE_U32(bool is_signed, const GcnInst& inst); + void V_BFI_B32(const GcnInst& inst); + void V_FMA_F32(const GcnInst& inst); + void V_FMA_F64(const GcnInst& inst); + void V_MIN3_F32(const GcnInst& inst); + void V_MIN3_I32(const GcnInst& inst); + void V_MAX3_F32(const GcnInst& inst); + void V_MAX3_U32(bool is_signed, const GcnInst& inst); + void V_MED3_F32(const GcnInst& inst); + void V_MED3_I32(const GcnInst& inst); + void V_SAD(const GcnInst& inst); + void V_SAD_U32(const GcnInst& inst); + void V_CVT_PK_U8_F32(const GcnInst& inst); + void V_LSHL_B64(const GcnInst& inst); + void V_MUL_F64(const GcnInst& inst); + void V_MAX_F64(const GcnInst& inst); + void V_MUL_LO_U32(const GcnInst& inst); + void V_MUL_HI_U32(bool is_signed, const GcnInst& inst); + void V_MAD_U64_U32(const GcnInst& inst); + + // Vector interpolation + // VINTRP + void V_INTERP_P2_F32(const GcnInst& inst); + void V_INTERP_MOV_F32(const GcnInst& inst); + + // Data share + // DS + void DS_ADD_U32(const GcnInst& inst, bool rtn); + void DS_MIN_U32(const GcnInst& inst, bool is_signed, bool rtn); + void DS_MAX_U32(const GcnInst& inst, bool is_signed, bool rtn); + void DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool stride64, const GcnInst& inst); + void DS_SWIZZLE_B32(const GcnInst& inst); + void DS_READ(int bit_size, bool is_signed, bool is_pair, bool stride64, const GcnInst& inst); + void DS_APPEND(const GcnInst& inst); + void DS_CONSUME(const GcnInst& inst); + + // Buffer Memory + // MUBUF / MTBUF void BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst); void BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst); void BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst); void BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst); void BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst); - // Vector interpolation - void V_INTERP_P2_F32(const GcnInst& inst); - void V_INTERP_MOV_F32(const GcnInst& inst); - - // Data share - void DS_SWIZZLE_B32(const GcnInst& inst); - void DS_READ(int bit_size, bool is_signed, bool is_pair, const GcnInst& inst); - void DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool stride64, const GcnInst& inst); - void DS_ADD_U32(const GcnInst& inst, bool rtn); - void DS_MIN_U32(const GcnInst& inst, bool is_signed, bool rtn); - void DS_MAX_U32(const GcnInst& inst, bool is_signed, bool rtn); - void V_READFIRSTLANE_B32(const GcnInst& inst); - void V_READLANE_B32(const GcnInst& inst); - void V_WRITELANE_B32(const GcnInst& inst); - void DS_APPEND(const GcnInst& inst); - void DS_CONSUME(const GcnInst& inst); - void S_BARRIER(); - + // Image Memory // MIMG + void IMAGE_LOAD(bool has_mip, const GcnInst& inst); + void IMAGE_STORE(const GcnInst& inst); void IMAGE_GET_RESINFO(const GcnInst& inst); + void IMAGE_ATOMIC(AtomicOp op, const GcnInst& inst); void IMAGE_SAMPLE(const GcnInst& inst); void IMAGE_GATHER(const GcnInst& inst); - void IMAGE_STORE(const GcnInst& inst); - void IMAGE_LOAD(bool has_mip, const GcnInst& inst); void IMAGE_GET_LOD(const GcnInst& inst); - void IMAGE_ATOMIC(AtomicOp op, const GcnInst& inst); private: template @@ -238,6 +273,7 @@ private: void SetDst(const InstOperand& operand, const IR::U32F32& value); void SetDst64(const InstOperand& operand, const IR::U64F64& value_raw); + // Vector ALU Helprers IR::U32 VMovRelSHelper(u32 src_vgprno, const IR::U32 m0); void VMovRelDHelper(u32 dst_vgprno, const IR::U32 src_val, const IR::U32 m0); diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 6f8b72cf2..b005e42ed 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -8,55 +8,123 @@ namespace Shader::Gcn { void Translator::EmitVectorAlu(const GcnInst& inst) { switch (inst.opcode) { - case Opcode::V_LSHLREV_B32: - return V_LSHLREV_B32(inst); - case Opcode::V_LSHL_B32: - return V_LSHL_B32(inst); - case Opcode::V_LSHL_B64: - return V_LSHL_B64(inst); - case Opcode::V_BFREV_B32: - return V_BFREV_B32(inst); - case Opcode::V_BFE_U32: - return V_BFE_U32(false, inst); - case Opcode::V_BFE_I32: - return V_BFE_U32(true, inst); - case Opcode::V_BFI_B32: - return V_BFI_B32(inst); + // VOP2 + case Opcode::V_CNDMASK_B32: + return V_CNDMASK_B32(inst); + case Opcode::V_READLANE_B32: + return V_READLANE_B32(inst); + case Opcode::V_WRITELANE_B32: + return V_WRITELANE_B32(inst); + case Opcode::V_ADD_F32: + return V_ADD_F32(inst); + case Opcode::V_SUB_F32: + return V_SUB_F32(inst); + case Opcode::V_SUBREV_F32: + return V_SUBREV_F32(inst); + case Opcode::V_MAC_LEGACY_F32: + return V_MAC_F32(inst); + case Opcode::V_MUL_LEGACY_F32: + return V_MUL_F32(inst); + case Opcode::V_MUL_F32: + return V_MUL_F32(inst); + case Opcode::V_MUL_I32_I24: + return V_MUL_I32_I24(inst); + case Opcode::V_MUL_U32_U24: + return V_MUL_I32_I24(inst); + case Opcode::V_MIN_LEGACY_F32: + return V_MIN_F32(inst, true); + case Opcode::V_MAX_LEGACY_F32: + return V_MAX_F32(inst, true); + case Opcode::V_MIN_F32: + return V_MIN_F32(inst, false); + case Opcode::V_MAX_F32: + return V_MAX_F32(inst); + case Opcode::V_MIN_I32: + return V_MIN_I32(inst); + case Opcode::V_MAX_I32: + return V_MAX_U32(true, inst); + case Opcode::V_MIN_U32: + return V_MIN_U32(inst); + case Opcode::V_MAX_U32: + return V_MAX_U32(false, inst); case Opcode::V_LSHR_B32: return V_LSHR_B32(inst); - case Opcode::V_ASHRREV_I32: - return V_ASHRREV_I32(inst); - case Opcode::V_ASHR_I32: - return V_ASHR_I32(inst); case Opcode::V_LSHRREV_B32: return V_LSHRREV_B32(inst); - case Opcode::V_NOT_B32: - return V_NOT_B32(inst); + case Opcode::V_ASHR_I32: + return V_ASHR_I32(inst); + case Opcode::V_ASHRREV_I32: + return V_ASHRREV_I32(inst); + case Opcode::V_LSHL_B32: + return V_LSHL_B32(inst); + case Opcode::V_LSHLREV_B32: + return V_LSHLREV_B32(inst); case Opcode::V_AND_B32: return V_AND_B32(inst); case Opcode::V_OR_B32: return V_OR_B32(false, inst); case Opcode::V_XOR_B32: return V_OR_B32(true, inst); - case Opcode::V_FFBL_B32: - return V_FFBL_B32(inst); - - case Opcode::V_MOV_B32: - return V_MOV(inst); + case Opcode::V_BFM_B32: + return V_BFM_B32(inst); + case Opcode::V_MAC_F32: + return V_MAC_F32(inst); + case Opcode::V_MADMK_F32: + return V_MADMK_F32(inst); + case Opcode::V_MADAK_F32: + return V_FMA_F32(inst); + case Opcode::V_BCNT_U32_B32: + return V_BCNT_U32_B32(inst); + case Opcode::V_MBCNT_LO_U32_B32: + return V_MBCNT_U32_B32(true, inst); + case Opcode::V_MBCNT_HI_U32_B32: + return V_MBCNT_U32_B32(false, inst); case Opcode::V_ADD_I32: return V_ADD_I32(inst); + case Opcode::V_SUB_I32: + return V_SUB_I32(inst); + case Opcode::V_SUBREV_I32: + return V_SUBREV_I32(inst); case Opcode::V_ADDC_U32: return V_ADDC_U32(inst); + case Opcode::V_LDEXP_F32: + return V_LDEXP_F32(inst); + case Opcode::V_CVT_PKNORM_U16_F32: + return V_CVT_PKNORM_U16_F32(inst); + case Opcode::V_CVT_PKRTZ_F16_F32: + return V_CVT_PKRTZ_F16_F32(inst); + + // VOP1 + case Opcode::V_MOV_B32: + return V_MOV(inst); + case Opcode::V_READFIRSTLANE_B32: + return V_READFIRSTLANE_B32(inst); + case Opcode::V_CVT_I32_F64: + return V_CVT_I32_F64(inst); + case Opcode::V_CVT_F64_I32: + return V_CVT_F64_I32(inst); case Opcode::V_CVT_F32_I32: return V_CVT_F32_I32(inst); case Opcode::V_CVT_F32_U32: return V_CVT_F32_U32(inst); - case Opcode::V_CVT_PKRTZ_F16_F32: - return V_CVT_PKRTZ_F16_F32(inst); - case Opcode::V_CVT_F32_F16: - return V_CVT_F32_F16(inst); + case Opcode::V_CVT_U32_F32: + return V_CVT_U32_F32(inst); + case Opcode::V_CVT_I32_F32: + return V_CVT_I32_F32(inst); case Opcode::V_CVT_F16_F32: return V_CVT_F16_F32(inst); + case Opcode::V_CVT_F32_F16: + return V_CVT_F32_F16(inst); + case Opcode::V_CVT_FLR_I32_F32: + return V_CVT_FLR_I32_F32(inst); + case Opcode::V_CVT_F32_F64: + return V_CVT_F32_F64(inst); + case Opcode::V_CVT_F64_F32: + return V_CVT_F64_F32(inst); + case Opcode::V_CVT_RPI_I32_F32: + return V_CVT_RPI_I32_F32(inst); + case Opcode::V_CVT_OFF_F32_I4: + return V_CVT_OFF_F32_I4(inst); case Opcode::V_CVT_F32_UBYTE0: return V_CVT_F32_UBYTE(0, inst); case Opcode::V_CVT_F32_UBYTE1: @@ -65,34 +133,55 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_CVT_F32_UBYTE(2, inst); case Opcode::V_CVT_F32_UBYTE3: return V_CVT_F32_UBYTE(3, inst); - case Opcode::V_CVT_OFF_F32_I4: - return V_CVT_OFF_F32_I4(inst); - case Opcode::V_MAD_U64_U32: - return V_MAD_U64_U32(inst); - case Opcode::V_CMP_GE_I32: - return V_CMP_U32(ConditionOp::GE, true, false, inst); - case Opcode::V_CMP_EQ_I32: - return V_CMP_U32(ConditionOp::EQ, true, false, inst); - case Opcode::V_CMP_LE_I32: - return V_CMP_U32(ConditionOp::LE, true, false, inst); - case Opcode::V_CMP_NE_I32: - return V_CMP_U32(ConditionOp::LG, true, false, inst); - case Opcode::V_CMP_NE_U32: - return V_CMP_U32(ConditionOp::LG, false, false, inst); - case Opcode::V_CMP_EQ_U32: - return V_CMP_U32(ConditionOp::EQ, false, false, inst); - case Opcode::V_CMP_F_U32: - return V_CMP_U32(ConditionOp::F, false, false, inst); - case Opcode::V_CMP_LT_U32: - return V_CMP_U32(ConditionOp::LT, false, false, inst); - case Opcode::V_CMP_GT_U32: - return V_CMP_U32(ConditionOp::GT, false, false, inst); - case Opcode::V_CMP_GE_U32: - return V_CMP_U32(ConditionOp::GE, false, false, inst); - case Opcode::V_CMP_TRU_U32: - return V_CMP_U32(ConditionOp::TRU, false, false, inst); - case Opcode::V_CMP_NEQ_F32: - return V_CMP_F32(ConditionOp::LG, false, inst); + case Opcode::V_FRACT_F32: + return V_FRACT_F32(inst); + case Opcode::V_TRUNC_F32: + return V_TRUNC_F32(inst); + case Opcode::V_CEIL_F32: + return V_CEIL_F32(inst); + case Opcode::V_RNDNE_F32: + return V_RNDNE_F32(inst); + case Opcode::V_FLOOR_F32: + return V_FLOOR_F32(inst); + case Opcode::V_EXP_F32: + return V_EXP_F32(inst); + case Opcode::V_LOG_F32: + return V_LOG_F32(inst); + case Opcode::V_RCP_F32: + return V_RCP_F32(inst); + case Opcode::V_RCP_F64: + return V_RCP_F64(inst); + case Opcode::V_RCP_IFLAG_F32: + return V_RCP_F32(inst); + case Opcode::V_RSQ_CLAMP_F32: + return V_RSQ_F32(inst); + case Opcode::V_RSQ_LEGACY_F32: + return V_RSQ_F32(inst); + case Opcode::V_RSQ_F32: + return V_RSQ_F32(inst); + case Opcode::V_SQRT_F32: + return V_SQRT_F32(inst); + case Opcode::V_SIN_F32: + return V_SIN_F32(inst); + case Opcode::V_COS_F32: + return V_COS_F32(inst); + case Opcode::V_NOT_B32: + return V_NOT_B32(inst); + case Opcode::V_BFREV_B32: + return V_BFREV_B32(inst); + case Opcode::V_FFBH_U32: + return V_FFBH_U32(inst); + case Opcode::V_FFBL_B32: + return V_FFBL_B32(inst); + case Opcode::V_MOVRELD_B32: + return V_MOVRELD_B32(inst); + case Opcode::V_MOVRELS_B32: + return V_MOVRELS_B32(inst); + case Opcode::V_MOVRELSD_B32: + return V_MOVRELSD_B32(inst); + + // VOPC + // V_CMP_{OP16}_F32 case Opcode::V_CMP_F_F32: return V_CMP_F32(ConditionOp::F, false, inst); case Opcode::V_CMP_LT_F32: @@ -107,149 +196,20 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_CMP_F32(ConditionOp::LG, false, inst); case Opcode::V_CMP_GE_F32: return V_CMP_F32(ConditionOp::GE, false, inst); - case Opcode::V_CMP_NLE_F32: - return V_CMP_F32(ConditionOp::GT, false, inst); - case Opcode::V_CMP_NLT_F32: - return V_CMP_F32(ConditionOp::GE, false, inst); - case Opcode::V_CMP_NGT_F32: - return V_CMP_F32(ConditionOp::LE, false, inst); - case Opcode::V_CMP_NGE_F32: - return V_CMP_F32(ConditionOp::LT, false, inst); case Opcode::V_CMP_U_F32: return V_CMP_F32(ConditionOp::U, false, inst); - case Opcode::V_CNDMASK_B32: - return V_CNDMASK_B32(inst); - case Opcode::V_MAX_I32: - return V_MAX_U32(true, inst); - case Opcode::V_MAX_U32: - return V_MAX_U32(false, inst); - case Opcode::V_MIN_I32: - return V_MIN_I32(inst); - case Opcode::V_CUBEMA_F32: - return V_CUBEMA_F32(inst); - case Opcode::V_CUBESC_F32: - return V_CUBESC_F32(inst); - case Opcode::V_CUBETC_F32: - return V_CUBETC_F32(inst); - case Opcode::V_CUBEID_F32: - return V_CUBEID_F32(inst); - case Opcode::V_CVT_U32_F32: - return V_CVT_U32_F32(inst); - case Opcode::V_CVT_I32_F32: - return V_CVT_I32_F32(inst); - case Opcode::V_CVT_FLR_I32_F32: - return V_CVT_FLR_I32_F32(inst); - case Opcode::V_SUBREV_I32: - return V_SUBREV_I32(inst); - case Opcode::V_MUL_HI_U32: - return V_MUL_HI_U32(false, inst); - case Opcode::V_MUL_LO_I32: - return V_MUL_LO_U32(inst); - case Opcode::V_SAD_U32: - return V_SAD_U32(inst); - case Opcode::V_SUB_I32: - return V_SUB_I32(inst); - case Opcode::V_MAD_I32_I24: - return V_MAD_I32_I24(inst); - case Opcode::V_MUL_I32_I24: - case Opcode::V_MUL_U32_U24: - return V_MUL_I32_I24(inst); - case Opcode::V_MAD_U32_U24: - return V_MAD_U32_U24(inst); - case Opcode::V_BCNT_U32_B32: - return V_BCNT_U32_B32(inst); - case Opcode::V_MUL_LO_U32: - return V_MUL_LO_U32(inst); - case Opcode::V_MIN_U32: - return V_MIN_U32(inst); - case Opcode::V_CMP_NE_U64: - return V_CMP_NE_U64(inst); - case Opcode::V_READFIRSTLANE_B32: - return V_READFIRSTLANE_B32(inst); - case Opcode::V_READLANE_B32: - return V_READLANE_B32(inst); - case Opcode::V_WRITELANE_B32: - return V_WRITELANE_B32(inst); - - case Opcode::V_MAD_F32: - return V_MAD_F32(inst); - case Opcode::V_MAC_F32: - return V_MAC_F32(inst); - case Opcode::V_MUL_F32: - return V_MUL_F32(inst); - case Opcode::V_RCP_F32: - return V_RCP_F32(inst); - case Opcode::V_LDEXP_F32: - return V_LDEXP_F32(inst); - case Opcode::V_FRACT_F32: - return V_FRACT_F32(inst); - case Opcode::V_ADD_F32: - return V_ADD_F32(inst); - case Opcode::V_MED3_F32: - return V_MED3_F32(inst); - case Opcode::V_MED3_I32: - return V_MED3_I32(true, inst); - case Opcode::V_MED3_U32: - return V_MED3_I32(false, inst); - case Opcode::V_FLOOR_F32: - return V_FLOOR_F32(inst); - case Opcode::V_SUB_F32: - return V_SUB_F32(inst); - case Opcode::V_FMA_F32: - case Opcode::V_MADAK_F32: - return V_FMA_F32(inst); - case Opcode::V_MAX_F32: - return V_MAX_F32(inst); - case Opcode::V_RSQ_F32: - return V_RSQ_F32(inst); - case Opcode::V_SIN_F32: - return V_SIN_F32(inst); - case Opcode::V_COS_F32: - return V_COS_F32(inst); - case Opcode::V_LOG_F32: - return V_LOG_F32(inst); - case Opcode::V_EXP_F32: - return V_EXP_F32(inst); - case Opcode::V_SQRT_F32: - return V_SQRT_F32(inst); - case Opcode::V_MIN_F32: - return V_MIN_F32(inst, false); - case Opcode::V_MIN3_F32: - return V_MIN3_F32(inst); - case Opcode::V_MIN3_I32: - return V_MIN3_I32(inst); - case Opcode::V_MIN_LEGACY_F32: - return V_MIN_F32(inst, true); - case Opcode::V_MADMK_F32: - return V_MADMK_F32(inst); - case Opcode::V_SUBREV_F32: - return V_SUBREV_F32(inst); - case Opcode::V_RNDNE_F32: - return V_RNDNE_F32(inst); - case Opcode::V_MAX3_F32: - return V_MAX3_F32(inst); - case Opcode::V_MAX3_U32: - return V_MAX3_U32(false, inst); - case Opcode::V_MAX3_I32: - return V_MAX_U32(true, inst); - case Opcode::V_TRUNC_F32: - return V_TRUNC_F32(inst); - case Opcode::V_CEIL_F32: - return V_CEIL_F32(inst); - case Opcode::V_MUL_LEGACY_F32: - return V_MUL_F32(inst); - case Opcode::V_MAC_LEGACY_F32: - return V_MAC_F32(inst); - case Opcode::V_MAD_LEGACY_F32: - return V_MAD_F32(inst); - case Opcode::V_MAX_LEGACY_F32: - return V_MAX_F32(inst, true); - case Opcode::V_RSQ_LEGACY_F32: - case Opcode::V_RSQ_CLAMP_F32: - return V_RSQ_F32(inst); - case Opcode::V_RCP_IFLAG_F32: - return V_RCP_F32(inst); + case Opcode::V_CMP_NGE_F32: + return V_CMP_F32(ConditionOp::LT, false, inst); + case Opcode::V_CMP_NGT_F32: + return V_CMP_F32(ConditionOp::LE, false, inst); + case Opcode::V_CMP_NLE_F32: + return V_CMP_F32(ConditionOp::GT, false, inst); + case Opcode::V_CMP_NEQ_F32: + return V_CMP_F32(ConditionOp::LG, false, inst); + case Opcode::V_CMP_NLT_F32: + return V_CMP_F32(ConditionOp::GE, false, inst); + // V_CMPX_{OP16}_F32 case Opcode::V_CMPX_F_F32: return V_CMP_F32(ConditionOp::F, true, inst); case Opcode::V_CMPX_LT_F32: @@ -278,19 +238,52 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_CMP_F32(ConditionOp::GE, true, inst); case Opcode::V_CMPX_TRU_F32: return V_CMP_F32(ConditionOp::TRU, true, inst); - case Opcode::V_CMP_CLASS_F32: - return V_CMP_CLASS_F32(inst); - case Opcode::V_CMP_LE_U32: - return V_CMP_U32(ConditionOp::LE, false, false, inst); - case Opcode::V_CMP_GT_I32: - return V_CMP_U32(ConditionOp::GT, true, false, inst); + // V_CMP_{OP8}_I32 case Opcode::V_CMP_LT_I32: return V_CMP_U32(ConditionOp::LT, true, false, inst); - case Opcode::V_CMPX_GT_I32: - return V_CMP_U32(ConditionOp::GT, true, true, inst); + case Opcode::V_CMP_EQ_I32: + return V_CMP_U32(ConditionOp::EQ, true, false, inst); + case Opcode::V_CMP_LE_I32: + return V_CMP_U32(ConditionOp::LE, true, false, inst); + case Opcode::V_CMP_GT_I32: + return V_CMP_U32(ConditionOp::GT, true, false, inst); + case Opcode::V_CMP_NE_I32: + return V_CMP_U32(ConditionOp::LG, true, false, inst); + case Opcode::V_CMP_GE_I32: + return V_CMP_U32(ConditionOp::GE, true, false, inst); + case Opcode::V_CMPX_LE_I32: + return V_CMP_U32(ConditionOp::LE, true, true, inst); + + // V_CMPX_{OP8}_I32 case Opcode::V_CMPX_LT_I32: return V_CMP_U32(ConditionOp::LT, true, true, inst); + case Opcode::V_CMPX_EQ_I32: + return V_CMP_U32(ConditionOp::EQ, true, true, inst); + case Opcode::V_CMPX_GT_I32: + return V_CMP_U32(ConditionOp::GT, true, true, inst); + case Opcode::V_CMPX_LG_I32: + return V_CMP_U32(ConditionOp::LG, true, true, inst); + + // V_CMP_{OP8}_U32 + case Opcode::V_CMP_F_U32: + return V_CMP_U32(ConditionOp::F, false, false, inst); + case Opcode::V_CMP_LT_U32: + return V_CMP_U32(ConditionOp::LT, false, false, inst); + case Opcode::V_CMP_EQ_U32: + return V_CMP_U32(ConditionOp::EQ, false, false, inst); + case Opcode::V_CMP_LE_U32: + return V_CMP_U32(ConditionOp::LE, false, false, inst); + case Opcode::V_CMP_GT_U32: + return V_CMP_U32(ConditionOp::GT, false, false, inst); + case Opcode::V_CMP_NE_U32: + return V_CMP_U32(ConditionOp::LG, false, false, inst); + case Opcode::V_CMP_GE_U32: + return V_CMP_U32(ConditionOp::GE, false, false, inst); + case Opcode::V_CMP_TRU_U32: + return V_CMP_U32(ConditionOp::TRU, false, false, inst); + + // V_CMPX_{OP8}_U32 case Opcode::V_CMPX_F_U32: return V_CMP_U32(ConditionOp::F, false, true, inst); case Opcode::V_CMPX_LT_U32: @@ -307,103 +300,171 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_CMP_U32(ConditionOp::GE, false, true, inst); case Opcode::V_CMPX_TRU_U32: return V_CMP_U32(ConditionOp::TRU, false, true, inst); - case Opcode::V_CMPX_LG_I32: - return V_CMP_U32(ConditionOp::LG, true, true, inst); - case Opcode::V_CMPX_EQ_I32: - return V_CMP_U32(ConditionOp::EQ, true, true, inst); - case Opcode::V_CMPX_LE_I32: - return V_CMP_U32(ConditionOp::LE, true, true, inst); + // V_CMP_{OP8}_U64 + case Opcode::V_CMP_NE_U64: + return V_CMP_NE_U64(inst); - case Opcode::V_MBCNT_LO_U32_B32: - return V_MBCNT_U32_B32(true, inst); - case Opcode::V_MBCNT_HI_U32_B32: - return V_MBCNT_U32_B32(false, inst); - case Opcode::V_MOVRELS_B32: - return V_MOVRELS_B32(inst); - case Opcode::V_MOVRELD_B32: - return V_MOVRELD_B32(inst); - case Opcode::V_MOVRELSD_B32: - return V_MOVRELSD_B32(inst); + case Opcode::V_CMP_CLASS_F32: + return V_CMP_CLASS_F32(inst); + + // VOP3a + case Opcode::V_MAD_LEGACY_F32: + return V_MAD_F32(inst); + case Opcode::V_MAD_F32: + return V_MAD_F32(inst); + case Opcode::V_MAD_I32_I24: + return V_MAD_I32_I24(inst); + case Opcode::V_MAD_U32_U24: + return V_MAD_U32_U24(inst); + case Opcode::V_CUBEID_F32: + return V_CUBEID_F32(inst); + case Opcode::V_CUBESC_F32: + return V_CUBESC_F32(inst); + case Opcode::V_CUBETC_F32: + return V_CUBETC_F32(inst); + case Opcode::V_CUBEMA_F32: + return V_CUBEMA_F32(inst); + case Opcode::V_BFE_U32: + return V_BFE_U32(false, inst); + case Opcode::V_BFE_I32: + return V_BFE_U32(true, inst); + case Opcode::V_BFI_B32: + return V_BFI_B32(inst); + case Opcode::V_FMA_F32: + return V_FMA_F32(inst); + case Opcode::V_FMA_F64: + return V_FMA_F64(inst); + case Opcode::V_MIN3_F32: + return V_MIN3_F32(inst); + case Opcode::V_MIN3_I32: + return V_MIN3_I32(inst); + case Opcode::V_MAX3_F32: + return V_MAX3_F32(inst); + case Opcode::V_MAX3_I32: + return V_MAX3_U32(true, inst); + case Opcode::V_MAX3_U32: + return V_MAX3_U32(false, inst); + case Opcode::V_MED3_F32: + return V_MED3_F32(inst); + case Opcode::V_MED3_I32: + return V_MED3_I32(inst); + case Opcode::V_SAD_U32: + return V_SAD_U32(inst); + case Opcode::V_CVT_PK_U8_F32: + return V_CVT_PK_U8_F32(inst); + case Opcode::V_LSHL_B64: + return V_LSHL_B64(inst); + case Opcode::V_MUL_F64: + return V_MUL_F64(inst); + case Opcode::V_MAX_F64: + return V_MAX_F64(inst); + case Opcode::V_MUL_LO_U32: + return V_MUL_LO_U32(inst); + case Opcode::V_MUL_HI_U32: + return V_MUL_HI_U32(false, inst); + case Opcode::V_MUL_LO_I32: + return V_MUL_LO_U32(inst); + case Opcode::V_MAD_U64_U32: + return V_MAD_U64_U32(inst); case Opcode::V_NOP: return; - - case Opcode::V_BFM_B32: - return V_BFM_B32(inst); - case Opcode::V_FFBH_U32: - return V_FFBH_U32(inst); default: LogMissingOpcode(inst); } } -void Translator::V_MOV(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[0])); -} - -void Translator::V_SAD(const GcnInst& inst) { - const IR::U32 abs_diff = ir.IAbs(ir.ISub(GetSrc(inst.src[0]), GetSrc(inst.src[1]))); - SetDst(inst.dst[0], ir.IAdd(abs_diff, GetSrc(inst.src[2]))); -} - -void Translator::V_MAC_F32(const GcnInst& inst) { - SetDst(inst.dst[0], ir.FPFma(GetSrc(inst.src[0]), GetSrc(inst.src[1]), - GetSrc(inst.dst[0]))); -} - -void Translator::V_CVT_PKRTZ_F16_F32(const GcnInst& inst) { - const IR::VectorReg dst_reg{inst.dst[0].code}; - const IR::Value vec_f32 = - ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); - ir.SetVectorReg(dst_reg, ir.PackHalf2x16(vec_f32)); -} - -void Translator::V_CVT_F32_F16(const GcnInst& inst) { - const IR::U32 src0 = GetSrc(inst.src[0]); - const IR::U16 src0l = ir.UConvert(16, src0); - SetDst(inst.dst[0], ir.FPConvert(32, ir.BitCast(src0l))); -} - -void Translator::V_CVT_F16_F32(const GcnInst& inst) { - const IR::F32 src0 = GetSrc(inst.src[0]); - const IR::F16 src0fp16 = ir.FPConvert(16, src0); - SetDst(inst.dst[0], ir.UConvert(32, ir.BitCast(src0fp16))); -} - -void Translator::V_MUL_F32(const GcnInst& inst) { - SetDst(inst.dst[0], ir.FPMul(GetSrc(inst.src[0]), GetSrc(inst.src[1]))); -} +// VOP2 void Translator::V_CNDMASK_B32(const GcnInst& inst) { - const IR::VectorReg dst_reg{inst.dst[0].code}; const IR::ScalarReg flag_reg{inst.src[2].code}; const IR::U1 flag = inst.src[2].field == OperandField::ScalarGPR ? ir.GetThreadBitScalarReg(flag_reg) : ir.GetVcc(); const IR::Value result = ir.Select(flag, GetSrc(inst.src[1]), GetSrc(inst.src[0])); - ir.SetVectorReg(dst_reg, IR::U32F32{result}); + SetDst(inst.dst[0], IR::U32F32{result}); } -void Translator::V_OR_B32(bool is_xor, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{ir.GetVectorReg(IR::VectorReg(inst.src[1].code))}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, - is_xor ? ir.BitwiseXor(src0, src1) : IR::U32(ir.BitwiseOr(src0, src1))); +void Translator::V_ADD_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.FPAdd(src0, src1)); } -void Translator::V_AND_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{ir.GetVectorReg(IR::VectorReg(inst.src[1].code))}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.BitwiseAnd(src0, src1)); +void Translator::V_SUB_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.FPSub(src0, src1)); } -void Translator::V_LSHLREV_B32(const GcnInst& inst) { +void Translator::V_SUBREV_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.FPSub(src1, src0)); +} + +void Translator::V_MUL_F32(const GcnInst& inst) { + SetDst(inst.dst[0], ir.FPMul(GetSrc(inst.src[0]), GetSrc(inst.src[1]))); +} + +void Translator::V_MUL_I32_I24(const GcnInst& inst) { + const IR::U32 src0{ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(24), true)}; + const IR::U32 src1{ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(24), true)}; + SetDst(inst.dst[0], ir.IMul(src0, src1)); +} + +void Translator::V_MIN_F32(const GcnInst& inst, bool is_legacy) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.FPMin(src0, src1, is_legacy)); +} + +void Translator::V_MAX_F32(const GcnInst& inst, bool is_legacy) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.FPMax(src0, src1, is_legacy)); +} + +void Translator::V_MIN_I32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.ShiftLeftLogical(src1, ir.BitwiseAnd(src0, ir.Imm32(0x1F)))); + SetDst(inst.dst[0], ir.SMin(src0, src1)); +} + +void Translator::V_MIN_U32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.IMin(src0, src1, false)); +} + +void Translator::V_MAX_U32(bool is_signed, const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.IMax(src0, src1, is_signed)); +} + +void Translator::V_LSHR_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ShiftRightLogical(src0, ir.BitwiseAnd(src1, ir.Imm32(0x1F)))); +} + +void Translator::V_LSHRREV_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ShiftRightLogical(src1, ir.BitwiseAnd(src0, ir.Imm32(0x1F)))); +} + +void Translator::V_ASHR_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ShiftRightArithmetic(src0, ir.BitwiseAnd(src1, ir.Imm32(0x1F)))); +} + +void Translator::V_ASHRREV_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ShiftRightArithmetic(src1, ir.BitwiseAnd(src0, ir.Imm32(0x1F)))); } void Translator::V_LSHL_B32(const GcnInst& inst) { @@ -412,26 +473,98 @@ void Translator::V_LSHL_B32(const GcnInst& inst) { SetDst(inst.dst[0], ir.ShiftLeftLogical(src0, ir.BitwiseAnd(src1, ir.Imm32(0x1F)))); } -void Translator::V_LSHL_B64(const GcnInst& inst) { - const IR::U64 src0{GetSrc64(inst.src[0])}; - const IR::U64 src1{GetSrc64(inst.src[1])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ASSERT_MSG(src0.IsImmediate() && src0.U64() == 0 && src1.IsImmediate() && src1.U64() == 0, - "V_LSHL_B64 with non-zero src0 or src1 is not supported"); - ir.SetVectorReg(dst_reg, ir.Imm32(0)); - ir.SetVectorReg(dst_reg + 1, ir.Imm32(0)); +void Translator::V_LSHLREV_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ShiftLeftLogical(src1, ir.BitwiseAnd(src0, ir.Imm32(0x1F)))); +} + +void Translator::V_AND_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{ir.GetVectorReg(IR::VectorReg(inst.src[1].code))}; + SetDst(inst.dst[0], ir.BitwiseAnd(src0, src1)); +} + +void Translator::V_OR_B32(bool is_xor, const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{ir.GetVectorReg(IR::VectorReg(inst.src[1].code))}; + SetDst(inst.dst[0], is_xor ? ir.BitwiseXor(src0, src1) : IR::U32(ir.BitwiseOr(src0, src1))); +} + +void Translator::V_BFM_B32(const GcnInst& inst) { + // bitmask width + const IR::U32 src0{ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(4))}; + // bitmask offset + const IR::U32 src1{ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(4))}; + const IR::U32 ones = ir.ISub(ir.ShiftLeftLogical(ir.Imm32(1), src0), ir.Imm32(1)); + SetDst(inst.dst[0], ir.ShiftLeftLogical(ones, src1)); +} + +void Translator::V_MAC_F32(const GcnInst& inst) { + SetDst(inst.dst[0], ir.FPFma(GetSrc(inst.src[0]), GetSrc(inst.src[1]), + GetSrc(inst.dst[0]))); +} + +void Translator::V_MADMK_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::F32 k{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.FPFma(src0, k, src1)); +} + +void Translator::V_BCNT_U32_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.IAdd(ir.BitCount(src0), src1)); +} + +void Translator::V_MBCNT_U32_B32(bool is_low, const GcnInst& inst) { + if (!is_low) { + // v_mbcnt_hi_u32_b32 v2, -1, 0 + if (inst.src[0].field == OperandField::SignedConstIntNeg && inst.src[0].code == 193 && + inst.src[1].field == OperandField::ConstZero) { + return; + } + // v_mbcnt_hi_u32_b32 vX, exec_hi, 0 + if (inst.src[0].field == OperandField::ExecHi && + inst.src[1].field == OperandField::ConstZero) { + return; + } + } else { + // v_mbcnt_lo_u32_b32 v2, -1, vX + // used combined with above to fetch lane id in non-compute stages + if (inst.src[0].field == OperandField::SignedConstIntNeg && inst.src[0].code == 193) { + SetDst(inst.dst[0], ir.LaneId()); + } + // v_mbcnt_lo_u32_b32 v20, exec_lo, vX + // used combined in above for append buffer indexing. + if (inst.src[0].field == OperandField::ExecLo) { + SetDst(inst.dst[0], ir.Imm32(0)); + } + } } void Translator::V_ADD_I32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{ir.GetVectorReg(IR::VectorReg(inst.src[1].code))}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.IAdd(src0, src1)); + SetDst(inst.dst[0], ir.IAdd(src0, src1)); // TODO: Carry } -void Translator::V_ADDC_U32(const GcnInst& inst) { +void Translator::V_SUB_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ISub(src0, src1)); +} +void Translator::V_SUBREV_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.ISub(src1, src0)); + // TODO: Carry-out +} + +void Translator::V_ADDC_U32(const GcnInst& inst) { const auto src0 = GetSrc(inst.src[0]); const auto src1 = GetSrc(inst.src[1]); @@ -451,8 +584,7 @@ void Translator::V_ADDC_U32(const GcnInst& inst) { const IR::U32 scarry = IR::U32{ir.Select(carry, ir.Imm32(1), ir.Imm32(0))}; const IR::U32 result = ir.IAdd(ir.IAdd(src0, src1), scarry); - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, result); + SetDst(inst.dst[0], result); const IR::U1 less_src0 = ir.ILessThan(result, src0, false); const IR::U1 less_src1 = ir.ILessThan(result, src1, false); @@ -460,73 +592,143 @@ void Translator::V_ADDC_U32(const GcnInst& inst) { ir.SetVcc(did_overflow); } +void Translator::V_LDEXP_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.FPLdexp(src0, src1)); +} + +void Translator::V_CVT_PKNORM_U16_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::U32 dst0 = ir.ConvertFToU(32, ir.FPMul(src0, ir.Imm32(65535.f))); + const IR::U32 dst1 = ir.ConvertFToU(32, ir.FPMul(src1, ir.Imm32(65535.f))); + const IR::VectorReg dst_reg{inst.dst[0].code}; + ir.SetVectorReg(dst_reg, ir.BitFieldInsert(dst0, dst1, ir.Imm32(16), ir.Imm32(16))); +} + +void Translator::V_CVT_PKRTZ_F16_F32(const GcnInst& inst) { + const IR::Value vec_f32 = + ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); + SetDst(inst.dst[0], ir.PackHalf2x16(vec_f32)); +} + +// VOP1 + +void Translator::V_MOV(const GcnInst& inst) { + SetDst(inst.dst[0], GetSrc(inst.src[0])); +} + +void Translator::V_CVT_I32_F64(const GcnInst& inst) { + const IR::F64 src0{GetSrc64(inst.src[0])}; + SetDst(inst.dst[0], ir.ConvertFToS(32, src0)); +} + +void Translator::V_CVT_F64_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + SetDst64(inst.dst[0], ir.ConvertSToF(64, 32, src0)); +} + void Translator::V_CVT_F32_I32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.ConvertSToF(32, 32, src0)); + SetDst(inst.dst[0], ir.ConvertSToF(32, 32, src0)); } void Translator::V_CVT_F32_U32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.ConvertUToF(32, 32, src0)); + SetDst(inst.dst[0], ir.ConvertUToF(32, 32, src0)); } -void Translator::V_MAD_F32(const GcnInst& inst) { +void Translator::V_CVT_U32_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::F32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.FPFma(src0, src1, src2)); + SetDst(inst.dst[0], ir.ConvertFToU(32, src0)); } -void Translator::V_FRACT_F32(const GcnInst& inst) { +void Translator::V_CVT_I32_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.Fract(src0)); + SetDst(inst.dst[0], ir.ConvertFToS(32, src0)); } -void Translator::V_ADD_F32(const GcnInst& inst) { +void Translator::V_CVT_F16_F32(const GcnInst& inst) { + const IR::F32 src0 = GetSrc(inst.src[0]); + const IR::F16 src0fp16 = ir.FPConvert(16, src0); + SetDst(inst.dst[0], ir.UConvert(32, ir.BitCast(src0fp16))); +} + +void Translator::V_CVT_F32_F16(const GcnInst& inst) { + const IR::U32 src0 = GetSrc(inst.src[0]); + const IR::U16 src0l = ir.UConvert(16, src0); + SetDst(inst.dst[0], ir.FPConvert(32, ir.BitCast(src0l))); +} + +void Translator::V_CVT_RPI_I32_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.FPAdd(src0, src1)); + SetDst(inst.dst[0], ir.ConvertFToI(32, true, ir.FPFloor(ir.FPAdd(src0, ir.Imm32(0.5f))))); +} + +void Translator::V_CVT_FLR_I32_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.ConvertFToI(32, true, ir.FPFloor(src0))); } void Translator::V_CVT_OFF_F32_I4(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; ASSERT(src0.IsImmediate()); static constexpr std::array IntToFloat = { 0.0f, 0.0625f, 0.1250f, 0.1875f, 0.2500f, 0.3125f, 0.3750f, 0.4375f, -0.5000f, -0.4375f, -0.3750f, -0.3125f, -0.2500f, -0.1875f, -0.1250f, -0.0625f}; - ir.SetVectorReg(dst_reg, ir.Imm32(IntToFloat[src0.U32() & 0xF])); + SetDst(inst.dst[0], ir.Imm32(IntToFloat[src0.U32() & 0xF])); } -void Translator::V_MED3_F32(const GcnInst& inst) { +void Translator::V_CVT_F32_F64(const GcnInst& inst) { + const IR::F64 src0{GetSrc64(inst.src[0])}; + SetDst(inst.dst[0], ir.FPConvert(32, src0)); +} + +void Translator::V_CVT_F64_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::F32 src2{GetSrc(inst.src[2])}; - const IR::F32 mmx = ir.FPMin(ir.FPMax(src0, src1), src2); - SetDst(inst.dst[0], ir.FPMax(ir.FPMin(src0, src1), mmx)); + SetDst64(inst.dst[0], ir.FPConvert(64, src0)); } -void Translator::V_MED3_I32(bool is_signed, const GcnInst& inst) { +void Translator::V_CVT_F32_UBYTE(u32 index, const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 src2{GetSrc(inst.src[2])}; - const IR::U32 mmx = ir.IMin(ir.IMax(src0, src1, is_signed), src2, is_signed); - SetDst(inst.dst[0], ir.IMax(ir.IMin(src0, src1, is_signed), mmx, is_signed)); + const IR::U32 byte = ir.BitFieldExtract(src0, ir.Imm32(8 * index), ir.Imm32(8)); + SetDst(inst.dst[0], ir.ConvertUToF(32, 32, byte)); +} + +void Translator::V_FRACT_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.Fract(src0)); +} + +void Translator::V_TRUNC_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPTrunc(src0)); +} + +void Translator::V_CEIL_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPCeil(src0)); +} + +void Translator::V_RNDNE_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPRoundEven(src0)); } void Translator::V_FLOOR_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.FPFloor(src0)); + SetDst(inst.dst[0], ir.FPFloor(src0)); } -void Translator::V_SUB_F32(const GcnInst& inst) { +void Translator::V_EXP_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.FPSub(src0, src1)); + SetDst(inst.dst[0], ir.FPExp2(src0)); +} + +void Translator::V_LOG_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPLog2(src0)); } void Translator::V_RCP_F32(const GcnInst& inst) { @@ -534,13 +736,84 @@ void Translator::V_RCP_F32(const GcnInst& inst) { SetDst(inst.dst[0], ir.FPRecip(src0)); } -void Translator::V_FMA_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::F32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.FPFma(src0, src1, src2)); +void Translator::V_RCP_F64(const GcnInst& inst) { + const IR::F64 src0{GetSrc64(inst.src[0])}; + SetDst64(inst.dst[0], ir.FPRecip(src0)); } +void Translator::V_RSQ_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPRecipSqrt(src0)); +} + +void Translator::V_SQRT_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPSqrt(src0)); +} + +void Translator::V_SIN_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPSin(src0)); +} + +void Translator::V_COS_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FPCos(src0)); +} + +void Translator::V_NOT_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.BitwiseNot(src0)); +} + +void Translator::V_BFREV_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.BitReverse(src0)); +} + +void Translator::V_FFBH_U32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + // Gcn wants the MSB position counting from the left, but SPIR-V counts from the rightmost (LSB) + // position + const IR::U32 msb_pos = ir.FindUMsb(src0); + const IR::U32 pos_from_left = ir.ISub(ir.Imm32(31), msb_pos); + // Select 0xFFFFFFFF if src0 was 0 + const IR::U1 cond = ir.INotEqual(src0, ir.Imm32(0)); + SetDst(inst.dst[0], IR::U32{ir.Select(cond, pos_from_left, ir.Imm32(~0U))}); +} + +void Translator::V_FFBL_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + SetDst(inst.dst[0], ir.FindILsb(src0)); +} + +void Translator::V_MOVRELD_B32(const GcnInst& inst) { + const IR::U32 src_val{GetSrc(inst.src[0])}; + u32 dst_vgprno = inst.dst[0].code - static_cast(IR::VectorReg::V0); + IR::U32 m0 = ir.GetM0(); + + VMovRelDHelper(dst_vgprno, src_val, m0); +} + +void Translator::V_MOVRELS_B32(const GcnInst& inst) { + u32 src_vgprno = inst.src[0].code - static_cast(IR::VectorReg::V0); + const IR::U32 m0 = ir.GetM0(); + + const IR::U32 src_val = VMovRelSHelper(src_vgprno, m0); + SetDst(inst.dst[0], src_val); +} + +void Translator::V_MOVRELSD_B32(const GcnInst& inst) { + u32 src_vgprno = inst.src[0].code - static_cast(IR::VectorReg::V0); + u32 dst_vgprno = inst.dst[0].code - static_cast(IR::VectorReg::V0); + IR::U32 m0 = ir.GetM0(); + + const IR::U32 src_val = VMovRelSHelper(src_vgprno, m0); + VMovRelDHelper(dst_vgprno, src_val, m0); +} + +// VOPC + void Translator::V_CMP_F32(ConditionOp op, bool set_exec, const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; const IR::F32 src1{GetSrc(inst.src[1])}; @@ -582,122 +855,6 @@ void Translator::V_CMP_F32(ConditionOp op, bool set_exec, const GcnInst& inst) { } } -void Translator::V_MAX_F32(const GcnInst& inst, bool is_legacy) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.FPMax(src0, src1, is_legacy)); -} - -void Translator::V_MAX_U32(bool is_signed, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IMax(src0, src1, is_signed)); -} - -void Translator::V_RSQ_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPRecipSqrt(src0)); -} - -void Translator::V_SIN_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPSin(src0)); -} - -void Translator::V_LOG_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPLog2(src0)); -} - -void Translator::V_EXP_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPExp2(src0)); -} - -void Translator::V_SQRT_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPSqrt(src0)); -} - -void Translator::V_MIN_F32(const GcnInst& inst, bool is_legacy) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.FPMin(src0, src1, is_legacy)); -} - -void Translator::V_MIN3_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::F32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.FPMin(src0, ir.FPMin(src1, src2))); -} - -void Translator::V_MIN3_I32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.SMin(src0, ir.SMin(src1, src2))); -} - -void Translator::V_MADMK_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::F32 k{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.FPFma(src0, k, src1)); -} - -void Translator::V_CUBEMA_F32(const GcnInst& inst) { - SetDst(inst.dst[0], ir.Imm32(1.f)); -} - -void Translator::V_CUBESC_F32(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[0])); -} - -void Translator::V_CUBETC_F32(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[1])); -} - -void Translator::V_CUBEID_F32(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[2])); -} - -void Translator::V_CVT_U32_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.ConvertFToU(32, src0)); -} - -void Translator::V_SUBREV_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.FPSub(src1, src0)); -} - -void Translator::V_SUBREV_I32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ISub(src1, src0)); - // TODO: Carry-out -} - -void Translator::V_MAD_U64_U32(const GcnInst& inst) { - const auto src0 = GetSrc(inst.src[0]); - const auto src1 = GetSrc(inst.src[1]); - const auto src2 = GetSrc64(inst.src[2]); - - // const IR::U64 mul_result = ir.UConvert(64, ir.IMul(src0, src1)); - const IR::U64 mul_result = - ir.PackUint2x32(ir.CompositeConstruct(ir.IMul(src0, src1), ir.Imm32(0U))); - const IR::U64 sum_result = ir.IAdd(mul_result, src2); - - SetDst64(inst.dst[0], sum_result); - - const IR::U1 less_src0 = ir.ILessThan(sum_result, mul_result, false); - const IR::U1 less_src1 = ir.ILessThan(sum_result, src2, false); - const IR::U1 did_overflow = ir.LogicalOr(less_src0, less_src1); - ir.SetVcc(did_overflow); -} - void Translator::V_CMP_U32(ConditionOp op, bool is_signed, bool set_exec, const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; @@ -736,149 +893,6 @@ void Translator::V_CMP_U32(ConditionOp op, bool is_signed, bool set_exec, const } } -void Translator::V_LSHRREV_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ShiftRightLogical(src1, ir.BitwiseAnd(src0, ir.Imm32(0x1F)))); -} - -void Translator::V_MUL_HI_U32(bool is_signed, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 hi{ir.CompositeExtract(ir.IMulExt(src0, src1, is_signed), 1)}; - SetDst(inst.dst[0], hi); -} - -void Translator::V_SAD_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 src2{GetSrc(inst.src[2])}; - IR::U32 result; - if (src0.IsImmediate() && src0.U32() == 0U) { - result = src1; - } else if (src1.IsImmediate() && src1.U32() == 0U) { - result = src0; - } else { - const IR::U32 max{ir.IMax(src0, src1, false)}; - const IR::U32 min{ir.IMin(src0, src1, false)}; - result = ir.ISub(max, min); - } - SetDst(inst.dst[0], ir.IAdd(result, src2)); -} - -void Translator::V_BFE_U32(bool is_signed, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{ir.BitwiseAnd(GetSrc(inst.src[1]), ir.Imm32(0x1F))}; - const IR::U32 src2{ir.BitwiseAnd(GetSrc(inst.src[2]), ir.Imm32(0x1F))}; - SetDst(inst.dst[0], ir.BitFieldExtract(src0, src1, src2, is_signed)); -} - -void Translator::V_MAD_I32_I24(const GcnInst& inst, bool is_signed) { - const IR::U32 src0{ - ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(24), is_signed)}; - const IR::U32 src1{ - ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(24), is_signed)}; - const IR::U32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.IAdd(ir.IMul(src0, src1), src2)); -} - -void Translator::V_MUL_I32_I24(const GcnInst& inst) { - const IR::U32 src0{ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(24), true)}; - const IR::U32 src1{ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(24), true)}; - SetDst(inst.dst[0], ir.IMul(src0, src1)); -} - -void Translator::V_SUB_I32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ISub(src0, src1)); -} - -void Translator::V_LSHR_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ShiftRightLogical(src0, ir.BitwiseAnd(src1, ir.Imm32(0x1F)))); -} - -void Translator::V_ASHRREV_I32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ShiftRightArithmetic(src1, ir.BitwiseAnd(src0, ir.Imm32(0x1F)))); -} - -void Translator::V_ASHR_I32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ShiftRightArithmetic(src0, ir.BitwiseAnd(src1, ir.Imm32(0x1F)))); -} - -void Translator::V_MAD_U32_U24(const GcnInst& inst) { - V_MAD_I32_I24(inst, false); -} - -void Translator::V_RNDNE_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPRoundEven(src0)); -} - -void Translator::V_BCNT_U32_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IAdd(ir.BitCount(src0), src1)); -} - -void Translator::V_COS_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPCos(src0)); -} - -void Translator::V_MAX3_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::F32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.FPMax(src0, ir.FPMax(src1, src2))); -} - -void Translator::V_MAX3_U32(bool is_signed, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], ir.IMax(src0, ir.IMax(src1, src2, is_signed), is_signed)); -} - -void Translator::V_CVT_I32_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.ConvertFToS(32, src0)); -} - -void Translator::V_MIN_I32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.SMin(src0, src1)); -} - -void Translator::V_MUL_LO_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IMul(src0, src1)); -} - -void Translator::V_TRUNC_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPTrunc(src0)); -} - -void Translator::V_CEIL_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FPCeil(src0)); -} - -void Translator::V_MIN_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IMin(src0, src1, false)); -} - void Translator::V_CMP_NE_U64(const GcnInst& inst) { const auto get_src = [&](const InstOperand& operand) { switch (operand.field) { @@ -908,41 +922,6 @@ void Translator::V_CMP_NE_U64(const GcnInst& inst) { } } -void Translator::V_BFI_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 src2{GetSrc(inst.src[2])}; - SetDst(inst.dst[0], - ir.BitwiseOr(ir.BitwiseAnd(src0, src1), ir.BitwiseAnd(ir.BitwiseNot(src0), src2))); -} - -void Translator::V_NOT_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.BitwiseNot(src0)); -} - -void Translator::V_CVT_F32_UBYTE(u32 index, const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 byte = ir.BitFieldExtract(src0, ir.Imm32(8 * index), ir.Imm32(8)); - SetDst(inst.dst[0], ir.ConvertUToF(32, 32, byte)); -} - -void Translator::V_BFREV_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.BitReverse(src0)); -} - -void Translator::V_LDEXP_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.FPLdexp(src0, src1)); -} - -void Translator::V_CVT_FLR_I32_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.ConvertFToI(32, true, ir.FPFloor(src0))); -} - void Translator::V_CMP_CLASS_F32(const GcnInst& inst) { const IR::F32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; @@ -971,55 +950,205 @@ void Translator::V_CMP_CLASS_F32(const GcnInst& inst) { } } -void Translator::V_FFBL_B32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - SetDst(inst.dst[0], ir.FindILsb(src0)); +// VOP3a + +void Translator::V_MAD_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::F32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.FPFma(src0, src1, src2)); } -void Translator::V_MBCNT_U32_B32(bool is_low, const GcnInst& inst) { - if (!is_low) { - // v_mbcnt_hi_u32_b32 v2, -1, 0 - if (inst.src[0].field == OperandField::SignedConstIntNeg && inst.src[0].code == 193 && - inst.src[1].field == OperandField::ConstZero) { - return; - } - // v_mbcnt_hi_u32_b32 vX, exec_hi, 0 - if (inst.src[0].field == OperandField::ExecHi && - inst.src[1].field == OperandField::ConstZero) { - return; - } +void Translator::V_MAD_I32_I24(const GcnInst& inst, bool is_signed) { + const IR::U32 src0{ + ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(24), is_signed)}; + const IR::U32 src1{ + ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(24), is_signed)}; + const IR::U32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.IAdd(ir.IMul(src0, src1), src2)); +} + +void Translator::V_MAD_U32_U24(const GcnInst& inst) { + V_MAD_I32_I24(inst, false); +} + +void Translator::V_CUBEID_F32(const GcnInst& inst) { + SetDst(inst.dst[0], GetSrc(inst.src[2])); +} + +void Translator::V_CUBESC_F32(const GcnInst& inst) { + SetDst(inst.dst[0], GetSrc(inst.src[0])); +} + +void Translator::V_CUBETC_F32(const GcnInst& inst) { + SetDst(inst.dst[0], GetSrc(inst.src[1])); +} + +void Translator::V_CUBEMA_F32(const GcnInst& inst) { + SetDst(inst.dst[0], ir.Imm32(1.f)); +} + +void Translator::V_BFE_U32(bool is_signed, const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{ir.BitwiseAnd(GetSrc(inst.src[1]), ir.Imm32(0x1F))}; + const IR::U32 src2{ir.BitwiseAnd(GetSrc(inst.src[2]), ir.Imm32(0x1F))}; + SetDst(inst.dst[0], ir.BitFieldExtract(src0, src1, src2, is_signed)); +} + +void Translator::V_BFI_B32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], + ir.BitwiseOr(ir.BitwiseAnd(src0, src1), ir.BitwiseAnd(ir.BitwiseNot(src0), src2))); +} + +void Translator::V_FMA_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::F32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.FPFma(src0, src1, src2)); +} + +void Translator::V_FMA_F64(const GcnInst& inst) { + const IR::F64 src0{GetSrc64(inst.src[0])}; + const IR::F64 src1{GetSrc64(inst.src[1])}; + const IR::F64 src2{GetSrc64(inst.src[2])}; + SetDst64(inst.dst[0], ir.FPFma(src0, src1, src2)); +} + +void Translator::V_MIN3_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::F32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.FPMin(src0, ir.FPMin(src1, src2))); +} + +void Translator::V_MIN3_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.SMin(src0, ir.SMin(src1, src2))); +} + +void Translator::V_MAX3_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::F32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.FPMax(src0, ir.FPMax(src1, src2))); +} + +void Translator::V_MAX3_U32(bool is_signed, const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 src2{GetSrc(inst.src[2])}; + SetDst(inst.dst[0], ir.IMax(src0, ir.IMax(src1, src2, is_signed), is_signed)); +} + +void Translator::V_MED3_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::F32 src1{GetSrc(inst.src[1])}; + const IR::F32 src2{GetSrc(inst.src[2])}; + const IR::F32 mmx = ir.FPMin(ir.FPMax(src0, src1), src2); + SetDst(inst.dst[0], ir.FPMax(ir.FPMin(src0, src1), mmx)); +} + +void Translator::V_MED3_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 src2{GetSrc(inst.src[2])}; + const IR::U32 mmx = ir.SMin(ir.SMax(src0, src1), src2); + SetDst(inst.dst[0], ir.SMax(ir.SMin(src0, src1), mmx)); +} + +void Translator::V_SAD(const GcnInst& inst) { + const IR::U32 abs_diff = ir.IAbs(ir.ISub(GetSrc(inst.src[0]), GetSrc(inst.src[1]))); + SetDst(inst.dst[0], ir.IAdd(abs_diff, GetSrc(inst.src[2]))); +} + +void Translator::V_SAD_U32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 src2{GetSrc(inst.src[2])}; + IR::U32 result; + if (src0.IsImmediate() && src0.U32() == 0U) { + result = src1; + } else if (src1.IsImmediate() && src1.U32() == 0U) { + result = src0; } else { - // v_mbcnt_lo_u32_b32 v2, -1, vX - // used combined with above to fetch lane id in non-compute stages - if (inst.src[0].field == OperandField::SignedConstIntNeg && inst.src[0].code == 193) { - SetDst(inst.dst[0], ir.LaneId()); - } - // v_mbcnt_lo_u32_b32 v20, exec_lo, vX - // used combined in above for append buffer indexing. - if (inst.src[0].field == OperandField::ExecLo) { - SetDst(inst.dst[0], ir.Imm32(0)); - } + const IR::U32 max{ir.IMax(src0, src1, false)}; + const IR::U32 min{ir.IMin(src0, src1, false)}; + result = ir.ISub(max, min); } + SetDst(inst.dst[0], ir.IAdd(result, src2)); } -void Translator::V_BFM_B32(const GcnInst& inst) { - // bitmask width - const IR::U32 src0{ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(4))}; - // bitmask offset - const IR::U32 src1{ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(4))}; - const IR::U32 ones = ir.ISub(ir.ShiftLeftLogical(ir.Imm32(1), src0), ir.Imm32(1)); - SetDst(inst.dst[0], ir.ShiftLeftLogical(ones, src1)); +void Translator::V_CVT_PK_U8_F32(const GcnInst& inst) { + const IR::F32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 src2{GetSrc(inst.src[2])}; + + const IR::U32 value_uint = ir.ConvertFToU(32, src0); + const IR::U32 offset = ir.ShiftLeftLogical(src1, ir.Imm32(3)); + SetDst(inst.dst[0], ir.BitFieldInsert(src2, value_uint, offset, ir.Imm32(8))); } -void Translator::V_FFBH_U32(const GcnInst& inst) { +void Translator::V_LSHL_B64(const GcnInst& inst) { + const IR::U64 src0{GetSrc64(inst.src[0])}; + const IR::U64 src1{GetSrc64(inst.src[1])}; + const IR::VectorReg dst_reg{inst.dst[0].code}; + if (src0.IsImmediate() && src0.U64() == -1) { + ir.SetVectorReg(dst_reg, ir.Imm32(0xFFFFFFFF)); + ir.SetVectorReg(dst_reg + 1, ir.Imm32(0xFFFFFFFF)); + return; + } + ASSERT_MSG(src0.IsImmediate() && src0.U64() == 0 && src1.IsImmediate() && src1.U64() == 0, + "V_LSHL_B64 with non-zero src0 or src1 is not supported"); + ir.SetVectorReg(dst_reg, ir.Imm32(0)); + ir.SetVectorReg(dst_reg + 1, ir.Imm32(0)); +} + +void Translator::V_MUL_F64(const GcnInst& inst) { + const IR::F64 src0{GetSrc64(inst.src[0])}; + const IR::F64 src1{GetSrc64(inst.src[1])}; + SetDst64(inst.dst[0], ir.FPMul(src0, src1)); +} + +void Translator::V_MAX_F64(const GcnInst& inst) { + const IR::F64 src0{GetSrc64(inst.src[0])}; + const IR::F64 src1{GetSrc64(inst.src[1])}; + SetDst64(inst.dst[0], ir.FPMax(src0, src1)); +} + +void Translator::V_MUL_LO_U32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; - // Gcn wants the MSB position counting from the left, but SPIR-V counts from the rightmost (LSB) - // position - const IR::U32 msb_pos = ir.FindUMsb(src0); - const IR::U32 pos_from_left = ir.ISub(ir.Imm32(31), msb_pos); - // Select 0xFFFFFFFF if src0 was 0 - const IR::U1 cond = ir.INotEqual(src0, ir.Imm32(0)); - SetDst(inst.dst[0], IR::U32{ir.Select(cond, pos_from_left, ir.Imm32(~0U))}); + const IR::U32 src1{GetSrc(inst.src[1])}; + SetDst(inst.dst[0], ir.IMul(src0, src1)); +} + +void Translator::V_MUL_HI_U32(bool is_signed, const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 hi{ir.CompositeExtract(ir.IMulExt(src0, src1, is_signed), 1)}; + SetDst(inst.dst[0], hi); +} + +void Translator::V_MAD_U64_U32(const GcnInst& inst) { + const auto src0 = GetSrc(inst.src[0]); + const auto src1 = GetSrc(inst.src[1]); + const auto src2 = GetSrc64(inst.src[2]); + + // const IR::U64 mul_result = ir.UConvert(64, ir.IMul(src0, src1)); + const IR::U64 mul_result = + ir.PackUint2x32(ir.CompositeConstruct(ir.IMul(src0, src1), ir.Imm32(0U))); + const IR::U64 sum_result = ir.IAdd(mul_result, src2); + + SetDst64(inst.dst[0], sum_result); + + const IR::U1 less_src0 = ir.ILessThan(sum_result, mul_result, false); + const IR::U1 less_src1 = ir.ILessThan(sum_result, src2, false); + const IR::U1 did_overflow = ir.LogicalOr(less_src0, less_src1); + ir.SetVcc(did_overflow); } // TODO: add range analysis pass to hopefully put an upper bound on m0, and only select one of @@ -1045,29 +1174,4 @@ void Translator::VMovRelDHelper(u32 dst_vgprno, const IR::U32 src_val, const IR: } } -void Translator::V_MOVRELS_B32(const GcnInst& inst) { - u32 src_vgprno = inst.src[0].code - static_cast(IR::VectorReg::V0); - const IR::U32 m0 = ir.GetM0(); - - const IR::U32 src_val = VMovRelSHelper(src_vgprno, m0); - SetDst(inst.dst[0], src_val); -} - -void Translator::V_MOVRELD_B32(const GcnInst& inst) { - const IR::U32 src_val{GetSrc(inst.src[0])}; - u32 dst_vgprno = inst.dst[0].code - static_cast(IR::VectorReg::V0); - IR::U32 m0 = ir.GetM0(); - - VMovRelDHelper(dst_vgprno, src_val, m0); -} - -void Translator::V_MOVRELSD_B32(const GcnInst& inst) { - u32 src_vgprno = inst.src[0].code - static_cast(IR::VectorReg::V0); - u32 dst_vgprno = inst.dst[0].code - static_cast(IR::VectorReg::V0); - IR::U32 m0 = ir.GetM0(); - - const IR::U32 src_val = VMovRelSHelper(src_vgprno, m0); - VMovRelDHelper(dst_vgprno, src_val, m0); -} - } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/vector_interpolation.cpp b/src/shader_recompiler/frontend/translate/vector_interpolation.cpp index c12ae8f57..431cb2f04 100644 --- a/src/shader_recompiler/frontend/translate/vector_interpolation.cpp +++ b/src/shader_recompiler/frontend/translate/vector_interpolation.cpp @@ -5,22 +5,9 @@ namespace Shader::Gcn { -void Translator::V_INTERP_P2_F32(const GcnInst& inst) { - const IR::VectorReg dst_reg{inst.dst[0].code}; - auto& attr = runtime_info.fs_info.inputs.at(inst.control.vintrp.attr); - const IR::Attribute attrib{IR::Attribute::Param0 + attr.param_index}; - ir.SetVectorReg(dst_reg, ir.GetAttribute(attrib, inst.control.vintrp.chan)); -} - -void Translator::V_INTERP_MOV_F32(const GcnInst& inst) { - const IR::VectorReg dst_reg{inst.dst[0].code}; - auto& attr = runtime_info.fs_info.inputs.at(inst.control.vintrp.attr); - const IR::Attribute attrib{IR::Attribute::Param0 + attr.param_index}; - ir.SetVectorReg(dst_reg, ir.GetAttribute(attrib, inst.control.vintrp.chan)); -} - void Translator::EmitVectorInterpolation(const GcnInst& inst) { switch (inst.opcode) { + // VINTRP case Opcode::V_INTERP_P1_F32: return; case Opcode::V_INTERP_P2_F32: @@ -32,4 +19,18 @@ void Translator::EmitVectorInterpolation(const GcnInst& inst) { } } +// VINTRP + +void Translator::V_INTERP_P2_F32(const GcnInst& inst) { + auto& attr = runtime_info.fs_info.inputs.at(inst.control.vintrp.attr); + const IR::Attribute attrib{IR::Attribute::Param0 + attr.param_index}; + SetDst(inst.dst[0], ir.GetAttribute(attrib, inst.control.vintrp.chan)); +} + +void Translator::V_INTERP_MOV_F32(const GcnInst& inst) { + auto& attr = runtime_info.fs_info.inputs.at(inst.control.vintrp.attr); + const IR::Attribute attrib{IR::Attribute::Param0 + attr.param_index}; + SetDst(inst.dst[0], ir.GetAttribute(attrib, inst.control.vintrp.chan)); +} + } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index f5e2f551b..592908e08 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -7,56 +7,7 @@ namespace Shader::Gcn { void Translator::EmitVectorMemory(const GcnInst& inst) { switch (inst.opcode) { - case Opcode::IMAGE_SAMPLE_LZ_O: - case Opcode::IMAGE_SAMPLE_O: - case Opcode::IMAGE_SAMPLE_C: - case Opcode::IMAGE_SAMPLE_C_LZ: - case Opcode::IMAGE_SAMPLE_LZ: - case Opcode::IMAGE_SAMPLE: - case Opcode::IMAGE_SAMPLE_L: - case Opcode::IMAGE_SAMPLE_C_O: - case Opcode::IMAGE_SAMPLE_B: - case Opcode::IMAGE_SAMPLE_C_LZ_O: - case Opcode::IMAGE_SAMPLE_D: - case Opcode::IMAGE_SAMPLE_CD: - return IMAGE_SAMPLE(inst); - case Opcode::IMAGE_GATHER4_LZ: - case Opcode::IMAGE_GATHER4_C: - case Opcode::IMAGE_GATHER4_C_LZ: - case Opcode::IMAGE_GATHER4_LZ_O: - return IMAGE_GATHER(inst); - case Opcode::IMAGE_ATOMIC_ADD: - return IMAGE_ATOMIC(AtomicOp::Add, inst); - case Opcode::IMAGE_ATOMIC_AND: - return IMAGE_ATOMIC(AtomicOp::And, inst); - case Opcode::IMAGE_ATOMIC_OR: - return IMAGE_ATOMIC(AtomicOp::Or, inst); - case Opcode::IMAGE_ATOMIC_XOR: - return IMAGE_ATOMIC(AtomicOp::Xor, inst); - case Opcode::IMAGE_ATOMIC_UMAX: - return IMAGE_ATOMIC(AtomicOp::Umax, inst); - case Opcode::IMAGE_ATOMIC_SMAX: - return IMAGE_ATOMIC(AtomicOp::Smax, inst); - case Opcode::IMAGE_ATOMIC_UMIN: - return IMAGE_ATOMIC(AtomicOp::Umin, inst); - case Opcode::IMAGE_ATOMIC_SMIN: - return IMAGE_ATOMIC(AtomicOp::Smin, inst); - case Opcode::IMAGE_ATOMIC_INC: - return IMAGE_ATOMIC(AtomicOp::Inc, inst); - case Opcode::IMAGE_ATOMIC_DEC: - return IMAGE_ATOMIC(AtomicOp::Dec, inst); - case Opcode::IMAGE_GET_LOD: - return IMAGE_GET_LOD(inst); - case Opcode::IMAGE_STORE: - case Opcode::IMAGE_STORE_MIP: - return IMAGE_STORE(inst); - case Opcode::IMAGE_LOAD_MIP: - return IMAGE_LOAD(true, inst); - case Opcode::IMAGE_LOAD: - return IMAGE_LOAD(false, inst); - case Opcode::IMAGE_GET_RESINFO: - return IMAGE_GET_RESINFO(inst); - + // MUBUF / MTBUF // Buffer load operations case Opcode::TBUFFER_LOAD_FORMAT_X: return BUFFER_LOAD(1, true, inst); @@ -118,248 +69,109 @@ void Translator::EmitVectorMemory(const GcnInst& inst) { return BUFFER_ATOMIC(AtomicOp::Add, inst); case Opcode::BUFFER_ATOMIC_SWAP: return BUFFER_ATOMIC(AtomicOp::Swap, inst); + case Opcode::BUFFER_ATOMIC_SMIN: + return BUFFER_ATOMIC(AtomicOp::Smin, inst); case Opcode::BUFFER_ATOMIC_UMIN: return BUFFER_ATOMIC(AtomicOp::Umin, inst); + case Opcode::BUFFER_ATOMIC_SMAX: + return BUFFER_ATOMIC(AtomicOp::Smax, inst); case Opcode::BUFFER_ATOMIC_UMAX: return BUFFER_ATOMIC(AtomicOp::Umax, inst); + case Opcode::BUFFER_ATOMIC_AND: + return BUFFER_ATOMIC(AtomicOp::And, inst); + case Opcode::BUFFER_ATOMIC_OR: + return BUFFER_ATOMIC(AtomicOp::Or, inst); + case Opcode::BUFFER_ATOMIC_XOR: + return BUFFER_ATOMIC(AtomicOp::Xor, inst); + case Opcode::BUFFER_ATOMIC_INC: + return BUFFER_ATOMIC(AtomicOp::Inc, inst); + case Opcode::BUFFER_ATOMIC_DEC: + return BUFFER_ATOMIC(AtomicOp::Dec, inst); + + // MIMG + // Image load operations + case Opcode::IMAGE_LOAD: + return IMAGE_LOAD(false, inst); + case Opcode::IMAGE_LOAD_MIP: + return IMAGE_LOAD(true, inst); + + // Buffer store operations + case Opcode::IMAGE_STORE: + return IMAGE_STORE(inst); + + // Image misc operations + case Opcode::IMAGE_GET_RESINFO: + return IMAGE_GET_RESINFO(inst); + + // Image atomic operations + case Opcode::IMAGE_ATOMIC_ADD: + return IMAGE_ATOMIC(AtomicOp::Add, inst); + case Opcode::IMAGE_ATOMIC_SMIN: + return IMAGE_ATOMIC(AtomicOp::Smin, inst); + case Opcode::IMAGE_ATOMIC_UMIN: + return IMAGE_ATOMIC(AtomicOp::Umin, inst); + case Opcode::IMAGE_ATOMIC_SMAX: + return IMAGE_ATOMIC(AtomicOp::Smax, inst); + case Opcode::IMAGE_ATOMIC_UMAX: + return IMAGE_ATOMIC(AtomicOp::Umax, inst); + case Opcode::IMAGE_ATOMIC_AND: + return IMAGE_ATOMIC(AtomicOp::And, inst); + case Opcode::IMAGE_ATOMIC_OR: + return IMAGE_ATOMIC(AtomicOp::Or, inst); + case Opcode::IMAGE_ATOMIC_XOR: + return IMAGE_ATOMIC(AtomicOp::Xor, inst); + case Opcode::IMAGE_ATOMIC_INC: + return IMAGE_ATOMIC(AtomicOp::Inc, inst); + case Opcode::IMAGE_ATOMIC_DEC: + return IMAGE_ATOMIC(AtomicOp::Dec, inst); + + case Opcode::IMAGE_SAMPLE: + case Opcode::IMAGE_SAMPLE_D: + case Opcode::IMAGE_SAMPLE_L: + case Opcode::IMAGE_SAMPLE_B: + case Opcode::IMAGE_SAMPLE_LZ: + case Opcode::IMAGE_SAMPLE_C: + case Opcode::IMAGE_SAMPLE_C_LZ: + case Opcode::IMAGE_SAMPLE_O: + case Opcode::IMAGE_SAMPLE_L_O: + case Opcode::IMAGE_SAMPLE_LZ_O: + case Opcode::IMAGE_SAMPLE_C_O: + case Opcode::IMAGE_SAMPLE_C_LZ_O: + case Opcode::IMAGE_SAMPLE_CD: + return IMAGE_SAMPLE(inst); + + // Image gather operations + case Opcode::IMAGE_GATHER4_LZ: + case Opcode::IMAGE_GATHER4_C: + case Opcode::IMAGE_GATHER4_C_O: + case Opcode::IMAGE_GATHER4_C_LZ: + case Opcode::IMAGE_GATHER4_LZ_O: + return IMAGE_GATHER(inst); + + // Image misc operations + case Opcode::IMAGE_GET_LOD: + return IMAGE_GET_LOD(inst); + default: LogMissingOpcode(inst); } } -void Translator::IMAGE_GET_RESINFO(const GcnInst& inst) { - IR::VectorReg dst_reg{inst.dst[0].code}; - const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; - const auto flags = ImageResFlags(inst.control.mimg.dmask); - const bool has_mips = flags.test(ImageResComponent::MipCount); - const IR::U32 lod = ir.GetVectorReg(IR::VectorReg(inst.src[0].code)); - const IR::Value tsharp = ir.GetScalarReg(tsharp_reg); - const IR::Value size = ir.ImageQueryDimension(tsharp, lod, ir.Imm1(has_mips)); - - if (flags.test(ImageResComponent::Width)) { - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 0)}); - } - if (flags.test(ImageResComponent::Height)) { - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 1)}); - } - if (flags.test(ImageResComponent::Depth)) { - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 2)}); - } - if (has_mips) { - ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 3)}); - } -} - -void Translator::IMAGE_SAMPLE(const GcnInst& inst) { - const auto& mimg = inst.control.mimg; - IR::VectorReg addr_reg{inst.src[0].code}; - IR::VectorReg dest_reg{inst.dst[0].code}; - const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; - const IR::ScalarReg sampler_reg{inst.src[3].code * 4}; - const auto flags = MimgModifierFlags(mimg.mod); - - // Load first dword of T# and S#. We will use them as the handle that will guide resource - // tracking pass where to read the sharps. This will later also get patched to the SPIRV texture - // binding index. - const IR::Value handle = - ir.CompositeConstruct(ir.GetScalarReg(tsharp_reg), ir.GetScalarReg(sampler_reg)); - - // Load first address components as denoted in 8.2.4 VGPR Usage Sea Islands Series Instruction - // Set Architecture - const IR::U32 offset = - flags.test(MimgModifier::Offset) ? ir.GetVectorReg(addr_reg++) : IR::U32{}; - const IR::F32 bias = - flags.test(MimgModifier::LodBias) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; - const IR::F32 dref = - flags.test(MimgModifier::Pcf) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; - const IR::Value derivatives = [&] -> IR::Value { - if (!flags.test(MimgModifier::Derivative)) { - return {}; - } - addr_reg = addr_reg + 4; - return ir.CompositeConstruct( - ir.GetVectorReg(addr_reg - 4), ir.GetVectorReg(addr_reg - 3), - ir.GetVectorReg(addr_reg - 2), ir.GetVectorReg(addr_reg - 1)); - }(); - - // Now we can load body components as noted in Table 8.9 Image Opcodes with Sampler - // Since these are at most 4 dwords, we load them into a single uvec4 and place them - // in coords field of the instruction. Then the resource tracking pass will patch the - // IR instruction to fill in lod_clamp field. - const IR::Value body = ir.CompositeConstruct( - ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), - ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); - - // Derivatives are tricky because their number depends on the texture type which is located in - // T#. We don't have access to T# though until resource tracking pass. For now assume if - // derivatives are present, that a 2D image is bound. - const bool has_derivatives = flags.test(MimgModifier::Derivative); - const bool explicit_lod = flags.any(MimgModifier::Level0, MimgModifier::Lod); - - IR::TextureInstInfo info{}; - info.is_depth.Assign(flags.test(MimgModifier::Pcf)); - info.has_bias.Assign(flags.test(MimgModifier::LodBias)); - info.has_lod_clamp.Assign(flags.test(MimgModifier::LodClamp)); - info.force_level0.Assign(flags.test(MimgModifier::Level0)); - info.has_offset.Assign(flags.test(MimgModifier::Offset)); - info.explicit_lod.Assign(explicit_lod); - info.has_derivatives.Assign(has_derivatives); - - // Issue IR instruction, leaving unknown fields blank to patch later. - const IR::Value texel = [&]() -> IR::Value { - if (has_derivatives) { - return ir.ImageGradient(handle, body, derivatives, offset, {}, info); - } - if (!flags.test(MimgModifier::Pcf)) { - if (explicit_lod) { - return ir.ImageSampleExplicitLod(handle, body, offset, info); - } else { - return ir.ImageSampleImplicitLod(handle, body, bias, offset, info); - } - } - if (explicit_lod) { - return ir.ImageSampleDrefExplicitLod(handle, body, dref, offset, info); - } - return ir.ImageSampleDrefImplicitLod(handle, body, dref, bias, offset, info); - }(); - - for (u32 i = 0; i < 4; i++) { - if (((mimg.dmask >> i) & 1) == 0) { - continue; - } - IR::F32 value; - if (flags.test(MimgModifier::Pcf)) { - value = i < 3 ? IR::F32{texel} : ir.Imm32(1.0f); - } else { - value = IR::F32{ir.CompositeExtract(texel, i)}; - } - ir.SetVectorReg(dest_reg++, value); - } -} - -void Translator::IMAGE_GATHER(const GcnInst& inst) { - const auto& mimg = inst.control.mimg; - if (mimg.da) { - LOG_WARNING(Render_Vulkan, "Image instruction declares an array"); - } - - IR::VectorReg addr_reg{inst.src[0].code}; - IR::VectorReg dest_reg{inst.dst[0].code}; - const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; - const IR::ScalarReg sampler_reg{inst.src[3].code * 4}; - const auto flags = MimgModifierFlags(mimg.mod); - - // Load first dword of T# and S#. We will use them as the handle that will guide resource - // tracking pass where to read the sharps. This will later also get patched to the SPIRV texture - // binding index. - const IR::Value handle = - ir.CompositeConstruct(ir.GetScalarReg(tsharp_reg), ir.GetScalarReg(sampler_reg)); - - // Load first address components as denoted in 8.2.4 VGPR Usage Sea Islands Series Instruction - // Set Architecture - const IR::Value offset = - flags.test(MimgModifier::Offset) ? ir.GetVectorReg(addr_reg++) : IR::Value{}; - const IR::F32 bias = - flags.test(MimgModifier::LodBias) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; - const IR::F32 dref = - flags.test(MimgModifier::Pcf) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; - - // Derivatives are tricky because their number depends on the texture type which is located in - // T#. We don't have access to T# though until resource tracking pass. For now assume no - // derivatives are present, otherwise we don't know where coordinates are placed in the address - // stream. - ASSERT_MSG(!flags.test(MimgModifier::Derivative), "Derivative image instruction"); - - // Now we can load body components as noted in Table 8.9 Image Opcodes with Sampler - // Since these are at most 4 dwords, we load them into a single uvec4 and place them - // in coords field of the instruction. Then the resource tracking pass will patch the - // IR instruction to fill in lod_clamp field. - const IR::Value body = ir.CompositeConstruct( - ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), - ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); - - const bool explicit_lod = flags.any(MimgModifier::Level0, MimgModifier::Lod); - - IR::TextureInstInfo info{}; - info.is_depth.Assign(flags.test(MimgModifier::Pcf)); - info.has_bias.Assign(flags.test(MimgModifier::LodBias)); - info.has_lod_clamp.Assign(flags.test(MimgModifier::LodClamp)); - info.force_level0.Assign(flags.test(MimgModifier::Level0)); - info.has_offset.Assign(flags.test(MimgModifier::Offset)); - // info.explicit_lod.Assign(explicit_lod); - info.gather_comp.Assign(std::bit_width(mimg.dmask) - 1); - - // Issue IR instruction, leaving unknown fields blank to patch later. - const IR::Value texel = [&]() -> IR::Value { - const IR::F32 lod = flags.test(MimgModifier::Level0) ? ir.Imm32(0.f) : IR::F32{}; - if (!flags.test(MimgModifier::Pcf)) { - return ir.ImageGather(handle, body, offset, info); - } - ASSERT(mimg.dmask & 1); // should be always 1st (R) component - return ir.ImageGatherDref(handle, body, offset, dref, info); - }(); - - // For gather4 instructions dmask selects which component to read and must have - // only one bit set to 1 - ASSERT_MSG(std::popcount(mimg.dmask) == 1, "Unexpected bits in gather dmask"); - for (u32 i = 0; i < 4; i++) { - const IR::F32 value = IR::F32{ir.CompositeExtract(texel, i)}; - ir.SetVectorReg(dest_reg++, value); - } -} - -void Translator::IMAGE_LOAD(bool has_mip, const GcnInst& inst) { - const auto& mimg = inst.control.mimg; - IR::VectorReg addr_reg{inst.src[0].code}; - IR::VectorReg dest_reg{inst.dst[0].code}; - const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; - - const IR::Value handle = ir.GetScalarReg(tsharp_reg); - const IR::Value body = - ir.CompositeConstruct(ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), - ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); - - IR::TextureInstInfo info{}; - info.explicit_lod.Assign(has_mip); - const IR::Value texel = ir.ImageFetch(handle, body, {}, {}, {}, info); - - for (u32 i = 0; i < 4; i++) { - if (((mimg.dmask >> i) & 1) == 0) { - continue; - } - IR::F32 value = IR::F32{ir.CompositeExtract(texel, i)}; - ir.SetVectorReg(dest_reg++, value); - } -} - -void Translator::IMAGE_STORE(const GcnInst& inst) { - const auto& mimg = inst.control.mimg; - IR::VectorReg addr_reg{inst.src[0].code}; - IR::VectorReg data_reg{inst.dst[0].code}; - const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; - - const IR::Value handle = ir.GetScalarReg(tsharp_reg); - const IR::Value body = - ir.CompositeConstruct(ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), - ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); - - boost::container::static_vector comps; - for (u32 i = 0; i < 4; i++) { - if (((mimg.dmask >> i) & 1) == 0) { - comps.push_back(ir.Imm32(0.f)); - continue; - } - comps.push_back(ir.GetVectorReg(data_reg++)); - } - const IR::Value value = ir.CompositeConstruct(comps[0], comps[1], comps[2], comps[3]); - ir.ImageWrite(handle, body, value, {}); -} - void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) { const auto& mtbuf = inst.control.mtbuf; + const bool is_ring = mtbuf.glc && mtbuf.slc; const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; + const IR::Value soffset{GetSrc(inst.src[3])}; + if (info.stage != Stage::Geometry) { + ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, + "Non immediate offset not supported"); + } + const IR::Value address = [&] -> IR::Value { + if (is_ring) { + return ir.CompositeConstruct(ir.GetVectorReg(vaddr), soffset); + } if (mtbuf.idxen && mtbuf.offen) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); } @@ -368,13 +180,12 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) } return {}; }(); - const IR::Value soffset{GetSrc(inst.src[3])}; - ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - IR::BufferInstInfo info{}; - info.index_enable.Assign(mtbuf.idxen); - info.offset_enable.Assign(mtbuf.offen); - info.inst_offset.Assign(mtbuf.offset); + IR::BufferInstInfo buffer_info{}; + buffer_info.index_enable.Assign(mtbuf.idxen); + buffer_info.offset_enable.Assign(mtbuf.offen); + buffer_info.inst_offset.Assign(mtbuf.offset); + buffer_info.ring_access.Assign(is_ring); if (is_typed) { const auto dmft = static_cast(mtbuf.dfmt); const auto nfmt = static_cast(mtbuf.nfmt); @@ -387,7 +198,7 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - const IR::Value value = ir.LoadBuffer(num_dwords, handle, address, info); + const IR::Value value = ir.LoadBuffer(num_dwords, handle, address, buffer_info); const IR::VectorReg dst_reg{inst.src[1].code}; if (num_dwords == 1) { ir.SetVectorReg(dst_reg, IR::U32{value}); @@ -427,9 +238,20 @@ void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) { void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst) { const auto& mtbuf = inst.control.mtbuf; + const bool is_ring = mtbuf.glc && mtbuf.slc; const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; - const IR::Value address = [&] -> IR::Value { + const IR::Value soffset{GetSrc(inst.src[3])}; + + if (info.stage != Stage::Export && info.stage != Stage::Geometry) { + ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, + "Non immediate offset not supported"); + } + + IR::Value address = [&] -> IR::Value { + if (is_ring) { + return ir.CompositeConstruct(ir.GetVectorReg(vaddr), soffset); + } if (mtbuf.idxen && mtbuf.offen) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); } @@ -438,13 +260,12 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst } return {}; }(); - const IR::Value soffset{GetSrc(inst.src[3])}; - ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - IR::BufferInstInfo info{}; - info.index_enable.Assign(mtbuf.idxen); - info.offset_enable.Assign(mtbuf.offen); - info.inst_offset.Assign(mtbuf.offset); + IR::BufferInstInfo buffer_info{}; + buffer_info.index_enable.Assign(mtbuf.idxen); + buffer_info.offset_enable.Assign(mtbuf.offen); + buffer_info.inst_offset.Assign(mtbuf.offset); + buffer_info.ring_access.Assign(is_ring); if (is_typed) { const auto dmft = static_cast(mtbuf.dfmt); const auto nfmt = static_cast(mtbuf.nfmt); @@ -475,7 +296,7 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - ir.StoreBuffer(num_dwords, handle, address, value, info); + ir.StoreBuffer(num_dwords, handle, address, value, buffer_info); } void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) { @@ -573,19 +394,77 @@ void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) { } } -void Translator::IMAGE_GET_LOD(const GcnInst& inst) { +// Image Memory +// MIMG + +void Translator::IMAGE_LOAD(bool has_mip, const GcnInst& inst) { const auto& mimg = inst.control.mimg; - IR::VectorReg dst_reg{inst.dst[0].code}; IR::VectorReg addr_reg{inst.src[0].code}; + IR::VectorReg dest_reg{inst.dst[0].code}; const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; const IR::Value handle = ir.GetScalarReg(tsharp_reg); - const IR::Value body = ir.CompositeConstruct( - ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), - ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); - const IR::Value lod = ir.ImageQueryLod(handle, body, {}); - ir.SetVectorReg(dst_reg++, IR::F32{ir.CompositeExtract(lod, 0)}); - ir.SetVectorReg(dst_reg++, IR::F32{ir.CompositeExtract(lod, 1)}); + const IR::Value body = + ir.CompositeConstruct(ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), + ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); + + IR::TextureInstInfo info{}; + info.explicit_lod.Assign(has_mip); + const IR::Value texel = ir.ImageFetch(handle, body, {}, {}, {}, info); + + for (u32 i = 0; i < 4; i++) { + if (((mimg.dmask >> i) & 1) == 0) { + continue; + } + IR::F32 value = IR::F32{ir.CompositeExtract(texel, i)}; + ir.SetVectorReg(dest_reg++, value); + } +} + +void Translator::IMAGE_STORE(const GcnInst& inst) { + const auto& mimg = inst.control.mimg; + IR::VectorReg addr_reg{inst.src[0].code}; + IR::VectorReg data_reg{inst.dst[0].code}; + const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + + const IR::Value handle = ir.GetScalarReg(tsharp_reg); + const IR::Value body = + ir.CompositeConstruct(ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), + ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); + + boost::container::static_vector comps; + for (u32 i = 0; i < 4; i++) { + if (((mimg.dmask >> i) & 1) == 0) { + comps.push_back(ir.Imm32(0.f)); + continue; + } + comps.push_back(ir.GetVectorReg(data_reg++)); + } + const IR::Value value = ir.CompositeConstruct(comps[0], comps[1], comps[2], comps[3]); + ir.ImageWrite(handle, body, value, {}); +} + +void Translator::IMAGE_GET_RESINFO(const GcnInst& inst) { + IR::VectorReg dst_reg{inst.dst[0].code}; + const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + const auto flags = ImageResFlags(inst.control.mimg.dmask); + const bool has_mips = flags.test(ImageResComponent::MipCount); + const IR::U32 lod = ir.GetVectorReg(IR::VectorReg(inst.src[0].code)); + const IR::Value tsharp = ir.GetScalarReg(tsharp_reg); + const IR::Value size = ir.ImageQueryDimension(tsharp, lod, ir.Imm1(has_mips)); + + if (flags.test(ImageResComponent::Width)) { + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 0)}); + } + if (flags.test(ImageResComponent::Height)) { + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 1)}); + } + if (flags.test(ImageResComponent::Depth)) { + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 2)}); + } + if (has_mips) { + ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 3)}); + } } void Translator::IMAGE_ATOMIC(AtomicOp op, const GcnInst& inst) { @@ -632,4 +511,175 @@ void Translator::IMAGE_ATOMIC(AtomicOp op, const GcnInst& inst) { } } +void Translator::IMAGE_SAMPLE(const GcnInst& inst) { + const auto& mimg = inst.control.mimg; + IR::VectorReg addr_reg{inst.src[0].code}; + IR::VectorReg dest_reg{inst.dst[0].code}; + const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + const IR::ScalarReg sampler_reg{inst.src[3].code * 4}; + const auto flags = MimgModifierFlags(mimg.mod); + + // Load first dword of T# and S#. We will use them as the handle that will guide resource + // tracking pass where to read the sharps. This will later also get patched to the SPIRV texture + // binding index. + const IR::Value handle = + ir.CompositeConstruct(ir.GetScalarReg(tsharp_reg), ir.GetScalarReg(sampler_reg)); + + // Load first address components as denoted in 8.2.4 VGPR Usage Sea Islands Series Instruction + // Set Architecture + const IR::U32 offset = + flags.test(MimgModifier::Offset) ? ir.GetVectorReg(addr_reg++) : IR::U32{}; + const IR::F32 bias = + flags.test(MimgModifier::LodBias) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; + const IR::F32 dref = + flags.test(MimgModifier::Pcf) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; + const IR::Value derivatives = [&] -> IR::Value { + if (!flags.test(MimgModifier::Derivative)) { + return {}; + } + addr_reg = addr_reg + 4; + return ir.CompositeConstruct( + ir.GetVectorReg(addr_reg - 4), ir.GetVectorReg(addr_reg - 3), + ir.GetVectorReg(addr_reg - 2), ir.GetVectorReg(addr_reg - 1)); + }(); + + // Now we can load body components as noted in Table 8.9 Image Opcodes with Sampler + // Since these are at most 4 dwords, we load them into a single uvec4 and place them + // in coords field of the instruction. Then the resource tracking pass will patch the + // IR instruction to fill in lod_clamp field. + const IR::Value body = ir.CompositeConstruct( + ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), + ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); + + // Derivatives are tricky because their number depends on the texture type which is located in + // T#. We don't have access to T# though until resource tracking pass. For now assume if + // derivatives are present, that a 2D image is bound. + const bool has_derivatives = flags.test(MimgModifier::Derivative); + const bool explicit_lod = flags.any(MimgModifier::Level0, MimgModifier::Lod); + + IR::TextureInstInfo info{}; + info.is_depth.Assign(flags.test(MimgModifier::Pcf)); + info.has_bias.Assign(flags.test(MimgModifier::LodBias)); + info.has_lod_clamp.Assign(flags.test(MimgModifier::LodClamp)); + info.force_level0.Assign(flags.test(MimgModifier::Level0)); + info.has_offset.Assign(flags.test(MimgModifier::Offset)); + info.explicit_lod.Assign(explicit_lod); + info.has_derivatives.Assign(has_derivatives); + info.is_array.Assign(mimg.da); + + // Issue IR instruction, leaving unknown fields blank to patch later. + const IR::Value texel = [&]() -> IR::Value { + if (has_derivatives) { + return ir.ImageGradient(handle, body, derivatives, offset, {}, info); + } + if (!flags.test(MimgModifier::Pcf)) { + if (explicit_lod) { + return ir.ImageSampleExplicitLod(handle, body, offset, info); + } else { + return ir.ImageSampleImplicitLod(handle, body, bias, offset, info); + } + } + if (explicit_lod) { + return ir.ImageSampleDrefExplicitLod(handle, body, dref, offset, info); + } + return ir.ImageSampleDrefImplicitLod(handle, body, dref, bias, offset, info); + }(); + + for (u32 i = 0; i < 4; i++) { + if (((mimg.dmask >> i) & 1) == 0) { + continue; + } + IR::F32 value; + if (flags.test(MimgModifier::Pcf)) { + value = i < 3 ? IR::F32{texel} : ir.Imm32(1.0f); + } else { + value = IR::F32{ir.CompositeExtract(texel, i)}; + } + ir.SetVectorReg(dest_reg++, value); + } +} + +void Translator::IMAGE_GATHER(const GcnInst& inst) { + const auto& mimg = inst.control.mimg; + IR::VectorReg addr_reg{inst.src[0].code}; + IR::VectorReg dest_reg{inst.dst[0].code}; + const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + const IR::ScalarReg sampler_reg{inst.src[3].code * 4}; + const auto flags = MimgModifierFlags(mimg.mod); + + // Load first dword of T# and S#. We will use them as the handle that will guide resource + // tracking pass where to read the sharps. This will later also get patched to the SPIRV texture + // binding index. + const IR::Value handle = + ir.CompositeConstruct(ir.GetScalarReg(tsharp_reg), ir.GetScalarReg(sampler_reg)); + + // Load first address components as denoted in 8.2.4 VGPR Usage Sea Islands Series Instruction + // Set Architecture + const IR::Value offset = + flags.test(MimgModifier::Offset) ? ir.GetVectorReg(addr_reg++) : IR::Value{}; + const IR::F32 bias = + flags.test(MimgModifier::LodBias) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; + const IR::F32 dref = + flags.test(MimgModifier::Pcf) ? ir.GetVectorReg(addr_reg++) : IR::F32{}; + + // Derivatives are tricky because their number depends on the texture type which is located in + // T#. We don't have access to T# though until resource tracking pass. For now assume no + // derivatives are present, otherwise we don't know where coordinates are placed in the address + // stream. + ASSERT_MSG(!flags.test(MimgModifier::Derivative), "Derivative image instruction"); + + // Now we can load body components as noted in Table 8.9 Image Opcodes with Sampler + // Since these are at most 4 dwords, we load them into a single uvec4 and place them + // in coords field of the instruction. Then the resource tracking pass will patch the + // IR instruction to fill in lod_clamp field. + const IR::Value body = ir.CompositeConstruct( + ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), + ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); + + const bool explicit_lod = flags.any(MimgModifier::Level0, MimgModifier::Lod); + + IR::TextureInstInfo info{}; + info.is_depth.Assign(flags.test(MimgModifier::Pcf)); + info.has_bias.Assign(flags.test(MimgModifier::LodBias)); + info.has_lod_clamp.Assign(flags.test(MimgModifier::LodClamp)); + info.force_level0.Assign(flags.test(MimgModifier::Level0)); + info.has_offset.Assign(flags.test(MimgModifier::Offset)); + // info.explicit_lod.Assign(explicit_lod); + info.gather_comp.Assign(std::bit_width(mimg.dmask) - 1); + info.is_array.Assign(mimg.da); + + // Issue IR instruction, leaving unknown fields blank to patch later. + const IR::Value texel = [&]() -> IR::Value { + const IR::F32 lod = flags.test(MimgModifier::Level0) ? ir.Imm32(0.f) : IR::F32{}; + if (!flags.test(MimgModifier::Pcf)) { + return ir.ImageGather(handle, body, offset, info); + } + ASSERT(mimg.dmask & 1); // should be always 1st (R) component + return ir.ImageGatherDref(handle, body, offset, dref, info); + }(); + + // For gather4 instructions dmask selects which component to read and must have + // only one bit set to 1 + ASSERT_MSG(std::popcount(mimg.dmask) == 1, "Unexpected bits in gather dmask"); + for (u32 i = 0; i < 4; i++) { + const IR::F32 value = IR::F32{ir.CompositeExtract(texel, i)}; + ir.SetVectorReg(dest_reg++, value); + } +} + +void Translator::IMAGE_GET_LOD(const GcnInst& inst) { + const auto& mimg = inst.control.mimg; + IR::VectorReg dst_reg{inst.dst[0].code}; + IR::VectorReg addr_reg{inst.src[0].code}; + const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + + const IR::Value handle = ir.GetScalarReg(tsharp_reg); + const IR::Value body = ir.CompositeConstruct( + ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), + ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); + const IR::Value lod = ir.ImageQueryLod(handle, body, {}); + ir.SetVectorReg(dst_reg++, IR::F32{ir.CompositeExtract(lod, 0)}); + ir.SetVectorReg(dst_reg++, IR::F32{ir.CompositeExtract(lod, 1)}); +} + } // namespace Shader::Gcn diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index c4e16b7a4..7fc7be753 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -7,6 +7,7 @@ #include #include "common/assert.h" #include "common/types.h" +#include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/ir/attribute.h" #include "shader_recompiler/ir/reg.h" #include "shader_recompiler/ir/type.h" @@ -17,6 +18,8 @@ namespace Shader { static constexpr size_t NumUserDataRegs = 16; +static constexpr size_t MaxUboSize = 65536; +static constexpr size_t MaxUboDwords = MaxUboSize >> 2; enum class TextureType : u32 { Color1D, @@ -41,7 +44,6 @@ struct BufferResource { bool is_written{}; bool IsStorage(AmdGpu::Buffer buffer) const noexcept { - static constexpr size_t MaxUboSize = 65536; return buffer.GetSize() > MaxUboSize || is_written || is_gds_buffer; } @@ -64,9 +66,10 @@ struct ImageResource { u32 dword_offset; AmdGpu::ImageType type; AmdGpu::NumberFormat nfmt; - bool is_storage; - bool is_depth; + bool is_storage{}; + bool is_depth{}; bool is_atomic{}; + bool is_array{}; constexpr AmdGpu::Image GetSharp(const Info& info) const noexcept; }; @@ -84,17 +87,21 @@ struct SamplerResource { using SamplerResourceList = boost::container::small_vector; struct PushData { - static constexpr size_t BufOffsetIndex = 2; + static constexpr u32 BufOffsetIndex = 2; + static constexpr u32 UdRegsIndex = 4; u32 step0; u32 step1; - std::array buf_offsets; + std::array buf_offsets; + std::array ud_regs; void AddOffset(u32 binding, u32 offset) { ASSERT(offset < 256 && binding < buf_offsets.size()); buf_offsets[binding] = offset; } }; +static_assert(sizeof(PushData) <= 128, + "PushData size is greater than minimum size guaranteed by Vulkan spec"); /** * Contains general information generated by the shader recompiler for an input program. @@ -144,6 +151,24 @@ struct Info { AttributeFlags loads{}; AttributeFlags stores{}; + struct UserDataMask { + void Set(IR::ScalarReg reg) noexcept { + mask |= 1 << static_cast(reg); + } + + u32 Index(IR::ScalarReg reg) const noexcept { + const u32 reg_mask = (1 << static_cast(reg)) - 1; + return std::popcount(mask & reg_mask); + } + + u32 NumRegs() const noexcept { + return std::popcount(mask); + } + + u32 mask; + }; + UserDataMask ud_mask{}; + s8 vertex_offset_sgpr = -1; s8 instance_offset_sgpr = -1; @@ -168,8 +193,10 @@ struct Info { bool uses_group_ballot{}; bool uses_shared{}; bool uses_fp16{}; + bool uses_fp64{}; bool uses_step_rates{}; bool translation_failed{}; // indicates that shader has unsupported instructions + u8 mrt_mask{0u}; explicit Info(Stage stage_, ShaderParams params) : stage{stage_}, pgm_hash{params.hash}, pgm_base{params.Base()}, @@ -187,11 +214,24 @@ struct Info { return data; } - size_t NumBindings() const noexcept { - return buffers.size() + texture_buffers.size() + images.size() + samplers.size(); + void PushUd(Backend::Bindings& bnd, PushData& push) const { + u32 mask = ud_mask.mask; + while (mask) { + const u32 index = std::countr_zero(mask); + ASSERT(bnd.user_data < NumUserDataRegs && index < NumUserDataRegs); + mask &= ~(1U << index); + push.ud_regs[bnd.user_data++] = user_data[index]; + } } - [[nodiscard]] std::pair GetDrawOffsets() const noexcept { + void AddBindings(Backend::Bindings& bnd) const { + const auto total_buffers = buffers.size() + texture_buffers.size(); + bnd.buffer += total_buffers; + bnd.unified += total_buffers + images.size() + samplers.size(); + bnd.user_data += ud_mask.NumRegs(); + } + + [[nodiscard]] std::pair GetDrawOffsets() const { u32 vertex_offset = 0; u32 instance_offset = 0; if (vertex_offset_sgpr != -1) { diff --git a/src/shader_recompiler/ir/attribute.cpp b/src/shader_recompiler/ir/attribute.cpp index 540cb8afb..e219dfb64 100644 --- a/src/shader_recompiler/ir/attribute.cpp +++ b/src/shader_recompiler/ir/attribute.cpp @@ -6,14 +6,6 @@ namespace Shader::IR { -bool IsParam(Attribute attribute) noexcept { - return attribute >= Attribute::Param0 && attribute <= Attribute::Param31; -} - -bool IsMrt(Attribute attribute) noexcept { - return attribute >= Attribute::RenderTarget0 && attribute <= Attribute::RenderTarget7; -} - std::string NameOf(Attribute attribute) { switch (attribute) { case Attribute::RenderTarget0: diff --git a/src/shader_recompiler/ir/attribute.h b/src/shader_recompiler/ir/attribute.h index 2c67411ff..0890e88f1 100644 --- a/src/shader_recompiler/ir/attribute.h +++ b/src/shader_recompiler/ir/attribute.h @@ -81,9 +81,17 @@ constexpr size_t NumAttributes = static_cast(Attribute::Max); constexpr size_t NumRenderTargets = 8; constexpr size_t NumParams = 32; -[[nodiscard]] bool IsParam(Attribute attribute) noexcept; +constexpr bool IsPosition(Attribute attribute) noexcept { + return attribute >= Attribute::Position0 && attribute <= Attribute::Position3; +} -[[nodiscard]] bool IsMrt(Attribute attribute) noexcept; +constexpr bool IsParam(Attribute attribute) noexcept { + return attribute >= Attribute::Param0 && attribute <= Attribute::Param31; +} + +constexpr bool IsMrt(Attribute attribute) noexcept { + return attribute >= Attribute::RenderTarget0 && attribute <= Attribute::RenderTarget7; +} [[nodiscard]] std::string NameOf(Attribute attribute); diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 7e52cfb5f..01336c567 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -249,8 +249,8 @@ void IREmitter::SetM0(const U32& value) { Inst(Opcode::SetM0, value); } -F32 IREmitter::GetAttribute(IR::Attribute attribute, u32 comp) { - return Inst(Opcode::GetAttribute, attribute, Imm32(comp)); +F32 IREmitter::GetAttribute(IR::Attribute attribute, u32 comp, u32 index) { + return Inst(Opcode::GetAttribute, attribute, Imm32(comp), Imm32(index)); } U32 IREmitter::GetAttributeU32(IR::Attribute attribute, u32 comp) { @@ -629,6 +629,10 @@ Value IREmitter::UnpackUint2x32(const U64& value) { return Inst(Opcode::UnpackUint2x32, value); } +F64 IREmitter::PackFloat2x32(const Value& vector) { + return Inst(Opcode::PackFloat2x32, vector); +} + U32 IREmitter::PackFloat2x16(const Value& vector) { return Inst(Opcode::PackFloat2x16, vector); } @@ -1055,6 +1059,10 @@ U32 IREmitter::IDiv(const U32& a, const U32& b, bool is_signed) { return Inst(is_signed ? Opcode::SDiv32 : Opcode::UDiv32, a, b); } +U32 IREmitter::IMod(const U32& a, const U32& b, bool is_signed) { + return Inst(is_signed ? Opcode::SMod32 : Opcode::UMod32, a, b); +} + U32U64 IREmitter::INeg(const U32U64& value) { switch (value.Type()) { case Type::U32: @@ -1071,6 +1079,10 @@ U32 IREmitter::IAbs(const U32& value) { } U32U64 IREmitter::ShiftLeftLogical(const U32U64& base, const U32& shift) { + if (shift.IsImmediate() && shift.U32() == 0) { + return base; + } + switch (base.Type()) { case Type::U32: return Inst(Opcode::ShiftLeftLogical32, base, shift); @@ -1082,6 +1094,10 @@ U32U64 IREmitter::ShiftLeftLogical(const U32U64& base, const U32& shift) { } U32U64 IREmitter::ShiftRightLogical(const U32U64& base, const U32& shift) { + if (shift.IsImmediate() && shift.U32() == 0) { + return base; + } + switch (base.Type()) { case Type::U32: return Inst(Opcode::ShiftRightLogical32, base, shift); @@ -1093,6 +1109,10 @@ U32U64 IREmitter::ShiftRightLogical(const U32U64& base, const U32& shift) { } U32U64 IREmitter::ShiftRightArithmetic(const U32U64& base, const U32& shift) { + if (shift.IsImmediate() && shift.U32() == 0) { + return base; + } + switch (base.Type()) { case Type::U32: return Inst(Opcode::ShiftRightArithmetic32, base, shift); @@ -1360,6 +1380,8 @@ U16U32U64 IREmitter::UConvert(size_t result_bitsize, const U16U32U64& value) { switch (value.Type()) { case Type::U16: return Inst(Opcode::ConvertU32U16, value); + default: + break; } default: break; @@ -1380,6 +1402,15 @@ F16F32F64 IREmitter::FPConvert(size_t result_bitsize, const F16F32F64& value) { switch (value.Type()) { case Type::F16: return Inst(Opcode::ConvertF32F16, value); + case Type::F64: + return Inst(Opcode::ConvertF32F64, value); + default: + break; + } + case 64: + switch (value.Type()) { + case Type::F32: + return Inst(Opcode::ConvertF64F32, value); default: break; } @@ -1522,4 +1553,12 @@ void IREmitter::ImageWrite(const Value& handle, const Value& coords, const Value Inst(Opcode::ImageWrite, Flags{info}, handle, coords, color); } +void IREmitter::EmitVertex() { + Inst(Opcode::EmitVertex); +} + +void IREmitter::EmitPrimitive() { + Inst(Opcode::EmitPrimitive); +} + } // namespace Shader::IR diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h index 01e71893c..8657c430b 100644 --- a/src/shader_recompiler/ir/ir_emitter.h +++ b/src/shader_recompiler/ir/ir_emitter.h @@ -78,7 +78,7 @@ public: [[nodiscard]] U1 Condition(IR::Condition cond); - [[nodiscard]] F32 GetAttribute(Attribute attribute, u32 comp = 0); + [[nodiscard]] F32 GetAttribute(Attribute attribute, u32 comp = 0, u32 index = 0); [[nodiscard]] U32 GetAttributeU32(Attribute attribute, u32 comp = 0); void SetAttribute(Attribute attribute, const F32& value, u32 comp = 0); @@ -142,6 +142,8 @@ public: [[nodiscard]] U64 PackUint2x32(const Value& vector); [[nodiscard]] Value UnpackUint2x32(const U64& value); + [[nodiscard]] F64 PackFloat2x32(const Value& vector); + [[nodiscard]] U32 PackFloat2x16(const Value& vector); [[nodiscard]] Value UnpackFloat2x16(const U32& value); @@ -194,6 +196,7 @@ public: [[nodiscard]] Value IMulExt(const U32& a, const U32& b, bool is_signed = false); [[nodiscard]] U32U64 IMul(const U32U64& a, const U32U64& b); [[nodiscard]] U32 IDiv(const U32& a, const U32& b, bool is_signed = false); + [[nodiscard]] U32 IMod(const U32& a, const U32& b, bool is_signed = false); [[nodiscard]] U32U64 INeg(const U32U64& value); [[nodiscard]] U32 IAbs(const U32& value); [[nodiscard]] U32U64 ShiftLeftLogical(const U32U64& base, const U32& shift); @@ -307,6 +310,9 @@ public: void ImageWrite(const Value& handle, const Value& coords, const Value& color, TextureInstInfo info); + void EmitVertex(); + void EmitPrimitive(); + private: IR::Block::iterator insertion_point; diff --git a/src/shader_recompiler/ir/microinstruction.cpp b/src/shader_recompiler/ir/microinstruction.cpp index 601c453d9..8d606a6cc 100644 --- a/src/shader_recompiler/ir/microinstruction.cpp +++ b/src/shader_recompiler/ir/microinstruction.cpp @@ -89,6 +89,8 @@ bool Inst::MayHaveSideEffects() const noexcept { case Opcode::ImageAtomicOr32: case Opcode::ImageAtomicXor32: case Opcode::ImageAtomicExchange32: + case Opcode::EmitVertex: + case Opcode::EmitPrimitive: return true; default: return false; diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 4b922d55b..c69dc90a5 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -24,6 +24,10 @@ OPCODE(Barrier, Void, OPCODE(WorkgroupMemoryBarrier, Void, ) OPCODE(DeviceMemoryBarrier, Void, ) +// Geometry shader specific +OPCODE(EmitVertex, Void, ) +OPCODE(EmitPrimitive, Void, ) + // Shared memory operations OPCODE(LoadSharedU32, U32, U32, ) OPCODE(LoadSharedU64, U32x2, U32, ) @@ -34,9 +38,9 @@ OPCODE(WriteSharedU128, Void, U32, // Shared atomic operations OPCODE(SharedAtomicIAdd32, U32, U32, U32, ) -OPCODE(SharedAtomicSMin32, U32, U32, U32, ) +OPCODE(SharedAtomicSMin32, U32, U32, U32, ) OPCODE(SharedAtomicUMin32, U32, U32, U32, ) -OPCODE(SharedAtomicSMax32, U32, U32, U32, ) +OPCODE(SharedAtomicSMax32, U32, U32, U32, ) OPCODE(SharedAtomicUMax32, U32, U32, U32, ) // Context getters/setters @@ -49,24 +53,24 @@ OPCODE(GetVectorRegister, U32, Vect OPCODE(SetVectorRegister, Void, VectorReg, U32, ) OPCODE(GetGotoVariable, U1, U32, ) OPCODE(SetGotoVariable, Void, U32, U1, ) -OPCODE(GetAttribute, F32, Attribute, U32, ) +OPCODE(GetAttribute, F32, Attribute, U32, U32, ) OPCODE(GetAttributeU32, U32, Attribute, U32, ) OPCODE(SetAttribute, Void, Attribute, F32, U32, ) // Flags -OPCODE(GetScc, U1, Void, ) -OPCODE(GetExec, U1, Void, ) -OPCODE(GetVcc, U1, Void, ) -OPCODE(GetVccLo, U32, Void, ) -OPCODE(GetVccHi, U32, Void, ) -OPCODE(GetM0, U32, Void, ) -OPCODE(SetScc, Void, U1, ) -OPCODE(SetExec, Void, U1, ) -OPCODE(SetVcc, Void, U1, ) -OPCODE(SetSccLo, Void, U32, ) -OPCODE(SetVccLo, Void, U32, ) -OPCODE(SetVccHi, Void, U32, ) -OPCODE(SetM0, Void, U32, ) +OPCODE(GetScc, U1, Void, ) +OPCODE(GetExec, U1, Void, ) +OPCODE(GetVcc, U1, Void, ) +OPCODE(GetVccLo, U32, Void, ) +OPCODE(GetVccHi, U32, Void, ) +OPCODE(GetM0, U32, Void, ) +OPCODE(SetScc, Void, U1, ) +OPCODE(SetExec, Void, U1, ) +OPCODE(SetVcc, Void, U1, ) +OPCODE(SetSccLo, Void, U32, ) +OPCODE(SetVccLo, Void, U32, ) +OPCODE(SetVccHi, Void, U32, ) +OPCODE(SetM0, Void, U32, ) // Undefined OPCODE(UndefU1, U1, ) @@ -88,17 +92,17 @@ OPCODE(StoreBufferU32x4, Void, Opaq OPCODE(StoreBufferFormatF32, Void, Opaque, Opaque, U32x4, ) // Buffer atomic operations -OPCODE(BufferAtomicIAdd32, U32, Opaque, Opaque, U32 ) -OPCODE(BufferAtomicSMin32, U32, Opaque, Opaque, U32 ) -OPCODE(BufferAtomicUMin32, U32, Opaque, Opaque, U32 ) -OPCODE(BufferAtomicSMax32, U32, Opaque, Opaque, U32 ) -OPCODE(BufferAtomicUMax32, U32, Opaque, Opaque, U32 ) -OPCODE(BufferAtomicInc32, U32, Opaque, Opaque, U32, ) -OPCODE(BufferAtomicDec32, U32, Opaque, Opaque, U32, ) -OPCODE(BufferAtomicAnd32, U32, Opaque, Opaque, U32, ) -OPCODE(BufferAtomicOr32, U32, Opaque, Opaque, U32, ) -OPCODE(BufferAtomicXor32, U32, Opaque, Opaque, U32, ) -OPCODE(BufferAtomicSwap32, U32, Opaque, Opaque, U32, ) +OPCODE(BufferAtomicIAdd32, U32, Opaque, Opaque, U32 ) +OPCODE(BufferAtomicSMin32, U32, Opaque, Opaque, U32 ) +OPCODE(BufferAtomicUMin32, U32, Opaque, Opaque, U32 ) +OPCODE(BufferAtomicSMax32, U32, Opaque, Opaque, U32 ) +OPCODE(BufferAtomicUMax32, U32, Opaque, Opaque, U32 ) +OPCODE(BufferAtomicInc32, U32, Opaque, Opaque, U32, ) +OPCODE(BufferAtomicDec32, U32, Opaque, Opaque, U32, ) +OPCODE(BufferAtomicAnd32, U32, Opaque, Opaque, U32, ) +OPCODE(BufferAtomicOr32, U32, Opaque, Opaque, U32, ) +OPCODE(BufferAtomicXor32, U32, Opaque, Opaque, U32, ) +OPCODE(BufferAtomicSwap32, U32, Opaque, Opaque, U32, ) // Vector utility OPCODE(CompositeConstructU32x2, U32x2, U32, U32, ) @@ -156,6 +160,7 @@ OPCODE(BitCastF32U32, F32, U32, OPCODE(BitCastF64U64, F64, U64, ) OPCODE(PackUint2x32, U64, U32x2, ) OPCODE(UnpackUint2x32, U32x2, U64, ) +OPCODE(PackFloat2x32, F64, F32x2, ) OPCODE(PackFloat2x16, U32, F16x2, ) OPCODE(UnpackFloat2x16, F16x2, U32, ) OPCODE(PackHalf2x16, U32, F32x2, ) @@ -243,6 +248,8 @@ OPCODE(SMulExt, U32x2, U32, OPCODE(UMulExt, U32x2, U32, U32, ) OPCODE(SDiv32, U32, U32, U32, ) OPCODE(UDiv32, U32, U32, U32, ) +OPCODE(SMod32, U32, U32, U32, ) +OPCODE(UMod32, U32, U32, U32, ) OPCODE(INeg32, U32, U32, ) OPCODE(INeg64, U64, U64, ) OPCODE(IAbs32, U32, U32, ) diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index 87a069338..775aed5b3 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -278,6 +278,12 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { case IR::Opcode::FPCmpClass32: FoldCmpClass(inst); return; + case IR::Opcode::ShiftLeftLogical32: + FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return static_cast(a << b); }); + return; + case IR::Opcode::ShiftRightLogical32: + FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return static_cast(a >> b); }); + return; case IR::Opcode::ShiftRightArithmetic32: FoldWhenAllImmediates(inst, [](s32 a, s32 b) { return static_cast(a >> b); }); return; @@ -347,7 +353,6 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { return; case IR::Opcode::INotEqual: FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a != b; }); - FoldBooleanConvert(inst); return; case IR::Opcode::BitwiseAnd32: FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a & b; }); diff --git a/src/shader_recompiler/ir/passes/ir_passes.h b/src/shader_recompiler/ir/passes/ir_passes.h index 7e2b962b5..e6e389d15 100644 --- a/src/shader_recompiler/ir/passes/ir_passes.h +++ b/src/shader_recompiler/ir/passes/ir_passes.h @@ -15,5 +15,7 @@ void ConstantPropagationPass(IR::BlockList& program); void ResourceTrackingPass(IR::Program& program); void CollectShaderInfoPass(IR::Program& program); void LowerSharedMemToRegisters(IR::Program& program); +void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, + Stage stage); } // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index 19a9cca58..db0d75f0c 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -379,24 +379,45 @@ void PatchBufferInstruction(IR::Block& block, IR::Inst& inst, Info& info, // Replace handle with binding index in buffer resource list. IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; inst.SetArg(0, ir.Imm32(binding)); - ASSERT(!buffer.swizzle_enable && !buffer.add_tid_enable); + ASSERT(!buffer.add_tid_enable); // Address of constant buffer reads can be calculated at IR emittion time. if (inst.GetOpcode() == IR::Opcode::ReadConstBuffer) { return; } + const IR::U32 index_stride = ir.Imm32(buffer.index_stride); + const IR::U32 element_size = ir.Imm32(buffer.element_size); + // Compute address of the buffer using the stride. IR::U32 address = ir.Imm32(inst_info.inst_offset.Value()); if (inst_info.index_enable) { const IR::U32 index = inst_info.offset_enable ? IR::U32{ir.CompositeExtract(inst.Arg(1), 0)} : IR::U32{inst.Arg(1)}; - address = ir.IAdd(address, ir.IMul(index, ir.Imm32(buffer.GetStride()))); + if (buffer.swizzle_enable) { + const IR::U32 stride_index_stride = + ir.Imm32(static_cast(buffer.stride * buffer.index_stride)); + const IR::U32 index_msb = ir.IDiv(index, index_stride); + const IR::U32 index_lsb = ir.IMod(index, index_stride); + address = ir.IAdd(address, ir.IAdd(ir.IMul(index_msb, stride_index_stride), + ir.IMul(index_lsb, element_size))); + } else { + address = ir.IAdd(address, ir.IMul(index, ir.Imm32(buffer.GetStride()))); + } } if (inst_info.offset_enable) { const IR::U32 offset = inst_info.index_enable ? IR::U32{ir.CompositeExtract(inst.Arg(1), 1)} : IR::U32{inst.Arg(1)}; - address = ir.IAdd(address, offset); + if (buffer.swizzle_enable) { + const IR::U32 element_size_index_stride = + ir.Imm32(buffer.element_size * buffer.index_stride); + const IR::U32 offset_msb = ir.IDiv(offset, element_size); + const IR::U32 offset_lsb = ir.IMod(offset, element_size); + address = ir.IAdd(address, + ir.IAdd(ir.IMul(offset_msb, element_size_index_stride), offset_lsb)); + } else { + address = ir.IAdd(address, offset); + } } inst.SetArg(1, address); } @@ -421,18 +442,29 @@ void PatchTextureBufferInstruction(IR::Block& block, IR::Inst& inst, Info& info, } IR::Value PatchCubeCoord(IR::IREmitter& ir, const IR::Value& s, const IR::Value& t, - const IR::Value& z, bool is_storage) { + const IR::Value& z, bool is_storage, bool is_array) { // When cubemap is written with imageStore it is treated like 2DArray. if (is_storage) { return ir.CompositeConstruct(s, t, z); } + + ASSERT(s.Type() == IR::Type::F32); // in case of fetched image need to adjust the code below + // We need to fix x and y coordinate, // because the s and t coordinate will be scaled and plus 1.5 by v_madak_f32. // We already force the scale value to be 1.0 when handling v_cubema_f32, // here we subtract 1.5 to recover the original value. const IR::Value x = ir.FPSub(IR::F32{s}, ir.Imm32(1.5f)); const IR::Value y = ir.FPSub(IR::F32{t}, ir.Imm32(1.5f)); - return ir.CompositeConstruct(x, y, z); + if (is_array) { + const IR::U32 array_index = ir.ConvertFToU(32, IR::F32{z}); + const IR::U32 face_id = ir.BitwiseAnd(array_index, ir.Imm32(7u)); + const IR::U32 slice_id = ir.ShiftRightLogical(array_index, ir.Imm32(3u)); + return ir.CompositeConstruct(x, y, ir.ConvertIToF(32, 32, false, face_id), + ir.ConvertIToF(32, 32, false, slice_id)); + } else { + return ir.CompositeConstruct(x, y, z); + } } void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { @@ -461,14 +493,16 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip } ASSERT(image.GetType() != AmdGpu::ImageType::Invalid); const bool is_storage = IsImageStorageInstruction(inst); + const auto type = image.IsPartialCubemap() ? AmdGpu::ImageType::Color2DArray : image.GetType(); u32 image_binding = descriptors.Add(ImageResource{ .sgpr_base = tsharp.sgpr_base, .dword_offset = tsharp.dword_offset, - .type = image.GetType(), + .type = type, .nfmt = static_cast(image.GetNumberFmt()), .is_storage = is_storage, .is_depth = bool(inst_info.is_depth), .is_atomic = IsImageAtomicInstruction(inst), + .is_array = bool(inst_info.is_array), }); // Read sampler sharp. This doesn't exist for IMAGE_LOAD/IMAGE_STORE instructions @@ -525,7 +559,8 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip case AmdGpu::ImageType::Color3D: // x, y, z return {ir.CompositeConstruct(body->Arg(0), body->Arg(1), body->Arg(2)), body->Arg(3)}; case AmdGpu::ImageType::Cube: // x, y, face - return {PatchCubeCoord(ir, body->Arg(0), body->Arg(1), body->Arg(2), is_storage), + return {PatchCubeCoord(ir, body->Arg(0), body->Arg(1), body->Arg(2), is_storage, + inst_info.is_array), body->Arg(3)}; default: UNREACHABLE_MSG("Unknown image type {}", image.GetType()); @@ -564,7 +599,8 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip } } if (inst_info.has_derivatives) { - ASSERT_MSG(image.GetType() == AmdGpu::ImageType::Color2D, + ASSERT_MSG(image.GetType() == AmdGpu::ImageType::Color2D || + image.GetType() == AmdGpu::ImageType::Color2DArray, "User derivatives only supported for 2D images"); } if (inst_info.has_lod_clamp) { diff --git a/src/shader_recompiler/ir/passes/ring_access_elimination.cpp b/src/shader_recompiler/ir/passes/ring_access_elimination.cpp new file mode 100644 index 000000000..857921b1f --- /dev/null +++ b/src/shader_recompiler/ir/passes/ring_access_elimination.cpp @@ -0,0 +1,110 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/frontend/translate/translate.h" +#include "shader_recompiler/ir/opcodes.h" +#include "shader_recompiler/ir/program.h" +#include "shader_recompiler/ir/reg.h" +#include "shader_recompiler/recompiler.h" + +namespace Shader::Optimization { + +void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, + Stage stage) { + const auto& ForEachInstruction = [&](auto func) { + for (IR::Block* block : program.blocks) { + for (IR::Inst& inst : block->Instructions()) { + IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; + func(ir, inst); + } + } + }; + + switch (stage) { + case Stage::Export: { + ForEachInstruction([=](IR::IREmitter& ir, IR::Inst& inst) { + const auto opcode = inst.GetOpcode(); + switch (opcode) { + case IR::Opcode::StoreBufferU32: { + if (!inst.Flags().ring_access) { + break; + } + + const auto offset = inst.Flags().inst_offset.Value(); + ASSERT(offset < runtime_info.es_info.vertex_data_size * 4); + const auto data = ir.BitCast(IR::U32{inst.Arg(2)}); + const auto attrib = + IR::Value{offset < 16 ? IR::Attribute::Position0 + : IR::Attribute::Param0 + (offset / 16 - 1)}; + const auto comp = (offset / 4) % 4; + + inst.ReplaceOpcode(IR::Opcode::SetAttribute); + inst.ClearArgs(); + inst.SetArg(0, attrib); + inst.SetArg(1, data); + inst.SetArg(2, ir.Imm32(comp)); + break; + } + default: + break; + } + }); + break; + } + case Stage::Geometry: { + ForEachInstruction([&](IR::IREmitter& ir, IR::Inst& inst) { + const auto opcode = inst.GetOpcode(); + switch (opcode) { + case IR::Opcode::LoadBufferU32: { + if (!inst.Flags().ring_access) { + break; + } + + const auto shl_inst = inst.Arg(1).TryInstRecursive(); + const auto vertex_id = shl_inst->Arg(0).Resolve().U32() >> 2; + const auto offset = inst.Arg(1).TryInstRecursive()->Arg(1); + const auto bucket = offset.Resolve().U32() / 256u; + const auto attrib = bucket < 4 ? IR::Attribute::Position0 + : IR::Attribute::Param0 + (bucket / 4 - 1); + const auto comp = bucket % 4; + + auto attr_value = ir.GetAttribute(attrib, comp, vertex_id); + inst.ReplaceOpcode(IR::Opcode::BitCastU32F32); + inst.ClearArgs(); + inst.SetArg(0, attr_value); + break; + } + case IR::Opcode::StoreBufferU32: { + if (!inst.Flags().ring_access) { + break; + } + + const auto offset = inst.Flags().inst_offset.Value(); + const auto data = ir.BitCast(IR::U32{inst.Arg(2)}); + const auto comp_ofs = runtime_info.gs_info.output_vertices * 4u; + const auto output_size = comp_ofs * runtime_info.gs_info.out_vertex_data_size; + + const auto vc_read_ofs = (((offset / comp_ofs) * comp_ofs) % output_size) * 16u; + const auto& it = runtime_info.gs_info.copy_data.attr_map.find(vc_read_ofs); + ASSERT(it != runtime_info.gs_info.copy_data.attr_map.cend()); + const auto& [attr, comp] = it->second; + + inst.ReplaceOpcode(IR::Opcode::SetAttribute); + inst.ClearArgs(); + inst.SetArg(0, IR::Value{attr}); + inst.SetArg(1, data); + inst.SetArg(2, ir.Imm32(comp)); + break; + } + default: + break; + } + }); + break; + } + default: + break; + } +} + +} // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp index 63fe8a571..e995852d5 100644 --- a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp +++ b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp @@ -8,14 +8,15 @@ namespace Shader::Optimization { void Visit(Info& info, IR::Inst& inst) { switch (inst.GetOpcode()) { case IR::Opcode::GetAttribute: - case IR::Opcode::GetAttributeU32: { + case IR::Opcode::GetAttributeU32: info.loads.Set(inst.Arg(0).Attribute(), inst.Arg(1).U32()); break; - } - case IR::Opcode::SetAttribute: { + case IR::Opcode::SetAttribute: info.stores.Set(inst.Arg(0).Attribute(), inst.Arg(2).U32()); break; - } + case IR::Opcode::GetUserData: + info.ud_mask.Set(inst.Arg(0).ScalarReg()); + break; case IR::Opcode::LoadSharedU32: case IR::Opcode::LoadSharedU64: case IR::Opcode::WriteSharedU32: @@ -27,6 +28,9 @@ void Visit(Info& info, IR::Inst& inst) { case IR::Opcode::BitCastF16U16: info.uses_fp16 = true; break; + case IR::Opcode::BitCastU64F64: + info.uses_fp64 = true; + break; case IR::Opcode::ImageWrite: info.has_storage_images = true; break; diff --git a/src/shader_recompiler/ir/reg.h b/src/shader_recompiler/ir/reg.h index fba04f33e..9ec77e5f0 100644 --- a/src/shader_recompiler/ir/reg.h +++ b/src/shader_recompiler/ir/reg.h @@ -7,7 +7,6 @@ #include "common/bit_field.h" #include "common/enum.h" #include "common/types.h" -#include "video_core/amdgpu/pixel_format.h" namespace Shader::IR { @@ -59,6 +58,7 @@ union TextureInstInfo { BitField<5, 1, u32> has_offset; BitField<6, 2, u32> gather_comp; BitField<8, 1, u32> has_derivatives; + BitField<9, 1, u32> is_array; }; union BufferInstInfo { @@ -66,6 +66,7 @@ union BufferInstInfo { BitField<0, 1, u32> index_enable; BitField<1, 1, u32> offset_enable; BitField<2, 12, u32> inst_offset; + BitField<14, 1, u32> ring_access; // global + system coherency }; enum class ScalarReg : u32 { diff --git a/src/shader_recompiler/ir/value.cpp b/src/shader_recompiler/ir/value.cpp index 9cbb9e7cf..86e5dd141 100644 --- a/src/shader_recompiler/ir/value.cpp +++ b/src/shader_recompiler/ir/value.cpp @@ -81,6 +81,7 @@ bool Value::operator==(const Value& other) const { case Type::F64x2: case Type::F64x3: case Type::F64x4: + default: break; } UNREACHABLE_MSG("Invalid type {}", type); diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp index 12dbc6c1b..e13e5d009 100644 --- a/src/shader_recompiler/recompiler.cpp +++ b/src/shader_recompiler/recompiler.cpp @@ -63,6 +63,7 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info if (program.info.stage != Stage::Compute) { Shader::Optimization::LowerSharedMemToRegisters(program); } + Shader::Optimization::RingAccessElimination(program, runtime_info, program.info.stage); Shader::Optimization::ResourceTrackingPass(program); Shader::Optimization::IdentityRemovalPass(program.blocks); Shader::Optimization::DeadCodeEliminationPass(program); diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 1bb065544..8c0838c96 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -8,6 +8,8 @@ #include "common/assert.h" #include "common/types.h" +#include "frontend/copy_shader.h" +#include "video_core/amdgpu/types.h" namespace Shader { @@ -26,13 +28,11 @@ constexpr u32 MaxStageTypes = 6; return static_cast(index); } -enum class MrtSwizzle : u8 { - Identity = 0, - Alt = 1, - Reverse = 2, - ReverseAlt = 3, +struct ExportRuntimeInfo { + u32 vertex_data_size; + + auto operator<=>(const ExportRuntimeInfo&) const noexcept = default; }; -static constexpr u32 MaxColorBuffers = 8; enum class VsOutput : u8 { None, @@ -70,6 +70,33 @@ struct VertexRuntimeInfo { } }; +static constexpr auto GsMaxOutputStreams = 4u; +using GsOutputPrimTypes = std::array; +struct GeometryRuntimeInfo { + u32 num_invocations{}; + u32 output_vertices{}; + u32 in_vertex_data_size{}; + u32 out_vertex_data_size{}; + AmdGpu::PrimitiveType in_primitive; + GsOutputPrimTypes out_primitive; + CopyShaderData copy_data; + + bool operator==(const GeometryRuntimeInfo& other) const noexcept { + return num_invocations && other.num_invocations && + output_vertices == other.output_vertices && in_primitive == other.in_primitive && + std::ranges::equal(out_primitive, other.out_primitive) && + std::ranges::equal(copy_data.attr_map, other.copy_data.attr_map); + } +}; + +enum class MrtSwizzle : u8 { + Identity = 0, + Alt = 1, + Reverse = 2, + ReverseAlt = 3, +}; +static constexpr u32 MaxColorBuffers = 8; + struct FragmentRuntimeInfo { struct PsInput { u8 param_index; @@ -80,10 +107,16 @@ struct FragmentRuntimeInfo { auto operator<=>(const PsInput&) const noexcept = default; }; boost::container::static_vector inputs; - std::array mrt_swizzles; + struct PsColorBuffer { + AmdGpu::NumberFormat num_format; + MrtSwizzle mrt_swizzle; + + auto operator<=>(const PsColorBuffer&) const noexcept = default; + }; + std::array color_buffers; bool operator==(const FragmentRuntimeInfo& other) const noexcept { - return std::ranges::equal(mrt_swizzles, other.mrt_swizzles) && + return std::ranges::equal(color_buffers, other.color_buffers) && std::ranges::equal(inputs, other.inputs); } }; @@ -108,7 +141,9 @@ struct RuntimeInfo { u32 num_user_data; u32 num_input_vgprs; u32 num_allocated_vgprs; + ExportRuntimeInfo es_info; VertexRuntimeInfo vs_info; + GeometryRuntimeInfo gs_info; FragmentRuntimeInfo fs_info; ComputeRuntimeInfo cs_info; @@ -122,6 +157,10 @@ struct RuntimeInfo { return vs_info == other.vs_info; case Stage::Compute: return cs_info == other.cs_info; + case Stage::Export: + return es_info == other.es_info; + case Stage::Geometry: + return gs_info == other.gs_info; default: return true; } diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index bbcafdb86..0a3a696bc 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -6,6 +6,7 @@ #include #include "common/types.h" +#include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/info.h" namespace Shader { @@ -45,11 +46,11 @@ struct StageSpecialization { boost::container::small_vector buffers; boost::container::small_vector tex_buffers; boost::container::small_vector images; - u32 start_binding{}; + Backend::Bindings start{}; explicit StageSpecialization(const Shader::Info& info_, RuntimeInfo runtime_info_, - u32 start_binding_) - : info{&info_}, runtime_info{runtime_info_}, start_binding{start_binding_} { + Backend::Bindings start_) + : info{&info_}, runtime_info{runtime_info_}, start{start_} { u32 binding{}; ForEachSharp(binding, buffers, info->buffers, [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { @@ -62,7 +63,8 @@ struct StageSpecialization { }); ForEachSharp(binding, images, info->images, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { - spec.type = sharp.GetType(); + spec.type = sharp.IsPartialCubemap() ? AmdGpu::ImageType::Color2DArray + : sharp.GetType(); spec.is_integer = AmdGpu::IsInteger(sharp.GetNumberFmt()); }); } @@ -81,7 +83,7 @@ struct StageSpecialization { } bool operator==(const StageSpecialization& other) const { - if (start_binding != other.start_binding) { + if (start != other.start) { return false; } if (runtime_info != other.runtime_info) { diff --git a/src/shadps4.qrc b/src/shadps4.qrc index c22b837bd..a59cb0621 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -2,6 +2,7 @@ images/shadps4.ico images/about_icon.png + images/dump_icon.png images/play_icon.png images/pause_icon.png images/stop_icon.png @@ -15,6 +16,7 @@ images/settings_icon.png images/controller_icon.png images/refresh_icon.png + images/update_icon.png images/list_mode_icon.png images/flag_jp.png images/flag_eu.png diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 2c04b2f4b..47eecf699 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -44,7 +44,7 @@ Liverpool::~Liverpool() { } void Liverpool::Process(std::stop_token stoken) { - Common::SetCurrentThreadName("GPU_CommandProcessor"); + Common::SetCurrentThreadName("shadPS4:GPU_CommandProcessor"); for (int i = 0; i < NumTotalQueues; i++) { GpuQueue& queue = mapped_queues[i]; @@ -672,6 +672,12 @@ std::pair, std::span> Liverpool::CopyCmdBuffers( std::span dcb, std::span ccb) { auto& queue = mapped_queues[GfxQueueId]; + // std::vector resize can invalidate spans for commands in flight + ASSERT_MSG(queue.dcb_buffer.capacity() >= queue.dcb_buffer_offset + dcb.size(), + "dcb copy buffer out of reserved space"); + ASSERT_MSG(queue.ccb_buffer.capacity() >= queue.ccb_buffer_offset + ccb.size(), + "ccb copy buffer out of reserved space"); + queue.dcb_buffer.resize( std::max(queue.dcb_buffer.size(), queue.dcb_buffer_offset + dcb.size())); queue.ccb_buffer.resize( diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 37720168a..508420bca 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -19,6 +19,7 @@ #include "common/types.h" #include "common/unique_function.h" #include "shader_recompiler/params.h" +#include "types.h" #include "video_core/amdgpu/pixel_format.h" #include "video_core/amdgpu/resource.h" @@ -253,6 +254,13 @@ struct Liverpool { } }; + struct ModeControl { + s32 msaa_enable : 1; + s32 vport_scissor_enable : 1; + s32 line_stripple_enable : 1; + s32 send_unlit_stiles_to_pkr : 1; + }; + enum class ZOrder : u32 { LateZ = 0, EarlyZLateZ = 1, @@ -356,13 +364,16 @@ struct Liverpool { Stencil8 = 1, }; - union { + union ZInfo { BitField<0, 2, ZFormat> format; BitField<2, 2, u32> num_samples; BitField<13, 3, u32> tile_split; + BitField<20, 3, u32> tile_mode_index; + BitField<23, 4, u32> decompress_on_n_zplanes; BitField<27, 1, u32> allow_expclear; BitField<28, 1, u32> read_size; BitField<29, 1, u32> tile_surface_en; + BitField<30, 1, u32> clear_disallowed; BitField<31, 1, u32> zrange_precision; } z_info; union { @@ -465,6 +476,8 @@ struct Liverpool { BitField<13, 1, u32> enable_polygon_offset_para; BitField<16, 1, u32> enable_window_offset; BitField<19, 1, ProvokingVtxLast> provoking_vtx_last; + BitField<20, 1, u32> persp_corr_dis; + BitField<21, 1, u32> multi_prim_ib_ena; PolygonMode PolyMode() const { return enable_polygon_mode ? polygon_mode_front.Value() : PolygonMode::Fill; @@ -473,6 +486,11 @@ struct Liverpool { CullMode CullingMode() const { return static_cast(cull_front | cull_back << 1); } + + bool NeedsBias() const { + return enable_polygon_offset_back || enable_polygon_offset_front || + enable_polygon_offset_para; + } }; union VsOutputConfig { @@ -506,6 +524,11 @@ struct Liverpool { u32 GetMask(int buf_id) const { return (raw >> (buf_id * 4)) & 0xfu; } + + void SetMask(int buf_id, u32 mask) { + raw &= ~(0xf << (buf_id * 4)); + raw |= (mask << (buf_id * 4)); + } }; struct IndexBufferBase { @@ -549,29 +572,39 @@ struct Liverpool { s16 top_left_x; s16 top_left_y; }; - union { - BitField<0, 15, u32> bottom_right_x; - BitField<16, 15, u32> bottom_right_y; + struct { + s16 bottom_right_x; + s16 bottom_right_y; }; + // From AMD spec: 'Negative numbers clamped to 0' + static s16 Clamp(s16 value) { + return std::max(s16(0), value); + } + u32 GetWidth() const { - return static_cast(bottom_right_x - top_left_x); + return static_cast(Clamp(bottom_right_x) - Clamp(top_left_x)); } u32 GetHeight() const { - return static_cast(bottom_right_y - top_left_y); + return static_cast(Clamp(bottom_right_y) - Clamp(top_left_y)); } }; + struct WindowOffset { + s32 window_x_offset : 16; + s32 window_y_offset : 16; + }; + struct ViewportScissor { union { BitField<0, 15, s32> top_left_x; - BitField<15, 15, s32> top_left_y; - BitField<30, 1, s32> window_offset_disable; + BitField<16, 15, s32> top_left_y; + BitField<31, 1, s32> window_offset_disable; }; - union { - BitField<0, 15, s32> bottom_right_x; - BitField<15, 15, s32> bottom_right_y; + struct { + s16 bottom_right_x; + s16 bottom_right_y; }; u32 GetWidth() const { @@ -607,6 +640,7 @@ struct Liverpool { BitField<8, 1, u32> xy_transformed; BitField<9, 1, u32> z_transformed; BitField<10, 1, u32> w_transformed; + BitField<11, 1, u32> perfcounter_ref; }; struct ClipUserData { @@ -662,6 +696,7 @@ struct Liverpool { BitField<24, 5, BlendFactor> alpha_dst_factor; BitField<29, 1, u32> separate_alpha_blend; BitField<30, 1, u32> enable; + BitField<31, 1, u32> disable_rop3; }; union ColorControl { @@ -670,9 +705,11 @@ struct Liverpool { Normal = 1u, EliminateFastClear = 2u, Resolve = 3u, + Err = 4u, FmaskDecompress = 5u, }; + BitField<0, 1, u32> disable_dual_quad; BitField<3, 1, u32> degamma_enable; BitField<4, 3, OperationMode> mode; BitField<16, 8, u32> rop3; @@ -710,7 +747,7 @@ struct Liverpool { BitField<0, 11, u32> slice_start; BitField<13, 11, u32> slice_max; } view; - union { + union Color0Info { BitField<0, 2, EndianSwap> endian; BitField<2, 5, DataFormat> format; BitField<7, 1, u32> linear_general; @@ -723,10 +760,17 @@ struct Liverpool { BitField<17, 1, u32> simple_float; BitField<18, 1, RoundMode> round_mode; BitField<19, 1, u32> cmask_is_linear; + BitField<20, 3, u32> blend_opt_dont_rd_dst; + BitField<23, 3, u32> blend_opt_discard_pixel; + BitField<26, 1, u32> fmask_compression_disable_ci; + BitField<27, 1, u32> fmask_compress_1frag_only; + BitField<28, 1, u32> dcc_enable; + BitField<29, 1, u32> cmask_addr_type; } info; - union { + union Color0Attrib { BitField<0, 5, TilingMode> tile_mode_index; BitField<5, 5, u32> fmask_tile_mode_index; + BitField<10, 2, u32> fmask_bank_height; BitField<12, 3, u32> num_samples_log2; BitField<15, 2, u32> num_fragments_log2; BitField<17, 1, u32> force_dst_alpha_1; @@ -799,26 +843,6 @@ struct Liverpool { } }; - enum class PrimitiveType : u32 { - None = 0, - PointList = 1, - LineList = 2, - LineStrip = 3, - TriangleList = 4, - TriangleFan = 5, - TriangleStrip = 6, - PatchPrimitive = 9, - AdjLineList = 10, - AdjLineStrip = 11, - AdjTriangleList = 12, - AdjTriangleStrip = 13, - RectList = 17, - LineLoop = 18, - QuadList = 19, - QuadStrip = 20, - Polygon = 21, - }; - enum ContextRegs : u32 { DbZInfo = 0xA010, CbColor0Base = 0xA318, @@ -859,8 +883,14 @@ struct Liverpool { u32 raw; BitField<0, 1, u32> depth_clear_enable; BitField<1, 1, u32> stencil_clear_enable; + BitField<2, 1, u32> depth_copy; + BitField<3, 1, u32> stencil_copy; + BitField<4, 1, u32> resummarize_enable; BitField<5, 1, u32> stencil_compress_disable; BitField<6, 1, u32> depth_compress_disable; + BitField<7, 1, u32> copy_centroid; + BitField<8, 1, u32> copy_sample; + BitField<9, 1, u32> decompress_enable; }; union DepthView { @@ -887,7 +917,12 @@ struct Liverpool { }; union ShaderStageEnable { - u32 raw; + enum VgtStages : u32 { + Vs = 0u, // always enabled + EsGs = 0xB0u, + }; + + VgtStages raw; BitField<0, 2, u32> ls_en; BitField<2, 1, u32> hs_en; BitField<3, 2, u32> es_en; @@ -913,6 +948,97 @@ struct Liverpool { } }; + union GsInstances { + u32 raw; + struct { + u32 enable : 2; + u32 count : 6; + }; + + bool IsEnabled() const { + return enable && count > 0; + } + }; + + union GsOutPrimitiveType { + u32 raw; + struct { + GsOutputPrimitiveType outprim_type : 6; + GsOutputPrimitiveType outprim_type1 : 6; + GsOutputPrimitiveType outprim_type2 : 6; + GsOutputPrimitiveType outprim_type3 : 6; + u32 reserved : 3; + u32 unique_type_per_stream : 1; + }; + + GsOutputPrimitiveType GetPrimitiveType(u32 stream) const { + if (unique_type_per_stream == 0) { + return outprim_type; + } + + switch (stream) { + case 0: + return outprim_type; + case 1: + return outprim_type1; + case 2: + return outprim_type2; + case 3: + return outprim_type3; + default: + UNREACHABLE(); + } + } + }; + + union GsMode { + u32 raw; + BitField<0, 3, u32> mode; + BitField<3, 2, u32> cut_mode; + BitField<22, 2, u32> onchip; + }; + + union StreamOutConfig { + u32 raw; + struct { + u32 streamout_0_en : 1; + u32 streamout_1_en : 1; + u32 streamout_2_en : 1; + u32 streamout_3_en : 1; + u32 rast_stream : 3; + u32 : 1; + u32 rast_stream_mask : 4; + u32 : 19; + u32 use_rast_stream_mask : 1; + }; + }; + + union StreamOutBufferConfig { + u32 raw; + struct { + u32 stream_0_buf_en : 4; + u32 stream_1_buf_en : 4; + u32 stream_2_buf_en : 4; + u32 stream_3_buf_en : 4; + }; + }; + + union Eqaa { + u32 raw; + BitField<0, 1, u32> max_anchor_samples; + BitField<4, 3, u32> ps_iter_samples; + BitField<8, 3, u32> mask_export_num_samples; + BitField<12, 3, u32> alpha_to_mask_num_samples; + BitField<16, 1, u32> high_quality_intersections; + BitField<17, 1, u32> incoherent_eqaa_reads; + BitField<18, 1, u32> interpolate_comp_z; + BitField<19, 1, u32> interpolate_src_z; + BitField<20, 1, u32> static_anchor_associations; + BitField<21, 1, u32> alpha_to_mask_eqaa_disable; + BitField<24, 3, u32> overrasterization_amount; + BitField<27, 1, u32> enable_postz_overrasterization; + }; + union Regs { struct { INSERT_PADDING_WORDS(0x2C08); @@ -943,10 +1069,14 @@ struct Liverpool { Scissor screen_scissor; INSERT_PADDING_WORDS(0xA010 - 0xA00C - 2); DepthBuffer depth_buffer; - INSERT_PADDING_WORDS(0xA08E - 0xA018); + INSERT_PADDING_WORDS(0xA080 - 0xA018); + WindowOffset window_offset; + ViewportScissor window_scissor; + INSERT_PADDING_WORDS(0xA08E - 0xA081 - 2); ColorBufferMask color_target_mask; ColorBufferMask color_shader_mask; - INSERT_PADDING_WORDS(0xA094 - 0xA08E - 2); + ViewportScissor generic_scissor; + INSERT_PADDING_WORDS(2); std::array viewport_scissors; std::array viewport_depths; INSERT_PADDING_WORDS(0xA103 - 0xA0D4); @@ -984,7 +1114,13 @@ struct Liverpool { PolygonControl polygon_control; ViewportControl viewport_control; VsOutputControl vs_output_control; - INSERT_PADDING_WORDS(0xA29E - 0xA207 - 2); + INSERT_PADDING_WORDS(0xA290 - 0xA207 - 1); + GsMode vgt_gs_mode; + INSERT_PADDING_WORDS(1); + ModeControl mode_control; + INSERT_PADDING_WORDS(8); + GsOutPrimitiveType vgt_gs_out_prim_type; + INSERT_PADDING_WORDS(1); u32 index_size; u32 max_index_size; IndexBufferType index_buffer_type; @@ -995,11 +1131,21 @@ struct Liverpool { INSERT_PADDING_WORDS(0xA2A8 - 0xA2A5 - 1); u32 vgt_instance_step_rate_0; u32 vgt_instance_step_rate_1; - INSERT_PADDING_WORDS(0xA2D5 - 0xA2A9 - 1); + INSERT_PADDING_WORDS(0xA2AB - 0xA2A9 - 1); + u32 vgt_esgs_ring_itemsize; + u32 vgt_gsvs_ring_itemsize; + INSERT_PADDING_WORDS(0xA2CE - 0xA2AC - 1); + BitField<0, 11, u32> vgt_gs_max_vert_out; + INSERT_PADDING_WORDS(0xA2D5 - 0xA2CE - 1); ShaderStageEnable stage_enable; - INSERT_PADDING_WORDS(9); + INSERT_PADDING_WORDS(1); + u32 vgt_gs_vert_itemsize[4]; + INSERT_PADDING_WORDS(4); PolygonOffset poly_offset; - INSERT_PADDING_WORDS(0xA2F8 - 0xA2DF - 5); + GsInstances vgt_gs_instance_cnt; + StreamOutConfig vgt_strmout_config; + StreamOutBufferConfig vgt_strmout_buffer_config; + INSERT_PADDING_WORDS(0xA2F8 - 0xA2E6 - 1); AaConfig aa_config; INSERT_PADDING_WORDS(0xA318 - 0xA2F8 - 1); ColorBuffer color_buffers[NumColorBuffers]; @@ -1088,6 +1234,15 @@ public: submit_cv.notify_one(); } + void reserveCopyBufferSpace() { + GpuQueue& gfx_queue = mapped_queues[GfxQueueId]; + std::scoped_lock lk(gfx_queue.m_access); + + constexpr size_t GfxReservedSize = 2_MB >> 2; + gfx_queue.ccb_buffer.reserve(GfxReservedSize); + gfx_queue.dcb_buffer.reserve(GfxReservedSize); + } + private: struct Task { struct promise_type { @@ -1187,8 +1342,11 @@ static_assert(GFX6_3D_REG_INDEX(depth_htile_data_base) == 0xA005); static_assert(GFX6_3D_REG_INDEX(screen_scissor) == 0xA00C); static_assert(GFX6_3D_REG_INDEX(depth_buffer.z_info) == 0xA010); static_assert(GFX6_3D_REG_INDEX(depth_buffer.depth_slice) == 0xA017); +static_assert(GFX6_3D_REG_INDEX(window_offset) == 0xA080); +static_assert(GFX6_3D_REG_INDEX(window_scissor) == 0xA081); static_assert(GFX6_3D_REG_INDEX(color_target_mask) == 0xA08E); static_assert(GFX6_3D_REG_INDEX(color_shader_mask) == 0xA08F); +static_assert(GFX6_3D_REG_INDEX(generic_scissor) == 0xA090); static_assert(GFX6_3D_REG_INDEX(viewport_scissors) == 0xA094); static_assert(GFX6_3D_REG_INDEX(primitive_restart_index) == 0xA103); static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B); @@ -1208,14 +1366,24 @@ static_assert(GFX6_3D_REG_INDEX(color_control) == 0xA202); static_assert(GFX6_3D_REG_INDEX(clipper_control) == 0xA204); static_assert(GFX6_3D_REG_INDEX(viewport_control) == 0xA206); static_assert(GFX6_3D_REG_INDEX(vs_output_control) == 0xA207); +static_assert(GFX6_3D_REG_INDEX(vgt_gs_mode) == 0xA290); +static_assert(GFX6_3D_REG_INDEX(mode_control) == 0xA292); +static_assert(GFX6_3D_REG_INDEX(vgt_gs_out_prim_type) == 0xA29B); static_assert(GFX6_3D_REG_INDEX(index_size) == 0xA29D); static_assert(GFX6_3D_REG_INDEX(index_buffer_type) == 0xA29F); static_assert(GFX6_3D_REG_INDEX(enable_primitive_id) == 0xA2A1); static_assert(GFX6_3D_REG_INDEX(enable_primitive_restart) == 0xA2A5); static_assert(GFX6_3D_REG_INDEX(vgt_instance_step_rate_0) == 0xA2A8); static_assert(GFX6_3D_REG_INDEX(vgt_instance_step_rate_1) == 0xA2A9); +static_assert(GFX6_3D_REG_INDEX(vgt_esgs_ring_itemsize) == 0xA2AB); +static_assert(GFX6_3D_REG_INDEX(vgt_gsvs_ring_itemsize) == 0xA2AC); +static_assert(GFX6_3D_REG_INDEX(vgt_gs_max_vert_out) == 0xA2CE); static_assert(GFX6_3D_REG_INDEX(stage_enable) == 0xA2D5); +static_assert(GFX6_3D_REG_INDEX(vgt_gs_vert_itemsize[0]) == 0xA2D7); static_assert(GFX6_3D_REG_INDEX(poly_offset) == 0xA2DF); +static_assert(GFX6_3D_REG_INDEX(vgt_gs_instance_cnt) == 0xA2E4); +static_assert(GFX6_3D_REG_INDEX(vgt_strmout_config) == 0xA2E5); +static_assert(GFX6_3D_REG_INDEX(vgt_strmout_buffer_config) == 0xA2E6); static_assert(GFX6_3D_REG_INDEX(aa_config) == 0xA2F8); static_assert(GFX6_3D_REG_INDEX(color_buffers[0].base_address) == 0xA318); static_assert(GFX6_3D_REG_INDEX(color_buffers[0].pitch) == 0xA319); diff --git a/src/video_core/amdgpu/pixel_format.h b/src/video_core/amdgpu/pixel_format.h index 53d30a7fd..e83313ea4 100644 --- a/src/video_core/amdgpu/pixel_format.h +++ b/src/video_core/amdgpu/pixel_format.h @@ -6,61 +6,10 @@ #include #include #include "common/types.h" +#include "video_core/amdgpu/types.h" namespace AmdGpu { -// Table 8.13 Data and Image Formats [Sea Islands Series Instruction Set Architecture] -enum class DataFormat : u32 { - FormatInvalid = 0, - Format8 = 1, - Format16 = 2, - Format8_8 = 3, - Format32 = 4, - Format16_16 = 5, - Format10_11_11 = 6, - Format11_11_10 = 7, - Format10_10_10_2 = 8, - Format2_10_10_10 = 9, - Format8_8_8_8 = 10, - Format32_32 = 11, - Format16_16_16_16 = 12, - Format32_32_32 = 13, - Format32_32_32_32 = 14, - Format5_6_5 = 16, - Format1_5_5_5 = 17, - Format5_5_5_1 = 18, - Format4_4_4_4 = 19, - Format8_24 = 20, - Format24_8 = 21, - FormatX24_8_32 = 22, - FormatGB_GR = 32, - FormatBG_RG = 33, - Format5_9_9_9 = 34, - FormatBc1 = 35, - FormatBc2 = 36, - FormatBc3 = 37, - FormatBc4 = 38, - FormatBc5 = 39, - FormatBc6 = 40, - FormatBc7 = 41, -}; - -enum class NumberFormat : u32 { - Unorm = 0, - Snorm = 1, - Uscaled = 2, - Sscaled = 3, - Uint = 4, - Sint = 5, - SnormNz = 6, - Float = 7, - Srgb = 9, - Ubnorm = 10, - UbnromNz = 11, - Ubint = 12, - Ubscaled = 13, -}; - [[nodiscard]] constexpr bool IsInteger(NumberFormat nfmt) { return nfmt == AmdGpu::NumberFormat::Sint || nfmt == AmdGpu::NumberFormat::Uint; } diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index 064b89951..b9fbfcb89 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -36,6 +36,8 @@ union PM4Type0Header { }; union PM4Type3Header { + static constexpr u32 TYPE = 3; + constexpr PM4Type3Header(PM4ItOpcode code, u32 num_words_min_one, PM4ShaderType stype = PM4ShaderType::ShaderGraphics, PM4Predicate pred = PM4Predicate::PredDisable) { @@ -500,7 +502,7 @@ struct PM4CmdWriteData { struct PM4CmdEventWriteEos { enum class Command : u32 { GdsStore = 1u, - SingalFence = 2u, + SignalFence = 2u, }; PM4Type3Header header; @@ -534,7 +536,7 @@ struct PM4CmdEventWriteEos { void SignalFence() const { const auto cmd = command.Value(); switch (cmd) { - case Command::SingalFence: { + case Command::SignalFence: { *Address() = DataDWord(); break; } diff --git a/src/video_core/amdgpu/pm4_opcodes.h b/src/video_core/amdgpu/pm4_opcodes.h index 83c1deaa4..4b853138b 100644 --- a/src/video_core/amdgpu/pm4_opcodes.h +++ b/src/video_core/amdgpu/pm4_opcodes.h @@ -32,6 +32,7 @@ enum class PM4ItOpcode : u32 { NumInstances = 0x2F, DrawIndexMultiAuto = 0x30, IndirectBufferConst = 0x33, + StrmoutBufferUpdate = 0x34, DrawIndexOffset2 = 0x35, WriteData = 0x37, DrawIndexIndirectMulti = 0x38, @@ -52,6 +53,7 @@ enum class PM4ItOpcode : u32 { DmaData = 0x50, ContextRegRmw = 0x51, AcquireMem = 0x58, + Rewind = 0x59, LoadShReg = 0x5F, LoadConfigReg = 0x60, LoadContextReg = 0x61, @@ -60,7 +62,9 @@ enum class PM4ItOpcode : u32 { SetContextRegIndirect = 0x73, SetShReg = 0x76, SetShRegOffset = 0x77, + SetQueueReg = 0x78, SetUconfigReg = 0x79, + LoadConstRam = 0x80, WriteConstRam = 0x81, DumpConstRam = 0x83, IncrementCeCounter = 0x84, diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 1721c1aea..97df40a0d 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -23,7 +23,7 @@ enum class CompSwizzle : u32 { // Table 8.5 Buffer Resource Descriptor [Sea Islands Series Instruction Set Architecture] struct Buffer { u64 base_address : 44; - u64 : 4; + u64 _padding0 : 4; u64 stride : 14; u64 cache_swizzle : 1; u64 swizzle_enable : 1; @@ -37,7 +37,7 @@ struct Buffer { u32 element_size : 2; u32 index_stride : 2; u32 add_tid_enable : 1; - u32 : 6; + u32 _padding1 : 6; u32 type : 2; // overlaps with T# type, so should be 0 for buffer bool Valid() const { @@ -66,7 +66,7 @@ struct Buffer { } u32 GetStride() const noexcept { - return stride == 0 ? 1U : stride; + return stride; } u32 NumDwords() const noexcept { @@ -74,7 +74,7 @@ struct Buffer { } u32 GetSize() const noexcept { - return GetStride() * num_records; + return stride == 0 ? num_records : (stride * num_records); } }; static_assert(sizeof(Buffer) == 16); // 128bits @@ -238,10 +238,15 @@ struct Image { return pitch + 1; } - u32 NumLayers() const { + u32 NumLayers(bool is_array) const { u32 slices = GetType() == ImageType::Color3D ? 1 : depth + 1; if (GetType() == ImageType::Cube) { - slices *= 6; + if (is_array) { + slices = last_array + 1; + ASSERT(slices % 6 == 0); + } else { + slices = 6; + } } if (pow2pad) { slices = std::bit_ceil(slices); @@ -282,6 +287,11 @@ struct Image { bool IsTiled() const { return GetTilingMode() != TilingMode::Display_Linear; } + + bool IsPartialCubemap() const { + const auto viewed_slice = last_array - base_array + 1; + return GetType() == ImageType::Cube && viewed_slice < 6; + } }; static_assert(sizeof(Image) == 32); // 256bits diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h new file mode 100644 index 000000000..8cc023a79 --- /dev/null +++ b/src/video_core/amdgpu/types.h @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace AmdGpu { + +// See `VGT_PRIMITIVE_TYPE` description in [Radeon Sea Islands 3D/Compute Register Reference Guide] +enum class PrimitiveType : u32 { + None = 0, + PointList = 1, + LineList = 2, + LineStrip = 3, + TriangleList = 4, + TriangleFan = 5, + TriangleStrip = 6, + PatchPrimitive = 9, + AdjLineList = 10, + AdjLineStrip = 11, + AdjTriangleList = 12, + AdjTriangleStrip = 13, + RectList = 17, + LineLoop = 18, + QuadList = 19, + QuadStrip = 20, + Polygon = 21, +}; + +enum class GsOutputPrimitiveType : u32 { + PointList = 0, + LineStrip = 1, + TriangleStrip = 2, +}; + +// Table 8.13 Data and Image Formats [Sea Islands Series Instruction Set Architecture] +enum class DataFormat : u32 { + FormatInvalid = 0, + Format8 = 1, + Format16 = 2, + Format8_8 = 3, + Format32 = 4, + Format16_16 = 5, + Format10_11_11 = 6, + Format11_11_10 = 7, + Format10_10_10_2 = 8, + Format2_10_10_10 = 9, + Format8_8_8_8 = 10, + Format32_32 = 11, + Format16_16_16_16 = 12, + Format32_32_32 = 13, + Format32_32_32_32 = 14, + Format5_6_5 = 16, + Format1_5_5_5 = 17, + Format5_5_5_1 = 18, + Format4_4_4_4 = 19, + Format8_24 = 20, + Format24_8 = 21, + FormatX24_8_32 = 22, + FormatGB_GR = 32, + FormatBG_RG = 33, + Format5_9_9_9 = 34, + FormatBc1 = 35, + FormatBc2 = 36, + FormatBc3 = 37, + FormatBc4 = 38, + FormatBc5 = 39, + FormatBc6 = 40, + FormatBc7 = 41, + FormatFmask8_1 = 47, + FormatFmask8_2 = 48, + FormatFmask8_4 = 49, + FormatFmask16_1 = 50, + FormatFmask16_2 = 51, + FormatFmask32_2 = 52, + FormatFmask32_4 = 53, + FormatFmask32_8 = 54, + FormatFmask64_4 = 55, + FormatFmask64_8 = 56, + Format4_4 = 57, + Format6_5_5 = 58, + Format1 = 59, + Format1_Reversed = 60, + Format32_As_8 = 61, + Format32_As_8_8 = 62, + Format32_As_32_32_32_32 = 63, +}; + +enum class NumberFormat : u32 { + Unorm = 0, + Snorm = 1, + Uscaled = 2, + Sscaled = 3, + Uint = 4, + Sint = 5, + SnormNz = 6, + Float = 7, + Srgb = 9, + Ubnorm = 10, + UbnromNz = 11, + Ubint = 12, + Ubscaled = 13, +}; + +} // namespace AmdGpu \ No newline at end of file diff --git a/src/video_core/buffer_cache/buffer.cpp b/src/video_core/buffer_cache/buffer.cpp index 702958034..5a049c185 100644 --- a/src/video_core/buffer_cache/buffer.cpp +++ b/src/video_core/buffer_cache/buffer.cpp @@ -9,10 +9,7 @@ #include "video_core/renderer_vulkan/vk_platform.h" #include "video_core/renderer_vulkan/vk_scheduler.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnullability-completeness" #include -#pragma GCC diagnostic pop namespace VideoCore { @@ -98,7 +95,8 @@ Buffer::Buffer(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, // Create buffer object. const vk::BufferCreateInfo buffer_ci = { .size = size_bytes, - .usage = flags, + // When maintenance5 is not supported, use all flags since we can't add flags to views. + .usage = instance->IsMaintenance5Supported() ? flags : AllFlags, }; VmaAllocationInfo alloc_info{}; buffer.Create(buffer_ci, usage, &alloc_info); @@ -122,13 +120,15 @@ vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataF : vk::BufferUsageFlagBits2KHR::eUniformTexelBuffer, }; const vk::BufferViewCreateInfo view_ci = { - .pNext = &usage_flags, + .pNext = instance->IsMaintenance5Supported() ? &usage_flags : nullptr, .buffer = buffer.buffer, .format = Vulkan::LiverpoolToVK::SurfaceFormat(dfmt, nfmt), .offset = offset, .range = size, }; - const auto view = instance->GetDevice().createBufferView(view_ci); + const auto [view_result, view] = instance->GetDevice().createBufferView(view_ci); + ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create buffer view: {}", + vk::to_string(view_result)); scheduler->DeferOperation( [view, device = instance->GetDevice()] { device.destroyBufferView(view); }); return view; diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 3b92a8e1a..2b43188cf 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -17,7 +17,7 @@ namespace VideoCore { static constexpr size_t NumVertexBuffers = 32; static constexpr size_t GdsBufferSize = 64_KB; static constexpr size_t StagingBufferSize = 1_GB; -static constexpr size_t UboStreamBufferSize = 128_MB; +static constexpr size_t UboStreamBufferSize = 64_MB; BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, const AmdGpu::Liverpool* liverpool_, TextureCache& texture_cache_, @@ -31,7 +31,22 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s Vulkan::SetObjectName(instance.GetDevice(), gds_buffer.Handle(), "GDS Buffer"); // Ensure the first slot is used for the null buffer - void(slot_buffers.insert(instance, scheduler, MemoryUsage::DeviceLocal, 0, ReadFlags, 1)); + const auto null_id = + slot_buffers.insert(instance, scheduler, MemoryUsage::DeviceLocal, 0, ReadFlags, 1); + ASSERT(null_id.index == 0); + const vk::Buffer& null_buffer = slot_buffers[null_id].buffer; + Vulkan::SetObjectName(instance.GetDevice(), null_buffer, "Null Buffer"); + + const vk::BufferViewCreateInfo null_view_ci = { + .buffer = null_buffer, + .format = vk::Format::eR8Unorm, + .offset = 0, + .range = VK_WHOLE_SIZE, + }; + const auto [null_view_result, null_view] = instance.GetDevice().createBufferView(null_view_ci); + ASSERT_MSG(null_view_result == vk::Result::eSuccess, "Failed to create null buffer view."); + null_buffer_view = null_view; + Vulkan::SetObjectName(instance.GetDevice(), null_buffer_view, "Null Buffer View"); } BufferCache::~BufferCache() = default; @@ -101,6 +116,15 @@ bool BufferCache::BindVertexBuffers(const Shader::Info& vs_info) { if (instance.IsVertexInputDynamicState()) { const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.setVertexInputEXT(bindings, attributes); + } else if (bindings.empty()) { + // Required to call bindVertexBuffers2EXT at least once in the current command buffer + // with non-null strides without a non-dynamic stride pipeline in between. Thus even + // when nothing is bound we still need to make a dummy call. Non-null strides in turn + // requires a count greater than 0. + const auto cmdbuf = scheduler.CommandBuffer(); + const std::array null_buffers = {GetBuffer(NULL_BUFFER_ID).buffer.buffer}; + constexpr std::array null_offsets = {static_cast(0)}; + cmdbuf.bindVertexBuffers2EXT(0, null_buffers, null_offsets, null_offsets, null_offsets); } }; @@ -110,6 +134,8 @@ bool BufferCache::BindVertexBuffers(const Shader::Info& vs_info) { std::array host_buffers; std::array host_offsets; + std::array host_sizes; + std::array host_strides; boost::container::static_vector guest_buffers; struct BufferRange { @@ -189,11 +215,18 @@ bool BufferCache::BindVertexBuffers(const Shader::Info& vs_info) { host_buffers[i] = host_buffer->vk_buffer; host_offsets[i] = host_buffer->offset + buffer.base_address - host_buffer->base_address; + host_sizes[i] = buffer.GetSize(); + host_strides[i] = buffer.GetStride(); } if (num_buffers > 0) { const auto cmdbuf = scheduler.CommandBuffer(); - cmdbuf.bindVertexBuffers(0, num_buffers, host_buffers.data(), host_offsets.data()); + if (instance.IsVertexInputDynamicState()) { + cmdbuf.bindVertexBuffers(0, num_buffers, host_buffers.data(), host_offsets.data()); + } else { + cmdbuf.bindVertexBuffers2EXT(0, num_buffers, host_buffers.data(), host_offsets.data(), + host_sizes.data(), host_strides.data()); + } } return has_step_rate; @@ -202,7 +235,7 @@ bool BufferCache::BindVertexBuffers(const Shader::Info& vs_info) { u32 BufferCache::BindIndexBuffer(bool& is_indexed, u32 index_offset) { // Emulate QuadList primitive type with CPU made index buffer. const auto& regs = liverpool->regs; - if (regs.primitive_type == AmdGpu::Liverpool::PrimitiveType::QuadList) { + if (regs.primitive_type == AmdGpu::PrimitiveType::QuadList) { is_indexed = true; // Emit indices. @@ -577,9 +610,16 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, return false; } Image& image = texture_cache.GetImage(image_id); + if (False(image.flags & ImageFlagBits::GpuModified)) { + return false; + } + ASSERT_MSG(device_addr == image.info.guest_address, + "Texel buffer aliases image subresources {:x} : {:x}", device_addr, + image.info.guest_address); boost::container::small_vector copies; u32 offset = buffer.Offset(image.cpu_addr); const u32 num_layers = image.info.resources.layers; + const u32 max_offset = offset + size; for (u32 m = 0; m < image.info.resources.levels; m++) { if (offset >= buffer.SizeBytes()) { break; @@ -589,6 +629,10 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, const u32 depth = image.info.props.is_volume ? std::max(image.info.size.depth >> m, 1u) : 1u; const auto& [mip_size, mip_pitch, mip_height, mip_ofs] = image.info.mips_layout[m]; + offset += mip_ofs * num_layers; + if (offset + (mip_size * num_layers) > max_offset) { + break; + } copies.push_back({ .bufferOffset = offset, .bufferRowLength = static_cast(mip_pitch), @@ -602,11 +646,10 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, .imageOffset = {0, 0, 0}, .imageExtent = {width, height, depth}, }); - offset += mip_ofs * num_layers; } if (!copies.empty()) { scheduler.EndRendering(); - image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits::eTransferRead); + image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {}); const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.copyImageToBuffer(image.image, vk::ImageLayout::eTransferSrcOptimal, buffer.buffer, copies); diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index cd6ea28fc..76309363a 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -62,6 +62,15 @@ public: return &gds_buffer; } + /// Retrieves the buffer with the specified id. + [[nodiscard]] Buffer& GetBuffer(BufferId id) { + return slot_buffers[id]; + } + + [[nodiscard]] vk::BufferView& NullBufferView() { + return null_buffer_view; + } + /// Invalidates any buffer in the logical page range. void InvalidateMemory(VAddr device_addr, u64 size); @@ -141,6 +150,7 @@ private: Buffer gds_buffer; std::mutex mutex; Common::SlotVector slot_buffers; + vk::BufferView null_buffer_view; MemoryTracker memory_tracker; PageTable page_table; }; diff --git a/src/video_core/page_manager.cpp b/src/video_core/page_manager.cpp index 1c2b28d5b..a5d065ba5 100644 --- a/src/video_core/page_manager.cpp +++ b/src/video_core/page_manager.cpp @@ -2,21 +2,22 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "common/alignment.h" -#include "common/arch.h" #include "common/assert.h" #include "common/error.h" +#include "common/signal_context.h" +#include "core/signals.h" #include "video_core/page_manager.h" #include "video_core/renderer_vulkan/vk_rasterizer.h" #define ENABLE_USERFAULTFD 1 #ifndef _WIN64 -#include -#include -#include -#include #include #ifdef ENABLE_USERFAULTFD +#include #include +#include +#include #endif #else #include @@ -27,45 +28,7 @@ namespace VideoCore { constexpr size_t PAGESIZE = 4_KB; constexpr size_t PAGEBITS = 12; -#ifdef _WIN64 -struct PageManager::Impl { - Impl(Vulkan::Rasterizer* rasterizer_) { - rasterizer = rasterizer_; - - veh_handle = AddVectoredExceptionHandler(0, GuestFaultSignalHandler); - ASSERT_MSG(veh_handle, "Failed to register an exception handler"); - } - - void OnMap(VAddr address, size_t size) {} - - void OnUnmap(VAddr address, size_t size) {} - - void Protect(VAddr address, size_t size, bool allow_write) { - DWORD prot = allow_write ? PAGE_READWRITE : PAGE_READONLY; - DWORD old_prot{}; - BOOL result = VirtualProtect(std::bit_cast(address), size, prot, &old_prot); - ASSERT_MSG(result != 0, "Region protection failed"); - } - - static LONG WINAPI GuestFaultSignalHandler(EXCEPTION_POINTERS* pExp) noexcept { - const u32 ec = pExp->ExceptionRecord->ExceptionCode; - if (ec == EXCEPTION_ACCESS_VIOLATION) { - const auto info = pExp->ExceptionRecord->ExceptionInformation; - if (info[0] == 1) { // Write violation - const VAddr addr_aligned = Common::AlignDown(info[1], PAGESIZE); - rasterizer->InvalidateMemory(addr_aligned, PAGESIZE); - return EXCEPTION_CONTINUE_EXECUTION; - } /* else { - UNREACHABLE(); - }*/ - } - return EXCEPTION_CONTINUE_SEARCH; // pass further - } - - inline static Vulkan::Rasterizer* rasterizer; - void* veh_handle{}; -}; -#elif ENABLE_USERFAULTFD +#if ENABLE_USERFAULTFD struct PageManager::Impl { Impl(Vulkan::Rasterizer* rasterizer_) : rasterizer{rasterizer_} { uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); @@ -160,72 +123,49 @@ struct PageManager::Impl { int uffd; }; #else - -#if defined(__APPLE__) - -#if defined(ARCH_X86_64) -#define IS_WRITE_ERROR(ctx) ((ctx)->uc_mcontext->__es.__err & 0x2) -#elif defined(ARCH_ARM64) -#define IS_WRITE_ERROR(ctx) ((ctx)->uc_mcontext->__es.__esr & 0x40) -#endif - -#else - -#if defined(ARCH_X86_64) -#define IS_WRITE_ERROR(ctx) ((ctx)->uc_mcontext.gregs[REG_ERR] & 0x2) -#endif - -#endif - -#ifndef IS_WRITE_ERROR -#error "Missing IS_WRITE_ERROR() implementation for target OS and CPU architecture. -#endif - struct PageManager::Impl { Impl(Vulkan::Rasterizer* rasterizer_) { rasterizer = rasterizer_; -#ifdef __APPLE__ - // Read-only memory write results in SIGBUS on Apple. - static constexpr int SignalType = SIGBUS; -#else - static constexpr int SignalType = SIGSEGV; -#endif - sigset_t signal_mask; - sigemptyset(&signal_mask); - sigaddset(&signal_mask, SignalType); - - using HandlerType = decltype(sigaction::sa_sigaction); - - struct sigaction guest_access_fault {}; - guest_access_fault.sa_flags = SA_SIGINFO | SA_ONSTACK; - guest_access_fault.sa_sigaction = &GuestFaultSignalHandler; - guest_access_fault.sa_mask = signal_mask; - sigaction(SignalType, &guest_access_fault, nullptr); + // Should be called first. + constexpr auto priority = std::numeric_limits::min(); + Core::Signals::Instance()->RegisterAccessViolationHandler(GuestFaultSignalHandler, + priority); } - void OnMap(VAddr address, size_t size) {} + void OnMap(VAddr address, size_t size) { + owned_ranges += boost::icl::interval::right_open(address, address + size); + } - void OnUnmap(VAddr address, size_t size) {} + void OnUnmap(VAddr address, size_t size) { + owned_ranges -= boost::icl::interval::right_open(address, address + size); + } void Protect(VAddr address, size_t size, bool allow_write) { +#ifdef _WIN32 + DWORD prot = allow_write ? PAGE_READWRITE : PAGE_READONLY; + DWORD old_prot{}; + BOOL result = VirtualProtect(std::bit_cast(address), size, prot, &old_prot); + ASSERT_MSG(result != 0, "Region protection failed"); +#else mprotect(reinterpret_cast(address), size, PROT_READ | (allow_write ? PROT_WRITE : 0)); +#endif } - static void GuestFaultSignalHandler(int sig, siginfo_t* info, void* raw_context) { - ucontext_t* ctx = reinterpret_cast(raw_context); - const VAddr address = reinterpret_cast(info->si_addr); - if (IS_WRITE_ERROR(ctx)) { - const VAddr addr_aligned = Common::AlignDown(address, PAGESIZE); + static bool GuestFaultSignalHandler(void* context, void* fault_address) { + const auto addr = reinterpret_cast(fault_address); + const bool is_write = Common::IsWriteError(context); + if (is_write && owned_ranges.find(addr) != owned_ranges.end()) { + const VAddr addr_aligned = Common::AlignDown(addr, PAGESIZE); rasterizer->InvalidateMemory(addr_aligned, PAGESIZE); - } else { - // Read not supported! - UNREACHABLE(); + return true; } + return false; } inline static Vulkan::Rasterizer* rasterizer; + inline static boost::icl::interval_set owned_ranges; }; #endif diff --git a/src/video_core/renderdoc.cpp b/src/video_core/renderdoc.cpp index 7f88e1264..7e0994992 100644 --- a/src/video_core/renderdoc.cpp +++ b/src/video_core/renderdoc.cpp @@ -110,11 +110,11 @@ void TriggerCapture() { } } -void SetOutputDir(const std::string& path, const std::string& prefix) { +void SetOutputDir(const std::filesystem::path& path, const std::string& prefix) { if (!rdoc_api) { return; } - rdoc_api->SetCaptureFilePathTemplate((path + '\\' + prefix).c_str()); + rdoc_api->SetCaptureFilePathTemplate(fmt::UTF((path / prefix).u8string()).data.data()); } } // namespace VideoCore diff --git a/src/video_core/renderdoc.h b/src/video_core/renderdoc.h index febf6fbc1..91e242d04 100644 --- a/src/video_core/renderdoc.h +++ b/src/video_core/renderdoc.h @@ -20,6 +20,6 @@ void EndCapture(); void TriggerCapture(); /// Sets output directory for captures -void SetOutputDir(const std::string& path, const std::string& prefix); +void SetOutputDir(const std::filesystem::path& path, const std::string& prefix); } // namespace VideoCore diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index b61bc4706..48c055534 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -61,34 +61,34 @@ vk::CompareOp CompareOp(Liverpool::CompareFunc func) { } } -vk::PrimitiveTopology PrimitiveType(Liverpool::PrimitiveType type) { +vk::PrimitiveTopology PrimitiveType(AmdGpu::PrimitiveType type) { switch (type) { - case Liverpool::PrimitiveType::PointList: + case AmdGpu::PrimitiveType::PointList: return vk::PrimitiveTopology::ePointList; - case Liverpool::PrimitiveType::LineList: + case AmdGpu::PrimitiveType::LineList: return vk::PrimitiveTopology::eLineList; - case Liverpool::PrimitiveType::LineStrip: + case AmdGpu::PrimitiveType::LineStrip: return vk::PrimitiveTopology::eLineStrip; - case Liverpool::PrimitiveType::TriangleList: + case AmdGpu::PrimitiveType::TriangleList: return vk::PrimitiveTopology::eTriangleList; - case Liverpool::PrimitiveType::TriangleFan: + case AmdGpu::PrimitiveType::TriangleFan: return vk::PrimitiveTopology::eTriangleFan; - case Liverpool::PrimitiveType::TriangleStrip: + case AmdGpu::PrimitiveType::TriangleStrip: return vk::PrimitiveTopology::eTriangleStrip; - case Liverpool::PrimitiveType::AdjLineList: + case AmdGpu::PrimitiveType::AdjLineList: return vk::PrimitiveTopology::eLineListWithAdjacency; - case Liverpool::PrimitiveType::AdjLineStrip: + case AmdGpu::PrimitiveType::AdjLineStrip: return vk::PrimitiveTopology::eLineStripWithAdjacency; - case Liverpool::PrimitiveType::AdjTriangleList: + case AmdGpu::PrimitiveType::AdjTriangleList: return vk::PrimitiveTopology::eTriangleListWithAdjacency; - case Liverpool::PrimitiveType::AdjTriangleStrip: + case AmdGpu::PrimitiveType::AdjTriangleStrip: return vk::PrimitiveTopology::eTriangleStripWithAdjacency; - case Liverpool::PrimitiveType::PatchPrimitive: + case AmdGpu::PrimitiveType::PatchPrimitive: return vk::PrimitiveTopology::ePatchList; - case Liverpool::PrimitiveType::QuadList: + case AmdGpu::PrimitiveType::QuadList: // Needs to generate index buffer on the fly. return vk::PrimitiveTopology::eTriangleList; - case Liverpool::PrimitiveType::RectList: + case AmdGpu::PrimitiveType::RectList: return vk::PrimitiveTopology::eTriangleStrip; default: UNREACHABLE(); @@ -199,8 +199,17 @@ vk::SamplerAddressMode ClampMode(AmdGpu::ClampMode mode) { return vk::SamplerAddressMode::eMirroredRepeat; case AmdGpu::ClampMode::ClampLastTexel: return vk::SamplerAddressMode::eClampToEdge; + case AmdGpu::ClampMode::MirrorOnceHalfBorder: + case AmdGpu::ClampMode::MirrorOnceBorder: + LOG_WARNING(Render_Vulkan, "Unimplemented clamp mode {}, using closest equivalent.", + static_cast(mode)); + [[fallthrough]]; case AmdGpu::ClampMode::MirrorOnceLastTexel: return vk::SamplerAddressMode::eMirrorClampToEdge; + case AmdGpu::ClampMode::ClampHalfBorder: + LOG_WARNING(Render_Vulkan, "Unimplemented clamp mode {}, using closest equivalent.", + static_cast(mode)); + [[fallthrough]]; case AmdGpu::ClampMode::ClampBorder: return vk::SamplerAddressMode::eClampToBorder; case AmdGpu::ClampMode::ClampHalfBorder: @@ -287,302 +296,337 @@ vk::BorderColor BorderColor(AmdGpu::BorderColor color) { } } -std::span GetAllFormats() { +static constexpr vk::FormatFeatureFlags2 BufferRead = + vk::FormatFeatureFlagBits2::eUniformTexelBuffer | vk::FormatFeatureFlagBits2::eVertexBuffer; +static constexpr vk::FormatFeatureFlags2 BufferWrite = + vk::FormatFeatureFlagBits2::eStorageTexelBuffer | + vk::FormatFeatureFlagBits2::eStorageReadWithoutFormat | + vk::FormatFeatureFlagBits2::eStorageWriteWithoutFormat; +static constexpr vk::FormatFeatureFlags2 ImageRead = vk::FormatFeatureFlagBits2::eTransferSrc | + vk::FormatFeatureFlagBits2::eTransferDst | + vk::FormatFeatureFlagBits2::eSampledImage; +static constexpr vk::FormatFeatureFlags2 ImageWrite = + vk::FormatFeatureFlagBits2::eStorageImage | + vk::FormatFeatureFlagBits2::eStorageReadWithoutFormat | + vk::FormatFeatureFlagBits2::eStorageWriteWithoutFormat; +static constexpr vk::FormatFeatureFlags2 Mrt = vk::FormatFeatureFlagBits2::eColorAttachment; + +// Table 8.13 Data and Image Formats [Sea Islands Series Instruction Set Architecture] +static constexpr vk::FormatFeatureFlags2 GetDataFormatFeatureFlags( + const AmdGpu::DataFormat data_format) { + switch (data_format) { + case AmdGpu::DataFormat::FormatInvalid: + case AmdGpu::DataFormat::Format8: + case AmdGpu::DataFormat::Format16: + case AmdGpu::DataFormat::Format8_8: + case AmdGpu::DataFormat::Format32: + case AmdGpu::DataFormat::Format16_16: + case AmdGpu::DataFormat::Format10_11_11: + case AmdGpu::DataFormat::Format11_11_10: + case AmdGpu::DataFormat::Format10_10_10_2: + case AmdGpu::DataFormat::Format2_10_10_10: + case AmdGpu::DataFormat::Format8_8_8_8: + case AmdGpu::DataFormat::Format32_32: + case AmdGpu::DataFormat::Format16_16_16_16: + case AmdGpu::DataFormat::Format32_32_32_32: + return BufferRead | BufferWrite | ImageRead | ImageWrite | Mrt; + case AmdGpu::DataFormat::Format32_32_32: + return BufferRead | BufferWrite | ImageRead; + case AmdGpu::DataFormat::Format5_6_5: + case AmdGpu::DataFormat::Format1_5_5_5: + case AmdGpu::DataFormat::Format5_5_5_1: + case AmdGpu::DataFormat::Format4_4_4_4: + return ImageRead | ImageWrite | Mrt; + case AmdGpu::DataFormat::Format8_24: + case AmdGpu::DataFormat::Format24_8: + case AmdGpu::DataFormat::FormatX24_8_32: + return ImageRead | Mrt; + case AmdGpu::DataFormat::FormatGB_GR: + case AmdGpu::DataFormat::FormatBG_RG: + case AmdGpu::DataFormat::Format5_9_9_9: + case AmdGpu::DataFormat::FormatBc1: + case AmdGpu::DataFormat::FormatBc2: + case AmdGpu::DataFormat::FormatBc3: + case AmdGpu::DataFormat::FormatBc4: + case AmdGpu::DataFormat::FormatBc5: + case AmdGpu::DataFormat::FormatBc6: + case AmdGpu::DataFormat::FormatBc7: + case AmdGpu::DataFormat::Format4_4: + case AmdGpu::DataFormat::Format6_5_5: + case AmdGpu::DataFormat::Format1: + case AmdGpu::DataFormat::Format1_Reversed: + case AmdGpu::DataFormat::Format32_As_8: + case AmdGpu::DataFormat::Format32_As_8_8: + case AmdGpu::DataFormat::Format32_As_32_32_32_32: + return ImageRead; + case AmdGpu::DataFormat::FormatFmask8_1: + case AmdGpu::DataFormat::FormatFmask8_2: + case AmdGpu::DataFormat::FormatFmask8_4: + case AmdGpu::DataFormat::FormatFmask16_1: + case AmdGpu::DataFormat::FormatFmask16_2: + case AmdGpu::DataFormat::FormatFmask32_2: + case AmdGpu::DataFormat::FormatFmask32_4: + case AmdGpu::DataFormat::FormatFmask32_8: + case AmdGpu::DataFormat::FormatFmask64_4: + case AmdGpu::DataFormat::FormatFmask64_8: + return ImageRead | ImageWrite; + } + UNREACHABLE_MSG("Missing feature flags for data format {}", static_cast(data_format)); +} + +// Table 8.13 Data and Image Formats [Sea Islands Series Instruction Set Architecture] +static constexpr vk::FormatFeatureFlags2 GetNumberFormatFeatureFlags( + const AmdGpu::NumberFormat number_format) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + case AmdGpu::NumberFormat::Snorm: + case AmdGpu::NumberFormat::Uint: + case AmdGpu::NumberFormat::Sint: + case AmdGpu::NumberFormat::Float: + return BufferRead | BufferWrite | ImageRead | ImageWrite | Mrt; + case AmdGpu::NumberFormat::Uscaled: + case AmdGpu::NumberFormat::Sscaled: + case AmdGpu::NumberFormat::SnormNz: + return BufferRead | ImageRead; + case AmdGpu::NumberFormat::Srgb: + return ImageRead | Mrt; + case AmdGpu::NumberFormat::Ubnorm: + case AmdGpu::NumberFormat::UbnromNz: + case AmdGpu::NumberFormat::Ubint: + case AmdGpu::NumberFormat::Ubscaled: + return ImageRead; + } + UNREACHABLE_MSG("Missing feature flags for number format {}", static_cast(number_format)); +} + +static constexpr SurfaceFormatInfo CreateSurfaceFormatInfo(const AmdGpu::DataFormat data_format, + const AmdGpu::NumberFormat number_format, + const vk::Format vk_format) { + return { + .data_format = data_format, + .number_format = number_format, + .vk_format = vk_format, + .flags = + GetDataFormatFeatureFlags(data_format) & GetNumberFormatFeatureFlags(number_format), + }; +} + +std::span SurfaceFormats() { static constexpr std::array formats{ - vk::Format::eA2B10G10R10SnormPack32, - vk::Format::eA2B10G10R10UnormPack32, - vk::Format::eA2R10G10B10UnormPack32, - vk::Format::eB5G6R5UnormPack16, - vk::Format::eB8G8R8A8Srgb, - vk::Format::eB8G8R8A8Unorm, - vk::Format::eB10G11R11UfloatPack32, - vk::Format::eBc1RgbaSrgbBlock, - vk::Format::eBc1RgbaUnormBlock, - vk::Format::eBc2SrgbBlock, - vk::Format::eBc2UnormBlock, - vk::Format::eBc3SrgbBlock, - vk::Format::eBc3UnormBlock, - vk::Format::eBc4UnormBlock, - vk::Format::eBc5UnormBlock, - vk::Format::eBc5SnormBlock, - vk::Format::eBc7SrgbBlock, - vk::Format::eBc7UnormBlock, - vk::Format::eD16Unorm, - vk::Format::eD16UnormS8Uint, - vk::Format::eD24UnormS8Uint, - vk::Format::eD32Sfloat, - vk::Format::eD32SfloatS8Uint, - vk::Format::eR4G4B4A4UnormPack16, - vk::Format::eR5G6B5UnormPack16, - vk::Format::eR5G5B5A1UnormPack16, - vk::Format::eR8G8B8A8Srgb, - vk::Format::eR8G8B8A8Uint, - vk::Format::eR8G8B8A8Unorm, - vk::Format::eR8G8B8A8Snorm, - vk::Format::eR8G8B8A8Uscaled, - vk::Format::eR8G8Snorm, - vk::Format::eR8G8Uint, - vk::Format::eR8G8Unorm, - vk::Format::eR8Sint, - vk::Format::eR8Snorm, - vk::Format::eR8Uint, - vk::Format::eR8Unorm, - vk::Format::eR8Srgb, - vk::Format::eR16G16B16A16Sfloat, - vk::Format::eR16G16B16A16Sint, - vk::Format::eR16G16B16A16Snorm, - vk::Format::eR16G16B16A16Uint, - vk::Format::eR16G16B16A16Unorm, - vk::Format::eR16G16Sfloat, - vk::Format::eR16G16Sint, - vk::Format::eR16G16Snorm, - vk::Format::eR16Sfloat, - vk::Format::eR16Uint, - vk::Format::eR16Unorm, - vk::Format::eR32G32B32A32Sfloat, - vk::Format::eR32G32B32A32Sint, - vk::Format::eR32G32B32A32Uint, - vk::Format::eR32G32B32Sfloat, - vk::Format::eR32G32B32Uint, - vk::Format::eR32G32Sfloat, - vk::Format::eR32G32Uint, - vk::Format::eR32Sfloat, - vk::Format::eR32Sint, - vk::Format::eR32Uint, - vk::Format::eBc6HUfloatBlock, - vk::Format::eBc6HSfloatBlock, - vk::Format::eR16G16Unorm, - vk::Format::eR16G16B16A16Sscaled, - vk::Format::eR16G16Sscaled, - vk::Format::eE5B9G9R9UfloatPack32, + // Invalid + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Unorm, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Snorm, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Uscaled, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Sscaled, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Uint, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Sint, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::SnormNz, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Float, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Srgb, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubnorm, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::UbnromNz, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubint, + vk::Format::eUndefined), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubscaled, + vk::Format::eUndefined), + // 8 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Unorm, + vk::Format::eR8Unorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Snorm, + vk::Format::eR8Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Uint, + vk::Format::eR8Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Sint, + vk::Format::eR8Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Srgb, + vk::Format::eR8Srgb), + // 16 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Unorm, + vk::Format::eR16Unorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Snorm, + vk::Format::eR16Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Uint, + vk::Format::eR16Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Sint, + vk::Format::eR16Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Float, + vk::Format::eR16Sfloat), + // 8_8 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Unorm, + vk::Format::eR8G8Unorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Snorm, + vk::Format::eR8G8Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Uint, + vk::Format::eR8G8Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Sint, + vk::Format::eR8G8Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Srgb, + vk::Format::eR8G8Srgb), + // 32 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32, AmdGpu::NumberFormat::Uint, + vk::Format::eR32Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32, AmdGpu::NumberFormat::Sint, + vk::Format::eR32Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32, AmdGpu::NumberFormat::Float, + vk::Format::eR32Sfloat), + // 16_16 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Unorm, + vk::Format::eR16G16Unorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Snorm, + vk::Format::eR16G16Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Uscaled, + vk::Format::eR16G16Uscaled), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Sscaled, + vk::Format::eR16G16Sscaled), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Uint, + vk::Format::eR16G16Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Sint, + vk::Format::eR16G16Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Float, + vk::Format::eR16G16Sfloat), + // 10_11_11 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format10_11_11, AmdGpu::NumberFormat::Float, + vk::Format::eB10G11R11UfloatPack32), + // 11_11_10 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format11_11_10, AmdGpu::NumberFormat::Float, + vk::Format::eB10G11R11UfloatPack32), + // 10_10_10_2 + // 2_10_10_10 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Unorm, + vk::Format::eA2B10G10R10UnormPack32), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Snorm, + vk::Format::eA2B10G10R10SnormPack32), + // 8_8_8_8 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Unorm, + vk::Format::eR8G8B8A8Unorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Snorm, + vk::Format::eR8G8B8A8Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Uscaled, + vk::Format::eR8G8B8A8Uscaled), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Sscaled, + vk::Format::eR8G8B8A8Sscaled), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Uint, + vk::Format::eR8G8B8A8Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Sint, + vk::Format::eR8G8B8A8Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Srgb, + vk::Format::eR8G8B8A8Srgb), + // 32_32 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32, AmdGpu::NumberFormat::Uint, + vk::Format::eR32G32Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32, AmdGpu::NumberFormat::Sint, + vk::Format::eR32G32Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32, AmdGpu::NumberFormat::Float, + vk::Format::eR32G32Sfloat), + // 16_16_16_16 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Unorm, + vk::Format::eR16G16B16A16Unorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Snorm, + vk::Format::eR16G16B16A16Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, + AmdGpu::NumberFormat::Uscaled, vk::Format::eR16G16B16A16Uscaled), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, + AmdGpu::NumberFormat::Sscaled, vk::Format::eR16G16B16A16Sscaled), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Uint, + vk::Format::eR16G16B16A16Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Sint, + vk::Format::eR16G16B16A16Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, + AmdGpu::NumberFormat::SnormNz, vk::Format::eR16G16B16A16Snorm), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Float, + vk::Format::eR16G16B16A16Sfloat), + // 32_32_32 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32, AmdGpu::NumberFormat::Uint, + vk::Format::eR32G32B32Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32, AmdGpu::NumberFormat::Sint, + vk::Format::eR32G32B32Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32, AmdGpu::NumberFormat::Float, + vk::Format::eR32G32B32Sfloat), + // 32_32_32_32 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32_32, AmdGpu::NumberFormat::Uint, + vk::Format::eR32G32B32A32Uint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32_32, AmdGpu::NumberFormat::Sint, + vk::Format::eR32G32B32A32Sint), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32_32, AmdGpu::NumberFormat::Float, + vk::Format::eR32G32B32A32Sfloat), + // 5_6_5 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format5_6_5, AmdGpu::NumberFormat::Unorm, + vk::Format::eB5G6R5UnormPack16), + // 1_5_5_5 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format1_5_5_5, AmdGpu::NumberFormat::Unorm, + vk::Format::eR5G5B5A1UnormPack16), + // 5_5_5_1 + // 4_4_4_4 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format4_4_4_4, AmdGpu::NumberFormat::Unorm, + vk::Format::eR4G4B4A4UnormPack16), + // 8_24 + // 24_8 + // X24_8_32 + // GB_GR + // BG_RG + // 5_9_9_9 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format5_9_9_9, AmdGpu::NumberFormat::Float, + vk::Format::eE5B9G9R9UfloatPack32), + // BC1 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc1, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc1RgbaUnormBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc1, AmdGpu::NumberFormat::Srgb, + vk::Format::eBc1RgbaSrgbBlock), + // BC2 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc2, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc2UnormBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc2, AmdGpu::NumberFormat::Srgb, + vk::Format::eBc2SrgbBlock), + // BC3 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc3, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc3UnormBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc3, AmdGpu::NumberFormat::Srgb, + vk::Format::eBc3SrgbBlock), + // BC4 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc4, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc4UnormBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc4, AmdGpu::NumberFormat::Snorm, + vk::Format::eBc4SnormBlock), + // BC5 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc5, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc5UnormBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc5, AmdGpu::NumberFormat::Snorm, + vk::Format::eBc5SnormBlock), + // BC6 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc6, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc6HUfloatBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc6, AmdGpu::NumberFormat::Snorm, + vk::Format::eBc6HSfloatBlock), + // BC7 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc7, AmdGpu::NumberFormat::Unorm, + vk::Format::eBc7UnormBlock), + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc7, AmdGpu::NumberFormat::Srgb, + vk::Format::eBc7SrgbBlock), }; return formats; } vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat num_format) { - - if (data_format == AmdGpu::DataFormat::Format32_32_32_32 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR32G32B32A32Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format32_32_32 && - num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR32G32B32Uint; - } - if (data_format == AmdGpu::DataFormat::Format8_8_8_8 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR8G8B8A8Unorm; - } - if (data_format == AmdGpu::DataFormat::Format8_8_8_8 && - num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eR8G8B8A8Srgb; - } - if (data_format == AmdGpu::DataFormat::Format32_32_32 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR32G32B32Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format32_32 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR32G32Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format5_6_5 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eB5G6R5UnormPack16; - } - if (data_format == AmdGpu::DataFormat::Format1_5_5_5 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR5G5B5A1UnormPack16; - } - if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR8Unorm; - } - if (data_format == AmdGpu::DataFormat::FormatBc3 && num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eBc3SrgbBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc3 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc3UnormBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc4 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc4UnormBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc5 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc5UnormBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc5 && num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eBc5SnormBlock; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::Sint) { - return vk::Format::eR16G16B16A16Sint; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::Sscaled) { - return vk::Format::eR16G16B16A16Sscaled; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR16G16Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR16G16Unorm; - } - if (data_format == AmdGpu::DataFormat::Format2_10_10_10 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eA2B10G10R10UnormPack32; - } - if (data_format == AmdGpu::DataFormat::Format2_10_10_10 && - num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eA2B10G10R10SnormPack32; - } - if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eBc7SrgbBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc1 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc1RgbaUnormBlock; - } - if (data_format == AmdGpu::DataFormat::Format8_8_8_8 && - num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR8G8B8A8Uint; - } - if (data_format == AmdGpu::DataFormat::Format16 && num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR16Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format32 && num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR32Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR16G16B16A16Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format32 && num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR32Uint; - } - if (data_format == AmdGpu::DataFormat::Format32 && num_format == AmdGpu::NumberFormat::Sint) { - return vk::Format::eR32Sint; - } - if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR8G8Unorm; - } - if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR8G8Uint; - } - if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eR8G8Snorm; - } - if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc7UnormBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eBc2SrgbBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc2UnormBlock; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eR16G16Snorm; - } - if (data_format == AmdGpu::DataFormat::Format10_11_11 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eB10G11R11UfloatPack32; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eR16G16Sfloat; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eR16G16B16A16Snorm; - } - if (data_format == AmdGpu::DataFormat::Format32_32 && - num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR32G32Uint; - } - if (data_format == AmdGpu::DataFormat::Format4_4_4_4 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR4G4B4A4UnormPack16; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR16G16B16A16Uint; - } - if (data_format == AmdGpu::DataFormat::Format32_32_32_32 && - num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR32G32B32A32Uint; - } - if (data_format == AmdGpu::DataFormat::Format32_32_32_32 && - num_format == AmdGpu::NumberFormat::Sint) { - return vk::Format::eR32G32B32A32Sint; - } - if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Sint) { - return vk::Format::eR8Sint; - } - if (data_format == AmdGpu::DataFormat::FormatBc1 && num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eBc1RgbaSrgbBlock; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Sint) { - return vk::Format::eR16G16Sint; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Sscaled) { - return vk::Format::eR16G16Sscaled; - } - if (data_format == AmdGpu::DataFormat::Format8_8_8_8 && - num_format == AmdGpu::NumberFormat::Uscaled) { - return vk::Format::eR8G8B8A8Uscaled; - } - if (data_format == AmdGpu::DataFormat::Format16 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR16Unorm; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eR16G16B16A16Unorm; - } - if (data_format == AmdGpu::DataFormat::Format16_16 && - num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR16G16Uint; - } - if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR8Uint; - } - if (data_format == AmdGpu::DataFormat::Format16_16_16_16 && - num_format == AmdGpu::NumberFormat::SnormNz) { - return vk::Format::eR16G16B16A16Snorm; - } - if (data_format == AmdGpu::DataFormat::Format8_8_8_8 && - num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eR8G8B8A8Snorm; - } - if (data_format == AmdGpu::DataFormat::FormatBc6 && num_format == AmdGpu::NumberFormat::Unorm) { - return vk::Format::eBc6HUfloatBlock; - } - if (data_format == AmdGpu::DataFormat::FormatBc6 && num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eBc6HSfloatBlock; - } - if (data_format == AmdGpu::DataFormat::Format8_8_8_8 && - num_format == AmdGpu::NumberFormat::Sint) { - return vk::Format::eR8G8B8A8Sint; - } - if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eR8Srgb; - } - if (data_format == AmdGpu::DataFormat::Format11_11_10 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eB10G11R11UfloatPack32; - } - if (data_format == AmdGpu::DataFormat::Format16 && num_format == AmdGpu::NumberFormat::Uint) { - return vk::Format::eR16Uint; - } - if (data_format == AmdGpu::DataFormat::Format5_9_9_9 && - num_format == AmdGpu::NumberFormat::Float) { - return vk::Format::eE5B9G9R9UfloatPack32; - } - if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Snorm) { - return vk::Format::eR8Snorm; - } - UNREACHABLE_MSG("Unknown data_format={} and num_format={}", u32(data_format), u32(num_format)); + const auto& formats = SurfaceFormats(); + const auto format = + std::find_if(formats.begin(), formats.end(), [&](const SurfaceFormatInfo& format_info) { + return format_info.data_format == data_format && + format_info.number_format == num_format; + }); + ASSERT_MSG(format != formats.end(), "Unknown data_format={} and num_format={}", + static_cast(data_format), static_cast(num_format)); + return format->vk_format; } vk::Format AdjustColorBufferFormat(vk::Format base_format, @@ -629,30 +673,45 @@ vk::Format AdjustColorBufferFormat(vk::Format base_format, return base_format; } -vk::Format DepthFormat(DepthBuffer::ZFormat z_format, DepthBuffer::StencilFormat stencil_format) { +static constexpr DepthFormatInfo CreateDepthFormatInfo( + const DepthBuffer::ZFormat z_format, const DepthBuffer::StencilFormat stencil_format, + const vk::Format vk_format) { + return { + .z_format = z_format, + .stencil_format = stencil_format, + .vk_format = vk_format, + .flags = vk::FormatFeatureFlagBits2::eDepthStencilAttachment, + }; +} + +std::span DepthFormats() { using ZFormat = DepthBuffer::ZFormat; using StencilFormat = DepthBuffer::StencilFormat; + static constexpr std::array formats{ + // Invalid + CreateDepthFormatInfo(ZFormat::Invalid, StencilFormat::Invalid, vk::Format::eUndefined), + CreateDepthFormatInfo(ZFormat::Invalid, StencilFormat::Stencil8, + vk::Format::eD32SfloatS8Uint), + // 16 + CreateDepthFormatInfo(ZFormat::Z16, StencilFormat::Invalid, vk::Format::eD16Unorm), + CreateDepthFormatInfo(ZFormat::Z16, StencilFormat::Stencil8, vk::Format::eD16UnormS8Uint), + // 32_Float + CreateDepthFormatInfo(ZFormat::Z32Float, StencilFormat::Invalid, vk::Format::eD32Sfloat), + CreateDepthFormatInfo(ZFormat::Z32Float, StencilFormat::Stencil8, + vk::Format::eD32SfloatS8Uint), + }; + return formats; +} - if (z_format == ZFormat::Z32Float && stencil_format == StencilFormat::Stencil8) { - return vk::Format::eD32SfloatS8Uint; - } - if (z_format == ZFormat::Z32Float && stencil_format == StencilFormat::Invalid) { - return vk::Format::eD32Sfloat; - } - if (z_format == ZFormat::Z16 && stencil_format == StencilFormat::Invalid) { - return vk::Format::eD16Unorm; - } - if (z_format == ZFormat::Z16 && stencil_format == StencilFormat::Stencil8) { - return vk::Format::eD16UnormS8Uint; - } - if (z_format == ZFormat::Invalid && stencil_format == StencilFormat::Stencil8) { - return vk::Format::eD32SfloatS8Uint; - } - if (z_format == ZFormat::Invalid && stencil_format == StencilFormat::Invalid) { - return vk::Format::eUndefined; - } - UNREACHABLE_MSG("Unsupported depth/stencil format. depth = {} stencil = {}", - magic_enum::enum_name(z_format), magic_enum::enum_name(stencil_format)); +vk::Format DepthFormat(DepthBuffer::ZFormat z_format, DepthBuffer::StencilFormat stencil_format) { + const auto& formats = DepthFormats(); + const auto format = + std::find_if(formats.begin(), formats.end(), [&](const DepthFormatInfo& format_info) { + return format_info.z_format == z_format && format_info.stencil_format == stencil_format; + }); + ASSERT_MSG(format != formats.end(), "Unknown z_format={} and stencil_format={}", + static_cast(z_format), static_cast(stencil_format)); + return format->vk_format; } void EmitQuadToTriangleListIndices(u8* out_ptr, u32 num_vertices) { @@ -720,7 +779,7 @@ vk::ClearValue ColorBufferClearValue(const AmdGpu::Liverpool::ColorBuffer& color return {.color = color}; } -vk::SampleCountFlagBits NumSamples(u32 num_samples) { +vk::SampleCountFlagBits RawNumSamples(u32 num_samples) { switch (num_samples) { case 1: return vk::SampleCountFlagBits::e1; @@ -737,4 +796,14 @@ vk::SampleCountFlagBits NumSamples(u32 num_samples) { } } +vk::SampleCountFlagBits NumSamples(u32 num_samples, vk::SampleCountFlags supported_flags) { + vk::SampleCountFlagBits flags = RawNumSamples(num_samples); + // Half sample counts until supported, with a minimum of 1. + while (!(supported_flags & flags) && num_samples > 1) { + num_samples /= 2; + flags = RawNumSamples(num_samples); + } + return flags; +} + } // namespace Vulkan::LiverpoolToVK diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.h b/src/video_core/renderer_vulkan/liverpool_to_vk.h index 94f9073de..5fb04e5f5 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.h +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.h @@ -4,6 +4,7 @@ #pragma once #include +#include "common/assert.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/amdgpu/pixel_format.h" #include "video_core/amdgpu/resource.h" @@ -17,7 +18,7 @@ vk::StencilOp StencilOp(Liverpool::StencilFunc op); vk::CompareOp CompareOp(Liverpool::CompareFunc func); -vk::PrimitiveTopology PrimitiveType(Liverpool::PrimitiveType type); +vk::PrimitiveTopology PrimitiveType(AmdGpu::PrimitiveType type); vk::PolygonMode PolygonMode(Liverpool::PolygonMode mode); @@ -39,20 +40,43 @@ vk::SamplerMipmapMode MipFilter(AmdGpu::MipFilter filter); vk::BorderColor BorderColor(AmdGpu::BorderColor color); -std::span GetAllFormats(); +struct SurfaceFormatInfo { + AmdGpu::DataFormat data_format; + AmdGpu::NumberFormat number_format; + vk::Format vk_format; + vk::FormatFeatureFlags2 flags; +}; +std::span SurfaceFormats(); vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat num_format); vk::Format AdjustColorBufferFormat(vk::Format base_format, Liverpool::ColorBuffer::SwapMode comp_swap, bool is_vo_surface); +struct DepthFormatInfo { + Liverpool::DepthBuffer::ZFormat z_format; + Liverpool::DepthBuffer::StencilFormat stencil_format; + vk::Format vk_format; + vk::FormatFeatureFlags2 flags; +}; +std::span DepthFormats(); + vk::Format DepthFormat(Liverpool::DepthBuffer::ZFormat z_format, Liverpool::DepthBuffer::StencilFormat stencil_format); vk::ClearValue ColorBufferClearValue(const AmdGpu::Liverpool::ColorBuffer& color_buffer); -vk::SampleCountFlagBits NumSamples(u32 num_samples); +vk::SampleCountFlagBits NumSamples(u32 num_samples, vk::SampleCountFlags supported_flags); void EmitQuadToTriangleListIndices(u8* out_indices, u32 num_vertices); +static inline vk::Format PromoteFormatToDepth(vk::Format fmt) { + if (fmt == vk::Format::eR32Sfloat) { + return vk::Format::eD32Sfloat; + } else if (fmt == vk::Format::eR16Unorm) { + return vk::Format::eD16Unorm; + } + UNREACHABLE(); +} + } // namespace Vulkan::LiverpoolToVK diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index d019ff034..97e5185e5 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -12,10 +12,10 @@ #include "video_core/renderer_vulkan/vk_rasterizer.h" #include "video_core/texture_cache/image.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnullability-completeness" #include -#pragma GCC diagnostic pop + +#include "core/debug_state.h" +#include "core/devtools/layer.h" namespace Vulkan { @@ -33,8 +33,8 @@ bool CanBlitToSwapchain(const vk::PhysicalDevice physical_device, vk::Format for }; } -[[nodiscard]] vk::ImageBlit MakeImageBlit(s32 frame_width, s32 frame_height, s32 swapchain_width, - s32 swapchain_height) { +[[nodiscard]] vk::ImageBlit MakeImageBlit(s32 frame_width, s32 frame_height, s32 dst_width, + s32 dst_height, s32 offset_x, s32 offset_y) { return vk::ImageBlit{ .srcSubresource = MakeImageSubresourceLayers(), .srcOffsets = @@ -54,19 +54,44 @@ bool CanBlitToSwapchain(const vk::PhysicalDevice physical_device, vk::Format for .dstOffsets = std::array{ vk::Offset3D{ - .x = 0, - .y = 0, + .x = offset_x, + .y = offset_y, .z = 0, }, vk::Offset3D{ - .x = swapchain_width, - .y = swapchain_height, + .x = offset_x + dst_width, + .y = offset_y + dst_height, .z = 1, }, }, }; } +[[nodiscard]] vk::ImageBlit MakeImageBlitStretch(s32 frame_width, s32 frame_height, + s32 swapchain_width, s32 swapchain_height) { + return MakeImageBlit(frame_width, frame_height, swapchain_width, swapchain_height, 0, 0); +} + +[[nodiscard]] vk::ImageBlit MakeImageBlitFit(s32 frame_width, s32 frame_height, s32 swapchain_width, + s32 swapchain_height) { + float frame_aspect = static_cast(frame_width) / frame_height; + float swapchain_aspect = static_cast(swapchain_width) / swapchain_height; + + s32 dst_width = swapchain_width; + s32 dst_height = swapchain_height; + + if (frame_aspect > swapchain_aspect) { + dst_height = static_cast(swapchain_width / frame_aspect); + } else { + dst_width = static_cast(swapchain_height * frame_aspect); + } + + s32 offset_x = (swapchain_width - dst_width) / 2; + s32 offset_y = (swapchain_height - dst_height) / 2; + + return MakeImageBlit(frame_width, frame_height, dst_width, dst_height, offset_x, offset_y); +} + RendererVulkan::RendererVulkan(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_) : window{window_}, liverpool{liverpool_}, instance{window, Config::getGpuId(), Config::vkValidationEnabled(), @@ -74,7 +99,7 @@ RendererVulkan::RendererVulkan(Frontend::WindowSDL& window_, AmdGpu::Liverpool* draw_scheduler{instance}, present_scheduler{instance}, flip_scheduler{instance}, swapchain{instance, window}, rasterizer{std::make_unique(instance, draw_scheduler, liverpool)}, - texture_cache{rasterizer->GetTextureCache()}, video_info_ui{this} { + texture_cache{rasterizer->GetTextureCache()} { const u32 num_images = swapchain.GetImageCount(); const vk::Device device = instance.GetDevice(); @@ -82,17 +107,21 @@ RendererVulkan::RendererVulkan(Frontend::WindowSDL& window_, AmdGpu::Liverpool* present_frames.resize(num_images); for (u32 i = 0; i < num_images; i++) { Frame& frame = present_frames[i]; - frame.present_done = device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled}); + auto [fence_result, fence] = + device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled}); + ASSERT_MSG(fence_result == vk::Result::eSuccess, "Failed to create present done fence: {}", + vk::to_string(fence_result)); + frame.present_done = fence; free_queue.push(&frame); } // Setup ImGui ImGui::Core::Initialize(instance, window, num_images, swapchain.GetSurfaceFormat().format); - ImGui::Layer::AddLayer(&video_info_ui); + ImGui::Layer::AddLayer(Common::Singleton::Instance()); } RendererVulkan::~RendererVulkan() { - ImGui::Layer::RemoveLayer(&video_info_ui); + ImGui::Layer::RemoveLayer(Common::Singleton::Instance()); draw_scheduler.Finish(); const vk::Device device = instance.GetDevice(); for (auto& frame : present_frames) { @@ -157,7 +186,10 @@ void RendererVulkan::RecreateFrame(Frame* frame, u32 width, u32 height) { .layerCount = 1, }, }; - frame->image_view = device.createImageView(view_info); + auto [view_result, view] = device.createImageView(view_info); + ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create frame image view: {}", + vk::to_string(view_result)); + frame->image_view = view; frame->width = width; frame->height = height; } @@ -202,8 +234,16 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop scheduler.EndRendering(); const auto cmdbuf = scheduler.CommandBuffer(); - image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits::eTransferRead, cmdbuf); + image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {}, + cmdbuf); + const auto frame_subresources = vk::ImageSubresourceRange{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = VK_REMAINING_ARRAY_LAYERS, + }; const std::array pre_barrier{ vk::ImageMemoryBarrier{ .srcAccessMask = vk::AccessFlagBits::eTransferRead, @@ -213,24 +253,39 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = frame->image, - .subresourceRange{ - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, + .subresourceRange{frame_subresources}, }, }; cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eTransfer, vk::DependencyFlagBits::eByRegion, {}, {}, pre_barrier); + // Clear the frame image before blitting to avoid artifacts. + const vk::ClearColorValue clear_color{std::array{0.0f, 0.0f, 0.0f, 1.0f}}; + cmdbuf.clearColorImage(frame->image, vk::ImageLayout::eTransferDstOptimal, clear_color, + frame_subresources); + + const auto blitBarrier = + vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer, + .srcAccessMask = vk::AccessFlagBits2::eTransferWrite, + .dstStageMask = vk::PipelineStageFlagBits2::eTransfer, + .dstAccessMask = vk::AccessFlagBits2::eTransferWrite, + .oldLayout = vk::ImageLayout::eTransferDstOptimal, + .newLayout = vk::ImageLayout::eTransferDstOptimal, + .image = frame->image, + .subresourceRange{frame_subresources}}; + + cmdbuf.pipelineBarrier2(vk::DependencyInfo{ + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &blitBarrier, + }); + // Post-processing (Anti-aliasing, FSR etc) goes here. For now just blit to the frame image. - cmdbuf.blitImage( - image.image, image.layout, frame->image, vk::ImageLayout::eTransferDstOptimal, - MakeImageBlit(image.info.size.width, image.info.size.height, frame->width, frame->height), - vk::Filter::eLinear); + cmdbuf.blitImage(image.image, image.last_state.layout, frame->image, + vk::ImageLayout::eTransferDstOptimal, + MakeImageBlitFit(image.info.size.width, image.info.size.height, frame->width, + frame->height), + vk::Filter::eLinear); const vk::ImageMemoryBarrier post_barrier{ .srcAccessMask = vk::AccessFlagBits::eTransferWrite, @@ -240,13 +295,7 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = frame->image, - .subresourceRange{ - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, + .subresourceRange{frame_subresources}, }; cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, @@ -261,6 +310,12 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop } void RendererVulkan::Present(Frame* frame) { + // Recreate the swapchain if the window was resized. + if (window.getWidth() != swapchain.GetExtent().width || + window.getHeight() != swapchain.GetExtent().height) { + swapchain.Recreate(window.getWidth(), window.getHeight()); + } + ImGui::Core::NewFrame(); swapchain.AcquireNextImage(); @@ -269,6 +324,9 @@ void RendererVulkan::Present(Frame* frame) { auto& scheduler = present_scheduler; const auto cmdbuf = scheduler.CommandBuffer(); + + ImGui::Core::Render(cmdbuf, frame); + { auto* profiler_ctx = instance.GetProfilerContext(); TracyVkNamedZoneC(profiler_ctx, renderer_gpu_zone, cmdbuf, "Host frame", @@ -326,16 +384,15 @@ void RendererVulkan::Present(Frame* frame) { }, }; - ImGui::Core::Render(cmdbuf, frame); - cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eTransfer, vk::DependencyFlagBits::eByRegion, {}, {}, pre_barriers); - cmdbuf.blitImage(frame->image, vk::ImageLayout::eTransferSrcOptimal, swapchain_image, - vk::ImageLayout::eTransferDstOptimal, - MakeImageBlit(frame->width, frame->height, extent.width, extent.height), - vk::Filter::eLinear); + cmdbuf.blitImage( + frame->image, vk::ImageLayout::eTransferSrcOptimal, swapchain_image, + vk::ImageLayout::eTransferDstOptimal, + MakeImageBlitStretch(frame->width, frame->height, extent.width, extent.height), + vk::Filter::eLinear); cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, @@ -362,6 +419,8 @@ void RendererVulkan::Present(Frame* frame) { std::scoped_lock fl{free_mutex}; free_queue.push(frame); free_cv.notify_one(); + + DebugState.IncFlipFrameNum(); } Frame* RendererVulkan::GetRenderFrame() { diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index c8e566418..0dd869614 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -5,7 +5,6 @@ #include -#include "imgui/layer/video_info.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -105,8 +104,6 @@ private: std::condition_variable_any frame_cv; std::optional splash_img; std::vector vo_buffers_addr; - - ImGui::Layers::VideoInfo video_info_ui; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_common.cpp b/src/video_core/renderer_vulkan/vk_common.cpp index 0823fd23d..b19567808 100644 --- a/src/video_core/renderer_vulkan/vk_common.cpp +++ b/src/video_core/renderer_vulkan/vk_common.cpp @@ -5,10 +5,10 @@ // Implement vma functions #define VMA_IMPLEMENTATION -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnullability-completeness" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullability-completeness" #include -#pragma GCC diagnostic pop +#pragma clang diagnostic pop // Store the dispatch loader here VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE diff --git a/src/video_core/renderer_vulkan/vk_common.h b/src/video_core/renderer_vulkan/vk_common.h index a2f9cbcaf..9178aeb65 100644 --- a/src/video_core/renderer_vulkan/vk_common.h +++ b/src/video_core/renderer_vulkan/vk_common.h @@ -14,7 +14,14 @@ #define VULKAN_HPP_NO_CONSTRUCTORS #define VULKAN_HPP_NO_STRUCT_SETTERS #define VULKAN_HPP_HAS_SPACESHIP_OPERATOR +#define VULKAN_HPP_NO_EXCEPTIONS +// Define assert-on-result to nothing to instead return the result for our handling. +#define VULKAN_HPP_ASSERT_ON_RESULT + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-value" #include +#pragma clang diagnostic pop #define VMA_STATIC_VULKAN_FUNCTIONS 0 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 5c6d8a583..887f10ecc 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include + #include "common/alignment.h" #include "video_core/buffer_cache/buffer_cache.h" #include "video_core/renderer_vulkan/vk_compute_pipeline.h" @@ -15,7 +16,7 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler DescriptorHeap& desc_heap_, vk::PipelineCache pipeline_cache, u64 compute_key_, const Shader::Info& info_, vk::ShaderModule module) - : instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_}, compute_key{compute_key_}, + : Pipeline{instance_, scheduler_, desc_heap_, pipeline_cache}, compute_key{compute_key_}, info{&info_} { const vk::PipelineShaderStageCreateInfo shader_ci = { .stage = vk::ShaderStageFlagBits::eCompute, @@ -77,7 +78,12 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler .bindingCount = static_cast(bindings.size()), .pBindings = bindings.data(), }; - desc_layout = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); + auto [descriptor_set_result, descriptor_set] = + instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); + ASSERT_MSG(descriptor_set_result == vk::Result::eSuccess, + "Failed to create compute descriptor set layout: {}", + vk::to_string(descriptor_set_result)); + desc_layout = std::move(descriptor_set); const vk::DescriptorSetLayout set_layout = *desc_layout; const vk::PipelineLayoutCreateInfo layout_info = { @@ -86,19 +92,20 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler .pushConstantRangeCount = 1U, .pPushConstantRanges = &push_constants, }; - pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info); + auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info); + ASSERT_MSG(layout_result == vk::Result::eSuccess, + "Failed to create compute pipeline layout: {}", vk::to_string(layout_result)); + pipeline_layout = std::move(layout); const vk::ComputePipelineCreateInfo compute_pipeline_ci = { .stage = shader_ci, .layout = *pipeline_layout, }; - auto result = + auto [pipeline_result, pipe] = instance.GetDevice().createComputePipelineUnique(pipeline_cache, compute_pipeline_ci); - if (result.result == vk::Result::eSuccess) { - pipeline = std::move(result.value); - } else { - UNREACHABLE_MSG("Graphics pipeline creation failed!"); - } + ASSERT_MSG(pipeline_result == vk::Result::eSuccess, "Failed to create compute pipeline: {}", + vk::to_string(pipeline_result)); + pipeline = std::move(pipe); } ComputePipeline::~ComputePipeline() = default; @@ -108,12 +115,14 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache, // Bind resource buffers and textures. boost::container::static_vector buffer_views; boost::container::static_vector buffer_infos; - boost::container::static_vector image_infos; boost::container::small_vector set_writes; boost::container::small_vector buffer_barriers; Shader::PushData push_data{}; - u32 binding{}; + Shader::Backend::Bindings binding{}; + image_infos.clear(); + + info->PushUd(binding, push_data); for (const auto& desc : info->buffers) { bool is_storage = true; if (desc.is_gds_buffer) { @@ -145,26 +154,27 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache, buffer_cache.ObtainBuffer(address, size, desc.is_written); const u32 offset_aligned = Common::AlignDown(offset, alignment); const u32 adjust = offset - offset_aligned; - if (adjust != 0) { - ASSERT(adjust % 4 == 0); - push_data.AddOffset(binding, adjust); - } + ASSERT(adjust % 4 == 0); + push_data.AddOffset(binding.buffer, adjust); buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust); } set_writes.push_back({ .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, + .dstBinding = binding.unified++, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = is_storage ? vk::DescriptorType::eStorageBuffer : vk::DescriptorType::eUniformBuffer, .pBufferInfo = &buffer_infos.back(), }); + ++binding.buffer; } + const auto null_buffer_view = + instance.IsNullDescriptorSupported() ? VK_NULL_HANDLE : buffer_cache.NullBufferView(); for (const auto& desc : info->texture_buffers) { const auto vsharp = desc.GetSharp(*info); - vk::BufferView& buffer_view = buffer_views.emplace_back(VK_NULL_HANDLE); + vk::BufferView& buffer_view = buffer_views.emplace_back(null_buffer_view); const u32 size = vsharp.GetSize(); const VAddr address = vsharp.base_address; if (vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && address != 0 && size != 0) { @@ -186,10 +196,8 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache, // "Texel buffer stride must match format stride"); const u32 offset_aligned = Common::AlignDown(offset, alignment); const u32 adjust = offset - offset_aligned; - if (adjust != 0) { - ASSERT(adjust % fmt_stride == 0); - push_data.AddOffset(binding, adjust / fmt_stride); - } + ASSERT(adjust % fmt_stride == 0); + push_data.AddOffset(binding.buffer, adjust / fmt_stride); buffer_view = vk_buffer->View(offset_aligned, size + adjust, desc.is_written, vsharp.GetDataFmt(), vsharp.GetNumberFmt()); if (auto barrier = @@ -199,45 +207,23 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache, buffer_barriers.emplace_back(*barrier); } if (desc.is_written) { - texture_cache.MarkWritten(address, size); + texture_cache.InvalidateMemoryFromGPU(address, size); } } set_writes.push_back({ .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, + .dstBinding = binding.unified++, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = desc.is_written ? vk::DescriptorType::eStorageTexelBuffer : vk::DescriptorType::eUniformTexelBuffer, .pTexelBufferView = &buffer_view, }); + ++binding.buffer; } - for (const auto& image_desc : info->images) { - const auto tsharp = image_desc.GetSharp(*info); - if (tsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid) { - VideoCore::ImageInfo image_info{tsharp, image_desc.is_depth}; - VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage}; - const auto& image_view = texture_cache.FindTexture(image_info, view_info); - const auto& image = texture_cache.GetImage(image_view.image_id); - image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, image.layout); - } else { - image_infos.emplace_back(VK_NULL_HANDLE, VK_NULL_HANDLE, vk::ImageLayout::eGeneral); - } - set_writes.push_back({ - .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = image_desc.is_storage ? vk::DescriptorType::eStorageImage - : vk::DescriptorType::eSampledImage, - .pImageInfo = &image_infos.back(), - }); + BindTextures(texture_cache, *info, binding, set_writes); - if (texture_cache.IsMeta(tsharp.Address())) { - LOG_WARNING(Render_Vulkan, "Unexpected metadata read by a CS shader (texture)"); - } - } for (const auto& sampler : info->samplers) { const auto ssharp = sampler.GetSharp(*info); if (ssharp.force_degamma) { @@ -247,7 +233,7 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache, image_infos.emplace_back(vk_sampler, VK_NULL_HANDLE, vk::ImageLayout::eGeneral); set_writes.push_back({ .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, + .dstBinding = binding.unified++, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eSampler, diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.h b/src/video_core/renderer_vulkan/vk_compute_pipeline.h index 8a6213a29..f1bc7285a 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.h @@ -3,9 +3,8 @@ #pragma once -#include -#include "shader_recompiler/info.h" #include "video_core/renderer_vulkan/vk_common.h" +#include "video_core/renderer_vulkan/vk_pipeline_common.h" namespace VideoCore { class BufferCache; @@ -18,27 +17,17 @@ class Instance; class Scheduler; class DescriptorHeap; -class ComputePipeline { +class ComputePipeline : public Pipeline { public: - explicit ComputePipeline(const Instance& instance, Scheduler& scheduler, - DescriptorHeap& desc_heap, vk::PipelineCache pipeline_cache, - u64 compute_key, const Shader::Info& info, vk::ShaderModule module); + ComputePipeline(const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, + vk::PipelineCache pipeline_cache, u64 compute_key, const Shader::Info& info, + vk::ShaderModule module); ~ComputePipeline(); - [[nodiscard]] vk::Pipeline Handle() const noexcept { - return *pipeline; - } - bool BindResources(VideoCore::BufferCache& buffer_cache, VideoCore::TextureCache& texture_cache) const; private: - const Instance& instance; - Scheduler& scheduler; - DescriptorHeap& desc_heap; - vk::UniquePipeline pipeline; - vk::UniquePipelineLayout pipeline_layout; - vk::UniqueDescriptorSetLayout desc_layout; u64 compute_key; const Shader::Info* info; bool uses_push_descriptors{}; diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 5c674c2fa..cbc0fc5ec 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -16,18 +16,22 @@ namespace Vulkan { +static constexpr auto gp_stage_flags = vk::ShaderStageFlagBits::eVertex | + vk::ShaderStageFlagBits::eGeometry | + vk::ShaderStageFlagBits::eFragment; + GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& scheduler_, DescriptorHeap& desc_heap_, const GraphicsPipelineKey& key_, vk::PipelineCache pipeline_cache, std::span infos, std::span modules) - : instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_}, key{key_} { + : Pipeline{instance_, scheduler_, desc_heap_, pipeline_cache}, key{key_} { const vk::Device device = instance.GetDevice(); std::ranges::copy(infos, stages.begin()); BuildDescSetLayout(); const vk::PushConstantRange push_constants = { - .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + .stageFlags = gp_stage_flags, .offset = 0, .size = sizeof(Shader::PushData), }; @@ -39,52 +43,68 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul .pushConstantRangeCount = 1, .pPushConstantRanges = &push_constants, }; - pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info); + auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info); + ASSERT_MSG(layout_result == vk::Result::eSuccess, + "Failed to create graphics pipeline layout: {}", vk::to_string(layout_result)); + pipeline_layout = std::move(layout); - boost::container::static_vector bindings; - boost::container::static_vector attributes; - const auto& vs_info = stages[u32(Shader::Stage::Vertex)]; - for (const auto& input : vs_info->vs_inputs) { - if (input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate0 || - input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate1) { - // Skip attribute binding as the data will be pulled by shader - continue; + boost::container::static_vector vertex_bindings; + boost::container::static_vector vertex_attributes; + if (!instance.IsVertexInputDynamicState()) { + const auto& vs_info = stages[u32(Shader::Stage::Vertex)]; + for (const auto& input : vs_info->vs_inputs) { + if (input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate0 || + input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate1) { + // Skip attribute binding as the data will be pulled by shader + continue; + } + + const auto buffer = + vs_info->ReadUd(input.sgpr_base, input.dword_offset); + if (buffer.GetSize() == 0) { + continue; + } + vertex_attributes.push_back({ + .location = input.binding, + .binding = input.binding, + .format = LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()), + .offset = 0, + }); + vertex_bindings.push_back({ + .binding = input.binding, + .stride = buffer.GetStride(), + .inputRate = input.instance_step_rate == Shader::Info::VsInput::None + ? vk::VertexInputRate::eVertex + : vk::VertexInputRate::eInstance, + }); } - - const auto buffer = vs_info->ReadUd(input.sgpr_base, input.dword_offset); - attributes.push_back({ - .location = input.binding, - .binding = input.binding, - .format = LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()), - .offset = 0, - }); - bindings.push_back({ - .binding = input.binding, - .stride = buffer.GetStride(), - .inputRate = input.instance_step_rate == Shader::Info::VsInput::None - ? vk::VertexInputRate::eVertex - : vk::VertexInputRate::eInstance, - }); } const vk::PipelineVertexInputStateCreateInfo vertex_input_info = { - .vertexBindingDescriptionCount = static_cast(bindings.size()), - .pVertexBindingDescriptions = bindings.data(), - .vertexAttributeDescriptionCount = static_cast(attributes.size()), - .pVertexAttributeDescriptions = attributes.data(), + .vertexBindingDescriptionCount = static_cast(vertex_bindings.size()), + .pVertexBindingDescriptions = vertex_bindings.data(), + .vertexAttributeDescriptionCount = static_cast(vertex_attributes.size()), + .pVertexAttributeDescriptions = vertex_attributes.data(), }; - if (key.prim_type == Liverpool::PrimitiveType::RectList && !IsEmbeddedVs()) { + if (key.prim_type == AmdGpu::PrimitiveType::RectList && !IsEmbeddedVs()) { LOG_WARNING(Render_Vulkan, "Rectangle List primitive type is only supported for embedded VS"); } + auto prim_restart = key.enable_primitive_restart != 0; + if (prim_restart && IsPrimitiveListTopology() && !instance.IsListRestartSupported()) { + LOG_WARNING(Render_Vulkan, + "Primitive restart is enabled for list topology but not supported by driver."); + prim_restart = false; + } const vk::PipelineInputAssemblyStateCreateInfo input_assembly = { .topology = LiverpoolToVK::PrimitiveType(key.prim_type), - .primitiveRestartEnable = key.enable_primitive_restart != 0, + .primitiveRestartEnable = prim_restart, }; - ASSERT_MSG(!key.enable_primitive_restart || key.primitive_restart_index == 0xFFFF, - "Primitive restart index other than 0xFFFF is not supported yet"); + ASSERT_MSG(!prim_restart || key.primitive_restart_index == 0xFFFF || + key.primitive_restart_index == 0xFFFFFFFF, + "Primitive restart index other than -1 is not supported yet"); const vk::PipelineRasterizationStateCreateInfo raster_state = { .depthClampEnable = false, @@ -95,14 +115,12 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul ? vk::FrontFace::eClockwise : vk::FrontFace::eCounterClockwise, .depthBiasEnable = bool(key.depth_bias_enable), - .depthBiasConstantFactor = key.depth_bias_const_factor, - .depthBiasClamp = key.depth_bias_clamp, - .depthBiasSlopeFactor = key.depth_bias_slope_factor, .lineWidth = 1.0f, }; const vk::PipelineMultisampleStateCreateInfo multisampling = { - .rasterizationSamples = LiverpoolToVK::NumSamples(key.num_samples), + .rasterizationSamples = + LiverpoolToVK::NumSamples(key.num_samples, instance.GetFramebufferSampleCounts()), .sampleShadingEnable = false, }; @@ -133,9 +151,10 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul }; boost::container::static_vector dynamic_states = { - vk::DynamicState::eViewport, - vk::DynamicState::eScissor, - vk::DynamicState::eBlendConstants, + vk::DynamicState::eViewport, vk::DynamicState::eScissor, + vk::DynamicState::eBlendConstants, vk::DynamicState::eDepthBounds, + vk::DynamicState::eDepthBias, vk::DynamicState::eStencilReference, + vk::DynamicState::eStencilCompareMask, vk::DynamicState::eStencilWriteMask, }; if (instance.IsColorWriteEnableSupported()) { @@ -144,6 +163,8 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul } if (instance.IsVertexInputDynamicState()) { dynamic_states.push_back(vk::DynamicState::eVertexInputEXT); + } else { + dynamic_states.push_back(vk::DynamicState::eVertexInputBindingStrideEXT); } const vk::PipelineDynamicStateCreateInfo dynamic_info = { @@ -152,44 +173,36 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul }; const vk::PipelineDepthStencilStateCreateInfo depth_info = { - .depthTestEnable = key.depth.depth_enable, - .depthWriteEnable = key.depth.depth_write_enable, - .depthCompareOp = LiverpoolToVK::CompareOp(key.depth.depth_func), - .depthBoundsTestEnable = key.depth.depth_bounds_enable, - .stencilTestEnable = key.depth.stencil_enable, + .depthTestEnable = key.depth_stencil.depth_enable, + .depthWriteEnable = key.depth_stencil.depth_write_enable, + .depthCompareOp = LiverpoolToVK::CompareOp(key.depth_stencil.depth_func), + .depthBoundsTestEnable = key.depth_stencil.depth_bounds_enable, + .stencilTestEnable = key.depth_stencil.stencil_enable, .front{ .failOp = LiverpoolToVK::StencilOp(key.stencil.stencil_fail_front), .passOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zpass_front), .depthFailOp = LiverpoolToVK::StencilOp(key.stencil.stencil_zfail_front), - .compareOp = LiverpoolToVK::CompareOp(key.depth.stencil_ref_func), - .compareMask = key.stencil_ref_front.stencil_mask, - .writeMask = key.stencil_ref_front.stencil_write_mask, - .reference = key.stencil_ref_front.stencil_test_val, + .compareOp = LiverpoolToVK::CompareOp(key.depth_stencil.stencil_ref_func), }, .back{ - .failOp = LiverpoolToVK::StencilOp(key.depth.backface_enable + .failOp = LiverpoolToVK::StencilOp(key.depth_stencil.backface_enable ? key.stencil.stencil_fail_back.Value() : key.stencil.stencil_fail_front.Value()), - .passOp = LiverpoolToVK::StencilOp(key.depth.backface_enable + .passOp = LiverpoolToVK::StencilOp(key.depth_stencil.backface_enable ? key.stencil.stencil_zpass_back.Value() : key.stencil.stencil_zpass_front.Value()), - .depthFailOp = LiverpoolToVK::StencilOp(key.depth.backface_enable + .depthFailOp = LiverpoolToVK::StencilOp(key.depth_stencil.backface_enable ? key.stencil.stencil_zfail_back.Value() : key.stencil.stencil_zfail_front.Value()), - .compareOp = LiverpoolToVK::CompareOp(key.depth.backface_enable - ? key.depth.stencil_bf_func.Value() - : key.depth.stencil_ref_func.Value()), - .compareMask = key.stencil_ref_back.stencil_mask, - .writeMask = key.stencil_ref_back.stencil_write_mask, - .reference = key.stencil_ref_back.stencil_test_val, + .compareOp = LiverpoolToVK::CompareOp(key.depth_stencil.backface_enable + ? key.depth_stencil.stencil_bf_func.Value() + : key.depth_stencil.stencil_ref_func.Value()), }, - .minDepthBounds = key.depth_bounds_min, - .maxDepthBounds = key.depth_bounds_max, }; - auto stage = u32(Shader::Stage::Vertex); boost::container::static_vector shader_stages; + auto stage = u32(Shader::Stage::Vertex); if (infos[stage]) { shader_stages.emplace_back(vk::PipelineShaderStageCreateInfo{ .stage = vk::ShaderStageFlagBits::eVertex, @@ -197,6 +210,14 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul .pName = "main", }); } + stage = u32(Shader::Stage::Geometry); + if (infos[stage]) { + shader_stages.emplace_back(vk::PipelineShaderStageCreateInfo{ + .stage = vk::ShaderStageFlagBits::eGeometry, + .module = modules[stage], + .pName = "main", + }); + } stage = u32(Shader::Stage::Fragment); if (infos[stage]) { shader_stages.emplace_back(vk::PipelineShaderStageCreateInfo{ @@ -278,7 +299,7 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul .pNext = &pipeline_rendering_ci, .stageCount = static_cast(shader_stages.size()), .pStages = shader_stages.data(), - .pVertexInputState = &vertex_input_info, + .pVertexInputState = !instance.IsVertexInputDynamicState() ? &vertex_input_info : nullptr, .pInputAssemblyState = &input_assembly, .pViewportState = &viewport_info, .pRasterizationState = &raster_state, @@ -289,18 +310,19 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul .layout = *pipeline_layout, }; - auto result = device.createGraphicsPipelineUnique(pipeline_cache, pipeline_info); - if (result.result == vk::Result::eSuccess) { - pipeline = std::move(result.value); - } else { - UNREACHABLE_MSG("Graphics pipeline creation failed!"); - } + auto [pipeline_result, pipe] = + device.createGraphicsPipelineUnique(pipeline_cache, pipeline_info); + ASSERT_MSG(pipeline_result == vk::Result::eSuccess, "Failed to create graphics pipeline: {}", + vk::to_string(pipeline_result)); + pipeline = std::move(pipe); } GraphicsPipeline::~GraphicsPipeline() = default; void GraphicsPipeline::BuildDescSetLayout() { + boost::container::small_vector bindings; u32 binding{}; + for (const auto* stage : stages) { if (!stage) { continue; @@ -312,7 +334,7 @@ void GraphicsPipeline::BuildDescSetLayout() { .descriptorType = buffer.IsStorage(sharp) ? vk::DescriptorType::eStorageBuffer : vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + .stageFlags = gp_stage_flags, }); } for (const auto& tex_buffer : stage->texture_buffers) { @@ -321,7 +343,7 @@ void GraphicsPipeline::BuildDescSetLayout() { .descriptorType = tex_buffer.is_written ? vk::DescriptorType::eStorageTexelBuffer : vk::DescriptorType::eUniformTexelBuffer, .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + .stageFlags = gp_stage_flags, }); } for (const auto& image : stage->images) { @@ -330,7 +352,7 @@ void GraphicsPipeline::BuildDescSetLayout() { .descriptorType = image.is_storage ? vk::DescriptorType::eStorageImage : vk::DescriptorType::eSampledImage, .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + .stageFlags = gp_stage_flags, }); } for (const auto& sampler : stage->samplers) { @@ -338,7 +360,7 @@ void GraphicsPipeline::BuildDescSetLayout() { .binding = binding++, .descriptorType = vk::DescriptorType::eSampler, .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + .stageFlags = gp_stage_flags, }); } } @@ -351,7 +373,11 @@ void GraphicsPipeline::BuildDescSetLayout() { .bindingCount = static_cast(bindings.size()), .pBindings = bindings.data(), }; - desc_layout = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); + auto [layout_result, layout] = + instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); + ASSERT_MSG(layout_result == vk::Result::eSuccess, + "Failed to create graphics descriptor set layout: {}", vk::to_string(layout_result)); + desc_layout = std::move(layout); } void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, @@ -360,11 +386,12 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, // Bind resource buffers and textures. boost::container::static_vector buffer_views; boost::container::static_vector buffer_infos; - boost::container::static_vector image_infos; boost::container::small_vector set_writes; boost::container::small_vector buffer_barriers; Shader::PushData push_data{}; - u32 binding{}; + Shader::Backend::Bindings binding{}; + + image_infos.clear(); for (const auto* stage : stages) { if (!stage) { @@ -374,10 +401,11 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, push_data.step0 = regs.vgt_instance_step_rate_0; push_data.step1 = regs.vgt_instance_step_rate_1; } + stage->PushUd(binding, push_data); for (const auto& buffer : stage->buffers) { const auto vsharp = buffer.GetSharp(*stage); const bool is_storage = buffer.IsStorage(vsharp); - if (vsharp) { + if (vsharp && vsharp.GetSize() > 0) { const VAddr address = vsharp.base_address; if (texture_cache.IsMeta(address)) { LOG_WARNING(Render_Vulkan, "Unexpected metadata read by a PS shader (buffer)"); @@ -389,28 +417,32 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, buffer_cache.ObtainBuffer(address, size, buffer.is_written); const u32 offset_aligned = Common::AlignDown(offset, alignment); const u32 adjust = offset - offset_aligned; - if (adjust != 0) { - ASSERT(adjust % 4 == 0); - push_data.AddOffset(binding, adjust); - } + ASSERT(adjust % 4 == 0); + push_data.AddOffset(binding.buffer, adjust); buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust); - } else { + } else if (instance.IsNullDescriptorSupported()) { buffer_infos.emplace_back(VK_NULL_HANDLE, 0, VK_WHOLE_SIZE); + } else { + auto& null_buffer = buffer_cache.GetBuffer(VideoCore::NULL_BUFFER_ID); + buffer_infos.emplace_back(null_buffer.Handle(), 0, VK_WHOLE_SIZE); } set_writes.push_back({ .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, + .dstBinding = binding.unified++, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = is_storage ? vk::DescriptorType::eStorageBuffer : vk::DescriptorType::eUniformBuffer, .pBufferInfo = &buffer_infos.back(), }); + ++binding.buffer; } + const auto null_buffer_view = + instance.IsNullDescriptorSupported() ? VK_NULL_HANDLE : buffer_cache.NullBufferView(); for (const auto& desc : stage->texture_buffers) { const auto vsharp = desc.GetSharp(*stage); - vk::BufferView& buffer_view = buffer_views.emplace_back(VK_NULL_HANDLE); + vk::BufferView& buffer_view = buffer_views.emplace_back(null_buffer_view); const u32 size = vsharp.GetSize(); if (vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && size != 0) { const VAddr address = vsharp.base_address; @@ -422,10 +454,8 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, "Texel buffer stride must match format stride"); const u32 offset_aligned = Common::AlignDown(offset, alignment); const u32 adjust = offset - offset_aligned; - if (adjust != 0) { - ASSERT(adjust % fmt_stride == 0); - push_data.AddOffset(binding, adjust / fmt_stride); - } + ASSERT(adjust % fmt_stride == 0); + push_data.AddOffset(binding.buffer, adjust / fmt_stride); buffer_view = vk_buffer->View(offset_aligned, size + adjust, desc.is_written, vsharp.GetDataFmt(), vsharp.GetNumberFmt()); const auto dst_access = desc.is_written ? vk::AccessFlagBits2::eShaderWrite @@ -435,54 +465,30 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, buffer_barriers.emplace_back(*barrier); } if (desc.is_written) { - texture_cache.MarkWritten(address, size); + texture_cache.InvalidateMemoryFromGPU(address, size); } } set_writes.push_back({ .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, + .dstBinding = binding.unified++, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = desc.is_written ? vk::DescriptorType::eStorageTexelBuffer : vk::DescriptorType::eUniformTexelBuffer, .pTexelBufferView = &buffer_view, }); + ++binding.buffer; } - boost::container::static_vector tsharps; - for (const auto& image_desc : stage->images) { - const auto tsharp = image_desc.GetSharp(*stage); - if (tsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && tsharp.data_format != 15) { - tsharps.emplace_back(tsharp); - VideoCore::ImageInfo image_info{tsharp, image_desc.is_depth}; - VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage}; - const auto& image_view = texture_cache.FindTexture(image_info, view_info); - const auto& image = texture_cache.GetImage(image_view.image_id); - image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, image.layout); - } else { - image_infos.emplace_back(VK_NULL_HANDLE, VK_NULL_HANDLE, vk::ImageLayout::eGeneral); - } - set_writes.push_back({ - .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = image_desc.is_storage ? vk::DescriptorType::eStorageImage - : vk::DescriptorType::eSampledImage, - .pImageInfo = &image_infos.back(), - }); + BindTextures(texture_cache, *stage, binding, set_writes); - if (texture_cache.IsMeta(tsharp.Address())) { - LOG_WARNING(Render_Vulkan, "Unexpected metadata read by a PS shader (texture)"); - } - } for (const auto& sampler : stage->samplers) { auto ssharp = sampler.GetSharp(*stage); if (ssharp.force_degamma) { LOG_WARNING(Render_Vulkan, "Texture requires gamma correction"); } if (sampler.disable_aniso) { - const auto& tsharp = tsharps[sampler.associated_image]; + const auto& tsharp = stage->images[sampler.associated_image].GetSharp(*stage); if (tsharp.base_level == 0 && tsharp.last_level == 0) { ssharp.max_aniso.Assign(AmdGpu::AnisoRatio::One); } @@ -491,7 +497,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, image_infos.emplace_back(vk_sampler, VK_NULL_HANDLE, vk::ImageLayout::eGeneral); set_writes.push_back({ .dstSet = VK_NULL_HANDLE, - .dstBinding = binding++, + .dstBinding = binding.unified++, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eSampler, @@ -526,9 +532,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs, desc_set, {}); } } - cmdbuf.pushConstants(*pipeline_layout, - vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, 0U, - sizeof(push_data), &push_data); + cmdbuf.pushConstants(*pipeline_layout, gp_stage_flags, 0U, sizeof(push_data), &push_data); cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, Handle()); } diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 7778c4178..f7762eb12 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -5,7 +5,7 @@ #include "common/types.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" #include "video_core/renderer_vulkan/vk_common.h" -#include "video_core/renderer_vulkan/vk_compute_pipeline.h" +#include "video_core/renderer_vulkan/vk_pipeline_common.h" namespace VideoCore { class BufferCache; @@ -26,57 +26,44 @@ using Liverpool = AmdGpu::Liverpool; struct GraphicsPipelineKey { std::array stage_hashes; std::array color_formats; + std::array color_num_formats; std::array mrt_swizzles; vk::Format depth_format; vk::Format stencil_format; - Liverpool::DepthControl depth; - float depth_bounds_min; - float depth_bounds_max; - float depth_bias_const_factor; - float depth_bias_slope_factor; - float depth_bias_clamp; + Liverpool::DepthControl depth_stencil; u32 depth_bias_enable; - u32 num_samples = 1; + u32 num_samples; + u32 mrt_mask; Liverpool::StencilControl stencil; - Liverpool::StencilRefMask stencil_ref_front; - Liverpool::StencilRefMask stencil_ref_back; - Liverpool::PrimitiveType prim_type; + AmdGpu::PrimitiveType prim_type; u32 enable_primitive_restart; u32 primitive_restart_index; Liverpool::PolygonMode polygon_mode; Liverpool::CullMode cull_mode; Liverpool::FrontFace front_face; Liverpool::ClipSpace clip_space; - Liverpool::ColorBufferMask cb_shader_mask{}; + Liverpool::ColorBufferMask cb_shader_mask; std::array blend_controls; std::array write_masks; + std::array vertex_buffer_formats; bool operator==(const GraphicsPipelineKey& key) const noexcept { return std::memcmp(this, &key, sizeof(key)) == 0; } }; -class GraphicsPipeline { +class GraphicsPipeline : public Pipeline { public: - explicit GraphicsPipeline(const Instance& instance, Scheduler& scheduler, - DescriptorHeap& desc_heap, const GraphicsPipelineKey& key, - vk::PipelineCache pipeline_cache, - std::span stages, - std::span modules); + GraphicsPipeline(const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, + const GraphicsPipelineKey& key, vk::PipelineCache pipeline_cache, + std::span stages, + std::span modules); ~GraphicsPipeline(); void BindResources(const Liverpool::Regs& regs, VideoCore::BufferCache& buffer_cache, VideoCore::TextureCache& texture_cache) const; - vk::Pipeline Handle() const noexcept { - return *pipeline; - } - - vk::PipelineLayout GetLayout() const { - return *pipeline_layout; - } - const Shader::Info& GetStage(Shader::Stage stage) const noexcept { return *stages[u32(stage)]; } @@ -90,24 +77,31 @@ public: return key.write_masks; } + auto GetMrtMask() const { + return key.mrt_mask; + } + bool IsDepthEnabled() const { - return key.depth.depth_enable.Value(); + return key.depth_stencil.depth_enable.Value(); + } + + [[nodiscard]] bool IsPrimitiveListTopology() const { + return key.prim_type == AmdGpu::PrimitiveType::PointList || + key.prim_type == AmdGpu::PrimitiveType::LineList || + key.prim_type == AmdGpu::PrimitiveType::TriangleList || + key.prim_type == AmdGpu::PrimitiveType::AdjLineList || + key.prim_type == AmdGpu::PrimitiveType::AdjTriangleList || + key.prim_type == AmdGpu::PrimitiveType::RectList || + key.prim_type == AmdGpu::PrimitiveType::QuadList; } private: void BuildDescSetLayout(); private: - const Instance& instance; - Scheduler& scheduler; - DescriptorHeap& desc_heap; - vk::UniquePipeline pipeline; - vk::UniquePipelineLayout pipeline_layout; - vk::UniqueDescriptorSetLayout desc_layout; std::array stages{}; GraphicsPipelineKey key; bool uses_push_descriptors{}; - boost::container::small_vector bindings; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 035830d3e..e2bc995a6 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -14,17 +14,26 @@ #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_platform.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnullability-completeness" #include -#pragma GCC diagnostic pop namespace Vulkan { namespace { +std::vector EnumeratePhysicalDevices(vk::UniqueInstance& instance) { + auto [devices_result, devices] = instance->enumeratePhysicalDevices(); + ASSERT_MSG(devices_result == vk::Result::eSuccess, "Failed to enumerate physical devices: {}", + vk::to_string(devices_result)); + return std::move(devices); +} + std::vector GetSupportedExtensions(vk::PhysicalDevice physical) { - const std::vector extensions = physical.enumerateDeviceExtensionProperties(); + const auto [extensions_result, extensions] = physical.enumerateDeviceExtensionProperties(); + if (extensions_result != vk::Result::eSuccess) { + LOG_ERROR(Render_Vulkan, "Could not query supported extensions: {}", + vk::to_string(extensions_result)); + return {}; + } std::vector supported_extensions; supported_extensions.reserve(extensions.size()); for (const auto& extension : extensions) { @@ -33,11 +42,41 @@ std::vector GetSupportedExtensions(vk::PhysicalDevice physical) { return supported_extensions; } -std::unordered_map GetFormatProperties( +vk::FormatProperties3 GetFormatProperties(vk::PhysicalDevice physical, vk::Format format) { + vk::FormatProperties3 properties3{}; + vk::FormatProperties2 properties2 = { + .pNext = &properties3, + }; + physical.getFormatProperties2(format, &properties2); + return properties3; +} + +std::unordered_map GetFormatProperties( vk::PhysicalDevice physical) { - std::unordered_map format_properties; - for (const auto& format : LiverpoolToVK::GetAllFormats()) { - format_properties.emplace(format, physical.getFormatProperties(format)); + std::unordered_map format_properties; + for (const auto& format_info : LiverpoolToVK::SurfaceFormats()) { + const auto format = format_info.vk_format; + if (!format_properties.contains(format)) { + format_properties.emplace(format, GetFormatProperties(physical, format)); + } + } + for (const auto& format_info : LiverpoolToVK::DepthFormats()) { + const auto format = format_info.vk_format; + if (!format_properties.contains(format)) { + format_properties.emplace(format, GetFormatProperties(physical, format)); + } + } + // Other miscellaneous formats, e.g. for color buffers, swizzles, or compatibility + static constexpr std::array misc_formats = { + vk::Format::eA2R10G10B10UnormPack32, vk::Format::eA8B8G8R8UnormPack32, + vk::Format::eA8B8G8R8SrgbPack32, vk::Format::eB8G8R8A8Unorm, + vk::Format::eB8G8R8A8Srgb, vk::Format::eR5G6B5UnormPack16, + vk::Format::eD24UnormS8Uint, + }; + for (const auto& format : misc_formats) { + if (!format_properties.contains(format)) { + format_properties.emplace(format, GetFormatProperties(physical, format)); + } } return format_properties; } @@ -52,13 +91,13 @@ std::string GetReadableVersion(u32 version) { Instance::Instance(bool enable_validation, bool enable_crash_diagnostic) : instance{CreateInstance(Frontend::WindowSystemType::Headless, enable_validation, enable_crash_diagnostic)}, - physical_devices{instance->enumeratePhysicalDevices()} {} + physical_devices{EnumeratePhysicalDevices(instance)} {} Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index, bool enable_validation /*= false*/, bool enable_crash_diagnostic /*= false*/) : instance{CreateInstance(window.getWindowInfo().type, enable_validation, enable_crash_diagnostic)}, - physical_devices{instance->enumeratePhysicalDevices()} { + physical_devices{EnumeratePhysicalDevices(instance)} { if (enable_validation) { debug_callback = CreateDebugCallback(*instance); } @@ -120,22 +159,23 @@ Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index, CollectToolingInfo(); // Check and log format support details. - for (const auto& key : format_properties | std::views::keys) { - const auto format = key; - if (!IsImageFormatSupported(format)) { - const auto alternative = GetAlternativeFormat(format); - if (IsImageFormatSupported(alternative)) { - LOG_WARNING(Render_Vulkan, - "Format {} is not supported for images, falling back to {}.", - vk::to_string(format), vk::to_string(alternative)); - } else if (IsVertexFormatSupported(format)) { - LOG_WARNING(Render_Vulkan, "Format {} is only supported for vertex buffers.", - vk::to_string(format)); - } else { - LOG_ERROR(Render_Vulkan, - "Format {} is not supported and no suitable alternative is supported.", - vk::to_string(format)); - } + for (const auto& format : LiverpoolToVK::SurfaceFormats()) { + if (!IsFormatSupported(GetSupportedFormat(format.vk_format, format.flags), format.flags)) { + LOG_WARNING(Render_Vulkan, + "Surface format data_format={}, number_format={} is not fully supported " + "(vk_format={}, requested flags={})", + static_cast(format.data_format), + static_cast(format.number_format), vk::to_string(format.vk_format), + vk::to_string(format.flags)); + } + } + for (const auto& format : LiverpoolToVK::DepthFormats()) { + if (!IsFormatSupported(GetSupportedFormat(format.vk_format, format.flags), format.flags)) { + LOG_WARNING(Render_Vulkan, + "Depth format z_format={}, stencil_format={} is not fully supported " + "(vk_format={}, requested flags={})", + static_cast(format.z_format), static_cast(format.stencil_format), + vk::to_string(format.vk_format), vk::to_string(format.flags)); } } } @@ -220,9 +260,8 @@ bool Instance::CreateDevice() { color_write_en &= add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); const bool calibrated_timestamps = add_extension(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME); const bool robustness = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); - const bool topology_restart = - add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME); - const bool maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); + list_restart = add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME); + maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); // These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2 // with extensions. @@ -232,6 +271,7 @@ bool Instance::CreateDevice() { add_extension(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); + add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); #ifdef __APPLE__ // Required by Vulkan spec if supported. @@ -277,10 +317,12 @@ bool Instance::CreateDevice() { vk::PhysicalDeviceFeatures2{ .features{ .robustBufferAccess = features.robustBufferAccess, + .imageCubeArray = features.imageCubeArray, .independentBlend = features.independentBlend, .geometryShader = features.geometryShader, .logicOp = features.logicOp, .depthBiasClamp = features.depthBiasClamp, + .fillModeNonSolid = features.fillModeNonSolid, .multiViewport = features.multiViewport, .samplerAnisotropy = features.samplerAnisotropy, .vertexPipelineStoresAndAtomics = features.vertexPipelineStoresAndAtomics, @@ -289,6 +331,7 @@ bool Instance::CreateDevice() { .shaderStorageImageExtendedFormats = features.shaderStorageImageExtendedFormats, .shaderStorageImageMultisample = features.shaderStorageImageMultisample, .shaderClipDistance = features.shaderClipDistance, + .shaderFloat64 = features.shaderFloat64, .shaderInt64 = features.shaderInt64, .shaderInt16 = features.shaderInt16, }, @@ -297,6 +340,7 @@ bool Instance::CreateDevice() { .shaderDrawParameters = true, }, vk::PhysicalDeviceVulkan12Features{ + .samplerMirrorClampToEdge = vk12_features.samplerMirrorClampToEdge, .shaderFloat16 = vk12_features.shaderFloat16, .scalarBlockLayout = vk12_features.scalarBlockLayout, .uniformBufferStandardLayout = vk12_features.uniformBufferStandardLayout, @@ -323,6 +367,9 @@ bool Instance::CreateDevice() { vk::PhysicalDeviceColorWriteEnableFeaturesEXT{ .colorWriteEnable = true, }, + vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT{ + .extendedDynamicState = true, + }, vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT{ .extendedDynamicState3ColorWriteMask = true, }, @@ -373,28 +420,28 @@ bool Instance::CreateDevice() { if (!workgroup_memory_explicit_layout) { device_chain.unlink(); } - if (!topology_restart) { + if (!list_restart) { device_chain.unlink(); } if (robustness) { - device_chain.get().nullDescriptor = + null_descriptor = feature_chain.get().nullDescriptor; + device_chain.get().nullDescriptor = + null_descriptor; } else { + null_descriptor = false; device_chain.unlink(); } if (!vertex_input_dynamic_state) { device_chain.unlink(); } - try { - device = physical_device.createDeviceUnique(device_chain.get()); - } catch (vk::ExtensionNotPresentError& err) { - LOG_CRITICAL(Render_Vulkan, "Some required extensions are not available {}", err.what()); - return false; - } catch (vk::FeatureNotPresentError& err) { - LOG_CRITICAL(Render_Vulkan, "Some required features are not available {}", err.what()); + auto [device_result, dev] = physical_device.createDeviceUnique(device_chain.get()); + if (device_result != vk::Result::eSuccess) { + LOG_CRITICAL(Render_Vulkan, "Failed to create device: {}", vk::to_string(device_result)); return false; } + device = std::move(dev); VULKAN_HPP_DEFAULT_DISPATCHER.init(*device); @@ -402,27 +449,33 @@ bool Instance::CreateDevice() { present_queue = device->getQueue(queue_family_index, 0); if (calibrated_timestamps) { - const auto& time_domains = physical_device.getCalibrateableTimeDomainsEXT(); + const auto [time_domains_result, time_domains] = + physical_device.getCalibrateableTimeDomainsEXT(); + if (time_domains_result == vk::Result::eSuccess) { #if _WIN64 - const bool has_host_time_domain = - std::find(time_domains.cbegin(), time_domains.cend(), - vk::TimeDomainEXT::eQueryPerformanceCounter) != time_domains.cend(); + const bool has_host_time_domain = + std::find(time_domains.cbegin(), time_domains.cend(), + vk::TimeDomainEXT::eQueryPerformanceCounter) != time_domains.cend(); #elif __linux__ - const bool has_host_time_domain = - std::find(time_domains.cbegin(), time_domains.cend(), - vk::TimeDomainEXT::eClockMonotonicRaw) != time_domains.cend(); + const bool has_host_time_domain = + std::find(time_domains.cbegin(), time_domains.cend(), + vk::TimeDomainEXT::eClockMonotonicRaw) != time_domains.cend(); #else - // Tracy limitation means only Windows and Linux can use host time domain. - // https://github.com/shadps4-emu/tracy/blob/c6d779d78508514102fbe1b8eb28bda10d95bb2a/public/tracy/TracyVulkan.hpp#L384-L389 - const bool has_host_time_domain = false; + // Tracy limitation means only Windows and Linux can use host time domain. + // https://github.com/shadps4-emu/tracy/blob/c6d779d78508514102fbe1b8eb28bda10d95bb2a/public/tracy/TracyVulkan.hpp#L384-L389 + const bool has_host_time_domain = false; #endif - if (has_host_time_domain) { - static constexpr std::string_view context_name{"vk_rasterizer"}; - profiler_context = - TracyVkContextHostCalibrated(*instance, physical_device, *device, - VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr, - VULKAN_HPP_DEFAULT_DISPATCHER.vkGetDeviceProcAddr); - TracyVkContextName(profiler_context, context_name.data(), context_name.size()); + if (has_host_time_domain) { + static constexpr std::string_view context_name{"vk_rasterizer"}; + profiler_context = TracyVkContextHostCalibrated( + *instance, physical_device, *device, + VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr, + VULKAN_HPP_DEFAULT_DISPATCHER.vkGetDeviceProcAddr); + TracyVkContextName(profiler_context, context_name.data(), context_name.size()); + } + } else { + LOG_WARNING(Render_Vulkan, "Could not query calibrated time domains for profiling: {}", + vk::to_string(time_domains_result)); } } @@ -478,7 +531,12 @@ void Instance::CollectToolingInfo() { if (!tooling_info) { return; } - const auto tools = physical_device.getToolPropertiesEXT(); + const auto [tools_result, tools] = physical_device.getToolPropertiesEXT(); + if (tools_result != vk::Result::eSuccess) { + LOG_ERROR(Render_Vulkan, "Could not get Vulkan tool properties: {}", + vk::to_string(tools_result)); + return; + } for (const vk::PhysicalDeviceToolProperties& tool : tools) { const std::string_view name = tool.name; LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name); @@ -487,7 +545,8 @@ void Instance::CollectToolingInfo() { } } -bool Instance::IsImageFormatSupported(const vk::Format format) const { +bool Instance::IsFormatSupported(const vk::Format format, + const vk::FormatFeatureFlags2 flags) const { if (format == vk::Format::eUndefined) [[unlikely]] { return true; } @@ -497,49 +556,36 @@ bool Instance::IsImageFormatSupported(const vk::Format format) const { UNIMPLEMENTED_MSG("Properties of format {} have not been queried.", vk::to_string(format)); } - constexpr vk::FormatFeatureFlags optimal_flags = vk::FormatFeatureFlagBits::eTransferSrc | - vk::FormatFeatureFlagBits::eTransferDst | - vk::FormatFeatureFlagBits::eSampledImage; - return (it->second.optimalTilingFeatures & optimal_flags) == optimal_flags; + return ((it->second.optimalTilingFeatures | it->second.bufferFeatures) & flags) == flags; } -bool Instance::IsVertexFormatSupported(const vk::Format format) const { - if (format == vk::Format::eUndefined) [[unlikely]] { - return true; - } - - const auto it = format_properties.find(format); - if (it == format_properties.end()) { - UNIMPLEMENTED_MSG("Properties of format {} have not been queried.", vk::to_string(format)); - } - - constexpr vk::FormatFeatureFlags optimal_flags = vk::FormatFeatureFlagBits::eVertexBuffer; - return (it->second.bufferFeatures & optimal_flags) == optimal_flags; -} - -vk::Format Instance::GetAlternativeFormat(const vk::Format format) const { - if (format == vk::Format::eB5G6R5UnormPack16) { +static vk::Format GetAlternativeFormat(const vk::Format format) { + switch (format) { + case vk::Format::eB5G6R5UnormPack16: return vk::Format::eR5G6B5UnormPack16; - } else if (format == vk::Format::eD16UnormS8Uint) { + case vk::Format::eD16UnormS8Uint: return vk::Format::eD24UnormS8Uint; + default: + return format; } - return format; } -vk::Format Instance::GetSupportedFormat(const vk::Format format) const { - if (IsImageFormatSupported(format)) [[likely]] { +vk::Format Instance::GetSupportedFormat(const vk::Format format, + const vk::FormatFeatureFlags2 flags) const { + if (IsFormatSupported(format, flags)) [[likely]] { return format; } const vk::Format alternative = GetAlternativeFormat(format); - if (IsImageFormatSupported(alternative)) [[likely]] { + if (IsFormatSupported(alternative, flags)) [[likely]] { return alternative; } return format; } -vk::ComponentMapping Instance::GetSupportedComponentSwizzle(vk::Format format, - vk::ComponentMapping swizzle) const { - if (IsImageFormatSupported(format)) [[likely]] { +vk::ComponentMapping Instance::GetSupportedComponentSwizzle( + const vk::Format format, const vk::ComponentMapping swizzle, + const vk::FormatFeatureFlags2 flags) const { + if (IsFormatSupported(format, flags)) [[likely]] { return swizzle; } diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index a64c77a57..d77d0c20f 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -30,11 +30,12 @@ public: std::string GetDriverVersionName(); /// Gets a compatibility format if the format is not supported. - [[nodiscard]] vk::Format GetSupportedFormat(vk::Format format) const; + [[nodiscard]] vk::Format GetSupportedFormat(vk::Format format, + vk::FormatFeatureFlags2 flags) const; /// Re-orders a component swizzle for format compatibility, if needed. [[nodiscard]] vk::ComponentMapping GetSupportedComponentSwizzle( - vk::Format format, vk::ComponentMapping swizzle) const; + vk::Format format, vk::ComponentMapping swizzle, vk::FormatFeatureFlags2 flags) const; /// Returns the Vulkan instance vk::Instance GetInstance() const { @@ -132,6 +133,30 @@ public: return vertex_input_dynamic_state; } + /// Returns true when the nullDescriptor feature of VK_EXT_robustness2 is supported. + bool IsNullDescriptorSupported() const { + return null_descriptor; + } + + /// Returns true when VK_KHR_maintenance5 is supported. + bool IsMaintenance5Supported() const { + return maintenance5; + } + + bool IsListRestartSupported() const { + return list_restart; + } + + /// Returns true when geometry shaders are supported by the device + bool IsGeometryStageSupported() const { + return features.geometryShader; + } + + /// Returns true when tessellation is supported by the device + bool IsTessellationSupported() const { + return features.tessellationShader; + } + /// Returns the vendor ID of the physical device u32 GetVendorID() const { return properties.vendorID; @@ -207,6 +232,11 @@ public: return properties.limits.maxTexelBufferElements; } + /// Returns the maximum sampler LOD bias. + float MaxSamplerLodBias() const { + return properties.limits.maxSamplerLodBias; + } + /// Returns the maximum number of push descriptors. u32 MaxPushDescriptors() const { return push_descriptor_props.maxPushDescriptors; @@ -222,6 +252,13 @@ public: return min_imported_host_pointer_alignment; } + /// Returns the sample count flags supported by framebuffers. + vk::SampleCountFlags GetFramebufferSampleCounts() const { + return properties.limits.framebufferColorSampleCounts & + properties.limits.framebufferDepthSampleCounts & + properties.limits.framebufferStencilSampleCounts; + } + private: /// Creates the logical device opportunistically enabling extensions bool CreateDevice(); @@ -233,14 +270,8 @@ private: void CollectDeviceParameters(); void CollectToolingInfo(); - /// Determines if a format is supported for images. - [[nodiscard]] bool IsImageFormatSupported(vk::Format format) const; - - /// Determines if a format is supported for vertex buffers. - [[nodiscard]] bool IsVertexFormatSupported(vk::Format format) const; - - /// Gets a commonly available alternative for an unsupported pixel format. - vk::Format GetAlternativeFormat(const vk::Format format) const; + /// Determines if a format is supported for a set of feature flags. + [[nodiscard]] bool IsFormatSupported(vk::Format format, vk::FormatFeatureFlags2 flags) const; private: vk::UniqueInstance instance; @@ -257,7 +288,7 @@ private: vk::Queue graphics_queue; std::vector physical_devices; std::vector available_extensions; - std::unordered_map format_properties; + std::unordered_map format_properties; TracyVkCtx profiler_context{}; u32 queue_family_index{0}; bool image_view_reinterpretation{true}; @@ -272,6 +303,9 @@ private: bool workgroup_memory_explicit_layout{}; bool color_write_en{}; bool vertex_input_dynamic_state{}; + bool null_descriptor{}; + bool maintenance5{}; + bool list_restart{}; u64 min_imported_host_pointer_alignment{}; u32 subgroup_size{}; bool tooling_info{}; diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index 753f2bbdf..00f63681e 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp @@ -5,6 +5,8 @@ #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_master_semaphore.h" +#include "common/assert.h" + namespace Vulkan { constexpr u64 WAIT_TIMEOUT = std::numeric_limits::max(); @@ -17,7 +19,11 @@ MasterSemaphore::MasterSemaphore(const Instance& instance_) : instance{instance_ .initialValue = 0, }, }; - semaphore = instance.GetDevice().createSemaphoreUnique(semaphore_chain.get()); + auto [semaphore_result, sem] = + instance.GetDevice().createSemaphoreUnique(semaphore_chain.get()); + ASSERT_MSG(semaphore_result == vk::Result::eSuccess, "Failed to create master semaphore: {}", + vk::to_string(semaphore_result)); + semaphore = std::move(sem); } MasterSemaphore::~MasterSemaphore() = default; @@ -27,7 +33,10 @@ void MasterSemaphore::Refresh() { u64 counter{}; do { this_tick = gpu_tick.load(std::memory_order_acquire); - counter = instance.GetDevice().getSemaphoreCounterValue(*semaphore); + auto [counter_result, cntr] = instance.GetDevice().getSemaphoreCounterValue(*semaphore); + ASSERT_MSG(counter_result == vk::Result::eSuccess, + "Failed to get master semaphore value: {}", vk::to_string(counter_result)); + counter = cntr; if (counter < this_tick) { return; } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 0a5bb081a..929fa9cc1 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -7,7 +7,10 @@ #include "common/io_file.h" #include "common/path_util.h" #include "shader_recompiler/backend/spirv/emit_spirv.h" +#include "shader_recompiler/frontend/copy_shader.h" #include "shader_recompiler/info.h" +#include "shader_recompiler/recompiler.h" +#include "shader_recompiler/runtime_info.h" #include "video_core/renderer_vulkan/renderer_vulkan.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_pipeline_cache.h" @@ -82,6 +85,13 @@ Shader::RuntimeInfo PipelineCache::BuildRuntimeInfo(Shader::Stage stage) { auto info = Shader::RuntimeInfo{stage}; const auto& regs = liverpool->regs; switch (stage) { + case Shader::Stage::Export: { + info.num_user_data = regs.es_program.settings.num_user_regs; + info.num_input_vgprs = regs.es_program.settings.vgpr_comp_cnt; + info.num_allocated_vgprs = regs.es_program.settings.num_vgprs * 4; + info.es_info.vertex_data_size = regs.vgt_esgs_ring_itemsize; + break; + } case Shader::Stage::Vertex: { info.num_user_data = regs.vs_program.settings.num_user_regs; info.num_input_vgprs = regs.vs_program.settings.vgpr_comp_cnt; @@ -92,13 +102,32 @@ Shader::RuntimeInfo PipelineCache::BuildRuntimeInfo(Shader::Stage stage) { regs.clipper_control.clip_space == Liverpool::ClipSpace::MinusWToW; break; } + case Shader::Stage::Geometry: { + info.num_user_data = regs.gs_program.settings.num_user_regs; + info.num_input_vgprs = regs.gs_program.settings.vgpr_comp_cnt; + info.num_allocated_vgprs = regs.gs_program.settings.num_vgprs * 4; + info.gs_info.output_vertices = regs.vgt_gs_max_vert_out; + info.gs_info.num_invocations = + regs.vgt_gs_instance_cnt.IsEnabled() ? regs.vgt_gs_instance_cnt.count : 1; + info.gs_info.in_primitive = regs.primitive_type; + for (u32 stream_id = 0; stream_id < Shader::GsMaxOutputStreams; ++stream_id) { + info.gs_info.out_primitive[stream_id] = + regs.vgt_gs_out_prim_type.GetPrimitiveType(stream_id); + } + info.gs_info.in_vertex_data_size = regs.vgt_esgs_ring_itemsize; + info.gs_info.out_vertex_data_size = regs.vgt_gs_vert_itemsize[0]; + + // Extract semantics offsets from a copy shader + const auto vc_stage = Shader::Stage::Vertex; + const auto* pgm_vc = regs.ProgramForStage(static_cast(vc_stage)); + const auto params_vc = Liverpool::GetParams(*pgm_vc); + DumpShader(params_vc.code, params_vc.hash, Shader::Stage::Vertex, 0, "copy.bin"); + info.gs_info.copy_data = Shader::ParseCopyShader(params_vc.code); + break; + } case Shader::Stage::Fragment: { info.num_user_data = regs.ps_program.settings.num_user_regs; info.num_allocated_vgprs = regs.ps_program.settings.num_vgprs * 4; - std::ranges::transform(graphics_key.mrt_swizzles, info.fs_info.mrt_swizzles.begin(), - [](Liverpool::ColorBuffer::SwapMode mode) { - return static_cast(mode); - }); const auto& ps_inputs = regs.ps_inputs; for (u32 i = 0; i < regs.num_interp; i++) { info.fs_info.inputs.push_back({ @@ -108,6 +137,12 @@ Shader::RuntimeInfo PipelineCache::BuildRuntimeInfo(Shader::Stage stage) { .default_value = u8(ps_inputs[i].default_value), }); } + for (u32 i = 0; i < Shader::MaxColorBuffers; i++) { + info.fs_info.color_buffers[i] = { + .num_format = graphics_key.color_num_formats[i], + .mrt_swizzle = static_cast(graphics_key.mrt_swizzles[i]), + }; + } break; } case Shader::Stage::Compute: { @@ -136,7 +171,10 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, .subgroup_size = instance.SubgroupSize(), .support_explicit_workgroup_layout = true, }; - pipeline_cache = instance.GetDevice().createPipelineCacheUnique({}); + auto [cache_result, cache] = instance.GetDevice().createPipelineCacheUnique({}); + ASSERT_MSG(cache_result == vk::Result::eSuccess, "Failed to create pipeline cache: {}", + vk::to_string(cache_result)); + pipeline_cache = std::move(cache); } PipelineCache::~PipelineCache() = default; @@ -144,7 +182,7 @@ PipelineCache::~PipelineCache() = default; const GraphicsPipeline* PipelineCache::GetGraphicsPipeline() { const auto& regs = liverpool->regs; // Tessellation is unsupported so skip the draw to avoid locking up the driver. - if (regs.primitive_type == Liverpool::PrimitiveType::PatchPrimitive) { + if (regs.primitive_type == AmdGpu::PrimitiveType::PatchPrimitive) { return nullptr; } // There are several cases (e.g. FCE, FMask/HTile decompression) where we don't need to do an @@ -158,16 +196,19 @@ const GraphicsPipeline* PipelineCache::GetGraphicsPipeline() { LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped"); return nullptr; } + if (regs.primitive_type == AmdGpu::PrimitiveType::None) { + LOG_TRACE(Render_Vulkan, "Primitive type 'None' skipped"); + return nullptr; + } if (!RefreshGraphicsKey()) { return nullptr; } const auto [it, is_new] = graphics_pipelines.try_emplace(graphics_key); if (is_new) { - it.value() = std::make_unique( - instance, scheduler, desc_heap, graphics_key, *pipeline_cache, infos, modules); + it.value() = graphics_pipeline_pool.Create(instance, scheduler, desc_heap, graphics_key, + *pipeline_cache, infos, modules); } - const GraphicsPipeline* pipeline = it->second.get(); - return pipeline; + return it->second; } const ComputePipeline* PipelineCache::GetComputePipeline() { @@ -176,53 +217,45 @@ const ComputePipeline* PipelineCache::GetComputePipeline() { } const auto [it, is_new] = compute_pipelines.try_emplace(compute_key); if (is_new) { - it.value() = std::make_unique( - instance, scheduler, desc_heap, *pipeline_cache, compute_key, *infos[0], modules[0]); + it.value() = compute_pipeline_pool.Create(instance, scheduler, desc_heap, *pipeline_cache, + compute_key, *infos[0], modules[0]); } - const ComputePipeline* pipeline = it->second.get(); - return pipeline; -} - -bool ShouldSkipShader(u64 shader_hash, const char* shader_type) { - static constexpr std::array skip_hashes = { - 0x35e6d1c958998c1eULL, - // debugbreak called if not skipped - 0xdd2e7072, 0xc5f6bede, - // Unhandled exception at 0x0000000900BD6A88 in shadps4.exe: 0xC0000005: Access violation - // reading location 0xFFFFFFFFFFFFFFFF - //(int 0x41 in game disassembly) if not skipped - 0x1651ce59, 0x9f991c28 // causes above error, disables splash screen. - }; - if (std::ranges::contains(skip_hashes, shader_hash)) { - LOG_WARNING(Render_Vulkan, "Skipped {} shader hash {:#x}.", shader_type, shader_hash); - return true; - } - return false; + return it->second; } bool PipelineCache::RefreshGraphicsKey() { + std::memset(&graphics_key, 0, sizeof(GraphicsPipelineKey)); + auto& regs = liverpool->regs; auto& key = graphics_key; - key.depth = regs.depth_control; - key.depth.depth_write_enable.Assign(regs.depth_control.depth_write_enable.Value() && - !regs.depth_render_control.depth_clear_enable); - key.depth_bounds_min = regs.depth_bounds_min; - key.depth_bounds_max = regs.depth_bounds_max; - key.depth_bias_enable = regs.polygon_control.enable_polygon_offset_back || - regs.polygon_control.enable_polygon_offset_front || - regs.polygon_control.enable_polygon_offset_para; - if (regs.polygon_control.enable_polygon_offset_front) { - key.depth_bias_const_factor = regs.poly_offset.front_offset; - key.depth_bias_slope_factor = regs.poly_offset.front_scale; + key.depth_stencil = regs.depth_control; + key.depth_stencil.depth_write_enable.Assign(regs.depth_control.depth_write_enable.Value() && + !regs.depth_render_control.depth_clear_enable); + key.depth_bias_enable = regs.polygon_control.NeedsBias(); + + const auto& db = regs.depth_buffer; + const auto ds_format = instance.GetSupportedFormat( + LiverpoolToVK::DepthFormat(db.z_info.format, db.stencil_info.format), + vk::FormatFeatureFlagBits2::eDepthStencilAttachment); + if (db.z_info.format != AmdGpu::Liverpool::DepthBuffer::ZFormat::Invalid) { + key.depth_format = ds_format; } else { - key.depth_bias_const_factor = regs.poly_offset.back_offset; - key.depth_bias_slope_factor = regs.poly_offset.back_scale; + key.depth_format = vk::Format::eUndefined; + } + if (regs.depth_control.depth_enable) { + key.depth_stencil.depth_enable.Assign(key.depth_format != vk::Format::eUndefined); } - key.depth_bias_clamp = regs.poly_offset.depth_bias; key.stencil = regs.stencil_control; - key.stencil_ref_front = regs.stencil_ref_front; - key.stencil_ref_back = regs.stencil_ref_back; + + if (db.stencil_info.format != AmdGpu::Liverpool::DepthBuffer::StencilFormat::Invalid) { + key.stencil_format = key.depth_format; + } else { + key.stencil_format = vk::Format::eUndefined; + } + if (key.depth_stencil.stencil_enable) { + key.depth_stencil.stencil_enable.Assign(key.stencil_format != vk::Format::eUndefined); + } key.prim_type = regs.primitive_type; key.enable_primitive_restart = regs.enable_primitive_restart & 1; key.primitive_restart_index = regs.primitive_restart_index; @@ -232,39 +265,22 @@ bool PipelineCache::RefreshGraphicsKey() { key.front_face = regs.polygon_control.front_face; key.num_samples = regs.aa_config.NumSamples(); - const auto& db = regs.depth_buffer; - const auto ds_format = LiverpoolToVK::DepthFormat(db.z_info.format, db.stencil_info.format); - - if (db.z_info.format != AmdGpu::Liverpool::DepthBuffer::ZFormat::Invalid) { - key.depth_format = ds_format; - } else { - key.depth_format = vk::Format::eUndefined; - } - if (key.depth.depth_enable) { - key.depth.depth_enable.Assign(key.depth_format != vk::Format::eUndefined); - } - - if (db.stencil_info.format != AmdGpu::Liverpool::DepthBuffer::StencilFormat::Invalid) { - key.stencil_format = key.depth_format; - } else { - key.stencil_format = vk::Format::eUndefined; - } - if (key.depth.stencil_enable) { - key.depth.stencil_enable.Assign(key.stencil_format != vk::Format::eUndefined); - } - - const auto skip_cb_binding = + const bool skip_cb_binding = regs.color_control.mode == AmdGpu::Liverpool::ColorControl::OperationMode::Disable; // `RenderingInfo` is assumed to be initialized with a contiguous array of valid color - // attachments. This might be not a case as HW color buffers can be bound in an arbitrary order. - // We need to do some arrays compaction at this stage + // attachments. This might be not a case as HW color buffers can be bound in an arbitrary + // order. We need to do some arrays compaction at this stage key.color_formats.fill(vk::Format::eUndefined); + key.color_num_formats.fill(AmdGpu::NumberFormat::Unorm); key.blend_controls.fill({}); key.write_masks.fill({}); key.mrt_swizzles.fill(Liverpool::ColorBuffer::SwapMode::Standard); - int remapped_cb{}; - for (auto cb = 0u; cb < Liverpool::NumColorBuffers; ++cb) { + key.vertex_buffer_formats.fill(vk::Format::eUndefined); + + // First pass of bindings check to idenitfy formats and swizzles and pass them to rhe shader + // recompiler. + for (auto cb = 0u, remapped_cb = 0u; cb < Liverpool::NumColorBuffers; ++cb) { auto const& col_buf = regs.color_buffers[cb]; if (skip_cb_binding || !col_buf || !regs.color_target_mask.GetMask(cb)) { continue; @@ -274,70 +290,121 @@ bool PipelineCache::RefreshGraphicsKey() { const bool is_vo_surface = renderer->IsVideoOutSurface(col_buf); key.color_formats[remapped_cb] = LiverpoolToVK::AdjustColorBufferFormat( base_format, col_buf.info.comp_swap.Value(), false /*is_vo_surface*/); + key.color_num_formats[remapped_cb] = col_buf.NumFormat(); if (base_format == key.color_formats[remapped_cb]) { key.mrt_swizzles[remapped_cb] = col_buf.info.comp_swap.Value(); } - key.blend_controls[remapped_cb] = regs.blend_control[cb]; - key.blend_controls[remapped_cb].enable.Assign(key.blend_controls[remapped_cb].enable && - !col_buf.info.blend_bypass); - key.write_masks[remapped_cb] = vk::ColorComponentFlags{regs.color_target_mask.GetMask(cb)}; - key.cb_shader_mask = regs.color_shader_mask; ++remapped_cb; } - u32 binding{}; - for (u32 i = 0; i < MaxShaderStages; i++) { - if (!regs.stage_enable.IsStageEnabled(i)) { - key.stage_hashes[i] = 0; - infos[i] = nullptr; - continue; + Shader::Backend::Bindings binding{}; + const auto& TryBindStageRemap = [&](Shader::Stage stage_in, Shader::Stage stage_out) -> bool { + const auto stage_in_idx = static_cast(stage_in); + const auto stage_out_idx = static_cast(stage_out); + if (!regs.stage_enable.IsStageEnabled(stage_in_idx)) { + key.stage_hashes[stage_out_idx] = 0; + infos[stage_out_idx] = nullptr; + return false; } - auto* pgm = regs.ProgramForStage(i); + + const auto* pgm = regs.ProgramForStage(stage_in_idx); if (!pgm || !pgm->Address()) { - key.stage_hashes[i] = 0; - infos[i] = nullptr; - continue; + key.stage_hashes[stage_out_idx] = 0; + infos[stage_out_idx] = nullptr; + return false; } + const auto* bininfo = Liverpool::GetBinaryInfo(*pgm); if (!bininfo->Valid()) { LOG_WARNING(Render_Vulkan, "Invalid binary info structure!"); - key.stage_hashes[i] = 0; - infos[i] = nullptr; + key.stage_hashes[stage_out_idx] = 0; + infos[stage_out_idx] = nullptr; + return false; + } + + auto params = Liverpool::GetParams(*pgm); + std::tie(infos[stage_out_idx], modules[stage_out_idx], key.stage_hashes[stage_out_idx]) = + GetProgram(stage_in, params, binding); + return true; + }; + + const auto& TryBindStage = [&](Shader::Stage stage) { return TryBindStageRemap(stage, stage); }; + + const auto& IsGsFeaturesSupported = [&]() -> bool { + // These checks are temporary until all functionality is implemented. + return !regs.vgt_gs_mode.onchip && !regs.vgt_strmout_config.raw; + }; + + TryBindStage(Shader::Stage::Fragment); + + const auto* fs_info = infos[static_cast(Shader::Stage::Fragment)]; + key.mrt_mask = fs_info ? fs_info->mrt_mask : 0u; + + switch (regs.stage_enable.raw) { + case Liverpool::ShaderStageEnable::VgtStages::EsGs: { + if (!instance.IsGeometryStageSupported() || !IsGsFeaturesSupported()) { + break; + } + if (!TryBindStageRemap(Shader::Stage::Export, Shader::Stage::Vertex)) { + return false; + } + if (!TryBindStage(Shader::Stage::Geometry)) { + return false; + } + break; + } + default: { + TryBindStage(Shader::Stage::Vertex); + infos[static_cast(Shader::Stage::Geometry)] = nullptr; + break; + } + } + + const auto* vs_info = infos[static_cast(Shader::Stage::Vertex)]; + if (vs_info && !instance.IsVertexInputDynamicState()) { + u32 vertex_binding = 0; + for (const auto& input : vs_info->vs_inputs) { + if (input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate0 || + input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate1) { + continue; + } + const auto& buffer = + vs_info->ReadUd(input.sgpr_base, input.dword_offset); + if (buffer.GetSize() == 0) { + continue; + } + ASSERT(vertex_binding < MaxVertexBufferCount); + key.vertex_buffer_formats[vertex_binding++] = + Vulkan::LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()); + } + } + + // Second pass to fill remain CB pipeline key data + for (auto cb = 0u, remapped_cb = 0u; cb < Liverpool::NumColorBuffers; ++cb) { + auto const& col_buf = regs.color_buffers[cb]; + if (skip_cb_binding || !col_buf || !regs.color_target_mask.GetMask(cb) || + (key.mrt_mask & (1u << cb)) == 0) { + key.color_formats[cb] = vk::Format::eUndefined; + key.mrt_swizzles[cb] = Liverpool::ColorBuffer::SwapMode::Standard; continue; } - if (ShouldSkipShader(bininfo->shader_hash, "graphics")) { - return false; - } - const auto stage = Shader::StageFromIndex(i); - const auto params = Liverpool::GetParams(*pgm); - if (stage != Shader::Stage::Vertex && stage != Shader::Stage::Fragment) { - return false; - } + key.blend_controls[remapped_cb] = regs.blend_control[cb]; + key.blend_controls[remapped_cb].enable.Assign(key.blend_controls[remapped_cb].enable && + !col_buf.info.blend_bypass); + key.write_masks[remapped_cb] = vk::ColorComponentFlags{regs.color_target_mask.GetMask(cb)}; + key.cb_shader_mask.SetMask(remapped_cb, regs.color_shader_mask.GetMask(cb)); - static bool TessMissingLogged = false; - if (auto* pgm = regs.ProgramForStage(3); - regs.stage_enable.IsStageEnabled(3) && pgm->Address() != 0) { - if (!TessMissingLogged) { - LOG_WARNING(Render_Vulkan, "Tess pipeline compilation skipped"); - TessMissingLogged = true; - } - return false; - } - - std::tie(infos[i], modules[i], key.stage_hashes[i]) = GetProgram(stage, params, binding); + ++remapped_cb; } return true; } bool PipelineCache::RefreshComputeKey() { - u32 binding{}; + Shader::Backend::Bindings binding{}; const auto* cs_pgm = &liverpool->regs.cs_program; const auto cs_params = Liverpool::GetParams(*cs_pgm); - if (ShouldSkipShader(cs_params.hash, "compute")) { - return false; - } std::tie(infos[0], modules[0], compute_key) = GetProgram(Shader::Stage::Compute, cs_params, binding); return true; @@ -346,18 +413,14 @@ bool PipelineCache::RefreshComputeKey() { vk::ShaderModule PipelineCache::CompileModule(Shader::Info& info, const Shader::RuntimeInfo& runtime_info, std::span code, size_t perm_idx, - u32& binding) { + Shader::Backend::Bindings& binding) { LOG_INFO(Render_Vulkan, "Compiling {} shader {:#x} {}", info.stage, info.pgm_hash, perm_idx != 0 ? "(permutation)" : ""); - if (Config::dumpShaders()) { - DumpShader(code, info.pgm_hash, info.stage, perm_idx, "bin"); - } + DumpShader(code, info.pgm_hash, info.stage, perm_idx, "bin"); const auto ir_program = Shader::TranslateProgram(code, pools, info, runtime_info, profile); const auto spv = Shader::Backend::SPIRV::EmitSPIRV(profile, runtime_info, ir_program, binding); - if (Config::dumpShaders()) { - DumpShader(spv, info.pgm_hash, info.stage, perm_idx, "spv"); - } + DumpShader(spv, info.pgm_hash, info.stage, perm_idx, "spv"); const auto module = CompileSPV(spv, instance.GetDevice()); const auto name = fmt::format("{}_{:#x}_{}", info.stage, info.pgm_hash, perm_idx); @@ -366,14 +429,14 @@ vk::ShaderModule PipelineCache::CompileModule(Shader::Info& info, } std::tuple PipelineCache::GetProgram( - Shader::Stage stage, Shader::ShaderParams params, u32& binding) { + Shader::Stage stage, Shader::ShaderParams params, Shader::Backend::Bindings& binding) { const auto runtime_info = BuildRuntimeInfo(stage); auto [it_pgm, new_program] = program_cache.try_emplace(params.hash); if (new_program) { Program* program = program_pool.Create(stage, params); - u32 start_binding = binding; + auto start = binding; const auto module = CompileModule(program->info, runtime_info, params.code, 0, binding); - const auto spec = Shader::StageSpecialization(program->info, runtime_info, start_binding); + const auto spec = Shader::StageSpecialization(program->info, runtime_info, start); program->AddPermut(module, std::move(spec)); it_pgm.value() = program; return std::make_tuple(&program->info, module, HashCombine(params.hash, 0)); @@ -391,7 +454,7 @@ std::tuple PipelineCache::GetProgram module = CompileModule(new_info, runtime_info, params.code, perm_idx, binding); program->AddPermut(module, std::move(spec)); } else { - binding += info.NumBindings(); + info.AddBindings(binding); module = it->module; perm_idx = std::distance(program->modules.begin(), it); } @@ -400,6 +463,10 @@ std::tuple PipelineCache::GetProgram void PipelineCache::DumpShader(std::span code, u64 hash, Shader::Stage stage, size_t perm_idx, std::string_view ext) { + if (!Config::dumpShaders()) { + return; + } + using namespace Common::FS; const auto dump_dir = GetUserPath(PathType::ShaderDir) / "dumps"; if (!std::filesystem::exists(dump_dir)) { diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index 92dcf8262..7e44bbf09 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -49,9 +49,8 @@ public: const ComputePipeline* GetComputePipeline(); - std::tuple GetProgram(Shader::Stage stage, - Shader::ShaderParams params, - u32& binding); + std::tuple GetProgram( + Shader::Stage stage, Shader::ShaderParams params, Shader::Backend::Bindings& binding); private: bool RefreshGraphicsKey(); @@ -60,7 +59,8 @@ private: void DumpShader(std::span code, u64 hash, Shader::Stage stage, size_t perm_idx, std::string_view ext); vk::ShaderModule CompileModule(Shader::Info& info, const Shader::RuntimeInfo& runtime_info, - std::span code, size_t perm_idx, u32& binding); + std::span code, size_t perm_idx, + Shader::Backend::Bindings& binding); Shader::RuntimeInfo BuildRuntimeInfo(Shader::Stage stage); private: @@ -74,8 +74,10 @@ private: Shader::Pools pools; tsl::robin_map program_cache; Common::ObjectPool program_pool; - tsl::robin_map> compute_pipelines; - tsl::robin_map> graphics_pipelines; + Common::ObjectPool graphics_pipeline_pool; + Common::ObjectPool compute_pipeline_pool; + tsl::robin_map compute_pipelines; + tsl::robin_map graphics_pipelines; std::array infos{}; std::array modules{}; GraphicsPipelineKey graphics_key{}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp new file mode 100644 index 000000000..61e564150 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include "shader_recompiler/info.h" +#include "video_core/renderer_vulkan/vk_instance.h" +#include "video_core/renderer_vulkan/vk_pipeline_common.h" +#include "video_core/renderer_vulkan/vk_scheduler.h" +#include "video_core/texture_cache/texture_cache.h" + +namespace Vulkan { + +boost::container::static_vector Pipeline::image_infos; + +Pipeline::Pipeline(const Instance& instance_, Scheduler& scheduler_, DescriptorHeap& desc_heap_, + vk::PipelineCache pipeline_cache) + : instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_} {} + +Pipeline::~Pipeline() = default; + +void Pipeline::BindTextures(VideoCore::TextureCache& texture_cache, const Shader::Info& stage, + Shader::Backend::Bindings& binding, + DescriptorWrites& set_writes) const { + + using ImageBindingInfo = std::tuple; + boost::container::static_vector image_bindings; + + for (const auto& image_desc : stage.images) { + const auto tsharp = image_desc.GetSharp(stage); + if (tsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid) { + VideoCore::ImageInfo image_info{tsharp, image_desc}; + const auto image_id = texture_cache.FindImage(image_info); + auto& image = texture_cache.GetImage(image_id); + image.flags |= VideoCore::ImageFlagBits::Bound; + image_bindings.emplace_back(image_id, tsharp, image_desc); + } else { + image_bindings.emplace_back(VideoCore::ImageId{}, tsharp, image_desc); + } + + if (texture_cache.IsMeta(tsharp.Address())) { + LOG_WARNING(Render_Vulkan, "Unexpected metadata read by a PS shader (texture)"); + } + } + + // Second pass to re-bind images that were updated after binding + for (auto [image_id, tsharp, desc] : image_bindings) { + if (!image_id) { + if (instance.IsNullDescriptorSupported()) { + image_infos.emplace_back(VK_NULL_HANDLE, VK_NULL_HANDLE, vk::ImageLayout::eGeneral); + } else { + auto& null_image = texture_cache.GetImageView(VideoCore::NULL_IMAGE_VIEW_ID); + image_infos.emplace_back(VK_NULL_HANDLE, *null_image.image_view, + vk::ImageLayout::eGeneral); + } + } else { + auto& image = texture_cache.GetImage(image_id); + if (True(image.flags & VideoCore::ImageFlagBits::NeedsRebind)) { + image_id = texture_cache.FindImage(image.info); + } + VideoCore::ImageViewInfo view_info{tsharp, desc}; + auto& image_view = texture_cache.FindTexture(image_id, view_info); + image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, + texture_cache.GetImage(image_id).last_state.layout); + image.flags &= + ~(VideoCore::ImageFlagBits::NeedsRebind | VideoCore::ImageFlagBits::Bound); + } + + set_writes.push_back({ + .dstSet = VK_NULL_HANDLE, + .dstBinding = binding.unified++, + .dstArrayElement = 0, + .descriptorCount = 1, + .descriptorType = desc.is_storage ? vk::DescriptorType::eStorageImage + : vk::DescriptorType::eSampledImage, + .pImageInfo = &image_infos.back(), + }); + } +} + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.h b/src/video_core/renderer_vulkan/vk_pipeline_common.h new file mode 100644 index 000000000..ab99e7b33 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.h @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "shader_recompiler/backend/bindings.h" +#include "shader_recompiler/info.h" +#include "video_core/renderer_vulkan/vk_common.h" + +namespace VideoCore { +class BufferCache; +class TextureCache; +} // namespace VideoCore + +namespace Vulkan { + +class Instance; +class Scheduler; +class DescriptorHeap; + +class Pipeline { +public: + Pipeline(const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, + vk::PipelineCache pipeline_cache); + virtual ~Pipeline(); + + vk::Pipeline Handle() const noexcept { + return *pipeline; + } + + vk::PipelineLayout GetLayout() const noexcept { + return *pipeline_layout; + } + + using DescriptorWrites = boost::container::small_vector; + void BindTextures(VideoCore::TextureCache& texture_cache, const Shader::Info& stage, + Shader::Backend::Bindings& binding, DescriptorWrites& set_writes) const; + +protected: + const Instance& instance; + Scheduler& scheduler; + DescriptorHeap& desc_heap; + vk::UniquePipeline pipeline; + vk::UniquePipelineLayout pipeline_layout; + vk::UniqueDescriptorSetLayout desc_layout; + static boost::container::static_vector image_infos; +}; + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index feadda96c..0eb7e0759 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -44,7 +44,6 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL DebugUtilsCallback( case 0xc81ad50e: case 0xb7c39078: case 0x32868fde: // vkCreateBufferView(): pCreateInfo->range does not equal VK_WHOLE_SIZE - case 0x92d66fc1: // `pMultisampleState is NULL` for depth only passes (confirmed VL error) return VK_FALSE; default: break; @@ -135,9 +134,10 @@ vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::WindowSDL& e std::vector GetInstanceExtensions(Frontend::WindowSystemType window_type, bool enable_debug_utils) { - const auto properties = vk::enumerateInstanceExtensionProperties(); - if (properties.empty()) { - LOG_ERROR(Render_Vulkan, "Failed to query extension properties"); + const auto [properties_result, properties] = vk::enumerateInstanceExtensionProperties(); + if (properties_result != vk::Result::eSuccess || properties.empty()) { + LOG_ERROR(Render_Vulkan, "Failed to query extension properties: {}", + vk::to_string(properties_result)); return {}; } @@ -208,10 +208,12 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e #endif VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); - const u32 available_version = VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion - ? vk::enumerateInstanceVersion() - : VK_API_VERSION_1_0; - + const auto [available_version_result, available_version] = + VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion + ? vk::enumerateInstanceVersion() + : vk::ResultValue(vk::Result::eSuccess, VK_API_VERSION_1_0); + ASSERT_MSG(available_version_result == vk::Result::eSuccess, + "Failed to query Vulkan API version: {}", vk::to_string(available_version_result)); ASSERT_MSG(available_version >= TargetVulkanApiVersion, "Vulkan {}.{} is required, but only {}.{} is supported by instance!", VK_VERSION_MAJOR(TargetVulkanApiVersion), VK_VERSION_MINOR(TargetVulkanApiVersion), @@ -342,11 +344,13 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e }, }; - auto instance = vk::createInstanceUnique(instance_ci_chain.get()); + auto [instance_result, instance] = vk::createInstanceUnique(instance_ci_chain.get()); + ASSERT_MSG(instance_result == vk::Result::eSuccess, "Failed to create instance: {}", + vk::to_string(instance_result)); VULKAN_HPP_DEFAULT_DISPATCHER.init(*instance); - return instance; + return std::move(instance); } vk::UniqueDebugUtilsMessengerEXT CreateDebugCallback(vk::Instance instance) { @@ -360,7 +364,10 @@ vk::UniqueDebugUtilsMessengerEXT CreateDebugCallback(vk::Instance instance) { vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, .pfnUserCallback = DebugUtilsCallback, }; - return instance.createDebugUtilsMessengerEXTUnique(msg_ci); + auto [messenger_result, messenger] = instance.createDebugUtilsMessengerEXTUnique(msg_ci); + ASSERT_MSG(messenger_result == vk::Result::eSuccess, "Failed to create debug callback: {}", + vk::to_string(messenger_result)); + return std::move(messenger); } } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index e38bd2fef..6b425b6d8 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -7,6 +7,7 @@ #include #include +#include "common/logging/log.h" #include "common/types.h" #include "video_core/renderer_vulkan/vk_common.h" @@ -36,7 +37,10 @@ void SetObjectName(vk::Device device, const HandleType& handle, std::string_view .objectHandle = reinterpret_cast(static_cast(handle)), .pObjectName = debug_name.data(), }; - device.setDebugUtilsObjectNameEXT(name_info); + auto result = device.setDebugUtilsObjectNameEXT(name_info); + if (result != vk::Result::eSuccess) { + LOG_DEBUG(Render_Vulkan, "Could not set object debug name: {}", vk::to_string(result)); + } } template diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 6344315a5..6088d99cf 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -24,7 +24,6 @@ Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_, liverpool->BindRasterizer(this); } memory->SetRasterizer(this); - wfi_event = instance.GetDevice().createEventUnique({}); } Rasterizer::~Rasterizer() = default; @@ -62,7 +61,7 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) { buffer_cache.BindVertexBuffers(vs_info); const u32 num_indices = buffer_cache.BindIndexBuffer(is_indexed, index_offset); - BeginRendering(); + BeginRendering(*pipeline); UpdateDynamicState(*pipeline); const auto [vertex_offset, instance_offset] = vs_info.GetDrawOffsets(); @@ -71,9 +70,8 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) { cmdbuf.drawIndexed(num_indices, regs.num_instances.NumInstances(), 0, s32(vertex_offset), instance_offset); } else { - const u32 num_vertices = regs.primitive_type == AmdGpu::Liverpool::PrimitiveType::RectList - ? 4 - : regs.num_indices; + const u32 num_vertices = + regs.primitive_type == AmdGpu::PrimitiveType::RectList ? 4 : regs.num_indices; cmdbuf.draw(num_vertices, regs.num_instances.NumInstances(), vertex_offset, instance_offset); } @@ -89,7 +87,7 @@ void Rasterizer::DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 si return; } - ASSERT_MSG(regs.primitive_type != AmdGpu::Liverpool::PrimitiveType::RectList, + ASSERT_MSG(regs.primitive_type != AmdGpu::PrimitiveType::RectList, "Unsupported primitive type for indirect draw"); try { @@ -102,7 +100,7 @@ void Rasterizer::DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 si buffer_cache.BindVertexBuffers(vs_info); const u32 num_indices = buffer_cache.BindIndexBuffer(is_indexed, 0); - BeginRendering(); + BeginRendering(*pipeline); UpdateDynamicState(*pipeline); const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true); @@ -179,7 +177,7 @@ void Rasterizer::Finish() { scheduler.Finish(); } -void Rasterizer::BeginRendering() { +void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline) { const auto& regs = liverpool->regs; RenderState state; @@ -199,6 +197,13 @@ void Rasterizer::BeginRendering() { continue; } + // Skip stale color buffers if shader doesn't output to them. Otherwise it will perform + // an unnecessary transition and may result in state conflict if the resource is already + // bound for reading. + if ((pipeline.GetMrtMask() & (1 << col_buf_id)) == 0) { + continue; + } + const auto& hint = liverpool->last_cb_extent[col_buf_id]; VideoCore::ImageInfo image_info{col_buf, hint}; VideoCore::ImageViewInfo view_info{col_buf, false /*!!image.info.usage.vo_buffer*/}; @@ -240,7 +245,7 @@ void Rasterizer::BeginRendering() { state.depth_image = image.image; state.depth_attachment = { .imageView = *image_view.image_view, - .imageLayout = image.layout, + .imageLayout = image.last_state.layout, .loadOp = is_clear ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, .storeOp = is_clear ? vk::AttachmentStoreOp::eNone : vk::AttachmentStoreOp::eStore, .clearValue = vk::ClearValue{.depthStencil = {.depth = regs.depth_clear, @@ -297,6 +302,43 @@ void Rasterizer::UpdateDynamicState(const GraphicsPipeline& pipeline) { cmdbuf.setColorWriteEnableEXT(write_ens); cmdbuf.setColorWriteMaskEXT(0, write_masks); } + if (regs.depth_control.depth_bounds_enable) { + cmdbuf.setDepthBounds(regs.depth_bounds_min, regs.depth_bounds_max); + } + if (regs.polygon_control.NeedsBias()) { + if (regs.polygon_control.enable_polygon_offset_front) { + cmdbuf.setDepthBias(regs.poly_offset.front_offset, regs.poly_offset.depth_bias, + regs.poly_offset.front_scale); + } else { + cmdbuf.setDepthBias(regs.poly_offset.back_offset, regs.poly_offset.depth_bias, + regs.poly_offset.back_scale); + } + } + if (regs.depth_control.stencil_enable) { + const auto front = regs.stencil_ref_front; + const auto back = regs.stencil_ref_back; + if (front.stencil_test_val == back.stencil_test_val) { + cmdbuf.setStencilReference(vk::StencilFaceFlagBits::eFrontAndBack, + front.stencil_test_val); + } else { + cmdbuf.setStencilReference(vk::StencilFaceFlagBits::eFront, front.stencil_test_val); + cmdbuf.setStencilReference(vk::StencilFaceFlagBits::eBack, back.stencil_test_val); + } + if (front.stencil_write_mask == back.stencil_write_mask) { + cmdbuf.setStencilWriteMask(vk::StencilFaceFlagBits::eFrontAndBack, + front.stencil_write_mask); + } else { + cmdbuf.setStencilWriteMask(vk::StencilFaceFlagBits::eFront, front.stencil_write_mask); + cmdbuf.setStencilWriteMask(vk::StencilFaceFlagBits::eBack, back.stencil_write_mask); + } + if (front.stencil_mask == back.stencil_mask) { + cmdbuf.setStencilCompareMask(vk::StencilFaceFlagBits::eFrontAndBack, + front.stencil_mask); + } else { + cmdbuf.setStencilCompareMask(vk::StencilFaceFlagBits::eFront, front.stencil_mask); + cmdbuf.setStencilCompareMask(vk::StencilFaceFlagBits::eBack, back.stencil_mask); + } + } } void Rasterizer::UpdateViewportScissorState() { @@ -306,7 +348,10 @@ void Rasterizer::UpdateViewportScissorState() { boost::container::static_vector scissors; const float reduce_z = - regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW ? 1.0f : 0.0f; + instance.IsDepthClipControlSupported() && + regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW + ? 1.0f + : 0.0f; for (u32 i = 0; i < Liverpool::NumViewports; i++) { const auto& vp = regs.viewports[i]; const auto& vp_d = regs.viewport_depths[i]; @@ -322,11 +367,55 @@ void Rasterizer::UpdateViewportScissorState() { .maxDepth = vp.zscale + vp.zoffset, }); } - const auto& sc = regs.screen_scissor; - scissors.push_back({ - .offset = {sc.top_left_x, sc.top_left_y}, - .extent = {sc.GetWidth(), sc.GetHeight()}, - }); + + const bool enable_offset = !regs.window_scissor.window_offset_disable.Value(); + Liverpool::Scissor scsr{}; + const auto combined_scissor_value_tl = [](s16 scr, s16 win, s16 gen, s16 win_offset) { + return std::max({scr, s16(win + win_offset), s16(gen + win_offset)}); + }; + + scsr.top_left_x = combined_scissor_value_tl( + regs.screen_scissor.top_left_x, s16(regs.window_scissor.top_left_x.Value()), + s16(regs.generic_scissor.top_left_x.Value()), + enable_offset ? regs.window_offset.window_x_offset : 0); + + scsr.top_left_y = combined_scissor_value_tl( + regs.screen_scissor.top_left_y, s16(regs.window_scissor.top_left_y.Value()), + s16(regs.generic_scissor.top_left_y.Value()), + enable_offset ? regs.window_offset.window_y_offset : 0); + + const auto combined_scissor_value_br = [](s16 scr, s16 win, s16 gen, s16 win_offset) { + return std::min({scr, s16(win + win_offset), s16(gen + win_offset)}); + }; + + scsr.bottom_right_x = combined_scissor_value_br( + regs.screen_scissor.bottom_right_x, regs.window_scissor.bottom_right_x, + regs.generic_scissor.bottom_right_x, + enable_offset ? regs.window_offset.window_x_offset : 0); + + scsr.bottom_right_y = combined_scissor_value_br( + regs.screen_scissor.bottom_right_y, regs.window_scissor.bottom_right_y, + regs.generic_scissor.bottom_right_y, + enable_offset ? regs.window_offset.window_y_offset : 0); + + for (u32 idx = 0; idx < Liverpool::NumViewports; idx++) { + auto vp_scsr = scsr; + if (regs.mode_control.vport_scissor_enable) { + vp_scsr.top_left_x = + std::max(vp_scsr.top_left_x, s16(regs.viewport_scissors[idx].top_left_x.Value())); + vp_scsr.top_left_y = + std::max(vp_scsr.top_left_y, s16(regs.viewport_scissors[idx].top_left_y.Value())); + vp_scsr.bottom_right_x = + std::min(vp_scsr.bottom_right_x, regs.viewport_scissors[idx].bottom_right_x); + vp_scsr.bottom_right_y = + std::min(vp_scsr.bottom_right_y, regs.viewport_scissors[idx].bottom_right_y); + } + scissors.push_back({ + .offset = {vp_scsr.top_left_x, vp_scsr.top_left_y}, + .extent = {vp_scsr.GetWidth(), vp_scsr.GetHeight()}, + }); + } + const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.setViewport(0, viewports); cmdbuf.setScissor(0, scissors); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 5aa90c5cc..82e8fc0c0 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -52,7 +52,7 @@ public: void Finish(); private: - void BeginRendering(); + void BeginRendering(const GraphicsPipeline& pipeline); void UpdateDynamicState(const GraphicsPipeline& pipeline); void UpdateViewportScissorState(); @@ -67,7 +67,6 @@ private: AmdGpu::Liverpool* liverpool; Core::MemoryManager* memory; PipelineCache pipeline_cache; - vk::UniqueEvent wfi_event; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_resource_pool.cpp b/src/video_core/renderer_vulkan/vk_resource_pool.cpp index a5ee22c25..25a134528 100644 --- a/src/video_core/renderer_vulkan/vk_resource_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_resource_pool.cpp @@ -69,7 +69,10 @@ CommandPool::CommandPool(const Instance& instance, MasterSemaphore* master_semap .queueFamilyIndex = instance.GetGraphicsQueueFamilyIndex(), }; const vk::Device device = instance.GetDevice(); - cmd_pool = device.createCommandPoolUnique(pool_create_info); + auto [pool_result, pool] = device.createCommandPoolUnique(pool_create_info); + ASSERT_MSG(pool_result == vk::Result::eSuccess, "Failed to create command pool: {}", + vk::to_string(pool_result)); + cmd_pool = std::move(pool); if (instance.HasDebuggingToolAttached()) { SetObjectName(device, *cmd_pool, "CommandPool"); } @@ -182,7 +185,10 @@ void DescriptorHeap::CreateDescriptorPool() { .poolSizeCount = static_cast(pool_sizes.size()), .pPoolSizes = pool_sizes.data(), }; - curr_pool = device.createDescriptorPool(pool_info); + auto [pool_result, pool] = device.createDescriptorPool(pool_info); + ASSERT_MSG(pool_result == vk::Result::eSuccess, "Failed to create descriptor pool: {}", + vk::to_string(pool_result)); + curr_pool = pool; } } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 9ff332aef..2c4e7a3c6 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -4,6 +4,7 @@ #include #include "common/assert.h" #include "common/debug.h" +#include "imgui/renderer/texture_manager.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -58,58 +59,6 @@ void Scheduler::EndRendering() { } is_rendering = false; current_cmdbuf.endRendering(); - - boost::container::static_vector barriers; - for (size_t i = 0; i < render_state.num_color_attachments; ++i) { - barriers.push_back(vk::ImageMemoryBarrier{ - .srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, - .dstAccessMask = vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite, - .oldLayout = vk::ImageLayout::eColorAttachmentOptimal, - .newLayout = vk::ImageLayout::eColorAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = render_state.color_images[i], - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = VK_REMAINING_MIP_LEVELS, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, - }); - } - if (render_state.has_depth || render_state.has_stencil) { - barriers.push_back(vk::ImageMemoryBarrier{ - .srcAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentWrite, - .dstAccessMask = vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite, - .oldLayout = render_state.depth_attachment.imageLayout, - .newLayout = render_state.depth_attachment.imageLayout, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = render_state.depth_image, - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eDepth | - (render_state.has_stencil ? vk::ImageAspectFlagBits::eStencil - : vk::ImageAspectFlagBits::eNone), - .baseMipLevel = 0, - .levelCount = VK_REMAINING_MIP_LEVELS, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, - }); - } - - if (!barriers.empty()) { - const auto src_stages = - vk::PipelineStageFlagBits::eColorAttachmentOutput | - (render_state.has_depth ? vk::PipelineStageFlagBits::eLateFragmentTests | - vk::PipelineStageFlagBits::eEarlyFragmentTests - : vk::PipelineStageFlagBits::eNone); - current_cmdbuf.pipelineBarrier(src_stages, vk::PipelineStageFlagBits::eFragmentShader, - vk::DependencyFlagBits::eByRegion, {}, {}, barriers); - } } void Scheduler::Flush(SubmitInfo& info) { @@ -140,7 +89,9 @@ void Scheduler::AllocateWorkerCommandBuffers() { }; current_cmdbuf = command_pool.Commit(); - current_cmdbuf.begin(begin_info); + auto begin_result = current_cmdbuf.begin(begin_info); + ASSERT_MSG(begin_result == vk::Result::eSuccess, "Failed to begin command buffer: {}", + vk::to_string(begin_result)); auto* profiler_ctx = instance.GetProfilerContext(); if (profiler_ctx) { @@ -161,7 +112,9 @@ void Scheduler::SubmitExecution(SubmitInfo& info) { } EndRendering(); - current_cmdbuf.end(); + auto end_result = current_cmdbuf.end(); + ASSERT_MSG(end_result == vk::Result::eSuccess, "Failed to end command buffer: {}", + vk::to_string(end_result)); const vk::Semaphore timeline = master_semaphore.Handle(); info.AddSignal(timeline, signal_value); @@ -189,11 +142,9 @@ void Scheduler::SubmitExecution(SubmitInfo& info) { .pSignalSemaphores = info.signal_semas.data(), }; - try { - instance.GetGraphicsQueue().submit(submit_info, info.fence); - } catch (vk::DeviceLostError& err) { - UNREACHABLE_MSG("Device lost during submit: {}", err.what()); - } + ImGui::Core::TextureManager::Submit(); + auto submit_result = instance.GetGraphicsQueue().submit(submit_info, info.fence); + ASSERT_MSG(submit_result != vk::Result::eErrorDeviceLost, "Device lost during submit"); master_semaphore.Refresh(); AllocateWorkerCommandBuffers(); diff --git a/src/video_core/renderer_vulkan/vk_shader_util.cpp b/src/video_core/renderer_vulkan/vk_shader_util.cpp index 687760110..f9347d6e6 100644 --- a/src/video_core/renderer_vulkan/vk_shader_util.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_util.cpp @@ -218,13 +218,10 @@ vk::ShaderModule CompileSPV(std::span code, vk::Device device) { .pCode = code.data(), }; - try { - return device.createShaderModule(shader_info); - } catch (vk::SystemError& err) { - UNREACHABLE_MSG("{}", err.what()); - } - - return {}; + auto [module_result, module] = device.createShaderModule(shader_info); + ASSERT_MSG(module_result == vk::Result::eSuccess, "Failed to compile SPIR-V shader: {}", + vk::to_string(module_result)); + return module; } } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index dcc19bf3b..357cd504d 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -37,8 +37,12 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) { instance.GetPresentQueueFamilyIndex(), }; - const auto modes = instance.GetPhysicalDevice().getSurfacePresentModesKHR(surface); - const auto find_mode = [&modes](vk::PresentModeKHR requested) { + const auto [modes_result, modes] = + instance.GetPhysicalDevice().getSurfacePresentModesKHR(surface); + const auto find_mode = [&modes_result, &modes](vk::PresentModeKHR requested) { + if (modes_result != vk::Result::eSuccess) { + return false; + } const auto it = std::find_if(modes.begin(), modes.end(), [&requested](vk::PresentModeKHR mode) { return mode == requested; }); @@ -70,17 +74,19 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) { .oldSwapchain = nullptr, }; - try { - swapchain = instance.GetDevice().createSwapchainKHR(swapchain_info); - } catch (vk::SystemError& err) { - LOG_CRITICAL(Render_Vulkan, "{}", err.what()); - UNREACHABLE(); - } + auto [swapchain_result, chain] = instance.GetDevice().createSwapchainKHR(swapchain_info); + ASSERT_MSG(swapchain_result == vk::Result::eSuccess, "Failed to create swapchain: {}", + vk::to_string(swapchain_result)); + swapchain = chain; SetupImages(); RefreshSemaphores(); } +void Swapchain::Recreate(u32 width_, u32 height_) { + Create(width_, height_, surface); +} + bool Swapchain::AcquireNextImage() { vk::Device device = instance.GetDevice(); vk::Result result = @@ -107,9 +113,6 @@ bool Swapchain::AcquireNextImage() { } void Swapchain::Present() { - if (needs_recreation) { - return; - } const vk::PresentInfoKHR present_info = { .waitSemaphoreCount = 1, @@ -119,20 +122,22 @@ void Swapchain::Present() { .pImageIndices = &image_index, }; - try { - [[maybe_unused]] vk::Result result = instance.GetPresentQueue().presentKHR(present_info); - } catch (vk::OutOfDateKHRError&) { + auto result = instance.GetPresentQueue().presentKHR(present_info); + if (result == vk::Result::eErrorOutOfDateKHR || result == vk::Result::eSuboptimalKHR) { needs_recreation = true; - } catch (const vk::SystemError& err) { - LOG_CRITICAL(Render_Vulkan, "Swapchain presentation failed {}", err.what()); - UNREACHABLE(); + } else { + ASSERT_MSG(result == vk::Result::eSuccess, "Swapchain presentation failed: {}", + vk::to_string(result)); } frame_index = (frame_index + 1) % image_count; } void Swapchain::FindPresentFormat() { - const auto formats = instance.GetPhysicalDevice().getSurfaceFormatsKHR(surface); + const auto [formats_result, formats] = + instance.GetPhysicalDevice().getSurfaceFormatsKHR(surface); + ASSERT_MSG(formats_result == vk::Result::eSuccess, "Failed to query surface formats: {}", + vk::to_string(formats_result)); // If there is a single undefined surface format, the device doesn't care, so we'll just use // RGBA sRGB. @@ -158,8 +163,10 @@ void Swapchain::FindPresentFormat() { } void Swapchain::SetSurfaceProperties() { - const vk::SurfaceCapabilitiesKHR capabilities = + const auto [capabilities_result, capabilities] = instance.GetPhysicalDevice().getSurfaceCapabilitiesKHR(surface); + ASSERT_MSG(capabilities_result == vk::Result::eSuccess, + "Failed to query surface capabilities: {}", vk::to_string(capabilities_result)); extent = capabilities.currentExtent; if (capabilities.currentExtent.width == std::numeric_limits::max()) { @@ -190,6 +197,11 @@ void Swapchain::SetSurfaceProperties() { void Swapchain::Destroy() { vk::Device device = instance.GetDevice(); + const auto wait_result = device.waitIdle(); + if (wait_result != vk::Result::eSuccess) { + LOG_WARNING(Render_Vulkan, "Failed to wait for device to become idle: {}", + vk::to_string(wait_result)); + } if (swapchain) { device.destroySwapchainKHR(swapchain); } @@ -207,10 +219,17 @@ void Swapchain::RefreshSemaphores() { present_ready.resize(image_count); for (vk::Semaphore& semaphore : image_acquired) { - semaphore = device.createSemaphore({}); + auto [semaphore_result, sem] = device.createSemaphore({}); + ASSERT_MSG(semaphore_result == vk::Result::eSuccess, + "Failed to create image acquired semaphore: {}", + vk::to_string(semaphore_result)); + semaphore = sem; } for (vk::Semaphore& semaphore : present_ready) { - semaphore = device.createSemaphore({}); + auto [semaphore_result, sem] = device.createSemaphore({}); + ASSERT_MSG(semaphore_result == vk::Result::eSuccess, + "Failed to create present ready semaphore: {}", vk::to_string(semaphore_result)); + semaphore = sem; } if (instance.HasDebuggingToolAttached()) { @@ -223,7 +242,10 @@ void Swapchain::RefreshSemaphores() { void Swapchain::SetupImages() { vk::Device device = instance.GetDevice(); - images = device.getSwapchainImagesKHR(swapchain); + auto [images_result, imgs] = device.getSwapchainImagesKHR(swapchain); + ASSERT_MSG(images_result == vk::Result::eSuccess, "Failed to create swapchain images: {}", + vk::to_string(images_result)); + images = std::move(imgs); image_count = static_cast(images.size()); if (instance.HasDebuggingToolAttached()) { diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 28ac3a9c5..a41b3ca76 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -25,6 +25,9 @@ public: /// Creates (or recreates) the swapchain with a given size. void Create(u32 width, u32 height, vk::SurfaceKHR surface); + /// Recreates the swapchain with a given size and current surface. + void Recreate(u32 width, u32 height); + /// Acquires the next image in the swapchain. bool AcquireNextImage(); diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index 9e46bf7bd..758a11700 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -1,16 +1,14 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "common/assert.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/texture_cache/image.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnullability-completeness" #include -#pragma GCC diagnostic pop namespace VideoCore { @@ -84,6 +82,28 @@ static vk::ImageUsageFlags ImageUsageFlags(const ImageInfo& info) { return usage; } +static vk::FormatFeatureFlags2 FormatFeatureFlags(const vk::ImageUsageFlags usage_flags) { + vk::FormatFeatureFlags2 feature_flags{}; + if (usage_flags & vk::ImageUsageFlagBits::eTransferSrc) { + feature_flags |= vk::FormatFeatureFlagBits2::eTransferSrc; + } + if (usage_flags & vk::ImageUsageFlagBits::eTransferDst) { + feature_flags |= vk::FormatFeatureFlagBits2::eTransferDst; + } + if (usage_flags & vk::ImageUsageFlagBits::eSampled) { + feature_flags |= vk::FormatFeatureFlagBits2::eSampledImage; + } + if (usage_flags & vk::ImageUsageFlagBits::eColorAttachment) { + feature_flags |= vk::FormatFeatureFlagBits2::eColorAttachment; + } + if (usage_flags & vk::ImageUsageFlagBits::eDepthStencilAttachment) { + feature_flags |= vk::FormatFeatureFlagBits2::eDepthStencilAttachment; + } + // Note: StorageImage is intentionally ignored for now since it is always set, and can mess up + // compatibility checks. + return feature_flags; +} + UniqueImage::UniqueImage(vk::Device device_, VmaAllocator allocator_) : device{device_}, allocator{allocator_} {} @@ -126,13 +146,14 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, // the texture cache should re-create the resource with the usage requested vk::ImageCreateFlags flags{vk::ImageCreateFlagBits::eMutableFormat | vk::ImageCreateFlagBits::eExtendedUsage}; - if (info.props.is_cube) { + if (info.props.is_cube || (info.type == vk::ImageType::e2D && info.resources.layers >= 6)) { flags |= vk::ImageCreateFlagBits::eCubeCompatible; } else if (info.props.is_volume) { flags |= vk::ImageCreateFlagBits::e2DArrayCompatible; } usage = ImageUsageFlags(info); + format_features = FormatFeatureFlags(usage); switch (info.pixel_format) { case vk::Format::eD16Unorm: @@ -149,10 +170,18 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, break; } + constexpr auto tiling = vk::ImageTiling::eOptimal; + const auto supported_format = instance->GetSupportedFormat(info.pixel_format, format_features); + const auto properties = instance->GetPhysicalDevice().getImageFormatProperties( + supported_format, info.type, tiling, usage, flags); + const auto supported_samples = properties.result == vk::Result::eSuccess + ? properties.value.sampleCounts + : vk::SampleCountFlagBits::e1; + const vk::ImageCreateInfo image_ci = { .flags = flags, .imageType = info.type, - .format = instance->GetSupportedFormat(info.pixel_format), + .format = supported_format, .extent{ .width = info.size.width, .height = info.size.height, @@ -160,8 +189,8 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, }, .mipLevels = static_cast(info.resources.levels), .arrayLayers = static_cast(info.resources.layers), - .samples = LiverpoolToVK::NumSamples(info.num_samples), - .tiling = vk::ImageTiling::eOptimal, + .samples = LiverpoolToVK::NumSamples(info.num_samples, supported_samples), + .tiling = tiling, .usage = usage, .initialLayout = vk::ImageLayout::eUndefined, }; @@ -173,52 +202,132 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, info.guest_size_bytes); } -void Image::Transit(vk::ImageLayout dst_layout, vk::Flags dst_mask, - vk::CommandBuffer cmdbuf) { - if (dst_layout == layout && dst_mask == access_mask) { - return; +boost::container::small_vector Image::GetBarriers( + vk::ImageLayout dst_layout, vk::Flags dst_mask, + vk::PipelineStageFlags2 dst_stage, std::optional subres_range) { + const bool needs_partial_transition = + subres_range && + (subres_range->base != SubresourceBase{} || subres_range->extent != info.resources); + const bool partially_transited = !subresource_states.empty(); + + boost::container::small_vector barriers{}; + if (needs_partial_transition || partially_transited) { + if (!partially_transited) { + subresource_states.resize(info.resources.levels * info.resources.layers); + std::fill(subresource_states.begin(), subresource_states.end(), last_state); + } + + // In case of partial transition, we need to change the specified subresources only. + // Otherwise all subresources need to be set to the same state so we can use a full + // resource transition for the next time. + const auto mips = + needs_partial_transition + ? std::ranges::views::iota(subres_range->base.level, + subres_range->base.level + subres_range->extent.levels) + : std::views::iota(0u, info.resources.levels); + const auto layers = + needs_partial_transition + ? std::ranges::views::iota(subres_range->base.layer, + subres_range->base.layer + subres_range->extent.layers) + : std::views::iota(0u, info.resources.layers); + + for (u32 mip : mips) { + for (u32 layer : layers) { + // NOTE: these loops may produce a lot of small barriers. + // If this becomes a problem, we can optimize it by merging adjacent barriers. + const auto subres_idx = mip * info.resources.layers + layer; + ASSERT(subres_idx < subresource_states.size()); + auto& state = subresource_states[subres_idx]; + + if (state.layout != dst_layout || state.access_mask != dst_mask) { + barriers.emplace_back(vk::ImageMemoryBarrier2{ + .srcStageMask = state.pl_stage, + .srcAccessMask = state.access_mask, + .dstStageMask = dst_stage, + .dstAccessMask = dst_mask, + .oldLayout = state.layout, + .newLayout = dst_layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = image, + .subresourceRange{ + .aspectMask = aspect_mask, + .baseMipLevel = mip, + .levelCount = 1, + .baseArrayLayer = layer, + .layerCount = 1, + }, + }); + state.layout = dst_layout; + state.access_mask = dst_mask; + state.pl_stage = dst_stage; + } + } + } + + if (!needs_partial_transition) { + subresource_states.clear(); + } + } else { // Full resource transition + if (last_state.layout == dst_layout && last_state.access_mask == dst_mask) { + return {}; + } + + barriers.emplace_back(vk::ImageMemoryBarrier2{ + .srcStageMask = last_state.pl_stage, + .srcAccessMask = last_state.access_mask, + .dstStageMask = dst_stage, + .dstAccessMask = dst_mask, + .oldLayout = last_state.layout, + .newLayout = dst_layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = image, + .subresourceRange{ + .aspectMask = aspect_mask, + .baseMipLevel = 0, + .levelCount = VK_REMAINING_MIP_LEVELS, + .baseArrayLayer = 0, + .layerCount = VK_REMAINING_ARRAY_LAYERS, + }, + }); } - const vk::ImageMemoryBarrier barrier = { - .srcAccessMask = access_mask, - .dstAccessMask = dst_mask, - .oldLayout = layout, - .newLayout = dst_layout, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = image, - .subresourceRange{ - .aspectMask = aspect_mask, - .baseMipLevel = 0, - .levelCount = VK_REMAINING_MIP_LEVELS, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, - }; + last_state.layout = dst_layout; + last_state.access_mask = dst_mask; + last_state.pl_stage = dst_stage; + return barriers; +} + +void Image::Transit(vk::ImageLayout dst_layout, vk::Flags dst_mask, + std::optional range, vk::CommandBuffer cmdbuf /*= {}*/) { // Adjust pipieline stage - const vk::PipelineStageFlags dst_pl_stage = - (dst_mask == vk::AccessFlagBits::eTransferRead || - dst_mask == vk::AccessFlagBits::eTransferWrite) - ? vk::PipelineStageFlagBits::eTransfer - : vk::PipelineStageFlagBits::eAllGraphics | vk::PipelineStageFlagBits::eComputeShader; + const vk::PipelineStageFlags2 dst_pl_stage = + (dst_mask == vk::AccessFlagBits2::eTransferRead || + dst_mask == vk::AccessFlagBits2::eTransferWrite) + ? vk::PipelineStageFlagBits2::eTransfer + : vk::PipelineStageFlagBits2::eAllGraphics | vk::PipelineStageFlagBits2::eComputeShader; + + const auto barriers = GetBarriers(dst_layout, dst_mask, dst_pl_stage, range); + if (barriers.empty()) { + return; + } if (!cmdbuf) { // When using external cmdbuf you are responsible for ending rp. scheduler->EndRendering(); cmdbuf = scheduler->CommandBuffer(); } - cmdbuf.pipelineBarrier(pl_stage, dst_pl_stage, vk::DependencyFlagBits::eByRegion, {}, {}, - barrier); - - layout = dst_layout; - access_mask = dst_mask; - pl_stage = dst_pl_stage; + cmdbuf.pipelineBarrier2(vk::DependencyInfo{ + .imageMemoryBarrierCount = static_cast(barriers.size()), + .pImageMemoryBarriers = barriers.data(), + }); } void Image::Upload(vk::Buffer buffer, u64 offset) { scheduler->EndRendering(); - Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eTransferWrite); + Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}); // Copy to the image. const auto aspect = aspect_mask & vk::ImageAspectFlagBits::eStencil @@ -242,12 +351,12 @@ void Image::Upload(vk::Buffer buffer, u64 offset) { cmdbuf.copyBufferToImage(buffer, image, vk::ImageLayout::eTransferDstOptimal, image_copy); Transit(vk::ImageLayout::eGeneral, - vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead); + vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {}); } void Image::CopyImage(const Image& image) { scheduler->EndRendering(); - Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eTransferWrite); + Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}); auto cmdbuf = scheduler->CommandBuffer(); @@ -273,15 +382,16 @@ void Image::CopyImage(const Image& image) { .extent = {mip_w, mip_h, mip_d}, }); } - cmdbuf.copyImage(image.image, image.layout, this->image, this->layout, image_copy); + cmdbuf.copyImage(image.image, image.last_state.layout, this->image, this->last_state.layout, + image_copy); Transit(vk::ImageLayout::eGeneral, - vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead); + vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {}); } void Image::CopyMip(const Image& image, u32 mip) { scheduler->EndRendering(); - Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eTransferWrite); + Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}); auto cmdbuf = scheduler->CommandBuffer(); @@ -307,10 +417,11 @@ void Image::CopyMip(const Image& image, u32 mip) { }, .extent = {mip_w, mip_h, mip_d}, }; - cmdbuf.copyImage(image.image, image.layout, this->image, this->layout, image_copy); + cmdbuf.copyImage(image.image, image.last_state.layout, this->image, this->last_state.layout, + image_copy); Transit(vk::ImageLayout::eGeneral, - vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead); + vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {}); } Image::~Image() = default; diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h index 1bbb975ba..312ff97e8 100644 --- a/src/video_core/texture_cache/image.h +++ b/src/video_core/texture_cache/image.h @@ -5,13 +5,9 @@ #include "common/enum.h" #include "common/types.h" -#include "core/libraries/videoout/buffer.h" -#include "video_core/amdgpu/liverpool.h" -#include "video_core/amdgpu/resource.h" #include "video_core/renderer_vulkan/vk_common.h" #include "video_core/texture_cache/image_info.h" #include "video_core/texture_cache/image_view.h" -#include "video_core/texture_cache/types.h" #include @@ -26,12 +22,16 @@ VK_DEFINE_HANDLE(VmaAllocator) namespace VideoCore { enum ImageFlagBits : u32 { - CpuModified = 1 << 2, ///< Contents have been modified from the CPU + CpuDirty = 1 << 1, ///< Contents have been modified from the CPU + GpuDirty = 1 << 2, ///< Contents have been modified from the GPU (valid data in buffer cache) + Dirty = CpuDirty | GpuDirty, GpuModified = 1 << 3, ///< Contents have been modified from the GPU Tracked = 1 << 4, ///< Writes and reads are being hooked from the CPU Registered = 1 << 6, ///< True when the image is registered Picked = 1 << 7, ///< Temporary flag to mark the image as picked MetaRegistered = 1 << 8, ///< True when metadata for this surface is known and registered + Bound = 1 << 9, ///< True when the image is bound to a descriptor set + NeedsRebind = 1 << 10, ///< True when the image needs to be rebound }; DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits) @@ -91,8 +91,11 @@ struct Image { return image_view_ids[std::distance(image_view_infos.begin(), it)]; } - void Transit(vk::ImageLayout dst_layout, vk::Flags dst_mask, - vk::CommandBuffer cmdbuf = {}); + boost::container::small_vector GetBarriers( + vk::ImageLayout dst_layout, vk::Flags dst_mask, + vk::PipelineStageFlags2 dst_stage, std::optional subres_range); + void Transit(vk::ImageLayout dst_layout, vk::Flags dst_mask, + std::optional range, vk::CommandBuffer cmdbuf = {}); void Upload(vk::Buffer buffer, u64 offset); void CopyImage(const Image& image); @@ -103,7 +106,7 @@ struct Image { ImageInfo info; UniqueImage image; vk::ImageAspectFlags aspect_mask = vk::ImageAspectFlagBits::eColor; - ImageFlagBits flags = ImageFlagBits::CpuModified; + ImageFlagBits flags = ImageFlagBits::Dirty; VAddr cpu_addr = 0; VAddr cpu_addr_end = 0; std::vector image_view_infos; @@ -111,10 +114,15 @@ struct Image { // Resource state tracking vk::ImageUsageFlags usage; - vk::Flags pl_stage = vk::PipelineStageFlagBits::eAllCommands; - vk::Flags access_mask = vk::AccessFlagBits::eNone; - vk::ImageLayout layout = vk::ImageLayout::eUndefined; - boost::container::small_vector mip_hashes; + vk::FormatFeatureFlags2 format_features; + struct State { + vk::Flags pl_stage = vk::PipelineStageFlagBits2::eAllCommands; + vk::Flags access_mask = vk::AccessFlagBits2::eNone; + vk::ImageLayout layout = vk::ImageLayout::eUndefined; + }; + State last_state{}; + std::vector subresource_states{}; + boost::container::small_vector mip_hashes{}; u64 tick_accessed_last{0}; }; diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 011e19db8..521e4118f 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -200,18 +200,12 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slice mips_layout.emplace_back(depth_slice_sz, pitch, 0); } -ImageInfo::ImageInfo(const AmdGpu::Image& image, bool force_depth /*= false*/) noexcept { +ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept { tiling_mode = image.GetTilingMode(); pixel_format = LiverpoolToVK::SurfaceFormat(image.GetDataFmt(), image.GetNumberFmt()); // Override format if image is forced to be a depth target - if (force_depth) { - if (pixel_format == vk::Format::eR32Sfloat || pixel_format == vk::Format::eR8Unorm) { - pixel_format = vk::Format::eD32SfloatS8Uint; - } else if (pixel_format == vk::Format::eR16Unorm) { - pixel_format = vk::Format::eD16UnormS8Uint; - } else { - UNREACHABLE(); - } + if (desc.is_depth) { + pixel_format = LiverpoolToVK::PromoteFormatToDepth(pixel_format); } type = ConvertImageType(image.GetType()); props.is_tiled = image.IsTiled(); @@ -224,7 +218,7 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image, bool force_depth /*= false*/) n size.depth = props.is_volume ? image.depth + 1 : 1; pitch = image.Pitch(); resources.levels = image.NumLevels(); - resources.layers = image.NumLayers(); + resources.layers = image.NumLayers(desc.is_array); num_bits = NumBits(image.GetDataFmt()); usage.texture = true; diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h index ba8985b8f..2ae2547f7 100644 --- a/src/video_core/texture_cache/image_info.h +++ b/src/video_core/texture_cache/image_info.h @@ -5,6 +5,7 @@ #include "common/types.h" #include "core/libraries/videoout/buffer.h" +#include "shader_recompiler/info.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/texture_cache/types.h" @@ -19,7 +20,7 @@ struct ImageInfo { const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept; ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slices, VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept; - ImageInfo(const AmdGpu::Image& image, bool force_depth = false) noexcept; + ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept; bool IsTiled() const { return tiling_mode != AmdGpu::TilingMode::Display_Linear; diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index 770404bef..db8113499 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" +#include "shader_recompiler/info.h" #include "video_core/amdgpu/resource.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" #include "video_core/renderer_vulkan/vk_instance.h" @@ -66,19 +67,40 @@ vk::Format TrySwizzleFormat(vk::Format format, u32 dst_sel) { return format; } -ImageViewInfo::ImageViewInfo(const AmdGpu::Image& image, bool is_storage_) noexcept - : is_storage{is_storage_} { - type = ConvertImageViewType(image.GetType()); +ImageViewInfo::ImageViewInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept + : is_storage{desc.is_storage} { const auto dfmt = image.GetDataFmt(); auto nfmt = image.GetNumberFmt(); if (is_storage && nfmt == AmdGpu::NumberFormat::Srgb) { nfmt = AmdGpu::NumberFormat::Unorm; } format = Vulkan::LiverpoolToVK::SurfaceFormat(dfmt, nfmt); + if (desc.is_depth) { + format = Vulkan::LiverpoolToVK::PromoteFormatToDepth(format); + } range.base.level = image.base_level; range.base.layer = image.base_array; - range.extent.levels = image.last_level + 1; - range.extent.layers = image.last_array + 1; + range.extent.levels = image.last_level - image.base_level + 1; + range.extent.layers = image.last_array - image.base_array + 1; + type = ConvertImageViewType(image.GetType()); + + // Adjust view type for partial cubemaps and arrays + if (image.IsPartialCubemap()) { + type = vk::ImageViewType::e2DArray; + } + if (type == vk::ImageViewType::eCube) { + if (desc.is_array) { + type = vk::ImageViewType::eCubeArray; + } else { + // Some games try to bind an array of cubemaps while shader reads only single one. + range.extent.layers = std::min(range.extent.layers, 6u); + } + } + if (type == vk::ImageViewType::e3D && range.extent.layers > 1) { + // Some games pass incorrect layer count for 3D textures so we need to fixup it. + range.extent.layers = 1; + } + if (!is_storage) { mapping.r = ConvertComponentSwizzle(image.dst_sel_x); mapping.g = ConvertComponentSwizzle(image.dst_sel_y); @@ -103,7 +125,7 @@ ImageViewInfo::ImageViewInfo(const AmdGpu::Liverpool::ColorBuffer& col_buffer, const auto base_format = Vulkan::LiverpoolToVK::SurfaceFormat(col_buffer.info.format, col_buffer.NumFormat()); range.base.layer = col_buffer.view.slice_start; - range.extent.layers = col_buffer.NumSlices(); + range.extent.layers = col_buffer.NumSlices() - range.base.layer; format = Vulkan::LiverpoolToVK::AdjustColorBufferFormat( base_format, col_buffer.info.comp_swap.Value(), is_vo_surface); } @@ -115,7 +137,7 @@ ImageViewInfo::ImageViewInfo(const AmdGpu::Liverpool::DepthBuffer& depth_buffer, depth_buffer.stencil_info.format); is_storage = ctl.depth_write_enable; range.base.layer = view.slice_start; - range.extent.layers = view.NumSlices(); + range.extent.layers = view.NumSlices() - range.base.layer; } ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info_, Image& image, @@ -142,17 +164,21 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info .pNext = &usage_ci, .image = image.image, .viewType = info.type, - .format = instance.GetSupportedFormat(format), - .components = instance.GetSupportedComponentSwizzle(format, info.mapping), + .format = instance.GetSupportedFormat(format, image.format_features), + .components = + instance.GetSupportedComponentSwizzle(format, info.mapping, image.format_features), .subresourceRange{ .aspectMask = aspect, .baseMipLevel = info.range.base.level, - .levelCount = info.range.extent.levels - info.range.base.level, + .levelCount = info.range.extent.levels, .baseArrayLayer = info.range.base.layer, - .layerCount = VK_REMAINING_ARRAY_LAYERS, + .layerCount = info.range.extent.layers, }, }; - image_view = instance.GetDevice().createImageViewUnique(image_view_ci); + auto [view_result, view] = instance.GetDevice().createImageViewUnique(image_view_ci); + ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create image view: {}", + vk::to_string(view_result)); + image_view = std::move(view); } ImageView::~ImageView() = default; diff --git a/src/video_core/texture_cache/image_view.h b/src/video_core/texture_cache/image_view.h index 7d53590dd..ba8d2c72b 100644 --- a/src/video_core/texture_cache/image_view.h +++ b/src/video_core/texture_cache/image_view.h @@ -3,6 +3,7 @@ #pragma once +#include "shader_recompiler/info.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/amdgpu/resource.h" #include "video_core/renderer_vulkan/vk_common.h" @@ -17,7 +18,7 @@ namespace VideoCore { struct ImageViewInfo { ImageViewInfo() = default; - ImageViewInfo(const AmdGpu::Image& image, bool is_storage) noexcept; + ImageViewInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept; ImageViewInfo(const AmdGpu::Liverpool::ColorBuffer& col_buffer, bool is_vo_surface) noexcept; ImageViewInfo(const AmdGpu::Liverpool::DepthBuffer& depth_buffer, AmdGpu::Liverpool::DepthView view, AmdGpu::Liverpool::DepthControl ctl); diff --git a/src/video_core/texture_cache/sampler.cpp b/src/video_core/texture_cache/sampler.cpp index 19c92712c..179dd6646 100644 --- a/src/video_core/texture_cache/sampler.cpp +++ b/src/video_core/texture_cache/sampler.cpp @@ -16,7 +16,7 @@ Sampler::Sampler(const Vulkan::Instance& instance, const AmdGpu::Sampler& sample .addressModeU = LiverpoolToVK::ClampMode(sampler.clamp_x), .addressModeV = LiverpoolToVK::ClampMode(sampler.clamp_y), .addressModeW = LiverpoolToVK::ClampMode(sampler.clamp_z), - .mipLodBias = sampler.LodBias(), + .mipLodBias = std::min(sampler.LodBias(), instance.MaxSamplerLodBias()), .compareEnable = sampler.depth_compare_func != AmdGpu::DepthCompare::Never, .compareOp = LiverpoolToVK::DepthCompare(sampler.depth_compare_func), .minLod = sampler.MinLod(), @@ -24,7 +24,10 @@ Sampler::Sampler(const Vulkan::Instance& instance, const AmdGpu::Sampler& sample .borderColor = LiverpoolToVK::BorderColor(sampler.border_color_type), .unnormalizedCoordinates = bool(sampler.force_unnormalized), }; - handle = instance.GetDevice().createSamplerUnique(sampler_ci); + auto [sampler_result, smplr] = instance.GetDevice().createSamplerUnique(sampler_ci); + ASSERT_MSG(sampler_result == vk::Result::eSuccess, "Failed to create sampler: {}", + vk::to_string(sampler_result)); + handle = std::move(smplr); } Sampler::~Sampler() = default; diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 3219f45b9..4813a3c57 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -29,10 +29,16 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& info.UpdateSize(); const ImageId null_id = slot_images.insert(instance, scheduler, info); ASSERT(null_id.index == 0); + const vk::Image& null_image = slot_images[null_id].image; + Vulkan::SetObjectName(instance.GetDevice(), null_image, "Null Image"); slot_images[null_id].flags = ImageFlagBits::Tracked; ImageViewInfo view_info; - void(slot_image_views.insert(instance, view_info, slot_images[null_id], null_id)); + const auto null_view_id = + slot_image_views.insert(instance, view_info, slot_images[null_id], null_id); + ASSERT(null_view_id.index == 0); + const vk::ImageView& null_image_view = slot_image_views[null_view_id].image_view.get(); + Vulkan::SetObjectName(instance.GetDevice(), null_image_view, "Null Image View"); } TextureCache::~TextureCache() = default; @@ -41,24 +47,23 @@ void TextureCache::InvalidateMemory(VAddr address, size_t size) { std::scoped_lock lock{mutex}; ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) { // Ensure image is reuploaded when accessed again. - image.flags |= ImageFlagBits::CpuModified; + image.flags |= ImageFlagBits::CpuDirty; // Untrack image, so the range is unprotected and the guest can write freely. UntrackImage(image_id); }); } -void TextureCache::MarkWritten(VAddr address, size_t max_size) { - static constexpr FindFlags find_flags = - FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize; - ImageInfo info{}; - info.guest_address = address; - info.guest_size_bytes = max_size; - const ImageId image_id = FindImage(info, find_flags); - if (!image_id) { - return; - } - // Ensure image is copied when accessed again. - slot_images[image_id].flags |= ImageFlagBits::CpuModified; +void TextureCache::InvalidateMemoryFromGPU(VAddr address, size_t max_size) { + std::scoped_lock lock{mutex}; + ForEachImageInRegion(address, max_size, [&](ImageId image_id, Image& image) { + // Only consider images that match base address. + // TODO: Maybe also consider subresources + if (image.info.guest_address != address) { + return; + } + // Ensure image is reuploaded when accessed again. + image.flags |= ImageFlagBits::GpuDirty; + }); } void TextureCache::UnmapMemory(VAddr cpu_addr, size_t size) { @@ -81,8 +86,7 @@ ImageId TextureCache::ResolveDepthOverlap(const ImageInfo& requested_info, Image auto new_image_id = slot_images.insert(instance, scheduler, requested_info); RegisterImage(new_image_id); - // auto& new_image = slot_images[new_image_id]; - // TODO: need to run a helper for depth copy here + // TODO: perform a depth copy here FreeImage(cache_image_id); return new_image_id; @@ -92,7 +96,11 @@ ImageId TextureCache::ResolveDepthOverlap(const ImageInfo& requested_info, Image !requested_info.usage.depth_target && (requested_info.usage.texture || requested_info.usage.storage); if (cache_info.usage.depth_target && should_bind_as_texture) { - return cache_image_id; + if (cache_info.resources == requested_info.resources) { + return cache_image_id; + } else { + UNREACHABLE(); + } } return {}; @@ -148,7 +156,7 @@ ImageId TextureCache::ResolveOverlap(const ImageInfo& image_info, ImageId cache_ if (tex_cache_image.info.IsMipOf(image_info)) { tex_cache_image.Transit(vk::ImageLayout::eTransferSrcOptimal, - vk::AccessFlagBits::eTransferRead); + vk::AccessFlagBits2::eTransferRead, {}); const auto num_mips_to_copy = tex_cache_image.info.resources.levels; ASSERT(num_mips_to_copy == 1); @@ -170,13 +178,17 @@ ImageId TextureCache::ExpandImage(const ImageInfo& info, ImageId image_id) { auto& src_image = slot_images[image_id]; auto& new_image = slot_images[new_image_id]; - src_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits::eTransferRead); + src_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {}); new_image.CopyImage(src_image); + if (True(src_image.flags & ImageFlagBits::Bound)) { + src_image.flags |= ImageFlagBits::NeedsRebind; + } + FreeImage(image_id); TrackImage(new_image_id); - new_image.flags &= ~ImageFlagBits::CpuModified; + new_image.flags &= ~ImageFlagBits::Dirty; return new_image_id; } @@ -249,21 +261,21 @@ ImageView& TextureCache::RegisterImageView(ImageId image_id, const ImageViewInfo return slot_image_views[view_id]; } -ImageView& TextureCache::FindTexture(const ImageInfo& info, const ImageViewInfo& view_info) { - const ImageId image_id = FindImage(info); +ImageView& TextureCache::FindTexture(ImageId image_id, const ImageViewInfo& view_info) { Image& image = slot_images[image_id]; UpdateImage(image_id); auto& usage = image.info.usage; if (view_info.is_storage) { image.Transit(vk::ImageLayout::eGeneral, - vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite); + vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eShaderWrite, + view_info.range); usage.storage = true; } else { const auto new_layout = image.info.IsDepthStencil() ? vk::ImageLayout::eDepthStencilReadOnlyOptimal : vk::ImageLayout::eShaderReadOnlyOptimal; - image.Transit(new_layout, vk::AccessFlagBits::eShaderRead); + image.Transit(new_layout, vk::AccessFlagBits2::eShaderRead, view_info.range); usage.texture = true; } @@ -278,8 +290,9 @@ ImageView& TextureCache::FindRenderTarget(const ImageInfo& image_info, UpdateImage(image_id); image.Transit(vk::ImageLayout::eColorAttachmentOptimal, - vk::AccessFlagBits::eColorAttachmentWrite | - vk::AccessFlagBits::eColorAttachmentRead); + vk::AccessFlagBits2::eColorAttachmentWrite | + vk::AccessFlagBits2::eColorAttachmentRead, + view_info.range); // Register meta data for this color buffer if (!(image.flags & ImageFlagBits::MetaRegistered)) { @@ -311,7 +324,7 @@ ImageView& TextureCache::FindDepthTarget(const ImageInfo& image_info, const ImageId image_id = FindImage(image_info); Image& image = slot_images[image_id]; image.flags |= ImageFlagBits::GpuModified; - image.flags &= ~ImageFlagBits::CpuModified; + image.flags &= ~ImageFlagBits::Dirty; image.aspect_mask = vk::ImageAspectFlagBits::eDepth; const bool has_stencil = image_info.usage.stencil; @@ -324,8 +337,10 @@ ImageView& TextureCache::FindDepthTarget(const ImageInfo& image_info, : vk::ImageLayout::eDepthAttachmentOptimal : has_stencil ? vk::ImageLayout::eDepthStencilReadOnlyOptimal : vk::ImageLayout::eDepthReadOnlyOptimal; - image.Transit(new_layout, vk::AccessFlagBits::eDepthStencilAttachmentWrite | - vk::AccessFlagBits::eDepthStencilAttachmentRead); + image.Transit(new_layout, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite | + vk::AccessFlagBits2::eDepthStencilAttachmentRead, + view_info.range); // Register meta data for this depth buffer if (!(image.flags & ImageFlagBits::MetaRegistered)) { @@ -346,11 +361,9 @@ ImageView& TextureCache::FindDepthTarget(const ImageInfo& image_info, } void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_scheduler /*= nullptr*/) { - if (False(image.flags & ImageFlagBits::CpuModified)) { + if (False(image.flags & ImageFlagBits::Dirty)) { return; } - // Mark image as validated. - image.flags &= ~ImageFlagBits::CpuModified; const auto& num_layers = image.info.resources.layers; const auto& num_mips = image.info.resources.levels; @@ -364,9 +377,10 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule image.info.props.is_volume ? std::max(image.info.size.depth >> m, 1u) : 1u; const auto& [mip_size, mip_pitch, mip_height, mip_ofs] = image.info.mips_layout[m]; - // Protect GPU modified resources from accidental reuploads. - if (True(image.flags & ImageFlagBits::GpuModified) && - !buffer_cache.IsRegionGpuModified(image.info.guest_address + mip_ofs, mip_size)) { + // Protect GPU modified resources from accidental CPU reuploads. + const bool is_gpu_modified = True(image.flags & ImageFlagBits::GpuModified); + const bool is_gpu_dirty = True(image.flags & ImageFlagBits::GpuDirty); + if (is_gpu_modified && !is_gpu_dirty) { const u8* addr = std::bit_cast(image.info.guest_address); const u64 hash = XXH3_64bits(addr + mip_ofs, mip_size); if (image.mip_hashes[m] == hash) { @@ -398,7 +412,8 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule sched_ptr->EndRendering(); const auto cmdbuf = sched_ptr->CommandBuffer(); - image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eTransferWrite, cmdbuf); + image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}, + cmdbuf); const VAddr image_addr = image.info.guest_address; const size_t image_size = image.info.guest_size_bytes; @@ -421,6 +436,7 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule } cmdbuf.copyBufferToImage(buffer, image.image, vk::ImageLayout::eTransferDstOptimal, image_copy); + image.flags &= ~ImageFlagBits::Dirty; } vk::Sampler TextureCache::GetSampler(const AmdGpu::Sampler& sampler) { diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index cc19ac4a8..3bbfd952c 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -51,7 +51,7 @@ public: void InvalidateMemory(VAddr address, size_t size); /// Marks an image as dirty if it exists at the provided address. - void MarkWritten(VAddr address, size_t max_size); + void InvalidateMemoryFromGPU(VAddr address, size_t max_size); /// Evicts any images that overlap the unmapped range. void UnmapMemory(VAddr cpu_addr, size_t size); @@ -59,9 +59,8 @@ public: /// Retrieves the image handle of the image with the provided attributes. [[nodiscard]] ImageId FindImage(const ImageInfo& info, FindFlags flags = {}); - /// Retrieves an image view with the properties of the specified image descriptor. - [[nodiscard]] ImageView& FindTexture(const ImageInfo& image_info, - const ImageViewInfo& view_info); + /// Retrieves an image view with the properties of the specified image id. + [[nodiscard]] ImageView& FindTexture(ImageId image_id, const ImageViewInfo& view_info); /// Retrieves the render target with specified properties [[nodiscard]] ImageView& FindRenderTarget(const ImageInfo& image_info, @@ -98,6 +97,11 @@ public: return slot_images[id]; } + /// Retrieves the image view with the specified id. + [[nodiscard]] ImageView& GetImageView(ImageId id) { + return slot_image_views[id]; + } + bool IsMeta(VAddr address) const { return surface_metas.contains(address); } diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index bdbe0a0b9..a26028381 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -15,10 +15,7 @@ #include #include -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnullability-completeness" #include -#pragma GCC diagnostic pop namespace VideoCore { @@ -264,6 +261,38 @@ TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& sc HostShaders::DETILE_M32X4_COMP, }; + boost::container::static_vector bindings{ + { + .binding = 0, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eCompute, + }, + { + .binding = 1, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eCompute, + }, + }; + + const vk::DescriptorSetLayoutCreateInfo desc_layout_ci = { + .flags = vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR, + .bindingCount = static_cast(bindings.size()), + .pBindings = bindings.data(), + }; + auto desc_layout_result = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); + ASSERT_MSG(desc_layout_result.result == vk::Result::eSuccess, + "Failed to create descriptor set layout: {}", + vk::to_string(desc_layout_result.result)); + desc_layout = std::move(desc_layout_result.value); + + const vk::PushConstantRange push_constants = { + .stageFlags = vk::ShaderStageFlagBits::eCompute, + .offset = 0, + .size = sizeof(DetilerParams), + }; + for (int pl_id = 0; pl_id < DetilerType::Max; ++pl_id) { auto& ctx = detilers[pl_id]; @@ -280,35 +309,6 @@ TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& sc .pName = "main", }; - boost::container::static_vector bindings{ - { - .binding = 0, - .descriptorType = vk::DescriptorType::eStorageBuffer, - .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eCompute, - }, - { - .binding = 1, - .descriptorType = vk::DescriptorType::eStorageBuffer, - .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eCompute, - }, - }; - - const vk::DescriptorSetLayoutCreateInfo desc_layout_ci = { - .flags = vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR, - .bindingCount = static_cast(bindings.size()), - .pBindings = bindings.data(), - }; - static auto desc_layout = - instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); - - const vk::PushConstantRange push_constants = { - .stageFlags = vk::ShaderStageFlagBits::eCompute, - .offset = 0, - .size = sizeof(DetilerParams), - }; - const vk::DescriptorSetLayout set_layout = *desc_layout; const vk::PipelineLayoutCreateInfo layout_info = { .setLayoutCount = 1U, @@ -316,7 +316,10 @@ TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& sc .pushConstantRangeCount = 1, .pPushConstantRanges = &push_constants, }; - ctx.pl_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info); + auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info); + ASSERT_MSG(layout_result == vk::Result::eSuccess, "Failed to create pipeline layout: {}", + vk::to_string(layout_result)); + ctx.pl_layout = std::move(layout); const vk::ComputePipelineCreateInfo compute_pipeline_ci = { .stage = shader_ci, diff --git a/src/video_core/texture_cache/tile_manager.h b/src/video_core/texture_cache/tile_manager.h index d0e5eb0f3..ed7e32c44 100644 --- a/src/video_core/texture_cache/tile_manager.h +++ b/src/video_core/texture_cache/tile_manager.h @@ -51,6 +51,7 @@ private: private: const Vulkan::Instance& instance; Vulkan::Scheduler& scheduler; + vk::UniqueDescriptorSetLayout desc_layout; std::array detilers; };