mirror of
https://git.suyu.dev/suyu/suyu
synced 2025-12-09 22:32:08 -06:00
Compare commits
5 Commits
v0.0.1
...
ci-fijxu-t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2060ec4055 | ||
|
|
a12955236f | ||
|
|
209c2ac762 | ||
|
|
39b6f9b4c6 | ||
|
|
7e17961259 |
@@ -11,9 +11,9 @@ ccache -s
|
|||||||
mkdir build || true && cd build
|
mkdir build || true && cd build
|
||||||
cmake .. \
|
cmake .. \
|
||||||
-DBoost_USE_STATIC_LIBS=ON \
|
-DBoost_USE_STATIC_LIBS=ON \
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DSUYU_USE_PRECOMPILED_HEADERS=OFF \
|
-DSUYU_USE_PRECOMPILED_HEADERS=OFF \
|
||||||
-DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \
|
-DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
-DCMAKE_CXX_FLAGS="-march=x86-64-v2" \
|
-DCMAKE_CXX_FLAGS="-march=x86-64-v2" \
|
||||||
-DCMAKE_CXX_COMPILER=/usr/lib/ccache/g++ \
|
-DCMAKE_CXX_COMPILER=/usr/lib/ccache/g++ \
|
||||||
-DCMAKE_C_COMPILER=/usr/lib/ccache/gcc \
|
-DCMAKE_C_COMPILER=/usr/lib/ccache/gcc \
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project
|
|
||||||
# SPDX-FileCopyrightText: 2024 suyu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
# Actions Documentation: https://forgejo.org/docs/next/user/actions/#list-of-tasks-in-a-repository
|
|
||||||
|
|
||||||
name: suyu-ci
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "*" ]
|
|
||||||
tags: [ "*" ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ "dev" ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# We don't have transifex for now.
|
|
||||||
# transifex:
|
|
||||||
# runs-on: ubuntu-latest
|
|
||||||
# container: fijxu/build-environments:linux-transifex
|
|
||||||
# if: ${{ GITHUB_REPOSITORY == 'suyu/suyu' && !GITHUB_HEAD_REF }}
|
|
||||||
# steps:
|
|
||||||
# - uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
# with:
|
|
||||||
# submodules: recursive
|
|
||||||
# fetch-depth: 0
|
|
||||||
# - name: Update Translation
|
|
||||||
# run: ./.ci/scripts/transifex/docker.sh
|
|
||||||
# env:
|
|
||||||
# TX_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }}
|
|
||||||
|
|
||||||
reuse:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository == 'suyu/suyu' }}
|
|
||||||
steps:
|
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
- uses: https://github.com/fsfe/reuse-action@v1
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
# SPDX-FileCopyrightText: 2024 suyu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#
|
|
||||||
# GitHub Action to automate the identification of common misspellings in text files.
|
|
||||||
# https://github.com/codespell-project/actions-codespell
|
|
||||||
# https://github.com/codespell-project/codespell
|
|
||||||
|
|
||||||
# Actions Documentation: https://forgejo.org/docs/next/user/actions/#list-of-tasks-in-a-repository
|
|
||||||
|
|
||||||
name: codespell
|
|
||||||
on: pull_request
|
|
||||||
permissions: {}
|
|
||||||
jobs:
|
|
||||||
codespell:
|
|
||||||
name: Check for spelling errors
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- uses: https://github.com/codespell-project/actions-codespell@master
|
|
||||||
@@ -1,198 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
|
||||||
# SPDX-FileCopyrightText: 2024 suyu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
# Actions Documentation: https://forgejo.org/docs/next/user/actions/#list-of-tasks-in-a-repository
|
|
||||||
|
|
||||||
name: 'suyu verify'
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches: [ "dev" ]
|
|
||||||
push:
|
|
||||||
branches: [ "dev" ]
|
|
||||||
env:
|
|
||||||
PR_NUMBER: pr${{ github.event.number }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
format:
|
|
||||||
name: 'verify format'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: false
|
|
||||||
- name: set up JDK 17
|
|
||||||
uses: https://github.com/actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '17'
|
|
||||||
distribution: 'temurin'
|
|
||||||
- name: 'Verify Formatting'
|
|
||||||
run: bash -ex ./.ci/scripts/format/script.sh
|
|
||||||
build-linux:
|
|
||||||
name: 'test build'
|
|
||||||
needs: format
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- type: clang
|
|
||||||
image: linux-fresh
|
|
||||||
- type: linux
|
|
||||||
image: linux-fresh
|
|
||||||
- type: windows
|
|
||||||
image: linux-mingw
|
|
||||||
container:
|
|
||||||
image: fijxu/build-environments:${{ matrix.image }}
|
|
||||||
options: -u 1001
|
|
||||||
steps:
|
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Set up cache
|
|
||||||
uses: https://code.forgejo.org/actions/cache@v3
|
|
||||||
id: ccache-restore
|
|
||||||
with:
|
|
||||||
path: ~/.ccache
|
|
||||||
key: ${{ runner.os }}-${{ matrix.type }}-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-${{ matrix.type }}-
|
|
||||||
- name: Create ccache directory
|
|
||||||
if: steps.ccache-restore.outputs.cache-hit != 'true'
|
|
||||||
run: mkdir -p ~/.ccache
|
|
||||||
- name: Build
|
|
||||||
run: ./.ci/scripts/${{ matrix.type }}/docker.sh
|
|
||||||
env:
|
|
||||||
ENABLE_COMPATIBILITY_REPORTING: "ON"
|
|
||||||
- name: Pack
|
|
||||||
run: ./.ci/scripts/${{ matrix.type }}/upload.sh
|
|
||||||
env:
|
|
||||||
NO_SOURCE_PACK: "YES"
|
|
||||||
- name: Upload
|
|
||||||
uses: https://code.forgejo.org/actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.type }}
|
|
||||||
path: artifacts/
|
|
||||||
# build-mac:
|
|
||||||
# name: 'test build (macos)'
|
|
||||||
# needs: format
|
|
||||||
# runs-on: macos-14
|
|
||||||
# steps:
|
|
||||||
# - uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
# with:
|
|
||||||
# submodules: recursive
|
|
||||||
# fetch-depth: 0
|
|
||||||
# - name: Install dependencies
|
|
||||||
# run: |
|
|
||||||
# brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@5 sdl2 speexdsp zlib zlib zstd
|
|
||||||
# - name: Build
|
|
||||||
# run: |
|
|
||||||
# mkdir build
|
|
||||||
# cd build
|
|
||||||
# export Qt5_DIR="$(brew --prefix qt@5)/lib/cmake"
|
|
||||||
# cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSUYU_USE_BUNDLED_VCPKG=OFF -DSUYU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
|
||||||
# ninja
|
|
||||||
# build-msvc:
|
|
||||||
# name: 'test build (windows, msvc)'
|
|
||||||
# needs: format
|
|
||||||
# runs-on: windows-2022
|
|
||||||
# steps:
|
|
||||||
# - uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
# with:
|
|
||||||
# submodules: recursive
|
|
||||||
# fetch-depth: 0
|
|
||||||
# - name: Set up cache
|
|
||||||
# uses: https://code.forgejo.org/actions/cache@v3
|
|
||||||
# with:
|
|
||||||
# path: ~/.buildcache
|
|
||||||
# key: ${{ runner.os }}-msvc-${{ github.sha }}
|
|
||||||
# restore-keys: |
|
|
||||||
# ${{ runner.os }}-msvc-
|
|
||||||
# - name: Install dependencies
|
|
||||||
# shell: pwsh
|
|
||||||
# run: |
|
|
||||||
# $ErrorActionPreference = "Stop"
|
|
||||||
# $BuildCacheVer = "v0.28.4"
|
|
||||||
# $File = "buildcache-windows.zip"
|
|
||||||
# $Uri = "https://github.com/mbitsnbites/buildcache/releases/download/$BuildCacheVer/$File"
|
|
||||||
# $WebClient = New-Object System.Net.WebClient
|
|
||||||
# $WebClient.DownloadFile($Uri, $File)
|
|
||||||
# 7z x $File
|
|
||||||
# $CurrentDir = Convert-Path .
|
|
||||||
# echo "$CurrentDir/buildcache/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
||||||
# - name: Install Vulkan SDK
|
|
||||||
# shell: pwsh
|
|
||||||
# run: .\.ci\scripts\windows\install-vulkan-sdk.ps1
|
|
||||||
# - name: Set up MSVC
|
|
||||||
# uses: https://github.com/ilammy/msvc-dev-cmd@v1
|
|
||||||
# - name: Configure
|
|
||||||
# env:
|
|
||||||
# CC: cl.exe
|
|
||||||
# CXX: cl.exe
|
|
||||||
# run: |
|
|
||||||
# glslangValidator --version
|
|
||||||
# mkdir build
|
|
||||||
# cmake . -B build -GNinja -DCMAKE_TOOLCHAIN_FILE="CMakeModules/MSVCCache.cmake" -DUSE_CCACHE=ON -DSUYU_USE_BUNDLED_QT=1 -DSUYU_USE_BUNDLED_SDL2=1 -DSUYU_USE_QT_WEB_ENGINE=ON -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DSUYU_ENABLE_COMPATIBILITY_REPORTING=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_QT_TRANSLATION=ON -DCMAKE_BUILD_TYPE=Release -DGIT_BRANCH=pr-verify -DSUYU_CRASH_DUMPS=ON
|
|
||||||
# - name: Build
|
|
||||||
# run: cmake --build build
|
|
||||||
# - name: Cache Summary
|
|
||||||
# run: buildcache -s
|
|
||||||
# - name: Pack
|
|
||||||
# shell: pwsh
|
|
||||||
# run: .\.ci\scripts\windows\upload.ps1
|
|
||||||
# - name: Upload
|
|
||||||
# uses: https://code.forgejo.org/actions/upload-artifact@v3
|
|
||||||
# with:
|
|
||||||
# name: msvc
|
|
||||||
# path: artifacts/
|
|
||||||
# - name: Upload EXE
|
|
||||||
# uses: https://code.forgejo.org/actions/upload-artifact@v3
|
|
||||||
# with:
|
|
||||||
# name: ${{ env.INDIVIDUAL_EXE }}
|
|
||||||
# path: ${{ env.INDIVIDUAL_EXE }}
|
|
||||||
android:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: format
|
|
||||||
steps:
|
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: set up JDK 17
|
|
||||||
uses: https://github.com/actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '17'
|
|
||||||
distribution: 'temurin'
|
|
||||||
- name: Set up cache
|
|
||||||
uses: https://code.forgejo.org/actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
~/.ccache
|
|
||||||
key: ${{ runner.os }}-android-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-android-
|
|
||||||
- name: Query tag name
|
|
||||||
uses: https://github.com/olegtarasov/get-tag@v2.1.2
|
|
||||||
id: tagName
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y ccache apksigner glslang-dev glslang-tools
|
|
||||||
- name: Build
|
|
||||||
run: ./.ci/scripts/android/build.sh
|
|
||||||
- name: Copy and sign artifacts
|
|
||||||
env:
|
|
||||||
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
|
||||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
|
||||||
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
|
||||||
run: ./.ci/scripts/android/upload.sh
|
|
||||||
- name: Upload
|
|
||||||
uses: https://code.forgejo.org/actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: android
|
|
||||||
path: artifacts/
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
name: New Issue (Developers Only)
|
|
||||||
description: A blank issue template for developers only. If you are not a developer, do not use this issue template. Your issue WILL BE CLOSED if you do not use the appropriate issue template.
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
**If you are not a developer, do not use this issue template. Your issue WILL BE CLOSED if you do not use the appropriate issue template.**
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "Issue"
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
name: Bug Report
|
|
||||||
description: File a bug report
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: Tech support does not belong here. You should only file an issue here if you think you have experienced an actual bug with suyu.
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Is there an existing issue for this?
|
|
||||||
description: Please search to see if an issue already exists for the bug you encountered.
|
|
||||||
options:
|
|
||||||
- label: I have searched the existing issues
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Affected Build(s)
|
|
||||||
description: List the affected build(s) that this issue applies to.
|
|
||||||
placeholder: Mainline 1234 / Early Access 1234
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: issue-desc
|
|
||||||
attributes:
|
|
||||||
label: Description of Issue
|
|
||||||
description: A brief description of the issue encountered along with any images and/or videos.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: expected-behavior
|
|
||||||
attributes:
|
|
||||||
label: Expected Behavior
|
|
||||||
description: A brief description of how it is expected to work along with any images and/or videos.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: reproduction-steps
|
|
||||||
attributes:
|
|
||||||
label: Reproduction Steps
|
|
||||||
description: A brief explanation of how to reproduce this issue. If possible, provide a save file to aid in reproducing the issue.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: log
|
|
||||||
attributes:
|
|
||||||
label: Log File
|
|
||||||
description: A log file will help our developers to better diagnose and fix the issue. Instructions can be found [here](https://suyu.dev/help/reference/log-files).
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: system-config
|
|
||||||
attributes:
|
|
||||||
label: System Configuration
|
|
||||||
placeholder: |
|
|
||||||
CPU: Intel i5-10400 / AMD Ryzen 5 3600
|
|
||||||
GPU/Driver: NVIDIA GeForce GTX 1060 (Driver 512.95)
|
|
||||||
RAM: 16GB DDR4-3200
|
|
||||||
OS: Windows 11 22H2 (Build 22621.819)
|
|
||||||
value: |
|
|
||||||
CPU:
|
|
||||||
GPU/Driver:
|
|
||||||
RAM:
|
|
||||||
OS:
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: suyu Discord
|
|
||||||
url: https://discord.com/invite/suyu
|
|
||||||
about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed.
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
name: Feature Request
|
|
||||||
description: File a feature request
|
|
||||||
labels: "request"
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: Tech support does not belong here. You should only file an issue here if you are requesting a feature you believe would make suyu better.
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Is there an existing issue for this?
|
|
||||||
description: Please search to see if an issue already exists for the feature you are requesting.
|
|
||||||
options:
|
|
||||||
- label: I have searched the existing issues
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: what-feature
|
|
||||||
attributes:
|
|
||||||
label: What feature are you suggesting?
|
|
||||||
description: A brief description of the requested feature.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: why-feature
|
|
||||||
attributes:
|
|
||||||
label: Why would this feature be useful?
|
|
||||||
description: A brief description of why this feature would make suyu better.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
name: 'suyu-android-build'
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags: [ "*" ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
android:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository == 'suyu-emu/suyu-android' }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Set up JDK 17
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '17'
|
|
||||||
distribution: 'temurin'
|
|
||||||
- name: Set up cache
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
~/.ccache
|
|
||||||
key: ${{ runner.os }}-android-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-android-
|
|
||||||
- name: Query tag name
|
|
||||||
uses: olegtarasov/get-tag@v2.1.2
|
|
||||||
id: tagName
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y ccache apksigner glslang-dev glslang-tools
|
|
||||||
- name: Build
|
|
||||||
run: ./.ci/scripts/android/build.sh
|
|
||||||
env:
|
|
||||||
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
|
||||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
|
||||||
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
|
||||||
- name: Copy artifacts
|
|
||||||
run: ./.ci/scripts/android/upload.sh
|
|
||||||
- name: Upload
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: android
|
|
||||||
path: artifacts/
|
|
||||||
# release steps
|
|
||||||
release-android:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [android]
|
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
- name: Query tag name
|
|
||||||
uses: olegtarasov/get-tag@v2.1.2
|
|
||||||
id: tagName
|
|
||||||
- name: Create release
|
|
||||||
uses: actions/create-release@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
tag_name: ${{ steps.tagName.outputs.tag }}
|
|
||||||
release_name: ${{ steps.tagName.outputs.tag }}
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: alexellis/upload-assets@0.2.3
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
asset_paths: '["./**/*.apk","./**/*.aab"]'
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
name: suyu-android-ea-play-release
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
release-track:
|
|
||||||
description: 'Play store release track (internal/alpha/beta/production)'
|
|
||||||
required: true
|
|
||||||
default: 'alpha'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
android:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository == 'suyu-emu/suyu' }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
name: Checkout
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
token: ${{ secrets.ALT_GITHUB_TOKEN }}
|
|
||||||
- run: npm install execa@5
|
|
||||||
- uses: actions/github-script@v5
|
|
||||||
name: 'Merge and publish Android EA changes'
|
|
||||||
env:
|
|
||||||
ALT_GITHUB_TOKEN: ${{ secrets.ALT_GITHUB_TOKEN }}
|
|
||||||
BUILD_EA: true
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const execa = require("execa");
|
|
||||||
const mergebot = require('./.github/workflows/android-merge.js').mergebot;
|
|
||||||
process.chdir('${{ github.workspace }}');
|
|
||||||
mergebot(github, context, execa);
|
|
||||||
- name: Get tag name
|
|
||||||
run: echo "GIT_TAG_NAME=$(cat tag-name.txt)" >> $GITHUB_ENV
|
|
||||||
- name: Set up JDK 17
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '17'
|
|
||||||
distribution: 'temurin'
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y ccache apksigner glslang-dev glslang-tools
|
|
||||||
- name: Build
|
|
||||||
run: ./.ci/scripts/android/eabuild.sh
|
|
||||||
env:
|
|
||||||
EA_PLAY_ANDROID_KEYSTORE_B64: ${{ secrets.PLAY_ANDROID_KEYSTORE_B64 }}
|
|
||||||
PLAY_ANDROID_KEY_ALIAS: ${{ secrets.PLAY_ANDROID_KEY_ALIAS }}
|
|
||||||
PLAY_ANDROID_KEYSTORE_PASS: ${{ secrets.PLAY_ANDROID_KEYSTORE_PASS }}
|
|
||||||
EA_SERVICE_ACCOUNT_KEY_B64: ${{ secrets.EA_SERVICE_ACCOUNT_KEY_B64 }}
|
|
||||||
STORE_TRACK: ${{ github.event.inputs.release-track }}
|
|
||||||
AUTO_VERSIONED: true
|
|
||||||
BUILD_EA: true
|
|
||||||
- name: Create release
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
with:
|
|
||||||
tag_name: ${{ env.EA_TAG_NAME }}
|
|
||||||
name: ${{ env.EA_TAG_NAME }}
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
repository: suyu/suyu-android
|
|
||||||
token: ${{ secrets.ALT_GITHUB_TOKEN }}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
name: suyu-android-mainline-play-release
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
release-tag:
|
|
||||||
description: 'Tag # from suyu-android that you want to build and publish'
|
|
||||||
required: true
|
|
||||||
default: '200'
|
|
||||||
release-track:
|
|
||||||
description: 'Play store release track (internal/alpha/beta/production)'
|
|
||||||
required: true
|
|
||||||
default: 'alpha'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
android:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository == 'suyu-emu/suyu' }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
name: Checkout
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
token: ${{ secrets.ALT_GITHUB_TOKEN }}
|
|
||||||
- run: npm install execa@5
|
|
||||||
- uses: actions/github-script@v5
|
|
||||||
name: 'Pull mainline tag'
|
|
||||||
env:
|
|
||||||
MAINLINE_TAG: ${{ github.event.inputs.release-tag }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const execa = require("execa");
|
|
||||||
const mergebot = require('./.github/workflows/android-merge.js').getMainlineTag;
|
|
||||||
process.chdir('${{ github.workspace }}');
|
|
||||||
mergebot(execa);
|
|
||||||
- name: Set up JDK 17
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '17'
|
|
||||||
distribution: 'temurin'
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y ccache apksigner glslang-dev glslang-tools
|
|
||||||
- name: Build
|
|
||||||
run: |
|
|
||||||
echo "GIT_TAG_NAME=android-${{ github.event.inputs.releast-tag }}" >> $GITHUB_ENV
|
|
||||||
./.ci/scripts/android/mainlinebuild.sh
|
|
||||||
env:
|
|
||||||
MAINLINE_PLAY_ANDROID_KEYSTORE_B64: ${{ secrets.PLAY_ANDROID_KEYSTORE_B64 }}
|
|
||||||
PLAY_ANDROID_KEY_ALIAS: ${{ secrets.PLAY_ANDROID_KEY_ALIAS }}
|
|
||||||
PLAY_ANDROID_KEYSTORE_PASS: ${{ secrets.PLAY_ANDROID_KEYSTORE_PASS }}
|
|
||||||
SERVICE_ACCOUNT_KEY_B64: ${{ secrets.MAINLINE_SERVICE_ACCOUNT_KEY_B64 }}
|
|
||||||
STORE_TRACK: ${{ github.event.inputs.release-track }}
|
|
||||||
AUTO_VERSIONED: true
|
|
||||||
@@ -1,318 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
// Note: This is a GitHub Actions script
|
|
||||||
// It is not meant to be executed directly on your machine without modifications
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
// which label to check for changes
|
|
||||||
const CHANGE_LABEL_MAINLINE = 'android-merge';
|
|
||||||
const CHANGE_LABEL_EA = 'android-ea-merge';
|
|
||||||
// how far back in time should we consider the changes are "recent"? (default: 24 hours)
|
|
||||||
const DETECTION_TIME_FRAME = (parseInt(process.env.DETECTION_TIME_FRAME)) || (24 * 3600 * 1000);
|
|
||||||
const BUILD_EA = process.env.BUILD_EA == 'true';
|
|
||||||
const MAINLINE_TAG = process.env.MAINLINE_TAG;
|
|
||||||
|
|
||||||
async function checkBaseChanges(github) {
|
|
||||||
// query the commit date of the latest commit on this branch
|
|
||||||
const query = `query($owner:String!, $name:String!, $ref:String!) {
|
|
||||||
repository(name:$name, owner:$owner) {
|
|
||||||
ref(qualifiedName:$ref) {
|
|
||||||
target {
|
|
||||||
... on Commit { id pushedDate oid }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
const variables = {
|
|
||||||
owner: 'suyu-emu',
|
|
||||||
name: 'suyu',
|
|
||||||
ref: 'refs/heads/master',
|
|
||||||
};
|
|
||||||
const result = await github.graphql(query, variables);
|
|
||||||
const pushedAt = result.repository.ref.target.pushedDate;
|
|
||||||
console.log(`Last commit pushed at ${pushedAt}.`);
|
|
||||||
const delta = new Date() - new Date(pushedAt);
|
|
||||||
if (delta <= DETECTION_TIME_FRAME) {
|
|
||||||
console.info('New changes detected, triggering a new build.');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
console.info('No new changes detected.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function checkAndroidChanges(github) {
|
|
||||||
if (checkBaseChanges(github)) return true;
|
|
||||||
const pulls = getPulls(github, false);
|
|
||||||
for (let i = 0; i < pulls.length; i++) {
|
|
||||||
let pull = pulls[i];
|
|
||||||
if (new Date() - new Date(pull.headRepository.pushedAt) <= DETECTION_TIME_FRAME) {
|
|
||||||
console.info(`${pull.number} updated at ${pull.headRepository.pushedAt}`);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.info("No changes detected in any tagged pull requests.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function tagAndPush(github, owner, repo, execa, commit=false) {
|
|
||||||
let altToken = process.env.ALT_GITHUB_TOKEN;
|
|
||||||
if (!altToken) {
|
|
||||||
throw `Please set ALT_GITHUB_TOKEN environment variable. This token should have write access to ${owner}/${repo}.`;
|
|
||||||
}
|
|
||||||
const query = `query ($owner:String!, $name:String!) {
|
|
||||||
repository(name:$name, owner:$owner) {
|
|
||||||
refs(refPrefix: "refs/tags/", orderBy: {field: TAG_COMMIT_DATE, direction: DESC}, first: 10) {
|
|
||||||
nodes { name }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
const variables = {
|
|
||||||
owner: owner,
|
|
||||||
name: repo,
|
|
||||||
};
|
|
||||||
const tags = await github.graphql(query, variables);
|
|
||||||
const tagList = tags.repository.refs.nodes;
|
|
||||||
let lastTag = 'android-1';
|
|
||||||
for (let i = 0; i < tagList.length; ++i) {
|
|
||||||
if (tagList[i].name.includes('android-')) {
|
|
||||||
lastTag = tagList[i].name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const tagNumber = /\w+-(\d+)/.exec(lastTag)[1] | 0;
|
|
||||||
const channel = repo.split('-')[1];
|
|
||||||
const newTag = `${channel}-${tagNumber + 1}`;
|
|
||||||
console.log(`New tag: ${newTag}`);
|
|
||||||
if (commit) {
|
|
||||||
let channelName = channel[0].toUpperCase() + channel.slice(1);
|
|
||||||
console.info(`Committing pending commit as ${channelName} ${tagNumber + 1}`);
|
|
||||||
await execa("git", ['commit', '-m', `${channelName} ${tagNumber + 1}`]);
|
|
||||||
}
|
|
||||||
console.info('Pushing tags to GitHub ...');
|
|
||||||
await execa("git", ['tag', newTag]);
|
|
||||||
await execa("git", ['remote', 'add', 'target', `https://${altToken}@github.com/${owner}/${repo}.git`]);
|
|
||||||
await execa("git", ['push', 'target', 'master', '-f']);
|
|
||||||
await execa("git", ['push', 'target', 'master', '--tags']);
|
|
||||||
console.info('Successfully pushed new changes.');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function tagAndPushEA(github, owner, repo, execa) {
|
|
||||||
let altToken = process.env.ALT_GITHUB_TOKEN;
|
|
||||||
if (!altToken) {
|
|
||||||
throw `Please set ALT_GITHUB_TOKEN environment variable. This token should have write access to ${owner}/${repo}.`;
|
|
||||||
}
|
|
||||||
const query = `query ($owner:String!, $name:String!) {
|
|
||||||
repository(name:$name, owner:$owner) {
|
|
||||||
refs(refPrefix: "refs/tags/", orderBy: {field: TAG_COMMIT_DATE, direction: DESC}, first: 10) {
|
|
||||||
nodes { name }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
const variables = {
|
|
||||||
owner: owner,
|
|
||||||
name: repo,
|
|
||||||
};
|
|
||||||
const tags = await github.graphql(query, variables);
|
|
||||||
const tagList = tags.repository.refs.nodes;
|
|
||||||
let lastTag = 'ea-1';
|
|
||||||
for (let i = 0; i < tagList.length; ++i) {
|
|
||||||
if (tagList[i].name.includes('ea-')) {
|
|
||||||
lastTag = tagList[i].name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const tagNumber = /\w+-(\d+)/.exec(lastTag)[1] | 0;
|
|
||||||
const newTag = `ea-${tagNumber + 1}`;
|
|
||||||
console.log(`New tag: ${newTag}`);
|
|
||||||
console.info('Pushing tags to GitHub ...');
|
|
||||||
await execa("git", ["remote", "add", "android", "https://gitlab.com/suyu-emu/suyu-android.git"]);
|
|
||||||
await execa("git", ["fetch", "android"]);
|
|
||||||
|
|
||||||
await execa("git", ['tag', newTag]);
|
|
||||||
await execa("git", ['push', 'android', `${newTag}`]);
|
|
||||||
|
|
||||||
fs.writeFile('tag-name.txt', newTag, (err) => {
|
|
||||||
if (err) throw 'Could not write tag name to file!'
|
|
||||||
})
|
|
||||||
|
|
||||||
console.info('Successfully pushed new changes.');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function generateReadme(pulls, context, mergeResults, execa) {
|
|
||||||
let baseUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/`;
|
|
||||||
let output =
|
|
||||||
"| Pull Request | Commit | Title | Author | Merged? |\n|----|----|----|----|----|\n";
|
|
||||||
for (let pull of pulls) {
|
|
||||||
let pr = pull.number;
|
|
||||||
let result = mergeResults[pr];
|
|
||||||
output += `| [${pr}](${baseUrl}/pull/${pr}) | [\`${result.rev || "N/A"}\`](${baseUrl}/pull/${pr}/files) | ${pull.title} | [${pull.author.login}](https://github.com/${pull.author.login}/) | ${result.success ? "Yes" : "No"} |\n`;
|
|
||||||
}
|
|
||||||
output +=
|
|
||||||
"\n\nEnd of merge log. You can find the original README.md below the break.\n\n-----\n\n";
|
|
||||||
output += fs.readFileSync("./README.md");
|
|
||||||
fs.writeFileSync("./README.md", output);
|
|
||||||
await execa("git", ["add", "README.md"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchPullRequests(pulls, repoUrl, execa) {
|
|
||||||
console.log("::group::Fetch pull requests");
|
|
||||||
for (let pull of pulls) {
|
|
||||||
let pr = pull.number;
|
|
||||||
console.info(`Fetching PR ${pr} ...`);
|
|
||||||
await execa("git", [
|
|
||||||
"fetch",
|
|
||||||
"-f",
|
|
||||||
"--no-recurse-submodules",
|
|
||||||
repoUrl,
|
|
||||||
`pull/${pr}/head:pr-${pr}`,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
console.log("::endgroup::");
|
|
||||||
}
|
|
||||||
|
|
||||||
async function mergePullRequests(pulls, execa) {
|
|
||||||
let mergeResults = {};
|
|
||||||
console.log("::group::Merge pull requests");
|
|
||||||
await execa("git", ["config", "--global", "user.name", "suyubot"]);
|
|
||||||
await execa("git", [
|
|
||||||
"config",
|
|
||||||
"--global",
|
|
||||||
"user.email",
|
|
||||||
"suyu\x40suyu-emu\x2eorg", // prevent email harvesters from scraping the address
|
|
||||||
]);
|
|
||||||
let hasFailed = false;
|
|
||||||
for (let pull of pulls) {
|
|
||||||
let pr = pull.number;
|
|
||||||
console.info(`Merging PR ${pr} ...`);
|
|
||||||
try {
|
|
||||||
const process1 = execa("git", [
|
|
||||||
"merge",
|
|
||||||
"--squash",
|
|
||||||
"--no-edit",
|
|
||||||
`pr-${pr}`,
|
|
||||||
]);
|
|
||||||
process1.stdout.pipe(process.stdout);
|
|
||||||
await process1;
|
|
||||||
|
|
||||||
const process2 = execa("git", ["commit", "-m", `Merge suyu-emu#${pr}`]);
|
|
||||||
process2.stdout.pipe(process.stdout);
|
|
||||||
await process2;
|
|
||||||
|
|
||||||
const process3 = await execa("git", ["rev-parse", "--short", `pr-${pr}`]);
|
|
||||||
mergeResults[pr] = {
|
|
||||||
success: true,
|
|
||||||
rev: process3.stdout,
|
|
||||||
};
|
|
||||||
} catch (err) {
|
|
||||||
console.log(
|
|
||||||
`::error title=#${pr} not merged::Failed to merge pull request: ${pr}: ${err}`
|
|
||||||
);
|
|
||||||
mergeResults[pr] = { success: false };
|
|
||||||
hasFailed = true;
|
|
||||||
await execa("git", ["reset", "--hard"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log("::endgroup::");
|
|
||||||
if (hasFailed) {
|
|
||||||
throw 'There are merge failures. Aborting!';
|
|
||||||
}
|
|
||||||
return mergeResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function resetBranch(execa) {
|
|
||||||
console.log("::group::Reset master branch");
|
|
||||||
let hasFailed = false;
|
|
||||||
try {
|
|
||||||
await execa("git", ["remote", "add", "source", "https://gitlab.com/suyu-emu/suyu.git"]);
|
|
||||||
await execa("git", ["fetch", "source"]);
|
|
||||||
const process1 = await execa("git", ["rev-parse", "source/master"]);
|
|
||||||
const headCommit = process1.stdout;
|
|
||||||
|
|
||||||
await execa("git", ["reset", "--hard", headCommit]);
|
|
||||||
} catch (err) {
|
|
||||||
console.log(`::error title=Failed to reset master branch`);
|
|
||||||
hasFailed = true;
|
|
||||||
}
|
|
||||||
console.log("::endgroup::");
|
|
||||||
if (hasFailed) {
|
|
||||||
throw 'Failed to reset the master branch. Aborting!';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getPulls(github) {
|
|
||||||
const query = `query ($owner:String!, $name:String!, $label:String!) {
|
|
||||||
repository(name:$name, owner:$owner) {
|
|
||||||
pullRequests(labels: [$label], states: OPEN, first: 100) {
|
|
||||||
nodes {
|
|
||||||
number title author { login }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
const mainlineVariables = {
|
|
||||||
owner: 'suyu-emu',
|
|
||||||
name: 'suyu',
|
|
||||||
label: CHANGE_LABEL_MAINLINE,
|
|
||||||
};
|
|
||||||
const mainlineResult = await github.graphql(query, mainlineVariables);
|
|
||||||
const pulls = mainlineResult.repository.pullRequests.nodes;
|
|
||||||
if (BUILD_EA) {
|
|
||||||
const eaVariables = {
|
|
||||||
owner: 'suyu-emu',
|
|
||||||
name: 'suyu',
|
|
||||||
label: CHANGE_LABEL_EA,
|
|
||||||
};
|
|
||||||
const eaResult = await github.graphql(query, eaVariables);
|
|
||||||
const eaPulls = eaResult.repository.pullRequests.nodes;
|
|
||||||
return pulls.concat(eaPulls);
|
|
||||||
}
|
|
||||||
return pulls;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getMainlineTag(execa) {
|
|
||||||
console.log(`::group::Getting mainline tag android-${MAINLINE_TAG}`);
|
|
||||||
let hasFailed = false;
|
|
||||||
try {
|
|
||||||
await execa("git", ["remote", "add", "mainline", "https://gitlab.com/suyu-emu/suyu-android.git"]);
|
|
||||||
await execa("git", ["fetch", "mainline", "--tags"]);
|
|
||||||
await execa("git", ["checkout", `tags/android-${MAINLINE_TAG}`]);
|
|
||||||
await execa("git", ["submodule", "update", "--init", "--recursive"]);
|
|
||||||
} catch (err) {
|
|
||||||
console.log('::error title=Failed pull tag');
|
|
||||||
hasFailed = true;
|
|
||||||
}
|
|
||||||
console.log("::endgroup::");
|
|
||||||
if (hasFailed) {
|
|
||||||
throw 'Failed pull mainline tag. Aborting!';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function mergebot(github, context, execa) {
|
|
||||||
// Reset our local copy of master to what appears on suyu-emu/suyu - master
|
|
||||||
await resetBranch(execa);
|
|
||||||
|
|
||||||
const pulls = await getPulls(github);
|
|
||||||
let displayList = [];
|
|
||||||
for (let i = 0; i < pulls.length; i++) {
|
|
||||||
let pull = pulls[i];
|
|
||||||
displayList.push({ PR: pull.number, Title: pull.title });
|
|
||||||
}
|
|
||||||
console.info("The following pull requests will be merged:");
|
|
||||||
console.table(displayList);
|
|
||||||
await fetchPullRequests(pulls, "https://gitlab.com/suyu-emu/suyu", execa);
|
|
||||||
const mergeResults = await mergePullRequests(pulls, execa);
|
|
||||||
|
|
||||||
if (BUILD_EA) {
|
|
||||||
await tagAndPushEA(github, 'suyu-emu', `suyu-android`, execa);
|
|
||||||
} else {
|
|
||||||
await generateReadme(pulls, context, mergeResults, execa);
|
|
||||||
await tagAndPush(github, 'suyu-emu', `suyu-android`, execa, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports.mergebot = mergebot;
|
|
||||||
module.exports.checkAndroidChanges = checkAndroidChanges;
|
|
||||||
module.exports.tagAndPush = tagAndPush;
|
|
||||||
module.exports.checkBaseChanges = checkBaseChanges;
|
|
||||||
module.exports.getMainlineTag = getMainlineTag;
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
name: yuzu-android-publish
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '37 0 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
android:
|
|
||||||
description: 'Whether to trigger an Android build (true/false/auto)'
|
|
||||||
required: false
|
|
||||||
default: 'true'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
android:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.inputs.android != 'false' && github.repository == 'yuzu-emu/yuzu' }}
|
|
||||||
steps:
|
|
||||||
# this checkout is required to make sure the GitHub Actions scripts are available
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
name: Pre-checkout
|
|
||||||
with:
|
|
||||||
submodules: false
|
|
||||||
- uses: actions/github-script@v6
|
|
||||||
id: check-changes
|
|
||||||
name: 'Check for new changes'
|
|
||||||
env:
|
|
||||||
# 24 hours
|
|
||||||
DETECTION_TIME_FRAME: 86400000
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
if (context.payload.inputs && context.payload.inputs.android === 'true') return true;
|
|
||||||
const checkAndroidChanges = require('./.github/workflows/android-merge.js').checkAndroidChanges;
|
|
||||||
return checkAndroidChanges(github);
|
|
||||||
- run: npm install execa@5
|
|
||||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
name: Checkout
|
|
||||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
|
||||||
with:
|
|
||||||
path: 'yuzu-merge'
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
token: ${{ secrets.ALT_GITHUB_TOKEN }}
|
|
||||||
- uses: actions/github-script@v5
|
|
||||||
name: 'Check and merge Android changes'
|
|
||||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
|
||||||
env:
|
|
||||||
ALT_GITHUB_TOKEN: ${{ secrets.ALT_GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const execa = require("execa");
|
|
||||||
const mergebot = require('./.github/workflows/android-merge.js').mergebot;
|
|
||||||
process.chdir('${{ github.workspace }}/yuzu-merge');
|
|
||||||
mergebot(github, context, execa);
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,7 +4,6 @@
|
|||||||
# Build directory
|
# Build directory
|
||||||
[Bb]uild*/
|
[Bb]uild*/
|
||||||
doc-build/
|
doc-build/
|
||||||
cmake-build*/
|
|
||||||
|
|
||||||
# Generated source files
|
# Generated source files
|
||||||
src/common/scm_rev.cpp
|
src/common/scm_rev.cpp
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ variables:
|
|||||||
ARTIFACT_COMPRESSION_LEVEL: "fast"
|
ARTIFACT_COMPRESSION_LEVEL: "fast"
|
||||||
CACHE_COMPRESSION_LEVEL: "fastest"
|
CACHE_COMPRESSION_LEVEL: "fastest"
|
||||||
CACHE_REQUEST_TIMEOUT: 5
|
CACHE_REQUEST_TIMEOUT: 5
|
||||||
# Use FASTZIP for faster compression in cache and artifacts (boolean)
|
# Use FASTZIP for faster compression in cache and artifacts
|
||||||
# https://docs.gitlab.com/runner/configuration/feature-flags.html#available-feature-flags
|
# https://docs.gitlab.com/runner/configuration/feature-flags.html#available-feature-flags
|
||||||
FF_USE_FASTZIP: 1
|
FF_USE_FASTZIP: true
|
||||||
|
|
||||||
# Our Variables
|
# Our Variables
|
||||||
CACHE_DIR: "$CI_PROJECT_DIR/ccache"
|
CACHE_DIR: "$CI_PROJECT_DIR/ccache"
|
||||||
@@ -31,7 +31,6 @@ clang-format:
|
|||||||
# - Linux
|
# - Linux
|
||||||
# - Windows
|
# - Windows
|
||||||
- Parallelized
|
- Parallelized
|
||||||
- Format
|
|
||||||
|
|
||||||
#LINUX BUILD - BUILDS LINUX APPIMAGE
|
#LINUX BUILD - BUILDS LINUX APPIMAGE
|
||||||
build-linux:
|
build-linux:
|
||||||
@@ -78,6 +77,6 @@ android:
|
|||||||
paths:
|
paths:
|
||||||
- artifacts/*
|
- artifacts/*
|
||||||
tags:
|
tags:
|
||||||
- Android
|
- Linux
|
||||||
- Parallelized
|
- Parallelized
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,6 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.22)
|
cmake_minimum_required(VERSION 3.22)
|
||||||
|
|
||||||
set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT OFF)
|
|
||||||
set(CMAKE_XCODE_EMIT_RELATIVE_PATH YES)
|
|
||||||
|
|
||||||
project(suyu)
|
project(suyu)
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
|||||||
|
|
||||||
Please check out the
|
Please check out the
|
||||||
|
|
||||||
* [Contributors's guide](https://gitlab.com/suyu-emu/suyu/-/wikis/Contributing).
|
* [Conributors's guide](https://gitlab.com/suyu-emu/suyu/-/wikis/Contributing).
|
||||||
* [Merge request guidelines](https://gitlab.com/suyu-emu/suyu/-/wikis/Merge-requests)
|
* [Merge request guidelines](https://gitlab.com/suyu-emu/suyu/-/wikis/Merge-requests)
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -31,7 +31,7 @@ It is written in C++ with portability in mind, and we're actively working on bui
|
|||||||
<a href="#building">Building</a> |
|
<a href="#building">Building</a> |
|
||||||
<a href="#support">Support</a> |
|
<a href="#support">Support</a> |
|
||||||
<a href="#license">License</a> |
|
<a href="#license">License</a> |
|
||||||
<a href="https://git.suyu.dev/suyu/suyu/actions">Pipelines</a>
|
<a href="https://gitlab.com/suyu-emu/suyu/-/pipelines">Pipelines</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
@@ -46,24 +46,20 @@ This project is completely free and open source, and anyone can contribute to he
|
|||||||
|
|
||||||
Most of the development happens on GitLab. For development discussion, please join us on [Discord](https://discord.gg/suyu).
|
Most of the development happens on GitLab. For development discussion, please join us on [Discord](https://discord.gg/suyu).
|
||||||
|
|
||||||
If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information).
|
If you want to contribute, please take a look at the [Contributor's Guide](https://gitlab.com/suyu-emu/suyu/-/wikis/Contributing) and [Developer Information](https://gitlab.com/suyu-emu/suyu/-/wikis/Developer-Information).
|
||||||
You can also contact any of the developers on Discord to learn more about the current state of suyu.
|
You can also contact any of the developers on Discord to learn more about the current state of suyu.
|
||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
* __Windows__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
|
* __Windows__: WIP
|
||||||
* __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
|
* __Linux__: WIP
|
||||||
* __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
|
|
||||||
* __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
|
|
||||||
|
|
||||||
We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt.
|
We don't have any official builds yet! If any website or person is claiming to have a build for suyu, take that with a grain of salt, because it might contain malware. Until we do have an official build, it might be a better idea to keep using the last version of yuzu.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
* __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows)
|
* __Windows__: [Wiki page](https://gitlab.com/suyu-emu/suyu/-/wikis/Building-for-Windows)
|
||||||
* __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux)
|
* __Linux__: [Wiki page](https://gitlab.com/suyu-emu/suyu/-/wikis/Building-for-Linux)
|
||||||
* __Android__: [Android Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Android)
|
|
||||||
* __MacOS__: [MacOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
84
dist/icns_generator.sh
vendored
84
dist/icns_generator.sh
vendored
@@ -1,72 +1,14 @@
|
|||||||
#!/bin/bash
|
mkdir suyu.iconset
|
||||||
# icns_generator.sh GNU GPLv3 License
|
convert -background none -resize 16x16 suyu.svg suyu.iconset/icon_16x16.png;
|
||||||
# Run this script when a new logo is made and the svg file inside.
|
convert -background none -resize 32x32 suyu.svg suyu.iconset/icon_16x16@2x.png;
|
||||||
# You should install Imagemagick to make the conversions: $brew install imagemagick
|
convert -background none -resize 32x32 suyu.svg suyu.iconset/icon_32x32.png;
|
||||||
|
convert -background none -resize 64x64 suyu.svg suyu.iconset/icon_32x32@2x.png;
|
||||||
|
convert -background none -resize 128x128 suyu.svg suyu.iconset/icon_128x128.png;
|
||||||
|
convert -background none -resize 256x256 suyu.svg suyu.iconset/icon_256x256.png;
|
||||||
|
convert -background none -resize 256x256 suyu.svg suyu.iconset/icon_128x128@2x.png;
|
||||||
|
convert -background none -resize 512x512 suyu.svg suyu.iconset/icon_256x256@2x.png;
|
||||||
|
convert -background none -resize 512x512 suyu.svg suyu.iconset/icon_512x512.png;
|
||||||
|
convert -background none -resize 1024x1024 suyu.svg suyu.iconset/icon_512x512@2x.png;
|
||||||
|
|
||||||
# Change working dir to where this script is located.
|
iconutil -c icns suyu.iconset
|
||||||
cd "${0%/*}"
|
rm -rf suyu.iconset
|
||||||
|
|
||||||
if [ -z $1 ]; then
|
|
||||||
echo "icns_generator.sh GNU GPLv3 License"
|
|
||||||
echo "Run this script when a new logo is made and the svg file inside."
|
|
||||||
echo ""
|
|
||||||
echo "Syntax: ./icns_generator <input.svg>"
|
|
||||||
echo ""
|
|
||||||
echo "Don't forget to install imagemagick: "
|
|
||||||
echo "$ brew install imagemagick"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Error Handling Stuff:
|
|
||||||
## Check command availability
|
|
||||||
check_command() {
|
|
||||||
if ! command -v "$1" &> /dev/null; then
|
|
||||||
read -s -n 1 -p "Error: '$1' command not found. Please install $2."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
## Convert image with error handling
|
|
||||||
convert_image() {
|
|
||||||
convert -background none -resize "$2" "$1" "$3" || {
|
|
||||||
read -s -n 1 -p "Error: Conversion failed for $1"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check required commands
|
|
||||||
check_command "convert" "ImageMagick"
|
|
||||||
check_command "iconutil" "macOS"
|
|
||||||
|
|
||||||
# Create the iconset directory
|
|
||||||
mkdir suyu.iconset || {
|
|
||||||
read -s -n 1 -p "Error: Unable to create suyu.iconset directory."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert images
|
|
||||||
convert_image "$1" 16x16 suyu.iconset/icon_16x16.png
|
|
||||||
convert_image "$1" 32x32 suyu.iconset/icon_16x16@2x.png
|
|
||||||
convert_image "$1" 32x32 suyu.iconset/icon_32x32.png
|
|
||||||
convert_image "$1" 64x64 suyu.iconset/icon_32x32@2x.png
|
|
||||||
convert_image "$1" 128x128 suyu.iconset/icon_128x128.png
|
|
||||||
convert_image "$1" 256x256 suyu.iconset/icon_256x256.png
|
|
||||||
convert_image "$1" 256x256 suyu.iconset/icon_128x128@2x.png
|
|
||||||
convert_image "$1" 512x512 suyu.iconset/icon_256x256@2x.png
|
|
||||||
convert_image "$1" 512x512 suyu.iconset/icon_512x512.png
|
|
||||||
convert_image "$1" 1024x1024 suyu.iconset/icon_512x512@2x.png
|
|
||||||
|
|
||||||
# Create the ICNS file
|
|
||||||
iconutil -c icns suyu.iconset || {
|
|
||||||
read -s -n 1 -p "Error: Failed to create ICNS file."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove the temporary iconset directory
|
|
||||||
rm -rf suyu.iconset || {
|
|
||||||
read -s -n 1 -p "Error: Unable to remove suyu.iconset directory."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
echo -s -n 1 -p "Icon generation completed successfully."
|
|
||||||
echo ""
|
|
||||||
|
|||||||
@@ -72,12 +72,6 @@ class AppletLauncherFragment : Fragment() {
|
|||||||
R.string.mii_edit_applet_description,
|
R.string.mii_edit_applet_description,
|
||||||
R.drawable.ic_mii,
|
R.drawable.ic_mii,
|
||||||
AppletInfo.MiiEdit
|
AppletInfo.MiiEdit
|
||||||
),
|
|
||||||
Applet(
|
|
||||||
R.string.qlaunch_applet,
|
|
||||||
R.string.qlaunch_description,
|
|
||||||
R.drawable.ic_home,
|
|
||||||
AppletInfo.QLaunch
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ enum class AppletInfo(val appletId: Int, val entryId: Long = 0) {
|
|||||||
None(0x00),
|
None(0x00),
|
||||||
Application(0x01),
|
Application(0x01),
|
||||||
OverlayDisplay(0x02),
|
OverlayDisplay(0x02),
|
||||||
QLaunch(0x03, 0x0100000000001000),
|
QLaunch(0x03),
|
||||||
Starter(0x04),
|
Starter(0x04),
|
||||||
Auth(0x0A),
|
Auth(0x0A),
|
||||||
Cabinet(0x0B, 0x0100000000001002),
|
Cabinet(0x0B, 0x0100000000001002),
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
<vector android:alpha="1"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24"
|
|
||||||
android:viewportHeight="24"
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<path android:fillColor="?attr/colorControlNormal"
|
|
||||||
android:pathData="M21.59,11.31 L12.41,2.9a0.55,0.55 0,0 0,-0.75 0L2.47,11.31a0.54,0.54 0,0 0,0.38 0.93H4.41a0.35,0.35 0,0 1,0.35 0.35V20.32a0.54,0.54 0,0 0,0.54 0.54H18.77a0.54,0.54 0,0 0,0.54 -0.54V12.58a0.35,0.35 0,0 1,0.35 -0.35H21.21A0.54,0.54 0,0 0,21.59 11.31ZM15,16.65a0.43,0.43 0,0 1,-0.43 0.43H9.5a0.43,0.43 0,0 1,-0.43 -0.43V12.66a0.43,0.43 0,0 1,0.43 -0.43H14.56a0.43,0.43 0,0 1,0.43 0.43Z"
|
|
||||||
/>
|
|
||||||
</vector>
|
|
||||||
@@ -145,8 +145,6 @@
|
|||||||
<string name="keys_missing_help">https://suyu-emu.org/help/quickstart/#dumping-decryption-keys</string>
|
<string name="keys_missing_help">https://suyu-emu.org/help/quickstart/#dumping-decryption-keys</string>
|
||||||
|
|
||||||
<!-- Applet launcher strings -->
|
<!-- Applet launcher strings -->
|
||||||
<string name="qlaunch_applet">Qlaunch</string>
|
|
||||||
<string name="qlaunch_description">Launch applications from the system home screen</string>
|
|
||||||
<string name="applets">Applet launcher</string>
|
<string name="applets">Applet launcher</string>
|
||||||
<string name="applets_description">Launch system applets using installed firmware</string>
|
<string name="applets_description">Launch system applets using installed firmware</string>
|
||||||
<string name="applets_error_firmware">Firmware not installed</string>
|
<string name="applets_error_firmware">Firmware not installed</string>
|
||||||
|
|||||||
@@ -611,7 +611,7 @@ struct Values {
|
|||||||
Category::Network};
|
Category::Network};
|
||||||
|
|
||||||
// WebService
|
// WebService
|
||||||
Setting<std::string> web_api_url{linkage, "https://suyu.dev", "web_api_url",
|
Setting<std::string> web_api_url{linkage, "http://74.113.97.71:3000", "web_api_url",
|
||||||
Category::WebService};
|
Category::WebService};
|
||||||
Setting<std::string> suyu_username{linkage, std::string(), "suyu_username",
|
Setting<std::string> suyu_username{linkage, std::string(), "suyu_username",
|
||||||
Category::WebService};
|
Category::WebService};
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
#include <dynarmic/frontend/A64/decoder/a64.h>
|
#include <dynarmic/frontend/A64/decoder/a64.h>
|
||||||
#include <dynarmic/frontend/imm.h>
|
#include <dynarmic/frontend/imm.h>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|||||||
@@ -668,7 +668,7 @@ static bool ValidCryptoRevisionString(std::string_view base, size_t begin, size_
|
|||||||
|
|
||||||
void KeyManager::LoadFromFile(const std::filesystem::path& file_path, bool is_title_keys) {
|
void KeyManager::LoadFromFile(const std::filesystem::path& file_path, bool is_title_keys) {
|
||||||
if (!Common::FS::Exists(file_path)) {
|
if (!Common::FS::Exists(file_path)) {
|
||||||
LOG_ERROR(Crypto, "Cannot handle key file '{}': File not found",
|
LOG_ERROR(Crypto, "Failed to load key file at '{}': File not found",
|
||||||
file_path.generic_string());
|
file_path.generic_string());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -803,7 +803,8 @@ bool KeyManager::BaseDeriveNecessary() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!Common::FS::Exists(suyu_keys_dir / "title.keys")) {
|
if (!Common::FS::Exists(suyu_keys_dir / "title.keys")) {
|
||||||
LOG_WARNING(Crypto, "Could not locate a title.keys file");
|
LOG_ERROR(Crypto, "No title.keys found");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_key_existence(S256KeyType::Header)) {
|
if (check_key_existence(S256KeyType::Header)) {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Ap
|
|||||||
{30, nullptr, "GetHomeButtonReaderLockAccessor"},
|
{30, nullptr, "GetHomeButtonReaderLockAccessor"},
|
||||||
{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"},
|
{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"},
|
||||||
{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"},
|
{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"},
|
||||||
{40, D<&ICommonStateGetter::GetCradleFwVersion>, "GetCradleFwVersion"},
|
{40, nullptr, "GetCradleFwVersion"},
|
||||||
{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"},
|
{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"},
|
||||||
{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"},
|
{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"},
|
||||||
{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"},
|
{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"},
|
||||||
@@ -159,17 +159,6 @@ Result ICommonStateGetter::GetBootMode(Out<PM::SystemBootMode> out_boot_mode) {
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ICommonStateGetter::GetCradleFwVersion(OutArray<uint32_t, 4> out_version) {
|
|
||||||
LOG_DEBUG(Service_AM, "(STUBBED) called");
|
|
||||||
|
|
||||||
out_version[0] = 0;
|
|
||||||
out_version[1] = 0;
|
|
||||||
out_version[2] = 0;
|
|
||||||
out_version[3] = 0;
|
|
||||||
|
|
||||||
R_SUCCEED();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result ICommonStateGetter::IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled) {
|
Result ICommonStateGetter::IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled) {
|
||||||
LOG_DEBUG(Service_AM, "called");
|
LOG_DEBUG(Service_AM, "called");
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ private:
|
|||||||
Result GetOperationMode(Out<OperationMode> out_operation_mode);
|
Result GetOperationMode(Out<OperationMode> out_operation_mode);
|
||||||
Result GetPerformanceMode(Out<APM::PerformanceMode> out_performance_mode);
|
Result GetPerformanceMode(Out<APM::PerformanceMode> out_performance_mode);
|
||||||
Result GetBootMode(Out<PM::SystemBootMode> out_boot_mode);
|
Result GetBootMode(Out<PM::SystemBootMode> out_boot_mode);
|
||||||
Result GetCradleFwVersion(OutArray<uint32_t, 4> out_version);
|
|
||||||
Result IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled);
|
Result IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled);
|
||||||
Result SetVrModeEnabled(bool is_vr_mode_enabled);
|
Result SetVrModeEnabled(bool is_vr_mode_enabled);
|
||||||
Result SetLcdBacklighOffEnabled(bool is_lcd_backlight_off_enabled);
|
Result SetLcdBacklighOffEnabled(bool is_lcd_backlight_off_enabled);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ IGlobalStateController::IGlobalStateController(Core::System& system_)
|
|||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "RequestToEnterSleep"},
|
{0, nullptr, "RequestToEnterSleep"},
|
||||||
{1, nullptr, "EnterSleep"},
|
{1, nullptr, "EnterSleep"},
|
||||||
{2, D<&IGlobalStateController::StartSleepSequence>, "StartSleepSequence"},
|
{2, nullptr, "StartSleepSequence"},
|
||||||
{3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"},
|
{3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"},
|
||||||
{4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"},
|
{4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"},
|
||||||
{9, nullptr, "IsAutoPowerDownRequested"},
|
{9, nullptr, "IsAutoPowerDownRequested"},
|
||||||
@@ -31,13 +31,6 @@ IGlobalStateController::IGlobalStateController(Core::System& system_)
|
|||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
}
|
}
|
||||||
|
|
||||||
IGlobalStateController::~IGlobalStateController() = default;
|
|
||||||
|
|
||||||
Result IGlobalStateController::StartSleepSequence(u8 a) {
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called, a={}", a);
|
|
||||||
R_SUCCEED();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result IGlobalStateController::StartShutdownSequence() {
|
Result IGlobalStateController::StartShutdownSequence() {
|
||||||
LOG_INFO(Service_AM, "called");
|
LOG_INFO(Service_AM, "called");
|
||||||
system.Exit();
|
system.Exit();
|
||||||
@@ -50,6 +43,8 @@ Result IGlobalStateController::StartRebootSequence() {
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IGlobalStateController::~IGlobalStateController() = default;
|
||||||
|
|
||||||
Result IGlobalStateController::LoadAndApplyIdlePolicySettings() {
|
Result IGlobalStateController::LoadAndApplyIdlePolicySettings() {
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ public:
|
|||||||
~IGlobalStateController() override;
|
~IGlobalStateController() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Result StartSleepSequence(u8 a);
|
|
||||||
Result StartShutdownSequence();
|
Result StartShutdownSequence();
|
||||||
Result StartRebootSequence();
|
Result StartRebootSequence();
|
||||||
Result LoadAndApplyIdlePolicySettings();
|
Result LoadAndApplyIdlePolicySettings();
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_, std::shared_ptr<Ap
|
|||||||
{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
|
{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
|
||||||
{30, nullptr, "GetHomeButtonWriterLockAccessor"},
|
{30, nullptr, "GetHomeButtonWriterLockAccessor"},
|
||||||
{31, nullptr, "GetWriterLockAccessorEx"},
|
{31, nullptr, "GetWriterLockAccessorEx"},
|
||||||
{40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"},
|
{40, nullptr, "IsSleepEnabled"},
|
||||||
{41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"},
|
{41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"},
|
||||||
{50, nullptr, "LaunchSystemApplet"},
|
{50, nullptr, "LaunchSystemApplet"},
|
||||||
{51, nullptr, "LaunchStarter"},
|
{51, nullptr, "LaunchStarter"},
|
||||||
@@ -64,15 +64,9 @@ Result IHomeMenuFunctions::GetPopFromGeneralChannelEvent(
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result IHomeMenuFunctions::IsSleepEnabled(Out<bool> out_is_sleep_enabled) {
|
Result IHomeMenuFunctions::IsRebootEnabled(Out<bool> out_is_reboot_enbaled) {
|
||||||
LOG_INFO(Service_AM, "called");
|
LOG_INFO(Service_AM, "called");
|
||||||
*out_is_sleep_enabled = true;
|
*out_is_reboot_enbaled = true;
|
||||||
R_SUCCEED();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result IHomeMenuFunctions::IsRebootEnabled(Out<bool> out_is_reboot_enabled) {
|
|
||||||
LOG_INFO(Service_AM, "called");
|
|
||||||
*out_is_reboot_enabled = true;
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,7 @@ private:
|
|||||||
Result LockForeground();
|
Result LockForeground();
|
||||||
Result UnlockForeground();
|
Result UnlockForeground();
|
||||||
Result GetPopFromGeneralChannelEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
Result GetPopFromGeneralChannelEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
Result IsSleepEnabled(Out<bool> out_is_sleep_enabled);
|
Result IsRebootEnabled(Out<bool> out_is_reboot_enbaled);
|
||||||
Result IsRebootEnabled(Out<bool> out_is_reboot_enabled);
|
|
||||||
Result IsForceTerminateApplicationDisabledForDebug(
|
Result IsForceTerminateApplicationDisabledForDebug(
|
||||||
Out<bool> out_is_force_terminate_application_disabled_for_debug);
|
Out<bool> out_is_force_terminate_application_disabled_for_debug);
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ FSP_SRV::FSP_SRV(Core::System& system_)
|
|||||||
{24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"},
|
{24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"},
|
||||||
{25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"},
|
{25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"},
|
||||||
{26, nullptr, "FormatSdCardDryRun"},
|
{26, nullptr, "FormatSdCardDryRun"},
|
||||||
{27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"},
|
{27, nullptr, "IsExFatSupported"},
|
||||||
{28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"},
|
{28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"},
|
||||||
{30, nullptr, "OpenGameCardStorage"},
|
{30, nullptr, "OpenGameCardStorage"},
|
||||||
{31, nullptr, "OpenGameCardFileSystem"},
|
{31, nullptr, "OpenGameCardFileSystem"},
|
||||||
@@ -235,14 +235,6 @@ Result FSP_SRV::CreateSaveDataFileSystem(FileSys::SaveDataCreationInfo save_crea
|
|||||||
save_struct));
|
save_struct));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result FSP_SRV::IsExFatSupported(Out<bool> out_is_supported) {
|
|
||||||
LOG_WARNING(Service_FS, "(STUBBED) called");
|
|
||||||
|
|
||||||
*out_is_supported = true;
|
|
||||||
|
|
||||||
R_SUCCEED();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId(
|
Result FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId(
|
||||||
FileSys::SaveDataAttribute save_struct, FileSys::SaveDataCreationInfo save_create_struct) {
|
FileSys::SaveDataAttribute save_struct, FileSys::SaveDataCreationInfo save_create_struct) {
|
||||||
LOG_DEBUG(Service_FS, "called save_struct = {}", save_struct.DebugInfo());
|
LOG_DEBUG(Service_FS, "called save_struct = {}", save_struct.DebugInfo());
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ private:
|
|||||||
Result OpenSdCardFileSystem(OutInterface<IFileSystem> out_interface);
|
Result OpenSdCardFileSystem(OutInterface<IFileSystem> out_interface);
|
||||||
Result CreateSaveDataFileSystem(FileSys::SaveDataCreationInfo save_create_struct,
|
Result CreateSaveDataFileSystem(FileSys::SaveDataCreationInfo save_create_struct,
|
||||||
FileSys::SaveDataAttribute save_struct, u128 uid);
|
FileSys::SaveDataAttribute save_struct, u128 uid);
|
||||||
Result IsExFatSupported(Out<bool> out_is_supported);
|
|
||||||
Result CreateSaveDataFileSystemBySystemSaveDataId(
|
Result CreateSaveDataFileSystemBySystemSaveDataId(
|
||||||
FileSys::SaveDataAttribute save_struct, FileSys::SaveDataCreationInfo save_create_struct);
|
FileSys::SaveDataAttribute save_struct, FileSys::SaveDataCreationInfo save_create_struct);
|
||||||
Result OpenSaveDataFileSystem(OutInterface<IFileSystem> out_interface,
|
Result OpenSaveDataFileSystem(OutInterface<IFileSystem> out_interface,
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ Result ISfMonitorService::Initialize(Out<u32> out_value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result ISfMonitorService::GetGroupInfo(
|
Result ISfMonitorService::GetGroupInfo(
|
||||||
GroupInfo in_group_info, OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info) {
|
OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info) {
|
||||||
LOG_WARNING(Service_LDN, "(STUBBED) called");
|
LOG_WARNING(Service_LDN, "(STUBBED) called");
|
||||||
|
|
||||||
memcpy(out_group_info, &in_group_info, sizeof(GroupInfo));
|
*out_group_info = GroupInfo{};
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Result Initialize(Out<u32> out_value);
|
Result Initialize(Out<u32> out_value);
|
||||||
Result GetGroupInfo(GroupInfo in_group_info,
|
Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info);
|
||||||
OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::LDN
|
} // namespace Service::LDN
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ Result ISfServiceMonitor::Initialize(Out<u32> out_value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result ISfServiceMonitor::GetGroupInfo(
|
Result ISfServiceMonitor::GetGroupInfo(
|
||||||
GroupInfo in_group_info, OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info) {
|
OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info) {
|
||||||
LOG_WARNING(Service_LDN, "(STUBBED) called");
|
LOG_WARNING(Service_LDN, "(STUBBED) called");
|
||||||
|
|
||||||
memcpy(out_group_info, &in_group_info, sizeof(GroupInfo));
|
*out_group_info = GroupInfo{};
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Result Initialize(Out<u32> out_value);
|
Result Initialize(Out<u32> out_value);
|
||||||
Result GetGroupInfo(GroupInfo in_group_info,
|
Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info);
|
||||||
OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::LDN
|
} // namespace Service::LDN
|
||||||
|
|||||||
@@ -507,7 +507,7 @@ void IGeneralService::GetCurrentIpConfigInfo(HLERequestContext& ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IGeneralService::IsWirelessCommunicationEnabled(HLERequestContext& ctx) {
|
void IGeneralService::IsWirelessCommunicationEnabled(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_NIFM, "called");
|
LOG_WARNING(Service_NIFM, "(STUBBED) called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-FileCopyrightText: 2024 suyu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|||||||
@@ -509,13 +509,4 @@ struct TvSettings {
|
|||||||
};
|
};
|
||||||
static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size");
|
static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size");
|
||||||
|
|
||||||
/// This is nn::settings::system::RebootlessSystemUpdateVersion
|
|
||||||
struct RebootlessSystemUpdateVersion {
|
|
||||||
u32 version;
|
|
||||||
u8 reserved[0x1c];
|
|
||||||
char display_version[0x20];
|
|
||||||
};
|
|
||||||
static_assert(sizeof(RebootlessSystemUpdateVersion) == 0x40,
|
|
||||||
"RebootlessSystemUpdateVersion is an invalid size");
|
|
||||||
|
|
||||||
} // namespace Service::Set
|
} // namespace Service::Set
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
|
|||||||
{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
|
{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
|
||||||
{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
|
{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
|
||||||
{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
|
{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
|
||||||
{149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"},
|
{149, nullptr, "GetRebootlessSystemUpdateVersion"},
|
||||||
{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
|
{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
|
||||||
{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
|
{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
|
||||||
{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
|
{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
|
||||||
@@ -1194,16 +1194,6 @@ Result ISystemSettingsServer::SetKeyboardLayout(KeyboardLayout keyboard_layout)
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ISystemSettingsServer::GetRebootlessSystemUpdateVersion(
|
|
||||||
Out<RebootlessSystemUpdateVersion> out_rebootless_system_update) {
|
|
||||||
LOG_INFO(Service_SET, "(STUBBED) called");
|
|
||||||
|
|
||||||
out_rebootless_system_update->version = 0;
|
|
||||||
strcpy(out_rebootless_system_update->display_version, "0.0.0");
|
|
||||||
|
|
||||||
R_SUCCEED();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(
|
Result ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(
|
||||||
Out<Service::PSC::Time::SteadyClockTimePoint> out_time_point) {
|
Out<Service::PSC::Time::SteadyClockTimePoint> out_time_point) {
|
||||||
LOG_INFO(Service_SET, "called");
|
LOG_INFO(Service_SET, "called");
|
||||||
|
|||||||
@@ -136,8 +136,6 @@ public:
|
|||||||
Result SetAppletLaunchFlags(u32 applet_launch_flag);
|
Result SetAppletLaunchFlags(u32 applet_launch_flag);
|
||||||
Result GetKeyboardLayout(Out<KeyboardLayout> out_keyboard_layout);
|
Result GetKeyboardLayout(Out<KeyboardLayout> out_keyboard_layout);
|
||||||
Result SetKeyboardLayout(KeyboardLayout keyboard_layout);
|
Result SetKeyboardLayout(KeyboardLayout keyboard_layout);
|
||||||
Result GetRebootlessSystemUpdateVersion(
|
|
||||||
Out<RebootlessSystemUpdateVersion> out_rebootless_system_update);
|
|
||||||
Result GetDeviceTimeZoneLocationUpdatedTime(
|
Result GetDeviceTimeZoneLocationUpdatedTime(
|
||||||
Out<Service::PSC::Time::SteadyClockTimePoint> out_time_point);
|
Out<Service::PSC::Time::SteadyClockTimePoint> out_time_point);
|
||||||
Result SetDeviceTimeZoneLocationUpdatedTime(
|
Result SetDeviceTimeZoneLocationUpdatedTime(
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::KProcess& process, Core::S
|
|||||||
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Core::Crypto::KeyManager::KeyFileExists(true)) {
|
||||||
|
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
||||||
|
}
|
||||||
|
|
||||||
return {ResultStatus::ErrorNAXInconvertibleToNCA, {}};
|
return {ResultStatus::ErrorNAXInconvertibleToNCA, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,10 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::KProcess& process, Core::S
|
|||||||
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Core::Crypto::KeyManager::KeyFileExists(true)) {
|
||||||
|
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
||||||
|
}
|
||||||
|
|
||||||
return {ResultStatus::ErrorNSPMissingProgramNCA, {}};
|
return {ResultStatus::ErrorNSPMissingProgramNCA, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ AppLoader_XCI::LoadResult AppLoader_XCI::Load(Kernel::KProcess& process, Core::S
|
|||||||
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!xci->HasProgramNCA() && !Core::Crypto::KeyManager::KeyFileExists(true)) {
|
||||||
|
return {ResultStatus::ErrorMissingProductionKeyFile, {}};
|
||||||
|
}
|
||||||
|
|
||||||
const auto result = nca_loader->Load(process, system);
|
const auto result = nca_loader->Load(process, system);
|
||||||
if (result.first != ResultStatus::Success) {
|
if (result.first != ResultStatus::Success) {
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -762,8 +762,6 @@ void EmulatedController::StartMotionCalibration() {
|
|||||||
|
|
||||||
void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback, std::size_t index,
|
void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback, std::size_t index,
|
||||||
Common::UUID uuid) {
|
Common::UUID uuid) {
|
||||||
const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
|
|
||||||
const auto& player = Settings::values.players.GetValue()[player_index];
|
|
||||||
if (index >= controller.button_values.size()) {
|
if (index >= controller.button_values.size()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -919,8 +917,13 @@ void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback
|
|||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
if (player.connected) {
|
if (!is_connected) {
|
||||||
Connect();
|
if (npad_id_type == NpadIdType::Player1 && npad_type != NpadStyleIndex::Handheld) {
|
||||||
|
Connect();
|
||||||
|
}
|
||||||
|
if (npad_id_type == NpadIdType::Handheld && npad_type == NpadStyleIndex::Handheld) {
|
||||||
|
Connect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
TriggerOnChange(ControllerTriggerType::Button, true);
|
TriggerOnChange(ControllerTriggerType::Button, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,11 +63,11 @@ void ConfigureWeb::RetranslateUI() {
|
|||||||
ui->retranslateUi(this);
|
ui->retranslateUi(this);
|
||||||
|
|
||||||
ui->web_signup_link->setText(
|
ui->web_signup_link->setText(
|
||||||
tr("<a href='https://suyu.dev/signup'><span style=\"text-decoration: underline; "
|
tr("<a href='https://profile.suyu.dev/'><span style=\"text-decoration: underline; "
|
||||||
"color:#039be5;\">Sign up</span></a>"));
|
"color:#039be5;\">Sign up</span></a>"));
|
||||||
|
|
||||||
ui->web_token_info_link->setText(
|
ui->web_token_info_link->setText(
|
||||||
tr("<a href='https://suyu.dev/account'><span style=\"text-decoration: "
|
tr("<a href='https://suyu.dev/wiki/suyu-web-service/'><span style=\"text-decoration: "
|
||||||
"underline; color:#039be5;\">What is my token?</span></a>"));
|
"underline; color:#039be5;\">What is my token?</span></a>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1755,9 +1755,9 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa
|
|||||||
if (!ContentManager::AreKeysPresent()) {
|
if (!ContentManager::AreKeysPresent()) {
|
||||||
QMessageBox::warning(this, tr("Derivation Components Missing"),
|
QMessageBox::warning(this, tr("Derivation Components Missing"),
|
||||||
tr("Encryption keys are missing. "
|
tr("Encryption keys are missing. "
|
||||||
"In order to use this emulator"
|
"You need to provide both your own title.keys "
|
||||||
"you need to provide your own encryption keys"
|
"and your own prod.keys "
|
||||||
"in order to play them."));
|
"in order to play games"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4630,9 +4630,9 @@ void GMainWindow::OnCheckFirmwareDecryption() {
|
|||||||
if (!ContentManager::AreKeysPresent()) {
|
if (!ContentManager::AreKeysPresent()) {
|
||||||
QMessageBox::warning(this, tr("Derivation Components Missing"),
|
QMessageBox::warning(this, tr("Derivation Components Missing"),
|
||||||
tr("Encryption keys are missing. "
|
tr("Encryption keys are missing. "
|
||||||
"In order to use this emulator"
|
"You need to provide both your own title.keys "
|
||||||
"you need to provide your own encryption keys"
|
"and your own prod.keys "
|
||||||
"in order to play them."));
|
"in order to play games"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFirmwareVersion();
|
SetFirmwareVersion();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ if(LIBVA_FOUND)
|
|||||||
list(APPEND FFmpeg_LIBRARIES ${LIBVA_LIBRARIES})
|
list(APPEND FFmpeg_LIBRARIES ${LIBVA_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(sources
|
add_library(video_core STATIC
|
||||||
buffer_cache/buffer_base.h
|
buffer_cache/buffer_base.h
|
||||||
buffer_cache/buffer_cache_base.h
|
buffer_cache/buffer_cache_base.h
|
||||||
buffer_cache/buffer_cache.cpp
|
buffer_cache/buffer_cache.cpp
|
||||||
@@ -315,67 +315,6 @@ set(sources
|
|||||||
vulkan_common/vulkan.h
|
vulkan_common/vulkan.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
list(REMOVE_ITEM sources
|
|
||||||
renderer_opengl/present/filters.cpp
|
|
||||||
renderer_opengl/present/filters.h
|
|
||||||
renderer_opengl/present/fsr.cpp
|
|
||||||
renderer_opengl/present/fsr.h
|
|
||||||
renderer_opengl/present/fxaa.cpp
|
|
||||||
renderer_opengl/present/fxaa.h
|
|
||||||
renderer_opengl/present/layer.cpp
|
|
||||||
renderer_opengl/present/layer.h
|
|
||||||
renderer_opengl/present/present_uniforms.h
|
|
||||||
renderer_opengl/present/smaa.cpp
|
|
||||||
renderer_opengl/present/smaa.h
|
|
||||||
renderer_opengl/present/util.h
|
|
||||||
renderer_opengl/present/window_adapt_pass.cpp
|
|
||||||
renderer_opengl/present/window_adapt_pass.h
|
|
||||||
renderer_opengl/blit_image.cpp
|
|
||||||
renderer_opengl/blit_image.h
|
|
||||||
renderer_opengl/gl_blit_screen.cpp
|
|
||||||
renderer_opengl/gl_blit_screen.h
|
|
||||||
renderer_opengl/gl_buffer_cache_base.cpp
|
|
||||||
renderer_opengl/gl_buffer_cache.cpp
|
|
||||||
renderer_opengl/gl_buffer_cache.h
|
|
||||||
renderer_opengl/gl_compute_pipeline.cpp
|
|
||||||
renderer_opengl/gl_compute_pipeline.h
|
|
||||||
renderer_opengl/gl_device.cpp
|
|
||||||
renderer_opengl/gl_device.h
|
|
||||||
renderer_opengl/gl_fence_manager.cpp
|
|
||||||
renderer_opengl/gl_fence_manager.h
|
|
||||||
renderer_opengl/gl_graphics_pipeline.cpp
|
|
||||||
renderer_opengl/gl_graphics_pipeline.h
|
|
||||||
renderer_opengl/gl_rasterizer.cpp
|
|
||||||
renderer_opengl/gl_rasterizer.h
|
|
||||||
renderer_opengl/gl_resource_manager.cpp
|
|
||||||
renderer_opengl/gl_resource_manager.h
|
|
||||||
renderer_opengl/gl_shader_cache.cpp
|
|
||||||
renderer_opengl/gl_shader_cache.h
|
|
||||||
renderer_opengl/gl_shader_manager.cpp
|
|
||||||
renderer_opengl/gl_shader_manager.h
|
|
||||||
renderer_opengl/gl_shader_context.h
|
|
||||||
renderer_opengl/gl_shader_util.cpp
|
|
||||||
renderer_opengl/gl_shader_util.h
|
|
||||||
renderer_opengl/gl_state_tracker.cpp
|
|
||||||
renderer_opengl/gl_state_tracker.h
|
|
||||||
renderer_opengl/gl_staging_buffer_pool.cpp
|
|
||||||
renderer_opengl/gl_staging_buffer_pool.h
|
|
||||||
renderer_opengl/gl_texture_cache.cpp
|
|
||||||
renderer_opengl/gl_texture_cache.h
|
|
||||||
renderer_opengl/gl_texture_cache_base.cpp
|
|
||||||
renderer_opengl/gl_query_cache.cpp
|
|
||||||
renderer_opengl/gl_query_cache.h
|
|
||||||
renderer_opengl/maxwell_to_gl.h
|
|
||||||
renderer_opengl/renderer_opengl.cpp
|
|
||||||
renderer_opengl/renderer_opengl.h
|
|
||||||
renderer_opengl/util_shaders.cpp
|
|
||||||
renderer_opengl/util_shaders.h
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(video_core STATIC ${sources})
|
|
||||||
|
|
||||||
target_link_libraries(video_core PUBLIC common core)
|
target_link_libraries(video_core PUBLIC common core)
|
||||||
target_link_libraries(video_core PUBLIC glad shader_recompiler stb bc_decoder)
|
target_link_libraries(video_core PUBLIC glad shader_recompiler stb bc_decoder)
|
||||||
|
|
||||||
@@ -408,7 +347,7 @@ if (MSVC)
|
|||||||
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
if (APPLE OR ARCHITECTURE_arm64)
|
if (APPLE)
|
||||||
# error: declaration shadows a typedef in 'interval_base_set<SubType, DomainT, Compare, Interval, Alloc>'
|
# error: declaration shadows a typedef in 'interval_base_set<SubType, DomainT, Compare, Interval, Alloc>'
|
||||||
# error: implicit conversion loses integer precision: 'int' to 'boost::icl::bound_type' (aka 'unsigned char')
|
# error: implicit conversion loses integer precision: 'int' to 'boost::icl::bound_type' (aka 'unsigned char')
|
||||||
target_compile_options(video_core PRIVATE -Wno-shadow -Wno-unused-local-typedef)
|
target_compile_options(video_core PRIVATE -Wno-shadow -Wno-unused-local-typedef)
|
||||||
|
|||||||
@@ -21,15 +21,9 @@ std::unique_ptr<VideoCore::RendererBase> CreateRenderer(
|
|||||||
auto& device_memory = system.Host1x().MemoryManager();
|
auto& device_memory = system.Host1x().MemoryManager();
|
||||||
|
|
||||||
switch (Settings::values.renderer_backend.GetValue()) {
|
switch (Settings::values.renderer_backend.GetValue()) {
|
||||||
#ifdef __APPLE__
|
|
||||||
// do nothing for now, include metal in here at later date.
|
|
||||||
#else
|
|
||||||
// openGL, not supported on Apple so not bothering to include if macos
|
|
||||||
case Settings::RendererBackend::OpenGL:
|
case Settings::RendererBackend::OpenGL:
|
||||||
return std::make_unique<OpenGL::RendererOpenGL>(emu_window, device_memory, gpu,
|
return std::make_unique<OpenGL::RendererOpenGL>(emu_window, device_memory, gpu,
|
||||||
std::move(context));
|
std::move(context));
|
||||||
#endif
|
|
||||||
// common renderers
|
|
||||||
case Settings::RendererBackend::Vulkan:
|
case Settings::RendererBackend::Vulkan:
|
||||||
return std::make_unique<Vulkan::RendererVulkan>(emu_window, device_memory, gpu,
|
return std::make_unique<Vulkan::RendererVulkan>(emu_window, device_memory, gpu,
|
||||||
std::move(context));
|
std::move(context));
|
||||||
|
|||||||
@@ -15,11 +15,7 @@
|
|||||||
#define VK_USE_PLATFORM_WAYLAND_KHR
|
#define VK_USE_PLATFORM_WAYLAND_KHR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#include <MoltenVK/mvk_vulkan.h>
|
|
||||||
#else
|
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
// Sanitize macros
|
// Sanitize macros
|
||||||
#undef CreateEvent
|
#undef CreateEvent
|
||||||
|
|||||||
@@ -1364,7 +1364,6 @@ void Device::CollectToolingInfo() {
|
|||||||
LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name);
|
LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name);
|
||||||
has_renderdoc = has_renderdoc || name == "RenderDoc";
|
has_renderdoc = has_renderdoc || name == "RenderDoc";
|
||||||
has_nsight_graphics = has_nsight_graphics || name == "NVIDIA Nsight Graphics";
|
has_nsight_graphics = has_nsight_graphics || name == "NVIDIA Nsight Graphics";
|
||||||
has_radeon_gpu_profiler = has_radeon_gpu_profiler || name == "Radeon GPU Profiler";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -592,7 +592,7 @@ public:
|
|||||||
|
|
||||||
/// Returns true when a known debugging tool is attached.
|
/// Returns true when a known debugging tool is attached.
|
||||||
bool HasDebuggingToolAttached() const {
|
bool HasDebuggingToolAttached() const {
|
||||||
return has_renderdoc || has_nsight_graphics || has_radeon_gpu_profiler;
|
return has_renderdoc || has_nsight_graphics;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @returns True if compute pipelines can cause crashing.
|
/// @returns True if compute pipelines can cause crashing.
|
||||||
@@ -821,7 +821,6 @@ private:
|
|||||||
bool has_broken_parallel_compiling{}; ///< Has broken parallel shader compiling.
|
bool has_broken_parallel_compiling{}; ///< Has broken parallel shader compiling.
|
||||||
bool has_renderdoc{}; ///< Has RenderDoc attached
|
bool has_renderdoc{}; ///< Has RenderDoc attached
|
||||||
bool has_nsight_graphics{}; ///< Has Nsight Graphics attached
|
bool has_nsight_graphics{}; ///< Has Nsight Graphics attached
|
||||||
bool has_radeon_gpu_profiler{}; ///< Has Radeon GPU Profiler attached.
|
|
||||||
bool supports_d24_depth{}; ///< Supports D24 depth buffers.
|
bool supports_d24_depth{}; ///< Supports D24 depth buffers.
|
||||||
bool cant_blit_msaa{}; ///< Does not support MSAA<->MSAA blitting.
|
bool cant_blit_msaa{}; ///< Does not support MSAA<->MSAA blitting.
|
||||||
bool must_emulate_scaled_formats{}; ///< Requires scaled vertex format emulation
|
bool must_emulate_scaled_formats{}; ///< Requires scaled vertex format emulation
|
||||||
|
|||||||
Reference in New Issue
Block a user